eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/AnnotationMarkerAccess.java -text
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/CompositeBorderDecorator.java -text
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/CompositeRectangle.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/EditableGroupedComposite.java -text
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/ErrorAnnotation.java -text
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/GroupComposite.java -text
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/GroupedComposite.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/IDataDisposer.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/IParentDataAdapter.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/ISelectionWrapper.java -text
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/LineBreakListener.java -text
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/NameComposite.java -text
+eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/TaxonCompositeFactory.java -text
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/TesterooWritableSet.java -text
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/nameviewersupport/WarningAnnotation.java -text
eclipseprojects/eu.etaxonomy.taxeditor/src/eu/etaxonomy/taxeditor/view/propertysheetsupport/BotanicalNamePropertySource.java -text
\r
import org.eclipse.jface.action.Action;\r
\r
+import eu.etaxonomy.cdm.api.service.TaxonServiceImpl;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.taxeditor.Activator;\r
\r
@Override\r
public void doSave(IProgressMonitor monitor) {\r
System.out.println("Start save");\r
- new ActionSaveTaxon(taxon);\r
+ new ActionSaveTaxon(taxon).run();\r
System.out.println("Save finished");\r
}\r
\r
import org.eclipse.swt.dnd.DropTargetAdapter;\r
import org.eclipse.swt.dnd.DropTargetEvent;\r
import org.eclipse.swt.dnd.Transfer;\r
-import org.eclipse.swt.events.FocusEvent;\r
-import org.eclipse.swt.events.FocusListener;\r
import org.eclipse.swt.events.ModifyEvent;\r
import org.eclipse.swt.events.ModifyListener;\r
import org.eclipse.swt.widgets.Composite;\r
import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.swt.widgets.Event;\r
-import org.eclipse.swt.widgets.Listener;\r
import org.eclipse.ui.IEditorInput;\r
import org.eclipse.ui.IEditorSite;\r
import org.eclipse.ui.PartInitException;\r
import org.eclipse.ui.views.properties.IPropertySheetPage;\r
import org.eclipse.ui.views.properties.PropertySheetPage;\r
\r
-import com.swtdesigner.SWTResourceManager;\r
-\r
import eu.etaxonomy.cdm.model.name.BotanicalName;\r
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
import eu.etaxonomy.cdm.strategy.parser.TaxonNameParserBotanicalNameImpl;\r
import eu.etaxonomy.taxeditor.controller.WidgetTransfer;\r
-import eu.etaxonomy.taxeditor.view.nameviewersupport.CompositeBorderDecorator;\r
import eu.etaxonomy.taxeditor.view.nameviewersupport.GroupComposite;\r
import eu.etaxonomy.taxeditor.view.nameviewersupport.LineBreakListener;\r
import eu.etaxonomy.taxeditor.view.nameviewersupport.NameComposite;\r
+import eu.etaxonomy.taxeditor.view.nameviewersupport.TaxonCompositeFactory;\r
import eu.etaxonomy.taxeditor.view.propertysheetsupport.BotanicalNamePropertySource;\r
import eu.etaxonomy.taxeditor.view.propertysheetsupport.CustomSortPropertySheetEntry;\r
\r
*/\r
private PropertyChangeListener taxonChangeListener = new PropertyChangeListener() {\r
public void propertyChange(PropertyChangeEvent arg0) {\r
+ System.out.println("prop change");\r
dirty = true;\r
firePropertyChange(PROP_DIRTY);\r
}\r
if (input.getAdapter(Taxon.class) != null) {\r
taxon = (Taxon) input.getAdapter(Taxon.class);\r
} else {\r
- \r
- taxon = null;\r
+ throw new PartInitException(\r
+ "Invalid Input: Taxon cannot be null");\r
}\r
\r
// Register listeners for any change in accepted name or set of relations\r
taxon.getName().addPropertyChangeListener(taxonChangeListener);\r
taxon.addPropertyChangeListener("synonyms", taxonChangeListener);\r
\r
+ taxonCompositeFactory = TaxonCompositeFactory.NewInstance(taxon);\r
+ \r
setSite(site);\r
setInput(input);\r
\r
provider.setSelection(\r
new StructuredSelection(\r
new BotanicalNamePropertySource((BotanicalName) taxon.getName())));\r
+ \r
+ taxonCompositeFactory.setSelectionWrapper(provider);\r
}\r
\r
- public void setSelection(BotanicalName name) {\r
- getSite().getSelectionProvider().setSelection\r
- (new StructuredSelection(new BotanicalNamePropertySource(name)));;\r
+ @SuppressWarnings("unchecked")\r
+ public Object getAdapter(Class type) {\r
+ if (type == IPropertySheetPage.class) {\r
+ PropertySheetPage page = new PropertySheetPage();\r
+ \r
+ CustomSortPropertySheetEntry entry = new CustomSortPropertySheetEntry();\r
+ page.setRootEntry(entry);\r
+ \r
+ return page;\r
+ }\r
+ return super.getAdapter(type);\r
}\r
\r
@Override\r
return false;\r
}\r
\r
+ TaxonCompositeFactory taxonCompositeFactory; \r
+ \r
@Override\r
public void createPartControl(final Composite composite) {\r
\r
managedForm = new ManagedForm(composite);\r
scrolledForm = managedForm.getForm();\r
parent = scrolledForm.getBody();\r
- parent.setLayout(new TableWrapLayout());\r
- \r
+ \r
+ parent.setLayout(new TableWrapLayout()); \r
parent.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
\r
+ // Add managed form to composite factory to enable border support\r
+ taxonCompositeFactory.setManagedForm(managedForm);\r
+ \r
// Create a homotypic group for the accepted taxon\r
- GroupComposite homotypicComposite = createGroupComposite(taxon.getHomotypicGroup());\r
+ GroupComposite homotypicComposite = \r
+ taxonCompositeFactory.createGroupComposite(parent, taxon.getHomotypicGroup()); \r
\r
// Add accepted taxon to the group\r
- createNameComposite(taxon, homotypicComposite);\r
+ decorateNameComposite(taxon, taxonCompositeFactory.createAcceptedNameComposite(homotypicComposite, taxon));\r
\r
// Add any homotypic synonyms to the group\r
if (taxon.getHomotypicGroup() != null) {\r
List<Synonym> homotypicSynonyms = taxon.getHomotypicGroup().\r
getSynonymsInGroup(taxon.getSec());\r
for (Synonym synonym : homotypicSynonyms) {\r
- createNameComposite(synonym, homotypicComposite);\r
+ decorateNameComposite(synonym, taxonCompositeFactory.createHomotypicSynonymComposite(homotypicComposite, synonym));\r
}\r
}\r
\r
// Create composites for any heterotypic groups\r
List<HomotypicalGroup> heterotypicGroups = taxon.getHeterotypicSynonymyGroups();\r
for (HomotypicalGroup heterotypicGroup : heterotypicGroups) {\r
- GroupComposite heterotypicComposite = createGroupComposite(heterotypicGroup);\r
- \r
+ GroupComposite heterotypicComposite = \r
+ taxonCompositeFactory.createGroupComposite(parent, heterotypicGroup);\r
+ \r
// Add any homotypic synonyms to the group\r
List<Synonym> heterotypicSynonyms = heterotypicGroup.\r
getSynonymsInGroup(taxon.getSec());\r
for (Synonym synonym : heterotypicSynonyms) {\r
- createNameComposite(synonym, heterotypicComposite); \r
+ decorateNameComposite(synonym, taxonCompositeFactory.createHeterotypicSynonymComposite(heterotypicComposite, synonym)); \r
}\r
}\r
\r
target.addDropListener(new DropTargetAdapter() {\r
\r
public void drop(DropTargetEvent event) {\r
- HomotypicalGroup newHomotypicalGroup = new HomotypicalGroup();\r
- NameComposite nameComposite = (NameComposite) event.data;\r
\r
- GroupComposite newGroupComposite = createGroupComposite(newHomotypicalGroup);\r
+ GroupComposite newGroupComposite = \r
+ taxonCompositeFactory.createGroupComposite(parent, new HomotypicalGroup());\r
+ \r
+ NameComposite nameComposite = (NameComposite) event.data;\r
nameComposite.setParent(newGroupComposite);\r
\r
} \r
// We've added elements to the managed form, so redraw it\r
scrolledForm.reflow(true);\r
}\r
-\r
- private GroupComposite createGroupComposite(HomotypicalGroup homotypicalGroup) {\r
- GroupComposite groupComposite = new GroupComposite(parent, homotypicalGroup);\r
+ \r
+ private NameComposite decorateNameComposite(final TaxonBase taxonBase, NameComposite nameComposite) {\r
+ \r
+ TaxonNameBase name = taxonBase.getName();\r
\r
- new CompositeBorderDecorator(groupComposite, managedForm);\r
+ // Put a border on the composite's StyledText widget when it has focus\r
+ StyledText textWidget = nameComposite.getTextWidget();\r
+ \r
+ String initText = (name.getTitleCache() == null) ? \r
+ "" : name.getTitleCache();\r
+ textWidget.setText(initText);\r
+ \r
+ // Put cursor at end of name viewer\r
+ textWidget.setCaretOffset(textWidget.getText().length());\r
\r
- groupComposite.addListener(SWT.Dispose, new Listener() {\r
\r
- @Override\r
- public void handleEvent(Event event) {\r
- \r
- // Remove homotypic group from taxon\r
- // TODO put in own action\r
- // TODO this will of course remove homotypical groups with every shutdown event!!!\r
- GroupComposite emptyComposite = (GroupComposite) event.widget;\r
- HomotypicalGroup emptyHomotypicalGroup = (HomotypicalGroup) emptyComposite.getData(); \r
- taxon.getHeterotypicSynonymyGroups().remove(emptyHomotypicalGroup);\r
- \r
- }\r
- \r
- });\r
- \r
- return groupComposite;\r
- }\r
- \r
- private NameComposite createNameComposite(final TaxonBase taxonBase, GroupComposite groupComposite) {\r
- NameComposite nameComposite;\r
- TaxonNameBase name = taxonBase.getName();\r
- if (taxonBase instanceof Taxon) {\r
- nameComposite = new NameComposite(groupComposite, taxonBase, false);\r
- nameComposite.setIcon(NameComposite.ACCEPTED);\r
- \r
- } else {\r
- nameComposite = new NameComposite(groupComposite, taxonBase, true);\r
+ textWidget.addVerifyListener(new LineBreakListener() {\r
\r
- nameComposite.indent();\r
+ // This needs a connection with the factory to create the new group and grouped\r
\r
- if (taxon.getName().getHomotypicalGroup().equals(groupComposite.getData())) {\r
- nameComposite.setIcon(NameComposite.HOMOTYPIC_SYNONYM);\r
- } else {\r
- nameComposite.setIcon(NameComposite.HETEROTYPIC_SYNONYM);\r
- }\r
- }\r
- \r
- StyledText textWidget = nameComposite.getTextWidget();\r
- \r
- new CompositeBorderDecorator(textWidget, managedForm);\r
- \r
- textWidget.addVerifyListener(new LineBreakListener() {\r
@Override\r
public void handleSplitText(String text) {\r
// Model actions\r
synonym.setName(name);\r
\r
// Interface actions\r
- GroupComposite newGroupComposite = createGroupComposite(newHomotypicalGroup);\r
- createNameComposite(synonym, newGroupComposite); \r
+ GroupComposite newGroupComposite = taxonCompositeFactory.createGroupComposite(parent, newHomotypicalGroup);\r
+ decorateNameComposite(synonym, taxonCompositeFactory.createHeterotypicSynonymComposite(newGroupComposite, synonym)); \r
\r
parent.layout();\r
} \r
- });\r
- \r
- // Add listener for sending selection to property sheet\r
- textWidget.addFocusListener(new FocusListener() {\r
- @Override\r
- public void focusGained(FocusEvent e) {\r
- setSelection((BotanicalName) taxonBase.getName());\r
- }\r
-\r
- @Override\r
- public void focusLost(FocusEvent e) {} \r
- });\r
- \r
- textWidget.setFont(\r
- SWTResourceManager.getFont("Georgia", \r
- (taxonBase instanceof Taxon ? 12 : 10), \r
- SWT.NONE));\r
+ }); \r
\r
- String initText = (name.getTitleCache() == null) ? \r
- "" : name.getTitleCache();\r
- textWidget.setText(initText);\r
- \r
- // Put cursor at end of name viewer\r
- textWidget.setCaretOffset(\r
- textWidget.getText().length());\r
-\r
textWidget.addModifyListener(new ModifyListener () {\r
+ \r
+ // This needs no connection, just a call to parse\r
+ \r
public void modifyText(ModifyEvent e) {\r
StyledText widget = (StyledText) e.widget;\r
String text = widget.getText();\r
NameViewer nameViewer = (NameViewer) nameComposite.getTextViewer();\r
nameViewer.setShowError(name.getHasProblem());\r
\r
- nameComposite.addPropertyChangeListener("parent", new PropertyChangeListener() {\r
-\r
- @Override\r
- public void propertyChange(PropertyChangeEvent evt) {\r
- \r
- GroupComposite groupComposite = (GroupComposite) evt.getNewValue();\r
- HomotypicalGroup newHomotypicalGroup = (HomotypicalGroup) groupComposite.getData();\r
- NameComposite nameComposite = (NameComposite) evt.getSource();\r
- \r
- // Set name's homotypical group \r
- TaxonNameBase name = ((TaxonBase) nameComposite.getData()).getName();\r
- name.setHomotypicalGroup(newHomotypicalGroup);\r
- \r
- // Set component's synonym type icon\r
- if (newHomotypicalGroup.equals(taxon.getHomotypicGroup())) {\r
- nameComposite.setIcon(NameComposite.HOMOTYPIC_SYNONYM);\r
- } else {\r
- nameComposite.setIcon(NameComposite.HETEROTYPIC_SYNONYM);\r
- }\r
- }\r
- });\r
\r
// TODO Redraw form with every change in case text area has, for instance, word wrapped\r
\r
- nameComposite.getTextWidget().setFocus();\r
+ nameComposite.setFocus();\r
\r
// managedForm.getMessageManager().addMessage\r
// ("TEST", "Testeroo error", null, IMessageProvider.ERROR, nameComposite.getTextWidget());\r
public void setFocus() {\r
// TODO Auto-generated method stub\r
}\r
-\r
- @SuppressWarnings("unchecked")\r
- public Object getAdapter(Class type) {\r
- if (type == IPropertySheetPage.class) {\r
- PropertySheetPage page = new PropertySheetPage();\r
- \r
- CustomSortPropertySheetEntry entry = new CustomSortPropertySheetEntry();\r
- page.setRootEntry(entry);\r
- \r
- return page;\r
- }\r
- return super.getAdapter(type);\r
- }\r
}
\ No newline at end of file
--- /dev/null
+package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
+\r
+import org.eclipse.jface.text.TextViewer;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.custom.StyledText;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.ui.forms.widgets.TableWrapData;\r
+import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
+\r
+abstract public class EditableGroupedComposite extends GroupedComposite {\r
+ \r
+ private TextViewer textViewer;\r
+ protected TableWrapLayout layout;\r
+ \r
+ ISelectionWrapper selectionWrapper;\r
+ \r
+ protected static final int INDENT_INCREMENT = 15;\r
+ private Label draggableLabel;\r
+ \r
+ public EditableGroupedComposite(Composite parent) {\r
+ super(parent);\r
+ }\r
+\r
+ @Override\r
+ protected void createContent() {\r
+ setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
+ layout = new TableWrapLayout();\r
+ layout.numColumns = 2;\r
+ layout.leftMargin = 0;\r
+ setLayout(layout);\r
+ \r
+ setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+ \r
+ draggableLabel = new Label(this, SWT.NONE);\r
+ draggableLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
+ draggableLabel.setLayoutData(new TableWrapData(TableWrapData.CENTER, TableWrapData.MIDDLE));\r
+ \r
+ setDraggableControl(draggableLabel);\r
+ } \r
+ \r
+ public TextViewer getTextViewer() {\r
+ return textViewer;\r
+ }\r
+\r
+ public void setTextViewer(TextViewer textViewer) {\r
+ this.textViewer = textViewer;\r
+ }\r
+\r
+ public StyledText getTextWidget() {\r
+ return textViewer.getTextWidget();\r
+ }\r
+\r
+ protected void setIcon(Image icon) {\r
+ draggableLabel.setImage(icon);\r
+ }\r
+\r
+ public void indent() {\r
+ layout.leftMargin += INDENT_INCREMENT;\r
+ this.setLayout(layout);\r
+ } \r
+ \r
+ public boolean setFocus() {\r
+ if (selectionWrapper != null) {\r
+ selectionWrapper.setSelection();\r
+ }\r
+ return getTextViewer().getTextWidget().setFocus();\r
+ }\r
+ \r
+ public void setFont(Font font) {\r
+ getTextViewer().getTextWidget().setFont(font);\r
+ }\r
+ \r
+ public void setSelectionWrapper (ISelectionWrapper selectionWrapper) {\r
+ this.selectionWrapper = selectionWrapper;\r
+ }\r
+}
\ No newline at end of file
\r
public class GroupComposite extends Composite {\r
\r
+ IDataDisposer dataDisposer;\r
+ \r
public GroupComposite(Composite parent, Object data) {\r
this(parent);\r
setData(data);\r
\r
public GroupComposite(Composite parent) {\r
super(parent, SWT.NONE);\r
- \r
- \r
+\r
// Graphic layout of composite\r
this.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
this.setLayout(new TableWrapLayout());\r
}\r
});\r
}\r
+\r
+ /**\r
+ * If disposal of the composite by the user should also cause associated data\r
+ * to be disposed, add an IDataDisposer\r
+ */\r
+ protected void disposeData() {\r
+ if (dataDisposer != null) {\r
+ dataDisposer.disposeData();\r
+ }\r
+ }\r
+ \r
+ public void setDataDisposer(IDataDisposer dataDisposer) {\r
+ this.dataDisposer = dataDisposer;\r
+ }\r
}
\ No newline at end of file
package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
\r
-import java.beans.PropertyChangeListener;\r
-import java.beans.PropertyChangeSupport;\r
-\r
-import org.eclipse.jface.text.TextViewer;\r
import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.custom.StyledText;\r
import org.eclipse.swt.dnd.DND;\r
import org.eclipse.swt.dnd.DragSource;\r
+import org.eclipse.swt.dnd.DragSourceAdapter;\r
import org.eclipse.swt.dnd.DragSourceEvent;\r
import org.eclipse.swt.dnd.DragSourceListener;\r
import org.eclipse.swt.dnd.Transfer;\r
-import org.eclipse.swt.graphics.Image;\r
import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.ui.forms.widgets.TableWrapData;\r
-import org.eclipse.ui.forms.widgets.TableWrapLayout;\r
+import org.eclipse.swt.widgets.Control;\r
\r
import eu.etaxonomy.taxeditor.controller.WidgetTransfer;\r
\r
/**\r
- * A draggable composite with two elements: a draggable label and a text viewer for editing text.\r
+ * A composite which can be dragged between different GroupComposite. The user\r
+ * uses the draggable control for dragging the whole composite.\r
+ * \r
+ * @see eu.etaxonomy.taxeditor.view.nameviewersupport.GroupComposite\r
* \r
* @author p.ciardelli\r
*\r
*/\r
abstract public class GroupedComposite extends Composite {\r
- \r
- private Label draggableLabel;\r
- private TextViewer textViewer;\r
- protected TableWrapLayout layout;\r
- \r
- protected static final int LEFT_MARGIN = 15;\r
- \r
- PropertyChangeSupport propertyChangeSupport;\r
- \r
- public GroupedComposite(Composite parent, boolean draggable) {\r
- this(parent, null, draggable);\r
- }\r
- \r
- public GroupedComposite(Composite parent, Object data, boolean draggable) {\r
- super(parent, SWT.NONE);\r
\r
- if (data != null) {\r
- setData(data);\r
- }\r
+ IParentDataAdapter parentDataAdapter;\r
+ private Control draggableControl; \r
\r
- propertyChangeSupport = new PropertyChangeSupport(this);\r
+ public GroupedComposite(Composite parent) {\r
+ super(parent, SWT.NONE);\r
\r
createContent();\r
- \r
- if (draggable) {\r
- addDraggability();\r
- } \r
}\r
\r
- protected void createContent() {\r
- this.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));\r
- layout = new TableWrapLayout();\r
- layout.numColumns = 2;\r
- layout.leftMargin = 0;\r
- this.setLayout(layout);\r
- \r
- this.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
- \r
- draggableLabel = new Label(this, SWT.NONE); \r
- draggableLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));\r
- draggableLabel.setLayoutData(new TableWrapData(TableWrapData.CENTER, TableWrapData.MIDDLE));\r
+ abstract protected void createContent();\r
+ \r
+ protected void setDraggableControl(Control control) {\r
+ draggableControl = control; \r
}\r
\r
- private void addDraggability() {\r
+ public void addDraggability() {\r
+ \r
+ if (draggableControl == null) {\r
+ throw new NullPointerException(\r
+ "Draggable control must be set to add draggability");\r
+ }\r
+ \r
Transfer[] types = new Transfer[] {WidgetTransfer.getInstance()}; \r
int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;\r
\r
- // Make relation label draggable \r
- DragSource dragLabel = new DragSource (draggableLabel, operations);\r
- dragLabel.setTransfer(types);\r
- dragLabel.addDragListener(dragSourceListener);\r
+ dragger = new DragSource (draggableControl, operations);\r
+ dragger.setTransfer(types);\r
+ dragger.addDragListener(dragSourceListener);\r
}\r
\r
+ public void removeDraggability() {\r
+ dragger = null;\r
+ }\r
+ \r
/**\r
* Drag listener which passes the Composite as the data in\r
* a drag event.\r
*/\r
- DragSourceListener dragSourceListener = new DragSourceListener () {\r
+ DragSourceListener dragSourceListener = new DragSourceAdapter() {\r
\r
public void dragStart(DragSourceEvent event) {\r
- getTextWidget().setFocus();\r
+ GroupedComposite.this.setFocus();\r
event.doit = true;\r
}\r
public void dragSetData (DragSourceEvent event) {\r
WidgetTransfer.getInstance().setWidget(GroupedComposite.this);\r
}\r
- public void dragFinished(DragSourceEvent event) {\r
- }\r
};\r
+ private DragSource dragger;\r
\r
/** \r
* Override of setParent: dispose of parent if this is its last child composite\r
public boolean setParent (Composite parent) {\r
Composite oldParent = this.getParent();\r
if (super.setParent (parent)) {\r
- if (oldParent.getChildren().length == 0) {\r
+ if (oldParent instanceof GroupComposite && oldParent.getChildren().length == 0) {\r
+ ((GroupComposite) oldParent).disposeData();\r
oldParent.dispose();\r
}\r
- propertyChangeSupport.firePropertyChange("parent", oldParent, parent);\r
+ adaptParentData();\r
\r
// Redraw the component holding all group and grouped composites \r
parent.getParent().layout();\r
return false;\r
}\r
\r
- public void addPropertyChangeListener(String propertyName,\r
- PropertyChangeListener listener) {\r
- propertyChangeSupport.addPropertyChangeListener(propertyName, listener);\r
- }\r
-\r
- public void removePropertyChangeListener(PropertyChangeListener listener) {\r
- propertyChangeSupport.removePropertyChangeListener(listener);\r
- }\r
-\r
- public TextViewer getTextViewer() {\r
- return textViewer;\r
- }\r
-\r
- public void setTextViewer(TextViewer textViewer) {\r
- this.textViewer = textViewer;\r
- }\r
-\r
- public StyledText getTextWidget() {\r
- return textViewer.getTextWidget();\r
- }\r
-\r
- protected void setIcon(Image icon) {\r
- draggableLabel.setImage(icon);\r
+ \r
+ /**\r
+ * A grouped composites is usually grouped according to data held by its parent.\r
+ * When the composite changes parents, this method gets called to update data \r
+ * as needed.\r
+ */\r
+ private void adaptParentData() {\r
+ if (parentDataAdapter != null) {\r
+ parentDataAdapter.adaptParentData();\r
+ }\r
}\r
-\r
- public void indent() {\r
- layout.leftMargin = LEFT_MARGIN;\r
- this.setLayout(layout);\r
+ \r
+ public void setParentDataAdapter(IParentDataAdapter parentDataAdapter) {\r
+ this.parentDataAdapter = parentDataAdapter;\r
}\r
}
\ No newline at end of file
--- /dev/null
+package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
+\r
+public interface IDataDisposer {\r
+ public void disposeData();\r
+}\r
--- /dev/null
+package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
+\r
+public interface IParentDataAdapter {\r
+ public void adaptParentData();\r
+}\r
--- /dev/null
+package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
+\r
+public interface ISelectionWrapper {\r
+ public void setSelection();\r
+}\r
import org.eclipse.swt.events.VerifyListener;\r
\r
/**\r
- * Checks text entered into a name viewer for line breaks, sends\r
+ * Checks text entered into a StyledText widget for line breaks, sends\r
* split text to handleSplitText()\r
* \r
* @author p.ciardelli\r
import eu.etaxonomy.taxeditor.Activator;\r
import eu.etaxonomy.taxeditor.view.NameViewer;\r
\r
-public class NameComposite extends GroupedComposite {\r
- \r
+public class NameComposite extends EditableGroupedComposite {\r
+ \r
public static final int ACCEPTED = 0;\r
public static final int HOMOTYPIC_SYNONYM = 1;\r
public static final int HETEROTYPIC_SYNONYM = 2;\r
\r
- public NameComposite(Composite parent, Object data, boolean draggable) {\r
- super(parent, data, draggable);\r
+ public NameComposite(Composite parent) {\r
+ super(parent);\r
}\r
\r
protected void createContent() {\r
--- /dev/null
+package eu.etaxonomy.taxeditor.view.nameviewersupport;\r
+\r
+import org.eclipse.jface.viewers.ISelectionProvider;\r
+import org.eclipse.jface.viewers.StructuredSelection;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.ui.forms.IManagedForm;\r
+\r
+import com.swtdesigner.SWTResourceManager;\r
+\r
+import eu.etaxonomy.cdm.model.name.BotanicalName;\r
+import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.taxeditor.view.propertysheetsupport.BotanicalNamePropertySource;\r
+\r
+public class TaxonCompositeFactory {\r
+ \r
+ private Taxon taxon;\r
+\r
+ public TaxonCompositeFactory(Taxon taxon) {\r
+ this.taxon = taxon;\r
+ }\r
+\r
+ public static TaxonCompositeFactory NewInstance(Taxon taxon) {\r
+ return new TaxonCompositeFactory(taxon);\r
+ }\r
+\r
+ private IManagedForm managedForm;\r
+ private ISelectionProvider selectionProvider;\r
+\r
+ public GroupComposite createGroupComposite(Composite parent, HomotypicalGroup data) {\r
+ final GroupComposite groupComposite = new GroupComposite(parent);\r
+ groupComposite.setData(data);\r
+ groupComposite.setDataDisposer(new IDataDisposer() {\r
+ @Override\r
+ public void disposeData() {\r
+ HomotypicalGroup data = (HomotypicalGroup) groupComposite.getData();\r
+ taxon.getHeterotypicSynonymyGroups().remove(data);\r
+ }\r
+ });\r
+ createBorderSupport(groupComposite);\r
+ return groupComposite;\r
+ }\r
+ \r
+ private NameComposite createNameComposite(Composite parent, final TaxonBase data) {\r
+ final NameComposite nameComposite = new NameComposite(parent);\r
+ nameComposite.setData(data);\r
+ nameComposite.setParentDataAdapter(new IParentDataAdapter() {\r
+ @Override\r
+ public void adaptParentData() {\r
+ Object parentData = nameComposite.getParent().getData();\r
+ if (parentData instanceof HomotypicalGroup) {\r
+ data.getName().setHomotypicalGroup((HomotypicalGroup) parentData);\r
+ \r
+ if (parentData.equals(taxon.getHomotypicGroup())) {\r
+ createHomotypicSynonymComposite(nameComposite);\r
+ } else {\r
+ createHeterotypicSynonymComposite(nameComposite);\r
+ }\r
+ }\r
+ }\r
+ });\r
+ if (selectionProvider != null) {\r
+ nameComposite.setSelectionWrapper(new ISelectionWrapper() {\r
+ @Override\r
+ public void setSelection() {\r
+ selectionProvider.setSelection(\r
+ new StructuredSelection(\r
+ new BotanicalNamePropertySource((BotanicalName) data.getName())));\r
+ \r
+ }\r
+ });\r
+ }\r
+ createBorderSupport(nameComposite);\r
+ return nameComposite;\r
+ }\r
+ \r
+ public NameComposite createAcceptedNameComposite(Composite parent, TaxonBase data) {\r
+ NameComposite nameComposite = createNameComposite(parent, data);\r
+ return createAcceptedNameComposite(nameComposite);\r
+ }\r
+ \r
+ public NameComposite createAcceptedNameComposite(NameComposite nameComposite) {\r
+ nameComposite.removeDraggability();\r
+ nameComposite.setIcon(NameComposite.ACCEPTED);\r
+ nameComposite.setFont(SWTResourceManager.getFont("Georgia", 12, SWT.NONE));\r
+ return nameComposite;\r
+ }\r
+ \r
+ public NameComposite createHomotypicSynonymComposite(Composite parent, TaxonBase data) {\r
+ NameComposite nameComposite = createSynonymComposite(parent, data);\r
+ return createHomotypicSynonymComposite(nameComposite);\r
+ }\r
+\r
+ public NameComposite createHomotypicSynonymComposite(NameComposite nameComposite) {\r
+ nameComposite.setIcon(NameComposite.HOMOTYPIC_SYNONYM);\r
+ return nameComposite;\r
+ }\r
+ \r
+ public NameComposite createHeterotypicSynonymComposite(Composite parent, TaxonBase data) {\r
+ NameComposite nameComposite = createSynonymComposite(parent, data);\r
+ return createHeterotypicSynonymComposite(nameComposite);\r
+ }\r
+ \r
+ public NameComposite createHeterotypicSynonymComposite(NameComposite nameComposite) {\r
+ nameComposite.setIcon(NameComposite.HETEROTYPIC_SYNONYM);\r
+ return nameComposite;\r
+ }\r
+\r
+ private NameComposite createSynonymComposite(Composite composite, TaxonBase data) {\r
+ NameComposite nameComposite = createNameComposite(composite, data);\r
+ nameComposite.addDraggability();\r
+ nameComposite.setFont(SWTResourceManager.getFont("Georgia", 10, SWT.NONE));\r
+ nameComposite.indent();\r
+ return nameComposite;\r
+ }\r
+\r
+ public void setManagedForm(IManagedForm managedForm) {\r
+ this.managedForm = managedForm;\r
+ }\r
+\r
+ public void setSelectionWrapper(ISelectionProvider selectionProvider) {\r
+ this.selectionProvider = selectionProvider; \r
+ }\r
+ \r
+ public void createBorderSupport(Composite composite) {\r
+ if (managedForm != null) {\r
+ new CompositeBorderDecorator(composite, managedForm);\r
+ } else {\r
+ // TODO add warning that border support can't be added without a managed form \r
+ }\r
+ }\r
+\r
+}
\ No newline at end of file