/*
* Copyright (c) 2012 European Synchrotron Radiation Facility,
* Diamond Light Source Ltd.
*
* 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
*/
package fable.framework.ui.editors;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.part.FileEditorInput;
import fable.framework.internal.IPropertyVarKeys;
import fable.framework.toolbox.Activator;
import fable.framework.toolbox.IImagesKeys;
import fable.framework.ui.actions.SaveAsColumnFileEditorAction;
import fable.framework.ui.actions.SaveColumnFileEditorAction;
public class ColumnFileEditor extends EditorPart implements
IPropertyChangeListener, IColumnFileEditor {
private static final String ID = "fable.framework.ui.ColumnFileEditor";
/** Column editor input. */
private ColumnFileEditorInput columnInput;
/** Boolean to get if editor have been changed. */
private boolean dirty = false;
/** tableViewer. */
private TableViewer tableViewer;
/**
* Color blue for rows.
*/
final org.eclipse.swt.graphics.Color light_blue = new org.eclipse.swt.graphics.Color(
Display.getCurrent(), 228, 247, 248);
/**
* Table that makes <code>tableViewer<code>. We are filling data via a
* SetData event because, contentProvider and labelProvider are not
* implemented here since we don' t have rows.
*/
private Table table;
/** A sort listener set on columns to sort values. */
private Listener sortListener;// listener to sort columns
/** An image for popup menu to remove a selected file from the table. */
private Image imgMenuRemove;
/** An image descriptor for button delete row. */
private ImageDescriptor GifDelete = fable.framework.toolbox.Activator
.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
IImagesKeys.BTN_IMG_DELETE);
private ImageDescriptor keep_descriptor = Activator
.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "images/check.gif");
/** This image is set to menu on table to keep selected rows. */
private Image imageKeep;
private SaveColumnFileEditorAction saveAction;
private SaveAsColumnFileEditorAction saveasAction;
/**
* Save as action for this editor
*/
// private IAction saveasAction;
/*
* private ImageDescriptor saveAs = fable.framework.ui.rcp.Activator
* .imageDescriptorFromPlugin( fable.framework.ui.rcp.Activator.PLUGIN_ID,
* "images/saveas.gif");
*/
// SaveColumnFileEditorAction action;
public ColumnFileEditor() {
// TODO Auto-generated constructor stub
}
@Override
public void doSave(IProgressMonitor monitor) {
columnInput.save();
dirty = false;
firePropertyChange(PROP_DIRTY);
}
@Override
public void doSaveAs() {
if (columnInput.saveAs()) {
dirty = false;
firePropertyChange(PROP_DIRTY);
this.setPartName(columnInput.getColumn().getFileName());
}
}
@Override
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
setSite(site);
setInput(input);
if (input instanceof ColumnFileEditorInput) {
columnInput = (ColumnFileEditorInput) input;
} else if (input instanceof FileEditorInput) {
// create a ColumnFileEditorInput
IPath ipath = ((FileEditorInput) input).getPath();
if (ipath != null) {
columnInput = new ColumnFileEditorInput(ipath.toString());
}
}
if (columnInput != null) {
this.setPartName(columnInput.getColumn().getFileName());
initSortListener();
columnInput.getColumn().addPropertyChangeListener(this);
}
// makeActions();
}
@Override
public boolean isDirty() {
return dirty;
}
@Override
public boolean isSaveAsAllowed() {
return dirty;
}
@Override
public void createPartControl(Composite parent) {
parent.setLayout(new GridLayout(1, false));
GridData gdExplorer = new GridData(GridData.FILL, GridData.FILL, true,
true);
gdExplorer.horizontalAlignment = GridData.FILL;
gdExplorer.verticalAlignment = GridData.FILL;
gdExplorer.horizontalSpan = 1;
tableViewer = new TableViewer(parent, SWT.MULTI | SWT.FULL_SELECTION
| SWT.BORDER | SWT.VIRTUAL);
//
tableViewer.setContentProvider(new ColumnFileContentProvider(
tableViewer));
tableViewer.setUseHashlookup(true);
tableViewer.setLabelProvider(new ColumnFileLabelProvider());
getSite().setSelectionProvider(tableViewer);
tableViewer.setInput(columnInput.getColumn());
table = tableViewer.getTable();
table.addMouseListener(new MouseListener() {
public void mouseDoubleClick(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseDown(MouseEvent e) {
if (e.button == 3) {
// System.out.println("mouse down" + key );
Menu menu = new Menu(Display.getCurrent().getActiveShell(),
SWT.POP_UP);
MenuItem mitemRemove = new MenuItem(menu, SWT.PUSH);
MenuItem mitemKeep = new MenuItem(menu, SWT.PUSH);
imgMenuRemove = GifDelete.createImage();
mitemRemove.setImage(imgMenuRemove);
mitemRemove.setText("Throw");
mitemRemove.addDisposeListener(new DisposeListener() {
// @Override
public void widgetDisposed(DisposeEvent arg0) {
if (imgMenuRemove != null
&& !imgMenuRemove.isDisposed()) {
imgMenuRemove.dispose();
}
}
});
mitemRemove.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
// remove rows
TableItem[] selection = table.getSelection();
if (selection.length > 0
&& table.getItemCount() > 0) {
table.getColumnCount();
// a table of id
Object[] idlist = new Object[selection.length];
for (int i = 0; i < selection.length; i++) {
idlist[i] = selection[i].getText(table
.getColumnCount() - 1);
}
columnInput.getColumn().removeRow(
idlist,
columnInput.getColumn()
.getColumnfileId());
dirty = true;
firePropertyChange(PROP_DIRTY);
}
}
});
imageKeep = keep_descriptor.createImage();
mitemKeep.setImage(imageKeep);
mitemKeep.setText("Keep");
mitemKeep.addDisposeListener(new DisposeListener() {
// @Override
public void widgetDisposed(DisposeEvent arg0) {
if (imageKeep != null && !imageKeep.isDisposed()) {
imageKeep.dispose();
}
}
});
mitemKeep.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
// keep rows
TableItem[] selection = table.getSelection();
if (selection.length > 0
&& table.getItemCount() > 0) {
table.getColumnCount();
// a table of id
Object[] idlist = new Object[selection.length];
for (int i = 0; i < selection.length; i++) {
idlist[i] = selection[i].getText(table
.getColumnCount() - 1);
}
columnInput.getColumn().keepRow(
idlist,
columnInput.getColumn()
.getColumnfileId());
dirty = true;
firePropertyChange(PROP_DIRTY);
}
}
});
menu.setVisible(true);
while (!menu.isDisposed() && menu.isVisible()) {
if (!Display.getCurrent().readAndDispatch())
Display.getCurrent().sleep();
}
menu.dispose();
}
}
public void mouseUp(MouseEvent e) {
// TODO Auto-generated method stub
}
});
table.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true,
true));
table.setHeaderVisible(true);
table.setLinesVisible(false);
table.addListener(SWT.SetData, new Listener() {
public void handleEvent(Event event) {
TableItem item = (TableItem) event.item;
int index = event.index;
item.setBackground((index % 2 == 0) ? Display.getCurrent()
.getSystemColor(SWT.COLOR_WHITE) : light_blue);
}
});
populateTable();
// getEditorSite().getActionBarContributor().setActiveEditor(this);
/*
* getEditorSite().getActionBars().setGlobalActionHandler(
* IVarKeys.SAVE_AS_ACTION, saveasAction);
*/
/*
* table.addListener(SWT.SetData,new Listener(){ public void
* handleEvent(Event event) { TableItem item = (TableItem)event.item;
* int index = event.index;
*
* item.setBackground((index%2==0)? Display.getCurrent().
* getSystemColor(SWT.COLOR_WHITE) : light_blue );
*
* for(int j=0; j<columnInput.getColumn().getNCols(); j++){ String key =
* table.getColumns()[j].getText(); item.setText(j,""+
* columnInput.getColumn(). getColumnFileCell(index, key));
*
* }
*
* }});
*/
makeActions();
// contributetoActionBar();
}
/*
* private void contributetoActionBar() { IActionBars bars =
* this.getEditorSite().getActionBars();
* fillLocalToolBar(bars.getToolBarManager());
*
*
* }
*
*
* private void fillLocalToolBar(IToolBarManager toolBarManager) {
* toolBarManager.add(saveAction); toolBarManager.add(saveasAction); }
*/
private void makeActions() {
saveAction = new SaveColumnFileEditorAction() {
@Override
public void run(IColumnFileEditor editor) {
((ColumnFileEditor) editor).doSave(null);
}
};
saveAction.setProps("Save column file");
saveasAction = new SaveAsColumnFileEditorAction() {
@Override
public void run(IColumnFileEditor editor) {
((ColumnFileEditor) editor).doSaveAs();
}
};
saveasAction.setProps("Save column file as...");
}
@Override
public void setFocus() {
// TODO Auto-generated method stub
}
public static String getId() {
return ID;
}
/**
* This methods set columns names and init the number of items in table for
* virtual tableViewer.<br>
* <code>table.setItemCount( columnInput.getColumn().getNRows());</code>
*/
private void populateTable() {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
table.removeAll();
table.clearAll();
while (table.getColumnCount() > 0) {
table.getColumn(0).removeListener(SWT.Selection,
sortListener);
table.getColumn(0).dispose();
}
// Set columns
String[] keys = columnInput.getColumn().getTitles();
for (int i = 0; i < columnInput.getColumn().getNCols(); i++) {
TableColumn tb = new TableColumn(table, SWT.LEFT);
tb.setText(keys[i]);
tb.addListener(SWT.Selection, sortListener);
}
table.setItemCount(columnInput.getColumn().getNRows());
for (int i = 0; i < table.getColumnCount(); i++) {
table.getColumn(i).pack();
}
}
});
}
/**
* This methods initializes sort listener when user select a column.
*/
private void initSortListener() {
sortListener = new Listener() {
public void handleEvent(Event e) {
TableColumn sortColumn = table.getSortColumn();
TableColumn currentColumn = (TableColumn) e.widget;
TableColumn[] cols = table.getColumns();
// tableViewer.update(element, properties)
TableColumn column = (TableColumn) e.widget;
int index = 0;
for (int x = 0; index == 0 && x < cols.length; x++) {
if (cols[x].getText().equals(column.getText())) {
index = x;
}
}
int dir = table.getSortDirection();
if (sortColumn == currentColumn) {
dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
} else {
table.setSortColumn(currentColumn);
dir = SWT.UP;
}
columnInput.getColumn().setSortedIndex(index, dir);
tableViewer.setInput(columnInput.getColumn());
table.setSortDirection(dir);
table.setSortColumn(column);
}
};
}
/*
* private void makeActions() {
*
* saveasAction = new Action("saveAs") { public void run() { doSaveAs(); }
*
* }; saveasAction.setId(IVarKeys.SAVE_AS_ACTION);
* saveasAction.setImageDescriptor(saveAs);
* saveasAction.setToolTipText("Save this column file as ... ");
*
* }
*/
@Override
public boolean isSaveOnCloseNeeded() {
return true;
}
@Override
public void dispose() {
columnInput.getColumn().removePropertyrChangeListener(this);
}
// @Override
public void propertyChange(PropertyChangeEvent arg0) {
if (arg0.getProperty().equals(IPropertyVarKeys.UPDATECOLUMN)) {
dirty = true;
firePropertyChange(PROP_DIRTY);
// columnInput.getColumn().setRows();
table.setItemCount(columnInput.getColumn().getNRows());
tableViewer.setInput(columnInput.getColumn());
populateTable();
} else if (arg0.getProperty().equals(IPropertyVarKeys.PROPDIRTY)) {
dirty = (Boolean) arg0.getNewValue();
firePropertyChange(PROP_DIRTY);
this.setPartName(columnInput.getColumn().getFileName());
}
}
/*
* public IAction getAction() {
*
* return saveasAction; }
*/
}