package de.urszeidler.shr5.runtime.ui.editor.pages;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.ChangeEvent;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.databinding.EMFObservables;
import org.eclipse.emf.ecore.EEnumLiteral;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
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.Control;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.wb.swt.SWTResourceManager;
import org.eclipse.zest.core.viewers.EntityConnectionData;
import org.eclipse.zest.core.viewers.GraphViewer;
import org.eclipse.zest.core.viewers.IEntityConnectionStyleProvider;
import org.eclipse.zest.core.viewers.IEntityStyleProvider;
import org.eclipse.zest.core.viewers.IGraphEntityContentProvider;
import org.eclipse.zest.core.viewers.IGraphEntityRelationshipContentProvider;
import org.eclipse.zest.core.widgets.ZestStyles;
import org.eclipse.zest.layouts.LayoutAlgorithm;
import org.eclipse.zest.layouts.LayoutStyles;
import org.eclipse.zest.layouts.algorithms.TreeLayoutAlgorithm;
import de.urszeidler.eclipse.shr5.util.AdapterFactoryUtil;
import de.urszeidler.emf.commons.ui.util.EmfFormBuilder.ReferenceManager;
import de.urszeidler.shr5.ecp.Activator;
import de.urszeidler.shr5.ecp.editor.actions.ExportObjectAction;
import de.urszeidler.shr5.ecp.editor.pages.AbstractShr5Page;
import de.urszeidler.shr5.ecp.editor.widgets.BeschreibbarWidget;
import de.urszeidler.shr5.ecp.editor.widgets.TreeTableWidget;
import de.urszeidler.shr5.ecp.preferences.PreferenceConstants;
import de.urszeidler.shr5.scripting.Placement;
import de.urszeidler.shr5.scripting.PlacementOptions;
import de.urszeidler.shr5.scripting.Script;
import de.urszeidler.shr5.scripting.ScriptingFactory;
import de.urszeidler.shr5.scripting.ScriptingPackage;
public class ScriptPage extends AbstractShr5Page<Script> {
private Script object;
private EditingDomain editingDomain;
protected DataBindingContext m_bindingContext;
private IObservableList observeList;
private Color combatColor = ColorConstants.red;
private Color combatColorF = ColorConstants.white;
private IPreferenceStore store = Activator.getDefault().getPreferenceStore();
public class ZestRelationContentProvider extends ArrayContentProvider implements IGraphEntityRelationshipContentProvider {
@Override
public Object[] getRelationships(Object source, Object dest) {
return null;
}
}
public class ZestNodeContentProvider extends ArrayContentProvider implements IGraphEntityContentProvider {
@Override
public Object[] getConnectedTo(Object entity) {
if (entity instanceof Placement) {
Placement node = (Placement)entity;
return node.getNextPlacements().toArray();
}
throw new RuntimeException("Type not supported");
}
}
public class ZestLabelProvider extends LabelProvider implements IEntityConnectionStyleProvider,IEntityStyleProvider {
@Override
public String getText(Object element) {
if (element instanceof EntityConnectionData) {
// EntityConnectionData test = (EntityConnectionData) element;
return "";
}
return AdapterFactoryUtil.getInstance().getLabelProvider().getText(element);
}
@Override
public Image getImage(Object element) {
return AdapterFactoryUtil.getInstance().getLabelProvider().getImage(element);
}
@Override
public int getConnectionStyle(Object src, Object dest) {
return ZestStyles.CONNECTIONS_DIRECTED;
}
@Override
public Color getColor(Object src, Object dest) {
return null;
}
@Override
public Color getHighlightColor(Object src, Object dest) {
return null;
}
@Override
public int getLineWidth(Object src, Object dest) {
return -1;
}
@Override
public IFigure getTooltip(Object entity) {
if (entity instanceof Placement) {
Placement p = (Placement)entity;
Label label = new Label();
label.setText(p.getBeschreibung());
return label;
}
return null;
}
@Override
public Color getNodeHighlightColor(Object entity) {
return null;
}
@Override
public Color getBorderColor(Object entity) {
return null;
}
@Override
public Color getBorderHighlightColor(Object entity) {
return null;
}
@Override
public int getBorderWidth(Object entity) {
return 1;
}
@Override
public Color getBackgroundColour(Object entity) {
if (entity instanceof Placement) {
Placement p = (Placement)entity;
if(p.getOptions().contains(PlacementOptions.COMBAT))
return SWTResourceManager.getColor(PreferenceConverter.getColor(store, PreferenceConstants.SCRIPT_GRAPH_COLOR_BG+PlacementOptions.COMBAT));// combatColorF;combatColor;
EList<EEnumLiteral> eLiterals = ScriptingPackage.Literals.PLACEMENT_OPTIONS.getELiterals();
for (EEnumLiteral eEnumLiteral : eLiterals) {
if(p.getOptions().contains(eEnumLiteral.getInstance()))
return SWTResourceManager.getColor(PreferenceConverter.getColor(store, PreferenceConstants.SCRIPT_GRAPH_COLOR_BG+eEnumLiteral.getName()));
}
}
return null;
}
@Override
public Color getForegroundColour(Object entity) {
if (entity instanceof Placement) {
Placement p = (Placement)entity;
if(p.getOptions().contains(PlacementOptions.COMBAT))
return SWTResourceManager.getColor(PreferenceConverter.getColor(store, PreferenceConstants.SCRIPT_GRAPH_COLOR_FG+PlacementOptions.COMBAT));// combatColorF;
EList<EEnumLiteral> eLiterals = ScriptingPackage.Literals.PLACEMENT_OPTIONS.getELiterals();
for (EEnumLiteral eEnumLiteral : eLiterals) {
if(p.getOptions().contains(eEnumLiteral.getInstance()))
return SWTResourceManager.getColor(PreferenceConverter.getColor(store, PreferenceConstants.SCRIPT_GRAPH_COLOR_FG+eEnumLiteral.getName()));
}
}
return null;
}
@Override
public boolean fisheyeNode(Object entity) {
return false;
}
}
/**
* Create the form page.
*
* @param id
* @param title
*/
public ScriptPage(String id, String title) {
super(id, title);
}
/**
* Create the form page.
*
* @param editor
* @param id
* @param title
* @wbp.parser.constructor
* @wbp.eval.method.parameter id "Some id"
* @wbp.eval.method.parameter title "Some title"
*/
public ScriptPage(FormEditor editor, String id, String title) {
super(editor, id, title);
this.object = ScriptingFactory.eINSTANCE.createScript();
}
public ScriptPage(FormEditor editor, String id, String title, Script object, EditingDomain editingDomain, ReferenceManager manager) {
super(editor, id, title, manager);
this.object = object;
this.editingDomain = editingDomain;
}
@Override
public void dispose() {
observeList.dispose();
super.dispose();
}
/**
* Create contents of the form.
*
* @param managedForm
*/
@Override
protected void createFormContent(IManagedForm managedForm) {
FormToolkit toolkit = managedForm.getToolkit();
ScrolledForm form = managedForm.getForm();
LabelProvider labelProvider = AdapterFactoryUtil.getInstance().getLabelProvider();
form.setText(labelProvider.getText(object));
Composite body = form.getBody();
toolkit.decorateFormHeading(form.getForm());
toolkit.paintBordersFor(body);
form.getToolBarManager().add(new ExportObjectAction(form.getShell(), object));
form.getToolBarManager().update(true);
managedForm.getForm().getBody().setLayout(new GridLayout(1, false));
BeschreibbarWidget beschreibbarWidget = new BeschreibbarWidget(managedForm.getForm().getBody(), SWT.NONE, object, toolkit, editingDomain);
beschreibbarWidget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
managedForm.getToolkit().adapt(beschreibbarWidget);
managedForm.getToolkit().paintBordersFor(beschreibbarWidget);
Composite composite_2 = new Composite(managedForm.getForm().getBody(), SWT.NONE);
composite_2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
managedForm.getToolkit().adapt(composite_2);
managedForm.getToolkit().paintBordersFor(composite_2);
composite_2.setLayout(new GridLayout(3, false));
Section sctnScriptGraph = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TWISTIE | Section.TITLE_BAR);
sctnScriptGraph.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
managedForm.getToolkit().paintBordersFor(sctnScriptGraph);
sctnScriptGraph.setText("Script graph");
sctnScriptGraph.setExpanded(true);
Composite composite = managedForm.getToolkit().createComposite(sctnScriptGraph, SWT.NONE);
sctnScriptGraph.setClient(composite);
managedForm.getToolkit().paintBordersFor(composite);
composite.setLayout(new GridLayout(1, false));
ToolBar toolBar = new ToolBar(composite, SWT.FLAT | SWT.RIGHT);
// sctnScriptGraph.setDescriptionControl(toolBar);
toolBar.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, true, false, 1, 1));
managedForm.getToolkit().adapt(toolBar);
managedForm.getToolkit().paintBordersFor(toolBar);
final GraphViewer graphViewer = new GraphViewer(composite, SWT.NONE);
graphViewer.addDoubleClickListener(this);
Control control = graphViewer.getControl();
GridData gd_control = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
gd_control.minimumHeight = 200;
control.setLayoutData(gd_control);
Composite composite_1 = managedForm.getToolkit().createComposite(managedForm.getForm().getBody(), SWT.NONE);
composite_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 1, 1));
managedForm.getToolkit().paintBordersFor(composite_1);
composite_1.setLayout(new GridLayout(2, true));
TreeTableWidget treeTableWidget = new TreeTableWidget(composite_1, labelProvider.getText(ScriptingPackage.Literals.SCRIPT__PLACEMENTS),
SWT.NONE, object, ScriptingPackage.Literals.SCRIPT__PLACEMENTS, toolkit, mananger, editingDomain, this);
GridData gd_treeTableWidget = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
gd_treeTableWidget.heightHint = 200;
treeTableWidget.setLayoutData(gd_treeTableWidget);
treeTableWidget.setSize(584, 133);
managedForm.getToolkit().adapt(treeTableWidget);
managedForm.getToolkit().paintBordersFor(treeTableWidget);
treeTableWidget = new TreeTableWidget(composite_1, labelProvider.getText(ScriptingPackage.Literals.SCRIPT__ALL_TEAMS), SWT.NONE, object,
ScriptingPackage.Literals.SCRIPT__ALL_TEAMS, toolkit, mananger, editingDomain, this);
treeTableWidget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1));
managedForm.getToolkit().adapt(treeTableWidget);
managedForm.getToolkit().paintBordersFor(treeTableWidget);
m_bindingContext = initDataBindings();
createFormBuilder(managedForm);
emfFormBuilder.addTextEntry(ScriptingPackage.Literals.SCRIPT__ENTRY, composite_2);
LayoutAlgorithm layout = new TreeLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING);
graphViewer.setContentProvider(new ZestNodeContentProvider());
graphViewer.setLabelProvider(new ZestLabelProvider());
graphViewer.setInput(object.getPlacements());
graphViewer.setLayoutAlgorithm(layout, true);
graphViewer.applyLayout();
// ZoomContributionViewItem zoomContributionViewItem = new ZoomContributionViewItem(new IZoomableWorkbenchPart() {
// @Override
// public AbstractZoomableViewer getZoomableViewer() {
// return graphViewer;
// }
// });
// zoomContributionViewItem.fill(toolBar, 0);
observeList = EMFObservables.observeList(m_bindingContext.getValidationRealm(), object, ScriptingPackage.Literals.SCRIPT__PLACEMENTS);
observeList.addChangeListener(new IChangeListener() {
@Override
public void handleChange(ChangeEvent event) {
graphViewer.setInput(object.getPlacements());
}
});
emfFormBuilder.buildinComposite(m_bindingContext, managedForm.getForm().getBody(), object);
managedForm.reflow(true);
}
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
return bindingContext;
}
@Override
protected EditingDomain getEditingDomain() {
return editingDomain;
}
}