DND-triggered operations now executed after drag end.
[taxeditor.git] / eclipseprojects / eu.etaxonomy.taxeditor / src / 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.taxeditor.ITaxEditorConstants;
28 import eu.etaxonomy.taxeditor.TaxEditorPlugin;
29 import eu.etaxonomy.taxeditor.actions.WidgetTransfer;
30
31 /**
32 * @author p.ciardelli
33 * @created 25.06.2008
34 * @version 1.0
35 */
36 public class GroupComposite extends Composite {
37 private static final Logger logger = Logger.getLogger(GroupComposite.class);
38
39 private DropTarget target;
40 private DropTargetListener dropListener;
41
42 public GroupComposite(Composite parent) {
43 super(parent, SWT.NONE);
44
45 // Graphic layout of composite
46 this.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
47 this.setLayout(new TableWrapLayout());
48 Color groupBackgroundColor = TaxEditorPlugin.getDefault().
49 getColor(ITaxEditorConstants.GROUP_GRAY_BKG_COLOR);
50 this.setBackground(groupBackgroundColor);
51
52 // Drop functionality
53 this.setDroppable(true);
54 }
55
56 public void setDroppable(boolean droppable) {
57 if (droppable) {
58 Transfer[] types = new Transfer[] {WidgetTransfer.getInstance()};
59 int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;
60 target = new DropTarget(this, operations);
61 target.setTransfer(types);
62 dropListener = new DropTargetAdapter() {
63
64 public void dragEnter(DropTargetEvent event) {
65 GroupComposite.this.notifyListeners(SWT.FocusIn, null);
66 }
67
68 public void dragLeave(DropTargetEvent event) {
69 GroupComposite.this.notifyListeners(SWT.FocusOut, null);
70 }
71
72 public void drop(DropTargetEvent event) {
73
74 if (event.data instanceof GroupedComposite) {
75
76 final GroupedComposite composite = (GroupedComposite) event.data;
77 if (composite.getDragSource() != null) {
78
79 // Make sure composite is not being dropped onto its current parent
80 if ( ! composite.getParent().equals(GroupComposite.this)) {
81
82 // Change parent at end of drag event
83 composite.getDragSource().addListener(DND.DragEnd, new Listener() {
84 @Override
85 public void handleEvent(Event event) {
86 composite.setParent(GroupComposite.this);
87 }
88 });
89 }
90 }
91 }
92 }
93 };
94 target.addDropListener(dropListener);
95 } else {
96 if (dropListener != null) {
97 target.removeDropListener(dropListener);
98 }
99 }
100 }
101
102 public void dispose() {
103
104 if (target != null) {
105 target.removeDropListener(dropListener);
106 target.dispose();
107 }
108
109 super.dispose();
110 }
111 }