package org.erlide.tracing.core.views; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import org.erlide.tracing.core.Activator; import org.erlide.tracing.core.ITraceNodeObserver; import org.erlide.tracing.core.TraceBackend; import org.erlide.tracing.core.TracingStatus; import org.erlide.tracing.core.mvc.model.TraceCollections; import org.erlide.tracing.core.mvc.model.treenodes.ITreeNode; import org.erlide.tracing.core.mvc.model.treenodes.TracingResultsNode; import org.erlide.tracing.core.mvc.view.TreeContentProvider; import org.erlide.tracing.core.mvc.view.TreeLabelProvider; import org.erlide.tracing.core.preferences.PreferenceNames; import org.erlide.tracing.core.ui.dialogs.RunnableWithProgress; import org.erlide.tracing.core.utils.TracingStatusHandler; import org.erlide.util.ErlLogger; /** * Sequence diagram which shows tracing results. * * @author Piotr Dorobisz * */ public class TraceBrowserView extends ViewPart implements ITraceNodeObserver { private TreeViewer treeViewer; private Action removeAllAction; private Action loadAction; private Action removeAction; private RunnableWithProgress task; private TracingStatus status; public TraceBrowserView() { TraceBackend.getInstance().addListener(this); } @Override public void dispose() { TraceBackend.getInstance().removeListener(this); super.dispose(); } @Override public void createPartControl(final Composite parent) { // layout final GridLayout containerLayout = new GridLayout(1, false); containerLayout.marginWidth = 0; containerLayout.marginHeight = 0; containerLayout.verticalSpacing = 3; parent.setLayout(containerLayout); // toolbars and menu createActionBars(); // children createTreeViewerPanel(parent); // enable/disable buttons depending on whether tracing is started or not enableActions(!TraceBackend.getInstance().isStarted()); } private void createActionBars() { loadAction = new Action() { @Override public void run() { final DirectoryDialog dialog = new DirectoryDialog( PlatformUI.getWorkbench().getDisplay().getActiveShell(), SWT.OPEN); dialog.setFilterPath(ResourcesPlugin.getWorkspace().getRoot() .getLocation().toString()); // dialog.setFilterExtensions(new String[] { "*.*" }); dialog.setText("Load trace data..."); final String selected = dialog.open(); if (selected != null) { task = new RunnableWithProgress("Load trace data...") { @Override public void doAction() { TraceBackend.getInstance().loadFile(selected); } }; try { final Shell shell = PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(); new ProgressMonitorDialog(shell).run(true, false, task); doAfterLoadingFile(); } catch (final Exception e) { ErlLogger.error(e); } finally { task = null; } } } }; loadAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages() .getImageDescriptor(ISharedImages.IMG_OBJ_FOLDER)); loadAction.setToolTipText("Load results from disk..."); removeAction = new Action() { @Override public void run() { final TracingResultsNode node = (TracingResultsNode) ((IStructuredSelection) treeViewer .getSelection()).getFirstElement(); if (node != null) { TraceBackend.getInstance().removeTracingResult(node); } } }; removeAction.setImageDescriptor( DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_LCL_REMOVE)); removeAction.setToolTipText("Remove selected"); removeAllAction = new Action() { @Override public void run() { TraceBackend.getInstance().clearTraceLists(); } }; removeAllAction.setImageDescriptor( DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_LCL_REMOVE_ALL)); removeAllAction.setToolTipText("Remove all"); final IToolBarManager manager = getViewSite().getActionBars().getToolBarManager(); manager.add(loadAction); manager.add(removeAction); manager.add(removeAllAction); } private void enableActions(final boolean enabled) { loadAction.setEnabled(enabled); removeAction.setEnabled(enabled); removeAllAction.setEnabled(enabled); treeViewer.getTree().setEnabled(enabled); } private void createTreeViewerPanel(final Composite parent) { final Composite container = new Composite(parent, SWT.NONE); container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); container.setLayout(new GridLayout()); // treeViewer = new TreeViewer(container, SWT.VIRTUAL); treeViewer = new TreeViewer(container, SWT.SINGLE); treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); // providers treeViewer.setContentProvider(new TreeContentProvider(treeViewer, false)); treeViewer.setLabelProvider(new TreeLabelProvider()); // input treeViewer.setInput(TraceCollections.getFilesList()); // listener treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(final SelectionChangedEvent event) { doSelection(event); } }); } /** * Action performed when user clicks on tree element. * * @param event */ private void doSelection(final SelectionChangedEvent event) { final IStructuredSelection selection = (IStructuredSelection) event .getSelection(); final ITreeNode treeNode = (ITreeNode) selection.getFirstElement(); if (treeNode != null) { task = new RunnableWithProgress("Loading trace results...") { @Override public void doAction() { TraceBackend.getInstance() .setActiveResultSet((TracingResultsNode) treeNode); final int limit = Activator.getDefault().getPreferenceStore() .getInt(PreferenceNames.TRACES_LOAD_LIMIT); TraceBackend.getInstance().loadDataFromFile(1, limit); } }; try { final Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getShell(); new ProgressMonitorDialog(shell).run(true, false, task); doAfterLoadingFile(); } catch (final Exception e) { ErlLogger.error(e); } finally { task = null; } } } private void doAfterLoadingFile() { if (TracingStatus.OK.equals(status)) { treeViewer.refresh(); } if (task != null) { // task was executed from this class so this class is responsible // for handling status TracingStatusHandler.handleStatus(status); } enableActions(true); } @Override public void setFocus() { } @Override public void startTracing() { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { enableActions(false); } }); } @Override public void finishLoadingFile(final TracingStatus theStatus) { status = theStatus; if (task != null) { // when loading was initialized from this view task.finish(); } else { // when loading was initialized outside this view Display.getDefault().asyncExec(new Runnable() { @Override public void run() { doAfterLoadingFile(); } }); } } @Override public void finishLoadingTraces(final TracingStatus theStatus) { status = theStatus; if (task != null) { task.finish(); } } @Override public void removeFile() { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { treeViewer.refresh(); } }); } @Override public void updateTracePatterns() { } }