tmf: Remove deprecated TimeGraphCombo
authorPatrick Tasse <patrick.tasse@gmail.com>
Tue, 9 May 2017 16:26:33 +0000 (12:26 -0400)
committerPatrick Tasse <patrick.tasse@gmail.com>
Tue, 9 May 2017 17:50:17 +0000 (13:50 -0400)
The class TimeGraphCombo is removed from the API. The tmf.ui plug-in
version is increased to 3.0 and affected @since tags are updated.

Change-Id: I8128ad55e027831994c288eed017d4145e632005
Signed-off-by: Patrick Tasse <patrick.tasse@gmail.com>
Reviewed-on: https://git.eclipse.org/r/96677
Reviewed-by: Hudson CI
Reviewed-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
Tested-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
20 files changed:
tmf/org.eclipse.tracecompass.tmf.ui/META-INF/MANIFEST.MF
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/actions/HttpTraceImportOperation.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/actions/TraceImportOperation.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/colors/X11Color.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/markers/IMarkerReferenceProvider.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/markers/PeriodicMarkerEventSource.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/project/model/Messages.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/project/model/TmfTraceElement.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/tracetype/preferences/TraceTypeLabelProvider.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/tracetype/preferences/TraceTypePreferencePage.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/tracetype/preferences/TraceTypePreferencePageViewer.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/tracetype/preferences/TraceTypeTreeContentProvider.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractTimeGraphView.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/Messages.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/ITimeGraphPresentationProvider.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/StateItem.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/TimeGraphCombo.java [deleted file]
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/model/IMarkerEventSource.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/model/ITimeEventStyleStrings.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/widgets/Utils.java

index ada06ae016aa391b8b2ab77ad0ceee242f895e34..5c8e98154fa408c6c5c7761186a6ed088d6780b9 100644 (file)
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-Vendor: %Bundle-Vendor
-Bundle-Version: 2.4.0.qualifier
+Bundle-Version: 3.0.0.qualifier
 Bundle-Localization: plugin
 Bundle-SymbolicName: org.eclipse.tracecompass.tmf.ui;singleton:=true
 Bundle-Activator: org.eclipse.tracecompass.internal.tmf.ui.Activator
index e703f600f192936b890a95d76d5e76d865b2a819..75358a034e760cbff500f0fd7c319d9bff0a49b6 100644 (file)
@@ -41,7 +41,7 @@ import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider;
  * An operation which downloads and imports traces from a http/https source.
  *
  * @author Simon Delisle
- * @since 2.4
+ * @since 3.0
  *
  */
 public class HttpTraceImportOperation extends WorkspaceModifyOperation {
index 7356892464c5fd633f71f68b1e8ef739adae1621..ca3064f4e0ad1563744f96e1ad6990d54d948734 100644 (file)
@@ -39,7 +39,7 @@ import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider;
  * and creating links for each imported trace in the target folder, overwriting
  * any existing trace without warning.
  *
- * @since 2.4
+ * @since 3.0
  */
 public class TraceImportOperation extends WorkspaceModifyOperation {
 
index bf19a95b7ed78b11ce54a4e8e997b36518393ae1..5972f6d326d70b145ac424a5a7b0366ee49995f4 100644 (file)
@@ -30,7 +30,7 @@ import org.eclipse.tracecompass.internal.tmf.ui.Activator;
  * @see <a href=
  *      "http://cgit.freedesktop.org/xorg/app/rgb/tree/rgb.txt">http://cgit.freedesktop.org/xorg/app/rgb/tree/rgb.txt</a>
  *
- * @since 2.4
+ * @since 3.0
  */
 public class X11Color {
 
index df736549afef4e7daf34ca01ecfd360bc03c3a54..a8e75b98de1d8538ba6cb41cbc449250b9b45c4f 100644 (file)
@@ -18,7 +18,7 @@ import org.eclipse.tracecompass.tmf.ui.markers.PeriodicMarkerEventSource.Referen
  * An adapter interface for traces, which allows the trace to provide a
  * reference for periodic markers.
  *
- * @since 2.4
+ * @since 3.0
  */
 public interface IMarkerReferenceProvider {
 
index 4a482e67d677a2993c23c4d8f9be987435f1f146..90a094f8b625cf8f52c969e0a31fc87bea89cf4d 100644 (file)
@@ -78,7 +78,7 @@ public class PeriodicMarkerEventSource implements IMarkerEventSource {
          * Gets the reference marker time.
          *
          * @return the reference marker time
-         * @since 2.4
+         * @since 3.0
          */
         public long getTime() {
             return time;
@@ -88,7 +88,7 @@ public class PeriodicMarkerEventSource implements IMarkerEventSource {
          * Gets the reference marker index.
          *
          * @return the reference marker index
-         * @since 2.4
+         * @since 3.0
          */
         public long getIndex() {
             return index;
@@ -286,7 +286,7 @@ public class PeriodicMarkerEventSource implements IMarkerEventSource {
      * @param index
      *            the marker index
      * @return true if the marker is applicable
-     * @since 2.4
+     * @since 3.0
      */
     public boolean isApplicable(long index) {
         return true;
index 7c333b128bcc198bb7476f929201666286e084c5..868b2d5ace33bde1e8a88cfd0d58e7f2f2d5ab2c 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2013, 2016 Ericsson
+ * Copyright (c) 2013, 2017 Ericsson
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -59,7 +59,7 @@ public class Messages extends NLS {
 
     /**
      * Name for the job that updates a trace's time range in the Project Explorer.
-     * @since 2.4
+     * @since 3.0
      */
     public static String TmfNavigatorLabelProvider_UpdateBoundsJobName;
 
index dab45863a8bd41b24f92606248451975e01cf6a8..54c0f680551e5860167a37002ecefe8e1bd92a3c 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2015 Ericsson, École Polytechnique de Montréal
+ * Copyright (c) 2010, 2017 Ericsson, École Polytechnique de Montréal
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -43,7 +43,6 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Display;
-
 import org.eclipse.tracecompass.internal.tmf.ui.Activator;
 import org.eclipse.tracecompass.internal.tmf.ui.editors.ITmfEventsEditorConstants;
 import org.eclipse.tracecompass.tmf.core.TmfCommonConstants;
@@ -750,7 +749,7 @@ public class TmfTraceElement extends TmfCommonProjectElement implements IActionF
      *
      * @param startTime
      *            updated start time for this trace
-     * @since 2.4
+     * @since 3.0
      */
     public void setStartTime(ITmfTimestamp startTime) {
         fStartTime = startTime;
@@ -762,7 +761,7 @@ public class TmfTraceElement extends TmfCommonProjectElement implements IActionF
      * @return the start time from the trace if available, or from self when
      *         read in advance from supplementary files or from fast trace read.
      *         Return null if completely unknown.
-     * @since 2.4
+     * @since 3.0
      */
     public ITmfTimestamp getStartTime() {
         ITmfTrace trace = getTrace();
@@ -777,7 +776,7 @@ public class TmfTraceElement extends TmfCommonProjectElement implements IActionF
      *
      * @param end
      *            updated end time for this trace
-     * @since 2.4
+     * @since 3.0
      */
     public void setEndTime(@NonNull ITmfTimestamp end) {
         if (fEndTime == null || end.compareTo(fEndTime) > 0) {
@@ -791,7 +790,7 @@ public class TmfTraceElement extends TmfCommonProjectElement implements IActionF
      * @return the end time from the trace if available, or from self when read
      *         in advance from supplementary files or from fast trace read.
      *         Return null if completely unknown.
-     * @since 2.4
+     * @since 3.0
      */
     public ITmfTimestamp getEndTime() {
         ITmfTrace trace = getTrace();
index b4fbec5010d9b95490d811adedb342b4ba7e6182..2228b3e69198aea19271e8f302e829238b65b62d 100644 (file)
@@ -18,7 +18,7 @@ import org.eclipse.tracecompass.tmf.core.project.model.TraceTypeHelper;
  * Trace type element label provider
  *
  * @author Jean-Christian Kouame
- * @since 2.4
+ * @since 3.0
  *
  */
 public class TraceTypeLabelProvider implements ITableLabelProvider, ILabelProvider {
index 38d1062dadeea29999c9f173383ec1cb8d3a998a..ff582955d655ba7fdc6ee1c7fafe097f16054405 100644 (file)
@@ -27,7 +27,7 @@ import com.google.common.collect.Lists;
  * This class implements a preference page for the trace type
  *
  * @author Jean-Christian Kouame
- * @since 2.4
+ * @since 3.0
  *
  */
 public class TraceTypePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
index 8ef7bd5d96c70e9fe73d3007f30882ff95b95877..7238f4edde38a67377fb4aba69dbae3fa28c167a 100644 (file)
@@ -45,7 +45,7 @@ import com.google.common.collect.Lists;
  * This class implements a preference page viewer for the trace type
  *
  * @author Jean-Christian Kouame
- * @since 2.4
+ * @since 3.0
  */
 public class TraceTypePreferencePageViewer {
 
index f3c5a4ee4234ab94eea51e2ca629e5e25e06c17f..41c244c975643f66fffcb9e46c944f5f819a7d0f 100644 (file)
@@ -22,7 +22,7 @@ import com.google.common.collect.Iterables;
  * This class implements a trace type tree content provider
  *
  * @author Jean-Christian Kouame
- * @since 2.4
+ * @since 3.0
  *
  */
 public class TraceTypeTreeContentProvider implements ITreeContentProvider {
index 3bbf4438866401b2b1cccdecd1e47fd113428a69..920f00f513954f88b6fc121fccde7e65df2f6473 100644 (file)
@@ -118,7 +118,6 @@ import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphPresentationP
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphRangeListener;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphTimeListener;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphBookmarkEvent;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphCombo;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphContentProvider;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphPresentationProvider;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphRangeUpdateEvent;
@@ -481,7 +480,7 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
          *
          * @param scopeId
          *            The ID of the calling flow scope
-         * @since 2.4
+         * @since 3.0
          */
         public void setScopeId(int scopeId) {
             fScopeId = scopeId;
@@ -584,17 +583,6 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
     // Getters and setters
     // ------------------------------------------------------------------------
 
-    /**
-     * Getter for the time graph combo. No longer used.
-     *
-     * @return null
-     * @deprecated Use {@link #getTimeGraphViewer()} instead.
-     */
-    @Deprecated
-    protected TimeGraphCombo getTimeGraphCombo() {
-        return null;
-    }
-
     /**
      * Getter for the time graph viewer
      *
@@ -1737,7 +1725,7 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA
      * Get the marker set menu
      *
      * @return the menu manager object
-     * @since 2.4
+     * @since 3.0
      */
     protected MenuManager getMarkerSetMenu() {
         if (fMarkerSetMenu != null) {
index 83130397bf55c5ee54f220abf37bfa4cbd439ce2..78c8e0f6247ccfbd7c8f72f774d0223d49f5f9b9 100644 (file)
@@ -28,11 +28,11 @@ public class Messages extends NLS {
      */
     public static String AbstractTimeGraphView_BuildJob;
 
-    /** @since 2.4*/
+    /** @since 3.0*/
     public static String AbstractTimeGraphView_MarkerSetEditActionText;
-    /** @since 2.4*/
+    /** @since 3.0*/
     public static String AbstractTimeGraphView_MarkerSetMenuText;
-    /** @since 2.4*/
+    /** @since 3.0*/
     public static String AbstractTimeGraphView_MarkerSetNoneActionText;
     public static String AbstractTimeGraphView_NextTooltip;
     public static String AbstractTimeGraphView_PreviousText;
index af67d7ec14921b8a815273fd0330bd962f246bf9..b39ccdf9ec09bf4bf787c2fc1fa2499dcb741d86 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2014 Ericsson
+ * Copyright (c) 2012, 2017 Ericsson
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -185,7 +185,7 @@ public interface ITimeGraphPresentationProvider {
      * @param event
      *            the time event
      * @return the style map, as detailed in {@link ITimeEventStyleStrings}
-     * @since 2.4
+     * @since 3.0
      */
     default Map<String, Object> getEventStyle(ITimeEvent event) {
         StateItem stateItem = null;
@@ -211,7 +211,7 @@ public interface ITimeGraphPresentationProvider {
      *            the time event
      * @return a style map containing the elements as detailed in
      *         {@link ITimeEventStyleStrings} to override
-     * @since 2.4
+     * @since 3.0
      */
     default Map<String, Object> getSpecificEventStyle(ITimeEvent event) {
         return Collections.emptyMap();
index 738fbaf137209db91e1738a9b687382ffae14c0f..766d0857a9563a9ef511157b30b1cfeabf13844d 100644 (file)
@@ -1,5 +1,5 @@
 /**********************************************************************
- * Copyright (c) 2012, 2014 Ericsson
+ * Copyright (c) 2012, 2017 Ericsson
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -124,7 +124,7 @@ public class StateItem {
      *
      * @return The map of styles
      *
-     * @since 2.4
+     * @since 3.0
      */
     public Map<String, Object> getStyleMap() {
         return fReadOnlyStyleMap;
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/TimeGraphCombo.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/timegraph/TimeGraphCombo.java
deleted file mode 100644 (file)
index 6054b6b..0000000
+++ /dev/null
@@ -1,1516 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012, 2016 Ericsson, others
- *
- * 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:
- *   Patrick Tasse - Initial API and implementation
- *   François Rajotte - Filter implementation
- *   Geneviève Bastien - Add event links between entries
- *   Christian Mansky - Add check active / uncheck inactive buttons
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.ui.widgets.timegraph;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeExpansionEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackAdapter;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Sash;
-import org.eclipse.swt.widgets.Slider;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
-import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentInfo;
-import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentSignal;
-import org.eclipse.tracecompass.tmf.ui.views.ITmfTimeAligned;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.dialogs.ITimeGraphEntryActiveProvider;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.dialogs.ShowFilterDialogAction;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ILinkEvent;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.ITimeDataProvider;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.TimeGraphColorScheme;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.TimeGraphControl;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.TimeGraphMarkerAxis;
-
-import com.google.common.collect.Iterables;
-
-/**
- * Time graph "combo" view (with the list/tree on the left and the gantt chart
- * on the right)
- *
- * @author Patrick Tasse
- * @deprecated Use {@link #getTimeGraphViewer()} instead.
- */
-@Deprecated
-public class TimeGraphCombo extends Composite {
-
-    // ------------------------------------------------------------------------
-    // Constants
-    // ------------------------------------------------------------------------
-
-    /**
-     * Constant indicating that all levels of the time graph should be expanded
-     */
-    public static final int ALL_LEVELS = AbstractTreeViewer.ALL_LEVELS;
-
-    private static final Object FILLER = new Object();
-
-    // ------------------------------------------------------------------------
-    // Fields
-    // ------------------------------------------------------------------------
-
-    /** The tree viewer */
-    private TreeViewer fTreeViewer;
-
-    /** The time viewer */
-    private @NonNull TimeGraphViewer fTimeGraphViewer;
-
-    /** The selection listener map */
-    private final Map<ITimeGraphSelectionListener, SelectionListenerWrapper> fSelectionListenerMap = new HashMap<>();
-
-    /** The map of viewer filters to viewer filter wrappers */
-    private final Map<@NonNull ViewerFilter, @NonNull ViewerFilter> fViewerFilterMap = new HashMap<>();
-
-    /**
-     * Flag to block the tree selection changed listener when triggered by the
-     * time graph combo
-     */
-    private boolean fInhibitTreeSelection = false;
-
-    /** Number of filler rows used by the tree content provider */
-    private int fNumFillerRows;
-
-    /** Calculated item height for Linux workaround */
-    private int fLinuxItemHeight = 0;
-
-    /** The action that opens the filter dialog */
-    private ShowFilterDialogAction fShowFilterDialogAction;
-
-    /** Default weight of each part of the sash */
-    private static final int[] DEFAULT_WEIGHTS = { 1, 1 };
-
-    /** List of all expanded items whose parents are also expanded */
-    private List<TreeItem> fVisibleExpandedItems = null;
-
-    private Listener fSashDragListener;
-    private SashForm fSashForm;
-
-    private final boolean fScrollBarsInTreeWorkaround;
-
-    private Font fTreeFont;
-
-    // ------------------------------------------------------------------------
-    // Classes
-    // ------------------------------------------------------------------------
-
-    /**
-     * The TimeGraphViewerExtension is used to set appropriate values and to
-     * override methods that could be called directly by the user and that must
-     * be handled by the time graph combo.
-     */
-    private class TimeGraphViewerExtension extends TimeGraphViewer {
-
-        private TimeGraphViewerExtension(Composite parent, int style, Tree tree) {
-            super(parent, style);
-            setItemHeight(TimeGraphCombo.this.getItemHeight(tree, true));
-            setHeaderHeight(tree.getHeaderHeight());
-            setBorderWidth(tree.getBorderWidth());
-            setNameWidthPref(0);
-        }
-
-        @Override
-        public ShowFilterDialogAction getShowFilterDialogAction() {
-            return TimeGraphCombo.this.getShowFilterDialogAction();
-        }
-
-        @Override
-        protected TimeGraphControl createTimeGraphControl(Composite composite, TimeGraphColorScheme colors) {
-            return new TimeGraphControl(composite, colors) {
-                @Override
-                public void verticalZoom(boolean zoomIn) {
-                    TimeGraphCombo.this.verticalZoom(zoomIn);
-                }
-
-                @Override
-                public void resetVerticalZoom() {
-                    TimeGraphCombo.this.resetVerticalZoom();
-                }
-
-                @Override
-                public void setElementPosition(ITimeGraphEntry entry, int y) {
-                    /*
-                     * Queue the update to make sure the time graph combo has
-                     * finished updating the item heights.
-                     */
-                    getDisplay().asyncExec(() -> {
-                        if (isDisposed()) {
-                            return;
-                        }
-                        super.setElementPosition(entry, y);
-                        alignTreeItems(false);
-                    });
-                }
-            };
-        }
-
-        private class TimeGraphMarkerAxisExtension extends TimeGraphMarkerAxis {
-            private int fMargin = 0;
-
-            public TimeGraphMarkerAxisExtension(Composite parent, @NonNull TimeGraphColorScheme colorScheme, @NonNull ITimeDataProvider timeProvider) {
-                super(parent, colorScheme, timeProvider);
-            }
-
-            @Override
-            public Point computeSize(int wHint, int hHint, boolean changed) {
-                Point size = super.computeSize(wHint, hHint, changed);
-                if (size.y > 0) {
-                    size.y += fMargin;
-                }
-                return size;
-            }
-
-            @Override
-            public void redraw() {
-                super.redraw();
-                fTreeViewer.getControl().redraw();
-            }
-
-            @Override
-            protected void drawMarkerAxis(Rectangle bounds, int nameSpace, GC gc) {
-                super.drawMarkerAxis(bounds, nameSpace, gc);
-            }
-
-            private Rectangle getAxisBounds() {
-                Tree tree = fTreeViewer.getTree();
-                Rectangle axisBounds = getBounds();
-                Rectangle treeClientArea = tree.getClientArea();
-                if (axisBounds.isEmpty()) {
-                    treeClientArea.y += treeClientArea.height;
-                    treeClientArea.height = 0;
-                    return treeClientArea;
-                }
-                Composite axisParent = getParent();
-                Point axisDisplayCoordinates = axisParent.toDisplay(axisBounds.x, axisBounds.y);
-                Point axisTreeCoordinates = tree.toControl(axisDisplayCoordinates);
-                int height = treeClientArea.y + treeClientArea.height - axisTreeCoordinates.y;
-                int margin = Math.max(0, axisBounds.height - height);
-                if (fMargin != margin) {
-                    fMargin = margin;
-                    getParent().layout();
-                    redraw();
-                    axisTreeCoordinates.y -= margin;
-                    height += margin;
-                }
-                return new Rectangle(treeClientArea.x, axisTreeCoordinates.y, treeClientArea.width, height);
-            }
-        }
-
-        @Override
-        protected TimeGraphMarkerAxis createTimeGraphMarkerAxis(Composite parent, @NonNull TimeGraphColorScheme colorScheme, @NonNull ITimeDataProvider timeProvider) {
-            TimeGraphMarkerAxisExtension timeGraphMarkerAxis = new TimeGraphMarkerAxisExtension(parent, colorScheme, timeProvider);
-            Tree tree = fTreeViewer.getTree();
-            tree.addPaintListener(e -> {
-                /*
-                 * Draw the marker axis over the tree. Only the name area will
-                 * be drawn, since the time area has zero width.
-                 */
-                Rectangle bounds = timeGraphMarkerAxis.getAxisBounds();
-                e.gc.setBackground(timeGraphMarkerAxis.getBackground());
-                timeGraphMarkerAxis.drawMarkerAxis(bounds, bounds.width, e.gc);
-            });
-            tree.addMouseListener(new MouseAdapter() {
-                @Override
-                public void mouseDown(MouseEvent e) {
-                    Rectangle bounds = timeGraphMarkerAxis.getAxisBounds();
-                    if (bounds.contains(e.x, e.y)) {
-                        timeGraphMarkerAxis.mouseDown(e, bounds, bounds.width);
-                    }
-                }
-            });
-            tree.getHorizontalBar().addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    tree.redraw();
-                }
-            });
-            return timeGraphMarkerAxis;
-        }
-    }
-
-    /**
-     * The TreeContentProviderWrapper is used to insert filler items after the
-     * elements of the tree's real content provider.
-     */
-    private class TreeContentProviderWrapper implements ITreeContentProvider {
-        private final ITreeContentProvider contentProvider;
-
-        public TreeContentProviderWrapper(ITreeContentProvider contentProvider) {
-            this.contentProvider = contentProvider;
-        }
-
-        @Override
-        public void dispose() {
-            contentProvider.dispose();
-        }
-
-        @Override
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            contentProvider.inputChanged(viewer, oldInput, newInput);
-        }
-
-        @Override
-        public Object[] getElements(Object inputElement) {
-            Object[] elements = contentProvider.getElements(inputElement);
-            // add filler elements to ensure alignment with time analysis viewer
-            Object[] oElements = Arrays.copyOf(elements, elements.length + fNumFillerRows, Object[].class);
-            for (int i = 0; i < fNumFillerRows; i++) {
-                oElements[elements.length + i] = FILLER;
-            }
-            return oElements;
-        }
-
-        @Override
-        public Object[] getChildren(Object parentElement) {
-            if (parentElement instanceof ITimeGraphEntry) {
-                return contentProvider.getChildren(parentElement);
-            }
-            return new Object[0];
-        }
-
-        @Override
-        public Object getParent(Object element) {
-            if (element instanceof ITimeGraphEntry) {
-                return contentProvider.getParent(element);
-            }
-            return null;
-        }
-
-        @Override
-        public boolean hasChildren(Object element) {
-            if (element instanceof ITimeGraphEntry) {
-                return contentProvider.hasChildren(element);
-            }
-            return false;
-        }
-    }
-
-    /**
-     * The TreeLabelProviderWrapper is used to intercept the filler items from
-     * the calls to the tree's real label provider.
-     */
-    private static class TreeLabelProviderWrapper implements ITableLabelProvider {
-        private final ITableLabelProvider labelProvider;
-
-        public TreeLabelProviderWrapper(ITableLabelProvider labelProvider) {
-            this.labelProvider = labelProvider;
-        }
-
-        @Override
-        public void addListener(ILabelProviderListener listener) {
-            labelProvider.addListener(listener);
-        }
-
-        @Override
-        public void dispose() {
-            labelProvider.dispose();
-        }
-
-        @Override
-        public boolean isLabelProperty(Object element, String property) {
-            if (element instanceof ITimeGraphEntry) {
-                return labelProvider.isLabelProperty(element, property);
-            }
-            return false;
-        }
-
-        @Override
-        public void removeListener(ILabelProviderListener listener) {
-            labelProvider.removeListener(listener);
-        }
-
-        @Override
-        public Image getColumnImage(Object element, int columnIndex) {
-            if (element instanceof ITimeGraphEntry) {
-                return labelProvider.getColumnImage(element, columnIndex);
-            }
-            return null;
-        }
-
-        @Override
-        public String getColumnText(Object element, int columnIndex) {
-            if (element instanceof ITimeGraphEntry) {
-                return labelProvider.getColumnText(element, columnIndex);
-            }
-            return null;
-        }
-
-    }
-
-    /**
-     * The SelectionListenerWrapper is used to intercept the filler items from
-     * the time graph combo's real selection listener, and to prevent double
-     * notifications from being sent when selection changes in both tree and
-     * time graph at the same time.
-     */
-    private class SelectionListenerWrapper implements ISelectionChangedListener, ITimeGraphSelectionListener {
-        private final ITimeGraphSelectionListener listener;
-        private ITimeGraphEntry selection = null;
-
-        public SelectionListenerWrapper(ITimeGraphSelectionListener listener) {
-            this.listener = listener;
-        }
-
-        @Override
-        public void selectionChanged(SelectionChangedEvent event) {
-            if (fInhibitTreeSelection) {
-                return;
-            }
-            Object element = ((IStructuredSelection) event.getSelection()).getFirstElement();
-            if (element instanceof ITimeGraphEntry) {
-                ITimeGraphEntry entry = (ITimeGraphEntry) element;
-                if (entry != selection) {
-                    selection = entry;
-                    listener.selectionChanged(new TimeGraphSelectionEvent(event.getSource(), selection));
-                }
-            }
-        }
-
-        @Override
-        public void selectionChanged(TimeGraphSelectionEvent event) {
-            ITimeGraphEntry entry = event.getSelection();
-            if (entry != selection) {
-                selection = entry;
-                listener.selectionChanged(new TimeGraphSelectionEvent(event.getSource(), selection));
-            }
-        }
-    }
-
-    /**
-     * The ViewerFilterWrapper is used to intercept the filler items from the
-     * time graph combo's real ViewerFilters. These filler items should always
-     * be visible.
-     */
-    private static class ViewerFilterWrapper extends ViewerFilter {
-
-        private ViewerFilter fWrappedFilter;
-
-        ViewerFilterWrapper(ViewerFilter filter) {
-            super();
-            this.fWrappedFilter = filter;
-        }
-
-        @Override
-        public boolean select(Viewer viewer, Object parentElement, Object element) {
-            if (element instanceof ITimeGraphEntry) {
-                return fWrappedFilter.select(viewer, parentElement, element);
-            }
-            return true;
-        }
-
-    }
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-
-    /**
-     * Constructs a new instance of this class given its parent and a style
-     * value describing its behavior and appearance.
-     *
-     * @param parent
-     *            a widget which will be the parent of the new instance (cannot
-     *            be null)
-     * @param style
-     *            the style of widget to construct
-     */
-    public TimeGraphCombo(Composite parent, int style) {
-        this(parent, style, DEFAULT_WEIGHTS);
-    }
-
-    /**
-     * Constructs a new instance of this class given its parent and a style
-     * value describing its behavior and appearance.
-     *
-     * @param parent
-     *            a widget which will be the parent of the new instance (cannot
-     *            be null)
-     * @param style
-     *            the style of widget to construct
-     * @param weights
-     *            The array (length 2) of relative weights of each side of the sash form
-     */
-    public TimeGraphCombo(Composite parent, int style, int[] weights) {
-        super(parent, style);
-        setLayout(new FillLayout());
-
-        fSashForm = new SashForm(this, SWT.NONE);
-
-        /*
-         * In Windows, SWT.H_SCROLL | SWT.NO_SCROLL is not properly supported,
-         * both scroll bars are always created. See Tree.checkStyle: "Even when
-         * WS_HSCROLL or WS_VSCROLL is not specified, Windows creates trees and
-         * tables with scroll bars."
-         */
-        fScrollBarsInTreeWorkaround = "win32".equals(SWT.getPlatform()); //$NON-NLS-1$
-
-        int scrollBarStyle = fScrollBarsInTreeWorkaround ? SWT.H_SCROLL : SWT.H_SCROLL | SWT.NO_SCROLL;
-
-        fTreeViewer = new TreeViewer(fSashForm, SWT.FULL_SELECTION | scrollBarStyle);
-        fTreeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
-        final Tree tree = fTreeViewer.getTree();
-        tree.setHeaderVisible(true);
-        tree.setLinesVisible(true);
-
-        fTimeGraphViewer = new TimeGraphViewerExtension(fSashForm, SWT.NONE, tree);
-        fTimeGraphViewer.setColumns(new String[0]);
-        fTimeGraphViewer.setNameWidthPref(0);
-        fTimeGraphViewer.setWeights(new int[] { 0, 1 } );
-
-        if (fScrollBarsInTreeWorkaround) {
-            // Feature in Windows. The tree vertical bar reappears when
-            // the control is resized so we need to hide it again.
-            tree.addControlListener(new ControlAdapter() {
-                private int depth = 0;
-
-                @Override
-                public void controlResized(ControlEvent e) {
-                    if (depth == 0) {
-                        depth++;
-                        tree.getVerticalBar().setEnabled(false);
-                        // this can trigger controlResized recursively
-                        tree.getVerticalBar().setVisible(false);
-                        depth--;
-                    }
-                }
-            });
-        }
-        // Bug in Linux. The tree header height is 0 in constructor,
-        // so we need to reset it later when the control is painted.
-        // This work around used to be done on control resized but the header
-        // height was not initialized on the initial resize on GTK3.
-        tree.addPaintListener(new PaintListener() {
-
-    @Override
-            public void paintControl(PaintEvent e) {
-                int headerHeight = tree.getHeaderHeight();
-                if (headerHeight > 0) {
-                    fTimeGraphViewer.setHeaderHeight(headerHeight);
-                    tree.removePaintListener(this);
-                }
-            }
-        });
-
-        tree.addDisposeListener(e -> {
-            if (fTreeFont != null) {
-                fTreeFont.dispose();
-            }
-        });
-
-        // ensure synchronization of expanded items between tree and time graph
-        fTreeViewer.addTreeListener(new ITreeViewerListener() {
-            @Override
-            public void treeCollapsed(TreeExpansionEvent event) {
-                fTimeGraphViewer.setExpandedState((ITimeGraphEntry) event.getElement(), false);
-                // queue the alignment update because the tree items may only be
-                // actually collapsed after the listeners have been notified
-                fVisibleExpandedItems = null; // invalidate the cache
-                getDisplay().asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        alignTreeItems(true);
-                    }});
-            }
-
-            @Override
-            public void treeExpanded(TreeExpansionEvent event) {
-                ITimeGraphEntry entry = (ITimeGraphEntry) event.getElement();
-                fTimeGraphViewer.setExpandedState(entry, true);
-                Set<Object> expandedElements = new HashSet<>(Arrays.asList(fTreeViewer.getExpandedElements()));
-                for (ITimeGraphEntry child : entry.getChildren()) {
-                    if (child.hasChildren()) {
-                        boolean expanded = expandedElements.contains(child);
-                        fTimeGraphViewer.setExpandedState(child, expanded);
-                    }
-                }
-                // queue the alignment update because the tree items may only be
-                // actually expanded after the listeners have been notified
-                fVisibleExpandedItems = null; // invalidate the cache
-                getDisplay().asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        alignTreeItems(true);
-                    }});
-            }
-        });
-
-        // ensure synchronization of expanded items between tree and time graph
-        fTimeGraphViewer.addTreeListener(new ITimeGraphTreeListener() {
-            @Override
-            public void treeCollapsed(TimeGraphTreeExpansionEvent event) {
-                fTreeViewer.setExpandedState(event.getEntry(), false);
-                alignTreeItems(true);
-            }
-
-            @Override
-            public void treeExpanded(TimeGraphTreeExpansionEvent event) {
-                ITimeGraphEntry entry = event.getEntry();
-                fTreeViewer.setExpandedState(entry, true);
-                Set<Object> expandedElements = new HashSet<>(Arrays.asList(fTreeViewer.getExpandedElements()));
-                for (ITimeGraphEntry child : entry.getChildren()) {
-                    if (child.hasChildren()) {
-                        boolean expanded = expandedElements.contains(child);
-                        fTimeGraphViewer.setExpandedState(child, expanded);
-                    }
-                }
-                alignTreeItems(true);
-            }
-        });
-
-        // prevent mouse button from selecting a filler tree item
-        tree.addListener(SWT.MouseDown, event -> {
-            List<TreeItem> treeItems = getVisibleExpandedItems(tree, false);
-            if (treeItems.isEmpty()) {
-                event.doit = false;
-                fTreeViewer.setSelection(new StructuredSelection());
-                fTimeGraphViewer.setSelection(null, false);
-                return;
-            }
-            TreeItem lastTreeItem = treeItems.get(treeItems.size() - 1);
-            if (event.y >= lastTreeItem.getBounds().y + lastTreeItem.getBounds().height) {
-                event.doit = false;
-                // this prevents from scrolling up when selecting
-                // the partially visible tree item at the bottom
-                tree.select(treeItems.get(treeItems.size() - 1));
-                fTreeViewer.setSelection(new StructuredSelection());
-                fTimeGraphViewer.setSelection(null);
-            }
-        });
-
-        // prevent mouse wheel from scrolling down into filler tree items
-        tree.addListener(SWT.MouseWheel, event -> {
-            event.doit = false;
-            if (event.count == 0) {
-                return;
-            }
-            Slider scrollBar = fTimeGraphViewer.getVerticalBar();
-            fTimeGraphViewer.setTopIndex(scrollBar.getSelection() - event.count);
-            alignTreeItems(false);
-        });
-
-        // prevent key stroke from selecting a filler tree item
-        tree.addListener(SWT.KeyDown, event -> {
-            List<TreeItem> treeItems = getVisibleExpandedItems(tree, false);
-            if (treeItems.size() == 0) {
-                fTreeViewer.setSelection(new StructuredSelection());
-                event.doit = false;
-                return;
-            }
-            if (event.keyCode == SWT.ARROW_DOWN) {
-                int index = Math.min(fTimeGraphViewer.getSelectionIndex() + 1, treeItems.size() - 1);
-                fTimeGraphViewer.setSelection((ITimeGraphEntry) treeItems.get(index).getData(), true);
-                event.doit = false;
-            } else if (event.keyCode == SWT.PAGE_DOWN) {
-                int height = tree.getSize().y - tree.getHeaderHeight() - tree.getHorizontalBar().getSize().y;
-                int countPerPage = height / getItemHeight(tree, false);
-                int index = Math.min(fTimeGraphViewer.getSelectionIndex() + countPerPage - 1, treeItems.size() - 1);
-                fTimeGraphViewer.setSelection((ITimeGraphEntry) treeItems.get(index).getData());
-                event.doit = false;
-            } else if (event.keyCode == SWT.END) {
-                fTimeGraphViewer.setSelection((ITimeGraphEntry) treeItems.get(treeItems.size() - 1).getData());
-                event.doit = false;
-            } else if ((event.character == '+' || event.character == '=') && ((event.stateMask & SWT.CTRL) != 0)) {
-                fTimeGraphViewer.getTimeGraphControl().keyPressed(new KeyEvent(event));
-                return;
-            } else if (event.character == '-' && ((event.stateMask & SWT.CTRL) != 0)) {
-                fTimeGraphViewer.getTimeGraphControl().keyPressed(new KeyEvent(event));
-                return;
-            } else if (event.character == '0' && ((event.stateMask & SWT.CTRL) != 0)) {
-                fTimeGraphViewer.getTimeGraphControl().keyPressed(new KeyEvent(event));
-                return;
-            } else {
-                return;
-            }
-            if (fTimeGraphViewer.getSelectionIndex() >= 0) {
-                fTreeViewer.setSelection(new StructuredSelection(fTimeGraphViewer.getSelection()));
-            } else {
-                fTreeViewer.setSelection(new StructuredSelection());
-            }
-            alignTreeItems(false);
-        });
-
-        // ensure alignment of top item between tree and time graph
-        fTimeGraphViewer.getTimeGraphControl().addControlListener(new ControlAdapter() {
-            @Override
-            public void controlResized(ControlEvent e) {
-                alignTreeItems(false);
-            }
-        });
-
-        // ensure synchronization of selected item between tree and time graph
-        fTreeViewer.addSelectionChangedListener(event -> {
-            if (fInhibitTreeSelection) {
-                return;
-            }
-            if (event.getSelection() instanceof IStructuredSelection) {
-                Object selection = ((IStructuredSelection) event.getSelection()).getFirstElement();
-                if (selection instanceof ITimeGraphEntry) {
-                    fTimeGraphViewer.setSelection((ITimeGraphEntry) selection, true);
-                }
-                alignTreeItems(false);
-            }
-        });
-
-        // ensure synchronization of selected item between tree and time graph
-        fTimeGraphViewer.addSelectionListener(event -> {
-            ITimeGraphEntry entry = fTimeGraphViewer.getSelection();
-            setSelectionInTree(entry);
-        });
-
-        // ensure alignment of top item between tree and time graph
-        fTimeGraphViewer.getVerticalBar().addSelectionListener(new SelectionAdapter() {
-
-    @Override
-            public void widgetSelected(SelectionEvent e) {
-                alignTreeItems(false);
-            }
-        });
-
-        // ensure alignment of top item between tree and time graph
-        fTimeGraphViewer.getTimeGraphControl().addMouseWheelListener(e -> {
-            if (e.count == 0) {
-                return;
-            }
-            alignTreeItems(false);
-        });
-
-        // ensure the tree has focus control when mouse is over it if the time graph had control
-        fTreeViewer.getControl().addMouseTrackListener(new MouseTrackAdapter() {
-            @Override
-            public void mouseEnter(MouseEvent e) {
-                if (fTimeGraphViewer.getTimeGraphControl().isFocusControl()) {
-                    fTreeViewer.getControl().setFocus();
-                }
-            }
-        });
-
-        // ensure the time graph has focus control when mouse is over it if the tree had control
-        fTimeGraphViewer.getTimeGraphControl().addMouseTrackListener(new MouseTrackAdapter() {
-            @Override
-            public void mouseEnter(MouseEvent e) {
-                if (fTreeViewer.getControl().isFocusControl()) {
-                    fTimeGraphViewer.getTimeGraphControl().setFocus();
-                }
-            }
-        });
-        fTimeGraphViewer.getTimeGraphScale().addMouseTrackListener(new MouseTrackAdapter() {
-            @Override
-            public void mouseEnter(MouseEvent e) {
-                if (fTreeViewer.getControl().isFocusControl()) {
-                    fTimeGraphViewer.getTimeGraphControl().setFocus();
-                }
-            }
-        });
-
-        // The filler rows are required to ensure alignment when the tree does not have a
-        // visible horizontal scroll bar. The tree does not allow its top item to be set
-        // to a value that would cause blank space to be drawn at the bottom of the tree.
-        fNumFillerRows = Display.getDefault().getBounds().height / getItemHeight(tree, false);
-
-        fSashForm.setWeights(weights);
-
-        fTimeGraphViewer.getTimeGraphControl().addPaintListener(new PaintListener() {
-            @Override
-            public void paintControl(PaintEvent e) {
-                // Sashes in a SashForm are being created on layout so add the
-                // drag listener here
-                if (fSashDragListener == null) {
-                    for (Control control : fSashForm.getChildren()) {
-                        if (control instanceof Sash) {
-                            fSashDragListener = new Listener() {
-
-                                @Override
-                                public void handleEvent(Event event) {
-                                    sendTimeViewAlignmentChanged();
-
-                                }
-                            };
-                            control.removePaintListener(this);
-                            control.addListener(SWT.Selection, fSashDragListener);
-                            // There should be only one sash
-                            break;
-                        }
-                    }
-                }
-            }
-        });
-    }
-
-    private void verticalZoom(boolean zoomIn) {
-        Tree tree = fTreeViewer.getTree();
-        FontData fontData = tree.getFont().getFontData()[0];
-        int height = fontData.getHeight() + (zoomIn ? 1 : -1);
-        if (height <= 0) {
-            return;
-        }
-        fontData.setHeight(height);
-        if (fTreeFont != null) {
-            fTreeFont.dispose();
-        }
-        fTreeFont = new Font(tree.getDisplay(), fontData);
-        tree.setFont(fTreeFont);
-        redraw();
-        update();
-        fTimeGraphViewer.setHeaderHeight(tree.getHeaderHeight());
-        fTimeGraphViewer.setItemHeight(getItemHeight(tree, true));
-        alignTreeItems(false);
-    }
-
-    private void resetVerticalZoom() {
-        Tree tree = fTreeViewer.getTree();
-        if (fTreeFont != null) {
-            fTreeFont.dispose();
-            fTreeFont = null;
-        }
-        tree.setFont(null);
-        redraw();
-        update();
-        fTimeGraphViewer.setHeaderHeight(tree.getHeaderHeight());
-        fTimeGraphViewer.setItemHeight(getItemHeight(tree, true));
-        alignTreeItems(false);
-    }
-
-    private void sendTimeViewAlignmentChanged() {
-        TmfSignalManager.dispatchSignal(new TmfTimeViewAlignmentSignal(fSashForm, getTimeViewAlignmentInfo()));
-    }
-
-    // ------------------------------------------------------------------------
-    // Accessors
-    // ------------------------------------------------------------------------
-
-    /**
-     * Returns this time graph combo's tree viewer.
-     *
-     * @return the tree viewer
-     */
-    public TreeViewer getTreeViewer() {
-        return fTreeViewer;
-    }
-
-    /**
-     * Returns this time graph combo's time graph viewer.
-     *
-     * @return the time graph viewer
-     */
-    public @NonNull TimeGraphViewer getTimeGraphViewer() {
-        return fTimeGraphViewer;
-    }
-
-    /**
-     * Get the show filter dialog action.
-     *
-     * @return The Action object
-     * @since 1.2
-     */
-    public ShowFilterDialogAction getShowFilterDialogAction() {
-        if (fShowFilterDialogAction == null) {
-            fShowFilterDialogAction = new ShowFilterDialogAction(fTimeGraphViewer) {
-                @Override
-                protected void addFilter(ViewerFilter filter) {
-                    /* add filter to the combo instead of the viewer */
-                    TimeGraphCombo.this.addFilter(filter);
-                }
-
-                @Override
-                protected void removeFilter(ViewerFilter filter) {
-                    /* remove filter from the combo instead of the viewer */
-                    TimeGraphCombo.this.removeFilter(filter);
-                }
-
-                @Override
-                protected void refresh() {
-                    /* refresh the combo instead of the viewer */
-                    TimeGraphCombo.this.refresh();
-                }
-            };
-        }
-        return fShowFilterDialogAction;
-    }
-
-    // ------------------------------------------------------------------------
-    // Control
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void redraw() {
-        fTimeGraphViewer.getControl().redraw();
-        super.redraw();
-    }
-
-    @Override
-    public void update() {
-        fTimeGraphViewer.getControl().update();
-        super.update();
-    }
-
-    // ------------------------------------------------------------------------
-    // Operations
-    // ------------------------------------------------------------------------
-
-    /**
-     * Sets the tree content provider used by this time graph combo.
-     *
-     * @param contentProvider
-     *            the tree content provider
-     */
-    public void setTreeContentProvider(ITreeContentProvider contentProvider) {
-        fTreeViewer.setContentProvider(new TreeContentProviderWrapper(contentProvider));
-    }
-
-    /**
-     * Sets the tree label provider used by this time graph combo.
-     *
-     * @param labelProvider
-     *            the tree label provider
-     */
-    public void setTreeLabelProvider(ITableLabelProvider labelProvider) {
-        fTreeViewer.setLabelProvider(new TreeLabelProviderWrapper(labelProvider));
-    }
-
-    /**
-     * Sets the tree content provider used by the filter dialog
-     *
-     * @param contentProvider
-     *            the tree content provider
-     */
-    public void setFilterContentProvider(ITreeContentProvider contentProvider) {
-        getShowFilterDialogAction().getFilterDialog().setContentProvider(contentProvider);
-    }
-
-    /**
-     * Sets the tree label provider used by the filter dialog
-     *
-     * @param labelProvider
-     *            the tree label provider
-     */
-    public void setFilterLabelProvider(ITableLabelProvider labelProvider) {
-        getShowFilterDialogAction().getFilterDialog().setLabelProvider(labelProvider);
-    }
-
-    /**
-     * Adds a "check active" button used by the filter dialog
-     *
-     * @param activeProvider
-     *            Additional button info specific to a certain view.
-     * @since 1.0
-     */
-    public void addTimeGraphFilterCheckActiveButton(ITimeGraphEntryActiveProvider activeProvider) {
-        getShowFilterDialogAction().getFilterDialog().addTimeGraphFilterCheckActiveButton(activeProvider);
-    }
-
-    /**
-     * Adds an "uncheck inactive" button used by the filter dialog
-     *
-     * @param inactiveProvider
-     *            Additional button info specific to a certain view.
-     * @since 1.0
-     */
-    public void addTimeGraphFilterUncheckInactiveButton(ITimeGraphEntryActiveProvider inactiveProvider) {
-        getShowFilterDialogAction().getFilterDialog().addTimeGraphFilterUncheckInactiveButton(inactiveProvider);
-    }
-
-    /**
-     * Sets the tree columns for this time graph combo.
-     *
-     * @param columnNames
-     *            the tree column names
-     */
-    public void setTreeColumns(String[] columnNames) {
-        final Tree tree = fTreeViewer.getTree();
-        for (String columnName : columnNames) {
-            TreeColumn column = new TreeColumn(tree, SWT.LEFT);
-            column.setMoveable(true);
-            column.setText(columnName);
-            column.pack();
-        }
-    }
-
-    /**
-     * Sets the tree columns for this time graph combo's filter dialog.
-     *
-     * @param columnNames
-     *            the tree column names
-     */
-    public void setFilterColumns(String[] columnNames) {
-        getShowFilterDialogAction().getFilterDialog().setColumnNames(columnNames);
-    }
-
-    /**
-     * Sets the time graph content provider used by this time graph combo.
-     *
-     * @param timeGraphContentProvider
-     *            the time graph content provider
-     */
-    public void setTimeGraphContentProvider(ITimeGraphContentProvider timeGraphContentProvider) {
-        fTimeGraphViewer.setTimeGraphContentProvider(timeGraphContentProvider);
-    }
-
-    /**
-     * Sets the time graph presentation provider used by this time graph combo.
-     *
-     * @param timeGraphProvider
-     *            the time graph provider
-     */
-    public void setTimeGraphProvider(ITimeGraphPresentationProvider timeGraphProvider) {
-        fTimeGraphViewer.setTimeGraphProvider(timeGraphProvider);
-    }
-
-    /**
-     * Sets or clears the input for this time graph combo.
-     *
-     * @param input
-     *            the input of this time graph combo, or <code>null</code> if
-     *            none
-     */
-    public void setInput(Object input) {
-        fInhibitTreeSelection = true;
-        fTreeViewer.setInput(input);
-        for (SelectionListenerWrapper listenerWrapper : fSelectionListenerMap.values()) {
-            listenerWrapper.selection = null;
-        }
-        fInhibitTreeSelection = false;
-        if (fScrollBarsInTreeWorkaround) {
-            fTreeViewer.getTree().getVerticalBar().setEnabled(false);
-            fTreeViewer.getTree().getVerticalBar().setVisible(false);
-        }
-        fTimeGraphViewer.setInput(input);
-        fTimeGraphViewer.setItemHeight(getItemHeight(fTreeViewer.getTree(), false));
-        // queue the alignment update because in Linux the item bounds are not
-        // set properly until the tree has been painted at least once
-        fVisibleExpandedItems = null; // invalidate the cache
-        getDisplay().asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                if (isDisposed()) {
-                    return;
-                }
-                alignTreeItems(true);
-            }
-        });
-    }
-
-    /**
-     * Gets the input for this time graph combo.
-     *
-     * @return The input of this time graph combo, or <code>null</code> if none
-     */
-    public Object getInput() {
-        return fTreeViewer.getInput();
-    }
-
-    /**
-     * Sets or clears the list of links to display on this combo
-     *
-     * @param links
-     *            the links to display in this time graph combo
-     */
-    public void setLinks(List<ILinkEvent> links) {
-        fTimeGraphViewer.setLinks(links);
-    }
-
-    /**
-     * @param filter
-     *            The filter object to be attached to the view
-     */
-    public void addFilter(@NonNull ViewerFilter filter) {
-        fInhibitTreeSelection = true;
-        ViewerFilter wrapper = new ViewerFilterWrapper(filter);
-        fTreeViewer.addFilter(wrapper);
-        fTimeGraphViewer.addFilter(filter);
-        fViewerFilterMap.put(filter, wrapper);
-        alignTreeItems(true);
-        fInhibitTreeSelection = false;
-    }
-
-    /**
-     * @param filter
-     *            The filter object to be removed from the view
-     */
-    public void removeFilter(@NonNull ViewerFilter filter) {
-        fInhibitTreeSelection = true;
-        ViewerFilter wrapper = fViewerFilterMap.get(filter);
-        fTreeViewer.removeFilter(wrapper);
-        fTimeGraphViewer.removeFilter(filter);
-        fViewerFilterMap.remove(filter);
-        alignTreeItems(true);
-        fInhibitTreeSelection = false;
-    }
-
-    /**
-     * Returns this viewer's filters.
-     *
-     * @return an array of viewer filters
-     * @since 1.2
-     */
-    public @NonNull ViewerFilter[] getFilters() {
-        return fTimeGraphViewer.getFilters();
-    }
-
-    /**
-     * Sets the filters, replacing any previous filters, and triggers
-     * refiltering of the elements.
-     *
-     * @param filters
-     *            an array of viewer filters, or null
-     * @since 1.2
-     */
-    public void setFilters(@NonNull ViewerFilter[] filters) {
-        fInhibitTreeSelection = true;
-        fViewerFilterMap.clear();
-        if (filters == null) {
-            fTreeViewer.resetFilters();
-        } else {
-            for (ViewerFilter filter : filters) {
-                ViewerFilter wrapper = new ViewerFilterWrapper(filter);
-                fViewerFilterMap.put(filter, wrapper);
-            }
-            ViewerFilter[] wrappers = Iterables.toArray(fViewerFilterMap.values(), ViewerFilter.class);
-            fTreeViewer.setFilters(wrappers);
-        }
-        fTimeGraphViewer.setFilters(filters);
-        alignTreeItems(true);
-        fInhibitTreeSelection = false;
-    }
-
-    /**
-     * Refreshes this time graph completely with information freshly obtained
-     * from its model.
-     */
-    public void refresh() {
-        fInhibitTreeSelection = true;
-        Tree tree = fTreeViewer.getTree();
-        try {
-            tree.setRedraw(false);
-            fTreeViewer.refresh();
-        } finally {
-            tree.setRedraw(true);
-        }
-        fTimeGraphViewer.refresh();
-        alignTreeItems(true);
-        fInhibitTreeSelection = false;
-    }
-
-    /**
-     * Adds a listener for selection changes in this time graph combo.
-     *
-     * @param listener
-     *            a selection listener
-     */
-    public void addSelectionListener(ITimeGraphSelectionListener listener) {
-        SelectionListenerWrapper listenerWrapper = new SelectionListenerWrapper(listener);
-        fTreeViewer.addSelectionChangedListener(listenerWrapper);
-        fSelectionListenerMap.put(listener, listenerWrapper);
-        fTimeGraphViewer.addSelectionListener(listenerWrapper);
-    }
-
-    /**
-     * Removes the given selection listener from this time graph combo.
-     *
-     * @param listener
-     *            a selection changed listener
-     */
-    public void removeSelectionListener(ITimeGraphSelectionListener listener) {
-        SelectionListenerWrapper listenerWrapper = fSelectionListenerMap.remove(listener);
-        fTreeViewer.removeSelectionChangedListener(listenerWrapper);
-        fTimeGraphViewer.removeSelectionListener(listenerWrapper);
-    }
-
-    /**
-     * Sets the current selection for this time graph combo.
-     *
-     * @param selection
-     *            the new selection
-     */
-    public void setSelection(ITimeGraphEntry selection) {
-        fTimeGraphViewer.setSelection(selection, true);
-        setSelectionInTree(selection);
-    }
-
-    /**
-     * Sets the current selection for this time graph combo and reveal it if
-     * needed.
-     *
-     * @param selection
-     *            The new selection
-     * @since 2.0
-     */
-    public void selectAndReveal(@NonNull ITimeGraphEntry selection) {
-        fTimeGraphViewer.selectAndReveal(selection);
-        setSelectionInTree(selection);
-    }
-
-    /**
-     * Select the entry in the tree structure
-     *
-     * @param selection
-     *            The new selection
-     */
-    private void setSelectionInTree(ITimeGraphEntry selection) {
-        fInhibitTreeSelection = true; // block the tree selection changed
-                                      // listener
-        if (selection != null) {
-            StructuredSelection structuredSelection = new StructuredSelection(selection);
-            fTreeViewer.setSelection(structuredSelection);
-        } else {
-            fTreeViewer.setSelection(new StructuredSelection());
-        }
-        fInhibitTreeSelection = false;
-        alignTreeItems(false);
-    }
-
-    /**
-     * Sets the auto-expand level to be used for new entries discovered when
-     * calling {@link #setInput(Object)} or {@link #refresh()}. The value 0
-     * means that there is no auto-expand; 1 means that top-level entries are
-     * expanded, but not their children; 2 means that top-level entries are
-     * expanded, and their children, but not grand-children; and so on.
-     * <p>
-     * The value {@link #ALL_LEVELS} means that all subtrees should be expanded.
-     * </p>
-     *
-     * @param level
-     *            non-negative level, or <code>ALL_LEVELS</code> to expand all
-     *            levels of the tree
-     */
-    public void setAutoExpandLevel(int level) {
-        fTimeGraphViewer.setAutoExpandLevel(level);
-        if (level <= 0) {
-            fTreeViewer.setAutoExpandLevel(level);
-        } else {
-            fTreeViewer.setAutoExpandLevel(level + 1);
-        }
-    }
-
-    /**
-     * Returns the auto-expand level.
-     *
-     * @return non-negative level, or <code>ALL_LEVELS</code> if all levels of
-     *         the tree are expanded automatically
-     * @see #setAutoExpandLevel
-     */
-    public int getAutoExpandLevel() {
-        return fTimeGraphViewer.getAutoExpandLevel();
-    }
-
-    /**
-     * Get the expanded state of an entry.
-     *
-     * @param entry
-     *            The entry
-     * @return true if the entry is expanded, false if collapsed
-     * @since 2.0
-     */
-    public boolean getExpandedState(ITimeGraphEntry entry) {
-        return fTimeGraphViewer.getExpandedState(entry);
-    }
-
-    /**
-     * Set the expanded state of an entry
-     *
-     * @param entry
-     *            The entry to expand/collapse
-     * @param expanded
-     *            True for expanded, false for collapsed
-     */
-    public void setExpandedState(ITimeGraphEntry entry, boolean expanded) {
-        fTimeGraphViewer.setExpandedState(entry, expanded);
-        fTreeViewer.setExpandedState(entry, expanded);
-        alignTreeItems(true);
-    }
-
-    /**
-     * Collapses all nodes of the viewer's tree, starting with the root.
-     */
-    public void collapseAll() {
-        fTimeGraphViewer.collapseAll();
-        fTreeViewer.collapseAll();
-        alignTreeItems(true);
-    }
-
-    /**
-     * Expands all nodes of the viewer's tree, starting with the root.
-     */
-    public void expandAll() {
-        fTimeGraphViewer.expandAll();
-        fTreeViewer.expandAll();
-        alignTreeItems(true);
-    }
-
-    // ------------------------------------------------------------------------
-    // Internal
-    // ------------------------------------------------------------------------
-
-    private List<TreeItem> getVisibleExpandedItems(Tree tree, boolean refresh) {
-        if (fVisibleExpandedItems == null || refresh) {
-            List<TreeItem> visibleExpandedItems = new ArrayList<>();
-            addVisibleExpandedItems(visibleExpandedItems, tree.getItems());
-            fVisibleExpandedItems = visibleExpandedItems;
-        }
-        return fVisibleExpandedItems;
-    }
-
-    private void addVisibleExpandedItems(List<TreeItem> visibleExpandedItems, TreeItem[] items) {
-        for (TreeItem item : items) {
-            Object data = item.getData();
-            if (data == FILLER) {
-                break;
-            }
-            visibleExpandedItems.add(item);
-            boolean expandedState = fTimeGraphViewer.getExpandedState((ITimeGraphEntry) data);
-            if (item.getExpanded() != expandedState) {
-                /* synchronize the expanded state of both viewers */
-                fTreeViewer.setExpandedState(data, expandedState);
-            }
-            if (expandedState) {
-                addVisibleExpandedItems(visibleExpandedItems, item.getItems());
-            }
-        }
-    }
-
-    private int getItemHeight(final Tree tree, boolean force) {
-        /*
-         * Bug in Linux. The method getItemHeight doesn't always return the
-         * correct value.
-         */
-        if (fLinuxItemHeight >= 0 && System.getProperty("os.name").contains("Linux")) { //$NON-NLS-1$ //$NON-NLS-2$
-            if (fLinuxItemHeight != 0 && !force) {
-                return fLinuxItemHeight;
-            }
-
-            if (getVisibleExpandedItems(tree, true).size() > 1) {
-                PaintListener paintListener = new PaintListener() {
-                    @Override
-                    public void paintControl(PaintEvent e) {
-                        // get the treeItems here to have all items
-                        List<TreeItem> treeItems = getVisibleExpandedItems(tree, true);
-                        if (treeItems.size() < 2) {
-                            return;
-                        }
-                        final TreeItem treeItem0 = treeItems.get(0);
-                        final TreeItem treeItem1 = treeItems.get(1);
-                        tree.removePaintListener(this);
-                        int y0 = treeItem0.getBounds().y;
-                        int y1 = treeItem1.getBounds().y;
-                        int itemHeight = y1 - y0;
-                        if (itemHeight > 0) {
-                            fLinuxItemHeight = itemHeight;
-                            fTimeGraphViewer.setItemHeight(itemHeight);
-                        }
-                    }
-                };
-                tree.addPaintListener(paintListener);
-            }
-        } else {
-            fLinuxItemHeight = -1; // Not Linux, don't perform os.name check
-                                   // anymore
-        }
-        return tree.getItemHeight();
-    }
-
-    private void alignTreeItems(boolean refreshExpandedItems) {
-
-        // align the tree top item with the time graph top item
-        Tree tree = fTreeViewer.getTree();
-        List<TreeItem> treeItems = getVisibleExpandedItems(tree, refreshExpandedItems);
-        int topIndex = fTimeGraphViewer.getTopIndex();
-        if (topIndex >= treeItems.size()) {
-            return;
-        }
-        TreeItem item = treeItems.get(topIndex);
-        tree.setTopItem(item);
-        /*
-         * In GTK3, the bounds of the tree items are only sure to be correct
-         * after the tree has been painted.
-         */
-        tree.addPaintListener(new PaintListener() {
-            @Override
-            public void paintControl(PaintEvent e) {
-                tree.removePaintListener(this);
-                doAlignTreeItems();
-                redraw();
-            }
-        });
-        /* Make sure the paint event is triggered. */
-        tree.redraw();
-    }
-
-    private void doAlignTreeItems() {
-        Tree tree = fTreeViewer.getTree();
-        List<TreeItem> treeItems = getVisibleExpandedItems(tree, false);
-        int topIndex = fTimeGraphViewer.getTopIndex();
-        if (topIndex >= treeItems.size()) {
-            return;
-        }
-        TreeItem item = treeItems.get(topIndex);
-
-        // get the first filler item so we can calculate the last item's height
-        TreeItem fillerItem = null;
-        for (TreeItem treeItem : fTreeViewer.getTree().getItems()) {
-            if (treeItem.getData() == FILLER) {
-                fillerItem = treeItem;
-                break;
-            }
-        }
-
-        // ensure the time graph item heights are equal to the tree item heights
-        int treeHeight = fTreeViewer.getTree().getBounds().height;
-        int index = topIndex;
-        Rectangle bounds = item.getBounds();
-        while (index < treeItems.size()) {
-            if (bounds.y > treeHeight) {
-                break;
-            }
-            TreeItem nextItem = (index + 1 == treeItems.size()) ? fillerItem : treeItems.get(index + 1);
-            Rectangle nextBounds = alignTreeItem(item, bounds, nextItem);
-            index++;
-            item = nextItem;
-            bounds = nextBounds;
-        }
-
-        /*
-         * When an item's height in the time graph changes, it is possible that
-         * the time graph readjusts its top index to fill empty space at the
-         * bottom of the viewer. Calling method setTopIndex() triggers this
-         * adjustment, if needed. In that case, we need to make sure that the
-         * newly visible items at the top of the viewer are also aligned.
-         */
-        fTimeGraphViewer.setTopIndex(topIndex);
-        if (fTimeGraphViewer.getTopIndex() != topIndex) {
-            alignTreeItems(false);
-        }
-    }
-
-    private Rectangle alignTreeItem(TreeItem item, Rectangle bounds, TreeItem nextItem) {
-        /*
-         * Bug in Linux. The method getBounds doesn't always return the correct
-         * height. Use the difference of y position between items to calculate
-         * the height.
-         */
-        Rectangle nextBounds = nextItem.getBounds();
-        Integer itemHeight = nextBounds.y - bounds.y;
-        if (itemHeight > 0) {
-            ITimeGraphEntry entry = (ITimeGraphEntry) item.getData();
-            fTimeGraphViewer.getTimeGraphControl().setItemHeight(entry, itemHeight);
-        }
-        return nextBounds;
-    }
-
-    /**
-     * Return the time alignment information
-     *
-     * @return the time alignment information
-     *
-     * @see ITmfTimeAligned
-     *
-     * @since 1.0
-     */
-    public TmfTimeViewAlignmentInfo getTimeViewAlignmentInfo() {
-        Point location = fSashForm.toDisplay(0, 0);
-        int timeAxisOffset = fTreeViewer.getControl().getSize().x + fSashForm.getSashWidth();
-        return new TmfTimeViewAlignmentInfo(fSashForm.getShell(), location, timeAxisOffset);
-    }
-
-    /**
-     * Return the available width for the time-axis.
-     *
-     * @see ITmfTimeAligned
-     *
-     * @param requestedOffset
-     *            the requested offset
-     * @return the available width for the time-axis
-     *
-     * @since 1.0
-     */
-    public int getAvailableWidth(int requestedOffset) {
-        int vBarWidth = ((fTimeGraphViewer.getVerticalBar() != null) && (fTimeGraphViewer.getVerticalBar().isVisible())) ? fTimeGraphViewer.getVerticalBar().getSize().x : 0;
-        int totalWidth = fSashForm.getBounds().width;
-        return Math.min(totalWidth, Math.max(0, totalWidth - requestedOffset - vBarWidth));
-    }
-
-    /**
-     * Perform the alignment operation.
-     *
-     * @param offset
-     *            the alignment offset
-     * @param width
-     *            the alignment width
-     *
-     * @see ITmfTimeAligned
-     *
-     * @since 1.0
-     */
-    public void performAlign(int offset, int width) {
-        int total = fSashForm.getBounds().width;
-        int timeAxisOffset = Math.min(offset, total);
-        int width1 = Math.max(0, timeAxisOffset - fSashForm.getSashWidth());
-        int width2 = total - timeAxisOffset;
-        if (width1 >= 0 && width2 > 0 || width1 > 0 && width2 >= 0) {
-            fSashForm.setWeights(new int[] { width1, width2 });
-            fSashForm.layout();
-        }
-
-        Composite composite = fTimeGraphViewer.getTimeAlignedComposite();
-        GridLayout layout = (GridLayout) composite.getLayout();
-        int timeBasedControlsWidth = composite.getSize().x;
-        int marginSize = timeBasedControlsWidth - width;
-        layout.marginRight = Math.max(0, marginSize);
-        composite.layout();
-    }
-}
index d9f1333a2192a2e00a8225a31227aba3220c25d1..fd325bed1f8b639fcc4d8e6967ccdf94b8999947 100644 (file)
@@ -69,7 +69,7 @@ public interface IMarkerEventSource {
      * @param monitor
      *            The progress monitor object
      * @return The list of marker events
-     * @since 2.4
+     * @since 3.0
      */
     default @NonNull List<@NonNull IMarkerEvent> getMarkerList(long startTime, long endTime, long resolution, @NonNull IProgressMonitor monitor) {
         List<@NonNull IMarkerEvent> markers = new ArrayList<>();
index b61f2ada3d63ce705819ba692b5c1a3f09e6ae01..34997de1c8d6164672d571054a981475c4dceef1 100644 (file)
@@ -37,7 +37,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
  *
  * @author Matthew Khouzam
  * @noimplement This interface is not intended to be implemented by clients.
- * @since 2.4
+ * @since 3.0
  */
 @NonNullByDefault
 public interface ITimeEventStyleStrings {
index 6e1d800181f7b6957c77d3dc539b6bf309baf9b9..f6b014d5e9712997c94c55acdc7a15183a803dcf 100644 (file)
@@ -265,7 +265,7 @@ public class Utils {
      * @param rgb
      *            An RGB color
      * @return The black or white system color, whichever is more distinct.
-     * @since 2.4
+     * @since 3.0
      */
     public static Color getDistinctColor(RGB rgb) {
         /* Calculate the relative luminance of the color, high value is bright */
This page took 0.048873 seconds and 5 git commands to generate.