/*
* $Id$
*
* Copyright (c) 2004-2005 by the TeXlapse Team.
* 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 net.sourceforge.texlipse.tableview.views;
import net.sourceforge.texlipse.TexlipsePlugin;
import net.sourceforge.texlipse.actions.TexSelections;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.texteditor.ITextEditor;
/**
* @author Esa Seuranen
*
* The main class for LaTeX Table Editor view
*/
public class TexTableView extends ViewPart {
//viewer of the table
private TableViewer viewer;
//right click menu
private Menu menu;
//data of the table
private TexRowList rowList = new TexRowList();
//headers for the columns
private String columnNames[];
/**
* The content provider class is responsible for
* providing objects to the view. It can wrap
* existing objects in adapters or simply return
* objects as-is.
*/
class ViewContentProvider implements IStructuredContentProvider,
ITexRowListViewer {
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
if (newInput != null) {
((TexRowList) newInput).addChangeListener(this);
}
if (oldInput != null)
((TexRowList) oldInput).removeChangeListener(this);
}
public void dispose() {
rowList.removeChangeListener(this);
}
public Object[] getElements(Object parent) {
return rowList.getRows().toArray();
}
public void addRow(TexRow row) {
viewer.add(row);
}
public void insertRow(TexRow row) {
viewer.insert(row, rowList.indexOf(row));
}
public void removeRow(TexRow row) {
viewer.remove(row);
}
public void updateRow(TexRow row) {
viewer.update(row, null);
}
}
/**
* The label provider class is responsible for
* providing the lables for the objects
*/
class ViewLabelProvider extends LabelProvider implements
ITableLabelProvider {
public String getColumnText(Object obj, int index) {
return ((TexRow) obj).getCol(index);
}
public Image getColumnImage(Object obj, int index) {
return (null);
//return getImage(obj);
}
public Image getImage(Object obj) {
return (null);
//return PlatformUI.getWorkbench().
// getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
}
}
/**
* The constructor.
*/
public TexTableView() {
columnNames = new String[TexRow.COLUMNS];
for (int i = 0; i < TexRow.COLUMNS; i++)
columnNames[i] = "" + (TexRow.COLUMNS - i);
}
/**
* Creates the table component attaching it to the given composite object
*
* @param parent composite object
* @return The created table component
*/
public Table createTable(Composite parent) {
int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL
| SWT.HIDE_SELECTION | SWT.FULL_SELECTION;
Table table = new Table(parent, style);
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.grabExcessVerticalSpace = true;
gridData.horizontalSpan = 3;
table.setLayoutData(gridData);
table.setLinesVisible(true);
table.setHeaderVisible(true);
table.setToolTipText(TexlipsePlugin.getResourceString("tableviewTableTooltip"));
TableColumn column;
for (int i = 0; i < TexRow.COLUMNS; i++) {
column = new TableColumn(table, SWT.LEFT, 0);
column.setText(columnNames[i]);
column.setWidth(50);
}
//The way to add listener to column, so that rows are sorted when header is clicked
/*
column.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
tableViewer.setSorter(new TexRowSorter());
}
});
*/
menu = new Menu(parent);
MenuItem mi;
mi = new MenuItem(menu, SWT.SINGLE);
mi.setText(TexlipsePlugin.getResourceString("tableviewInsertRow"));
mi.setEnabled(true);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TexRow row = (TexRow) ((IStructuredSelection) viewer
.getSelection()).getFirstElement();
int index = -1;
if (row != null)
index = rowList.indexOf(row);
if (index != -1)
rowList.insertRow(index);
else
rowList.addRow(); // FIXME this is probably never executed
}
});
mi = new MenuItem(menu, SWT.SINGLE);
mi.setText(TexlipsePlugin.getResourceString("tableviewDeleteRow"));
mi.setEnabled(true);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TexRow row = (TexRow) ((IStructuredSelection) viewer
.getSelection()).getFirstElement();
if (row != null) {
rowList.removeRow(row);
}
}
});
mi = new MenuItem(menu, SWT.SINGLE);
mi.setText(TexlipsePlugin.getResourceString("tableviewClearAll"));
mi.setEnabled(true);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
rowList.clearAll();
}
});
new MenuItem(menu, SWT.SEPARATOR);
mi = new MenuItem(menu, SWT.SINGLE);
mi.setText(TexlipsePlugin.getResourceString("tableviewRowUp"));
mi.setEnabled(true);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TexRow row = (TexRow) ((IStructuredSelection) viewer
.getSelection()).getFirstElement();
if (row != null) {
rowList.move(row, rowList.indexOf(row) - 1);
}
}
});
mi = new MenuItem(menu, SWT.SINGLE);
mi.setText(TexlipsePlugin.getResourceString("tableviewRowDown"));
mi.setEnabled(true);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TexRow row = (TexRow) ((IStructuredSelection) viewer
.getSelection()).getFirstElement();
if (row != null) {
rowList.move(row, rowList.indexOf(row) + 2);
}
}
});
mi = new MenuItem(menu, SWT.SINGLE);
mi.setText(TexlipsePlugin.getResourceString("tableviewDuplicateRow"));
mi.setEnabled(true);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TexRow row = (TexRow) ((IStructuredSelection) viewer
.getSelection()).getFirstElement();
if (row != null) {
rowList.copy(row, rowList.indexOf(row));
}
}
});
new MenuItem(menu, SWT.SEPARATOR);
mi = new MenuItem(menu, SWT.SINGLE);
mi.setText(TexlipsePlugin.getResourceString("tableviewEditorImport"));
mi.setEnabled(true);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
//Get selection from texteditor
IEditorPart targetEditor = TexlipsePlugin
.getCurrentWorkbenchPage().getActiveEditor();
if (!(targetEditor instanceof ITextEditor)) {
return;
}
TexSelections selection = new TexSelections(
(ITextEditor) targetEditor);
TexRow row = (TexRow) ((IStructuredSelection) viewer
.getSelection()).getFirstElement();
int index = 0;
if (row != null)
index = rowList.indexOf(row);
rowList.importSelection(selection, index);
}
});
mi = new MenuItem(menu, SWT.SINGLE);
mi.setText(TexlipsePlugin.getResourceString("tableviewEditorExport"));
mi.setEnabled(true);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
String value = rowList.export();
//transfer string to clipboard
Clipboard cb = new Clipboard(null);
TextTransfer textTransfer = TextTransfer.getInstance();
cb.setContents(new Object[] { value },
new Transfer[] { textTransfer });
}
});
mi = new MenuItem(menu, SWT.SINGLE);
mi.setText(TexlipsePlugin.getResourceString("tableviewRawExport"));
mi.setEnabled(true);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
String value = rowList.exportRaw();
//transfer string to clipboard
Clipboard cb = new Clipboard(null);
TextTransfer textTransfer = TextTransfer.getInstance();
cb.setContents(new Object[] { value },
new Transfer[] { textTransfer });
}
});
new MenuItem(menu, SWT.SEPARATOR);
mi = new MenuItem(menu, SWT.SINGLE);
mi.setText(TexlipsePlugin.getResourceString("tableviewFlipRows"));
mi.setEnabled(true);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
rowList.flipRowsAndColumns();
}
});
mi = new MenuItem(menu, SWT.SINGLE);
mi.setText(TexlipsePlugin.getResourceString("tableviewMirrorColumns"));
mi.setEnabled(true);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
rowList.mirrorColumns();
}
});
mi = new MenuItem(menu, SWT.SINGLE);
mi.setText(TexlipsePlugin.getResourceString("tableviewMirrorRows"));
mi.setEnabled(true);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
rowList.mirrorRows();
}
});
table.setMenu(menu);
return (table);
}
/**
* This is a callback that will allow us
* to create the viewer and initialize it.
*/
public void createPartControl(Composite parent) {
// Create a composite to hold the children
GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL
| GridData.FILL_BOTH);
parent.setLayoutData(gridData);
//only one component...
GridLayout layout = new GridLayout(1, false);
layout.marginWidth = 4;
parent.setLayout(layout);
Table table = createTable(parent);
viewer = new TableViewer(table);
viewer.setUseHashlookup(true);
viewer.setColumnProperties(columnNames);
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setInput(rowList);
CellEditor[] editors = new CellEditor[TexRow.COLUMNS];
//ICellEditorListeners
for (int i = 0; i < TexRow.COLUMNS; i++) {
editors[i] = new TextCellEditor(table);
((Text) editors[i].getControl()).setTextLimit(256);
editors[i].getControl().addKeyListener(
new TexCellListener(viewer, rowList, i));
}
// Assign the cell editors to the viewer
viewer.setCellEditors(editors);
// Set the cell modifier for the viewer
viewer.setCellModifier(new TexCellModifier(viewer, rowList));
// Set the default sorter for the viewer
//viewer.setSorter(new LaTeXRowSorter(LaTeXRowSorter.COLUMN_1));
}
/**
* Shows user a message
*/
private void showMessage(String message) {
MessageDialog.openInformation(viewer.getControl().getShell(),
TexlipsePlugin.getResourceString("tableviewTableTitle"), message);
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
viewer.getControl().setFocus();
}
// public void dispose(){
// super.dispose();
// }
}