ref #6595 Fix composite cascade
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / name / e4 / container / AbstractGroupE4.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.e4.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.name.dnd.NameEditorDropTargetEffect;
30 import eu.etaxonomy.taxeditor.editor.name.e4.IDropTargetableE4;
31 import eu.etaxonomy.taxeditor.editor.name.e4.TaxonNameEditorE4;
32 import eu.etaxonomy.taxeditor.editor.name.e4.dnd.NameEditorDropTargetListenerE4;
33 import eu.etaxonomy.taxeditor.model.AbstractUtility;
34 import eu.etaxonomy.taxeditor.preference.Resources;
35
36 /**
37 *
38 * @author pplitzner
39 * @date Aug 24, 2017
40 *
41 */
42 public abstract class AbstractGroupE4 implements IDropTargetableE4{
43
44 private Composite control;
45
46 private final List<AbstractGroupedContainerE4> groupedContainers = new ArrayList<>();
47
48 protected TaxonNameEditorE4 editor;
49
50 private DropTarget target;
51 private DropTargetListener dropListener;
52
53 public AbstractGroupE4(TaxonNameEditorE4 editor){
54 this.editor = editor;
55 }
56
57 protected void createContent(){
58 createControl();
59
60 createContainers();
61
62 // Drop functionality
63 this.setDroppable(true);
64
65 editor.getManagedForm().reflow(true);
66 }
67
68 protected void createControl() {
69 control = editor.getToolkit().createComposite(editor.getControl());
70
71 control.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
72 TableWrapLayout layout = new TableWrapLayout();
73
74 layout.topMargin = 0;
75 layout.rightMargin = 0;
76 layout.bottomMargin = 1;
77 layout.leftMargin = 0;
78
79 layout.verticalSpacing = 0;
80 layout.horizontalSpacing = 0;
81 control.setLayout(layout);
82
83 control.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_GRAY));
84 }
85
86 public void add(AbstractGroupedContainerE4 groupedContainer){
87 groupedContainers.add(groupedContainer);
88 groupedContainer.setGroup(this);
89 }
90
91 public void remove(AbstractGroupedContainerE4 groupedContainer){
92 groupedContainer.dispose();
93 groupedContainers.remove(groupedContainer);
94
95 if(!(this instanceof AcceptedGroupE4) && groupedContainers.isEmpty()){
96 getEditor().removeGroup(this);
97 }
98 }
99
100 public List<AbstractGroupedContainerE4> getGroupedContainers(){
101 return groupedContainers;
102 }
103
104
105 public void setDroppable(boolean droppable) {
106 if (droppable) {
107 Transfer[] types = new Transfer[] {CdmDataTransfer.getInstance()};
108 int operations = DND.DROP_MOVE;
109 target = new DropTarget(control, operations);
110 target.setTransfer(types);
111 dropListener = new NameEditorDropTargetListenerE4(this);
112 target.addDropListener(dropListener);
113
114 target.setDropTargetEffect(new NameEditorDropTargetEffect(control));
115
116 } else {
117 if (dropListener != null) {
118 target.removeDropListener(dropListener);
119 }
120 }
121 }
122
123 @Override
124 public TaxonNameEditorE4 getEditor() {
125 return editor;
126 }
127
128 @Override
129 public void dragEntered() {
130 Color color = AbstractUtility.getColor(Resources.COLOR_DRAG_ENTER);
131
132 for(AbstractGroupedContainerE4 container : groupedContainers){
133 container.setBackground(color);
134 }
135 }
136
137 @Override
138 public void dragLeft() {
139 for(AbstractGroupedContainerE4 container : groupedContainers){
140 container.restoreColor();
141 }
142 }
143
144 /** {@inheritDoc} */
145 @Override
146 public boolean postOperation(CdmBase objectAffectedByOperation) {
147 editor.changed(objectAffectedByOperation);
148 redraw();
149 return true;
150 }
151
152 public void redraw(){
153 emptyGroup();
154 createContainers();
155 }
156
157 protected abstract void createContainers();
158
159 @Override
160 public Composite getControl() {
161 return control;
162 }
163
164 @Override
165 public boolean onComplete() {
166 return true;
167 }
168
169 public void dispose(){
170 if(getControl() != null){
171 for(AbstractGroupedContainerE4 container : getGroupedContainers()){
172 container.dispose();
173 }
174 getControl().setMenu(null);
175 getControl().dispose();
176 }
177 }
178
179 public void setMenu(Menu menu) {
180 getControl().setMenu(menu);
181 for(AbstractGroupedContainerE4 container : getGroupedContainers()){
182 container.setMenu(menu);
183 }
184
185 }
186
187 protected void emptyGroup(){
188 for(AbstractGroupedContainerE4 container : groupedContainers){
189 container.dispose();
190 }
191 groupedContainers.clear();
192 }
193 }