aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineDragListener.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineDragListener.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineDragListener.java129
1 files changed, 129 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineDragListener.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineDragListener.java
new file mode 100644
index 000000000..1af3053e3
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineDragListener.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Eclipse Public License, Version 1.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/org/documents/epl-v10.php
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.ide.eclipse.adt.internal.editors.layout.gle2;
+
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+
+import java.util.ArrayList;
+
+/** Drag listener for the outline page */
+/* package */ class OutlineDragListener implements DragSourceListener {
+ private TreeViewer mTreeViewer;
+ private OutlinePage mOutlinePage;
+ private final ArrayList<SelectionItem> mDragSelection = new ArrayList<SelectionItem>();
+ private SimpleElement[] mDragElements;
+
+ public OutlineDragListener(OutlinePage outlinePage, TreeViewer treeViewer) {
+ super();
+ mOutlinePage = outlinePage;
+ mTreeViewer = treeViewer;
+ }
+
+ @Override
+ public void dragStart(DragSourceEvent e) {
+ Tree tree = mTreeViewer.getTree();
+
+ TreeItem overTreeItem = tree.getItem(new Point(e.x, e.y));
+ if (overTreeItem == null) {
+ // Not dragging over a tree item
+ e.doit = false;
+ return;
+ }
+ CanvasViewInfo over = getViewInfo(overTreeItem);
+ if (over == null) {
+ e.doit = false;
+ return;
+ }
+
+ // The selection logic for the outline is much simpler than in the canvas,
+ // because for one thing, the tree selection is updated synchronously on mouse
+ // down, so it's not possible to start dragging a non-selected item.
+ // We also don't deliberately disallow root-element dragging since you can
+ // drag it into another form.
+ final LayoutCanvas canvas = mOutlinePage.getEditor().getCanvasControl();
+ SelectionManager selectionManager = canvas.getSelectionManager();
+ TreeItem[] treeSelection = tree.getSelection();
+ mDragSelection.clear();
+ for (TreeItem item : treeSelection) {
+ CanvasViewInfo viewInfo = getViewInfo(item);
+ if (viewInfo != null) {
+ mDragSelection.add(selectionManager.createSelection(viewInfo));
+ }
+ }
+ SelectionManager.sanitize(mDragSelection);
+
+ e.doit = !mDragSelection.isEmpty();
+ int imageCount = mDragSelection.size();
+ if (e.doit) {
+ mDragElements = SelectionItem.getAsElements(mDragSelection);
+ GlobalCanvasDragInfo.getInstance().startDrag(mDragElements,
+ mDragSelection.toArray(new SelectionItem[imageCount]),
+ canvas, new Runnable() {
+ @Override
+ public void run() {
+ canvas.getClipboardSupport().deleteSelection("Remove",
+ mDragSelection);
+ }
+ });
+ return;
+ }
+
+ e.detail = DND.DROP_NONE;
+ }
+
+ @Override
+ public void dragSetData(DragSourceEvent e) {
+ if (TextTransfer.getInstance().isSupportedType(e.dataType)) {
+ LayoutCanvas canvas = mOutlinePage.getEditor().getCanvasControl();
+ e.data = SelectionItem.getAsText(canvas, mDragSelection);
+ return;
+ }
+
+ if (SimpleXmlTransfer.getInstance().isSupportedType(e.dataType)) {
+ e.data = mDragElements;
+ return;
+ }
+
+ // otherwise we failed
+ e.detail = DND.DROP_NONE;
+ e.doit = false;
+ }
+
+ @Override
+ public void dragFinished(DragSourceEvent e) {
+ // Unregister the dragged data.
+ // Clear the selection
+ mDragSelection.clear();
+ mDragElements = null;
+ GlobalCanvasDragInfo.getInstance().stopDrag();
+ }
+
+ private CanvasViewInfo getViewInfo(TreeItem item) {
+ Object data = item.getData();
+ if (data != null) {
+ return OutlinePage.getViewInfo(data);
+ }
+
+ return null;
+ }
+} \ No newline at end of file