package com.dubture.composer.ui.editor.composer; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; 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.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerDropAdapter; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; 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 org.eclipse.ui.part.ResourceTransfer; import com.dubture.composer.ui.controller.PsrController; import com.dubture.composer.ui.dialogs.PsrDialog; 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.Psr; import com.dubture.getcomposer.core.objects.Namespace; public abstract class PsrSection extends TreeSection implements PropertyChangeListener { protected TreeViewer psrViewer; 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; protected Psr psr = null; public PsrSection(ComposerFormPage page, Composite parent) { super(page, parent, Section.DESCRIPTION, new String[] { "Add...", "Edit...", "Remove" }); psr = getPsr(); createClient(getSection(), page.getManagedForm().getToolkit()); } abstract protected Psr getPsr(); abstract protected String getPsrName(); @Override protected void createClient(Section section, FormToolkit toolkit) { String name = getPsrName(); section.setText(name); section.setDescription("Manage the " + name + " settings 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(); PsrController controller = new PsrController(treePart.getTreeViewer()); psrViewer = treePart.getTreeViewer(); psrViewer.setContentProvider(controller); psrViewer.setLabelProvider(controller); Transfer[] transferTypes = new Transfer[] { ResourceTransfer.getInstance() }; int types = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK | DND.DROP_DEFAULT; psrViewer.addDropSupport(types, transferTypes, new PathDropAdapter(psrViewer)); toolkit.paintBordersFor(container); section.setClient(container); section.setLayout(FormLayoutFactory.createClearGridLayout(false, 1)); psrViewer.setInput(psr); composerPackage.getAutoload().addPropertyChangeListener(this); updateButtons(); makeActions(); updateMenu(); } private void updateButtons() { ISelection selection = psrViewer.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) psrViewer.getSelection(); editAction.setEnabled(selection.size() > 0); removeAction.setEnabled(selection.size() > 0); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); updateButtons(); refresh(); psrViewer.getTree().setEnabled(enabled); } public void refresh() { psrViewer.refresh(); } @Override public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName().startsWith(getPsrName())) { 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() { PsrDialog dialog = new PsrDialog(psrViewer.getTree().getShell(), new Namespace(), getPage().getComposerEditor().getProject()); if (dialog.open() == Dialog.OK) { psr.add(dialog.getNamespace()); } } private void handleEdit() { Namespace namespace = null; Object element = ((StructuredSelection) psrViewer.getSelection()).getFirstElement(); // get parent if element is string if (element instanceof String) { element = ((PsrController)psrViewer.getContentProvider()).getParent(element); } if (element instanceof Namespace) { namespace = ((Namespace) element).clone(); } if (namespace != null) { PsrDialog diag = new PsrDialog(psrViewer.getTree().getShell(), namespace.clone(), getPage().getComposerEditor().getProject()); if (diag.open() == Dialog.OK) { Namespace nmspc = psr.get(namespace.getNamespace()); nmspc.clear(); nmspc.setNamespace(diag.getNamespace().getNamespace()); nmspc.addPaths(diag.getNamespace().getPaths()); } } } private void handleRemove() { Object element = ((StructuredSelection) psrViewer.getSelection()).getFirstElement(); if (element instanceof Namespace) { psr.remove((Namespace) element); } else if (element instanceof String) { Namespace namespace = (Namespace)((PsrController)psrViewer.getContentProvider()).getParent(element); namespace.remove((String)element); } } @Override protected void buttonSelected(int index) { switch (index) { case ADD_INDEX: handleAdd(); break; case EDIT_INDEX: handleEdit(); break; case REMOVE_INDEX: handleRemove(); break; } } private class PathDropAdapter extends ViewerDropAdapter { private Namespace target; public PathDropAdapter(Viewer viewer) { super(viewer); } @Override public boolean performDrop(Object data) { if (data instanceof IResource[]) { IResource[] resources = (IResource[]) data; List<IFolder> folders = new ArrayList<IFolder>(); for (IResource resource : resources) { if (resource instanceof IFolder) { folders.add((IFolder) resource); } } for (IFolder folder : folders) { target.add(folder.getProjectRelativePath().toString()); } return false; } return false; } @Override public boolean validateDrop(Object target, int operation, TransferData transferType) { if (target instanceof Namespace) { this.target = (Namespace) target; return true; } return false; } } }