[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