f11939a57742dcdd113fddfc9f38698967d6401a
[taxeditor.git] / taxeditor-editor / src / main / java / eu / etaxonomy / taxeditor / editor / GroupComposite.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;
11
12 import org.apache.log4j.Logger;
13 import org.eclipse.swt.SWT;
14 import org.eclipse.swt.dnd.DND;
15 import org.eclipse.swt.dnd.DropTarget;
16 import org.eclipse.swt.dnd.DropTargetAdapter;
17 import org.eclipse.swt.dnd.DropTargetEvent;
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.Event;
23 import org.eclipse.swt.widgets.Listener;
24 import org.eclipse.ui.forms.widgets.TableWrapData;
25 import org.eclipse.ui.forms.widgets.TableWrapLayout;
26
27 import eu.etaxonomy.cdm.model.taxon.Taxon;
28 import eu.etaxonomy.taxeditor.store.model.Resources;
29
30 /**
31 * @author p.ciardelli
32 * @created 25.06.2008
33 * @version 1.0
34 */
35 public class GroupComposite extends Composite {
36 private static final Logger logger = Logger.getLogger(GroupComposite.class);
37
38 protected AbstractTaxonEditor editor;
39 protected Taxon taxon;
40
41 private DropTarget target;
42 private DropTargetListener dropListener;
43
44 public GroupComposite(Composite parent) {
45 super(parent, SWT.NONE);
46
47 // Graphic layout of composite
48 this.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
49 this.setLayout(new TableWrapLayout());
50 Color groupBackgroundColor = Resources.
51 getColor(Resources.COLOR_COMPOSITE_BACKGROUND);
52 this.setBackground(groupBackgroundColor);
53
54 // Drop functionality
55 this.setDroppable(true);
56 }
57
58 public GroupComposite(AbstractTaxonEditor editor, Composite parent){
59 this(parent);
60 this.editor = editor;
61 this.taxon = editor.getTaxon();
62 }
63
64 public void setDroppable(boolean droppable) {
65 if (droppable) {
66 Transfer[] types = new Transfer[] {WidgetTransfer.getInstance()};
67 int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;
68 target = new DropTarget(this, operations);
69 target.setTransfer(types);
70 dropListener = new DropTargetAdapter() {
71
72 public void dragEnter(DropTargetEvent event) {
73 GroupComposite.this.notifyListeners(SWT.FocusIn, null);
74 }
75
76 public void dragLeave(DropTargetEvent event) {
77 GroupComposite.this.notifyListeners(SWT.FocusOut, null);
78 }
79
80 public void drop(DropTargetEvent event) {
81
82 if (event.data instanceof GroupedComposite) {
83
84 final GroupedComposite composite = (GroupedComposite) event.data;
85 if (composite.getDragSource() != null) {
86
87 // Make sure composite is not being dropped onto its current parent
88 if ( ! composite.getParent().equals(GroupComposite.this)) {
89
90 // Change parent at end of drag event
91 composite.getDragSource().addListener(DND.DragEnd, new Listener() {
92
93 public void handleEvent(Event event) {
94 composite.setParent(GroupComposite.this);
95 }
96 });
97 }
98 }
99 }
100 }
101 };
102 target.addDropListener(dropListener);
103 } else {
104 if (dropListener != null) {
105 target.removeDropListener(dropListener);
106 }
107 }
108 }
109
110 public void dispose() {
111
112 if (target != null) {
113 target.removeDropListener(dropListener);
114 target.dispose();
115 }
116
117 super.dispose();
118 }
119
120 /**
121 * @return the taxon
122 */
123 public Taxon getTaxon() {
124 return taxon;
125 }
126 }