~ubuntu-branches/ubuntu/utopic/eclipse-linuxtools/utopic

« back to all changes in this revision

Viewing changes to systemtap/org.eclipse.linuxtools.systemtap.graphingapi.ui/src/org/eclipse/linuxtools/systemtap/graphingapi/ui/datadisplay/DataGrid.java

  • Committer: Package Import Robot
  • Author(s): Jakub Adam
  • Date: 2014-05-12 18:11:40 UTC
  • mfrom: (3.1.2 sid)
  • Revision ID: package-import@ubuntu.com-20140512181140-w237r3vsah1tmybz
Tags: 2.2.1-1
* New upstream release.
* Refreshed d/patches.
* Removed eclipse-cdt-valgrind-remote package, all its functionality
  is now provided by eclipse-cdt-profiling-framework-remote.
* Added remove-license-feature.patch.
* Bump Standards-Version to 3.9.5.
* Enable eclipse-changelog package.
* Enable eclipse-rpm-editor package.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*******************************************************************************
 
2
 * Copyright (c) 2006 IBM Corporation.
 
3
 * All rights reserved. This program and the accompanying materials
 
4
 * are made available under the terms of the Eclipse Public License v1.0
 
5
 * which accompanies this distribution, and is available at
 
6
 * http://www.eclipse.org/legal/epl-v10.html
 
7
 *
 
8
 * Contributors:
 
9
 *     IBM Corporation - Jeff Briggs, Henry Hughes, Ryan Morse
 
10
 *******************************************************************************/
 
11
 
 
12
package org.eclipse.linuxtools.systemtap.graphingapi.ui.datadisplay;
 
13
 
 
14
import org.eclipse.jface.preference.IPreferenceStore;
 
15
import org.eclipse.jface.wizard.WizardDialog;
 
16
import org.eclipse.linuxtools.internal.systemtap.graphingapi.ui.GraphingAPIUIPlugin;
 
17
import org.eclipse.linuxtools.internal.systemtap.graphingapi.ui.Localization;
 
18
import org.eclipse.linuxtools.systemtap.graphingapi.core.datasets.IDataSet;
 
19
import org.eclipse.linuxtools.systemtap.graphingapi.core.datasets.IFilteredDataSet;
 
20
import org.eclipse.linuxtools.systemtap.graphingapi.core.filters.IDataSetFilter;
 
21
import org.eclipse.linuxtools.systemtap.graphingapi.ui.preferences.GraphingAPIPreferenceConstants;
 
22
import org.eclipse.linuxtools.systemtap.graphingapi.ui.wizards.dataset.DataSetFactory;
 
23
import org.eclipse.linuxtools.systemtap.graphingapi.ui.wizards.filter.AvailableFilterTypes;
 
24
import org.eclipse.linuxtools.systemtap.graphingapi.ui.wizards.filter.SelectFilterWizard;
 
25
import org.eclipse.linuxtools.systemtap.structures.IFormattingStyles;
 
26
import org.eclipse.linuxtools.systemtap.structures.StringFormatter;
 
27
import org.eclipse.linuxtools.systemtap.structures.listeners.IUpdateListener;
 
28
import org.eclipse.swt.SWT;
 
29
import org.eclipse.swt.events.MenuAdapter;
 
30
import org.eclipse.swt.events.MenuEvent;
 
31
import org.eclipse.swt.events.SelectionAdapter;
 
32
import org.eclipse.swt.events.SelectionEvent;
 
33
import org.eclipse.swt.events.SelectionListener;
 
34
import org.eclipse.swt.graphics.Point;
 
35
import org.eclipse.swt.widgets.Composite;
 
36
import org.eclipse.swt.widgets.Control;
 
37
import org.eclipse.swt.widgets.Event;
 
38
import org.eclipse.swt.widgets.Listener;
 
39
import org.eclipse.swt.widgets.Menu;
 
40
import org.eclipse.swt.widgets.MenuItem;
 
41
import org.eclipse.swt.widgets.Table;
 
42
import org.eclipse.swt.widgets.TableColumn;
 
43
import org.eclipse.swt.widgets.TableItem;
 
44
import org.eclipse.ui.IWorkbench;
 
45
import org.eclipse.ui.PlatformUI;
 
46
 
 
47
 
 
48
 
 
49
public class DataGrid implements IUpdateListener {
 
50
        public DataGrid(Composite composite, IDataSet set, int style) {
 
51
                prefs = GraphingAPIUIPlugin.getDefault().getPreferenceStore();
 
52
                manualResize = !prefs.getBoolean(GraphingAPIPreferenceConstants.P_AUTO_RESIZE);
 
53
 
 
54
                dataSet = set;
 
55
                filteredDataSet = (dataSet instanceof IFilteredDataSet)
 
56
                                                                ? (IFilteredDataSet)dataSet
 
57
                                                                : DataSetFactory.createFilteredDataSet(dataSet);
 
58
                this.style = style;
 
59
                clickLocation = new Point(-1, -1);
 
60
                removedItems = 0;
 
61
                createPartControl(composite);
 
62
        }
 
63
 
 
64
        public void setLayoutData(Object data) {
 
65
                table.setLayoutData(data);
 
66
        }
 
67
 
 
68
        public IDataSet getDataSet() { return dataSet; }
 
69
        public Control getControl() { return table; }
 
70
 
 
71
        public void createPartControl(Composite parent) {
 
72
                table = new Table(parent, SWT.SINGLE | SWT.FULL_SELECTION);
 
73
                table.setHeaderVisible(true);
 
74
                table.setLinesVisible(true);
 
75
                table.getVerticalBar().setVisible(true);
 
76
 
 
77
                String[] names = dataSet.getTitles();
 
78
                TableColumn column = new TableColumn(table, SWT.LEFT);
 
79
                column.setText(Localization.getString("DataGrid.Row")); //$NON-NLS-1$
 
80
                column.pack();
 
81
                column.setMoveable(false);
 
82
                column.setResizable(false);
 
83
 
 
84
                columnFormat = new IFormattingStyles[names.length];
 
85
                for(int i=0; i<names.length; i++) {
 
86
                        column = new TableColumn(table, SWT.LEFT);
 
87
                        column.setText(names[i]);
 
88
                        column.pack();
 
89
                        column.setMoveable(true);
 
90
 
 
91
                        columnFormat[i] = new StringFormatter();
 
92
                }
 
93
 
 
94
                table.setMenu(this.initMenus());
 
95
 
 
96
                table.addListener(SWT.MouseDown, new Listener() {
 
97
                        @Override
 
98
                        public void handleEvent(Event event) {
 
99
                                clickLocation.x = event.x;
 
100
                                clickLocation.y = event.y;
 
101
                        }
 
102
                });
 
103
                handleUpdateEvent();
 
104
        }
 
105
 
 
106
        public Menu initMenus() {
 
107
                Menu menu = new Menu(table.getShell(), SWT.POP_UP);
 
108
                menu.addMenuListener(new MainMenuListener());
 
109
 
 
110
                Menu formatMenu = new Menu(menu);
 
111
                MenuItem item = new MenuItem(menu, SWT.CASCADE);
 
112
                item.setText(Localization.getString("DataGrid.FormatAs")); //$NON-NLS-1$
 
113
                item.setMenu(formatMenu);
 
114
 
 
115
                        filterMenu = new Menu(menu);
 
116
                        item = new MenuItem(menu, SWT.CASCADE);
 
117
                        item.setText(Localization.getString("DataGrid.AddFilter")); //$NON-NLS-1$
 
118
                        item.addSelectionListener(new AddFilterSelection());
 
119
 
 
120
                        item = new MenuItem(menu, SWT.CASCADE);
 
121
                        item.setText(Localization.getString("DataGrid.RemoveFilter")); //$NON-NLS-1$
 
122
                        item.setMenu(filterMenu);
 
123
 
 
124
                        IDataSetFilter[] filters = filteredDataSet.getFilters();
 
125
                        if(null != filters) {
 
126
                                for(int i=0; i<filters.length; i++) {
 
127
                                        item = new MenuItem(filterMenu, SWT.CASCADE);
 
128
                                        item.setText(AvailableFilterTypes.getFilterName(filters[i].getID()));
 
129
                                        item.setData(filters[i]);
 
130
                                        item.addSelectionListener(new RemoveFilterSelection());
 
131
                                }
 
132
                        }
 
133
 
 
134
                item = new MenuItem(menu, SWT.CHECK);
 
135
                item.setText(Localization.getString("DataGrid.ManualyResize")); //$NON-NLS-1$
 
136
                item.addSelectionListener(new MenuManualyResizedSelection());
 
137
 
 
138
                for(int i=0; i<IFormattingStyles.FORMAT_TITLES.length; i++) {
 
139
                        item = new MenuItem(formatMenu, SWT.RADIO);
 
140
                        item.setText(IFormattingStyles.FORMAT_TITLES[i]);
 
141
                        item.addSelectionListener(new MenuFormatSelection());
 
142
                }
 
143
 
 
144
                formatMenu.addMenuListener(new FormatMenuListener());
 
145
                return menu;
 
146
        }
 
147
 
 
148
        private int getSelectedColumn() {
 
149
                TableColumn[] cols = table.getColumns();
 
150
                int location = 0;
 
151
                for(int i=0; i<cols.length; i++)
 
152
                        if(clickLocation.x > location && clickLocation.x < (location+=cols[i].getWidth()))
 
153
                                return i;
 
154
 
 
155
                return cols.length-1;
 
156
        }
 
157
 
 
158
        public class MainMenuListener extends MenuAdapter {
 
159
                @Override
 
160
                public void menuShown(MenuEvent e) {
 
161
                        MenuItem item = ((Menu)e.widget).getItem(1);
 
162
                        item.setSelection(manualResize);
 
163
                }
 
164
        }
 
165
 
 
166
        public class MenuManualyResizedSelection extends SelectionAdapter {
 
167
                @Override
 
168
                public void widgetSelected(SelectionEvent e) {
 
169
                        manualResize = !manualResize;
 
170
                }
 
171
        }
 
172
 
 
173
        public class AddFilterSelection extends SelectionAdapter {
 
174
                @Override
 
175
                public void widgetSelected(SelectionEvent e) {
 
176
                        SelectFilterWizard wizard = new SelectFilterWizard(dataSet.getTitles());
 
177
                        IWorkbench workbench = PlatformUI.getWorkbench();
 
178
                        wizard.init(workbench, null);
 
179
                        WizardDialog dialog = new WizardDialog(workbench.getActiveWorkbenchWindow().getShell(), wizard);
 
180
                        dialog.create();
 
181
                        dialog.open();
 
182
 
 
183
                        IDataSetFilter filter = wizard.getFilter();
 
184
                        wizard.dispose();
 
185
 
 
186
                        if(null != filter) {
 
187
                                filteredDataSet.addFilter(filter);
 
188
                                table.removeAll();
 
189
                                handleUpdateEvent();
 
190
 
 
191
                                MenuItem item = new MenuItem(filterMenu, SWT.CASCADE);
 
192
                                item.setText(AvailableFilterTypes.getFilterName(filter.getID()));
 
193
                                item.setData(filter);
 
194
                                item.addSelectionListener(new RemoveFilterSelection());
 
195
                        }
 
196
                }
 
197
        }
 
198
 
 
199
        public class RemoveFilterSelection implements SelectionListener {
 
200
                @Override
 
201
                public void widgetSelected(SelectionEvent e) {
 
202
                        IDataSetFilter idsf = (IDataSetFilter)((MenuItem)e.widget).getData();
 
203
                        e.widget.dispose();
 
204
 
 
205
                        if(filteredDataSet.removeFilter(idsf)) {
 
206
                                table.removeAll();
 
207
                                handleUpdateEvent();
 
208
                        }
 
209
                }
 
210
 
 
211
                @Override
 
212
                public void widgetDefaultSelected(SelectionEvent e) {}
 
213
        }
 
214
 
 
215
        public class FormatMenuListener extends MenuAdapter {
 
216
                @Override
 
217
                public void menuShown(MenuEvent e) {
 
218
                        MenuItem[] items = ((Menu)e.widget).getItems();
 
219
                        boolean doubleValid = false, longValid = false;
 
220
                        String itemText;
 
221
 
 
222
                        int selectedCol = Math.max(1, getSelectedColumn());
 
223
 
 
224
                        for(int i=0; i<items.length; i++)
 
225
                                items[i].setSelection(false);
 
226
                        items[columnFormat[selectedCol-1].getFormat()].setSelection(true);
 
227
 
 
228
                        itemText = dataSet.getRow(0)[selectedCol-1].toString();
 
229
                        items[IFormattingStyles.UNFORMATED].setEnabled(true);
 
230
                        items[IFormattingStyles.STRING].setEnabled(true);
 
231
 
 
232
                        try {
 
233
                                Double.parseDouble(itemText);
 
234
                                doubleValid = true;
 
235
 
 
236
                                try {
 
237
                                        Long.parseLong(itemText);
 
238
                                        longValid = true;
 
239
                                } catch(NumberFormatException nfe2) {}
 
240
                        } catch(NumberFormatException nfe) {}
 
241
 
 
242
                        items[IFormattingStyles.DOUBLE].setEnabled(doubleValid);
 
243
                        items[IFormattingStyles.HEX].setEnabled(longValid);
 
244
                        items[IFormattingStyles.OCTAL].setEnabled(longValid);
 
245
                        items[IFormattingStyles.BINARY].setEnabled(longValid);
 
246
                        items[IFormattingStyles.DATE].setEnabled(longValid);
 
247
                }
 
248
        }
 
249
 
 
250
        public class MenuFormatSelection extends SelectionAdapter {
 
251
                @Override
 
252
                public void widgetSelected(SelectionEvent e) {
 
253
                        int format = IFormattingStyles.UNFORMATED;
 
254
                        int column = Math.max(1, getSelectedColumn());
 
255
                        int i;
 
256
                        for(i=0; i<IFormattingStyles.FORMAT_TITLES.length; i++)
 
257
                                if(IFormattingStyles.FORMAT_TITLES[i].equals(((MenuItem)e.getSource()).getText()))
 
258
                                        format = i;
 
259
 
 
260
                        Object[] data = dataSet.getColumn(column-1);
 
261
                        columnFormat[column-1].setFormat(format);
 
262
                        for(i=0; i<table.getItemCount(); i++)
 
263
                                table.getItem(i).setText(column, columnFormat[column-1].format(data[i].toString()));
 
264
                        table.redraw();
 
265
                }
 
266
        }
 
267
 
 
268
        @Override
 
269
        public void handleUpdateEvent() {
 
270
                if(table.isDisposed()) return;
 
271
 
 
272
                table.getDisplay().asyncExec(new Runnable() {
 
273
                        @Override
 
274
                        public void run() {
 
275
                                TableItem item;
 
276
                                int startLocation, endLocation = filteredDataSet.getRowCount();
 
277
 
 
278
                                if(FULL_UPDATE == (style & FULL_UPDATE)) {
 
279
                                        //Remove extra items so save memory.
 
280
                                        removedItems += table.getItemCount();
 
281
                                        table.removeAll();
 
282
                                        startLocation = 0;
 
283
                                } else {
 
284
                                        startLocation = table.getItemCount()+removedItems;
 
285
                                }
 
286
 
 
287
                                //Add all the new items to the table
 
288
                                Object[] os;
 
289
                                for(int j,i=startLocation; i<endLocation; i++) {
 
290
                                        item = new TableItem(table, SWT.NONE);
 
291
                                        os = filteredDataSet.getRow(i);
 
292
 
 
293
                                        //Add 1 to the index/row num since graphs start counting rows at 1, not 0.
 
294
                                        item.setText(0, Integer.toString(i + 1));
 
295
                                        for(j=0; j<os.length; j++) {
 
296
                                                //Ignore null items
 
297
                                                if (os[j] != null) {
 
298
                                                        item.setText(j+1, columnFormat[j].format(os[j].toString()));
 
299
                                                }
 
300
                                        }
 
301
                                }
 
302
 
 
303
                                if(FULL_UPDATE != (style & FULL_UPDATE)) {
 
304
                                        //Remove extra items so save memory.
 
305
                                        if(table.getItemCount() > prefs.getInt(GraphingAPIPreferenceConstants.P_MAX_DATA_ITEMS)) {
 
306
                                                int items = table.getItemCount()-prefs.getInt(GraphingAPIPreferenceConstants.P_MAX_DATA_ITEMS);
 
307
                                                table.remove(0, items-1);
 
308
                                                removedItems += items;
 
309
                                        }
 
310
                                }
 
311
 
 
312
                                //Resize the columns
 
313
                                TableColumn col = table.getColumn(0);
 
314
                                col.pack();
 
315
                                if(!manualResize) {
 
316
                                        TableColumn[] cols = table.getColumns();
 
317
                                        for(int i=1; i<cols.length; i++)
 
318
                                                cols[i].pack();
 
319
                                }
 
320
                                //Use if we want to set focus to newly added item
 
321
                                if(prefs.getBoolean(GraphingAPIPreferenceConstants.P_JUMP_NEW_TABLE_ENTRY))
 
322
                                        table.showItem(table.getItem(table.getItemCount()-1));
 
323
                        }
 
324
                });
 
325
        }
 
326
 
 
327
        public void dispose() {
 
328
                dataSet = null;
 
329
                table.dispose();
 
330
                table = null;
 
331
                clickLocation = null;
 
332
                columnFormat = null;
 
333
        }
 
334
 
 
335
        protected IDataSet dataSet;
 
336
        protected IFilteredDataSet filteredDataSet;
 
337
        protected IFormattingStyles columnFormat[];
 
338
        protected int removedItems;
 
339
        protected Table table;
 
340
        protected Point clickLocation;
 
341
        protected IPreferenceStore prefs;
 
342
        protected boolean manualResize;
 
343
        protected Menu filterMenu;
 
344
        protected int style;
 
345
 
 
346
        public static final int NONE = 0;
 
347
        public static final int FULL_UPDATE = 1;
 
348
}