From 5cf78af376366ec14722da2109f25aa552e9a00e Mon Sep 17 00:00:00 2001 From: Ed Merks Date: Fri, 25 Oct 2013 19:42:06 +0200 Subject: Improve setup related models --- .../provider/ResourceCopyTaskItemProvider.java | 9 +- .../presentation/actions/ManualPerformAction.java | 4 +- .../emf/cdo/releng/setup/product/SetupDialog.java | 46 +++-- .../META-INF/MANIFEST.MF | 53 ++--- .../releng/internal/setup/SetupTaskPerformer.java | 58 +++++- .../internal/setup/ui/ProgressLogDialog.java | 226 ++++++++++++++++++++- 6 files changed, 328 insertions(+), 68 deletions(-) diff --git a/plugins/org.eclipse.emf.cdo.releng.setup.edit/src/org/eclipse/emf/cdo/releng/setup/provider/ResourceCopyTaskItemProvider.java b/plugins/org.eclipse.emf.cdo.releng.setup.edit/src/org/eclipse/emf/cdo/releng/setup/provider/ResourceCopyTaskItemProvider.java index c0e55926d9..33c7101e63 100644 --- a/plugins/org.eclipse.emf.cdo.releng.setup.edit/src/org/eclipse/emf/cdo/releng/setup/provider/ResourceCopyTaskItemProvider.java +++ b/plugins/org.eclipse.emf.cdo.releng.setup.edit/src/org/eclipse/emf/cdo/releng/setup/provider/ResourceCopyTaskItemProvider.java @@ -12,7 +12,6 @@ package org.eclipse.emf.cdo.releng.setup.provider; import org.eclipse.emf.cdo.releng.setup.ResourceCopyTask; import org.eclipse.emf.cdo.releng.setup.SetupPackage; -import org.eclipse.emf.cdo.releng.setup.SetupTaskScope; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.common.notify.Notification; @@ -118,15 +117,13 @@ public class ResourceCopyTaskItemProvider extends SetupTaskItemProvider implemen * This returns the label text for the adapted class. * * - * @generated + * @generated NOT */ @Override public String getText(Object object) { - SetupTaskScope labelValue = ((ResourceCopyTask)object).getScope(); - String label = labelValue == null ? null : labelValue.toString(); - return label == null || label.length() == 0 ? getString("_UI_ResourceCopyTask_type") - : getString("_UI_ResourceCopyTask_type") + " " + label; + ResourceCopyTask resourceCopyTask = (ResourceCopyTask)object; + return "" + resourceCopyTask.getSourceURL() + " --> " + resourceCopyTask.getTargetURL(); } /** diff --git a/plugins/org.eclipse.emf.cdo.releng.setup.editor/src/org/eclipse/emf/cdo/releng/setup/presentation/actions/ManualPerformAction.java b/plugins/org.eclipse.emf.cdo.releng.setup.editor/src/org/eclipse/emf/cdo/releng/setup/presentation/actions/ManualPerformAction.java index 6abd3c1f1a..344380de88 100644 --- a/plugins/org.eclipse.emf.cdo.releng.setup.editor/src/org/eclipse/emf/cdo/releng/setup/presentation/actions/ManualPerformAction.java +++ b/plugins/org.eclipse.emf.cdo.releng.setup.editor/src/org/eclipse/emf/cdo/releng/setup/presentation/actions/ManualPerformAction.java @@ -23,6 +23,8 @@ import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.IWorkbenchWindowActionDelegate; import org.eclipse.ui.PlatformUI; +import java.util.Collections; + /** * @author Eike Stepper */ @@ -72,7 +74,7 @@ public class ManualPerformAction implements IWorkbenchWindowActionDelegate setupTaskPerformer.perform(); return true; } - }); + }, Collections.singletonList(setupTaskPerformer)); } catch (Exception ex) { diff --git a/plugins/org.eclipse.emf.cdo.releng.setup.product/src/org/eclipse/emf/cdo/releng/setup/product/SetupDialog.java b/plugins/org.eclipse.emf.cdo.releng.setup.product/src/org/eclipse/emf/cdo/releng/setup/product/SetupDialog.java index 16676a87ac..209bd3877f 100644 --- a/plugins/org.eclipse.emf.cdo.releng.setup.product/src/org/eclipse/emf/cdo/releng/setup/product/SetupDialog.java +++ b/plugins/org.eclipse.emf.cdo.releng.setup.product/src/org/eclipse/emf/cdo/releng/setup/product/SetupDialog.java @@ -88,6 +88,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -643,36 +644,42 @@ public class SetupDialog extends TitleAreaDialog File folder = new File(installFolder); folder.mkdirs(); + final List setupTaskPerformers = new ArrayList(); + for (Object checkedElement : checkedElements) + { + if (checkedElement instanceof Branch) + { + Branch branch = (Branch)checkedElement; + Setup setup = setups.get(branch); + if (setup != null) + { + setupTaskPerformers.add(createTaskPerformer(setup, installFolder, gitPrefix)); + } + } + } + ProgressLogDialog.run(getShell(), "Setting up IDE", new ProgressLogRunnable() { public boolean run(ProgressLog log) throws Exception { - for (Object checkedElement : checkedElements) + for (SetupTaskPerformer setupTaskPerformer : setupTaskPerformers) { - if (checkedElement instanceof Branch) + try { - Branch branch = (Branch)checkedElement; - Setup setup = setups.get(branch); - if (setup != null) - { - try - { - install(setup, installFolder, gitPrefix); - } - catch (IOException ex) - { - throw new RuntimeException(ex); - } - } + install(setupTaskPerformer); + } + catch (IOException ex) + { + throw new RuntimeException(ex); } } return false; } - }); + }, setupTaskPerformers); } - private void install(Setup setup, String installFolder, String gitPrefix) throws Exception + private SetupTaskPerformer createTaskPerformer(Setup setup, String installFolder, String gitPrefix) { saveEObject(setup); @@ -684,6 +691,11 @@ public class SetupDialog extends TitleAreaDialog File branchDir = new File(installFolder, projectFolder + "/" + branchFolder); SetupTaskPerformer performer = new SetupTaskPerformer(branchDir); + return performer; + } + + private void install(SetupTaskPerformer performer) throws Exception + { performer.getWorkspaceDir().mkdirs(); performer.perform(); diff --git a/plugins/org.eclipse.emf.cdo.releng.setup/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.releng.setup/META-INF/MANIFEST.MF index c8145eee02..bfe3ede7c0 100644 --- a/plugins/org.eclipse.emf.cdo.releng.setup/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.releng.setup/META-INF/MANIFEST.MF @@ -8,33 +8,33 @@ Bundle-Vendor: %providerName Bundle-Localization: plugin Require-Bundle: org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)", org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)", - org.eclipse.emf.cdo.releng.workingsets;visibility:=reexport;bundle-version="[1.0.0,2.0.0)", - org.eclipse.emf.cdo.releng.predicates;visibility:=reexport;bundle-version="[1.0.0,2.0.0)", - org.eclipse.emf.ecore;visibility:=reexport;bundle-version="[2.5.0,3.0.0)", + org.eclipse.emf.cdo.releng.workingsets;bundle-version="[1.0.0,2.0.0)";visibility:=reexport, + org.eclipse.emf.cdo.releng.predicates;bundle-version="[1.0.0,2.0.0)";visibility:=reexport, + org.eclipse.emf.ecore;bundle-version="[2.5.0,3.0.0)";visibility:=reexport, org.eclipse.emf.ecore.xmi;bundle-version="[2.5.0,3.0.0)", - org.eclipse.core.resources;resolution:=optional;bundle-version="[3.5.0,4.0.0)", - org.eclipse.core.variables;resolution:=optional;bundle-version="[3.0.0,4.0.0)", - org.eclipse.pde.core;resolution:=optional;bundle-version="[3.5.0,4.0.0)", - org.eclipse.pde.api.tools;resolution:=optional;bundle-version="[1.0.0,2.0.0)", - org.eclipse.team.ui;resolution:=optional;bundle-version="[3.5.0,4.0.0)", - javaewah;resolution:=optional;bundle-version="[0.0.0,1.0.0)", - org.eclipse.jgit;resolution:=optional;bundle-version="[3.0.0,4.0.0)", - org.eclipse.egit;resolution:=optional;bundle-version="[3.0.0,4.0.0)", - org.eclipse.egit.core;resolution:=optional;bundle-version="[3.0.0,4.0.0)", - org.eclipse.egit.ui;resolution:=optional;bundle-version="[3.0.0,4.0.0)", - org.eclipse.emf.edit.ui;resolution:=optional;bundle-version="[2.5.0,3.0.0)", - org.eclipse.ecf.provider.filetransfer;resolution:=optional;bundle-version="[3.2.0,4.0.0)", - org.eclipse.ecf.filetransfer;resolution:=optional;bundle-version="[5.0.0,6.0.0)", - org.eclipse.ecf.identity;resolution:=optional;bundle-version="[3.2.0,4.0.0)", - org.eclipse.ecf;resolution:=optional;bundle-version="[3.2.0,4.0.0)", - org.eclipse.buckminster.sax;resolution:=optional;bundle-version="[1.0.0,2.0.0)", - org.eclipse.buckminster.cmdline;resolution:=optional;bundle-version="[1.0.0,2.0.0)", - org.eclipse.buckminster.download;resolution:=optional;bundle-version="[1.0.0,2.0.0)", - org.eclipse.buckminster.runtime;resolution:=optional;bundle-version="[1.0.0,2.0.0)", - org.eclipse.buckminster.core;resolution:=optional;bundle-version="[1.0.0,2.0.0)", - org.eclipse.buckminster.pde;resolution:=optional;bundle-version="[1.0.0,2.0.0)", + org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)";resolution:=optional, + org.eclipse.core.variables;bundle-version="[3.0.0,4.0.0)";resolution:=optional, + org.eclipse.pde.core;bundle-version="[3.5.0,4.0.0)";resolution:=optional, + org.eclipse.pde.api.tools;bundle-version="[1.0.0,2.0.0)";resolution:=optional, + org.eclipse.team.ui;bundle-version="[3.5.0,4.0.0)";resolution:=optional, + javaewah;bundle-version="[0.0.0,1.0.0)";resolution:=optional, + org.eclipse.jgit;bundle-version="[3.0.0,4.0.0)";resolution:=optional, + org.eclipse.egit;bundle-version="[3.0.0,4.0.0)";resolution:=optional, + org.eclipse.egit.core;bundle-version="[3.0.0,4.0.0)";resolution:=optional, + org.eclipse.egit.ui;bundle-version="[3.0.0,4.0.0)";resolution:=optional, + org.eclipse.emf.edit.ui;bundle-version="[2.5.0,3.0.0)";resolution:=optional, + org.eclipse.ecf.provider.filetransfer;bundle-version="[3.2.0,4.0.0)";resolution:=optional, + org.eclipse.ecf.filetransfer;bundle-version="[5.0.0,6.0.0)";resolution:=optional, + org.eclipse.ecf.identity;bundle-version="[3.2.0,4.0.0)";resolution:=optional, + org.eclipse.ecf;bundle-version="[3.2.0,4.0.0)";resolution:=optional, + org.eclipse.buckminster.sax;bundle-version="[1.0.0,2.0.0)";resolution:=optional, + org.eclipse.buckminster.cmdline;bundle-version="[1.0.0,2.0.0)";resolution:=optional, + org.eclipse.buckminster.download;bundle-version="[1.0.0,2.0.0)";resolution:=optional, + org.eclipse.buckminster.runtime;bundle-version="[1.0.0,2.0.0)";resolution:=optional, + org.eclipse.buckminster.core;bundle-version="[1.0.0,2.0.0)";resolution:=optional, + org.eclipse.buckminster.pde;bundle-version="[1.0.0,2.0.0)";resolution:=optional, org.eclipse.equinox.p2.core;bundle-version="[2.0.0,3.0.0)", - org.eclipse.equinox.p2.ui;resolution:=optional;bundle-version="[2.0.0,3.0.0)", + org.eclipse.equinox.p2.ui;bundle-version="[2.0.0,3.0.0)";resolution:=optional, org.eclipse.equinox.p2.metadata;bundle-version="[2.0.0,3.0.0)", org.eclipse.equinox.p2.repository;bundle-version="[2.0.0,3.0.0)", org.eclipse.equinox.p2.artifact.repository;bundle-version="[1.0.0,2.0.0)", @@ -50,7 +50,8 @@ Require-Bundle: org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)", org.eclipse.core.net;bundle-version="[1.2.0,2.0.0)", org.eclipse.equinox.p2.touchpoint.eclipse;bundle-version="[2.1.0,3.0.0)", org.eclipse.equinox.p2.touchpoint.natives;bundle-version="[1.1.0,2.0.0)", - org.eclipse.equinox.p2.updatesite;bundle-version="[1.0.0,2.0.0)" + org.eclipse.equinox.p2.updatesite;bundle-version="[1.0.0,2.0.0)", + org.eclipse.jface.text;bundle-version="[3.8.0,4.0.0)" Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-ActivationPolicy: lazy Export-Package: org.eclipse.emf.cdo.releng.internal.setup;x-friends:="org.eclipse.emf.cdo.releng.setup.product,org.eclipse.emf.cdo.releng.setup.editor";version="1.0.0", diff --git a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java index 64b626a937..8f4ae54970 100644 --- a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java +++ b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/SetupTaskPerformer.java @@ -21,6 +21,7 @@ import org.eclipse.emf.cdo.releng.setup.util.OS; import org.eclipse.emf.cdo.releng.setup.util.log.ProgressLog; import org.eclipse.emf.cdo.releng.setup.util.log.ProgressLogRunnable; +import org.eclipse.net4j.util.ReflectUtil; import org.eclipse.net4j.util.StringUtil; import org.eclipse.net4j.util.io.IOUtil; @@ -47,7 +48,9 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; +import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Iterator; @@ -160,6 +163,14 @@ public class SetupTaskPerformer extends HashMap implements Setup log(ProgressLogDialog.toString(status)); } + public void task(SetupTask setupTask) + { + if (progress instanceof ProgressLogDialog) + { + ((ProgressLogDialog)progress).task(setupTask); + } + } + public boolean isCancelled() { if (progress != null) @@ -299,18 +310,30 @@ public class SetupTaskPerformer extends HashMap implements Setup return setup; } - public void perform() throws Exception + private EList triggeredSetupTasks; + + public synchronized EList getTriggeredSetupTasks() { - EList setupTasks = setup.getSetupTasks(true, trigger); - if (setupTasks.isEmpty()) + if (triggeredSetupTasks == null) { - return; + triggeredSetupTasks = setup.getSetupTasks(true, trigger); + if (triggeredSetupTasks.isEmpty()) + { + return triggeredSetupTasks; + } + + Map substitutions = getSubstitutions(triggeredSetupTasks); + setup = copySetup(triggeredSetupTasks, substitutions); + + reorder(triggeredSetupTasks); } - Map substitutions = getSubstitutions(setupTasks); - setup = copySetup(setupTasks, substitutions); + return triggeredSetupTasks; + } - reorder(setupTasks); + public void perform() throws Exception + { + EList setupTasks = getTriggeredSetupTasks(); perform(setupTasks); if (logStream != null) @@ -435,7 +458,7 @@ public class SetupTaskPerformer extends HashMap implements Setup doPerform(neededTasks); return isRestartNeeded(); } - }); + }, Collections.singletonList(this)); } else { @@ -450,6 +473,7 @@ public class SetupTaskPerformer extends HashMap implements Setup for (SetupTask neededTask : neededTasks) { + task(neededTask); log("Performing setup task " + getLabel(neededTask)); neededTask.perform(this); neededTask.dispose(); @@ -553,10 +577,22 @@ public class SetupTaskPerformer extends HashMap implements Setup return result; } - private static String getLabel(Object object) + private static String getLabel(SetupTask setupTask) { - IItemLabelProvider labelProvider = (IItemLabelProvider)ADAPTER_FACTORY.adapt(object, IItemLabelProvider.class); - return labelProvider.getText(object); + IItemLabelProvider labelProvider = (IItemLabelProvider)ADAPTER_FACTORY.adapt(setupTask, IItemLabelProvider.class); + String type; + try + { + Method getTypeTextMethod = ReflectUtil.getMethod(labelProvider.getClass(), "getTypeText", Object.class); + getTypeTextMethod.setAccessible(true); + type = getTypeTextMethod.invoke(labelProvider, setupTask).toString(); + } + catch (Exception ex) + { + type = setupTask.eClass().getName(); + } + String label = labelProvider.getText(setupTask); + return label.startsWith(type) ? label : type + " " + label; } public static ProgressLog getProgress() diff --git a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/ui/ProgressLogDialog.java b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/ui/ProgressLogDialog.java index 0a31732a85..fd3fac531f 100644 --- a/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/ui/ProgressLogDialog.java +++ b/plugins/org.eclipse.emf.cdo.releng.setup/src/org/eclipse/emf/cdo/releng/internal/setup/ui/ProgressLogDialog.java @@ -12,10 +12,29 @@ package org.eclipse.emf.cdo.releng.internal.setup.ui; import org.eclipse.emf.cdo.releng.internal.setup.Activator; import org.eclipse.emf.cdo.releng.internal.setup.SetupTaskPerformer; +import org.eclipse.emf.cdo.releng.setup.Branch; +import org.eclipse.emf.cdo.releng.setup.Setup; +import org.eclipse.emf.cdo.releng.setup.SetupTask; import org.eclipse.emf.cdo.releng.setup.util.log.ProgressLog; import org.eclipse.emf.cdo.releng.setup.util.log.ProgressLogProvider; import org.eclipse.emf.cdo.releng.setup.util.log.ProgressLogRunnable; +import org.eclipse.net4j.util.StringUtil; + +import org.eclipse.emf.common.ui.ImageURIRegistry; +import org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator; +import org.eclipse.emf.edit.provider.ComposedAdapterFactory; +import org.eclipse.emf.edit.provider.IItemLabelProvider; +import org.eclipse.emf.edit.provider.IItemPropertyDescriptor; +import org.eclipse.emf.edit.provider.ItemProvider; +import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; +import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; +import org.eclipse.emf.edit.ui.provider.DecoratingColumLabelProvider; +import org.eclipse.emf.edit.ui.provider.DiagnosticDecorator; +import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry; + import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; @@ -24,10 +43,19 @@ import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; +import org.eclipse.jface.viewers.ILabelDecorator; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ILabelProviderListener; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTException; +import org.eclipse.swt.browser.LocationEvent; +import org.eclipse.swt.browser.LocationListener; +import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; @@ -37,6 +65,7 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.progress.ProgressManager; @@ -45,6 +74,7 @@ import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; public class ProgressLogDialog extends TitleAreaDialog implements ProgressLog { @@ -75,10 +105,16 @@ public class ProgressLogDialog extends TitleAreaDialog implements ProgressLog private String lastLine; - private ProgressLogDialog(Shell parentShell) + private List setupTaskPerformers; + + private TreeViewer treeViewer; + + private ProgressLogDialog(Shell parentShell, List setupTaskPerformers) { super(parentShell); + this.setupTaskPerformers = setupTaskPerformers; + setHelpAvailable(false); setShellStyle(SWT.BORDER | SWT.MAX | SWT.RESIZE | SWT.TITLE | SWT.APPLICATION_MODAL); } @@ -92,6 +128,7 @@ public class ProgressLogDialog extends TitleAreaDialog implements ProgressLog setTitle(TITLE); Composite area = (Composite)super.createDialogArea(parent); + Composite container = new Composite(area, SWT.NONE); GridLayout gl_container = new GridLayout(1, false); gl_container.marginWidth = 10; @@ -99,7 +136,154 @@ public class ProgressLogDialog extends TitleAreaDialog implements ProgressLog container.setLayout(gl_container); container.setLayoutData(new GridData(GridData.FILL_BOTH)); - text = new Text(container, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CANCEL | SWT.MULTI); + SashForm sashForm = new SashForm(container, SWT.VERTICAL); + sashForm.setLayoutData(new GridData(GridData.FILL_BOTH)); + + treeViewer = new TreeViewer(sashForm); + Tree tree = treeViewer.getTree(); + + ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory( + ComposedAdapterFactory.Descriptor.Registry.INSTANCE); + final AdapterFactoryItemDelegator itemDelegator = new AdapterFactoryItemDelegator(adapterFactory); + ILabelProvider labelProvider = new DecoratingColumLabelProvider(new AdapterFactoryLabelProvider(adapterFactory), + new ILabelDecorator() + { + public void removeListener(ILabelProviderListener listener) + { + } + + public boolean isLabelProperty(Object element, String property) + { + return true; + } + + public void dispose() + { + } + + public void addListener(ILabelProviderListener listener) + { + } + + public String decorateText(String text, Object element) + { + return text; + } + + public Image decorateImage(Image image, Object element) + { + return image; + } + }) + { + @Override + public String getToolTipText(Object element) + { + StringBuilder result = new StringBuilder(); + List propertyDescriptors = itemDelegator.getPropertyDescriptors(element); + if (propertyDescriptors != null) + { + result.append(""); + for (IItemPropertyDescriptor propertyDescriptor : propertyDescriptors) + { + result.append(""); + + String displayName = propertyDescriptor.getDisplayName(element); + result.append(""); + + result.append(""); + result.append(""); + } + + result.append("
").append(DiagnosticDecorator.escapeContent(displayName)).append(""); + IItemLabelProvider propertyLabelProvider = propertyDescriptor.getLabelProvider(element); + Object propertyValue = propertyDescriptor.getPropertyValue(element); + Object image = propertyLabelProvider.getImage(propertyValue); + if (image != null) + { + result.append(DiagnosticDecorator.enquote(" ")); + } + + String valueText = propertyLabelProvider.getText(propertyValue); + if (!StringUtil.isEmpty(valueText)) + { + result.append(DiagnosticDecorator.escapeContent(valueText)); + } + else + { + result.append(" "); + } + + if (valueText == null && image == null) + { + result.append(" "); + } + + result.append("
"); + } + + return result.length() == 0 ? null : result.toString(); + } + }; + + treeViewer.setLabelProvider(labelProvider); + + ItemProvider input = new ItemProvider(); + final EList children = input.getChildren(); + final AdapterFactoryContentProvider contentProvider = new AdapterFactoryContentProvider(adapterFactory) + { + @Override + public Object getParent(Object object) + { + if (object instanceof SetupTask) + { + for (Object child : children) + { + for (Object grandChild : ((ItemProvider)child).getChildren()) + { + if (grandChild == object) + { + return child; + } + } + } + } + + return super.getParent(object); + } + }; + + treeViewer.setContentProvider(contentProvider); + + new ColumnViewerInformationControlToolTipSupport(treeViewer, new LocationListener() + { + public void changing(LocationEvent event) + { + } + + public void changed(LocationEvent event) + { + } + }); + + for (SetupTaskPerformer setupTaskPerformer : setupTaskPerformers) + { + final EList triggeredSetupTasks = setupTaskPerformer.getTriggeredSetupTasks(); + Setup setup = setupTaskPerformer.getSetup(); + Branch branch = setup.getBranch(); + ItemProvider branchPresentation = new ItemProvider(branch.getProject().getName() + " " + + labelProvider.getText(branch) + " (Eclipse " + setup.getEclipseVersion().getVersion() + ")", + labelProvider.getImage(branch)); + branchPresentation.getChildren().addAll(triggeredSetupTasks); + children.add(branchPresentation); + } + + treeViewer.setInput(input); + tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + tree.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); + + text = new Text(sashForm, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CANCEL | SWT.MULTI); text.setFont(SWTResourceManager.getFont("Courier New", 10, SWT.NORMAL)); text.setEditable(false); text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); @@ -196,7 +380,17 @@ public class ProgressLogDialog extends TitleAreaDialog implements ProgressLog { try { - text.append("[" + TIME.format(date) + "] " + message); + String string = "[" + TIME.format(date) + "] " + message; + int visibleLines = text.getClientArea().height / text.getLineHeight(); + int topVisibleLine = text.getLineCount() - visibleLines; + if (topVisibleLine - text.getTopIndex() <= 1) + { + text.append(string); + } + else + { + text.setText(text.getText() + text.getLineDelimiter() + string); + } } catch (Exception ex) { @@ -211,6 +405,17 @@ public class ProgressLogDialog extends TitleAreaDialog implements ProgressLog log(toString(status)); } + public void task(final SetupTask setupTask) + { + getShell().getDisplay().asyncExec(new Runnable() + { + public void run() + { + treeViewer.setSelection(new StructuredSelection(setupTask), true); + } + }); + } + public void setFinished() { Job.getJobManager().setProgressProvider(ProgressManager.getInstance()); @@ -265,17 +470,18 @@ public class ProgressLogDialog extends TitleAreaDialog implements ProgressLog return false; } - public static void run(Shell shell, final String jobName, final ProgressLogRunnable runnable) + public static void run(final Shell shell, final String jobName, final ProgressLogRunnable runnable, + List setupTaskPerformers) { try { final boolean[] restart = { false }; - final ProgressLogDialog dialog = new ProgressLogDialog(shell); + final ProgressLogDialog dialog = new ProgressLogDialog(shell, setupTaskPerformers); Runnable jobRunnable = new Runnable() { public void run() { - Job job = new Job(jobName) + final Job job = new Job(jobName) { @Override protected IStatus run(IProgressMonitor monitor) @@ -305,7 +511,13 @@ public class ProgressLogDialog extends TitleAreaDialog implements ProgressLog } }; - job.schedule(); + shell.getDisplay().asyncExec(new Runnable() + { + public void run() + { + job.schedule(); + } + }); if (dialog.open() == ProgressLogDialog.OK && restart[0]) { -- cgit v1.2.3