blob: 7725909ef5ca3adb664351dc50531a826f2ed80c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Boeing.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.ote.ui.eviewer.view;
import java.io.File;
import java.util.logging.Level;
import org.eclipse.jface.action.IMenuListener;
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.viewers.TableViewer;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.framework.plugin.core.util.OseeData;
import org.eclipse.osee.framework.ui.swt.Displays;
import org.eclipse.osee.ote.client.msg.IOteMessageService;
import org.eclipse.osee.ote.message.ElementPath;
import org.eclipse.ote.ui.eviewer.Activator;
import org.eclipse.ote.ui.eviewer.ClientMessageServiceTracker;
import org.eclipse.ote.ui.eviewer.Constants;
import org.eclipse.ote.ui.eviewer.action.AddElementAction;
import org.eclipse.ote.ui.eviewer.action.AddHeaderElementAction;
import org.eclipse.ote.ui.eviewer.action.ClearAllUpdatesAction;
import org.eclipse.ote.ui.eviewer.action.ConfigureColumnsAction;
import org.eclipse.ote.ui.eviewer.action.CopyAllAction;
import org.eclipse.ote.ui.eviewer.action.OpenNewElementViewer;
import org.eclipse.ote.ui.eviewer.action.PauseUpdatesAction;
import org.eclipse.ote.ui.eviewer.action.RemoveColumnAction;
import org.eclipse.ote.ui.eviewer.action.SaveLoadAction;
import org.eclipse.ote.ui.eviewer.action.SetActiveColumnAction;
import org.eclipse.ote.ui.eviewer.action.ShowEnumAsNumberAction;
import org.eclipse.ote.ui.eviewer.action.ShowElementsAsHexAction;
import org.eclipse.ote.ui.eviewer.action.ShowTimeAction;
import org.eclipse.ote.ui.eviewer.action.ShowTimeDeltaAction;
import org.eclipse.ote.ui.eviewer.action.StreamToFileAction;
import org.eclipse.ote.ui.eviewer.action.ToggleAutoRevealAction;
import org.eclipse.ote.ui.eviewer.view.ColumnFileParser.ParseCode;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
/**
* This sample class demonstrates how to plug-in a new workbench view. The view
* shows data obtained from the model. The sample creates a dummy model on the
* fly, but a real implementation would connect to the model available either in
* this or another plug-in (e.g. the workspace). The view is connected to the
* model using a content provider.
* <p>
* The view uses a label provider to define how model objects should be
* presented in the view. Each view can present the same model objects using
* different labels and icons, if needed. Alternatively, a single label provider
* can be shared between views in order to ensure that objects of the same type
* are presented in the same way everywhere.
* <p>
*/
public class ElementViewer extends ViewPart {
public static final String VIEW_ID = "org.eclipse.ote.ui.eviewer.view.ElementViewer";
private TableViewer viewer;
private AddElementAction addElementAction;
private AddHeaderElementAction addHeaderElementAction;
private ClearAllUpdatesAction clearAllUpdatesAction;
private ToggleAutoRevealAction toggleAutoRevealAction;
private PauseUpdatesAction pauseUpdatesAction;
private RemoveColumnAction removeColumnAction;
private CopyAllAction copyAction;
private SetActiveColumnAction activeColumnAction;
private SaveLoadAction saveLoadAction;
private StreamToFileAction streamToFileAction;
private ConfigureColumnsAction configureColumnAction;
private final ElementContentProvider elementContentProvider = new ElementContentProvider(8194);
private final ClientMessageServiceTracker tracker;
private ShowTimeAction showTimeAction;
private ShowTimeDeltaAction showTimeDeltaAction;
private ShowEnumAsNumberAction showEnumAsNumberAction;
private ShowElementsAsHexAction showNumbersAsHex;
/**
* The constructor.
*/
public ElementViewer() {
tracker = new ClientMessageServiceTracker(this);
}
/**
* This is a callback that will allow us to create the viewer and initialize
* it.
*/
@Override
public void createPartControl(Composite parent) {
viewer = new TableViewer(parent, SWT.DOUBLE_BUFFERED | SWT.FULL_SELECTION | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
viewer.setUseHashlookup(true);
viewer.setContentProvider(elementContentProvider);
viewer.getTable().setHeaderVisible(true);
viewer.getTable().setLinesVisible(true);
// viewer.setPreserveSelection(false);
makeActions();
hookContextMenu();
hookDoubleClickAction();
contributeToActionBars();
tracker.open(true);
}
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager) {
ElementViewer.this.fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
fillLocalToolBar(bars.getToolBarManager());
}
private void fillLocalPullDown(IMenuManager manager) {
manager.add(addElementAction);
manager.add(new Separator());
}
private void fillContextMenu(IMenuManager manager) {
manager.add(addElementAction);
manager.add(addHeaderElementAction);
manager.add(new Separator());
if (!elementContentProvider.getElementColumns().isEmpty()) {
manager.add(activeColumnAction);
manager.add(removeColumnAction);
}
manager.add(showTimeAction);
manager.add(showTimeDeltaAction);
manager.add(new Separator());
manager.add(clearAllUpdatesAction);
manager.add(copyAction);
manager.add(new Separator());
manager.add(toggleAutoRevealAction);
manager.add(showEnumAsNumberAction);
manager.add(showNumbersAsHex);
// Other plug-ins can contribute there actions here
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void fillLocalToolBar(IToolBarManager manager) {
manager.add(addElementAction);
manager.add(configureColumnAction);
manager.add(clearAllUpdatesAction);
manager.add(toggleAutoRevealAction);
manager.add(showEnumAsNumberAction);
manager.add(saveLoadAction);
manager.add(pauseUpdatesAction);
manager.add(streamToFileAction);
manager.add(showNumbersAsHex);
manager.add(new OpenNewElementViewer());
}
private void makeActions() {
addHeaderElementAction = new AddHeaderElementAction(elementContentProvider);
addElementAction = new AddElementAction(elementContentProvider);
addElementAction.setEnabled(false);
clearAllUpdatesAction = new ClearAllUpdatesAction(elementContentProvider);
toggleAutoRevealAction = new ToggleAutoRevealAction(elementContentProvider);
activeColumnAction = new SetActiveColumnAction(elementContentProvider);
removeColumnAction = new RemoveColumnAction(elementContentProvider);
saveLoadAction = new SaveLoadAction(elementContentProvider);
streamToFileAction = new StreamToFileAction(this);
copyAction = new CopyAllAction(Display.getDefault(), elementContentProvider);
configureColumnAction = new ConfigureColumnsAction(elementContentProvider);
pauseUpdatesAction = new PauseUpdatesAction(elementContentProvider);
showTimeAction = new ShowTimeAction(elementContentProvider);
showTimeDeltaAction = new ShowTimeDeltaAction(elementContentProvider);
showEnumAsNumberAction = new ShowEnumAsNumberAction(elementContentProvider, false);
showNumbersAsHex = new ShowElementsAsHexAction(elementContentProvider, false);
}
private void hookDoubleClickAction() {
}
/**
* Passing the focus request to the viewer's control.
*/
@Override
public void setFocus() {
viewer.getControl().setFocus();
}
public boolean startStreaming(final String columnSetFile, final String fileName, final boolean disableRendering) {
final Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
if (columnSetFile != null) {
elementContentProvider.clearAllUpdates();
File file = new File(columnSetFile);
ParseResult parseResult = ColumnFileParser.parse(file);
switch (parseResult.getParseCode()) {
case SUCCESS:
elementContentProvider.removeAll();
elementContentProvider.loadColumns(parseResult.getColumnEntries());
break;
case FILE_HAS_NO_VALID_COLUMNS:
MessageDialogs.openColumnFileEmptyOrBad(shell);
return false;
case FILE_NOT_FOUND:
MessageDialogs.openColumnFileNotFound(shell);
return false;
case FILE_IO_EXCEPTION:
MessageDialogs.openColumnFileIoError(shell);
return false;
}
}
File file = new File(fileName);
try {
elementContentProvider.streamToFile(file);
} catch (Exception e) {
OseeLog.log(Activator.class, Level.SEVERE,
"Could not start streaming", e);
MessageDialogs.openStreamError(shell);
return false;
}
streamToFileAction.setChecked(true);
configureColumnAction.setEnabled(false);
addElementAction.setEnabled(false);
addHeaderElementAction.setEnabled(false);
removeColumnAction.setEnabled(false);
elementContentProvider.setUpdateView(!disableRendering);
return true;
}
public void stopStreaming() {
Displays.ensureInDisplayThread(new Runnable() {
@Override
public void run() {
try {
elementContentProvider.forceUpdate();
elementContentProvider.streamToFile(null);
elementContentProvider.setUpdateView(true);
configureColumnAction.setEnabled(true);
addElementAction.setEnabled(true);
addHeaderElementAction.setEnabled(true);
removeColumnAction.setEnabled(true);
streamToFileAction.setChecked(false);
} catch (Exception e) {
OseeLog.log(Activator.class, Level.SEVERE,
"Erri while attempting to stop streaming", e);
}
}
});
}
@Override
public void dispose() {
tracker.close();
copyAction.dispose();
super.dispose();
}
public void serviceStarted(final IOteMessageService service) {
Displays.pendInDisplayThread(new Runnable() {
@Override
public void run() {
addElementAction.setEnabled(true);
addHeaderElementAction.setEnabled(true);
viewer.setInput(service);
ParseResult result = ColumnFileParser.parse(OseeData.getFile(Constants.INTERNAL_FILE_NAME));
if (result.getParseCode() == ParseCode.SUCCESS) {
elementContentProvider.loadColumns(result.getColumnEntries());
}
}
});
}
public void serviceStopping(final IOteMessageService service) {
Displays.pendInDisplayThread(new Runnable() {
@Override
public void run() {
addElementAction.setEnabled(false);
addHeaderElementAction.setEnabled(false);
if (viewer.getTable().isDisposed()) {
return;
}
viewer.setInput(null);
}
});
}
public void addElement(ElementPath elementPath){
elementContentProvider.add(elementPath);
}
}