package com.dubture.composer.ui.editor.composer; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Arrays; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import com.dubture.composer.ui.controller.ScriptsController; import com.dubture.composer.ui.dialogs.ScriptDialog; import com.dubture.composer.ui.editor.ComposerFormPage; import com.dubture.composer.ui.editor.FormLayoutFactory; import com.dubture.composer.ui.editor.TreeSection; import com.dubture.composer.ui.parts.TreePart; import com.dubture.getcomposer.core.collection.JsonArray; import com.dubture.getcomposer.core.objects.Scripts; public class ScriptsSection extends TreeSection implements PropertyChangeListener { private TreeViewer scriptsViewer; private IAction addAction; private IAction editAction; private IAction removeAction; private static final int ADD_INDEX = 0; private static final int EDIT_INDEX = 1; private static final int REMOVE_INDEX = 2; public ScriptsSection(ComposerFormPage page, Composite parent) { super(page, parent, Section.DESCRIPTION, new String[]{"Add...", "Edit...", "Remove"}); createClient(getSection(), page.getManagedForm().getToolkit()); } @Override protected void createClient(Section section, FormToolkit toolkit) { section.setText("Scripts"); section.setDescription("Manage the scripts for your package."); section.setLayout(FormLayoutFactory.createClearGridLayout(false, 1)); GridData gd = new GridData(GridData.FILL_BOTH); gd.grabExcessVerticalSpace = true; section.setLayoutData(gd); Composite container = createClientContainer(section, 2, toolkit); createViewerPartControl(container, SWT.SINGLE, 2, toolkit); TreePart treePart = getTreePart(); ScriptsController scriptsController = new ScriptsController(); scriptsViewer = treePart.getTreeViewer(); scriptsViewer.setContentProvider(scriptsController); scriptsViewer.setLabelProvider(scriptsController); toolkit.paintBordersFor(container); section.setClient(container); section.setLayout(FormLayoutFactory.createClearGridLayout(false, 1)); scriptsViewer.setInput(composerPackage.getScripts()); composerPackage.addPropertyChangeListener(this); updateButtons(); makeActions(); updateMenu(); } protected boolean createCount() { return true; } private void updateButtons() { ISelection selection = scriptsViewer.getSelection(); TreePart treePart = getTreePart(); treePart.setButtonEnabled(ADD_INDEX, enabled); treePart.setButtonEnabled(EDIT_INDEX, !selection.isEmpty() && enabled); treePart.setButtonEnabled(REMOVE_INDEX, !selection.isEmpty() && enabled); } private void updateMenu() { IStructuredSelection selection = (IStructuredSelection)scriptsViewer.getSelection(); editAction.setEnabled(selection.size() > 0); removeAction.setEnabled(selection.size() > 0); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); updateButtons(); refresh(); scriptsViewer.getTree().setEnabled(enabled); } public void refresh() { scriptsViewer.refresh(); super.refresh(); } @Override public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName().startsWith("scripts")) { refresh(); } } protected void selectionChanged(IStructuredSelection sel) { updateButtons(); updateMenu(); } private void makeActions() { addAction = new Action("Add...") { @Override public void run() { handleAdd(); } }; editAction = new Action("Edit...") { @Override public void run() { handleEdit(); } }; removeAction = new Action("Remove") { @Override public void run() { handleRemove(); } }; } @Override protected void fillContextMenu(IMenuManager manager) { manager.add(addAction); manager.add(editAction); manager.add(removeAction); } private void handleAdd() { ScriptDialog diag = new ScriptDialog(scriptsViewer.getTree().getShell()); if (!scriptsViewer.getSelection().isEmpty()) { Object element = ((StructuredSelection)scriptsViewer.getSelection()).getFirstElement(); ScriptsController controller = (ScriptsController)scriptsViewer.getLabelProvider(); String text = controller.getText(element); if (Arrays.asList(Scripts.getEvents()).contains(text)) { diag.setEvent(text); } } if (diag.open() == Dialog.OK) { composerPackage.getScripts().getAsArray(diag.getEvent()).add(diag.getHandler()); refresh(); } } private void handleEdit() { Object element = ((StructuredSelection)scriptsViewer.getSelection()).getFirstElement(); ScriptsController controller = (ScriptsController)scriptsViewer.getLabelProvider(); String text = controller.getText(element); ScriptDialog diag = new ScriptDialog(scriptsViewer.getTree().getShell()); // edit event if (Arrays.asList(Scripts.getEvents()).contains(text)) { diag.setEvent(text); diag.setHandlerEnabled(false); if (diag.open() == Dialog.OK) { String event = diag.getEvent(); if (!event.equalsIgnoreCase(text)) { composerPackage.getScripts().set(event, composerPackage.getScripts().getAsArray(text)); composerPackage.getScripts().remove(text); } } } // edit handler else { String event = controller.getText(controller.getParent(element)); diag.setEvent(event); diag.setHandler(text); diag.setEventEnabled(false); if (diag.open() == Dialog.OK) { String handler = diag.getHandler(); if (!handler.equalsIgnoreCase(text)) { JsonArray events = composerPackage.getScripts().getAsArray(event); events.replace(text, handler); } } } } private void handleRemove() { Object element = ((StructuredSelection)scriptsViewer.getSelection()).getFirstElement(); ScriptsController controller = (ScriptsController)scriptsViewer.getLabelProvider(); String text = controller.getText(element); // remove event if (Arrays.asList(Scripts.getEvents()).contains(text)) { MessageDialog diag = new MessageDialog( scriptsViewer.getTree().getShell(), "Remove Event", null, "Do you really wan't to remove " + text + "?", MessageDialog.WARNING, new String[] {"Yes", "No"}, 0); if (diag.open() == Dialog.OK) { composerPackage.getScripts().remove(text); } } // remove handler else { String event = controller.getText(controller.getParent(element)); MessageDialog diag = new MessageDialog( scriptsViewer.getTree().getShell(), "Remove Event", null, "Do you really wan't to remove " + text + " in " + event + "?", MessageDialog.WARNING, new String[] {"Yes", "No"}, 0); if (diag.open() == Dialog.OK) { JsonArray events = composerPackage.getScripts().getAsArray(event); events.remove(text); } } } @Override protected void buttonSelected(int index) { switch (index) { case ADD_INDEX: handleAdd(); break; case EDIT_INDEX: handleEdit(); break; case REMOVE_INDEX: handleRemove(); break; } } }