package damp.ekeko.snippets.gui;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PlatformUI;
import damp.ekeko.snippets.data.SnippetOperator;
import damp.ekeko.snippets.data.TemplateGroup;
public class OperatorOperandsViewer extends SashForm {
private TreeViewer operatorTreeViewer;
private Tree operatorTree;
private TableViewer operandsTableViewer;
private Table operandsTable;
private TemplateGroup jGroup;
private Object cljSnippet, cljSelectedSnippetNode;
private Label operatorLabel;
public OperatorOperandsViewer(Composite parent, int style) {
super(parent, style);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
this.setLayout(gridLayout);
operatorTreeViewer = new TreeViewer(this, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
operatorTreeViewer.setAutoExpandLevel(3);
operatorTree = operatorTreeViewer.getTree();
GridData gd_operatorTree = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1);
// gd_operatorTree.heightHint = 400;
operatorTree.setLayoutData(gd_operatorTree);
TreeViewerColumn operatorNameColumn = new TreeViewerColumn(operatorTreeViewer, SWT.NONE);
TreeColumn trclmnOperator = operatorNameColumn.getColumn();
trclmnOperator.setWidth(200);
trclmnOperator.setText("Operator");
//ColumnViewerToolTipSupport.enableFor(operatorTreeViewer, ToolTip.NO_RECREATE);
operatorNameColumn.setLabelProvider(new OperatorTreeLabelProvider());
operatorTreeViewer.setContentProvider(new OperatorTreeContentProvider());
operatorTree.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
updateWidgets();
}
});
/*
TextViewer textViewer = new TextViewer(this, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
textOpInfo = textViewer.getTextWidget();
textOpInfo.setEditable(false);
GridData gd_textOpInfo = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1);
gd_textOpInfo.heightHint = 50;
textOpInfo.setLayoutData(gd_textOpInfo);
*/
operatorLabel = new Label(this, SWT.NONE | SWT.WRAP);
GridData gd_operatorLabel = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
// gd_operatorLabel.heightHint = 31;
operatorLabel.setLayoutData(gd_operatorLabel);
operandsTableViewer = new TableViewer(this, SWT.BORDER | SWT.FULL_SELECTION);
operandsTable = operandsTableViewer.getTable();
operandsTable.setLinesVisible(true);
operandsTable.setHeaderVisible(true);
GridData gd_tableOpArgs = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
gd_tableOpArgs.heightHint = 31;
operandsTable.setLayoutData(gd_tableOpArgs);
operandsTableViewer.setContentProvider(new ArrayContentProvider());
//operandsTableDecorator = new OperandsTableDecorator(operandsTable);
TableViewerColumn operandDescriptionCol = new TableViewerColumn(operandsTableViewer, SWT.NONE);
TableColumn operandDescriptionColCol = operandDescriptionCol.getColumn();
operandDescriptionColCol.setWidth(150);
operandDescriptionColCol.setText("Operand");
operandDescriptionCol.setLabelProvider(new OperandBindingLabelProviderDescription());
TableViewerColumn operandValueCol = new TableViewerColumn(operandsTableViewer, SWT.NONE);
TableColumn operandValueColCol = operandValueCol.getColumn();
operandValueColCol.setWidth(150);
operandValueColCol.setText("Value");
operandValueCol.setLabelProvider(new OperatorOperandBindingLabelProviderValue());
operandValueCol.setEditingSupport(new OperatorOperandBindingEditingSupport(this));
this.setOrientation(SWT.VERTICAL);
this.setWeights(new int[] {8,1,3});
}
public Object getSelectedOperator() {
IStructuredSelection selection = (IStructuredSelection) operatorTreeViewer.getSelection();
return selection.getFirstElement();
}
public Object getOperands() {
return operandsTableViewer.getInput();
}
public TemplateGroup getTemplateGroup() {
return jGroup;
}
public void setInput(TemplateGroup jGroup, Object cljSnippet, Object cljSelectedSnippetNode) {
this.jGroup = jGroup;
this.cljSnippet = cljSnippet;
this.cljSelectedSnippetNode = cljSelectedSnippetNode;
updateWidgets();
}
private void updateWidgets() {
//clear errors from cell editor validators
updateWorkbenchStatusErrorLine("");
operatorTreeViewer.setInput(new TemplateGroupTemplateElement(jGroup.getGroup(), cljSnippet, cljSelectedSnippetNode));
for(TreeColumn tc : operatorTree.getColumns())
tc.pack(); //resizes
Object selectedOperator = getSelectedOperator();
if(selectedOperator == null || !SnippetOperator.isOperator(selectedOperator)) {
operandsTableViewer.setInput(null);
operatorLabel.setText("");
return;
}
//textOpInfo.setText(SnippetOperator.getDescription(selectedOperator));
operatorLabel.setText(SnippetOperator.getDescription(selectedOperator));
operandsTableViewer.setInput(SnippetOperator.getOperands(jGroup.getGroup(), cljSnippet, cljSelectedSnippetNode, selectedOperator));
}
public void updateWorkbenchStatusErrorLine(String message) {
IWorkbenchPartSite site = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart().getSite();
//TODO: figure out nicer way to get to the site of the view in which this viewer is embedded
IActionBars actionBars;
if(site instanceof IViewSite) {
IViewSite viewSite = (IViewSite) site;
actionBars = viewSite.getActionBars();
} else {
IEditorSite editorSite = (IEditorSite) site;
actionBars = editorSite.getActionBars();
}
IStatusLineManager statusLineManager = actionBars.getStatusLineManager();
statusLineManager.setErrorMessage(message);
}
public TableViewer getTableViewer() {
return operandsTableViewer;
}
public Object getSnippet() {
return cljSnippet;
}
public Object getSelectedSnippetNode() {
return cljSelectedSnippetNode;
}
}