Mercurial > hg > release > thermostat-0.9
changeset 1063:c1edec7797bd
Automatically update Hosts/VMs tree in Eclipse
This commit adds a timer to the HostsVmsTreeViewPart in Eclipse, similar
to what the Swing GUI uses, to update the list of Hosts/VMs that are
shown to the user. This commit makes it possible to monitor new VMs that
are created while Eclipse is running. I have also changed the default
behaviour to only show live hosts, since this is what is done by default
in the Swing GUI. A mechanism to configure this option will come later.
Reviewed-by: jerboaa
Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2013-March/006197.html
PR1355
author | Elliott Baron <ebaron@redhat.com> |
---|---|
date | Fri, 05 Apr 2013 15:27:57 -0400 |
parents | 216eb7ac12cd |
children | 653f57559b42 |
files | eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/controllers/ConnectionJobListener.java eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/views/HostsVmsTreeViewPart.java |
diffstat | 2 files changed, 68 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/controllers/ConnectionJobListener.java Thu Apr 04 19:24:22 2013 +0200 +++ b/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/controllers/ConnectionJobListener.java Fri Apr 05 15:27:57 2013 -0400 @@ -42,15 +42,12 @@ import org.eclipse.jface.action.Action; import com.redhat.thermostat.eclipse.internal.Activator; -import com.redhat.thermostat.eclipse.internal.views.HostsVmsTreeViewPart; public class ConnectionJobListener extends JobChangeAdapter { - private HostsVmsTreeViewPart view; private Action connectAction; - public ConnectionJobListener(Action connectAction, HostsVmsTreeViewPart view) { - this.view = view; + public ConnectionJobListener(Action connectAction) { this.connectAction = connectAction; } @@ -62,7 +59,6 @@ .getImageDescriptor("icons/online.png")); connectAction.setEnabled(!Activator.getDefault().isDbConnected()); connectAction.setToolTipText("Online"); - view.showHostVmsPage(); } } }
--- a/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/views/HostsVmsTreeViewPart.java Thu Apr 04 19:24:22 2013 +0200 +++ b/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/views/HostsVmsTreeViewPart.java Fri Apr 05 15:27:57 2013 -0400 @@ -38,6 +38,7 @@ import java.util.Map; import java.util.Objects; +import java.util.concurrent.TimeUnit; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.Action; @@ -51,15 +52,16 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Listener; -import org.eclipse.ui.IViewSite; -import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.PageBook; import org.eclipse.ui.part.ViewPart; import org.osgi.framework.BundleContext; +import com.redhat.thermostat.common.ApplicationService; +import com.redhat.thermostat.common.MultipleServiceTracker; +import com.redhat.thermostat.common.Timer; +import com.redhat.thermostat.common.Timer.SchedulingType; import com.redhat.thermostat.common.config.ClientPreferences; -import com.redhat.thermostat.common.MultipleServiceTracker; import com.redhat.thermostat.eclipse.internal.Activator; import com.redhat.thermostat.eclipse.internal.ConnectionConfiguration; import com.redhat.thermostat.eclipse.internal.controllers.ConnectDBAction; @@ -88,9 +90,11 @@ // Container for tree and connect private PageBook pageBook; private MultipleServiceTracker tracker; + private ApplicationService appSvc; private HostInfoDAO hostInfoDAO; private VmInfoDAO vmInfoDAO; private boolean closing; + private Timer timer; public HostsVmsTreeViewPart() { ClientPreferences clientPrefs = new ClientPreferences(Activator.getDefault().getKeyring()); @@ -103,15 +107,11 @@ connectAction = new ConnectDBAction(connectJob); connectAction.setImageDescriptor(Activator .getImageDescriptor("icons/offline.png")); - connectJob.addJobChangeListener(new ConnectionJobListener(connectAction, this)); - } - - @Override - public void init(IViewSite site) throws PartInitException { - super.init(site); + connectJob.addJobChangeListener(new ConnectionJobListener(connectAction)); BundleContext context = Activator.getDefault().getBundle().getBundleContext(); Class<?>[] deps = new Class<?>[] { + ApplicationService.class, HostInfoDAO.class, VmInfoDAO.class }; @@ -119,10 +119,15 @@ @Override public void dependenciesAvailable(Map<String, Object> services) { + appSvc = (ApplicationService) services.get(ApplicationService.class.getName()); + Objects.requireNonNull(appSvc); hostInfoDAO = (HostInfoDAO) services.get(HostInfoDAO.class.getName()); Objects.requireNonNull(hostInfoDAO); vmInfoDAO = (VmInfoDAO) services.get(VmInfoDAO.class.getName()); Objects.requireNonNull(vmInfoDAO); + + // Switch to Hosts/VMs page + showHostVmsPage(); } @Override @@ -141,7 +146,6 @@ } } }); - tracker.open(); } @Override @@ -155,24 +159,34 @@ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { @Override public void run() { + // Stop background updates + if (timer != null) { + timer.stop(); + } pageBook.showPage(connectPage); } }); } - public void showHostVmsPage() { + private void showHostVmsPage() { final HostsVMsLoader loader = new DefaultHostsVMsLoader(hostInfoDAO, - vmInfoDAO, false); + vmInfoDAO, true /* TODO Make configurable */); + final HostsVmsTreeRoot root = new HostsVmsTreeRoot(); PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { @Override public void run() { - treeViewer.setContentProvider(new HostsVmsTreeContentProvider( - loader)); + initializeTimer(root); + + treeViewer.setContentProvider(new HostsVmsTreeContentProvider(loader)); treeViewer.setLabelProvider(new HostsVmsLabelProvider()); treeViewer.setUseHashlookup(true); - treeViewer.setInput(new HostsVmsTreeRoot()); + treeViewer.setInput(root); + + // Start background updates + timer.start(); + pageBook.showPage(treeViewer.getControl()); } @@ -207,12 +221,9 @@ connectAction.run(); } }); - // Show appropriate page - if (Activator.getDefault().isDbConnected()) { - showHostVmsPage(); - } else { - showConnectionPage(); - } + + showConnectionPage(); + tracker.open(); } @Override @@ -220,5 +231,40 @@ pageBook.setFocus(); } + private void initializeTimer(final HostsVmsTreeRoot root) { + timer = appSvc.getTimerFactory().createTimer(); + timer.setAction(new Runnable() { + + @Override + public void run() { + PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { + + @Override + public void run() { + if (!treeViewer.getTree().isDisposed()) { + // Turn off redrawing while we update to prevent flickering + treeViewer.getTree().setRedraw(false); + + // Preserve expanded elements + Object[] expandedElements = treeViewer.getExpandedElements(); + + // Force update to tree + treeViewer.setInput(root); + + // Restore expanded elements + treeViewer.setExpandedElements(expandedElements); + + treeViewer.getTree().setRedraw(true); + } + } + }); + } + }); + timer.setInitialDelay(0); + timer.setDelay(3); + timer.setTimeUnit(TimeUnit.SECONDS); + timer.setSchedulingType(SchedulingType.FIXED_RATE); + } + }