minor
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / name / container / AbstractGroup.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.taxeditor.editor.name.container;
11
12 import java.util.ArrayList;
13 import java.util.List;
14
15 import org.eclipse.swt.SWT;
16 import org.eclipse.swt.dnd.DND;
17 import org.eclipse.swt.dnd.DropTarget;
18 import org.eclipse.swt.dnd.DropTargetListener;
19 import org.eclipse.swt.dnd.Transfer;
20 import org.eclipse.swt.graphics.Color;
21 import org.eclipse.swt.widgets.Composite;
22 import org.eclipse.swt.widgets.Display;
23 import org.eclipse.swt.widgets.Menu;
24 import org.eclipse.ui.forms.widgets.TableWrapData;
25 import org.eclipse.ui.forms.widgets.TableWrapLayout;
26
27 import eu.etaxonomy.cdm.model.common.CdmBase;
28 import eu.etaxonomy.taxeditor.editor.CdmDataTransfer;
29 import eu.etaxonomy.taxeditor.editor.EditorUtil;
30 import eu.etaxonomy.taxeditor.editor.IDropTargetable;
31 import eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor;
32 import eu.etaxonomy.taxeditor.editor.name.dnd.NameEditorDropTargetEffect;
33 import eu.etaxonomy.taxeditor.editor.name.dnd.NameEditorDropTargetListener;
34 import eu.etaxonomy.taxeditor.preference.Resources;
35
36 /**
37 * <p>Abstract AbstractGroup class.</p>
38 *
39 * @author p.ciardelli
40 * @author n.hoffmann
41 * @created 25.06.2008
42 * @version 1.0
43 */
44 public abstract class AbstractGroup implements IDropTargetable{
45
46 private Composite control;
47
48 private final List<AbstractGroupedContainer> groupedContainers = new ArrayList<AbstractGroupedContainer>();
49
50 protected TaxonNameEditor editor;
51
52 private DropTarget target;
53 private DropTargetListener dropListener;
54
55 /**
56 * <p>Constructor for AbstractGroup.</p>
57 *
58 * @param editor a {@link eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor} object.
59 * @param <T> a T object.
60 */
61 public AbstractGroup(TaxonNameEditor editor){
62 this.editor = editor;
63 }
64
65 protected void createContent(){
66 createControl();
67
68 createContainers();
69
70 // Drop functionality
71 this.setDroppable(true);
72
73 editor.getManagedForm().reflow(true);
74 }
75
76 /**
77 * <p>createControl</p>
78 */
79 protected void createControl() {
80 control = editor.getToolkit().createComposite(editor.getControl());
81
82 control.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
83 TableWrapLayout layout = new TableWrapLayout();
84
85 layout.topMargin = 0;
86 layout.rightMargin = 0;
87 layout.bottomMargin = 1;
88 layout.leftMargin = 0;
89
90 layout.verticalSpacing = 0;
91 layout.horizontalSpacing = 0;
92 control.setLayout(layout);
93
94 control.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_GRAY));
95 }
96
97 /**
98 * <p>add</p>
99 *
100 * @param groupedContainer a {@link eu.etaxonomy.taxeditor.editor.name.container.AbstractGroupedContainer} object.
101 */
102 public void add(AbstractGroupedContainer groupedContainer){
103 groupedContainers.add(groupedContainer);
104 groupedContainer.setGroup(this);
105 }
106
107 /**
108 * <p>remove</p>
109 *
110 * @param groupedContainer a {@link eu.etaxonomy.taxeditor.editor.name.container.AbstractGroupedContainer} object.
111 */
112 public void remove(AbstractGroupedContainer groupedContainer){
113 groupedContainer.dispose();
114 groupedContainers.remove(groupedContainer);
115
116 if(!(this instanceof AcceptedGroup) && groupedContainers.isEmpty()){
117 getEditor().removeGroup(this);
118 }
119 }
120
121 /**
122 * <p>Getter for the field <code>groupedContainers</code>.</p>
123 *
124 * @return a {@link java.util.List} object.
125 */
126 public List<AbstractGroupedContainer> getGroupedContainers(){
127 return groupedContainers;
128 }
129
130
131 /**
132 * <p>setDroppable</p>
133 *
134 * @param droppable a boolean.
135 */
136 public void setDroppable(boolean droppable) {
137 if (droppable) {
138 Transfer[] types = new Transfer[] {CdmDataTransfer.getInstance()};
139 int operations = DND.DROP_MOVE;
140 target = new DropTarget(control, operations);
141 target.setTransfer(types);
142 dropListener = new NameEditorDropTargetListener(this);
143 target.addDropListener(dropListener);
144
145 target.setDropTargetEffect(new NameEditorDropTargetEffect(control));
146
147 } else {
148 if (dropListener != null) {
149 target.removeDropListener(dropListener);
150 }
151 }
152 }
153
154 /**
155 * <p>getNameEditor</p>
156 *
157 * @return a {@link eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor} object.
158 */
159 @Override
160 public TaxonNameEditor getEditor() {
161 return editor;
162 }
163
164 /**
165 * <p>dragEntered</p>
166 */
167 @Override
168 public void dragEntered() {
169 Color color = EditorUtil.getColor(Resources.COLOR_DRAG_ENTER);
170
171 for(AbstractGroupedContainer container : groupedContainers){
172 container.setBackground(color);
173 }
174 }
175
176 /**
177 * <p>dragLeft</p>
178 */
179 @Override
180 public void dragLeft() {
181 for(AbstractGroupedContainer container : groupedContainers){
182 container.restoreColor();
183 }
184 }
185
186 /** {@inheritDoc} */
187 @Override
188 public boolean postOperation(CdmBase objectAffectedByOperation) {
189 editor.getMultiPageTaxonEditor().changed(objectAffectedByOperation);
190 redraw();
191 return true;
192 }
193
194 /**
195 * <p>redraw</p>
196 */
197 public void redraw(){
198 emptyGroup();
199 createContainers();
200 }
201
202 protected abstract void createContainers();
203
204 /* (non-Javadoc)
205 * @see eu.etaxonomy.taxeditor.editor.IDropTargetable#getControl()
206 */
207 @Override
208 public Composite getControl() {
209 return control;
210 }
211
212 /* (non-Javadoc)
213 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
214 */
215 @Override
216 public boolean onComplete() {
217 return true;
218 }
219
220 public void dispose(){
221 if(getControl() != null){
222 for(AbstractGroupedContainer container : getGroupedContainers()){
223 container.dispose();
224 }
225 getControl().setMenu(null);
226 getControl().dispose();
227 }
228 }
229
230 /**
231 * @param object
232 */
233 public void setMenu(Menu menu) {
234 getControl().setMenu(menu);
235 for(AbstractGroupedContainer container : getGroupedContainers()){
236 container.setMenu(menu);
237 }
238
239 }
240
241 protected void emptyGroup(){
242 for(AbstractGroupedContainer container : groupedContainers){
243 container.dispose();
244 }
245 groupedContainers.clear();
246 }
247 }