1 /*******************************************************************************
2 * Copyright (c) 2013 Kalray
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Xavier Raynaud - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.tmf
.ui
.views
.filter
;
16 import org
.eclipse
.jface
.util
.LocalSelectionTransfer
;
17 import org
.eclipse
.linuxtools
.tmf
.core
.filter
.model
.ITmfFilterTreeNode
;
18 import org
.eclipse
.linuxtools
.tmf
.core
.filter
.model
.TmfFilterNode
;
19 import org
.eclipse
.swt
.dnd
.DND
;
20 import org
.eclipse
.swt
.dnd
.DropTargetAdapter
;
21 import org
.eclipse
.swt
.dnd
.DropTargetEvent
;
22 import org
.eclipse
.swt
.widgets
.TreeItem
;
25 * DropTargetListener for filter view
26 * @author Xavier Raynaud <xavier.raynaud@kalray.eu>
28 class FilterDropTargetAdapter
extends DropTargetAdapter
{
30 private FilterViewer fViewer
;
34 * @param viewer the content of the FilterView
36 public FilterDropTargetAdapter(FilterViewer viewer
) {
38 this.fViewer
= viewer
;
42 * Returns <code>true</code> if droppedNode is an ancestor of node.
45 * the ITmfFilterTreeNode to drop or paste
47 * the ITmfFilterTreeNode receiving a new child
48 * @return <code>true</code> if droppedNode is and ancestor of node,
49 * <code>false</code> otherwise.
51 private static boolean isAncestor(ITmfFilterTreeNode droppedNode
, ITmfFilterTreeNode node
) {
52 ITmfFilterTreeNode tmp
= node
;
55 ITmfFilterTreeNode n
= tmp
.getParent();
56 if (n
== droppedNode
) {
65 public void dropAccept(DropTargetEvent event
) {
66 ITmfFilterTreeNode treeNodeToDrop
= null;
67 if (LocalSelectionTransfer
.getTransfer().isSupportedType(event
.currentDataType
)) {
68 treeNodeToDrop
= FilterEditUtils
.getTransferredTreeNode();
70 if (treeNodeToDrop
== null) {
72 event
.detail
= DND
.DROP_NONE
;
75 if (event
.item
instanceof TreeItem
) {
76 Object data
= event
.item
.getData();
77 if (data
instanceof ITmfFilterTreeNode
) {
78 ITmfFilterTreeNode node
= (ITmfFilterTreeNode
) data
;
79 if (node
.getValidChildren().contains(treeNodeToDrop
.getNodeName())) {
80 if (isAncestor(treeNodeToDrop
, node
) && event
.detail
!= DND
.DROP_COPY
) {
81 // do nothing in this case
82 event
.detail
= DND
.DROP_NONE
;
87 } else { // accept only TmfFilterNode
88 if (!TmfFilterNode
.NODE_NAME
.equals(treeNodeToDrop
.getNodeName())) {
89 event
.detail
= DND
.DROP_NONE
;
93 event
.detail
= DND
.DROP_NONE
;
98 public void drop(DropTargetEvent event
) {
99 ITmfFilterTreeNode treeNodeToDrop
= FilterEditUtils
.getTransferredTreeNode();
100 if (event
.item
instanceof TreeItem
) {
101 Object data
= event
.item
.getData();
102 if (data
instanceof ITmfFilterTreeNode
) {
103 ITmfFilterTreeNode node
= (ITmfFilterTreeNode
) data
;
104 if (node
.getValidChildren().contains(treeNodeToDrop
.getNodeName())) {
105 treeNodeToDrop
= treeNodeToDrop
.clone();
106 node
.addChild(treeNodeToDrop
);
108 fViewer
.setSelection(treeNodeToDrop
, true);
112 } else { // accept only TmfFilterNode
113 if (TmfFilterNode
.NODE_NAME
.equals(treeNodeToDrop
.getNodeName())) {
114 ITmfFilterTreeNode root
= fViewer
.getInput();
115 treeNodeToDrop
= treeNodeToDrop
.clone();
116 root
.addChild(treeNodeToDrop
);
118 fViewer
.setSelection(treeNodeToDrop
, true);