/*******************************************************************************
* Copyright (c) 2006, 2009 University of Edinburgh.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the BSD Licence, which
* accompanies this feature and can be downloaded from
* http://groups.inf.ed.ac.uk/pepa/update/licence.txt
*******************************************************************************/
package uk.ac.ed.inf.common.ui.plotview.views;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
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.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.ViewPart;
import uk.ac.ed.inf.common.ui.plotting.IChart;
import uk.ac.ed.inf.common.ui.plotting.dialogs.ChartPreview;
import uk.ac.ed.inf.common.ui.plotview.views.actions.CloseTabAction;
import uk.ac.ed.inf.common.ui.plotview.views.actions.PlotViewAction;
public class PlotView extends ViewPart implements ISelectionProvider {
public static final String ID = "uk.ac.ed.inf.common.ui.plotview.views.PlotView";
private TabFolder folder;
private PlotViewAction renameTabAction;
private PlotViewAction closeTabAction;
private PlotViewAction saveToPNGAction;
private PlotViewAction detachAction;
private PlotViewAction saveToCSVAction;
private HashMap<TabItem, IChart> charts = new HashMap<TabItem, IChart>();
private IWorkbenchPage page;
private int figureCounter = 1;
// /private EditAction editAction;
/**
* The constructor.
*/
public PlotView() {
}
public synchronized void reveal(IChart chart) {
this.reveal(chart, "Figure " + figureCounter++);
}
public synchronized void reveal(IChart chart, String name) {
if (name == null || chart == null)
throw new NullPointerException();
TabItem item = new TabItem(folder, SWT.NULL);
item.setText(name);
Composite composite = new Composite(folder, SWT.NONE);
composite.setLayout(new FillLayout());
Canvas paintCanvas = new Canvas(composite, SWT.BORDER);
// paintCanvas.setLayoutData( new GridData( GridData.FILL_BOTH ) );
paintCanvas.setBackground(Display.getDefault().getSystemColor(
SWT.COLOR_WHITE));
ChartPreview preview = new ChartPreview(chart);
paintCanvas.addPaintListener(preview);
paintCanvas.addControlListener(preview);
preview.setPreview(paintCanvas);
preview.renderModel();
// new ChartCanvas(chart, composite, SWT.NULL);
item.setControl(composite);
charts.put(item, chart);
folder.setSelection(item);
notify(new StructuredSelection(chart));
// validateActions();
}
public synchronized void close(IChart chart) {
TabItem itemToDispose = getTab(chart);
if (itemToDispose != null) {
charts.remove(itemToDispose);
if (!itemToDispose.isDisposed())
itemToDispose.dispose();
}
notify((IStructuredSelection) getSelection());
}
synchronized TabItem getTab(IChart chart) {
TabItem foundItem = null;
for (Map.Entry<TabItem, IChart> entry : charts.entrySet()) {
if (entry.getValue() == chart) {
foundItem = entry.getKey();
break;
}
}
return foundItem;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IViewPart#init(org.eclipse.ui.IViewSite)
*/
public void init(IViewSite site) throws PartInitException {
super.init(site);
getSite().setSelectionProvider(this);
page = getSite().getPage();
}
IWorkbenchPage getPage() {
return page;
}
/**
* This is a callback that will allow us to create the viewer and initialize
* it.
*/
public void createPartControl(Composite parent) {
SelectionListener listener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
PlotView.this.notify((IStructuredSelection) getSelection());
}
};
folder = new TabFolder(parent, SWT.NONE);
folder.addSelectionListener(listener);
makeActions();
hookContextMenu();
contributeToActionBars();
}
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
PlotView.this.fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(folder);
folder.setMenu(menu);
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalToolBar(bars.getToolBarManager());
}
private void fillContextMenu(IMenuManager manager) {
manager.add(renameTabAction);
manager.add(closeTabAction);
// Other plug-ins can contribute there actions here
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void fillLocalToolBar(IToolBarManager manager) {
manager.add(renameTabAction);
manager.add(detachAction);
manager.add(closeTabAction);
manager.add(new Separator());
// manager.add(editAction);
manager.add(saveToPNGAction);
manager.add(saveToCSVAction);
}
private void makeActions() {
renameTabAction = new RenameTabAction(this);
saveToPNGAction = new SaveToPNGAction(this);
closeTabAction = new CloseTabAction(this);
detachAction = new DetachAction(this);
saveToCSVAction = new SaveToCSVAction(this);
// editAction = new EditAction(this);
// serialiseAction = new SerialiseAction(this);
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
folder.setFocus();
}
private ArrayList<ISelectionChangedListener> listeners = new ArrayList<ISelectionChangedListener>();
public void addSelectionChangedListener(ISelectionChangedListener listener) {
if (listener != null || !listeners.contains(listener))
listeners.add(listener);
}
public ISelection getSelection() {
int selectionIndex = this.folder.getSelectionIndex();
if (selectionIndex == -1)
return StructuredSelection.EMPTY;
IChart chart = charts.get(folder.getItem(selectionIndex));
if (chart == null)
return StructuredSelection.EMPTY;
return new StructuredSelection(chart);
}
public void removeSelectionChangedListener(
ISelectionChangedListener listener) {
listeners.remove(listener);
}
public void setSelection(ISelection selection) {
if (selection == null || !(selection instanceof IStructuredSelection)
|| selection.isEmpty())
return;
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
Object chart = structuredSelection.getFirstElement();
if (!(chart instanceof IChart))
return;
IChart newSelection = (IChart) chart;
TabItem item = getTab(newSelection);
if (item != null) {
folder.setSelection(item);
notify(structuredSelection);
}
}
private void notify(IStructuredSelection selection) {
for (ISelectionChangedListener l : listeners) {
l.selectionChanged(new SelectionChangedEvent(this, selection));
}
}
}