[Esbox-commits] r2249 - in branches/work_Ed: org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/ui/preferences

eswartz at garage.maemo.org eswartz at garage.maemo.org
Wed Sep 30 17:10:43 EEST 2009


Author: eswartz
Date: 2009-09-30 17:10:35 +0300 (Wed, 30 Sep 2009)
New Revision: 2249

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.vm/src/org/maemo/esbox/internal/api/vm/ui/preferences/BaseVirtualMachinePreferencePage.java
Log:
Checkpoint for shared folder UI fixes

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	2009-09-29 21:16:00 UTC (rev 2248)
+++ branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFoldersPreferencePage.java	2009-09-30 14:10:35 UTC (rev 2249)
@@ -12,19 +12,38 @@
 package org.maemo.esbox.internal.api.maemosdk.ui.preferences;
 
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.viewers.*;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.*;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.*;
+import org.maemo.esbox.internal.maemosdk.ui.UIActivator;
+import org.maemo.mica.common.core.MicaException;
+import org.maemo.mica.common.core.filesystem.EShareType;
 import org.maemo.mica.common.core.filesystem.ISharedFolder;
+import org.maemo.mica.common.core.machine.IMachine;
+import org.maemo.mica.common.core.machine.MachineRegistry;
+import org.maemo.mica.common.core.machine.MachineUtils;
 import org.maemo.mica.common.ui.preferences.BaseComposablePreferencePage;
 import org.maemo.mica.internal.api.common.core.filesystem.BaseSharedFolder;
+import org.maemo.mica.internal.api.common.core.filesystem.SambaSharedFolderHandler;
 import org.maemo.mica.internal.api.common.core.filesystem.SharedFolderPreferenceConverter;
+import org.maemo.mica.internal.api.common.core.filesystem.SambaSharedFolderHandler.MachineShare;
 
+import java.lang.reflect.InvocationTargetException;
 import java.text.MessageFormat;
 import java.util.List;
 
@@ -39,15 +58,19 @@
 	private SharedFolderTableViewer treeViewer;
 	private Composite composite;
 	private Button addButton;
+	private Button addLocalButton;
+	private Button addRemoteButton;
 	private Button removeButton;
 	private Button duplicateButton;
 	private Tree tree;
 	private SharedFolderPreferenceConverter preferenceConverter;
 	private List<ISharedFolder> model;
 	private final String preferenceName;
+	private final BaseMachinePreferencePage machinePreferencePage;
 
-	public SharedFoldersPreferencePage(IPreferenceStore store, String preferenceName) {
+	public SharedFoldersPreferencePage(BaseMachinePreferencePage machinePreferencePage, IPreferenceStore store, String preferenceName) {
 		super();
+		this.machinePreferencePage = machinePreferencePage;
 		setTitle("Shared folders");
 		setPreferenceStore(store);
 		this.preferenceName = preferenceName;
@@ -155,7 +178,7 @@
 		
 		addButton = new Button(buttonBox, SWT.PUSH);
 		addButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-		addButton.setText("Add");
+		addButton.setText("&Add");
 		addButton.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -163,9 +186,29 @@
 			}
 		});
 		
+		addLocalButton = new Button(buttonBox, SWT.PUSH);
+		addLocalButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+		addLocalButton.setText("Add &Local");
+		addLocalButton.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				doAddLocal();
+			}
+		});
+		
+		addRemoteButton = new Button(buttonBox, SWT.PUSH);
+		addRemoteButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+		addRemoteButton.setText("Add &Remote");
+		addRemoteButton.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				doAddRemote();
+			}
+		});
+		
 		removeButton = new Button(buttonBox, SWT.PUSH);
 		removeButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-		removeButton.setText("Remove");
+		removeButton.setText("Re&move");
 		removeButton.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -175,7 +218,7 @@
 		
 		duplicateButton = new Button(buttonBox, SWT.PUSH);
 		duplicateButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-		duplicateButton.setText("Duplicate");
+		duplicateButton.setText("&Duplicate");
 		duplicateButton.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -258,6 +301,214 @@
 		addNewShare(share);
 	}
 
+	protected MachineShare[] doScanFromMachine(final IMachine machine) {
+		ProgressMonitorDialog dialog = new ProgressMonitorDialog(getShell());
+		final MachineShare[][] shareArrays = { null };
+		
+		try {
+			dialog.run(true, true, new IRunnableWithProgress() {
+
+				public void run(IProgressMonitor monitor)
+						throws InvocationTargetException, InterruptedException {
+					monitor.beginTask("", 10);
+					
+					try {
+						MachineUtils.acquireMachine(machine, new SubProgressMonitor(monitor, 7));
+					} catch (MicaException e) {
+						throw new InvocationTargetException(e);
+					}
+					if (monitor.isCanceled())
+						return;
+					
+					SambaSharedFolderHandler handler = new SambaSharedFolderHandler();
+					MachineShare[] shares;
+					try {
+						shares = handler.getMachineShares(machine, new SubProgressMonitor(monitor, 3));
+						shareArrays[0] = shares;
+					} catch (MicaException e) {
+						throw new InvocationTargetException(e);
+					}
+				}
+				
+			});
+		} catch (InvocationTargetException e) {
+			UIActivator.getErrorLogger().logAndShowError("Unexpected error scanning shares", e);
+		} catch (InterruptedException e) {
+		}
+		
+		return shareArrays[0];
+	}
+	
+	/**
+	 * @author eswartz
+	 *
+	 */
+	public static final class SelectShareDialog extends Dialog {
+		final static int COLUMN_SHARENAME = 0;
+		final static int COLUMN_PATH = 1;
+		final static int COLUMN_COMMENT = 2;
+		
+		public static final class MachineShareTableLabelProvider extends
+				BaseLabelProvider implements ITableLabelProvider {
+
+			/* (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 MachineShare))
+					return null;
+				
+				MachineShare share = (MachineShare) element;
+				switch (columnIndex) {
+				case COLUMN_SHARENAME:
+					return share.getShareName();
+				case COLUMN_PATH:
+					return share.getPath();
+				case COLUMN_COMMENT:
+					return share.getComment();
+				}
+				return null;
+			}
+		}
+
+		private MachineShare selectedShare;
+		private TableViewer viewer;
+		private final MachineShare[] shares;
+
+		public SelectShareDialog(Shell shell, MachineShare[] shares) {
+			super(shell);
+			this.shares = shares;
+			setShellStyle(getShellStyle() | SWT.RESIZE);
+		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.dialogs.Dialog#getInitialSize()
+		 */
+		@Override
+		protected Point getInitialSize() {
+			return new Point(300, 200);
+		}
+	
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+		 */
+		@Override
+		protected void configureShell(Shell newShell) {
+			super.configureShell(newShell);
+			newShell.setText("Select a share");
+		}
+		@Override
+		protected Control createDialogArea(Composite parent) {
+			Composite composite = (Composite) super.createDialogArea(parent);
+			
+			Label label = new Label(composite, SWT.WRAP);
+			GridDataFactory.fillDefaults().applyTo(label);
+			label.setText("Select one of the shares:");
+			
+			viewer = new TableViewer(composite, SWT.READ_ONLY | SWT.FULL_SELECTION | SWT.BORDER);
+			Table table = viewer.getTable();
+			GridDataFactory.fillDefaults().grab(true, true).applyTo(table);
+			
+			table.setHeaderVisible(true);
+			table.setLinesVisible(true);
+			
+			TableColumn column;
+			
+			column = new TableColumn(table, SWT.LEFT);
+			column.setText("Share name");
+			column = new TableColumn(table, SWT.LEFT);
+			column.setText("Path");
+			column = new TableColumn(table, SWT.LEFT);
+			column.setText("Comment");
+			
+			viewer.setContentProvider(new ArrayContentProvider());
+			viewer.setLabelProvider(new MachineShareTableLabelProvider());
+			
+			viewer.addDoubleClickListener(new IDoubleClickListener() {
+
+				public void doubleClick(DoubleClickEvent event) {
+					Object sel = ((IStructuredSelection) event.getSelection()).getFirstElement();
+					if (sel instanceof MachineShare) {
+						selectedShare = (MachineShare) sel;
+						close();
+					}
+				}
+			});
+			
+			viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+
+				public void selectionChanged(SelectionChangedEvent event) {
+					Object sel = ((IStructuredSelection) event.getSelection()).getFirstElement();
+					if (sel instanceof MachineShare) {
+						selectedShare = (MachineShare) sel;
+						validate();
+					}
+				}
+				
+			});
+			viewer.setInput(shares);
+			
+			table.pack();
+			for (TableColumn columnx : table.getColumns())
+				columnx.pack();
+			
+			return composite;
+		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
+		 */
+		@Override
+		protected void createButtonsForButtonBar(Composite parent) {
+			super.createButtonsForButtonBar(parent);
+			validate();
+		}
+		protected void validate() { 
+			Button button = getButton(IDialogConstants.OK_ID);
+			button.setEnabled(selectedShare != null);
+		}
+		
+		public MachineShare getShare() {
+			return selectedShare;
+		}
+	}
+
+	protected void doAddFromMachine(IMachine machine, boolean isLocal) {
+		MachineShare[] shares = doScanFromMachine(machine);
+		
+		if (shares == null || shares.length == 0) {
+			MessageDialog.openInformation(getShell(), "No shares", 
+					"No shares are exposed on the machine.");
+			return;
+		}
+			
+		SelectShareDialog dialog = new SelectShareDialog(getShell(), shares);
+		
+		int ret = dialog.open();
+		MachineShare share = dialog.getShare();
+		if (ret == IDialogConstants.OK_ID && share != null) {
+			ISharedFolder sharedFolder = new BaseSharedFolder();
+			sharedFolder.setSharePath(new Path(share.getPath()));
+			sharedFolder.setShareName(share.getShareName());
+			sharedFolder.setHostProvidedShare(isLocal);
+			sharedFolder.setShareType(EShareType.SMB);
+			addNewShare(sharedFolder);
+		}
+	}
+	protected void doAddLocal() {
+		doAddFromMachine(MachineRegistry.getInstance().getLocalMachine(), true);
+	}
+	protected void doAddRemote() {
+		IMachine machine = machinePreferencePage.createMachine();
+		doAddFromMachine(machine, false);
+	}
 	private void addNewShare(ISharedFolder share) {
 		model.add(share);
 		

Modified: branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/ui/preferences/BaseVirtualMachinePreferencePage.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/ui/preferences/BaseVirtualMachinePreferencePage.java	2009-09-29 21:16:00 UTC (rev 2248)
+++ branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/ui/preferences/BaseVirtualMachinePreferencePage.java	2009-09-30 14:10:35 UTC (rev 2249)
@@ -49,6 +49,7 @@
 				addressConfigurator,
 				this);
 		sharedFoldersPrefPage = new SharedFoldersPreferencePage(
+				this,
 				getPreferenceStore(),
 				VirtualMachinePreferenceConstants.VM_SHARED_FOLDERS);
 		



More information about the Esbox-commits mailing list