tmf: Allow reordering columns in event table
authorPatrick Tasse <patrick.tasse@gmail.com>
Wed, 22 Oct 2014 17:26:54 +0000 (13:26 -0400)
committerPatrick Tasse <patrick.tasse@gmail.com>
Tue, 28 Oct 2014 17:46:21 +0000 (13:46 -0400)
Change-Id: I7885463d90bcd223abe0ac915721490038c22923
Signed-off-by: Patrick Tasse <patrick.tasse@gmail.com>
Reviewed-on: https://git.eclipse.org/r/35357
Tested-by: Hudson CI
org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/events/TmfEventsTable.java
org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/widgets/virtualtable/TmfVirtualTable.java

index 5a16565b8d8852842cb69e7da0fc7d248a01a14d..e6731664f2f4879724517e58a2a039b68fd25cc1 100644 (file)
@@ -75,6 +75,8 @@ import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.SashForm;
 import org.eclipse.swt.custom.TableEditor;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
 import org.eclipse.swt.events.FocusAdapter;
 import org.eclipse.swt.events.FocusEvent;
 import org.eclipse.swt.events.KeyAdapter;
@@ -430,6 +432,27 @@ public class TmfEventsTable extends TmfComponent implements IGotoMarker, IColorS
             column.pack();
             if (col instanceof TmfMarginColumn) {
                 column.setResizable(false);
+                column.addControlListener(new ControlAdapter() {
+                    /*
+                     * Make sure that the margin column is always first
+                     */
+                    @Override
+                    public void controlMoved(ControlEvent e) {
+                        int[] order = fTable.getColumnOrder();
+                        if (order[0] == MARGIN_COLUMN_INDEX) {
+                            return;
+                        }
+                        for (int i = order.length - 1; i > 0; i--) {
+                            if (order[i] == MARGIN_COLUMN_INDEX) {
+                                order[i] = order[i - 1];
+                                order[i - 1] = MARGIN_COLUMN_INDEX;
+                            }
+                        }
+                        fTable.setColumnOrder(order);
+                    }
+                });
+            } else {
+                column.setMoveable(true);
             }
         }
 
@@ -841,8 +864,13 @@ public class TmfEventsTable extends TmfComponent implements IGotoMarker, IColorS
                     ParameterizedCommand cmd = ParameterizedCommand.generateCommand(command, parameters);
 
                     IEvaluationContext context = handlerService.getCurrentState();
-                    // Omit the margin column
-                    List<TmfEventTableColumn> exportColumns = fColumns.subList(EVENT_COLUMNS_START_INDEX, fColumns.size());
+                    List<TmfEventTableColumn> exportColumns = new ArrayList<>();
+                    for (int i : fTable.getColumnOrder()) {
+                        // Omit the margin column
+                        if (i >= EVENT_COLUMNS_START_INDEX) {
+                            exportColumns.add(fColumns.get(i));
+                        }
+                    }
                     context.addVariable(ExportToTextCommandHandler.TMF_EVENT_TABLE_COLUMNS_ID, exportColumns);
 
                     handlerService.executeCommandInContext(cmd, null, context);
@@ -2040,7 +2068,11 @@ public class TmfEventsTable extends TmfComponent implements IGotoMarker, IColorS
      * @since 3.0
      */
     public String[] getItemStrings(ITmfEvent event) {
-        return getItemStrings(fColumns, event);
+        List<TmfEventTableColumn> columns = new ArrayList<>();
+        for (int i : fTable.getColumnOrder()) {
+            columns.add(fColumns.get(i));
+        }
+        return getItemStrings(columns, event);
     }
 
     /**
index 27b656b5054d40d48e380a47119e2dbd83ca375e..dd673e025e0c62af7a3fe39e0654c2d5223438a0 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2013 Ericsson
+ * Copyright (c) 2010, 2014 Ericsson
  *
  * All rights reserved. This program and the accompanying materials are
  * made available under the terms of the Eclipse Public License v1.0 which
@@ -92,6 +92,7 @@ public class TmfVirtualTable extends Composite {
 
     private boolean fResetTopIndex = false;      // Flag to trigger reset of top index
     private ControlAdapter fResizeListener;      // Resize listener to update visible rows
+    private ControlAdapter fColumnMoveListener;  // Column move listener to redraw column headers
 
     // ------------------------------------------------------------------------
     // Constructor
@@ -171,6 +172,14 @@ public class TmfVirtualTable extends Composite {
         };
         fTable.addControlListener(fResizeListener);
 
+        fColumnMoveListener = new ControlAdapter() {
+            @Override
+            public void controlMoved(ControlEvent e) {
+                fTable.setHeaderVisible(false);
+                fTable.setHeaderVisible(true);
+            }
+        };
+
         // Implement a "fake" tooltip
         final String TOOLTIP_DATA_KEY = "_TABLEITEM"; //$NON-NLS-1$
         final Listener labelListener = new Listener() {
@@ -640,6 +649,13 @@ public class TmfVirtualTable extends Composite {
          */
         column.addControlListener(fResizeListener);
 
+        /*
+         * Work around a display glitch (probably a GTK glitch) where
+         * the moved column's header becomes invisible and unselectable
+         * until you focus on another one.
+         */
+        column.addControlListener(fColumnMoveListener);
+
         return column;
     }
 
@@ -850,6 +866,36 @@ public class TmfVirtualTable extends Composite {
         return fTable.getColumns();
     }
 
+    /**
+     * Returns an array of zero-relative integers that map
+     * the creation order of the receiver's columns to the
+     * order in which they are currently being displayed.
+     * <p>
+     * Specifically, the indices of the returned array represent
+     * the current visual order of the columns, and the contents
+     * of the array represent the creation order of the columns.
+     *
+     * @return the current visual order of the receiver's columns
+     */
+    public int[] getColumnOrder() {
+        return fTable.getColumnOrder();
+    }
+
+    /**
+     * Sets the order that the columns in the receiver should
+     * be displayed in to the given argument which is described
+     * in terms of the zero-relative ordering of when the columns
+     * were added.
+     * <p>
+     * Specifically, the contents of the array represent the
+     * original position of each column at the time its creation.
+     *
+     * @param order the new order to display the columns
+     */
+    public void setColumnOrder(int[] order) {
+        fTable.setColumnOrder(order);
+    }
+
     /**
      * Method getItem.
      * @param point Point the coordinates in the table
This page took 0.030116 seconds and 5 git commands to generate.