[Esbox-commits] r2250 - in branches/work_Ed: org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard org.maemo.esbox.scratchbox.sb2/src/org/maemo/esbox/internal/scratchbox/sb2/ui/wizard org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/core org.maemo.esbox.vm/src/org/maemo/esbox/internal/vm org.maemo.esbox.vm.qemu/src/org/maemo/esbox/internal/vm/qemu org.maemo.esbox.vm.virtualbox/src/org/maemo/esbox/internal/vm/virtualbox org.maemo.esbox.vm.vmware/src/org/maemo/esbox/internal/vm/vmware org.maemo.esbox.vm.vmware/src/org/maemo/esbox/internal/vm/vmware/ui/wizards

eswartz at garage.maemo.org eswartz at garage.maemo.org
Thu Oct 1 17:39:01 EEST 2009


Author: eswartz
Date: 2009-10-01 17:38:54 +0300 (Thu, 01 Oct 2009)
New Revision: 2250

Added:
   branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/MachineShareContentProvider.java
   branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SelectMachineShareDialog.java
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/SharedFoldersPreferencePage.java
   branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/ValidateMachineRunner.java
   branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1SDKInstallerSelectionWizardPage.java
   branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1TargetInstallerSelectionWizardPage.java
   branches/work_Ed/org.maemo.esbox.scratchbox.sb2/src/org/maemo/esbox/internal/scratchbox/sb2/ui/wizard/TargetWizardRootstrapSb2Page.java
   branches/work_Ed/org.maemo.esbox.vm.qemu/src/org/maemo/esbox/internal/vm/qemu/QemuMachineController.java
   branches/work_Ed/org.maemo.esbox.vm.virtualbox/src/org/maemo/esbox/internal/vm/virtualbox/VirtualBoxMachineController.java
   branches/work_Ed/org.maemo.esbox.vm.vmware/src/org/maemo/esbox/internal/vm/vmware/VMwareMachineController.java
   branches/work_Ed/org.maemo.esbox.vm.vmware/src/org/maemo/esbox/internal/vm/vmware/ui/wizards/MaemoSDKVMSelectionWizardPage.java
   branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/core/BaseVirtualBuildMachine.java
   branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/core/BaseVirtualMachineController.java
   branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/vm/ManualVirtualMachineController.java
Log:
Checkpoint for better shared folder behavior

-- cache IMachine mount points
-- allow for refreshing filesystem access (to recheck mounts and flush other caches)
-- rework SharedFolderManager to speak in terms of a validation phase and a mount phase (allowing for validation state to be reported, e.g., in UI)
-- factor out ISharedFolderHandler, allowing for other handlers in the future
-- check shared filesystems via mounts before testing the directory directly -- this avoids a really long delay when using bridged networking and shares are invalid due to the host IP changing
-- again remove the filesystem mount check from the build machine #getFileSystemAccess().  Almost always this is called too soon and can lead to annoying password prompts when they are not needed.

Also:
-- make LazyLoadingThreadTableContentProvider supply a method to attach the label listener, reducing duplicate code
-- reduce the amount of times we scan VM state, providing huge speedup in VMware


Added: branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/MachineShareContentProvider.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/MachineShareContentProvider.java	                        (rev 0)
+++ branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/MachineShareContentProvider.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Nokia Corporation
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Ed Swartz (Nokia) - initial API and implementation
+ *******************************************************************************/
+
+package org.maemo.esbox.internal.api.maemosdk.ui.preferences;
+
+import java.util.Arrays;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.swt.graphics.Image;
+import org.maemo.mica.common.core.MicaException;
+import org.maemo.mica.common.core.machine.IMachine;
+import org.maemo.mica.common.core.machine.MachineUtils;
+import org.maemo.mica.internal.api.common.core.filesystem.SambaUtils;
+import org.maemo.mica.internal.api.common.core.filesystem.SambaUtils.MachineShare;
+import org.maemo.mica.internal.api.common.ui.LazyLoadingThreadTableContentProvider;
+
+/**
+ * Fetch the exposed shares from a machine. 
+ * @author eswartz
+ *
+ */
+public class MachineShareContentProvider extends
+		LazyLoadingThreadTableContentProvider {
+
+	final static public int COLUMN_SHARENAME = 0;
+	final static public int COLUMN_PATH = 1;
+	final static public int COLUMN_COMMENT = 2;
+
+
+	protected class MachineShareFetchThread extends Thread {
+		protected Object newInput;
+
+		public MachineShareFetchThread(Object newInput) {
+			this.newInput = newInput;
+		}
+
+		protected MachineShare[] doScanFromMachine(final IMachine machine) throws MicaException {
+			IProgressMonitor monitor = new NullProgressMonitor();
+			MachineUtils.acquireMachine(machine, new SubProgressMonitor(monitor, 7));
+			if (monitor.isCanceled() || isInterrupted())
+				return null;
+			
+			return SambaUtils.getMachineShares(machine, new SubProgressMonitor(monitor, 3));
+		}
+		
+		public void run() {
+			IMachine machine = (IMachine) newInput;
+			try {
+				MachineShare[] shares = doScanFromMachine(machine);
+				synchronized (contents) {
+					contents.clear();
+					if (shares != null) {
+						contents.addAll(Arrays.asList(shares));
+					} else {
+						contents.add("Failed to find any shared folders on " + machine.getName());
+					}
+				}
+			} catch (MicaException e) {
+				synchronized (contents) {
+					contents.clear();
+					contents.add("Failed to fetch shared folders from " + machine.getName() + ": " + e.getMessage());
+				}
+			}
+			fetchThread = null;
+			doFireContentChanged();
+		}
+
+	}
+
+	/* (non-Javadoc)
+	 * @see org.maemo.mica.internal.api.common.ui.LazyLoadingThreadTableContentProvider#createContentFetchThread(java.lang.Object)
+	 */
+	@Override
+	protected Thread createContentFetchThread(Object newInput) {
+		return new MachineShareFetchThread(newInput);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+	 */
+	public Object[] getChildren(Object parentElement) {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+	 */
+	public Object getParent(Object element) {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+	 */
+	public boolean hasChildren(Object element) {
+		return false;
+	}
+
+	/* (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 == LOADING_LABEL)
+			return super.getColumnText(element, 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;
+	}
+
+}


Property changes on: branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/MachineShareContentProvider.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SelectMachineShareDialog.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SelectMachineShareDialog.java	                        (rev 0)
+++ branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SelectMachineShareDialog.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -0,0 +1,141 @@
+package org.maemo.esbox.internal.api.maemosdk.ui.preferences;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.maemo.mica.common.core.machine.IMachine;
+import org.maemo.mica.internal.api.common.core.filesystem.SambaUtils.MachineShare;
+
+/**
+ * This dialog lets the user select a share from a machine and configure the mount
+ * location as well.
+ * @author eswartz
+ *
+ */
+public final class SelectMachineShareDialog extends Dialog {
+
+	private MachineShare selectedShare;
+	private TableViewer viewer;
+	private final IMachine machine;
+
+	public SelectMachineShareDialog(Shell shell, IMachine machine) {
+		super(shell);
+		this.machine = machine;
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.Dialog#getInitialSize()
+	 */
+	@Override
+	protected Point getInitialSize() {
+		return new Point(400, 300);
+	}
+
+	/* (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("Configure a share");
+	}
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		Composite composite = (Composite) super.createDialogArea(parent);
+		
+		Label label;
+
+		//label = new Label(composite, SWT.WRAP);
+		//GridDataFactory.fillDefaults().applyTo(label);
+		//label.setText(labelText);
+		//////
+		
+		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");
+		
+		MachineShareContentProvider provider = new MachineShareContentProvider();
+		viewer.setContentProvider(provider);
+		viewer.setLabelProvider(provider);
+		provider.attachContentChangedListener(viewer);
+		
+		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(machine);
+		
+		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;
+	}
+}
\ No newline at end of file


Property changes on: branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SelectMachineShareDialog.java
___________________________________________________________________
Name: svn:eol-style
   + native

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	2009-09-30 14:10:35 UTC (rev 2249)
+++ branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFolderTableViewer.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -11,7 +11,9 @@
 
 package org.maemo.esbox.internal.api.maemosdk.ui.preferences;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jface.viewers.BaseLabelProvider;
@@ -54,6 +56,8 @@
 	private Collection<ISharedFolder> mappings;
 	private TreeViewerColumn contentViewerColumn;
 	
+	private static boolean SHOW_SHARE_TYPE = false;
+	
 	static abstract class FieldItem {
 		String label;
 		ISharedFolder folder;
@@ -124,63 +128,6 @@
 			} else {
 				cellEditor = new TextCellEditor(tree);
 			}
-			
-			/*  none of this stuff works... :p  The validator is called only
-			 * less than half the time, and the tooltip doesn't show any text, ever 
-			cellEditor.setValidator(new ICellEditorValidator() {
-
-				public String isValid(Object value) {
-					IPath path = new Path(value.toString());
-					if (!path.isAbsolute())
-						return "Path must be absolute";
-					if (isHostPath(folder) && !path.toFile().exists())
-						return "Folder does not exist on host";
-					return null;
-				}
-				
-			});
-			cellEditor.addListener(new ICellEditorListener() {
-				ToolTip errorTip = null;
-				
-				public void applyEditorValue() {
-					if (errorTip != null)
-						errorTip.dispose();
-					errorTip = null;
-				}
-
-				public void cancelEditor() {
-					if (errorTip != null)
-						errorTip.dispose();
-					errorTip = null;
-				}
-
-				public void editorValueChanged(boolean oldValidState,
-						final boolean newValidState) {
-					Display.getDefault().asyncExec(new Runnable() {
-
-						public void run() {
-							if (cellEditor.getControl().isDisposed())
-								return;
-							// the "newValidState" seems to be bogus; we need to look at the message
-							if (errorTip == null && cellEditor.getErrorMessage() != null) {
-								errorTip = new ToolTip(cellEditor.getControl().getShell(), SWT.ICON_ERROR);
-								errorTip.setLocation(cellEditor.getControl().toDisplay(cellEditor.getControl().getLocation()));
-								errorTip.setVisible(true);
-							}
-							if (cellEditor.getErrorMessage() != null)
-								errorTip.setText(cellEditor.getErrorMessage());
-							else {
-								if (errorTip != null)
-									errorTip.dispose();
-								errorTip = null;
-							}
-						}
-						
-					});
-				}
-				
-			});
-			*/
 			return cellEditor;
 		}
 	}
@@ -342,6 +289,40 @@
 	 */
 	static class SharedFolderContentProvider implements ITreeContentProvider {
 
+		private Object[] getFields(ISharedFolder folder) {
+			List<Object> fieldList = new ArrayList();
+			
+			fieldList.add(new SharePathFieldItem(
+							"Share path",
+							"The full path of the shared folder.",
+							folder));
+			fieldList.add(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));
+			fieldList.add(new MountPathFieldItem(
+							"Mount path", 
+							"The full path where the share will be mounted.",
+							folder));
+			fieldList.add(new ShareNameFieldItem(
+							"Share name",
+							"The name of the share (for SMB).",
+							folder));
+			if (SHOW_SHARE_TYPE) {
+				fieldList.add(new StaticFieldItem(
+								"Share type",
+								"The protocol by which the share is provided.",
+								folder));
+			}
+			fieldList.add(new AutoMountFieldItem(
+							"Auto mount?",
+							"If yes, attempt to mount this share when the virtual machine is started.\n\n(NOTE:  ESbox may not be able to mount all folders automatically.)\n\nIf not set, make use of this share mapping for path conversion purposes only.",
+							folder));
+
+			return (Object[]) fieldList.toArray(new Object[fieldList.size()]);
+			
+		}
+		
 		/* (non-Javadoc)
 		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
 		 */
@@ -355,32 +336,7 @@
 		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.",
-							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 getFields(folder);
 			}
 			return null;
 		}

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-30 14:10:35 UTC (rev 2249)
+++ branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/SharedFoldersPreferencePage.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -11,42 +11,40 @@
 
 package org.maemo.esbox.internal.api.maemosdk.ui.preferences;
 
+import java.text.MessageFormat;
+import java.util.List;
+
 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.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
 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.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
 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.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Tree;
 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 org.maemo.mica.internal.api.common.core.filesystem.SambaUtils.MachineShare;
+import org.maemo.mica.internal.api.common.core.ui.GridLayoutWrappedTextUtils;
 
-import java.lang.reflect.InvocationTargetException;
-import java.text.MessageFormat;
-import java.util.List;
-
 /**
  * This page is included inside a BuildMachineSelectionPreferencePage
  * to configure the shared folder mappings between host and target.
@@ -155,11 +153,15 @@
 		composite.setLayoutData(layoutData);
 		
 		// left side is the table
-		Label label = new Label(composite, SWT.NONE);
-		label.setText("Shared folder mappings:");
+		Label label = new Label(composite, SWT.WRAP);
+		label.setText(
+		"ESbox needs to create projects on the host, in a shared folder visible to the VM.  "+
+		"For C/C++ indexing and C++ hover help, ESbox must be able to see SDK contents from a shared folder in the VM.\n\n"+
+		"Configure the shared folders to use:");
+		
 		GridData labelLayout = new GridData(SWT.LEFT, SWT.TOP, true, false);
 		labelLayout.horizontalSpan = 2;
-		label.setLayoutData(labelLayout);
+		GridLayoutWrappedTextUtils.setupLabel(parent, label, labelLayout);
 		
 		treeViewer = new SharedFolderTableViewer(composite, SWT.BORDER);
 		treeViewer.addEditors();
@@ -178,7 +180,7 @@
 		
 		addButton = new Button(buttonBox, SWT.PUSH);
 		addButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-		addButton.setText("&Add");
+		addButton.setText("&New");
 		addButton.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
@@ -301,196 +303,11 @@
 		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);
+		SelectMachineShareDialog dialog = new SelectMachineShareDialog(getShell(), 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) {

Modified: branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/ValidateMachineRunner.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/ValidateMachineRunner.java	2009-09-30 14:10:35 UTC (rev 2249)
+++ branches/work_Ed/org.maemo.esbox.maemosdk.ui/src/org/maemo/esbox/internal/api/maemosdk/ui/preferences/ValidateMachineRunner.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -38,6 +38,7 @@
 import org.maemo.mica.common.core.filesystem.ISharedFilesystemProvider;
 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.core.process.CommandLineArguments;
 import org.maemo.mica.common.core.process.IProcessLauncher;
@@ -208,6 +209,10 @@
 	 * @return true for success
 	 */
 	private boolean testSharedFolders(IProgressMonitor monitor) {
+		// re-detect mounts each time
+		machine.getFileSystemAccess().refresh();
+		MachineRegistry.getInstance().getLocalMachine().getFileSystemAccess().refresh();
+		
 		ISharedFilesystemProvider sharedFilesystemProvider = machine.getSharedFilesystemProvider();
 		if (sharedFilesystemProvider == null)
 			return true;

Modified: branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1SDKInstallerSelectionWizardPage.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1SDKInstallerSelectionWizardPage.java	2009-09-30 14:10:35 UTC (rev 2249)
+++ branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1SDKInstallerSelectionWizardPage.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -133,22 +133,8 @@
 		
 		sdkTable.setContentProvider(platformProvider);
 		sdkTable.setLabelProvider(platformProvider);
+		platformProvider.attachContentChangedListener(sdkTable);
 		
-		platformProvider.addListener(new ILabelProviderListener() {
-
-			public void labelProviderChanged(LabelProviderChangedEvent event) {
-				Display.getDefault().asyncExec(new Runnable() {
-					public void run() {
-						if (!sdkTable.getTable().isDisposed()) {
-							for (TableColumn column : sdkTable.getTable().getColumns()) {
-								column.pack();
-							}
-						}
-					}
-				});
-			}
-		});
-		
 		Table table = sdkTable.getTable();
 		GridDataFactory.fillDefaults().grab(true, true).span(2, 1).applyTo(table);
 		

Modified: branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1TargetInstallerSelectionWizardPage.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1TargetInstallerSelectionWizardPage.java	2009-09-30 14:10:35 UTC (rev 2249)
+++ branches/work_Ed/org.maemo.esbox.scratchbox.sb1/src/org/maemo/esbox/internal/scratchbox/sb1/ui/wizard/Scratchbox1TargetInstallerSelectionWizardPage.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -23,12 +23,10 @@
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.viewers.ArrayContentProvider;
 import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.ILabelProviderListener;
 import org.eclipse.jface.viewers.IOpenListener;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
 import org.eclipse.jface.viewers.OpenEvent;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
@@ -219,23 +217,8 @@
 		
 		platformTable.setContentProvider(platformProvider);
 		platformTable.setLabelProvider(platformProvider);
+		platformProvider.attachContentChangedListener(platformTable);
 		
-		platformProvider.addListener(new ILabelProviderListener() {
-
-			public void labelProviderChanged(LabelProviderChangedEvent event) {
-				Display.getDefault().asyncExec(new Runnable() {
-					public void run() {
-						if (!platformTable.getTable().isDisposed()) {
-							for (TableColumn column : platformTable.getTable().getColumns()) {
-								column.pack();
-							}
-						}
-					}
-				});
-			}
-		});
-
-		
 		Table table = platformTable.getTable();
 		GridDataFactory.fillDefaults().grab(true, true).span(2,1).applyTo(table);
 		

Modified: branches/work_Ed/org.maemo.esbox.scratchbox.sb2/src/org/maemo/esbox/internal/scratchbox/sb2/ui/wizard/TargetWizardRootstrapSb2Page.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.scratchbox.sb2/src/org/maemo/esbox/internal/scratchbox/sb2/ui/wizard/TargetWizardRootstrapSb2Page.java	2009-09-30 14:10:35 UTC (rev 2249)
+++ branches/work_Ed/org.maemo.esbox.scratchbox.sb2/src/org/maemo/esbox/internal/scratchbox/sb2/ui/wizard/TargetWizardRootstrapSb2Page.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -88,7 +88,8 @@
 		provider = new MaemoRootstrapContentLabelProvider(sdk);
 		rootstrapTargetViewer.setContentProvider(provider);
 		rootstrapTargetViewer.setLabelProvider(provider);
-
+		provider.attachContentChangedListener(rootstrapTargetViewer);
+		
 		rootstrapTargetViewer
 				.addSelectionChangedListener(new ISelectionChangedListener() {
 
@@ -100,14 +101,6 @@
 
 				});
 
-		provider.addListener(new ILabelProviderListener() {
-
-			public void labelProviderChanged(LabelProviderChangedEvent event) {
-				rootstrapTargetViewer.refresh();
-			}
-
-		});
-
 		rootstrapTargetViewer.getTree().setLinesVisible(true);
 		rootstrapTargetViewer.getTree().setHeaderVisible(true);
 

Modified: branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/core/BaseVirtualBuildMachine.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/core/BaseVirtualBuildMachine.java	2009-09-30 14:10:35 UTC (rev 2249)
+++ branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/core/BaseVirtualBuildMachine.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -12,10 +12,6 @@
 package org.maemo.esbox.internal.api.vm.core;
 
 
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
 import org.maemo.mica.common.core.filesystem.IFileSystemAccess;
 import org.maemo.mica.common.core.filesystem.ISharedFilesystemProvider;
 import org.maemo.mica.common.core.machine.IMachineController;
@@ -28,7 +24,7 @@
  *
  */
 public abstract class BaseVirtualBuildMachine extends BaseVirtualMachine implements IBuildMachineImpl {
-	private Job validateSharesJob;
+	//private Job validateSharesJob;
 
 
 	public BaseVirtualBuildMachine(String id, String name, String os, String arch,
@@ -44,6 +40,7 @@
 	 */
 	@Override
 	public IFileSystemAccess getFileSystemAccess() {
+		/*
 		// EJS 090624: do this in a job to avoid using a null progress monitor;
 		// if network settings are not perfect, then smbmount will hang for a
 		// very long time and this will be uncancellable.
@@ -79,24 +76,7 @@
 			}
 			validateSharesJob = null;
 		}
-		
-		/*
-		// for this kind of machine, check more proactively,
-		// otherwise build-related stuff is likely to fail
-
-		boolean shouldValidate;
-		synchronized (this) {
-			shouldValidate = !validatedShares && !isValidatingShares;
-		}
-		if (shouldValidate) {
-			// now, verify shared folders
-			ensureSharesMounted(new NullProgressMonitor());
-			
-			// maybe the user cancelled or there were errors... but don't keep asking
-			validatedShares = true;		
-		}
 		*/
-		
 		return super.getFileSystemAccess();
 	}
 }

Modified: branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/core/BaseVirtualMachineController.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/core/BaseVirtualMachineController.java	2009-09-30 14:10:35 UTC (rev 2249)
+++ branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/api/vm/core/BaseVirtualMachineController.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -62,7 +62,9 @@
 public abstract class BaseVirtualMachineController extends SSHMachineControllerBase {
 
 	protected static final IStatus CANCEL_STATUS = Policy.getCancelStatus(Activator.getDefault());
-	
+	private long nextVMAliveCheck;
+	private boolean isVMRunning;
+
 	protected IVirtualMachineConfiguration machineConfiguration;
 	
 	public BaseVirtualMachineController(IVirtualMachineConfiguration configuration) {
@@ -80,16 +82,60 @@
 		return machineConfiguration.getSSHConfiguration(); 
 	}
 	
-
 	/**
 	 * Tell if the virtual machine or engine is running.  This either detects
 	 * existing instances of the machine running on the host, or verifies
 	 * that a previously launched instance via {@link #startMachine(IProgressMonitor)} 
 	 * is still valid.
+	 * <p>
+	 * This check uses cached information that remains "true" for a long time
+	 * after the machine is detected.  Use {@link #scheduleProbe()} to reset.
 	 * @return true if it is likely running, false if we either don't know
 	 * or if it is not running.  If unsure, return false.
 	 */
-	abstract public boolean isMachineRunning();
+	final public boolean isMachineRunning() {
+		if (System.currentTimeMillis() >= nextVMAliveCheck) {
+			isVMRunning = doIsMachineRunning();
+			if (!isVMRunning) {
+				// check fairly often while it is not running
+				nextVMAliveCheck = System.currentTimeMillis() + getNextIsRunningDelay(false);
+			} else {
+				// don't check if it is working
+				nextVMAliveCheck = System.currentTimeMillis() + getNextIsRunningDelay(true);
+			}
+		}
+		return isVMRunning;
+	}
+
+	/**
+	 * Get the delay before checking whether the VM is running.
+	 * The time should be short is the machine is not running and
+	 * longer if it is running.
+	 * @param isRunning 
+	 * @return delay in ms
+	 */
+	protected long getNextIsRunningDelay(boolean isRunning) {
+		return isRunning ? 60 * 1000 : 1 * 1000;
+	}
+
+	/**
+	 * Implement the check for the virtual machine or engine is running.  This either detects
+	 * existing instances of the machine running on the host, or verifies
+	 * that a previously launched instance via {@link #startMachine(IProgressMonitor)} 
+	 * is still valid.
+	 * @return true if it is likely running, false if we either don't know
+	 * or if it is not running.  If unsure, return false.
+	 */
+	abstract protected boolean doIsMachineRunning();
+
+	/* (non-Javadoc)
+	 * @see org.maemo.mica.internal.api.protocol.ssh.SSHMachineControllerBase#scheduleProbe()
+	 */
+	@Override
+	public void scheduleProbe() {
+		super.scheduleProbe();
+		nextVMAliveCheck = System.currentTimeMillis();
+	}
 	
 	/**
 	 * Probe the machine until the connection is established.  Since this

Modified: branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/vm/ManualVirtualMachineController.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/vm/ManualVirtualMachineController.java	2009-09-30 14:10:35 UTC (rev 2249)
+++ branches/work_Ed/org.maemo.esbox.vm/src/org/maemo/esbox/internal/vm/ManualVirtualMachineController.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -58,7 +58,7 @@
 	 * @see org.maemo.esbox.internal.api.vm.core.BaseVirtualMachineController#isMachineRunning()
 	 */
 	@Override
-	public boolean isMachineRunning() {
+	public boolean doIsMachineRunning() {
 		return false;
 	}
 }

Modified: branches/work_Ed/org.maemo.esbox.vm.qemu/src/org/maemo/esbox/internal/vm/qemu/QemuMachineController.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.vm.qemu/src/org/maemo/esbox/internal/vm/qemu/QemuMachineController.java	2009-09-30 14:10:35 UTC (rev 2249)
+++ branches/work_Ed/org.maemo.esbox.vm.qemu/src/org/maemo/esbox/internal/vm/qemu/QemuMachineController.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -85,7 +85,7 @@
 	 * @see org.maemo.esbox.internal.api.vm.core.BaseLaunchableVirtualMachineController#isMachineRunning()
 	 */
 	@Override
-	public boolean isMachineRunning() {
+	protected boolean doIsMachineRunning() {
 		if (launchInfo != null) {
 			return launchInfo.isAlive();
 		}

Modified: branches/work_Ed/org.maemo.esbox.vm.virtualbox/src/org/maemo/esbox/internal/vm/virtualbox/VirtualBoxMachineController.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.vm.virtualbox/src/org/maemo/esbox/internal/vm/virtualbox/VirtualBoxMachineController.java	2009-09-30 14:10:35 UTC (rev 2249)
+++ branches/work_Ed/org.maemo.esbox.vm.virtualbox/src/org/maemo/esbox/internal/vm/virtualbox/VirtualBoxMachineController.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -186,7 +186,7 @@
 	 * @see org.maemo.esbox.internal.api.vm.core.BaseLaunchableVirtualMachineController#isMachineRunning()
 	 */
 	@Override
-	public boolean isMachineRunning() {
+	protected boolean doIsMachineRunning() {
 		LaunchResults results = launchAndRunVBoxManage(10, "list", "runningvms");
 		if (results == null)
 			return false;

Modified: branches/work_Ed/org.maemo.esbox.vm.vmware/src/org/maemo/esbox/internal/vm/vmware/VMwareMachineController.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.vm.vmware/src/org/maemo/esbox/internal/vm/vmware/VMwareMachineController.java	2009-09-30 14:10:35 UTC (rev 2249)
+++ branches/work_Ed/org.maemo.esbox.vm.vmware/src/org/maemo/esbox/internal/vm/vmware/VMwareMachineController.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -90,10 +90,7 @@
 		return (IProcess[]) matches.toArray(new IProcess[matches.size()]);
 	}
 
-	/* (non-Javadoc)
-	 * @see org.maemo.esbox.internal.api.vm.core.IVirtualMachineController#isMachineRunning()
-	 */
-	public boolean isMachineRunning() {
+	protected boolean doIsMachineRunning() {
 		// We can't tell if the machine stopped running just based on the process stopping
 		// (VMware may have used another instance to host the machine, or, vmrun has exited
 		// right away)
@@ -133,6 +130,19 @@
 	}
 	
 	/* (non-Javadoc)
+	 * @see org.maemo.esbox.internal.api.vm.core.BaseVirtualMachineController#getNextIsRunningDelay(boolean)
+	 */
+	@Override
+	protected long getNextIsRunningDelay(boolean isRunning) {
+		long delay = super.getNextIsRunningDelay(isRunning);
+		if (HostUtils.isWindows()) {
+			// longer delay because vmrun is sooooo slow here
+			delay *= 5;
+		}
+		return delay;
+	}
+	
+	/* (non-Javadoc)
 	 * @see org.maemo.esbox.internal.api.vm.core.BaseVirtualMachineController#constructLaunchParameters()
 	 */
 	@Override

Modified: branches/work_Ed/org.maemo.esbox.vm.vmware/src/org/maemo/esbox/internal/vm/vmware/ui/wizards/MaemoSDKVMSelectionWizardPage.java
===================================================================
--- branches/work_Ed/org.maemo.esbox.vm.vmware/src/org/maemo/esbox/internal/vm/vmware/ui/wizards/MaemoSDKVMSelectionWizardPage.java	2009-09-30 14:10:35 UTC (rev 2249)
+++ branches/work_Ed/org.maemo.esbox.vm.vmware/src/org/maemo/esbox/internal/vm/vmware/ui/wizards/MaemoSDKVMSelectionWizardPage.java	2009-10-01 14:38:54 UTC (rev 2250)
@@ -32,7 +32,6 @@
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.FileDialog;
 import org.eclipse.swt.widgets.Label;
@@ -195,25 +194,10 @@
 		platformProvider.addListener(this);
 		virtualImagesTable.setContentProvider(platformProvider);
 		virtualImagesTable.setLabelProvider(platformProvider);
-
 		virtualImagesTable.setComparator(new VirtualImagesComparator());
 		
-		platformProvider.addListener(new ILabelProviderListener() {
-
-			public void labelProviderChanged(LabelProviderChangedEvent event) {
-				Display.getDefault().asyncExec(new Runnable() {
-					public void run() {
-						if (!virtualImagesTable.getTable().isDisposed()) {
-							for (TableColumn column : virtualImagesTable
-									.getTable().getColumns()) {
-								column.pack();
-							}
-						}
-					}
-				});
-			}
-		});
-
+		platformProvider.attachContentChangedListener(virtualImagesTable);
+		
 		Table table = virtualImagesTable.getTable();
 		GridDataFactory.fillDefaults().grab(true, true).span(4, 1).applyTo(
 				table);



More information about the Esbox-commits mailing list