/*******************************************************************************
* Copyright (c) 2012, 2016, 2017 PDT Extension Group and others.
* 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
*
* Contributors:
* PDT Extension Group - initial API and implementation
* Kaloyan Raev - [501269] externalize strings
*******************************************************************************/
package org.eclipse.php.composer.ui.editor.composer;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
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.osgi.util.NLS;
import org.eclipse.php.composer.api.objects.Script;
import org.eclipse.php.composer.api.objects.Script.HandlerValue;
import org.eclipse.php.composer.ui.controller.ScriptsController;
import org.eclipse.php.composer.ui.dialogs.ScriptDialog;
import org.eclipse.php.composer.ui.editor.ComposerFormPage;
import org.eclipse.php.composer.ui.editor.FormLayoutFactory;
import org.eclipse.php.composer.ui.editor.TreeSection;
import org.eclipse.php.composer.ui.parts.TreePart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
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[] { Messages.ScriptsSection_AddButton,
Messages.ScriptsSection_EditButton, Messages.ScriptsSection_RemoveButton });
createClient(getSection(), page.getManagedForm().getToolkit());
}
@Override
protected void createClient(Section section, FormToolkit toolkit) {
section.setText(Messages.ScriptsSection_Title);
section.setDescription(Messages.ScriptsSection_Description);
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(treePart.getTreeViewer());
scriptsViewer = treePart.getTreeViewer();
// optimize object manipulations by avoiding unnecessary object cloning:
scriptsViewer.setUseHashlookup(true);
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()
&& !(((StructuredSelection) selection).getFirstElement() instanceof Script) && 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")) { //$NON-NLS-1$
refresh();
}
}
protected void selectionChanged(IStructuredSelection sel) {
updateButtons();
updateMenu();
}
private void makeActions() {
addAction = new Action(Messages.ScriptsSection_AddActionTitle) {
@Override
public void run() {
handleAdd();
}
};
editAction = new Action(Messages.ScriptsSection_EditActionTitle) {
@Override
public void run() {
handleEdit();
}
};
removeAction = new Action(Messages.ScriptsSection_RemoveActionTitle) {
@Override
public void run() {
handleRemove();
}
};
}
@Override
protected void fillContextMenu(IMenuManager manager) {
manager.add(addAction);
manager.add(editAction);
manager.add(removeAction);
}
private void handleAdd() {
Script script = null;
Object element = ((StructuredSelection) scriptsViewer.getSelection()).getFirstElement();
// get parent if element is HandlerValue
if (element instanceof HandlerValue) {
element = ((ScriptsController) scriptsViewer.getContentProvider()).getParent(element);
}
if (element instanceof Script) {
script = (Script) element;
}
Script dialogScript = new Script(script != null ? script.getScript() : null, new HandlerValue("")); //$NON-NLS-1$
ScriptDialog dialog = new ScriptDialog(scriptsViewer.getTree().getShell(), dialogScript,
dialogScript.getFirst());
if (dialog.open() == Dialog.OK && dialog.getScript().getScript() != null) {
assert dialogScript == dialog.getScript();
composerPackage.getScripts().add(dialog.getScript());
}
}
private void handleEdit() {
Script script = null;
int index = -1;
Object element = ((StructuredSelection) scriptsViewer.getSelection()).getFirstElement();
// get parent if element is HandlerValue
if (element instanceof HandlerValue) {
element = ((ScriptsController) scriptsViewer.getContentProvider()).getParent(element);
// find selection index
TreeItem selectedItem = scriptsViewer.getTree().getSelection()[0];
TreeItem[] items = selectedItem.getParentItem().getItems();
for (int i = 0; i < items.length; i++) {
if (items[i] == selectedItem) {
index = i;
break;
}
}
}
if (element instanceof Script) {
script = (Script) element;
}
if (script != null && index != -1) {
assert index < script.size();
Script dialogScript = script.clone();
ScriptDialog dialog = new ScriptDialog(scriptsViewer.getTree().getShell(), dialogScript,
dialogScript.get(index));
dialog.setEventEnabled(false);
if (dialog.open() == Dialog.OK) {
assert dialogScript == dialog.getScript();
Script cpscript = composerPackage.getScripts().get(script.getScript());
if (cpscript.equals(dialog.getScript())) {
// nothing changed
return;
}
assert cpscript.getScript() != null && cpscript.getScript().equals(dialog.getScript().getScript());
cpscript.clear();
cpscript.addHandlers(dialog.getScript());
}
}
}
private void handleRemove() {
Object element = ((StructuredSelection) scriptsViewer.getSelection()).getFirstElement();
ScriptsController controller = (ScriptsController) scriptsViewer.getLabelProvider();
if (element instanceof Script) {
String text = controller.getText(element);
MessageDialog diag = new MessageDialog(scriptsViewer.getTree().getShell(),
Messages.ScriptsSection_RemoveEventDialogTitle, null,
NLS.bind(Messages.ScriptsSection_RemoveEventDialogMessage, text), MessageDialog.WARNING,
new String[] { Messages.ScriptsSection_YesButton, Messages.ScriptsSection_NoButton }, 0);
if (diag.open() == Dialog.OK) {
composerPackage.getScripts().remove((Script) element);
}
} else if (element instanceof HandlerValue) {
String text = controller.getText(element);
Script script = (Script) ((ScriptsController) scriptsViewer.getContentProvider()).getParent(element);
if (script != null) {
int index = -1;
// find selection index
TreeItem selectedItem = scriptsViewer.getTree().getSelection()[0];
TreeItem[] items = selectedItem.getParentItem().getItems();
for (int i = 0; i < items.length; i++) {
if (items[i] == selectedItem) {
index = i;
break;
}
}
assert index != -1 && index < script.size();
String event = controller.getText(script);
MessageDialog diag = new MessageDialog(scriptsViewer.getTree().getShell(),
Messages.ScriptsSection_RemoveHandlerDialogTitle, null,
NLS.bind(Messages.ScriptsSection_RemoveHandlerDialogMessage, text, event),
MessageDialog.WARNING,
new String[] { Messages.ScriptsSection_YesButton, Messages.ScriptsSection_NoButton }, 0);
if (diag.open() == Dialog.OK) {
script.remove(index);
}
}
}
}
@Override
protected void buttonSelected(int index) {
switch (index) {
case ADD_INDEX:
handleAdd();
break;
case EDIT_INDEX:
handleEdit();
break;
case REMOVE_INDEX:
handleRemove();
break;
}
}
}