diff options
author | Patrick Tasse | 2012-03-19 18:38:40 +0000 |
---|---|---|
committer | Patrick Tasse | 2012-03-19 18:38:40 +0000 |
commit | 1ee91a9d080de7599642edce1da713d16314e481 (patch) | |
tree | 23eba220aedd62cab810fdbacffa6f8de966f7ea /lttng/org.eclipse.linuxtools.lttng.ui | |
parent | d3072556b4855106df09825912d0e4a25cfcf137 (diff) | |
download | org.eclipse.linuxtools-1ee91a9d080de7599642edce1da713d16314e481.tar.gz org.eclipse.linuxtools-1ee91a9d080de7599642edce1da713d16314e481.tar.xz org.eclipse.linuxtools-1ee91a9d080de7599642edce1da713d16314e481.zip |
Fix for bug 374662: Control Flow view improvements.
Diffstat (limited to 'lttng/org.eclipse.linuxtools.lttng.ui')
2 files changed, 63 insertions, 223 deletions
diff --git a/lttng/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/internal/lttng/ui/views/common/AbsTimeUpdateView.java b/lttng/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/internal/lttng/ui/views/common/AbsTimeUpdateView.java index 45d27845e5..e2d963abf1 100644 --- a/lttng/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/internal/lttng/ui/views/common/AbsTimeUpdateView.java +++ b/lttng/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/internal/lttng/ui/views/common/AbsTimeUpdateView.java @@ -610,6 +610,9 @@ public abstract class AbsTimeUpdateView extends TmfView implements IRequestStatu // Obtain the current resource array ITmfTimeAnalysisEntry[] itemArr = itemContainer.readItems(); + // sort the array by pid + Arrays.sort(itemArr); + // clean up data and boundaries displayModel(itemArr, -1, -1, false, -1, -1, null); @@ -641,6 +644,9 @@ public abstract class AbsTimeUpdateView extends TmfView implements IRequestStatu // Obtain the current process array ITmfTimeAnalysisEntry[] itemArr = itemContainer.readItems(); + // sort the array by pid + Arrays.sort(itemArr); + long startTime = boundaryRange.getStartTime().getValue(); long endTime = boundaryRange.getEndTime().getValue(); diff --git a/lttng/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/internal/lttng/ui/views/controlflow/ControlFlowView.java b/lttng/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/internal/lttng/ui/views/controlflow/ControlFlowView.java index 27c4f207e0..acb1cf3008 100644 --- a/lttng/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/internal/lttng/ui/views/controlflow/ControlFlowView.java +++ b/lttng/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/internal/lttng/ui/views/controlflow/ControlFlowView.java @@ -13,6 +13,7 @@ *******************************************************************************/ package org.eclipse.linuxtools.internal.lttng.ui.views.controlflow; +import java.util.Arrays; import java.util.Vector; import org.eclipse.jface.action.Action; @@ -21,9 +22,6 @@ import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; @@ -67,19 +65,19 @@ import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeSelectionEvent; import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; -import org.eclipse.swt.custom.ScrolledComposite; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.events.ControlAdapter; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseWheelListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.ScrollBar; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.PlatformUI; @@ -129,7 +127,6 @@ public class ControlFlowView extends AbsTimeUpdateView implements private TableViewer tableViewer; // private int totalNumItems = 0; // Actions - private Action doubleClickAction; private Action resetScale; private Action nextEvent; private Action prevEvent; @@ -142,10 +139,11 @@ public class ControlFlowView extends AbsTimeUpdateView implements private Action zoomFilter; private ViewProcessFilter tableFilter = null; - private ScrolledComposite scrollFrame = null; private TmfTimeRange initTimeRange = TmfTimeRange.NULL_RANGE; + private static final Object FILLER = new Object(); + private static int numFillerRows; // private static SimpleDateFormat stimeformat = new SimpleDateFormat( // "yy/MM/dd HH:mm:ss"); @@ -194,7 +192,12 @@ public class ControlFlowView extends AbsTimeUpdateView implements @Override public Object[] getElements(Object inputElement) { - return elements; + // add filler elements to ensure alignment with time analysis viewer + Object[] oElements = Arrays.copyOf(elements, elements.length + numFillerRows, new Object[0].getClass()); + for (int i = 0; i < numFillerRows; i++) { + oElements[elements.length + i] = FILLER; + } + return oElements; } } @@ -240,6 +243,8 @@ public class ControlFlowView extends AbsTimeUpdateView implements default: break; } + } else if (obj == FILLER) { + return ""; //$NON-NLS-1$ } else { return getText(obj); } @@ -287,6 +292,8 @@ public class ControlFlowView extends AbsTimeUpdateView implements // The element is marked to be filtered out return false; } + } else if (element == FILLER) { + return true; // never filter the filler element } else { TraceDebug.debug("Unexpected type of filter element received: " //$NON-NLS-1$ + element.toString()); @@ -317,14 +324,7 @@ public class ControlFlowView extends AbsTimeUpdateView implements @Override public void createPartControl(Composite parent) { - scrollFrame = new ScrolledComposite(parent, SWT.V_SCROLL); - - scrollFrame.setExpandVertical(true); - scrollFrame.setExpandHorizontal(true); - scrollFrame.setAlwaysShowScrollBars(true); - - SashForm sash = new SashForm(scrollFrame, SWT.NONE); - scrollFrame.setContent(sash); + SashForm sash = new SashForm(parent, SWT.NONE); tableViewer = new TableViewer(sash, SWT.FULL_SELECTION | SWT.H_SCROLL); tableViewer.setContentProvider(new ViewContentProvider(tableViewer)); @@ -339,155 +339,35 @@ public class ControlFlowView extends AbsTimeUpdateView implements if (sel instanceof IStructuredSelection) { firstSel = ((IStructuredSelection) sel).getFirstElement(); - // Make sure the selection is visible - updateScrollOrigin(); - if (firstSel instanceof ITmfTimeAnalysisEntry) { ITmfTimeAnalysisEntry trace = (ITmfTimeAnalysisEntry) firstSel; tsfviewer.setSelectedTrace(trace); + int selection = tsfviewer.getVerticalBar().getSelection(); + tableViewer.getTable().setTopIndex(selection); + } else if (firstSel == FILLER) { + // filler element was selected, select the last item instead + Table table = tableViewer.getTable(); + table.select(table.getItemCount() - 1 - numFillerRows); // subtract the filler elements + Object selectedItem = ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); + if (selectedItem instanceof ITmfTimeAnalysisEntry) { + tsfviewer.setSelectedTrace((ITmfTimeAnalysisEntry) selectedItem); + int selection = tsfviewer.getVerticalBar().getSelection(); + tableViewer.getTable().setTopIndex(selection); + } } } } } - - /** - * Make sure the selected item is visible - */ - private void updateScrollOrigin() { - Table table = tableViewer.getTable(); - if (table != null && table.getItemCount() > 0) { - TableItem item = table.getSelection()[0]; - if (item == null) { - // no selected reference to go up or down - return; - } - - Rectangle itemRect = item.getBounds(); - int step = itemRect.height; - - // calculate height of horizontal bar - int hscrolly = 0; - ScrollBar hbar = scrollFrame.getHorizontalBar(); - if (hbar != null) { - hscrolly = hbar.getSize().y; - } - - int visibleHeight = scrollFrame.getSize().y - hscrolly; - - // the current scrollbar offset to adjust i.e. start - // of - // the visible window - Point origin = scrollFrame.getOrigin(); - // end of visible window - int endy = origin.y + visibleHeight; - - int itemStartPos = itemRect.y + table.getHeaderHeight() + table.getBorderWidth() - + table.getParent().getBorderWidth(); - - // Item End Position - int itemEndPos = itemStartPos + step; - - // check if need to go up - if (origin.y >= step && itemStartPos < origin.y) { - // one step up - scrollFrame.setOrigin(origin.x, origin.y - step); - - } - - // check if it needs to go down - if (itemEndPos > endy) { - // one step down - scrollFrame.setOrigin(origin.x, origin.y + step); - - } - } - } }); - - // Listen to page up /down and Home / Enc keys - tableViewer.getTable().addKeyListener(new KeyListener() { - @Override - public void keyPressed(KeyEvent e) { - Table table = tableViewer.getTable(); - Point origin = scrollFrame.getOrigin(); - if (table == null || table.getItemCount() < 1) { - // nothing to page - return; - } - - switch (e.keyCode) { - case SWT.PAGE_DOWN: - updateScrollPageDown(); - break; - case SWT.PAGE_UP: - updateScrollUp(); - break; - case SWT.HOME: - // Go to the top - scrollFrame.setOrigin(origin.x, 0); - break; - case SWT.END: - // End Selected - int count = table.getItemCount(); - TableItem item = table.getItem(count - 1); - int itemStartPos = item.getBounds().y; - // Get to the bottom - scrollFrame.setOrigin(origin.x, itemStartPos); - break; - default: - break; - } - } - @Override - public void keyReleased(KeyEvent e) { - // Nothing to do - - } - - /** - * Scroll one page down - */ - private void updateScrollPageDown() { - // null protection before calling private method - Table table = tableViewer.getTable(); - int step = table.getItemHeight(); - - int hscrolly = 0; - ScrollBar hbar = scrollFrame.getHorizontalBar(); - if (hbar != null) { - hscrolly = hbar.getSize().y; - } - - Point origin = scrollFrame.getOrigin(); - int visibleHeight = scrollFrame.getSize().y - hscrolly; - int endy = origin.y + visibleHeight; - - scrollFrame.setOrigin(origin.x, endy - step); - } + table.addMouseWheelListener(new MouseWheelListener() { + @Override + public void mouseScrolled(MouseEvent e) { + ScrollBar scrollBar = tsfviewer.getVerticalBar(); + tsfviewer.setTopIndex(scrollBar.getSelection() - e.count); + tableViewer.getTable().setTopIndex(scrollBar.getSelection()); + }}); - /** - * Scroll one page up - */ - private void updateScrollUp() { - // null protection before calling private method - Table table = tableViewer.getTable(); - int step = table.getItemHeight(); - - int hscrolly = 0; - ScrollBar hbar = scrollFrame.getHorizontalBar(); - if (hbar != null) { - hscrolly = hbar.getSize().y; - } - - Point origin = scrollFrame.getOrigin(); - int visibleHeight = scrollFrame.getSize().y - hscrolly; - int pageUpPos = origin.y - visibleHeight + step; - pageUpPos = pageUpPos > 0 ? pageUpPos : 0; - scrollFrame.setOrigin(origin.x, pageUpPos); - } - - }); // Describe table applyTableLayout(table); @@ -497,6 +377,8 @@ public class ControlFlowView extends AbsTimeUpdateView implements int headerHeight = table.getHeaderHeight(); table.getVerticalBar().setVisible(false); + numFillerRows = Display.getDefault().getBounds().height / itemHeight; + tsfviewer = TmfViewerFactory.createViewer(sash, new FlowTimeRangeViewerProvider(getParamsUpdater())); // Traces shall not be grouped to allow synchronisation @@ -504,7 +386,6 @@ public class ControlFlowView extends AbsTimeUpdateView implements tsfviewer.setItemHeight(itemHeight); tsfviewer.setBorderWidth(borderWidth); tsfviewer.setHeaderHeight(headerHeight); - tsfviewer.setVisibleVerticalScroll(false); // Names provided by the table tsfviewer.setNameWidthPref(0); tsfviewer.setAcceptSelectionAPIcalls(true); @@ -515,6 +396,22 @@ public class ControlFlowView extends AbsTimeUpdateView implements tsfviewer.addFilterSelectionListner(this); tsfviewer.addWidgetTimeScaleSelectionListner(this); + tsfviewer.getVerticalBar().addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + ScrollBar scrollBar = (ScrollBar) e.widget; + int selection = scrollBar.getSelection(); + tableViewer.getTable().setTopIndex(selection); + }}); + + tsfviewer.getControl().addControlListener(new ControlAdapter(){ + @Override + public void controlResized(ControlEvent e) { + // ensure the viewers are aligned + int selection = tsfviewer.getVerticalBar().getSelection(); + tableViewer.getTable().setTopIndex(selection); + }}); + sash.setWeights(new int[] { 1, 1 }); // Create the help context id for the viewer's control // TODO: Associate with help system @@ -524,28 +421,8 @@ public class ControlFlowView extends AbsTimeUpdateView implements makeActions(); hookContextMenu(); - hookDoubleClickAction(); contributeToActionBars(); - // scrollFrame.addControlListener(new ControlAdapter() { - // - // @Override - // public void controlResized(ControlEvent e) { - // tsfviewer.resizeControls(); - // updateScrolls(scrollFrame); - // } - // }); - - // set the initial view parameter values - // Experiment start and end time - // as well as time space width in pixels, used by the time analysis - // widget - // Read relevant values -// int timeSpaceWidth = tsfviewer.getTimeSpace(); -// if (timeSpaceWidth < 0) { -// timeSpaceWidth = -timeSpaceWidth; -// } - TmfExperiment<?> experiment = TmfExperiment.getCurrentExperiment(); if (experiment != null) { TmfTimeRange experimentTRange = experiment.getTimeRange(); @@ -803,31 +680,6 @@ public class ControlFlowView extends AbsTimeUpdateView implements "icons/elcl16/filter_items.gif")); //$NON-NLS-1$ zoomFilter.setChecked(false); - // PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_ELCL_SYNCED); - - doubleClickAction = new Action() { - @Override - public void run() { - ISelection selection = tableViewer.getSelection(); - Object obj = ((IStructuredSelection) selection) - .getFirstElement(); - showMessage("Double-click detected on " + obj.toString()); //$NON-NLS-1$ - } - }; - } - - private void hookDoubleClickAction() { - tableViewer.addDoubleClickListener(new IDoubleClickListener() { - @Override - public void doubleClick(DoubleClickEvent event) { - doubleClickAction.run(); - } - }); - } - - private void showMessage(String message) { - MessageDialog.openInformation(tableViewer.getControl().getShell(), - Messages.getString("ControlFlowView.msgSlogan"), message); //$NON-NLS-1$ } /** @@ -929,16 +781,6 @@ public class ControlFlowView extends AbsTimeUpdateView implements tsfviewer.resizeControls(); - // Adjust asynchronously the size of the vertical scroll bar to fit the - // contents - tableViewer.getTable().getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - if ((scrollFrame != null) && (!scrollFrame.isDisposed())) { - updateScrolls(scrollFrame); - } - } - }); } } }); @@ -984,14 +826,6 @@ public class ControlFlowView extends AbsTimeUpdateView implements } /** - * @param scrollFrame - * @param wrapper - */ - private void updateScrolls(final ScrolledComposite scrollFrame) { - scrollFrame.setMinSize(tableViewer.getTable().computeSize(SWT.DEFAULT, SWT.DEFAULT)); - } - - /** * Registers as listener of time selection from other views * * @param signal |