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
9
* IBM Corporation - Jeff Briggs, Henry Hughes, Ryan Morse
10
*******************************************************************************/
12
package org.eclipse.linuxtools.systemtap.graphingapi.ui.datadisplay;
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;
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);
55
filteredDataSet = (dataSet instanceof IFilteredDataSet)
56
? (IFilteredDataSet)dataSet
57
: DataSetFactory.createFilteredDataSet(dataSet);
59
clickLocation = new Point(-1, -1);
61
createPartControl(composite);
64
public void setLayoutData(Object data) {
65
table.setLayoutData(data);
68
public IDataSet getDataSet() { return dataSet; }
69
public Control getControl() { return table; }
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);
77
String[] names = dataSet.getTitles();
78
TableColumn column = new TableColumn(table, SWT.LEFT);
79
column.setText(Localization.getString("DataGrid.Row")); //$NON-NLS-1$
81
column.setMoveable(false);
82
column.setResizable(false);
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]);
89
column.setMoveable(true);
91
columnFormat[i] = new StringFormatter();
94
table.setMenu(this.initMenus());
96
table.addListener(SWT.MouseDown, new Listener() {
98
public void handleEvent(Event event) {
99
clickLocation.x = event.x;
100
clickLocation.y = event.y;
106
public Menu initMenus() {
107
Menu menu = new Menu(table.getShell(), SWT.POP_UP);
108
menu.addMenuListener(new MainMenuListener());
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);
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());
120
item = new MenuItem(menu, SWT.CASCADE);
121
item.setText(Localization.getString("DataGrid.RemoveFilter")); //$NON-NLS-1$
122
item.setMenu(filterMenu);
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());
134
item = new MenuItem(menu, SWT.CHECK);
135
item.setText(Localization.getString("DataGrid.ManualyResize")); //$NON-NLS-1$
136
item.addSelectionListener(new MenuManualyResizedSelection());
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());
144
formatMenu.addMenuListener(new FormatMenuListener());
148
private int getSelectedColumn() {
149
TableColumn[] cols = table.getColumns();
151
for(int i=0; i<cols.length; i++)
152
if(clickLocation.x > location && clickLocation.x < (location+=cols[i].getWidth()))
155
return cols.length-1;
158
public class MainMenuListener extends MenuAdapter {
160
public void menuShown(MenuEvent e) {
161
MenuItem item = ((Menu)e.widget).getItem(1);
162
item.setSelection(manualResize);
166
public class MenuManualyResizedSelection extends SelectionAdapter {
168
public void widgetSelected(SelectionEvent e) {
169
manualResize = !manualResize;
173
public class AddFilterSelection extends SelectionAdapter {
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);
183
IDataSetFilter filter = wizard.getFilter();
187
filteredDataSet.addFilter(filter);
191
MenuItem item = new MenuItem(filterMenu, SWT.CASCADE);
192
item.setText(AvailableFilterTypes.getFilterName(filter.getID()));
193
item.setData(filter);
194
item.addSelectionListener(new RemoveFilterSelection());
199
public class RemoveFilterSelection implements SelectionListener {
201
public void widgetSelected(SelectionEvent e) {
202
IDataSetFilter idsf = (IDataSetFilter)((MenuItem)e.widget).getData();
205
if(filteredDataSet.removeFilter(idsf)) {
212
public void widgetDefaultSelected(SelectionEvent e) {}
215
public class FormatMenuListener extends MenuAdapter {
217
public void menuShown(MenuEvent e) {
218
MenuItem[] items = ((Menu)e.widget).getItems();
219
boolean doubleValid = false, longValid = false;
222
int selectedCol = Math.max(1, getSelectedColumn());
224
for(int i=0; i<items.length; i++)
225
items[i].setSelection(false);
226
items[columnFormat[selectedCol-1].getFormat()].setSelection(true);
228
itemText = dataSet.getRow(0)[selectedCol-1].toString();
229
items[IFormattingStyles.UNFORMATED].setEnabled(true);
230
items[IFormattingStyles.STRING].setEnabled(true);
233
Double.parseDouble(itemText);
237
Long.parseLong(itemText);
239
} catch(NumberFormatException nfe2) {}
240
} catch(NumberFormatException nfe) {}
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);
250
public class MenuFormatSelection extends SelectionAdapter {
252
public void widgetSelected(SelectionEvent e) {
253
int format = IFormattingStyles.UNFORMATED;
254
int column = Math.max(1, getSelectedColumn());
256
for(i=0; i<IFormattingStyles.FORMAT_TITLES.length; i++)
257
if(IFormattingStyles.FORMAT_TITLES[i].equals(((MenuItem)e.getSource()).getText()))
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()));
269
public void handleUpdateEvent() {
270
if(table.isDisposed()) return;
272
table.getDisplay().asyncExec(new Runnable() {
276
int startLocation, endLocation = filteredDataSet.getRowCount();
278
if(FULL_UPDATE == (style & FULL_UPDATE)) {
279
//Remove extra items so save memory.
280
removedItems += table.getItemCount();
284
startLocation = table.getItemCount()+removedItems;
287
//Add all the new items to the table
289
for(int j,i=startLocation; i<endLocation; i++) {
290
item = new TableItem(table, SWT.NONE);
291
os = filteredDataSet.getRow(i);
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++) {
298
item.setText(j+1, columnFormat[j].format(os[j].toString()));
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;
313
TableColumn col = table.getColumn(0);
316
TableColumn[] cols = table.getColumns();
317
for(int i=1; i<cols.length; i++)
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));
327
public void dispose() {
331
clickLocation = null;
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;
346
public static final int NONE = 0;
347
public static final int FULL_UPDATE = 1;