-/**
- *
- */
-package eu.etaxonomy.taxeditor.ui.element;
-
-import java.util.ConcurrentModificationException;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.widgets.Section;
-
-import eu.etaxonomy.taxeditor.model.AbstractUtility;
-import eu.etaxonomy.taxeditor.ui.campanula.compatibility.ICdmFormElement;
-
-/**
- * <p>Abstract AbstractCdmFormElement class.</p>
- *
- * @author n.hoffmann
- * @version $Id: $
- */
-public abstract class AbstractCdmFormElement implements ICdmFormElement {
-
- protected CdmFormFactory formFactory;
-
- private List<IPropertyChangeListener> propertyChangeListeners;
-
- private Composite layoutComposite;
-
- private final Set<Control> controls = new HashSet<Control>();
-
- private final Set<ICdmFormElement> elements = new HashSet<ICdmFormElement>();
- private ICdmFormElement parentElement;
-
- private Color persistentBackgroundColor;
-
-
- /**
- * <p>Constructor for AbstractCdmFormElement.</p>
- *
- * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
- * @param layoutComposite a {@link org.eclipse.swt.widgets.Composite} object.
- */
- protected AbstractCdmFormElement(CdmFormFactory formFactory, Composite layoutComposite){
- this.layoutComposite = layoutComposite;
- this.formFactory = formFactory;
- }
-
- /**
- * <p>Constructor for AbstractCdmFormElement.</p>
- *
- * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
- * @param formElement a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
- */
- public AbstractCdmFormElement(CdmFormFactory formFactory, ICdmFormElement formElement) {
- this(formFactory, formElement.getLayoutComposite());
- this.parentElement = formElement;
-// addControl(layoutComposite);
- }
-
- @Override
- public CdmFormFactory getFormFactory() {
- return formFactory;
- }
-
- /**
- * Delegates the focus to <code>this</code> elements main input control
- */
- public void setFocus(){
- // Override in subclasses where needed
- }
-
- /**
- * Returns all Controls that are managed by this element
- *
- * @return a {@link java.util.Set} object.
- */
- @Override
- public Set<Control> getControls(){
- return controls;
- }
-
- /**
- * adds the control to the set of controls that are managed by this element
- *
- * @param child a {@link org.eclipse.swt.widgets.Control} object.
- */
- protected void addControl(Control child){
- controls.add(child);
- }
-
- /**
- * <p>removeControl</p>
- *
- * @param child a {@link org.eclipse.swt.widgets.Control} object.
- */
- protected void removeControl(Control child){
- controls.remove(child);
- }
-
- /**
- * <p>Getter for the field <code>elements</code>.</p>
- *
- * @return a {@link java.util.Set} object.
- */
- @Override
- public Set<ICdmFormElement> getElements(){
- return elements;
- }
-
- /**
- * <p>Getter for the field <code>parentElement</code>.</p>
- *
- * @return a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
- */
- @Override
- public ICdmFormElement getParentElement(){
- return parentElement;
- }
-
- /** {@inheritDoc} */
- @Override
- public void addElement(ICdmFormElement element){
- elements.add(element);
- }
-
- /**
- * <p>removeElement</p>
- *
- * @param element a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
- */
- protected void removeElement(ICdmFormElement element){
- elements.remove(element);
- }
-
- /**
- * <p>removeElements</p>
- */
- @Override
- public void removeElements(){
- for(ICdmFormElement childElement : getElements()){
- // recursion
- childElement.removeElements();
-
- // unregister selection arbitrator
- if(childElement instanceof ISelectableElement){
- SelectionArbitrator selectionArbitrator = ((ISelectableElement) childElement).getSelectionArbitrator();
- if(selectionArbitrator != null){
- formFactory.destroySelectionArbitrator(selectionArbitrator);
- }
- }
-
- // unregister from property changes
- formFactory.removePropertyChangeListener(childElement);
-
- // dispose of the controls
- removeControls(childElement);
- }
- removeControls(this);
- elements.clear();
- }
-
- private void removeControls(ICdmFormElement element){
- if(element instanceof Section){
- ((Section) element).dispose();
- element = null;
- }else{
- for(Control control : element.getControls()){
- // we added the layoutComposite of the parental element as the layout composite to this formElement
- // but we do not want to destroy it.
- if(control.equals(element.getLayoutComposite())){
- continue;
- }else{
- control.dispose();
- control = null;
- }
- }
- }
- }
-
- /**
- * <p>Getter for the field <code>layoutComposite</code>.</p>
- *
- * @return a {@link org.eclipse.swt.widgets.Composite} object.
- */
- @Override
- public Composite getLayoutComposite() {
- return layoutComposite;
- }
-
- /**
- * <p>Setter for the field <code>layoutComposite</code>.</p>
- *
- * @param layoutComposite a {@link org.eclipse.swt.widgets.Composite} object.
- */
- public void setLayoutComposite(Composite layoutComposite){
- this.layoutComposite = layoutComposite;
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#getPropertyChangeListeners()
- */
- /**
- * <p>Getter for the field <code>propertyChangeListeners</code>.</p>
- *
- * @return a {@link java.util.Set} object.
- */
- @Override
- public List<IPropertyChangeListener> getPropertyChangeListeners() {
- return propertyChangeListeners;
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#setPropertyChangeListeners(org.eclipse.core.runtime.ListenerList)
- */
- /** {@inheritDoc} */
- @Override
- public void setPropertyChangeListeners(List<IPropertyChangeListener> propertyChangeListeners){
- this.propertyChangeListeners = propertyChangeListeners;
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#firePropertyChangeEvent()
- */
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#firePropertyChangeEvent(org.eclipse.jface.util.PropertyChangeEvent)
- */
- /** {@inheritDoc} */
- @Override
- public void firePropertyChangeEvent(CdmPropertyChangeEvent event) {
- //TODO: replace propertyChangeListeners with formFactory.getPropertyChangeListeners() and remove member propertyChangeListeners from AbstractCdmFormElement
- Assert.isNotNull(propertyChangeListeners, "Property change listeners are not present");
-
- try{
- for(Object listener : propertyChangeListeners){
- ((IPropertyChangeListener)listener).propertyChange(event);
- }
- }catch(ConcurrentModificationException e){
- // There are two cases that produce a CME.
- // Described here: http://dev.e-taxonomy.eu/trac/ticket/2363#comment:2
- // and here: http://dev.e-taxonomy.eu/trac/ticket/2438
- // Ignoring the CME because nothing bad is happening
- AbstractUtility.warn(getClass(), "ConcurrentModificationException. Can be ignored.");
- }
- }
-
- /**
- * Fires a {@link CdmPropertyChangeEvent} with the given object as source.
- *
- * @param object the object on which the property changed
- */
- public void firePropertyChangeEvent(Object object){
- firePropertyChangeEvent(object, null);
- }
-
- /**
- * Fires a {@link CdmPropertyChangeEvent} with the given object as source also containing the
- * originating event
- *
- * @param object the object on which the property changed
- * @param originatingEvent the originating event
- */
- public void firePropertyChangeEvent(Object object, PropertyChangeEvent originatingEvent){
- firePropertyChangeEvent(new CdmPropertyChangeEvent(object, originatingEvent));
- }
-
-
- /**
- * {@inheritDoc}
- *
- * This method gets called whenever the toolkit this composite was created with gets a property change notification.
- *
- * It is good advice to check whether the PropertyChangeEvent is destined for the implementing composite.
- * Implementations should also check for null PropertyChangeEvents and return immediately in that case.
- * @see eu.etaxonomy.taxeditor.ui.element.ICdmFormElement#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
- */
- @Override
- public void propertyChange(PropertyChangeEvent event) {
- // implement in subclasses
- }
-
- /** {@inheritDoc} */
- @Override
- public boolean containsFormElement(ICdmFormElement formElement){
- if(formElement == this){
- return true;
- }else{
- for(ICdmFormElement element : getElements()){
- boolean contains = element.containsFormElement(formElement);
- if(contains == true){
- return true;
- }
- }
- return false;
- }
- }
-
- /*
- * (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.forms.ICdmFormElement#refresh()
- */
- /**
- * <p>refresh</p>
- */
- @Override
- public void refresh() {
- // empty default implementation
- }
-
-
- /** {@inheritDoc} */
- @Override
- public void setBackground(Color color) {
- for(ICdmFormElement element : getElements()){
- element.setBackground(color);
- }
- }
-
- @Override
- public void setPersistentBackground(Color color) {
- persistentBackgroundColor = color;
- setBackground(color);
- }
-
- @Override
- public Color getPersistentBackground() {
- return persistentBackgroundColor;
- }
-
- public Color getColor(String colorId){
- return AbstractUtility.getColor(colorId);
- }
-}
+/**\r
+ *\r
+ */\r
+package eu.etaxonomy.taxeditor.ui.element;\r
+\r
+import java.util.ConcurrentModificationException;\r
+import java.util.HashSet;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import org.eclipse.core.runtime.Assert;\r
+import org.eclipse.jface.util.IPropertyChangeListener;\r
+import org.eclipse.jface.util.PropertyChangeEvent;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.ui.forms.widgets.Section;\r
+import org.eclipse.ui.forms.widgets.TableWrapData;\r
+\r
+import eu.etaxonomy.taxeditor.model.AbstractUtility;\r
+import eu.etaxonomy.taxeditor.model.MessagingUtils;\r
+\r
+/**\r
+ * @author n.hoffmann\r
+ * @version $Id: $\r
+ */\r
+public abstract class AbstractCdmFormElement implements ICdmFormElement {\r
+\r
+ protected CdmFormFactory formFactory;\r
+\r
+ private List<IPropertyChangeListener> propertyChangeListeners;\r
+\r
+ private Composite layoutComposite;\r
+\r
+ private final Set<Control> controls = new HashSet<Control>();\r
+\r
+ private final Set<ICdmFormElement> elements = new HashSet<ICdmFormElement>();\r
+ private ICdmFormElement parentElement;\r
+\r
+ private Color persistentBackgroundColor;\r
+\r
+\r
+ protected AbstractCdmFormElement(CdmFormFactory formFactory, Composite layoutComposite){\r
+ this.layoutComposite = layoutComposite;\r
+ this.formFactory = formFactory;\r
+ }\r
+\r
+ public AbstractCdmFormElement(CdmFormFactory formFactory, ICdmFormElement formElement) {\r
+ this(formFactory, formElement.getLayoutComposite());\r
+ this.parentElement = formElement;\r
+// addControl(layoutComposite);\r
+ }\r
+\r
+ @Override\r
+ public CdmFormFactory getFormFactory() {\r
+ return formFactory;\r
+ }\r
+\r
+ /**\r
+ * Delegates the focus to <code>this</code> elements main input control\r
+ */\r
+ public void setFocus(){\r
+ // Override in subclasses where needed\r
+ }\r
+\r
+ /**\r
+ * Returns all Controls that are managed by this element\r
+ *\r
+ * @return a {@link java.util.Set} object.\r
+ */\r
+ @Override\r
+ public Set<Control> getControls(){\r
+ return controls;\r
+ }\r
+\r
+ /**\r
+ * adds the control to the set of controls that are managed by this element\r
+ *\r
+ * @param child a {@link org.eclipse.swt.widgets.Control} object.\r
+ */\r
+ protected void addControl(Control child){\r
+ controls.add(child);\r
+ }\r
+\r
+ protected void removeControl(Control child){\r
+ controls.remove(child);\r
+ }\r
+\r
+ /**\r
+ * <p>Getter for the field <code>elements</code>.</p>\r
+ *\r
+ * @return a {@link java.util.Set} object.\r
+ */\r
+ @Override\r
+ public Set<ICdmFormElement> getElements(){\r
+ return elements;\r
+ }\r
+\r
+ /**\r
+ * <p>Getter for the field <code>parentElement</code>.</p>\r
+ *\r
+ * @return a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.\r
+ */\r
+ @Override\r
+ public ICdmFormElement getParentElement(){\r
+ return parentElement;\r
+ }\r
+\r
+ /** {@inheritDoc} */\r
+ @Override\r
+ public void addElement(ICdmFormElement element){\r
+ elements.add(element);\r
+ }\r
+\r
+ /**\r
+ * Remove all child {@link ICdmFormElement}s and child {@link Control}s\r
+ * of the given and the element itself.\r
+ * @param formElement The element to remove\r
+ */\r
+ public void removeElementsAndControls(ICdmFormElement formElement){\r
+ for(ICdmFormElement childElement : formElement.getElements()){\r
+ // recursion\r
+ childElement.removeElements();\r
+\r
+ // unregister selection arbitrator\r
+ if(childElement instanceof ISelectableElement){\r
+ SelectionArbitrator selectionArbitrator = ((ISelectableElement) childElement).getSelectionArbitrator();\r
+ if(selectionArbitrator != null){\r
+ formFactory.destroySelectionArbitrator(selectionArbitrator);\r
+ }\r
+ }\r
+\r
+ // unregister from property changes\r
+ formFactory.removePropertyChangeListener(childElement);\r
+\r
+ // dispose of the controls\r
+ removeControls(childElement);\r
+ }\r
+ removeControls(formElement);\r
+ this.elements.remove(formElement);\r
+ }\r
+\r
+ /**\r
+ * Removes all child {@link ICdmFormElement}s and child {@link Control}s\r
+ * and the element itself.\r
+ */\r
+ @Override\r
+ public void removeElements(){\r
+ for (Iterator<ICdmFormElement> iterator = getElements().iterator();iterator.hasNext();) {\r
+ ICdmFormElement childElement = iterator.next();\r
+ // recursion\r
+ childElement.removeElements();\r
+\r
+ // unregister selection arbitrator\r
+ if(childElement instanceof ISelectableElement){\r
+ SelectionArbitrator selectionArbitrator = ((ISelectableElement) childElement).getSelectionArbitrator();\r
+ if(selectionArbitrator != null){\r
+ formFactory.destroySelectionArbitrator(selectionArbitrator);\r
+ }\r
+ }\r
+\r
+ // unregister from property changes\r
+ formFactory.removePropertyChangeListener(childElement);\r
+\r
+ // dispose of the controls\r
+ removeControls(childElement);\r
+ }\r
+ if(this instanceof ISelectableElement){\r
+ SelectionArbitrator selectionArbitrator = ((ISelectableElement) this).getSelectionArbitrator();\r
+ if(selectionArbitrator != null){\r
+ formFactory.destroySelectionArbitrator(selectionArbitrator);\r
+ }\r
+ }\r
+ removeControls(this);\r
+ elements.clear();\r
+ }\r
+\r
+ private void removeControls(ICdmFormElement element){\r
+ if(element instanceof Section){\r
+ ((Section) element).dispose();\r
+ element = null;\r
+ }else{\r
+ for(Control control : element.getControls()){\r
+ // we added the layoutComposite of the parental element as the layout composite to this formElement\r
+ // but we do not want to destroy it.\r
+ if(control.equals(element.getLayoutComposite())){\r
+ continue;\r
+ }else{\r
+ control.dispose();\r
+ control = null;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * <p>Getter for the field <code>layoutComposite</code>.</p>\r
+ *\r
+ * @return a {@link org.eclipse.swt.widgets.Composite} object.\r
+ */\r
+ @Override\r
+ public Composite getLayoutComposite() {\r
+ return layoutComposite;\r
+ }\r
+\r
+ /**\r
+ * <p>Setter for the field <code>layoutComposite</code>.</p>\r
+ *\r
+ * @param layoutComposite a {@link org.eclipse.swt.widgets.Composite} object.\r
+ */\r
+ public void setLayoutComposite(Composite layoutComposite){\r
+ this.layoutComposite = layoutComposite;\r
+ }\r
+\r
+ public void addIndent(int indent)\r
+ { this.layoutComposite = formFactory.createComposite(layoutComposite);\r
+\r
+ if (this.layoutComposite.getParent().getLayoutData() instanceof TableWrapData){\r
+ TableWrapData tableWrap = (TableWrapData)this.layoutComposite.getParent().getLayoutData();\r
+ tableWrap.indent = indent;\r
+\r
+ this.layoutComposite.setLayoutData(tableWrap);\r
+ }\r
+ if (this.layoutComposite.getLayoutData() instanceof GridData){\r
+ GridData gridData = new GridData();\r
+ gridData.verticalIndent = indent;\r
+ this.layoutComposite.setLayoutData(gridData);\r
+\r
+ }\r
+ }\r
+ /**\r
+ * <p>Getter for the field <code>propertyChangeListeners</code>.</p>\r
+ *\r
+ * @return a {@link java.util.Set} object.\r
+ */\r
+ @Override\r
+ public List<IPropertyChangeListener> getPropertyChangeListeners() {\r
+ return propertyChangeListeners;\r
+ }\r
+\r
+ /** {@inheritDoc} */\r
+ @Override\r
+ public void setPropertyChangeListeners(List<IPropertyChangeListener> propertyChangeListeners){\r
+ this.propertyChangeListeners = propertyChangeListeners;\r
+ }\r
+\r
+ /** {@inheritDoc} */\r
+ @Override\r
+ public void firePropertyChangeEvent(CdmPropertyChangeEvent event) {\r
+ //TODO: replace propertyChangeListeners with formFactory.getPropertyChangeListeners() and remove member propertyChangeListeners from AbstractCdmFormElement\r
+ Assert.isNotNull(propertyChangeListeners, "Property change listeners are not present");\r
+\r
+ try{\r
+ for(Object listener : propertyChangeListeners){\r
+ ((IPropertyChangeListener)listener).propertyChange(event);\r
+ }\r
+ }catch(ConcurrentModificationException e){\r
+ // There are two cases that produce a CME.\r
+ // Described here: http://dev.e-taxonomy.eu/trac/ticket/2363#comment:2\r
+ // and here: http://dev.e-taxonomy.eu/trac/ticket/2438\r
+ // Ignoring the CME because nothing bad is happening\r
+ MessagingUtils.warn(getClass(), "ConcurrentModificationException. Can be ignored.");\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Fires a {@link CdmPropertyChangeEvent} with the given object as source.\r
+ *\r
+ * @param object the object on which the property changed\r
+ */\r
+ public void firePropertyChangeEvent(Object object){\r
+ firePropertyChangeEvent(object, null);\r
+ }\r
+\r
+ /**\r
+ * Fires a {@link CdmPropertyChangeEvent} with the given object as source also containing the\r
+ * originating event\r
+ *\r
+ * @param object the object on which the property changed\r
+ * @param originatingEvent the originating event\r
+ */\r
+ public void firePropertyChangeEvent(Object object, PropertyChangeEvent originatingEvent){\r
+ firePropertyChangeEvent(new CdmPropertyChangeEvent(object, originatingEvent));\r
+ }\r
+\r
+\r
+ /**\r
+ * {@inheritDoc}\r
+ *\r
+ * This method gets called whenever the toolkit this composite was created with gets a property change notification.\r
+ *\r
+ * It is good advice to check whether the PropertyChangeEvent is destined for the implementing composite.\r
+ * Implementations should also check for null PropertyChangeEvents and return immediately in that case.\r
+ * @see eu.etaxonomy.taxeditor.ui.element.ICdmFormElement#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)\r
+ */\r
+ @Override\r
+ public void propertyChange(PropertyChangeEvent event) {\r
+ // implement in subclasses\r
+ }\r
+\r
+ /** {@inheritDoc} */\r
+ @Override\r
+ public boolean containsFormElement(ICdmFormElement formElement){\r
+ if(formElement == this){\r
+ return true;\r
+ }else{\r
+ for(ICdmFormElement element : getElements()){\r
+ boolean contains = element.containsFormElement(formElement);\r
+ if(contains == true){\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void refresh() {\r
+ // empty default implementation\r
+ }\r
+\r
+\r
+ /** {@inheritDoc} */\r
+ @Override\r
+ public void setBackground(Color color) {\r
+ for(ICdmFormElement element : getElements()){\r
+ element.setBackground(color);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void setPersistentBackground(Color color) {\r
+ persistentBackgroundColor = color;\r
+ setBackground(color);\r
+ }\r
+\r
+ @Override\r
+ public Color getPersistentBackground() {\r
+ return persistentBackgroundColor;\r
+ }\r
+\r
+ public Color getColor(String colorId){\r
+ return AbstractUtility.getColor(colorId);\r
+ }\r
+}\r