import org.eclipse.linuxtools.tmf.request.ITmfDataRequest.ExecutionType;\r
import org.eclipse.linuxtools.tmf.request.TmfDataRequest;\r
import org.eclipse.linuxtools.tmf.request.TmfEventRequest;\r
-import org.eclipse.linuxtools.tmf.signal.TmfExperimentUpdatedSignal;\r
+import org.eclipse.linuxtools.tmf.signal.TmfExperimentRangeUpdatedSignal;\r
import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;\r
import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal;\r
import org.eclipse.linuxtools.tmf.signal.TmfTraceUpdatedSignal;\r
/**\r
* <b><u>TmfEventsTable</u></b>\r
*/\r
-public class TmfEventsTable extends TmfComponent implements IGotoMarker, IColorSettingsListener, ITmfEventsFilterProvider {\r
-\r
- private static final Image BOOKMARK_IMAGE = TmfUiPlugin.getDefault().getImageFromPath("icons/elcl16/bookmark_obj.gif"); //$NON-NLS-1$\r
- private static final Image SEARCH_IMAGE = TmfUiPlugin.getDefault().getImageFromPath("icons/elcl16/search.gif"); //$NON-NLS-1$\r
- private static final Image SEARCH_MATCH_IMAGE = TmfUiPlugin.getDefault().getImageFromPath("icons/elcl16/search_match.gif"); //$NON-NLS-1$\r
- private static final Image SEARCH_MATCH_BOOKMARK_IMAGE = TmfUiPlugin.getDefault().getImageFromPath("icons/elcl16/search_match_bookmark.gif"); //$NON-NLS-1$\r
- private static final Image FILTER_IMAGE = TmfUiPlugin.getDefault().getImageFromPath("icons/elcl16/filter_items.gif"); //$NON-NLS-1$\r
- private static final Image STOP_IMAGE = TmfUiPlugin.getDefault().getImageFromPath("icons/elcl16/stop.gif"); //$NON-NLS-1$\r
- private static final String SEARCH_HINT = Messages.TmfEventsTable_SearchHint;\r
- private static final String FILTER_HINT = Messages.TmfEventsTable_FilterHint;\r
- \r
- public interface Key {\r
- String SEARCH_TXT = "$srch_txt"; //$NON-NLS-1$\r
- String SEARCH_OBJ = "$srch_obj"; //$NON-NLS-1$\r
- String FILTER_TXT = "$fltr_txt"; //$NON-NLS-1$\r
- String FILTER_OBJ = "$fltr_obj"; //$NON-NLS-1$\r
- String TIMESTAMP = "$time"; //$NON-NLS-1$\r
- String RANK = "$rank"; //$NON-NLS-1$\r
- String FIELD_ID = "$field_id"; //$NON-NLS-1$\r
- }\r
- \r
- public static enum HeaderState {\r
- SEARCH,\r
- FILTER\r
- }\r
- \r
- interface Direction {\r
- int FORWARD = +1;\r
- int BACKWARD = -1;\r
- }\r
- \r
+public class TmfEventsTable extends TmfComponent implements IGotoMarker, IColorSettingsListener,\r
+ ITmfEventsFilterProvider {\r
+\r
+ private static final Image BOOKMARK_IMAGE = TmfUiPlugin.getDefault().getImageFromPath(\r
+ "icons/elcl16/bookmark_obj.gif"); //$NON-NLS-1$\r
+ private static final Image SEARCH_IMAGE = TmfUiPlugin.getDefault().getImageFromPath("icons/elcl16/search.gif"); //$NON-NLS-1$\r
+ private static final Image SEARCH_MATCH_IMAGE = TmfUiPlugin.getDefault().getImageFromPath(\r
+ "icons/elcl16/search_match.gif"); //$NON-NLS-1$\r
+ private static final Image SEARCH_MATCH_BOOKMARK_IMAGE = TmfUiPlugin.getDefault().getImageFromPath(\r
+ "icons/elcl16/search_match_bookmark.gif"); //$NON-NLS-1$\r
+ private static final Image FILTER_IMAGE = TmfUiPlugin.getDefault()\r
+ .getImageFromPath("icons/elcl16/filter_items.gif"); //$NON-NLS-1$\r
+ private static final Image STOP_IMAGE = TmfUiPlugin.getDefault().getImageFromPath("icons/elcl16/stop.gif"); //$NON-NLS-1$\r
+ private static final String SEARCH_HINT = Messages.TmfEventsTable_SearchHint;\r
+ private static final String FILTER_HINT = Messages.TmfEventsTable_FilterHint;\r
+\r
+ public interface Key {\r
+ String SEARCH_TXT = "$srch_txt"; //$NON-NLS-1$\r
+ String SEARCH_OBJ = "$srch_obj"; //$NON-NLS-1$\r
+ String FILTER_TXT = "$fltr_txt"; //$NON-NLS-1$\r
+ String FILTER_OBJ = "$fltr_obj"; //$NON-NLS-1$\r
+ String TIMESTAMP = "$time"; //$NON-NLS-1$\r
+ String RANK = "$rank"; //$NON-NLS-1$\r
+ String FIELD_ID = "$field_id"; //$NON-NLS-1$\r
+ }\r
+\r
+ public static enum HeaderState {\r
+ SEARCH, FILTER\r
+ }\r
+\r
+ interface Direction {\r
+ int FORWARD = +1;\r
+ int BACKWARD = -1;\r
+ }\r
+\r
// ------------------------------------------------------------------------\r
// Table data\r
// ------------------------------------------------------------------------\r
protected boolean fPackDone = false;\r
protected HeaderState fHeaderState = HeaderState.SEARCH;\r
protected long fSelectedRank = 0;\r
- \r
+\r
// Filter data\r
protected long fFilterMatchCount;\r
protected long fFilterCheckCount;\r
protected SearchThread fSearchThread;\r
protected final Object fSearchSyncObj = new Object();\r
protected ArrayList<ITmfEventsFilterListener> fEventsFilterListeners = new ArrayList<ITmfEventsFilterListener>();\r
- \r
+\r
// Bookmark map <Rank, MarkerId>\r
protected Map<Long, Long> fBookmarksMap = new HashMap<Long, Long>();\r
protected IResource fBookmarksResource;\r
protected long fPendingGotoRank = -1;\r
- \r
+\r
// SWT resources\r
protected LocalResourceManager fResourceManager = new LocalResourceManager(JFaceResources.getResources());\r
protected Color fGrayColor;\r
protected Font fBoldFont;\r
\r
// Table column names\r
- static private final String[] COLUMN_NAMES = new String[] {\r
- Messages.TmfEventsTable_TimestampColumnHeader,\r
- Messages.TmfEventsTable_SourceColumnHeader,\r
- Messages.TmfEventsTable_TypeColumnHeader,\r
- Messages.TmfEventsTable_ReferenceColumnHeader,\r
- Messages.TmfEventsTable_ContentColumnHeader\r
- };\r
-\r
- static private ColumnData[] COLUMN_DATA = new ColumnData[] {\r
- new ColumnData(COLUMN_NAMES[0], 100, SWT.LEFT),\r
- new ColumnData(COLUMN_NAMES[1], 100, SWT.LEFT),\r
- new ColumnData(COLUMN_NAMES[2], 100, SWT.LEFT),\r
- new ColumnData(COLUMN_NAMES[3], 100, SWT.LEFT),\r
- new ColumnData(COLUMN_NAMES[4], 100, SWT.LEFT)\r
- };\r
+ static private final String[] COLUMN_NAMES = new String[] { Messages.TmfEventsTable_TimestampColumnHeader,\r
+ Messages.TmfEventsTable_SourceColumnHeader, Messages.TmfEventsTable_TypeColumnHeader,\r
+ Messages.TmfEventsTable_ReferenceColumnHeader, Messages.TmfEventsTable_ContentColumnHeader };\r
+\r
+ static private ColumnData[] COLUMN_DATA = new ColumnData[] { new ColumnData(COLUMN_NAMES[0], 100, SWT.LEFT),\r
+ new ColumnData(COLUMN_NAMES[1], 100, SWT.LEFT), new ColumnData(COLUMN_NAMES[2], 100, SWT.LEFT),\r
+ new ColumnData(COLUMN_NAMES[3], 100, SWT.LEFT), new ColumnData(COLUMN_NAMES[4], 100, SWT.LEFT) };\r
\r
// Event cache\r
private final TmfEventsCache fCache;\r
private boolean fCacheUpdateCompleted = false;\r
private Object fCacheUpdateSyncObj = new Object();\r
\r
-\r
private boolean fDisposeOnClose;\r
\r
// ------------------------------------------------------------------------\r
// ------------------------------------------------------------------------\r
\r
public TmfEventsTable(Composite parent, int cacheSize) {\r
- this(parent, cacheSize, COLUMN_DATA);\r
+ this(parent, cacheSize, COLUMN_DATA);\r
}\r
\r
public TmfEventsTable(Composite parent, int cacheSize, ColumnData[] columnData) {\r
super("TmfEventsTable"); //$NON-NLS-1$\r
- \r
+\r
fComposite = new Composite(parent, SWT.NONE);\r
GridLayout gl = new GridLayout(1, false);\r
gl.marginHeight = 0;\r
\r
fSashForm = new SashForm(fComposite, SWT.HORIZONTAL);\r
fSashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
- \r
+\r
// Create a virtual table\r
final int style = SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION;\r
fTable = new TmfVirtualTable(fSashForm, style);\r
\r
// Set the columns\r
setColumnHeaders(columnData);\r
- \r
+\r
// Set the default column field ids if this is not a subclass\r
- if (Arrays.equals(columnData, COLUMN_DATA)) {\r
- fTable.getColumns()[0].setData(Key.FIELD_ID, TmfEventContent.FIELD_ID_TIMESTAMP);\r
- fTable.getColumns()[1].setData(Key.FIELD_ID, TmfEventContent.FIELD_ID_SOURCE);\r
- fTable.getColumns()[2].setData(Key.FIELD_ID, TmfEventContent.FIELD_ID_TYPE);\r
- fTable.getColumns()[3].setData(Key.FIELD_ID, TmfEventContent.FIELD_ID_REFERENCE);\r
- fTable.getColumns()[4].setData(Key.FIELD_ID, TmfEventContent.FIELD_ID_CONTENT);\r
- }\r
+ if (Arrays.equals(columnData, COLUMN_DATA)) {\r
+ fTable.getColumns()[0].setData(Key.FIELD_ID, TmfEventContent.FIELD_ID_TIMESTAMP);\r
+ fTable.getColumns()[1].setData(Key.FIELD_ID, TmfEventContent.FIELD_ID_SOURCE);\r
+ fTable.getColumns()[2].setData(Key.FIELD_ID, TmfEventContent.FIELD_ID_TYPE);\r
+ fTable.getColumns()[3].setData(Key.FIELD_ID, TmfEventContent.FIELD_ID_REFERENCE);\r
+ fTable.getColumns()[4].setData(Key.FIELD_ID, TmfEventContent.FIELD_ID_CONTENT);\r
+ }\r
\r
// Set the frozen row for header row\r
fTable.setFrozenRowCount(1);\r
\r
// Create the header row cell editor\r
createHeaderEditor();\r
- \r
+\r
// Handle the table item selection\r
fTable.addSelectionListener(new SelectionAdapter() {\r
@Override\r
public void widgetSelected(SelectionEvent e) {\r
- TableItem[] selection = fTable.getSelection();\r
- if (selection.length > 0) {\r
- TableItem selectedTableItem = selection[0];\r
- if (selectedTableItem != null) {\r
- if (selectedTableItem.getData(Key.RANK) instanceof Long) {\r
- fSelectedRank = (Long) selectedTableItem.getData(Key.RANK);\r
- fRawViewer.selectAndReveal((Long) selectedTableItem.getData(Key.RANK));\r
- }\r
- if (selectedTableItem.getData(Key.TIMESTAMP) instanceof TmfTimestamp) {\r
- TmfTimestamp ts = (TmfTimestamp) selectedTableItem.getData(Key.TIMESTAMP);\r
- broadcast(new TmfTimeSynchSignal(fTable, ts));\r
- }\r
- }\r
- }\r
+ TableItem[] selection = fTable.getSelection();\r
+ if (selection.length > 0) {\r
+ TableItem selectedTableItem = selection[0];\r
+ if (selectedTableItem != null) {\r
+ if (selectedTableItem.getData(Key.RANK) instanceof Long) {\r
+ fSelectedRank = (Long) selectedTableItem.getData(Key.RANK);\r
+ fRawViewer.selectAndReveal((Long) selectedTableItem.getData(Key.RANK));\r
+ }\r
+ if (selectedTableItem.getData(Key.TIMESTAMP) instanceof TmfTimestamp) {\r
+ TmfTimestamp ts = (TmfTimestamp) selectedTableItem.getData(Key.TIMESTAMP);\r
+ broadcast(new TmfTimeSynchSignal(fTable, ts));\r
+ }\r
+ }\r
+ }\r
}\r
});\r
\r
cacheSize = Math.max(cacheSize, Display.getDefault().getBounds().height / fTable.getItemHeight());\r
fCache = new TmfEventsCache(cacheSize, this);\r
\r
- // Handle the table item requests \r
+ // Handle the table item requests\r
fTable.addListener(SWT.SetData, new Listener() {\r
\r
@Override\r
- public void handleEvent(Event event) {\r
+ public void handleEvent(Event event) {\r
\r
final TableItem item = (TableItem) event.item;\r
int index = event.index - 1; // -1 for the header row\r
\r
if (event.index == 0) {\r
- setHeaderRowItemData(item);\r
+ setHeaderRowItemData(item);\r
return;\r
}\r
\r
if (fTable.getData(Key.FILTER_OBJ) != null) {\r
- if (event.index == 1 || event.index == fTable.getItemCount() - 1) {\r
- setFilterStatusRowItemData(item);\r
- return;\r
- }\r
- index = index - 1; // -1 for top filter status row\r
+ if (event.index == 1 || event.index == fTable.getItemCount() - 1) {\r
+ setFilterStatusRowItemData(item);\r
+ return;\r
+ }\r
+ index = index - 1; // -1 for top filter status row\r
}\r
- \r
+\r
CachedEvent cachedEvent = fCache.getEvent(index);\r
if (cachedEvent != null) {\r
setItemData(item, cachedEvent.event, cachedEvent.rank);\r
return;\r
}\r
- \r
+\r
// Else, fill the cache asynchronously (and off the UI thread)\r
event.doit = false;\r
}\r
});\r
\r
fTable.addMouseListener(new MouseAdapter() {\r
- @Override\r
- public void mouseDoubleClick(MouseEvent event) {\r
- if (event.button != 1) {\r
- return;\r
- }\r
- // Identify the selected row\r
- Point point = new Point(event.x, event.y);\r
- TableItem item = fTable.getItem(point);\r
- if (item != null) {\r
- Rectangle imageBounds = item.getImageBounds(0);\r
- imageBounds.width = BOOKMARK_IMAGE.getBounds().width;\r
- if (imageBounds.contains(point)) {\r
- Long rank = (Long) item.getData(Key.RANK);\r
- if (rank != null) {\r
- toggleBookmark(rank);\r
- }\r
- }\r
- }\r
- }\r
+ @Override\r
+ public void mouseDoubleClick(MouseEvent event) {\r
+ if (event.button != 1) {\r
+ return;\r
+ }\r
+ // Identify the selected row\r
+ Point point = new Point(event.x, event.y);\r
+ TableItem item = fTable.getItem(point);\r
+ if (item != null) {\r
+ Rectangle imageBounds = item.getImageBounds(0);\r
+ imageBounds.width = BOOKMARK_IMAGE.getBounds().width;\r
+ if (imageBounds.contains(point)) {\r
+ Long rank = (Long) item.getData(Key.RANK);\r
+ if (rank != null) {\r
+ toggleBookmark(rank);\r
+ }\r
+ }\r
+ }\r
+ }\r
});\r
- \r
+\r
// Create resources\r
createResources();\r
\r
ColorSettingsManager.addColorSettingsListener(this);\r
- \r
+\r
fTable.setItemCount(1); // +1 for header row\r
- \r
+\r
fRawViewer = new TmfRawEventViewer(fSashForm, SWT.H_SCROLL | SWT.V_SCROLL);\r
- \r
+\r
fRawViewer.addSelectionListener(new SelectionAdapter() {\r
@Override\r
public void widgetSelected(SelectionEvent e) {\r
long rank = (Long) e.data;\r
int index = (int) rank;\r
if (fTable.getData(Key.FILTER_OBJ) != null) {\r
- index = fCache.getFilteredEventIndex(rank) + 1; // +1 for top filter status row\r
+ index = fCache.getFilteredEventIndex(rank) + 1; // +1 for top filter status row\r
}\r
fTable.setSelection(index + 1); // +1 for header row\r
fSelectedRank = rank;\r
} else if (e.data instanceof ITmfLocation<?>) {\r
- // DOES NOT WORK: rank undefined in context from seekLocation()\r
+ // DOES NOT WORK: rank undefined in context from seekLocation()\r
// ITmfLocation<?> location = (ITmfLocation<?>) e.data;\r
// TmfContext context = fTrace.seekLocation(location);\r
// fTable.setSelection((int) context.getRank());\r
if (selection != null && selection.length > 0) {\r
TmfTimestamp ts = (TmfTimestamp) fTable.getSelection()[0].getData(Key.TIMESTAMP);\r
if (ts != null) {\r
- broadcast(new TmfTimeSynchSignal(fTable, ts));\r
+ broadcast(new TmfTimeSynchSignal(fTable, ts));\r
}\r
}\r
}\r
});\r
\r
- fSashForm.setWeights(new int[] {1, 1});\r
+ fSashForm.setWeights(new int[] { 1, 1 });\r
fRawViewer.setVisible(false);\r
\r
createPopupMenu();\r
fSashForm.layout();\r
}\r
};\r
- \r
+\r
final IAction hideTableAction = new Action(Messages.TmfEventsTable_HideTableActionText) {\r
@Override\r
public void run() {\r
fSashForm.layout();\r
}\r
};\r
- \r
+\r
final IAction showRawAction = new Action(Messages.TmfEventsTable_ShowRawActionText) {\r
@Override\r
public void run() {\r
fSashForm.layout();\r
int index = fTable.getSelectionIndex();\r
if (index >= +1) { // +1 for header row\r
- fRawViewer.selectAndReveal(index - 1);\r
+ fRawViewer.selectAndReveal(index - 1);\r
}\r
}\r
};\r
- \r
+\r
final IAction hideRawAction = new Action(Messages.TmfEventsTable_HideRawActionText) {\r
@Override\r
public void run() {\r
final IAction showSearchBarAction = new Action(Messages.TmfEventsTable_ShowSearchBarActionText) {\r
@Override\r
public void run() {\r
- fHeaderState = HeaderState.SEARCH;\r
- fTable.refresh();\r
+ fHeaderState = HeaderState.SEARCH;\r
+ fTable.refresh();\r
}\r
};\r
\r
final IAction showFilterBarAction = new Action(Messages.TmfEventsTable_ShowFilterBarActionText) {\r
@Override\r
public void run() {\r
- fHeaderState = HeaderState.FILTER;\r
- fTable.refresh();\r
+ fHeaderState = HeaderState.FILTER;\r
+ fTable.refresh();\r
}\r
};\r
\r
final IAction clearFiltersAction = new Action(Messages.TmfEventsTable_ClearFiltersActionText) {\r
@Override\r
public void run() {\r
- stopFilterThread();\r
- stopSearchThread();\r
- clearFilters();\r
+ stopFilterThread();\r
+ stopSearchThread();\r
+ clearFilters();\r
}\r
};\r
\r
class ToggleBookmarkAction extends Action {\r
- long fRank;\r
- public ToggleBookmarkAction(String text, long rank) {\r
- super(text);\r
- fRank = rank;\r
- }\r
- \r
- @Override\r
+ long fRank;\r
+\r
+ public ToggleBookmarkAction(String text, long rank) {\r
+ super(text);\r
+ fRank = rank;\r
+ }\r
+\r
+ @Override\r
public void run() {\r
- toggleBookmark(fRank);\r
+ toggleBookmark(fRank);\r
}\r
}\r
\r
tablePopupMenu.addMenuListener(new IMenuListener() {\r
@Override\r
public void menuAboutToShow(IMenuManager manager) {\r
- if (fTable.getSelectionIndex() == 0) {\r
- // Right-click on header row\r
- if (fHeaderState == HeaderState.FILTER) {\r
- tablePopupMenu.add(showSearchBarAction);\r
- } else {\r
+ if (fTable.getSelectionIndex() == 0) {\r
+ // Right-click on header row\r
+ if (fHeaderState == HeaderState.FILTER) {\r
+ tablePopupMenu.add(showSearchBarAction);\r
+ } else {\r
tablePopupMenu.add(showFilterBarAction);\r
- }\r
- return;\r
- }\r
- Point point = fTable.toControl(Display.getDefault().getCursorLocation());\r
- TableItem item = fTable.getItem(point);\r
- if (item != null) {\r
- Rectangle imageBounds = item.getImageBounds(0);\r
- imageBounds.width = BOOKMARK_IMAGE.getBounds().width;\r
- if (imageBounds.contains(point)) {\r
- // Right-click on left margin \r
- Long rank = (Long) item.getData(Key.RANK);\r
- if (rank != null && fBookmarksResource != null) {\r
- if (fBookmarksMap.containsKey(rank)) {\r
- tablePopupMenu.add(new ToggleBookmarkAction(Messages.TmfEventsTable_RemoveBookmarkActionText, rank));\r
- } else {\r
- tablePopupMenu.add(new ToggleBookmarkAction(Messages.TmfEventsTable_AddBookmarkActionText, rank));\r
- }\r
- }\r
- return;\r
- }\r
- }\r
- // Right-click on table\r
+ }\r
+ return;\r
+ }\r
+ Point point = fTable.toControl(Display.getDefault().getCursorLocation());\r
+ TableItem item = fTable.getItem(point);\r
+ if (item != null) {\r
+ Rectangle imageBounds = item.getImageBounds(0);\r
+ imageBounds.width = BOOKMARK_IMAGE.getBounds().width;\r
+ if (imageBounds.contains(point)) {\r
+ // Right-click on left margin\r
+ Long rank = (Long) item.getData(Key.RANK);\r
+ if (rank != null && fBookmarksResource != null) {\r
+ if (fBookmarksMap.containsKey(rank)) {\r
+ tablePopupMenu.add(new ToggleBookmarkAction(\r
+ Messages.TmfEventsTable_RemoveBookmarkActionText, rank));\r
+ } else {\r
+ tablePopupMenu.add(new ToggleBookmarkAction(\r
+ Messages.TmfEventsTable_AddBookmarkActionText, rank));\r
+ }\r
+ }\r
+ return;\r
+ }\r
+ }\r
+ // Right-click on table\r
if (fTable.isVisible() && fRawViewer.isVisible()) {\r
tablePopupMenu.add(hideTableAction);\r
tablePopupMenu.add(hideRawAction);\r
if (savedFilters.length > 0) {\r
MenuManager subMenu = new MenuManager(Messages.TmfEventsTable_ApplyPresetFilterMenuName);\r
for (ITmfFilterTreeNode node : savedFilters) {\r
- if (node instanceof TmfFilterNode) {\r
- final TmfFilterNode filter = (TmfFilterNode) node;\r
- subMenu.add(new Action(filter.getFilterName()) {\r
- @Override\r
- public void run() {\r
- stopFilterThread();\r
- fFilterMatchCount = 0;\r
- fFilterCheckCount = 0;\r
- fCache.applyFilter(filter);\r
- fTable.clearAll();\r
- fTable.setData(Key.FILTER_OBJ, filter);\r
- fTable.setItemCount(3); // +1 for header row, +2 for top and bottom filter status rows\r
- startFilterThread();\r
- fireFilterApplied(filter);\r
- }});\r
- }\r
+ if (node instanceof TmfFilterNode) {\r
+ final TmfFilterNode filter = (TmfFilterNode) node;\r
+ subMenu.add(new Action(filter.getFilterName()) {\r
+ @Override\r
+ public void run() {\r
+ stopFilterThread();\r
+ fFilterMatchCount = 0;\r
+ fFilterCheckCount = 0;\r
+ fCache.applyFilter(filter);\r
+ fTable.clearAll();\r
+ fTable.setData(Key.FILTER_OBJ, filter);\r
+ fTable.setItemCount(3); // +1 for header row, +2 for top and bottom filter status\r
+ // rows\r
+ startFilterThread();\r
+ fireFilterApplied(filter);\r
+ }\r
+ });\r
+ }\r
}\r
tablePopupMenu.add(subMenu);\r
}\r
appendToTablePopupMenu(tablePopupMenu, item);\r
}\r
});\r
- \r
+\r
final MenuManager rawViewerPopupMenu = new MenuManager();\r
rawViewerPopupMenu.setRemoveAllWhenShown(true);\r
rawViewerPopupMenu.addMenuListener(new IMenuListener() {\r
@Override\r
public void menuAboutToShow(IMenuManager manager) {\r
if (fTable.isVisible() && fRawViewer.isVisible()) {\r
- rawViewerPopupMenu.add(hideTableAction);\r
- rawViewerPopupMenu.add(hideRawAction);\r
+ rawViewerPopupMenu.add(hideTableAction);\r
+ rawViewerPopupMenu.add(hideRawAction);\r
} else if (!fTable.isVisible()) {\r
- rawViewerPopupMenu.add(showTableAction);\r
+ rawViewerPopupMenu.add(showTableAction);\r
} else if (!fRawViewer.isVisible()) {\r
- rawViewerPopupMenu.add(showRawAction);\r
+ rawViewerPopupMenu.add(showRawAction);\r
}\r
appendToRawPopupMenu(tablePopupMenu);\r
}\r
});\r
- \r
+\r
Menu menu = tablePopupMenu.createContextMenu(fTable);\r
fTable.setMenu(menu);\r
- \r
+\r
menu = rawViewerPopupMenu.createContextMenu(fRawViewer);\r
fRawViewer.setMenu(menu);\r
}\r
\r
protected void appendToTablePopupMenu(MenuManager tablePopupMenu, TableItem selectedItem) {\r
- // override to append more actions\r
+ // override to append more actions\r
}\r
- \r
+\r
protected void appendToRawPopupMenu(MenuManager rawViewerPopupMenu) {\r
- // override to append more actions\r
+ // override to append more actions\r
}\r
- \r
+\r
@Override\r
- public void dispose() {\r
- stopSearchThread();\r
- stopFilterThread();\r
+ public void dispose() {\r
+ stopSearchThread();\r
+ stopFilterThread();\r
ColorSettingsManager.removeColorSettingsListener(this);\r
- fComposite.dispose();\r
+ fComposite.dispose();\r
if (fTrace != null && fDisposeOnClose) {\r
fTrace.dispose();\r
}\r
}\r
\r
public void setLayoutData(Object layoutData) {\r
- fComposite.setLayoutData(layoutData);\r
+ fComposite.setLayoutData(layoutData);\r
}\r
- \r
+\r
public TmfVirtualTable getTable() {\r
return fTable;\r
}\r
- \r
+\r
/**\r
* @param table\r
* \r
- * FIXME: Add support for column selection\r
+ * FIXME: Add support for column selection\r
*/\r
protected void setColumnHeaders(ColumnData[] columnData) {\r
- fTable.setColumnHeaders(columnData);\r
+ fTable.setColumnHeaders(columnData);\r
}\r
\r
protected void setItemData(TableItem item, TmfEvent event, long rank) {\r
- item.setText(extractItemFields(event));\r
- item.setData(Key.TIMESTAMP, new TmfTimestamp(event.getTimestamp()));\r
- item.setData(Key.RANK, rank);\r
- \r
- boolean bookmark = false;\r
- if (fBookmarksMap.containsKey(rank)) {\r
- bookmark = true;\r
- }\r
- \r
- boolean searchMatch = false;\r
- boolean searchNoMatch = false;\r
- ITmfFilter searchFilter = (ITmfFilter) fTable.getData(Key.SEARCH_OBJ);\r
- if (searchFilter != null) {\r
- if (searchFilter.matches(event)) {\r
- searchMatch = true;\r
- } else {\r
- searchNoMatch = true;\r
- }\r
- }\r
- \r
- ColorSetting colorSetting = ColorSettingsManager.getColorSetting(event);\r
- if (searchNoMatch) {\r
- item.setForeground(colorSetting.getDimmedForegroundColor());\r
- item.setBackground(colorSetting.getDimmedBackgroundColor());\r
- } else {\r
- item.setForeground(colorSetting.getForegroundColor());\r
- item.setBackground(colorSetting.getBackgroundColor());\r
- }\r
- \r
- if (searchMatch) {\r
- if (bookmark) {\r
- item.setImage(SEARCH_MATCH_BOOKMARK_IMAGE);\r
- } else {\r
- item.setImage(SEARCH_MATCH_IMAGE);\r
- }\r
- } else if (bookmark) {\r
- item.setImage(BOOKMARK_IMAGE);\r
- } else {\r
- item.setImage((Image) null);\r
- }\r
+ item.setText(extractItemFields(event));\r
+ item.setData(Key.TIMESTAMP, new TmfTimestamp(event.getTimestamp()));\r
+ item.setData(Key.RANK, rank);\r
+\r
+ boolean bookmark = false;\r
+ if (fBookmarksMap.containsKey(rank)) {\r
+ bookmark = true;\r
+ }\r
+\r
+ boolean searchMatch = false;\r
+ boolean searchNoMatch = false;\r
+ ITmfFilter searchFilter = (ITmfFilter) fTable.getData(Key.SEARCH_OBJ);\r
+ if (searchFilter != null) {\r
+ if (searchFilter.matches(event)) {\r
+ searchMatch = true;\r
+ } else {\r
+ searchNoMatch = true;\r
+ }\r
+ }\r
+\r
+ ColorSetting colorSetting = ColorSettingsManager.getColorSetting(event);\r
+ if (searchNoMatch) {\r
+ item.setForeground(colorSetting.getDimmedForegroundColor());\r
+ item.setBackground(colorSetting.getDimmedBackgroundColor());\r
+ } else {\r
+ item.setForeground(colorSetting.getForegroundColor());\r
+ item.setBackground(colorSetting.getBackgroundColor());\r
+ }\r
+\r
+ if (searchMatch) {\r
+ if (bookmark) {\r
+ item.setImage(SEARCH_MATCH_BOOKMARK_IMAGE);\r
+ } else {\r
+ item.setImage(SEARCH_MATCH_IMAGE);\r
+ }\r
+ } else if (bookmark) {\r
+ item.setImage(BOOKMARK_IMAGE);\r
+ } else {\r
+ item.setImage((Image) null);\r
+ }\r
}\r
\r
protected void setHeaderRowItemData(TableItem item) {\r
}\r
}\r
}\r
- \r
+\r
protected void setFilterStatusRowItemData(TableItem item) {\r
- for (int i = 0; i < fTable.getColumns().length; i++) {\r
- if (i == 0) {\r
- if (fTrace == null || fFilterCheckCount == fTrace.getNbEvents()) {\r
- item.setImage(FILTER_IMAGE);\r
- } else {\r
- item.setImage(STOP_IMAGE);\r
- }\r
- item.setText(0, fFilterMatchCount + "/" + fFilterCheckCount); //$NON-NLS-1$\r
- } else {\r
- item.setText(i, ""); //$NON-NLS-1$\r
- }\r
- }\r
- item.setData(Key.TIMESTAMP, null);\r
- item.setData(Key.RANK, null);\r
- item.setForeground(null);\r
- item.setBackground(null);\r
+ for (int i = 0; i < fTable.getColumns().length; i++) {\r
+ if (i == 0) {\r
+ if (fTrace == null || fFilterCheckCount == fTrace.getNbEvents()) {\r
+ item.setImage(FILTER_IMAGE);\r
+ } else {\r
+ item.setImage(STOP_IMAGE);\r
+ }\r
+ item.setText(0, fFilterMatchCount + "/" + fFilterCheckCount); //$NON-NLS-1$\r
+ } else {\r
+ item.setText(i, ""); //$NON-NLS-1$\r
+ }\r
+ }\r
+ item.setData(Key.TIMESTAMP, null);\r
+ item.setData(Key.RANK, null);\r
+ item.setForeground(null);\r
+ item.setBackground(null);\r
}\r
- \r
+\r
protected void createHeaderEditor() {\r
- final TableEditor tableEditor = fTable.createTableEditor();\r
- tableEditor.horizontalAlignment = SWT.LEFT;\r
- tableEditor.verticalAlignment = SWT.CENTER;\r
- tableEditor.grabHorizontal = true;\r
- tableEditor.minimumWidth = 50;\r
+ final TableEditor tableEditor = fTable.createTableEditor();\r
+ tableEditor.horizontalAlignment = SWT.LEFT;\r
+ tableEditor.verticalAlignment = SWT.CENTER;\r
+ tableEditor.grabHorizontal = true;\r
+ tableEditor.minimumWidth = 50;\r
\r
// Handle the header row selection\r
fTable.addMouseListener(new MouseAdapter() {\r
- int columnIndex;\r
- TableColumn column;\r
- TableItem item;\r
- \r
- @Override\r
- public void mouseDown(MouseEvent event) {\r
- if (event.button != 1) {\r
- return;\r
- }\r
- // Identify the selected row\r
- Point point = new Point(event.x, event.y);\r
- item = fTable.getItem(point);\r
- \r
- // Header row selected\r
- if (item != null && fTable.indexOf(item) == 0) {\r
-\r
- // Icon selected\r
- if (item.getImageBounds(0).contains(point)) {\r
- if (fHeaderState == HeaderState.SEARCH) {\r
- fHeaderState = HeaderState.FILTER;\r
- } else if (fHeaderState == HeaderState.FILTER) {\r
- fHeaderState = HeaderState.SEARCH;\r
- }\r
- fTable.refresh();\r
- return;\r
- }\r
- \r
- // Identify the selected column\r
- columnIndex = -1;\r
- for (int i = 0; i < fTable.getColumns().length; i++) {\r
- Rectangle rect = item.getBounds(i);\r
- if (rect.contains(point)) {\r
- columnIndex = i;\r
- break;\r
- }\r
- }\r
- \r
- if (columnIndex == -1) {\r
- return;\r
- }\r
- \r
- column = fTable.getColumns()[columnIndex];\r
- \r
- String txtKey = null;\r
- if (fHeaderState == HeaderState.SEARCH) {\r
- txtKey = Key.SEARCH_TXT;\r
- } else if (fHeaderState == HeaderState.FILTER) {\r
- txtKey = Key.FILTER_TXT;\r
- }\r
- \r
- // The control that will be the editor must be a child of the Table\r
- final Text newEditor = (Text) fTable.createTableEditorControl(Text.class);\r
- String headerString = (String) column.getData(txtKey);\r
- if (headerString != null) {\r
- newEditor.setText(headerString);\r
- }\r
- newEditor.addFocusListener(new FocusAdapter() {\r
- @Override\r
- public void focusLost(FocusEvent e) {\r
- boolean changed = updateHeader(newEditor.getText());\r
- if (changed) {\r
- applyHeader();\r
- }\r
- }\r
- });\r
- newEditor.addKeyListener(new KeyAdapter() {\r
- @Override\r
- public void keyPressed(KeyEvent e) {\r
- if (e.character == SWT.CR) {\r
- updateHeader(newEditor.getText());\r
- applyHeader();\r
- } else if (e.character == SWT.ESC) {\r
- tableEditor.getEditor().dispose();\r
- }\r
- }\r
- });\r
- newEditor.selectAll();\r
- newEditor.setFocus();\r
- tableEditor.setEditor(newEditor, item, columnIndex);\r
- }\r
- }\r
- \r
- /*\r
- * returns true is value was changed\r
- */\r
- private boolean updateHeader(String text) {\r
- String objKey = null;\r
- String txtKey = null;\r
- if (fHeaderState == HeaderState.SEARCH) {\r
- objKey = Key.SEARCH_OBJ;\r
- txtKey = Key.SEARCH_TXT;\r
- } else if (fHeaderState == HeaderState.FILTER) {\r
- objKey = Key.FILTER_OBJ;\r
- txtKey = Key.FILTER_TXT;\r
- }\r
- if (text.trim().length() > 0) {\r
- try {\r
- String regex = TmfFilterMatchesNode.regexFix(text);\r
- Pattern.compile(regex);\r
- if (regex.equals(column.getData(txtKey))) {\r
- tableEditor.getEditor().dispose();\r
- return false;\r
- }\r
- TmfFilterMatchesNode filter = new TmfFilterMatchesNode(null);\r
- String fieldId = (String) column.getData(Key.FIELD_ID);\r
- if (fieldId == null) {\r
- fieldId = column.getText();\r
- }\r
- filter.setField(fieldId);\r
- filter.setRegex(regex);\r
- column.setData(objKey, filter);\r
- column.setData(txtKey, regex);\r
- } catch (PatternSyntaxException ex) {\r
- tableEditor.getEditor().dispose();\r
- MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), ex.getDescription(), ex.getMessage());\r
- return false;\r
- }\r
- } else {\r
- if (column.getData(txtKey) == null) {\r
- tableEditor.getEditor().dispose();\r
- return false;\r
- }\r
- column.setData(objKey, null);\r
- column.setData(txtKey, null);\r
- }\r
- return true;\r
- }\r
- \r
- private void applyHeader() {\r
- stopSearchThread();\r
- if (fHeaderState == HeaderState.SEARCH) {\r
- final TmfFilterAndNode filter = new TmfFilterAndNode(null);\r
- for (TableColumn column : fTable.getColumns()) {\r
- Object filterObj = column.getData(Key.SEARCH_OBJ);\r
- if (filterObj instanceof ITmfFilterTreeNode) {\r
- filter.addChild((ITmfFilterTreeNode) filterObj);\r
- }\r
- }\r
- if (filter.getChildrenCount() > 0) {\r
- fTable.setData(Key.SEARCH_OBJ, filter);\r
- fTable.refresh();\r
- searchNext();\r
- fireSearchApplied(filter);\r
- } else {\r
- fTable.setData(Key.SEARCH_OBJ, null);\r
- fTable.refresh();\r
- fireSearchApplied(null);\r
- }\r
- } else if (fHeaderState == HeaderState.FILTER) {\r
- stopFilterThread();\r
- fFilterMatchCount = 0;\r
- fFilterCheckCount = 0;\r
- TmfFilterAndNode filter = new TmfFilterAndNode(null);\r
- for (TableColumn column : fTable.getColumns()) {\r
- Object filterObj = column.getData(Key.FILTER_OBJ);\r
- if (filterObj instanceof ITmfFilterTreeNode) {\r
- filter.addChild((ITmfFilterTreeNode) filterObj);\r
- }\r
- }\r
- if (filter.getChildrenCount() > 0) {\r
- fCache.applyFilter(filter);\r
- fTable.clearAll();\r
- fTable.setData(Key.FILTER_OBJ, filter);\r
- fTable.setItemCount(3); // +1 for header row, +2 for top and bottom filter status rows\r
- startFilterThread();\r
- fireFilterApplied(filter);\r
- } else {\r
- fCache.clearFilter();\r
- stopFilterThread();\r
- fTable.clearAll();\r
- fTable.setData(Key.FILTER_OBJ, null);\r
- if (fTrace != null) {\r
- fTable.setItemCount((int) fTrace.getNbEvents() + 1); // +1 for header row\r
- } else {\r
- fTable.setItemCount(1); // +1 for header row\r
- }\r
- fireFilterApplied(null);\r
- }\r
- }\r
- \r
- tableEditor.getEditor().dispose();\r
- }\r
+ int columnIndex;\r
+ TableColumn column;\r
+ TableItem item;\r
+\r
+ @Override\r
+ public void mouseDown(MouseEvent event) {\r
+ if (event.button != 1) {\r
+ return;\r
+ }\r
+ // Identify the selected row\r
+ Point point = new Point(event.x, event.y);\r
+ item = fTable.getItem(point);\r
+\r
+ // Header row selected\r
+ if (item != null && fTable.indexOf(item) == 0) {\r
+\r
+ // Icon selected\r
+ if (item.getImageBounds(0).contains(point)) {\r
+ if (fHeaderState == HeaderState.SEARCH) {\r
+ fHeaderState = HeaderState.FILTER;\r
+ } else if (fHeaderState == HeaderState.FILTER) {\r
+ fHeaderState = HeaderState.SEARCH;\r
+ }\r
+ fTable.refresh();\r
+ return;\r
+ }\r
+\r
+ // Identify the selected column\r
+ columnIndex = -1;\r
+ for (int i = 0; i < fTable.getColumns().length; i++) {\r
+ Rectangle rect = item.getBounds(i);\r
+ if (rect.contains(point)) {\r
+ columnIndex = i;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (columnIndex == -1) {\r
+ return;\r
+ }\r
+\r
+ column = fTable.getColumns()[columnIndex];\r
+\r
+ String txtKey = null;\r
+ if (fHeaderState == HeaderState.SEARCH) {\r
+ txtKey = Key.SEARCH_TXT;\r
+ } else if (fHeaderState == HeaderState.FILTER) {\r
+ txtKey = Key.FILTER_TXT;\r
+ }\r
+\r
+ // The control that will be the editor must be a child of the Table\r
+ final Text newEditor = (Text) fTable.createTableEditorControl(Text.class);\r
+ String headerString = (String) column.getData(txtKey);\r
+ if (headerString != null) {\r
+ newEditor.setText(headerString);\r
+ }\r
+ newEditor.addFocusListener(new FocusAdapter() {\r
+ @Override\r
+ public void focusLost(FocusEvent e) {\r
+ boolean changed = updateHeader(newEditor.getText());\r
+ if (changed) {\r
+ applyHeader();\r
+ }\r
+ }\r
+ });\r
+ newEditor.addKeyListener(new KeyAdapter() {\r
+ @Override\r
+ public void keyPressed(KeyEvent e) {\r
+ if (e.character == SWT.CR) {\r
+ updateHeader(newEditor.getText());\r
+ applyHeader();\r
+ } else if (e.character == SWT.ESC) {\r
+ tableEditor.getEditor().dispose();\r
+ }\r
+ }\r
+ });\r
+ newEditor.selectAll();\r
+ newEditor.setFocus();\r
+ tableEditor.setEditor(newEditor, item, columnIndex);\r
+ }\r
+ }\r
+\r
+ /*\r
+ * returns true is value was changed\r
+ */\r
+ private boolean updateHeader(String text) {\r
+ String objKey = null;\r
+ String txtKey = null;\r
+ if (fHeaderState == HeaderState.SEARCH) {\r
+ objKey = Key.SEARCH_OBJ;\r
+ txtKey = Key.SEARCH_TXT;\r
+ } else if (fHeaderState == HeaderState.FILTER) {\r
+ objKey = Key.FILTER_OBJ;\r
+ txtKey = Key.FILTER_TXT;\r
+ }\r
+ if (text.trim().length() > 0) {\r
+ try {\r
+ String regex = TmfFilterMatchesNode.regexFix(text);\r
+ Pattern.compile(regex);\r
+ if (regex.equals(column.getData(txtKey))) {\r
+ tableEditor.getEditor().dispose();\r
+ return false;\r
+ }\r
+ TmfFilterMatchesNode filter = new TmfFilterMatchesNode(null);\r
+ String fieldId = (String) column.getData(Key.FIELD_ID);\r
+ if (fieldId == null) {\r
+ fieldId = column.getText();\r
+ }\r
+ filter.setField(fieldId);\r
+ filter.setRegex(regex);\r
+ column.setData(objKey, filter);\r
+ column.setData(txtKey, regex);\r
+ } catch (PatternSyntaxException ex) {\r
+ tableEditor.getEditor().dispose();\r
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),\r
+ ex.getDescription(), ex.getMessage());\r
+ return false;\r
+ }\r
+ } else {\r
+ if (column.getData(txtKey) == null) {\r
+ tableEditor.getEditor().dispose();\r
+ return false;\r
+ }\r
+ column.setData(objKey, null);\r
+ column.setData(txtKey, null);\r
+ }\r
+ return true;\r
+ }\r
+\r
+ private void applyHeader() {\r
+ stopSearchThread();\r
+ if (fHeaderState == HeaderState.SEARCH) {\r
+ final TmfFilterAndNode filter = new TmfFilterAndNode(null);\r
+ for (TableColumn column : fTable.getColumns()) {\r
+ Object filterObj = column.getData(Key.SEARCH_OBJ);\r
+ if (filterObj instanceof ITmfFilterTreeNode) {\r
+ filter.addChild((ITmfFilterTreeNode) filterObj);\r
+ }\r
+ }\r
+ if (filter.getChildrenCount() > 0) {\r
+ fTable.setData(Key.SEARCH_OBJ, filter);\r
+ fTable.refresh();\r
+ searchNext();\r
+ fireSearchApplied(filter);\r
+ } else {\r
+ fTable.setData(Key.SEARCH_OBJ, null);\r
+ fTable.refresh();\r
+ fireSearchApplied(null);\r
+ }\r
+ } else if (fHeaderState == HeaderState.FILTER) {\r
+ stopFilterThread();\r
+ fFilterMatchCount = 0;\r
+ fFilterCheckCount = 0;\r
+ TmfFilterAndNode filter = new TmfFilterAndNode(null);\r
+ for (TableColumn column : fTable.getColumns()) {\r
+ Object filterObj = column.getData(Key.FILTER_OBJ);\r
+ if (filterObj instanceof ITmfFilterTreeNode) {\r
+ filter.addChild((ITmfFilterTreeNode) filterObj);\r
+ }\r
+ }\r
+ if (filter.getChildrenCount() > 0) {\r
+ fCache.applyFilter(filter);\r
+ fTable.clearAll();\r
+ fTable.setData(Key.FILTER_OBJ, filter);\r
+ fTable.setItemCount(3); // +1 for header row, +2 for top and bottom filter status rows\r
+ startFilterThread();\r
+ fireFilterApplied(filter);\r
+ } else {\r
+ fCache.clearFilter();\r
+ stopFilterThread();\r
+ fTable.clearAll();\r
+ fTable.setData(Key.FILTER_OBJ, null);\r
+ if (fTrace != null) {\r
+ fTable.setItemCount((int) fTrace.getNbEvents() + 1); // +1 for header row\r
+ } else {\r
+ fTable.setItemCount(1); // +1 for header row\r
+ }\r
+ fireFilterApplied(null);\r
+ }\r
+ }\r
+\r
+ tableEditor.getEditor().dispose();\r
+ }\r
});\r
- \r
+\r
fTable.addKeyListener(new KeyAdapter() {\r
- @Override\r
- public void keyPressed(KeyEvent e) {\r
- e.doit = false;\r
- if (e.character == SWT.ESC) {\r
- stopFilterThread();\r
- stopSearchThread();\r
- fTable.refresh();\r
- } else if (e.character == SWT.DEL) {\r
- stopFilterThread();\r
- stopSearchThread();\r
- if (fHeaderState == HeaderState.SEARCH) {\r
- for (TableColumn column : fTable.getColumns()) {\r
- column.setData(Key.SEARCH_OBJ, null);\r
- column.setData(Key.SEARCH_TXT, null);\r
- }\r
- fTable.setData(Key.SEARCH_OBJ, null);\r
- fTable.refresh();\r
- fireSearchApplied(null);\r
- } else if (fHeaderState == HeaderState.FILTER) {\r
- clearFilters();\r
- }\r
- } else if (e.character == SWT.CR) {\r
- if ((e.stateMask & SWT.SHIFT) == 0) {\r
- searchNext();\r
- } else {\r
- searchPrevious();\r
- }\r
- }\r
- }\r
+ @Override\r
+ public void keyPressed(KeyEvent e) {\r
+ e.doit = false;\r
+ if (e.character == SWT.ESC) {\r
+ stopFilterThread();\r
+ stopSearchThread();\r
+ fTable.refresh();\r
+ } else if (e.character == SWT.DEL) {\r
+ stopFilterThread();\r
+ stopSearchThread();\r
+ if (fHeaderState == HeaderState.SEARCH) {\r
+ for (TableColumn column : fTable.getColumns()) {\r
+ column.setData(Key.SEARCH_OBJ, null);\r
+ column.setData(Key.SEARCH_TXT, null);\r
+ }\r
+ fTable.setData(Key.SEARCH_OBJ, null);\r
+ fTable.refresh();\r
+ fireSearchApplied(null);\r
+ } else if (fHeaderState == HeaderState.FILTER) {\r
+ clearFilters();\r
+ }\r
+ } else if (e.character == SWT.CR) {\r
+ if ((e.stateMask & SWT.SHIFT) == 0) {\r
+ searchNext();\r
+ } else {\r
+ searchPrevious();\r
+ }\r
+ }\r
+ }\r
});\r
- }\r
+ }\r
\r
protected void fireFilterApplied(ITmfFilter filter) {\r
for (ITmfEventsFilterListener listener : fEventsFilterListeners) {\r
listener.filterApplied(filter, fTrace);\r
}\r
}\r
- \r
+\r
protected void fireSearchApplied(ITmfFilter filter) {\r
for (ITmfEventsFilterListener listener : fEventsFilterListeners) {\r
listener.searchApplied(filter, fTrace);\r
}\r
}\r
- \r
+\r
protected void startFilterThread() {\r
- synchronized (fFilterSyncObj) {\r
- if (fFilterThread != null) {\r
- fFilterThread.cancel();\r
- }\r
- final ITmfFilterTreeNode filter = (ITmfFilterTreeNode) fTable.getData(Key.FILTER_OBJ);\r
- fFilterThread = new FilterThread(filter);\r
- fFilterThread.start();\r
- }\r
+ synchronized (fFilterSyncObj) {\r
+ if (fFilterThread != null) {\r
+ fFilterThread.cancel();\r
+ }\r
+ final ITmfFilterTreeNode filter = (ITmfFilterTreeNode) fTable.getData(Key.FILTER_OBJ);\r
+ fFilterThread = new FilterThread(filter);\r
+ fFilterThread.start();\r
+ }\r
}\r
\r
protected void stopFilterThread() {\r
- synchronized (fFilterSyncObj) {\r
- if (fFilterThread != null) {\r
- fFilterThread.cancel();\r
- }\r
- }\r
+ synchronized (fFilterSyncObj) {\r
+ if (fFilterThread != null) {\r
+ fFilterThread.cancel();\r
+ }\r
+ }\r
}\r
\r
protected void clearFilters() {\r
- if (fTable.getData(Key.FILTER_OBJ) == null) {\r
- return;\r
- }\r
- fCache.clearFilter();\r
- fTable.clearAll();\r
- for (TableColumn column : fTable.getColumns()) {\r
- column.setData(Key.FILTER_OBJ, null);\r
- column.setData(Key.FILTER_TXT, null);\r
- }\r
- fTable.setData(Key.FILTER_OBJ, null);\r
- if (fTrace != null) {\r
- fTable.setItemCount((int) fTrace.getNbEvents() + 1); // +1 for header row\r
- } else {\r
- fTable.setItemCount(1); // +1 for header row\r
- }\r
- fFilterMatchCount = 0;\r
- fFilterCheckCount = 0;\r
- if (fSelectedRank >= 0) {\r
- fTable.setSelection((int) fSelectedRank + 1); // +1 for header row\r
- } else {\r
- fTable.setSelection(0);\r
- }\r
- fireFilterApplied(null);\r
+ if (fTable.getData(Key.FILTER_OBJ) == null) {\r
+ return;\r
+ }\r
+ fCache.clearFilter();\r
+ fTable.clearAll();\r
+ for (TableColumn column : fTable.getColumns()) {\r
+ column.setData(Key.FILTER_OBJ, null);\r
+ column.setData(Key.FILTER_TXT, null);\r
+ }\r
+ fTable.setData(Key.FILTER_OBJ, null);\r
+ if (fTrace != null) {\r
+ fTable.setItemCount((int) fTrace.getNbEvents() + 1); // +1 for header row\r
+ } else {\r
+ fTable.setItemCount(1); // +1 for header row\r
+ }\r
+ fFilterMatchCount = 0;\r
+ fFilterCheckCount = 0;\r
+ if (fSelectedRank >= 0) {\r
+ fTable.setSelection((int) fSelectedRank + 1); // +1 for header row\r
+ } else {\r
+ fTable.setSelection(0);\r
+ }\r
+ fireFilterApplied(null);\r
}\r
- \r
+\r
protected class FilterThread extends Thread {\r
- private final ITmfFilterTreeNode filter;\r
- private TmfEventRequest<TmfEvent> request;\r
+ private final ITmfFilterTreeNode filter;\r
+ private TmfEventRequest<TmfEvent> request;\r
private boolean refreshBusy = false;\r
private boolean refreshPending = false;\r
private Object syncObj = new Object();\r
\r
- public FilterThread(ITmfFilterTreeNode filter) {\r
- super("Filter Thread"); //$NON-NLS-1$\r
- this.filter = filter;\r
- }\r
-\r
- @SuppressWarnings("unchecked")\r
- @Override\r
- public void run() {\r
- if (fTrace == null) {\r
- return;\r
- }\r
- int nbRequested = (int) (fTrace.getNbEvents() - fFilterCheckCount);\r
- if (nbRequested <= 0) {\r
- return;\r
- }\r
- request = new TmfEventRequest<TmfEvent>(TmfEvent.class, TmfTimeRange.Eternity, (int) fFilterCheckCount, nbRequested, fTrace.getCacheSize(), ExecutionType.BACKGROUND) {\r
- @Override\r
- public void handleData(TmfEvent event) {\r
- super.handleData(event);\r
- if (request.isCancelled()) return;\r
- if (filter.matches(event)) {\r
- long rank = fFilterCheckCount;\r
- int index = (int) fFilterMatchCount;\r
- fFilterMatchCount++;\r
- fCache.storeEvent(event.clone(), rank, index);\r
- refreshTable();\r
- } else if (fFilterCheckCount % 100 == 0) {\r
- refreshTable();\r
- }\r
- fFilterCheckCount++;\r
- }\r
- };\r
- ((ITmfDataProvider<TmfEvent>) fTrace).sendRequest(request);\r
- try {\r
- request.waitForCompletion();\r
- } catch (InterruptedException e) {\r
- }\r
- refreshTable();\r
- }\r
- \r
- public void refreshTable() {\r
- synchronized (syncObj) {\r
- if (refreshBusy) {\r
- refreshPending = true;\r
- return;\r
- } else {\r
- refreshBusy = true;\r
- }\r
- }\r
- Display.getDefault().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- if (request.isCancelled()) return;\r
- if (fTable.isDisposed()) return;\r
- fTable.setItemCount((int) fFilterMatchCount + 3); // +1 for header row, +2 for top and bottom filter status rows\r
- fTable.refresh();\r
- synchronized (syncObj) {\r
- refreshBusy = false;\r
- if (refreshPending) {\r
- refreshPending = false;\r
- refreshTable();\r
- }\r
- }\r
- }\r
- });\r
- }\r
-\r
- public void cancel() {\r
- if (request != null) {\r
- request.cancel();\r
- }\r
- }\r
+ public FilterThread(ITmfFilterTreeNode filter) {\r
+ super("Filter Thread"); //$NON-NLS-1$\r
+ this.filter = filter;\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public void run() {\r
+ if (fTrace == null) {\r
+ return;\r
+ }\r
+ int nbRequested = (int) (fTrace.getNbEvents() - fFilterCheckCount);\r
+ if (nbRequested <= 0) {\r
+ return;\r
+ }\r
+ request = new TmfEventRequest<TmfEvent>(TmfEvent.class, TmfTimeRange.Eternity, (int) fFilterCheckCount,\r
+ nbRequested, fTrace.getCacheSize(), ExecutionType.BACKGROUND) {\r
+ @Override\r
+ public void handleData(TmfEvent event) {\r
+ super.handleData(event);\r
+ if (request.isCancelled())\r
+ return;\r
+ if (filter.matches(event)) {\r
+ long rank = fFilterCheckCount;\r
+ int index = (int) fFilterMatchCount;\r
+ fFilterMatchCount++;\r
+ fCache.storeEvent(event.clone(), rank, index);\r
+ refreshTable();\r
+ } else if (fFilterCheckCount % 100 == 0) {\r
+ refreshTable();\r
+ }\r
+ fFilterCheckCount++;\r
+ }\r
+ };\r
+ ((ITmfDataProvider<TmfEvent>) fTrace).sendRequest(request);\r
+ try {\r
+ request.waitForCompletion();\r
+ } catch (InterruptedException e) {\r
+ }\r
+ refreshTable();\r
+ }\r
+\r
+ public void refreshTable() {\r
+ synchronized (syncObj) {\r
+ if (refreshBusy) {\r
+ refreshPending = true;\r
+ return;\r
+ } else {\r
+ refreshBusy = true;\r
+ }\r
+ }\r
+ Display.getDefault().asyncExec(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ if (request.isCancelled())\r
+ return;\r
+ if (fTable.isDisposed())\r
+ return;\r
+ fTable.setItemCount((int) fFilterMatchCount + 3); // +1 for header row, +2 for top and bottom filter\r
+ // status rows\r
+ fTable.refresh();\r
+ synchronized (syncObj) {\r
+ refreshBusy = false;\r
+ if (refreshPending) {\r
+ refreshPending = false;\r
+ refreshTable();\r
+ }\r
+ }\r
+ }\r
+ });\r
+ }\r
+\r
+ public void cancel() {\r
+ if (request != null) {\r
+ request.cancel();\r
+ }\r
+ }\r
}\r
\r
protected void searchNext() {\r
- synchronized (fSearchSyncObj) {\r
- if (fSearchThread != null) {\r
- return;\r
- }\r
- final ITmfFilterTreeNode searchFilter = (ITmfFilterTreeNode) fTable.getData(Key.SEARCH_OBJ);\r
- if (searchFilter == null) {\r
- return;\r
- }\r
- int selectionIndex = fTable.getSelectionIndex();\r
- int startIndex;\r
- if (selectionIndex > 0) {\r
- startIndex = selectionIndex; // -1 for header row, +1 for next event\r
- } else {\r
- // header row is selected, start at top event\r
- startIndex = Math.max(0, fTable.getTopIndex() - 1); // -1 for header row\r
- }\r
- final ITmfFilterTreeNode eventFilter = (ITmfFilterTreeNode) fTable.getData(Key.FILTER_OBJ);\r
- if (eventFilter != null) {\r
- startIndex = Math.max(0, startIndex - 1); // -1 for top filter status row\r
- }\r
- fSearchThread = new SearchThread(searchFilter, eventFilter, startIndex, fSelectedRank, Direction.FORWARD);\r
- fSearchThread.schedule();\r
- }\r
+ synchronized (fSearchSyncObj) {\r
+ if (fSearchThread != null) {\r
+ return;\r
+ }\r
+ final ITmfFilterTreeNode searchFilter = (ITmfFilterTreeNode) fTable.getData(Key.SEARCH_OBJ);\r
+ if (searchFilter == null) {\r
+ return;\r
+ }\r
+ int selectionIndex = fTable.getSelectionIndex();\r
+ int startIndex;\r
+ if (selectionIndex > 0) {\r
+ startIndex = selectionIndex; // -1 for header row, +1 for next event\r
+ } else {\r
+ // header row is selected, start at top event\r
+ startIndex = Math.max(0, fTable.getTopIndex() - 1); // -1 for header row\r
+ }\r
+ final ITmfFilterTreeNode eventFilter = (ITmfFilterTreeNode) fTable.getData(Key.FILTER_OBJ);\r
+ if (eventFilter != null) {\r
+ startIndex = Math.max(0, startIndex - 1); // -1 for top filter status row\r
+ }\r
+ fSearchThread = new SearchThread(searchFilter, eventFilter, startIndex, fSelectedRank, Direction.FORWARD);\r
+ fSearchThread.schedule();\r
+ }\r
}\r
- \r
+\r
protected void searchPrevious() {\r
- synchronized (fSearchSyncObj) {\r
- if (fSearchThread != null) {\r
- return;\r
- }\r
- final ITmfFilterTreeNode searchFilter = (ITmfFilterTreeNode) fTable.getData(Key.SEARCH_OBJ);\r
- if (searchFilter == null) {\r
- return;\r
- }\r
- int selectionIndex = fTable.getSelectionIndex();\r
- int startIndex;\r
- if (selectionIndex > 0) {\r
- startIndex = selectionIndex - 2; // -1 for header row, -1 for previous event\r
- } else {\r
- // header row is selected, start at precedent of top event\r
- startIndex = fTable.getTopIndex() - 2; // -1 for header row, -1 for previous event\r
- }\r
- final ITmfFilterTreeNode eventFilter = (ITmfFilterTreeNode) fTable.getData(Key.FILTER_OBJ);\r
- if (eventFilter != null) {\r
- startIndex = startIndex - 1; // -1 for top filter status row\r
- }\r
- fSearchThread = new SearchThread(searchFilter, eventFilter, startIndex, fSelectedRank, Direction.BACKWARD);\r
- fSearchThread.schedule();\r
- }\r
+ synchronized (fSearchSyncObj) {\r
+ if (fSearchThread != null) {\r
+ return;\r
+ }\r
+ final ITmfFilterTreeNode searchFilter = (ITmfFilterTreeNode) fTable.getData(Key.SEARCH_OBJ);\r
+ if (searchFilter == null) {\r
+ return;\r
+ }\r
+ int selectionIndex = fTable.getSelectionIndex();\r
+ int startIndex;\r
+ if (selectionIndex > 0) {\r
+ startIndex = selectionIndex - 2; // -1 for header row, -1 for previous event\r
+ } else {\r
+ // header row is selected, start at precedent of top event\r
+ startIndex = fTable.getTopIndex() - 2; // -1 for header row, -1 for previous event\r
+ }\r
+ final ITmfFilterTreeNode eventFilter = (ITmfFilterTreeNode) fTable.getData(Key.FILTER_OBJ);\r
+ if (eventFilter != null) {\r
+ startIndex = startIndex - 1; // -1 for top filter status row\r
+ }\r
+ fSearchThread = new SearchThread(searchFilter, eventFilter, startIndex, fSelectedRank, Direction.BACKWARD);\r
+ fSearchThread.schedule();\r
+ }\r
}\r
- \r
+\r
protected void stopSearchThread() {\r
- fPendingGotoRank = -1;\r
- synchronized (fSearchSyncObj) {\r
- if (fSearchThread != null) {\r
- fSearchThread.cancel();\r
- fSearchThread = null;\r
- }\r
- }\r
+ fPendingGotoRank = -1;\r
+ synchronized (fSearchSyncObj) {\r
+ if (fSearchThread != null) {\r
+ fSearchThread.cancel();\r
+ fSearchThread = null;\r
+ }\r
+ }\r
}\r
- \r
+\r
protected class SearchThread extends Job {\r
- protected ITmfFilterTreeNode searchFilter;\r
- protected ITmfFilterTreeNode eventFilter;\r
- protected int startIndex;\r
- protected int direction;\r
- protected long rank;\r
- protected long foundRank = -1;\r
- protected TmfDataRequest<TmfEvent> request;\r
-\r
- public SearchThread(ITmfFilterTreeNode searchFilter, ITmfFilterTreeNode eventFilter, int startIndex, long currentRank, int direction) {\r
- super(Messages.TmfEventsTable_SearchingJobName);\r
- this.searchFilter = searchFilter;\r
- this.eventFilter = eventFilter;\r
- this.startIndex = startIndex;\r
- this.rank = currentRank;\r
- this.direction = direction;\r
- }\r
-\r
- @SuppressWarnings("unchecked")\r
- @Override\r
- protected IStatus run(final IProgressMonitor monitor) {\r
- if (fTrace == null) {\r
- return Status.OK_STATUS;\r
- }\r
- final Display display = Display.getDefault();\r
- if (startIndex < 0) {\r
- rank = (int) fTrace.getNbEvents() - 1;\r
- } else if (startIndex >= fTable.getItemCount() - (eventFilter == null ? 1 : 3)) { // -1 for header row, -2 for top and bottom filter status rows\r
- rank = 0;\r
- } else {\r
- int idx = startIndex;\r
- while (foundRank == -1) {\r
- CachedEvent event = fCache.peekEvent(idx);\r
- if (event == null) {\r
- break;\r
- }\r
- rank = event.rank;\r
- if (searchFilter.matches(event.event) && (eventFilter == null || eventFilter.matches(event.event))) {\r
- foundRank = event.rank;\r
- break;\r
- }\r
- if (direction == Direction.FORWARD) {\r
- idx++;\r
- } else {\r
- idx--;\r
- }\r
- }\r
- if (foundRank == -1) {\r
- if (direction == Direction.FORWARD) {\r
- rank++;\r
- if (rank > fTrace.getNbEvents() - 1) {\r
- rank = 0;\r
- }\r
- } else {\r
- rank--;\r
- if (rank < 0) {\r
- rank = (int) fTrace.getNbEvents() - 1;\r
- }\r
- }\r
- }\r
- }\r
- int startRank = (int) rank;\r
- boolean wrapped = false;\r
- while (!monitor.isCanceled() && foundRank == -1 && fTrace != null) {\r
- int nbRequested = (direction == Direction.FORWARD ? Integer.MAX_VALUE : Math.min((int) rank + 1, fTrace.getCacheSize()));\r
- if (direction == Direction.BACKWARD) {\r
- rank = Math.max(0, rank - fTrace.getCacheSize() + 1);\r
- }\r
- request = new TmfDataRequest<TmfEvent>(TmfEvent.class, (int) rank, nbRequested) {\r
- long currentRank = rank;\r
- @Override\r
- public void handleData(TmfEvent event) {\r
- super.handleData(event);\r
- if (searchFilter.matches(event) && (eventFilter == null || eventFilter.matches(event))) {\r
- foundRank = currentRank;\r
- if (direction == Direction.FORWARD) {\r
- done();\r
- return;\r
- }\r
- }\r
- currentRank++;\r
- }\r
- };\r
- ((ITmfDataProvider<TmfEvent>) fTrace).sendRequest(request);\r
- try {\r
- request.waitForCompletion();\r
- if (request.isCancelled()) {\r
- return Status.OK_STATUS;\r
- }\r
- } catch (InterruptedException e) {\r
- synchronized (fSearchSyncObj) {\r
- fSearchThread = null;\r
- }\r
- return Status.OK_STATUS;\r
- }\r
- if (foundRank == -1) {\r
- if (direction == Direction.FORWARD) {\r
- if (rank == 0) {\r
- synchronized (fSearchSyncObj) {\r
- fSearchThread = null;\r
- }\r
- return Status.OK_STATUS;\r
- } else {\r
- nbRequested = (int) rank;\r
- rank = 0;\r
- wrapped = true;\r
- }\r
- } else {\r
- rank--;\r
- if (rank < 0) {\r
- rank = (int) fTrace.getNbEvents() - 1;\r
- wrapped = true;\r
- }\r
- if (rank <= startRank && wrapped) {\r
- synchronized (fSearchSyncObj) {\r
- fSearchThread = null;\r
- }\r
- return Status.OK_STATUS;\r
- }\r
- }\r
- }\r
- }\r
- int index = (int) foundRank;\r
- if (eventFilter != null) {\r
- index = fCache.getFilteredEventIndex(foundRank);\r
- }\r
- final int selection = (int) index + 1 + (eventFilter != null ? +1 : 0); // +1 for header row, +1 for top filter status row\r
-\r
- display.asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- if (monitor.isCanceled()) return;\r
- if (fTable.isDisposed()) return;\r
- fTable.setSelection(selection);\r
- fSelectedRank = foundRank;\r
- synchronized (fSearchSyncObj) {\r
- fSearchThread = null;\r
- }\r
- }\r
- });\r
- return Status.OK_STATUS;\r
- }\r
-\r
- @Override\r
- protected void canceling() {\r
- request.cancel();\r
- synchronized (fSearchSyncObj) {\r
- fSearchThread = null;\r
- }\r
- }\r
+ protected ITmfFilterTreeNode searchFilter;\r
+ protected ITmfFilterTreeNode eventFilter;\r
+ protected int startIndex;\r
+ protected int direction;\r
+ protected long rank;\r
+ protected long foundRank = -1;\r
+ protected TmfDataRequest<TmfEvent> request;\r
+\r
+ public SearchThread(ITmfFilterTreeNode searchFilter, ITmfFilterTreeNode eventFilter, int startIndex,\r
+ long currentRank, int direction) {\r
+ super(Messages.TmfEventsTable_SearchingJobName);\r
+ this.searchFilter = searchFilter;\r
+ this.eventFilter = eventFilter;\r
+ this.startIndex = startIndex;\r
+ this.rank = currentRank;\r
+ this.direction = direction;\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ protected IStatus run(final IProgressMonitor monitor) {\r
+ if (fTrace == null) {\r
+ return Status.OK_STATUS;\r
+ }\r
+ final Display display = Display.getDefault();\r
+ if (startIndex < 0) {\r
+ rank = (int) fTrace.getNbEvents() - 1;\r
+ } else if (startIndex >= fTable.getItemCount() - (eventFilter == null ? 1 : 3)) { // -1 for header row, -2\r
+ // for top and bottom\r
+ // filter status rows\r
+ rank = 0;\r
+ } else {\r
+ int idx = startIndex;\r
+ while (foundRank == -1) {\r
+ CachedEvent event = fCache.peekEvent(idx);\r
+ if (event == null) {\r
+ break;\r
+ }\r
+ rank = event.rank;\r
+ if (searchFilter.matches(event.event) && (eventFilter == null || eventFilter.matches(event.event))) {\r
+ foundRank = event.rank;\r
+ break;\r
+ }\r
+ if (direction == Direction.FORWARD) {\r
+ idx++;\r
+ } else {\r
+ idx--;\r
+ }\r
+ }\r
+ if (foundRank == -1) {\r
+ if (direction == Direction.FORWARD) {\r
+ rank++;\r
+ if (rank > fTrace.getNbEvents() - 1) {\r
+ rank = 0;\r
+ }\r
+ } else {\r
+ rank--;\r
+ if (rank < 0) {\r
+ rank = (int) fTrace.getNbEvents() - 1;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ int startRank = (int) rank;\r
+ boolean wrapped = false;\r
+ while (!monitor.isCanceled() && foundRank == -1 && fTrace != null) {\r
+ int nbRequested = (direction == Direction.FORWARD ? Integer.MAX_VALUE : Math.min((int) rank + 1,\r
+ fTrace.getCacheSize()));\r
+ if (direction == Direction.BACKWARD) {\r
+ rank = Math.max(0, rank - fTrace.getCacheSize() + 1);\r
+ }\r
+ request = new TmfDataRequest<TmfEvent>(TmfEvent.class, (int) rank, nbRequested) {\r
+ long currentRank = rank;\r
+\r
+ @Override\r
+ public void handleData(TmfEvent event) {\r
+ super.handleData(event);\r
+ if (searchFilter.matches(event) && (eventFilter == null || eventFilter.matches(event))) {\r
+ foundRank = currentRank;\r
+ if (direction == Direction.FORWARD) {\r
+ done();\r
+ return;\r
+ }\r
+ }\r
+ currentRank++;\r
+ }\r
+ };\r
+ ((ITmfDataProvider<TmfEvent>) fTrace).sendRequest(request);\r
+ try {\r
+ request.waitForCompletion();\r
+ if (request.isCancelled()) {\r
+ return Status.OK_STATUS;\r
+ }\r
+ } catch (InterruptedException e) {\r
+ synchronized (fSearchSyncObj) {\r
+ fSearchThread = null;\r
+ }\r
+ return Status.OK_STATUS;\r
+ }\r
+ if (foundRank == -1) {\r
+ if (direction == Direction.FORWARD) {\r
+ if (rank == 0) {\r
+ synchronized (fSearchSyncObj) {\r
+ fSearchThread = null;\r
+ }\r
+ return Status.OK_STATUS;\r
+ } else {\r
+ nbRequested = (int) rank;\r
+ rank = 0;\r
+ wrapped = true;\r
+ }\r
+ } else {\r
+ rank--;\r
+ if (rank < 0) {\r
+ rank = (int) fTrace.getNbEvents() - 1;\r
+ wrapped = true;\r
+ }\r
+ if (rank <= startRank && wrapped) {\r
+ synchronized (fSearchSyncObj) {\r
+ fSearchThread = null;\r
+ }\r
+ return Status.OK_STATUS;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ int index = (int) foundRank;\r
+ if (eventFilter != null) {\r
+ index = fCache.getFilteredEventIndex(foundRank);\r
+ }\r
+ final int selection = index + 1 + (eventFilter != null ? +1 : 0); // +1 for header row, +1 for top filter\r
+ // status row\r
+\r
+ display.asyncExec(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ if (monitor.isCanceled())\r
+ return;\r
+ if (fTable.isDisposed())\r
+ return;\r
+ fTable.setSelection(selection);\r
+ fSelectedRank = foundRank;\r
+ synchronized (fSearchSyncObj) {\r
+ fSearchThread = null;\r
+ }\r
+ }\r
+ });\r
+ return Status.OK_STATUS;\r
+ }\r
+\r
+ @Override\r
+ protected void canceling() {\r
+ request.cancel();\r
+ synchronized (fSearchSyncObj) {\r
+ fSearchThread = null;\r
+ }\r
+ }\r
}\r
\r
protected void createResources() {\r
- fGrayColor = fResourceManager.createColor(ColorUtil.blend(fTable.getBackground().getRGB(), fTable.getForeground().getRGB()));\r
- fGreenColor = fTable.getDisplay().getSystemColor(SWT.COLOR_DARK_GREEN);\r
- fBoldFont = fResourceManager.createFont(FontDescriptor.createFrom(fTable.getFont()).setStyle(SWT.BOLD));\r
+ fGrayColor = fResourceManager.createColor(ColorUtil.blend(fTable.getBackground().getRGB(), fTable\r
+ .getForeground().getRGB()));\r
+ fGreenColor = fTable.getDisplay().getSystemColor(SWT.COLOR_DARK_GREEN);\r
+ fBoldFont = fResourceManager.createFont(FontDescriptor.createFrom(fTable.getFont()).setStyle(SWT.BOLD));\r
}\r
- \r
+\r
protected void packColumns() {\r
- if (fPackDone) return;\r
+ if (fPackDone)\r
+ return;\r
for (TableColumn column : fTable.getColumns()) {\r
int headerWidth = column.getWidth();\r
column.pack();\r
}\r
fPackDone = true;\r
}\r
- \r
+\r
/**\r
* @param event\r
* @return\r
* \r
- * FIXME: Add support for column selection\r
+ * FIXME: Add support for column selection\r
*/\r
protected String[] extractItemFields(TmfEvent event) {\r
String[] fields = new String[0];\r
if (event != null) {\r
- fields = new String[] {\r
- new Long(event.getTimestamp().getValue()).toString(), \r
- event.getSource().getSourceId().toString(),\r
- event.getType().getTypeId().toString(),\r
- event.getReference().getReference().toString(),\r
- event.getContent().toString()\r
- };\r
+ fields = new String[] { new Long(event.getTimestamp().getValue()).toString(),\r
+ event.getSource().getSourceId().toString(), event.getType().getTypeId().toString(),\r
+ event.getReference().getReference().toString(), event.getContent().toString() };\r
}\r
return fields;\r
}\r
\r
/**\r
* @param trace\r
- * @param disposeOnClose true if the trace should be disposed when the table is disposed\r
+ * @param disposeOnClose\r
+ * true if the trace should be disposed when the table is disposed\r
*/\r
public void setTrace(ITmfTrace trace, boolean disposeOnClose) {\r
if (fTrace != null && fDisposeOnClose) {\r
fTrace.dispose();\r
}\r
fTrace = trace;\r
- fPackDone = false;\r
- fSelectedRank = 0;\r
+ fPackDone = false;\r
+ fSelectedRank = 0;\r
fDisposeOnClose = disposeOnClose;\r
- \r
+\r
// Perform the updates on the UI thread\r
fTable.getDisplay().syncExec(new Runnable() {\r
@Override\r
- public void run() {\r
+ public void run() {\r
fTable.removeAll();\r
fCache.setTrace(fTrace); // Clear the cache\r
if (fTrace != null) {\r
\r
public void cacheUpdated(final boolean completed) {\r
synchronized (fCacheUpdateSyncObj) {\r
- if (fCacheUpdateBusy) {\r
- fCacheUpdatePending = true;\r
- fCacheUpdateCompleted = completed;\r
- return;\r
- } else {\r
- fCacheUpdateBusy = true;\r
- }\r
+ if (fCacheUpdateBusy) {\r
+ fCacheUpdatePending = true;\r
+ fCacheUpdateCompleted = completed;\r
+ return;\r
+ } else {\r
+ fCacheUpdateBusy = true;\r
+ }\r
}\r
- // Event cache is now updated. Perform update on the UI thread\r
+ // Event cache is now updated. Perform update on the UI thread\r
if (!fTable.isDisposed()) {\r
fTable.getDisplay().asyncExec(new Runnable() {\r
@Override\r
packColumns();\r
}\r
if (completed) {\r
- populateCompleted();\r
+ populateCompleted();\r
+ }\r
+ synchronized (fCacheUpdateSyncObj) {\r
+ fCacheUpdateBusy = false;\r
+ if (fCacheUpdatePending) {\r
+ fCacheUpdatePending = false;\r
+ cacheUpdated(fCacheUpdateCompleted);\r
+ }\r
}\r
- synchronized (fCacheUpdateSyncObj) {\r
- fCacheUpdateBusy = false;\r
- if (fCacheUpdatePending) {\r
- fCacheUpdatePending = false;\r
- cacheUpdated(fCacheUpdateCompleted);\r
- }\r
- }\r
}\r
});\r
}\r
}\r
- \r
+\r
protected void populateCompleted() {\r
- // Nothing by default;\r
+ // Nothing by default;\r
}\r
\r
// ------------------------------------------------------------------------\r
// Bookmark handling\r
// ------------------------------------------------------------------------\r
- \r
- public void addBookmark(IResource resource) {\r
- fBookmarksResource = resource;\r
- TableItem[] selection = fTable.getSelection();\r
- if (selection.length > 0) {\r
- TableItem tableItem = selection[0];\r
- if (tableItem.getData(Key.RANK) != null) {\r
- StringBuffer defaultMessage = new StringBuffer();\r
- for (int i = 0; i < fTable.getColumns().length; i++) {\r
- if (i > 0) {\r
- defaultMessage.append(", "); //$NON-NLS-1$\r
- }\r
- defaultMessage.append(tableItem.getText(i));\r
- }\r
- InputDialog dialog = new InputDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),\r
- Messages.TmfEventsTable_AddBookmarkDialogTitle, Messages.TmfEventsTable_AddBookmarkDialogText, defaultMessage.toString(), null);\r
- if (dialog.open() == Dialog.OK) {\r
- String message = dialog.getValue();\r
- try {\r
- IMarker bookmark = resource.createMarker(IMarker.BOOKMARK);\r
- if (bookmark.exists()) {\r
- bookmark.setAttribute(IMarker.MESSAGE, message.toString());\r
- long rank = (Long) tableItem.getData(Key.RANK);\r
- int location = (int) rank;\r
- bookmark.setAttribute(IMarker.LOCATION, (Integer) location);\r
- fBookmarksMap.put(rank, bookmark.getId());\r
- fTable.refresh();\r
- }\r
+\r
+ public void addBookmark(IResource resource) {\r
+ fBookmarksResource = resource;\r
+ TableItem[] selection = fTable.getSelection();\r
+ if (selection.length > 0) {\r
+ TableItem tableItem = selection[0];\r
+ if (tableItem.getData(Key.RANK) != null) {\r
+ StringBuffer defaultMessage = new StringBuffer();\r
+ for (int i = 0; i < fTable.getColumns().length; i++) {\r
+ if (i > 0) {\r
+ defaultMessage.append(", "); //$NON-NLS-1$\r
+ }\r
+ defaultMessage.append(tableItem.getText(i));\r
+ }\r
+ InputDialog dialog = new InputDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),\r
+ Messages.TmfEventsTable_AddBookmarkDialogTitle, Messages.TmfEventsTable_AddBookmarkDialogText,\r
+ defaultMessage.toString(), null);\r
+ if (dialog.open() == Dialog.OK) {\r
+ String message = dialog.getValue();\r
+ try {\r
+ IMarker bookmark = resource.createMarker(IMarker.BOOKMARK);\r
+ if (bookmark.exists()) {\r
+ bookmark.setAttribute(IMarker.MESSAGE, message.toString());\r
+ long rank = (Long) tableItem.getData(Key.RANK);\r
+ int location = (int) rank;\r
+ bookmark.setAttribute(IMarker.LOCATION, (Integer) location);\r
+ fBookmarksMap.put(rank, bookmark.getId());\r
+ fTable.refresh();\r
+ }\r
} catch (CoreException e) {\r
- e.printStackTrace();\r
+ e.printStackTrace();\r
}\r
- }\r
- }\r
- }\r
- \r
+ }\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ public void removeBookmark(IMarker bookmark) {\r
+ for (Entry<Long, Long> entry : fBookmarksMap.entrySet()) {\r
+ if (entry.getValue().equals(bookmark.getId())) {\r
+ fBookmarksMap.remove(entry.getKey());\r
+ fTable.refresh();\r
+ return;\r
+ }\r
+ }\r
}\r
\r
- public void removeBookmark(IMarker bookmark) {\r
- for (Entry<Long, Long> entry : fBookmarksMap.entrySet()) {\r
- if (entry.getValue().equals(bookmark.getId())) {\r
- fBookmarksMap.remove(entry.getKey());\r
- fTable.refresh();\r
- return;\r
- }\r
- }\r
- }\r
-\r
- private void toggleBookmark(long rank) {\r
- if (fBookmarksResource == null) {\r
- return;\r
- }\r
- if (fBookmarksMap.containsKey(rank)) {\r
- Long markerId = fBookmarksMap.remove(rank);\r
- fTable.refresh();\r
- try {\r
- IMarker bookmark = fBookmarksResource.findMarker(markerId);\r
- if (bookmark != null) {\r
- bookmark.delete();\r
- }\r
+ private void toggleBookmark(long rank) {\r
+ if (fBookmarksResource == null) {\r
+ return;\r
+ }\r
+ if (fBookmarksMap.containsKey(rank)) {\r
+ Long markerId = fBookmarksMap.remove(rank);\r
+ fTable.refresh();\r
+ try {\r
+ IMarker bookmark = fBookmarksResource.findMarker(markerId);\r
+ if (bookmark != null) {\r
+ bookmark.delete();\r
+ }\r
} catch (CoreException e) {\r
- e.printStackTrace();\r
+ e.printStackTrace();\r
}\r
- } else {\r
- addBookmark(fBookmarksResource);\r
- }\r
- }\r
- \r
- public void refreshBookmarks(IResource resource) {\r
- fBookmarksResource = resource;\r
- try {\r
- fBookmarksMap.clear();\r
- for (IMarker bookmark : resource.findMarkers(IMarker.BOOKMARK, false, IResource.DEPTH_ZERO)) {\r
- int location = bookmark.getAttribute(IMarker.LOCATION, -1);\r
- if (location != -1) {\r
- long rank = (long) location;\r
- fBookmarksMap.put(rank, bookmark.getId());\r
- }\r
- }\r
- fTable.refresh();\r
+ } else {\r
+ addBookmark(fBookmarksResource);\r
+ }\r
+ }\r
+\r
+ public void refreshBookmarks(IResource resource) {\r
+ fBookmarksResource = resource;\r
+ try {\r
+ fBookmarksMap.clear();\r
+ for (IMarker bookmark : resource.findMarkers(IMarker.BOOKMARK, false, IResource.DEPTH_ZERO)) {\r
+ int location = bookmark.getAttribute(IMarker.LOCATION, -1);\r
+ if (location != -1) {\r
+ long rank = location;\r
+ fBookmarksMap.put(rank, bookmark.getId());\r
+ }\r
+ }\r
+ fTable.refresh();\r
} catch (CoreException e) {\r
- e.printStackTrace();\r
+ e.printStackTrace();\r
}\r
}\r
- \r
- @Override\r
- public void gotoMarker(IMarker marker) {\r
+\r
+ @Override\r
+ public void gotoMarker(IMarker marker) {\r
int rank = marker.getAttribute(IMarker.LOCATION, -1);\r
if (rank != -1) {\r
- int index = (int) rank;\r
- if (fTable.getData(Key.FILTER_OBJ) != null) {\r
- index = fCache.getFilteredEventIndex(rank) + 1; //+1 for top filter status row\r
- } else if (rank >= fTable.getItemCount()) {\r
- fPendingGotoRank = rank;\r
- }\r
- fTable.setSelection(index + 1); // +1 for header row\r
+ int index = rank;\r
+ if (fTable.getData(Key.FILTER_OBJ) != null) {\r
+ index = fCache.getFilteredEventIndex(rank) + 1; // +1 for top filter status row\r
+ } else if (rank >= fTable.getItemCount()) {\r
+ fPendingGotoRank = rank;\r
+ }\r
+ fTable.setSelection(index + 1); // +1 for header row\r
}\r
- }\r
- \r
+ }\r
+\r
// ------------------------------------------------------------------------\r
// Listeners\r
// ------------------------------------------------------------------------\r
- \r
- /* (non-Javadoc)\r
- * @see org.eclipse.linuxtools.tmf.ui.views.colors.IColorSettingsListener#colorSettingsChanged(org.eclipse.linuxtools.tmf.ui.views.colors.ColorSetting[])\r
- */\r
- @Override\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.linuxtools.tmf.ui.views.colors.IColorSettingsListener#colorSettingsChanged(org.eclipse.linuxtools\r
+ * .tmf.ui.views.colors.ColorSetting[])\r
+ */\r
+ @Override\r
public void colorSettingsChanged(ColorSetting[] colorSettings) {\r
- fTable.refresh();\r
- }\r
- \r
+ fTable.refresh();\r
+ }\r
+\r
@Override\r
public void addEventsFilterListener(ITmfEventsFilterListener listener) {\r
- if (!fEventsFilterListeners.contains(listener)) {\r
- fEventsFilterListeners.add(listener);\r
- }\r
+ if (!fEventsFilterListeners.contains(listener)) {\r
+ fEventsFilterListeners.add(listener);\r
+ }\r
}\r
\r
- @Override\r
+ @Override\r
public void removeEventsFilterListener(ITmfEventsFilterListener listener) {\r
- fEventsFilterListeners.remove(listener);\r
+ fEventsFilterListeners.remove(listener);\r
}\r
\r
// ------------------------------------------------------------------------\r
// Signal handlers\r
// ------------------------------------------------------------------------\r
- \r
- @TmfSignalHandler\r
- public void experimentUpdated(TmfExperimentUpdatedSignal signal) {\r
- if ((signal.getExperiment() != fTrace) || fTable.isDisposed()) return;\r
+\r
+// @TmfSignalHandler\r
+// public void experimentUpdated(TmfExperimentUpdatedSignal signal) {\r
+// if ((signal.getExperiment() != fTrace) || fTable.isDisposed()) return;\r
+// // Perform the refresh on the UI thread\r
+// Display.getDefault().asyncExec(new Runnable() {\r
+// @Override\r
+// public void run() {\r
+// if (!fTable.isDisposed() && fTrace != null) {\r
+// if (fTable.getData(Key.FILTER_OBJ) == null) {\r
+// fTable.setItemCount((int) fTrace.getNbEvents() + 1); // +1 for header row\r
+// if (fPendingGotoRank != -1 && fPendingGotoRank + 1 < fTable.getItemCount()) { // +1 for header row\r
+// fTable.setSelection((int) fPendingGotoRank + 1); // +1 for header row\r
+// fPendingGotoRank = -1;\r
+// }\r
+// } else {\r
+// startFilterThread();\r
+// }\r
+// }\r
+// if (!fRawViewer.isDisposed() && fTrace != null) {\r
+// fRawViewer.refreshEventCount();\r
+// }\r
+// }\r
+// });\r
+// }\r
+\r
+ @TmfSignalHandler\r
+ public void experimentUpdated(TmfExperimentRangeUpdatedSignal signal) {\r
+ if ((signal.getExperiment() != fTrace) || fTable.isDisposed())\r
+ return;\r
// Perform the refresh on the UI thread\r
- Display.getDefault().asyncExec(new Runnable() {\r
+ Display.getDefault().asyncExec(new Runnable() {\r
@Override\r
- public void run() {\r
+ public void run() {\r
if (!fTable.isDisposed() && fTrace != null) {\r
- if (fTable.getData(Key.FILTER_OBJ) == null) {\r
- fTable.setItemCount((int) fTrace.getNbEvents() + 1); // +1 for header row\r
- if (fPendingGotoRank != -1 && fPendingGotoRank + 1 < fTable.getItemCount()) { // +1 for header row\r
- fTable.setSelection((int) fPendingGotoRank + 1); // +1 for header row\r
- fPendingGotoRank = -1;\r
- }\r
- } else {\r
- startFilterThread();\r
- }\r
+ if (fTable.getData(Key.FILTER_OBJ) == null) {\r
+ fTable.setItemCount((int) fTrace.getNbEvents() + 1); // +1 for header row\r
+ if (fPendingGotoRank != -1 && fPendingGotoRank + 1 < fTable.getItemCount()) { // +1 for header\r
+ // row\r
+ fTable.setSelection((int) fPendingGotoRank + 1); // +1 for header row\r
+ fPendingGotoRank = -1;\r
+ }\r
+ } else {\r
+ startFilterThread();\r
+ }\r
}\r
if (!fRawViewer.isDisposed() && fTrace != null) {\r
fRawViewer.refreshEventCount();\r
}\r
});\r
}\r
- \r
+\r
@TmfSignalHandler\r
public void traceUpdated(TmfTraceUpdatedSignal signal) {\r
- if ((signal.getTrace() != fTrace ) || fTable.isDisposed()) return;\r
+ if ((signal.getTrace() != fTrace) || fTable.isDisposed())\r
+ return;\r
// Perform the refresh on the UI thread\r
Display.getDefault().asyncExec(new Runnable() {\r
@Override\r
- public void run() {\r
+ public void run() {\r
if (!fTable.isDisposed() && fTrace != null) {\r
- if (fTable.getData(Key.FILTER_OBJ) == null) {\r
- fTable.setItemCount((int) fTrace.getNbEvents() + 1); // +1 for header row\r
- if (fPendingGotoRank != -1 && fPendingGotoRank + 1 < fTable.getItemCount()) { // +1 for header row\r
- fTable.setSelection((int) fPendingGotoRank + 1); // +1 for header row\r
- fPendingGotoRank = -1;\r
- }\r
- } else {\r
- startFilterThread();\r
- }\r
+ if (fTable.getData(Key.FILTER_OBJ) == null) {\r
+ fTable.setItemCount((int) fTrace.getNbEvents() + 1); // +1 for header row\r
+ if (fPendingGotoRank != -1 && fPendingGotoRank + 1 < fTable.getItemCount()) { // +1 for header\r
+ // row\r
+ fTable.setSelection((int) fPendingGotoRank + 1); // +1 for header row\r
+ fPendingGotoRank = -1;\r
+ }\r
+ } else {\r
+ startFilterThread();\r
+ }\r
}\r
if (!fRawViewer.isDisposed() && fTrace != null) {\r
fRawViewer.refreshEventCount();\r
@SuppressWarnings("unchecked")\r
@TmfSignalHandler\r
public void currentTimeUpdated(final TmfTimeSynchSignal signal) {\r
- if ((signal.getSource() != fTable) && (fTrace != null) && (!fTable.isDisposed())) {\r
-\r
- // Create a request for one event that will be queued after other ongoing requests. When this request is completed \r
- // do the work to select the actual event with the timestamp specified in the signal. This procedure prevents \r
- // the method fTrace.getRank() from interfering and delaying ongoing requests.\r
- final TmfDataRequest<TmfEvent> subRequest = new TmfDataRequest<TmfEvent>(TmfEvent.class, 0, 1, ExecutionType.FOREGROUND) {\r
-\r
- TmfTimestamp ts = new TmfTimestamp(signal.getCurrentTime());\r
- \r
- @Override\r
- public void handleData(TmfEvent event) {\r
- super.handleData(event);\r
- }\r
-\r
- @Override\r
- public void handleCompleted() {\r
- super.handleCompleted();\r
- if (fTrace == null) {\r
- return;\r
- }\r
- // Verify if event is within the trace range\r
- final TmfTimestamp timestamp[] = new TmfTimestamp[1];\r
- timestamp[0] = ts; // signal.getCurrentTime();\r
- if (timestamp[0].compareTo(fTrace.getStartTime(), true) == -1) {\r
- timestamp[0] = fTrace.getStartTime();\r
- }\r
- if (timestamp[0].compareTo(fTrace.getEndTime(), true) == 1) {\r
- timestamp[0] = fTrace.getEndTime();\r
- }\r
-\r
- // Get the rank for the event selection in the table\r
- final long rank = fTrace.getRank(timestamp[0]);\r
- fSelectedRank = rank;\r
-\r
- fTable.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
+ if ((signal.getSource() != fTable) && (fTrace != null) && (!fTable.isDisposed())) {\r
+\r
+ // Create a request for one event that will be queued after other ongoing requests. When this request is\r
+ // completed\r
+ // do the work to select the actual event with the timestamp specified in the signal. This procedure\r
+ // prevents\r
+ // the method fTrace.getRank() from interfering and delaying ongoing requests.\r
+ final TmfDataRequest<TmfEvent> subRequest = new TmfDataRequest<TmfEvent>(TmfEvent.class, 0, 1,\r
+ ExecutionType.FOREGROUND) {\r
+\r
+ TmfTimestamp ts = new TmfTimestamp(signal.getCurrentTime());\r
+\r
+ @Override\r
+ public void handleData(TmfEvent event) {\r
+ super.handleData(event);\r
+ }\r
+\r
+ @Override\r
+ public void handleCompleted() {\r
+ super.handleCompleted();\r
+ if (fTrace == null) {\r
+ return;\r
+ }\r
+ // Verify if event is within the trace range\r
+ final TmfTimestamp timestamp[] = new TmfTimestamp[1];\r
+ timestamp[0] = ts; // signal.getCurrentTime();\r
+ if (timestamp[0].compareTo(fTrace.getStartTime(), true) == -1) {\r
+ timestamp[0] = fTrace.getStartTime();\r
+ }\r
+ if (timestamp[0].compareTo(fTrace.getEndTime(), true) == 1) {\r
+ timestamp[0] = fTrace.getEndTime();\r
+ }\r
+\r
+ // Get the rank for the event selection in the table\r
+ final long rank = fTrace.getRank(timestamp[0]);\r
+ fSelectedRank = rank;\r
+\r
+ fTable.getDisplay().asyncExec(new Runnable() {\r
+ @Override\r
public void run() {\r
- // Return if table is disposed\r
- if (fTable.isDisposed()) return;\r
+ // Return if table is disposed\r
+ if (fTable.isDisposed())\r
+ return;\r
\r
int index = (int) rank;\r
- if (fTable.isDisposed()) return;\r
+ if (fTable.isDisposed())\r
+ return;\r
if (fTable.getData(Key.FILTER_OBJ) != null) {\r
- index = fCache.getFilteredEventIndex(rank) + 1; //+1 for top filter status row\r
+ index = fCache.getFilteredEventIndex(rank) + 1; // +1 for top filter status row\r
}\r
fTable.setSelection(index + 1); // +1 for header row\r
fRawViewer.selectAndReveal(rank);\r
- }\r
- });\r
- }\r
- };\r
+ }\r
+ });\r
+ }\r
+ };\r
\r
((ITmfDataProvider<TmfEvent>) fTrace).sendRequest(subRequest);\r
- }\r
- }\r
+ }\r
+ }\r
\r
-}
+}\r