package com.dubture.composer.ui.editor.composer; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.StringUtils; 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.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.forms.widgets.TableWrapData; import com.dubture.composer.ui.ComposerUIPluginImages; import com.dubture.composer.ui.dialogs.PersonDialog; import com.dubture.composer.ui.editor.ComposerFormPage; import com.dubture.composer.ui.editor.FormLayoutFactory; import com.dubture.composer.ui.editor.TableSection; import com.dubture.composer.ui.parts.TablePart; import com.dubture.getcomposer.core.collection.Persons; import com.dubture.getcomposer.core.objects.Person; public class AuthorSection extends TableSection implements PropertyChangeListener { private TableViewer authorViewer; 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; class AuthorController extends StyledCellLabelProvider implements IStructuredContentProvider { private Persons authors; private Image authorImage = ComposerUIPluginImages.PERSON.createImage(); public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { authors = (Persons)newInput; } public Object[] getElements(Object inputElement) { return authors.toArray(); } public void update(ViewerCell cell) { Object obj = cell.getElement(); if (obj instanceof Person) { Person author = (Person)obj; StyledString styledString = new StyledString(author.getName()); if (author.getEmail() != null && author.getEmail().trim() != "" && !author.getEmail().trim().equals("")) { styledString.append(" <" + author.getEmail().trim() + ">", StyledString.COUNTER_STYLER); } if (author.getHomepage() != null && author.getHomepage().trim() != "" && !author.getHomepage().trim().equals("")) { styledString.append(" - " + author.getHomepage().trim(), StyledString.DECORATIONS_STYLER); } cell.setText(styledString.toString()); cell.setStyleRanges(styledString.getStyleRanges()); cell.setImage(authorImage); super.update(cell); } } } public AuthorSection(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("Authors"); section.setDescription("Honour the glorious authors of this package."); section.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); Composite container = createClientContainer(section, 2, toolkit); createViewerPartControl(container, SWT.MULTI, 2, toolkit); TablePart tablePart = getTablePart(); AuthorController authorController = new AuthorController(); authorViewer = tablePart.getTableViewer(); authorViewer.setContentProvider(authorController); authorViewer.setLabelProvider(authorController); toolkit.paintBordersFor(container); section.setClient(container); section.setLayout(FormLayoutFactory.createClearGridLayout(false, 1)); authorViewer.setInput(composerPackage.getAuthors()); composerPackage.addPropertyChangeListener(this); updateButtons(); makeActions(); updateMenu(); } protected boolean createCount() { return true; } private void updateButtons() { ISelection selection = authorViewer.getSelection(); TablePart tablePart = getTablePart(); tablePart.setButtonEnabled(ADD_INDEX, enabled); tablePart.setButtonEnabled(EDIT_INDEX, !selection.isEmpty() && enabled); tablePart.setButtonEnabled(REMOVE_INDEX, !selection.isEmpty() && enabled); } private void updateMenu() { IStructuredSelection selection = (IStructuredSelection)authorViewer.getSelection(); editAction.setEnabled(selection.size() > 0); removeAction.setEnabled(selection.size() > 0); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); updateButtons(); refresh(); authorViewer.getTable().setEnabled(enabled); } public void refresh() { authorViewer.refresh(); super.refresh(); } @Override public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName().startsWith("authors")) { // refresh(); } } protected void selectionChanged(IStructuredSelection sel) { updateButtons(); updateMenu(); } private void makeActions() { addAction = new Action("Add...") { public void run() { handleAdd(); } }; editAction = new Action("Edit...") { public void run() { handleEdit(); } }; removeAction = new Action("Remove") { public void run() { handleRemove(); } }; } @Override protected void fillContextMenu(IMenuManager manager) { manager.add(addAction); manager.add(editAction); manager.add(removeAction); } private void handleAdd() { PersonDialog diag = new PersonDialog(authorViewer.getTable().getShell(), new Person()); if (diag.open() == Dialog.OK) { composerPackage.getAuthors().add(diag.getPerson()); refresh(); } } private void handleEdit() { Person author = (Person)((StructuredSelection)authorViewer.getSelection()).getFirstElement(); PersonDialog diag = new PersonDialog(authorViewer.getTable().getShell(), author.clone()); if (diag.open() == Dialog.OK) { author.setName(diag.getPerson().getName()); author.setEmail(diag.getPerson().getEmail()); author.setHomepage(diag.getPerson().getHomepage()); author.setRole(diag.getPerson().getRole()); } } @SuppressWarnings("unchecked") private void handleRemove() { StructuredSelection selection = ((StructuredSelection)authorViewer.getSelection()); Iterator<Object> it = selection.iterator(); String[] names = new String[selection.size()]; List<Person> persons = new ArrayList<Person>(); for (int i = 0; it.hasNext(); i++) { Person person = (Person)it.next(); persons.add(person); names[i] = person.getName(); } MessageDialog diag = new MessageDialog( authorViewer.getTable().getShell(), "Remove Author" + (selection.size() > 1 ? "s" : ""), null, "Do you really wan't to remove " + StringUtils.join(names, ", ") + "?", MessageDialog.WARNING, new String[] {"Yes", "No"}, 0); if (diag.open() == Dialog.OK) { for (Person person : persons) { composerPackage.getAuthors().remove(person); } } } @Override protected void buttonSelected(int index) { switch (index) { case ADD_INDEX: handleAdd(); break; case EDIT_INDEX: handleEdit(); break; case REMOVE_INDEX: handleRemove(); break; } } }