[Esbox-commits] r1107 - in branches/work_Ed: org.maemo.esbox.maemosdk.ui/META-INF org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/maemosdk/ui/preferences org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/preferences org.maemo.esbox.vm/conf org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/ui/preferences

eswartz at garage.maemo.org eswartz at garage.maemo.org
Wed Dec 31 23:23:02 EET 2008


Author: eswartz
Date: 2008-12-31 23:22:59 +0200 (Wed, 31 Dec 2008)
New Revision: 1107

Modified:
   branches/work_Ed/org.maemo.esbox.maemosdk.ui/META-INF/MANIFEST.MF
   branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFolderPreferenceConverter.java
   branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFolderTableViewer.java
   branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFoldersPreferencePage.java
   branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/maemosdk/ui/preferences/BuildMachinePreferencePage.java
   branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/preferences/Scratchbox1PreferencesPage.java
   branches/work_Ed/org.maemo.esbox.vm/conf/vm_prefs.xml
   branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/ui/preferences/CommonVirtualMachineSettingsPreferencePage.java
Log:
Fix bug 3193.  Make it easier to edit shared folders in the pref page by editing items in a tree rather than a table.

Also, rename the confusing "local" and "host" paths of a share to "share path" and "mount path".

Finally, rename EShareType.SAMBA to SMB to be more generic.

Modified: branches/work_Ed/org.maemo.esbox.maemosdk.ui/META-INF/MANIFEST.MF
===================================================================
--- branches/work_Ed/org.maemo.esbox.maemosdk.ui/META-INF/MANIFEST.MF	2008-12-31 16:28:05 UTC (rev 1106)
+++ branches/work_Ed/org.maemo.esbox.maemosdk.ui/META-INF/MANIFEST.MF	2008-12-31 21:22:59 UTC (rev 1107)
@@ -11,7 +11,8 @@
  org.maemo.mica.common.project.core;bundle-version="2.0.0",
  org.maemo.mica.common.ui;bundle-version="2.0.0",
  org.maemo.esbox.maemosdk.core;bundle-version="2.0.0",
- org.eclipse.ui.ide;bundle-version="3.4.1"
+ org.eclipse.ui.ide;bundle-version="3.4.1",
+ org.eclipse.ui.views;bundle-version="3.3.0"
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
 Export-Package: org.maemo.esbox.internal.api.maemosdk.ui.preferences,

Modified: branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFolderPreferenceConverter.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFolderPreferenceConverter.java	2008-12-31 16:28:05 UTC (rev 1106)
+++ branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFolderPreferenceConverter.java	2008-12-31 21:22:59 UTC (rev 1107)
@@ -72,7 +72,7 @@
 			IPath host, target;
 			boolean isAlias = false;
 			boolean isHostProvided = true;
-			EShareType type = EShareType.SAMBA;
+			EShareType type = EShareType.SMB;
 			String shareName = null;
 			
 			if (hostTarget.length >= 2) {
@@ -86,7 +86,10 @@
 							try {
 								type = EShareType.valueOf(hostTarget[4]);
 							} catch (IllegalArgumentException e) {
-								UIActivator.getErrorLogger().logError("Invalid shared folder type in: " + entry, null);
+								if (hostTarget[4].equals("SAMBA"))
+									type = EShareType.SMB;
+								else
+									UIActivator.getErrorLogger().logError("Invalid shared folder type in: " + entry, null);
 							}
 							if (hostTarget.length >= 6) {
 								shareName = hostTarget[5];

Modified: branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFolderTableViewer.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFolderTableViewer.java	2008-12-31 16:28:05 UTC (rev 1106)
+++ branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFolderTableViewer.java	2008-12-31 21:22:59 UTC (rev 1107)
@@ -15,148 +15,385 @@
 import org.eclipse.jface.viewers.*;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.*;
+import org.eclipse.swt.graphics.*;
 import org.eclipse.swt.widgets.*;
 import org.maemo.mica.common.core.machine.EShareType;
 import org.maemo.mica.common.core.machine.ISharedFolder;
+import org.maemo.mica.common.ui.TextAndDialogCellEditor;
+import org.maemo.mica.common.ui.ViewerTooltipSupport;
 
 import java.util.Collection;
 
 /**
- * A table viewer for shared folder mappings.  The content should be Collection<Pair<IPath,IPath>>
+ * A table viewer for shared folder mappings.  The content should be 
+ * ISharedFolder entries.
  * @author eswartz
  *
  */
-public class SharedFolderTableViewer extends TableViewer {
-
-	final int HOST_COLUMN = 0;
-	final int FROMTO_COLUMN = 1;
-	final int TARGET_COLUMN = 2;
-	final int NAME_COLUMN = 3;
-	final int AUTO_COLUMN = 4;
-	final int TYPE_COLUMN = 5;
+public class SharedFolderTableViewer extends TreeViewer {
+	/**
+	 * 
+	 */
 	
 	private Collection<ISharedFolder> mappings;
-	private TableColumn targetColumn;
-	private TableColumn fromToColumn;
-	private TableColumn hostColumn;
-	private TableColumn nameColumn;
-	private TableColumn autoColumn;
-	private TableColumn typeColumn;
-	private TableViewerColumn hostViewerColumn;
-	private TableViewerColumn targetViewerColumn;
-	private TableViewerColumn fromToViewerColumn;
-	private TableViewerColumn nameViewerColumn;
-	private TableViewerColumn autoViewerColumn;
-	private TableViewerColumn typeViewerColumn;
+	private TreeViewerColumn contentViewerColumn;
 	
-	public SharedFolderTableViewer(Composite parent, int style) {
-		super(parent, style | SWT.FULL_SELECTION | SWT.SINGLE);
+	static abstract class FieldItem {
+		String label;
+		ISharedFolder folder;
+		String tooltip;
 		
-		final Table table = getTable();
+		/**
+		 * @param label
+		 * @param parent
+		 */
+		public FieldItem(String label, String tooltip, ISharedFolder parent) {
+			super();
+			this.label = label;
+			this.tooltip = tooltip;
+			this.folder = parent;
+		}
 		
-		table.setLinesVisible (true);
-		table.setHeaderVisible (true);
+		protected CellEditor getCellEditor(ISharedFolder folder, Tree tree) {
+			return new TextCellEditor(tree);
+		}
 		
-		hostColumn = new TableColumn(table, SWT.LEFT);
-		hostColumn.setText("Host");
-		hostColumn.pack();
-		hostColumn.setToolTipText("This is the host path matched with the target.");
+		abstract protected void setField(Object value);
+		abstract protected Object getField();
+
+		public String getLabel() {
+			return getField().toString();
+		}
+	}
+
+	static class DirectoryBrowserCellEditor extends TextAndDialogCellEditor {
 		
-		fromToColumn = new TableColumn(table, SWT.LEFT);
-		fromToColumn.setText("");
-		fromToColumn.pack();
-		fromToColumn.setToolTipText("This tells who provides the shared folder.\n\"<-\" means the target provides the share, \"->\" means the host provides the share.");
+		public DirectoryBrowserCellEditor(Tree tree) {
+			super(tree);
+		}
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(org.eclipse.swt.widgets.Control)
+		 */
+		@Override
+		protected Object openDialogBox(Control cellEditorWindow) {
+			DirectoryDialog dialog = new DirectoryDialog(cellEditorWindow.getShell());
+			Object current = getValue();
+			dialog.setFilterPath(current instanceof String 
+					? new Path((String)current).toOSString() : Path.ROOT.toOSString());
+			return dialog.open();
+		}
+	}
+	
+	static abstract class PathFieldItem extends FieldItem {
+		public PathFieldItem(String label, String tooltip, ISharedFolder parent) {
+			super(label, tooltip, parent);
+		}
+		protected abstract boolean isHostPath(ISharedFolder folder);
+		/* (non-Javadoc)
+		 * @see org.maemo.esbox.internal.api.maemosdk.ui.preferences.SharedFolderTableViewer.FieldItem#getCellEditor(org.eclipse.swt.widgets.Tree)
+		 */
+		@Override
+		protected CellEditor getCellEditor(ISharedFolder folder, Tree tree) {
+			if (isHostPath(folder))
+				return new DirectoryBrowserCellEditor(tree);
+			else
+				return new TextCellEditor(tree);
+		}
+	}
+	
+	static class SharePathFieldItem extends PathFieldItem {
+		public SharePathFieldItem(String label, String tooltip, ISharedFolder parent) {
+			super(label, tooltip, parent);
+		}
+		/* (non-Javadoc)
+		 * @see org.maemo.esbox.internal.api.maemosdk.ui.preferences.SharedFolderTableViewer.PathFieldItem#isHostPath()
+		 */
+		@Override
+		protected boolean isHostPath(ISharedFolder folder) {
+			return folder.isHostProvidedShare();
+		}
+		@Override
+		protected Object getField() {
+			return isHostPath(folder) ? folder.getSharePath().toOSString() 
+					: folder.getSharePath().toPortableString();
+		}
+		@Override
+		protected void setField(Object value) {
+			folder.setSharePath(new Path((String)value).makeAbsolute());
+		}
+	}
+	
+	static class MountPathFieldItem extends PathFieldItem {
+		public MountPathFieldItem(String label, String tooltip, ISharedFolder parent) {
+			super(label, tooltip, parent);
+		}
+		/* (non-Javadoc)
+		 * @see org.maemo.esbox.internal.api.maemosdk.ui.preferences.SharedFolderTableViewer.PathFieldItem#isHostPath(org.maemo.mica.common.core.machine.ISharedFolder)
+		 */
+		@Override
+		protected boolean isHostPath(ISharedFolder folder) {
+			return !folder.isHostProvidedShare();
+		}
+		@Override
+		protected Object getField() {
+			return isHostPath(folder) ? folder.getMountPath().toOSString() 
+					: folder.getMountPath().toPortableString();
+		}
+		@Override
+		protected void setField(Object value) {
+			folder.setMountPath(new Path((String) value).makeAbsolute());
+		}
+	}
+	
+	static class ShareNameFieldItem extends FieldItem {
+		public ShareNameFieldItem(String label, String tooltip, ISharedFolder parent) {
+			super(label, tooltip, parent);
+		}
+		@Override
+		protected Object getField() {
+			return folder.getShareName();
+		}
+		@Override
+		protected void setField(Object value) {
+			folder.setShareName((String) value);
+		}
+	}
+
+	static abstract class BooleanFieldItem extends FieldItem {
+		public BooleanFieldItem(String label, String tooltip, ISharedFolder parent) {
+			super(label, tooltip, parent);
+		}
+		@Override
+		protected CellEditor getCellEditor(ISharedFolder folder, Tree tree) {
+			return new CheckboxCellEditor(tree);
+		}
+		@Override
+		public String getLabel() {
+			return ((Boolean) getField()) ? "yes" : "no";
+		}
+	}
+	
+	static class AutoMountFieldItem extends BooleanFieldItem {
+		public AutoMountFieldItem(String label, String tooltip, ISharedFolder parent) {
+			super(label, tooltip, parent);
+		}
+		@Override
+		protected Object getField() {
+			return !folder.isManual();
+		}
+		@Override
+		protected void setField(Object value) {
+			folder.setManual(!(Boolean)value);
+		}
+	}
+
+	static class HostProvidedFieldItem extends BooleanFieldItem {
+		public HostProvidedFieldItem(String label, String tooltip, ISharedFolder parent) {
+			super(label, tooltip, parent);
+		}
+		@Override
+		protected Object getField() {
+			return folder.isHostProvidedShare();
+		}
+		@Override
+		protected void setField(Object value) {
+			folder.setHostProvidedShare((Boolean)value);
+		}
+	}
+	
+	static class StaticFieldItem extends FieldItem {
+		public StaticFieldItem(String label, String tooltip, ISharedFolder parent) {
+			super(label, tooltip, parent);
+		}
+		/* (non-Javadoc)
+		 * @see org.maemo.esbox.internal.api.maemosdk.ui.preferences.SharedFolderTableViewer.FieldItem#getCellEditor(org.eclipse.swt.widgets.Tree)
+		 */
+		@Override
+		protected CellEditor getCellEditor(ISharedFolder folder, Tree tree) {
+			return null;
+		}
+		@Override
+		protected Object getField() {
+			return folder.getShareType().toString();
+		}
+		@Override
+		protected void setField(Object value) {
+			folder.setShareType(EShareType.valueOf((String) value));
+		}
+	}
+	
+	/**
+	 * This content provider simply provides a "tree" where each root
+	 * node is an ISharedFolder whose label provider is a summary of its
+	 * structure and whose children are Strings providing details about
+	 * the entry.  The node as a whole is edited separately in a dialog.
+	 * @author eswartz
+	 *
+	 */
+	static class SharedFolderContentProvider implements ITreeContentProvider {
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+		 */
+		public Object[] getElements(Object inputElement) {
+			return ((Collection) inputElement).toArray();
+		}
 		
-		targetColumn = new TableColumn(table, SWT.LEFT);
-		targetColumn.setText("Target");
-		targetColumn.pack();
-		targetColumn.setToolTipText("This is the target-side path matched with the host.");
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+		 */
+		public Object[] getChildren(Object parentElement) {
+			if (parentElement instanceof ISharedFolder) {
+				ISharedFolder folder = (ISharedFolder) parentElement;
+				return new Object[] {
+					new SharePathFieldItem(
+							"Share path",
+							"The full path of the shared folder.",
+							folder),
+					new HostProvidedFieldItem(
+							"Local share?",
+							"Tells whether this machine exports the share (yes), or the virtual machine exports it (no).\n\nThe other machine will mount the share.",
+							folder),
+					new MountPathFieldItem(
+							"Mount path", 
+							"The full path where the share will be mounted on the other machine.",
+							folder),
+					new ShareNameFieldItem(
+							"Share name",
+							"The name of the share (for SMB).",
+							folder),
+					new StaticFieldItem(
+							"Share type",
+							"The protocol by which the share is provided.",
+							folder),
+					new AutoMountFieldItem(
+							"Auto connect?",
+							"If yes, attempt to mount this share when the virtual machine is started.\n\nOtherwise, make use of this share mapping for path conversion purposes only.",
+							folder),
+				};
+			}
+			return null;
+		}
 		
-		nameColumn = new TableColumn(table, SWT.LEFT);
-		nameColumn.setText("Name");
-		nameColumn.pack();
-		nameColumn.setToolTipText("This is the name of the share exposed by the provider.");
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+		 */
+		public Object getParent(Object element) {
+			if (element instanceof FieldItem)
+				return ((FieldItem) element).folder;
+			else
+				return null;
+		}
 		
-		autoColumn = new TableColumn(table, SWT.CENTER);
-		autoColumn.setText("Auto?");
-		autoColumn.pack();
-		autoColumn.setToolTipText("If \"yes\", ESbox will attempt to mount the share itself.  Otherwise, you must do this on your own.");
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+		 */
+		public boolean hasChildren(Object element) {
+			return element instanceof Collection || element instanceof ISharedFolder;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+		 */
+		public void dispose() {
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+		 */
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
 		
-		typeColumn = new TableColumn(table, SWT.LEFT);
-		typeColumn.setText("Type");
-		typeColumn.pack();
-		typeColumn.setToolTipText("The method for mounting the share.\nCurrently only used when auto-mounting the share,\nbut may serve other purposes later.");
+	}
+	
+	static class SharedFolderLabelProvider extends BaseLabelProvider implements 
+		ITableLabelProvider {
 		
-		hostViewerColumn = new TableViewerColumn(this, hostColumn);
-		hostViewerColumn.setLabelProvider(new ColumnLabelProvider() {
-			@Override
-			public String getText(Object element) {
-				ISharedFolder entry = (ISharedFolder) element;
-				return entry.getLocalPath().toOSString();
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+		 */
+		public Image getColumnImage(Object element, int columnIndex) {
+			return null;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+		 */
+		public String getColumnText(Object element, int columnIndex) {
+			if (element instanceof ISharedFolder) {
+				if (columnIndex == 0) {
+					ISharedFolder folder = (ISharedFolder) element;
+					return (folder.isHostProvidedShare()
+							? folder.getLocalPath().toOSString() 
+									: folder.getRemotePath().toPortableString());
+				}
 			}
-		});
-		fromToViewerColumn = new TableViewerColumn(this, fromToColumn);
-		fromToViewerColumn.setLabelProvider(new ColumnLabelProvider() {
-			@Override
-			public String getText(Object element) {
-				ISharedFolder entry = (ISharedFolder) element;
-				return entry.isHostProvidedShare() ? "->" : "<-";
+			if (element instanceof FieldItem) {
+				FieldItem item = (FieldItem) element;
+				if (columnIndex == 0)
+					return item.label;
+				else
+					return item.getLabel();
 			}
-		});
-		targetViewerColumn = new TableViewerColumn(this, targetColumn);
-		targetViewerColumn.setLabelProvider(new ColumnLabelProvider() {
-			@Override
-			public String getText(Object element) {
-				ISharedFolder entry = (ISharedFolder) element;
-				return entry.getRemotePath().toPortableString();
+			return null;
+		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object, int)
+		 */
+		/*
+		public Font getFont(Object element, int columnIndex) {
+			if (element instanceof DescriptionItem && columnIndex == 0) {
+				return JFaceResources.getFontRegistry().getBold(
+						JFaceResources.DIALOG_FONT);
 			}
-		});
-		nameViewerColumn = new TableViewerColumn(this, nameColumn);
-		nameViewerColumn.setLabelProvider(new ColumnLabelProvider() {
-			@Override
-			public String getText(Object element) {
-				ISharedFolder entry = (ISharedFolder) element;
-				return entry.getShareName();
-			}
-		});
-		autoViewerColumn = new TableViewerColumn(this, autoColumn);
-		autoViewerColumn.setLabelProvider(new ColumnLabelProvider() {
-			@Override
-			public String getText(Object element) {
-				ISharedFolder entry = (ISharedFolder) element;
-				return entry.isManual() ? "no" : "yes";
-			}
-		});
-		typeViewerColumn = new TableViewerColumn(this, typeColumn);
-		typeViewerColumn.setLabelProvider(new ColumnLabelProvider() {
-			@Override
-			public String getText(Object element) {
-				ISharedFolder entry = (ISharedFolder) element;
-				if (entry.getShareType() == EShareType.SAMBA) {
-					return "SMB";
-				} else {
-					return entry.getShareType().toString();
-				}
-			}
-		});
+			return JFaceResources.getFontRegistry().get(
+					JFaceResources.DIALOG_FONT);
+		}*/
+	}
+	
+	public SharedFolderTableViewer(Composite parent, int style) {
+		super(parent, style | SWT.FULL_SELECTION | SWT.SINGLE);
 		
-		table.addControlListener(new ControlAdapter() {
+		final Tree tree = getTree();
+		
+		tree.setLinesVisible(true);
+		tree.setHeaderVisible(true);
+		
+		final TreeColumn fieldColumn = new TreeColumn(tree, SWT.LEFT);
+		fieldColumn.setText("");
+		fieldColumn.pack();
+		fieldColumn.setResizable(true);
+		
+		final TreeColumn contentColumn = new TreeColumn(tree, SWT.LEFT);
+		contentColumn.setText("");
+		contentColumn.pack();
+		contentColumn.setResizable(true);
+		
+		contentViewerColumn = new TreeViewerColumn(this, contentColumn);
+		
+		tree.addControlListener(new ControlAdapter() {
 			@Override
 			public void controlResized(ControlEvent e) {
-				int fullSize = table.getSize().x - 48 - 24 - 64;
+				int fullSize = tree.getSize().x;
 				
-				// allocate 4/5 for the paths and 1/5 for the share name
-				hostColumn.setWidth(fullSize * 2 / 5 - 3);
-				targetColumn.setWidth(fullSize * 2 / 5 - 3);
-				nameColumn.setWidth(fullSize / 5);
-				
-				fromToColumn.setWidth(24);
-				autoColumn.setWidth(48);
-				typeColumn.setWidth(64);
+				fieldColumn.pack();
+				contentColumn.setWidth(fullSize - fieldColumn.getWidth() - 3);
 			}
 		});
 		
-		setContentProvider(new ArrayContentProvider());
+		ViewerTooltipSupport.addTooltipSupport(this, new ViewerTooltipSupport.ITooltipProvider() {
+
+			public String getTooltip(Object element) {
+				if (element instanceof FieldItem)
+					return ((FieldItem) element).tooltip;
+				return null;
+			}
+			
+		});
+		
+		setContentProvider(new SharedFolderContentProvider());
+		setLabelProvider(new SharedFolderLabelProvider());
 	}
 
 	public Collection<ISharedFolder> getMappings() {
@@ -167,200 +404,44 @@
 	 * Add cell editors to the viewer.
 	 */
 	public void addEditors() {
-		hostViewerColumn.setEditingSupport(new EditingSupport(this) {
+		contentViewerColumn.setEditingSupport(new EditingSupport(this) {
 
-			@Override
-			protected boolean canEdit(Object element) {
-				return true;
+			protected ISharedFolder getFolder(Object element) {
+				return ((FieldItem) element).folder;
 			}
-
 			@Override
-			protected CellEditor getCellEditor(final Object element) {
-				// allow TAB to go to next field (table seems to hide this functionality away)
-				final TextCellEditor editor = new TextCellEditor(getTable());
-				((Text) editor.getControl()).addTraverseListener(new TraverseListener() {
-
-					public void keyTraversed(TraverseEvent e) {
-						int column;
-						if (e.detail == SWT.TRAVERSE_ARROW_NEXT || e.detail == SWT.TRAVERSE_TAB_NEXT
-								|| e.detail == SWT.TRAVERSE_RETURN)
-							column = TARGET_COLUMN;
-						else if (e.detail == SWT.TRAVERSE_ARROW_PREVIOUS || e.detail == SWT.TRAVERSE_TAB_PREVIOUS)
-							column = NAME_COLUMN;
-						else
-							return;
-						
-						editor.deactivate();
-						editElement(element, column);
-					}
-					
-				});
-				return editor;
-			}
-
-			@Override
-			protected Object getValue(Object element) {
-				ISharedFolder pair = (ISharedFolder) element;
-				return pair.getLocalPath().toOSString();
-			}
-
-			@Override
-			protected void setValue(Object element, Object value) {
-				ISharedFolder pair = (ISharedFolder) element;
-				pair.setLocalPath(new Path(value.toString()));
-				refresh(pair);
-			}
-			
-		});
-		
-		fromToViewerColumn.setEditingSupport(new EditingSupport(this) {
-			
-			@Override
 			protected boolean canEdit(Object element) {
-				return true;
+				if (element instanceof FieldItem) {
+					return ((FieldItem) element).getCellEditor(getFolder(element), getTree()) != null;
+				}
+				return false;
 			}
-			
-			@Override
-			protected CellEditor getCellEditor(Object element) {
-				return new CheckboxCellEditor(getTable());
-			}
-			
-			@Override
-			protected Object getValue(Object element) {
-				ISharedFolder pair = (ISharedFolder) element;
-				return pair.isHostProvidedShare();
-			}
-			
-			@Override
-			protected void setValue(Object element, Object value) {
-				ISharedFolder pair = (ISharedFolder) element;
-				pair.setHostProvidedShare((Boolean) value);
-				refresh(pair);
-			}
-			
-		});
 
-		targetViewerColumn.setEditingSupport(new EditingSupport(this) {
-
 			@Override
-			protected boolean canEdit(Object element) {
-				return true;
-			}
-
-			@Override
 			protected CellEditor getCellEditor(final Object element) {
-				// allow TAB to go to next field (table seems to hide this functionality away)
-				final TextCellEditor editor = new TextCellEditor(getTable());
-				((Text) editor.getControl()).addTraverseListener(new TraverseListener() {
-
-					public void keyTraversed(TraverseEvent e) {
-						int column;
-						if (e.detail == SWT.TRAVERSE_ARROW_NEXT || e.detail == SWT.TRAVERSE_TAB_NEXT
-								|| e.detail == SWT.TRAVERSE_RETURN)
-							column = NAME_COLUMN;
-						else if (e.detail == SWT.TRAVERSE_ARROW_PREVIOUS || e.detail == SWT.TRAVERSE_TAB_PREVIOUS)
-							column = HOST_COLUMN;
-						else
-							return;
-						
-						editor.deactivate();
-						editElement(element, column);
-					}
-					
-				});
-				return editor;
+				if (element instanceof FieldItem) {
+					return ((FieldItem) element).getCellEditor(getFolder(element), getTree());
+				}
+				return null;
 			}
 
 			@Override
 			protected Object getValue(Object element) {
-				ISharedFolder pair = (ISharedFolder) element;
-				return pair.getRemotePath().toPortableString();
+				if (element instanceof FieldItem) {
+					return ((FieldItem) element).getField();
+				}
+				return null;
 			}
 
 			@Override
 			protected void setValue(Object element, Object value) {
-				ISharedFolder pair = (ISharedFolder) element;
-				pair.setRemotePath(new Path(value.toString()));
-				refresh(pair);
+				if (element instanceof FieldItem) {
+					((FieldItem) element).setField(value);
+					refresh(getFolder(element));
+				}
 			}
 			
 		});
 		
-		nameViewerColumn.setEditingSupport(new EditingSupport(this) {
-			
-			@Override
-			protected boolean canEdit(Object element) {
-				return true;
-			}
-			
-			@Override
-			protected CellEditor getCellEditor(final Object element) {
-				// allow TAB to go to next field (table seems to hide this functionality away)
-				final TextCellEditor editor = new TextCellEditor(getTable());
-				((Text) editor.getControl()).addTraverseListener(new TraverseListener() {
-
-					public void keyTraversed(TraverseEvent e) {
-						int column;
-						if (e.detail == SWT.TRAVERSE_ARROW_NEXT || e.detail == SWT.TRAVERSE_TAB_NEXT
-								|| e.detail == SWT.TRAVERSE_RETURN) {
-							// do NOT automatically proceed to the next cell -- boolean cells CHANGE when you enter them
-							return;
-						}
-						else if (e.detail == SWT.TRAVERSE_ARROW_PREVIOUS || e.detail == SWT.TRAVERSE_TAB_PREVIOUS)
-							column = TARGET_COLUMN;
-						else
-							return;
-						
-						editor.deactivate();
-						editElement(element, column);
-					}
-					
-				});
-				return editor;
-			}
-			
-			@Override
-			protected Object getValue(Object element) {
-				ISharedFolder pair = (ISharedFolder) element;
-				return pair.getShareName();
-			}
-			
-			@Override
-			protected void setValue(Object element, Object value) {
-				ISharedFolder pair = (ISharedFolder) element;
-				pair.setShareName(value.toString());
-				refresh(pair);
-			}
-			
-		});
-		
-		autoViewerColumn.setEditingSupport(new EditingSupport(this) {
-			
-			@Override
-			protected boolean canEdit(Object element) {
-				return true;
-			}
-			
-			@Override
-			protected CellEditor getCellEditor(Object element) {
-				return new CheckboxCellEditor(getTable());
-			}
-			
-			@Override
-			protected Object getValue(Object element) {
-				ISharedFolder pair = (ISharedFolder) element;
-				return pair.isManual();
-			}
-			
-			@Override
-			protected void setValue(Object element, Object value) {
-				ISharedFolder pair = (ISharedFolder) element;
-				pair.setManual((Boolean) value);
-				refresh(pair);
-			}
-			
-		});
-		
-		// no editing support for type yet
 	}
 }

Modified: branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFoldersPreferencePage.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFoldersPreferencePage.java	2008-12-31 16:28:05 UTC (rev 1106)
+++ branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFoldersPreferencePage.java	2008-12-31 21:22:59 UTC (rev 1107)
@@ -11,11 +11,11 @@
 
 package org.maemo.esbox.internal.api.maemosdk.ui.preferences;
 
+import org.eclipse.core.runtime.Path;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.viewers.*;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.*;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.*;
@@ -33,11 +33,11 @@
  */
 public class SharedFoldersPreferencePage extends BaseComposablePreferencePage {
 
-	private SharedFolderTableViewer tableViewer;
+	private SharedFolderTableViewer treeViewer;
 	private Composite composite;
 	private Button addButton;
 	private Button removeButton;
-	private Table table;
+	private Tree tree;
 	private SharedFolderPreferenceConverter preferenceConverter;
 	private List<ISharedFolder> model;
 	private final String preferenceName;
@@ -79,8 +79,8 @@
 	protected void loadModel(boolean isDefault) {
 		String info = getStoredPreference(isDefault);
 		model = preferenceConverter.convertPreferenceToModel(info);
-		if (tableViewer != null) {
-			tableViewer.setInput(model);
+		if (treeViewer != null) {
+			treeViewer.setInput(model);
 		}
 	}
 
@@ -132,13 +132,13 @@
 		labelLayout.horizontalSpan = 2;
 		label.setLayoutData(labelLayout);
 		
-		tableViewer = new SharedFolderTableViewer(composite, SWT.BORDER);
-		tableViewer.addEditors();
+		treeViewer = new SharedFolderTableViewer(composite, SWT.BORDER);
+		treeViewer.addEditors();
 		
 		GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
 		tableLayoutData.heightHint = 64;
-		table = tableViewer.getTable();
-		table.setLayoutData(tableLayoutData);
+		tree = treeViewer.getTree();
+		tree.setLayoutData(tableLayoutData);
 		
 		// right side is buttons
 		Composite buttonBox = new Composite(composite, SWT.NONE);
@@ -167,7 +167,7 @@
 			}
 		});
 		
-		tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+		treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
 			/* (non-Javadoc)
 			 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
 			 */
@@ -176,26 +176,45 @@
 			}
 		});
 		
+		treeViewer.getControl().addKeyListener(new KeyAdapter() {
+			/* (non-Javadoc)
+			 * @see org.eclipse.swt.events.KeyAdapter#keyReleased(org.eclipse.swt.events.KeyEvent)
+			 */
+			@Override
+			public void keyReleased(KeyEvent e) {
+				if (e.character == 127) {
+					// delete
+					doRemove();
+				}
+			}
+		});
+		
 		loadModel(false);
+		
+		treeViewer.expandAll();
 	}
 
-	/**
-	 * 
-	 */
 	protected void doAdd() {
 		ISharedFolder share = new BaseSharedFolder();
+		share.setSharePath(new Path("/fill/in/a/path"));
 		model.add(share);
-		tableViewer.refresh();
-		tableViewer.setSelection(new StructuredSelection(share));
-		tableViewer.editElement(share, 0);
+		
+		treeViewer.refresh();
+		treeViewer.setSelection(new StructuredSelection(share));
+		treeViewer.expandToLevel(share, TreeViewer.ALL_LEVELS);
+		treeViewer.reveal(share);
+		
+		// hmm, this is a no-op... we'd really like to edit into the
+		// first field of the share.
+		treeViewer.editElement(share, 0);
 	}
 	
 	protected void doRemove() {
-		IStructuredSelection ss = (IStructuredSelection) tableViewer.getSelection();
+		IStructuredSelection ss = (IStructuredSelection) treeViewer.getSelection();
 		if (ss.isEmpty())
 			return;
 		model.remove(ss.getFirstElement());
-		tableViewer.refresh();
+		treeViewer.refresh();
 	}
 
 

Modified: branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/maemosdk/ui/preferences/BuildMachinePreferencePage.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/maemosdk/ui/preferences/BuildMachinePreferencePage.java	2008-12-31 16:28:05 UTC (rev 1106)
+++ branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/maemosdk/ui/preferences/BuildMachinePreferencePage.java	2008-12-31 21:22:59 UTC (rev 1107)
@@ -168,7 +168,7 @@
 	
 		machineConfigComposite = new Composite(selectorComposite, SWT.NONE);
 		
-		machineConfigComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+		machineConfigComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
 		machineConfigStackLayout = new StackLayout();
 		machineConfigStackLayout.marginWidth = 0;
 		machineConfigStackLayout.marginHeight = 0;

Modified: branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/preferences/Scratchbox1PreferencesPage.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/preferences/Scratchbox1PreferencesPage.java	2008-12-31 16:28:05 UTC (rev 1106)
+++ branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/preferences/Scratchbox1PreferencesPage.java	2008-12-31 21:22:59 UTC (rev 1107)
@@ -108,6 +108,12 @@
 					});
 		}
 
+		feSandboxRootStr
+		.getTextControl(getFieldEditorParent())
+		.setToolTipText(
+				"Specify the base path to scratchbox.  Leave ${USER} as is (it is substituted with the active user on the build machine).");
+
+		
 		feSboxCommands = new StringFieldEditor(
 				SB1PreferenceConstants.SB1_LOGIN_COMMAND.toString(),
 				"Command template:", getFieldEditorParent());

Modified: branches/work_Ed/org.maemo.esbox.vm/conf/vm_prefs.xml
===================================================================
--- branches/work_Ed/org.maemo.esbox.vm/conf/vm_prefs.xml	2008-12-31 16:28:05 UTC (rev 1106)
+++ branches/work_Ed/org.maemo.esbox.vm/conf/vm_prefs.xml	2008-12-31 21:22:59 UTC (rev 1107)
@@ -12,8 +12,8 @@
 	<entry key="VM_SSH_HOST_ADDR">10.0.2.2</entry>
 	<entry key="VM_CIFS_TARGET_PORT">4445</entry>
 	
-	<entry key="VM_SHARED_FOLDERS_WIN32">c:\maemo\shared|/home/maemo/shared|false|true|SAMBA|shared,c:\maemo\shared|/scratchbox/users/maemo/home/maemo/shared|false|true|SAMBA|shared</entry>
-	<entry key="VM_SHARED_FOLDERS_UNIX">$(user.home)/maemo/shared|/home/maemo/shared|false|true|SAMBA|shared,$(user.home)/maemo/shared|/scratchbox/users/maemo/home/maemo/shared|false|true|SAMBA|shared</entry>
-	<entry key="VM_SHARED_FOLDERS_OSX">$(user.home)/Public|/home/maemo/shared|false|true|SAMBA|$(user.name)'s Public Folder,$(user.home)/Public|/scratchbox/users/maemo/home/maemo/shared|false|true|SAMBA|$(user.name)'s Public Folder</entry>
+	<entry key="VM_SHARED_FOLDERS_WIN32">c:\maemo\shared|/home/maemo/shared|false|true|SMB|shared,c:\maemo\shared|/scratchbox/users/maemo/home/maemo/shared|false|true|SMB|shared</entry>
+	<entry key="VM_SHARED_FOLDERS_UNIX">$(user.home)/maemo/shared|/home/maemo/shared|false|true|SMB|shared,$(user.home)/maemo/shared|/scratchbox/users/maemo/home/maemo/shared|false|true|SMB|shared</entry>
+	<entry key="VM_SHARED_FOLDERS_OSX">$(user.home)/Public|/home/maemo/shared|false|true|SMB|$(user.name)'s Public Folder,$(user.home)/Public|/scratchbox/users/maemo/home/maemo/shared|false|true|SMB|$(user.name)'s Public Folder</entry>
 	
 </properties>
\ No newline at end of file

Modified: branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/ui/preferences/CommonVirtualMachineSettingsPreferencePage.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/ui/preferences/CommonVirtualMachineSettingsPreferencePage.java	2008-12-31 16:28:05 UTC (rev 1106)
+++ branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/ui/preferences/CommonVirtualMachineSettingsPreferencePage.java	2008-12-31 21:22:59 UTC (rev 1107)
@@ -53,7 +53,7 @@
 				getFieldEditorParent());
 		addField(feUserName);
 		text = feUserName.getTextControl(getFieldEditorParent());
-		text.setToolTipText("The user under whose control processes are launched and files are accessed.  This user must be capable of 'sudo' for commands that require root privileges.");
+		text.setToolTipText("The user under whose control processes are launched and files are accessed.\n\nThis user must be capable of 'sudo' for commands that require root privileges.");
 		
 		feUserPassword = new StringFieldEditor(
 				VirtualMachinePreferenceConstants.VM_USER_PASSWORD,
@@ -107,7 +107,7 @@
 		addField(feUserPassword);
 		text = feUserPassword.getTextControl(getFieldEditorParent());
 		text.setEchoChar('\u25CF'); // Black Circle
-		text.setToolTipText("Password for the user mentioned above.\nNOTE: the password is encrypted for storage but can still show up in the UI.");
+		text.setToolTipText("Password for the user mentioned above.\n\nNOTE: the password is encrypted for storage but can still show up in the UI.");
 
 		feSshTargetAddr = new StringFieldEditor(
 				VirtualMachinePreferenceConstants.VM_SSH_TARGET_ADDR,
@@ -116,7 +116,7 @@
 				getFieldEditorParent());
 		addField(feSshTargetAddr);
 		text = feSshTargetAddr.getTextControl(getFieldEditorParent());
-		text.setToolTipText("Specify the address of the machine as seen from the host.\nThis may be localhost (127.0.0.1) if the machine shares a network with the host,\nbut be sure the SSH port is configured as well.");
+		text.setToolTipText("Specify the address of the machine as seen from the host.\n\nThis may be localhost (127.0.0.1) if the machine shares a network with the host,\nbut be sure the SSH port is configured as well.");
 
 		feSshTargetPort = new IntegerFieldEditor(
 				VirtualMachinePreferenceConstants.VM_SSH_TARGET_PORT,
@@ -125,7 +125,7 @@
 				5);
 		addField(feSshTargetPort);
 		text = feSshTargetPort.getTextControl(getFieldEditorParent());
-		text.setToolTipText("Specify the SSH port visible in the machine.\nThis may be different from the port seen inside the machine,\nespecially if the port is redirected to be visible to the host.");
+		text.setToolTipText("Specify the SSH port visible in the machine.\n\nThis may be different from the port seen inside the machine,\nespecially if the port is redirected to be visible to the host.");
 
 		feSshHostAddr = new StringFieldEditor(
 				VirtualMachinePreferenceConstants.VM_SSH_HOST_ADDR,
@@ -145,6 +145,7 @@
 		text = feSshHostPort.getTextControl(getFieldEditorParent());
 		text.setToolTipText("Specify the SSH port visible in the machine.\nThis may be different from the port seen inside the machine,\nespecially if the port is redirected to be visible to the host.");
 		 */
+		/*
 		feCifsHostPort = new IntegerFieldEditor(
 				VirtualMachinePreferenceConstants.VM_CIFS_TARGET_PORT,
 				"Target Samba port:",
@@ -153,6 +154,6 @@
 		addField(feCifsHostPort);
 		text = feCifsHostPort.getTextControl(getFieldEditorParent());
 		text.setToolTipText("Specify the Samba/CIFS port used in the machine.\nThis may be different from the port seen outside the machine,\nespecially if the port is redirected to be visible to the host.");
-		
+		*/
 	}
 }



More information about the Esbox-commits mailing list