blob: bf0b04ef20df977222fc1a3fcda864541dc57dc1 [file] [log] [blame]
david_williamscfdb2cd2004-11-11 08:37:49 +00001/*******************************************************************************
nsandonatodd813552010-07-06 14:12:36 +00002 * Copyright (c) 2001, 2010 IBM Corporation and others.
david_williamscfdb2cd2004-11-11 08:37:49 +00003 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
amywuecebb042007-04-10 20:07:35 +00007 *
david_williamscfdb2cd2004-11-11 08:37:49 +00008 * Contributors:
9 * IBM Corporation - initial API and implementation
10 * Jens Lukowski/Innoopract - initial renaming/restructuring
11 *
12 *******************************************************************************/
david_williamsf3680f02005-04-13 22:43:54 +000013package org.eclipse.wst.sse.ui.internal;
david_williamscfdb2cd2004-11-11 08:37:49 +000014
david_williamscfdb2cd2004-11-11 08:37:49 +000015import org.eclipse.jface.text.ITextViewer;
david_williamscfdb2cd2004-11-11 08:37:49 +000016import org.eclipse.swt.dnd.DND;
17import org.eclipse.swt.dnd.DropTargetAdapter;
18import org.eclipse.swt.dnd.DropTargetEvent;
19import org.eclipse.swt.dnd.FileTransfer;
20import org.eclipse.swt.dnd.Transfer;
21import org.eclipse.swt.dnd.TransferData;
david_williamscfdb2cd2004-11-11 08:37:49 +000022import org.eclipse.swt.graphics.Point;
nitind50897002005-06-03 20:33:54 +000023import org.eclipse.ui.IEditorPart;
nsandonatodd813552010-07-06 14:12:36 +000024import org.eclipse.wst.sse.ui.StructuredTextEditor;
nitind503fc092005-11-01 20:17:10 +000025import org.eclipse.wst.sse.ui.internal.TransferBuilder.TransferProxyForDelayLoading;
david_williamscfdb2cd2004-11-11 08:37:49 +000026
27/**
28 * ExtendedEditorDropTargetAdapter
29 */
30public class ExtendedEditorDropTargetAdapter extends DropTargetAdapter {
david_williamscfdb2cd2004-11-11 08:37:49 +000031 private String[] editorIds;
nitind8245dde2008-02-20 19:00:17 +000032 private Point originalRange = null;
nitind50897002005-06-03 20:33:54 +000033 private IEditorPart targetEditor = null;
david_williamscfdb2cd2004-11-11 08:37:49 +000034 private ITextViewer textViewer = null;
35
36 private Transfer[] transfers = null;
37
nitind503fc092005-11-01 20:17:10 +000038 private boolean useProxy;
39
40 /**
41 * @deprecated use ExtendedEditorDropTargetAdapter(boolean useProxy) for
42 * the performance
43 */
david_williamscfdb2cd2004-11-11 08:37:49 +000044 public ExtendedEditorDropTargetAdapter() {
nitind503fc092005-11-01 20:17:10 +000045 this(false);
46 }
47
48 public ExtendedEditorDropTargetAdapter(boolean useProxy) {
david_williamscfdb2cd2004-11-11 08:37:49 +000049 super();
nitind503fc092005-11-01 20:17:10 +000050 this.useProxy = useProxy;
david_williamscfdb2cd2004-11-11 08:37:49 +000051 }
52
53 protected boolean doDrop(Transfer transfer, DropTargetEvent event) {
nitind503fc092005-11-01 20:17:10 +000054 TransferBuilder tb = new TransferBuilder(useProxy);
david_williamscfdb2cd2004-11-11 08:37:49 +000055
56 IDropAction[] as = null;
57 if (editorIds != null && editorIds.length > 0)
nitind503fc092005-11-01 20:17:10 +000058 as = tb.getDropActions(editorIds, transfer);
david_williamscfdb2cd2004-11-11 08:37:49 +000059 else
nitind503fc092005-11-01 20:17:10 +000060 as = tb.getDropActions(getTargetEditor().getClass().getName(), transfer);
david_williamscfdb2cd2004-11-11 08:37:49 +000061
62 for (int i = 0; i < as.length; ++i) {
63 IDropAction da = as[i];
nitind503fc092005-11-01 20:17:10 +000064 Transfer actualTransfer;
65 if (transfer instanceof TransferProxyForDelayLoading) {
66 actualTransfer = ((TransferProxyForDelayLoading) transfer).getTransferClass();
67 }
68 else {
69 actualTransfer = transfer;
70 }
71 if (actualTransfer instanceof FileTransfer) {
david_williamscfdb2cd2004-11-11 08:37:49 +000072 if (event.data == null) {
73 Logger.log(Logger.ERROR, "No data in DropTargetEvent from " + event.widget); //$NON-NLS-1$
74 return false;
75 }
76 String[] strs = (String[]) event.data;
77 boolean[] bs = new boolean[strs.length];
78 int c = 0;
79 for (int j = 0; j < strs.length; ++j) {
80 bs[j] = false;
81 if (da.isSupportedData(strs[j])) {
82 event.data = new String[]{strs[j]};
83 if (!da.run(event, targetEditor)) {
84 bs[j] = true;
85 c++;
86 }
nitind88d64402006-07-10 16:51:38 +000087 }
88 else {
david_williamscfdb2cd2004-11-11 08:37:49 +000089 bs[j] = true;
90 c++;
91 }
92 }
93 if (c == 0) {
94 return true;
95 }
96
97 int k = 0;
98 String[] rests = new String[c];
99 for (int j = 0; j < strs.length; ++j) {
100 if (bs[j])
101 rests[k++] = strs[j];
102 }
103 event.data = rests;
nitind88d64402006-07-10 16:51:38 +0000104 }
105 else if (da.isSupportedData(event.data)) {
david_williamscfdb2cd2004-11-11 08:37:49 +0000106 if (da.run(event, targetEditor)) {
107 return true;
108 }
109 }
110 }
111
112 return false;
113 }
114
115 /**
116 */
117 public void dragEnter(DropTargetEvent event) {
david_williamscfdb2cd2004-11-11 08:37:49 +0000118 TransferData data = null;
119 Transfer[] ts = getTransfers();
120 for (int i = 0; i < ts.length; i++) {
121 for (int j = 0; j < event.dataTypes.length; j++) {
122 if (ts[i].isSupportedType(event.dataTypes[j])) {
123 data = event.dataTypes[j];
124 break;
125 }
126 }
127 if (data != null) {
128 event.currentDataType = data;
129 break;
130 }
131 }
132
133 if (textViewer != null) {
nitind8245dde2008-02-20 19:00:17 +0000134 originalRange = textViewer.getSelectedRange();
david_williamscfdb2cd2004-11-11 08:37:49 +0000135 }
136 }
137
138 public void dragLeave(DropTargetEvent event) {
139 if (textViewer != null) {
nitind8245dde2008-02-20 19:00:17 +0000140 textViewer.setSelectedRange(originalRange.x, originalRange.y);
141 }
142 else {
143 originalRange = null;
david_williamscfdb2cd2004-11-11 08:37:49 +0000144 }
145 }
146
147 /**
nitind4da74b82006-12-12 07:15:15 +0000148 * Scroll the visible area as needed
david_williamscfdb2cd2004-11-11 08:37:49 +0000149 */
150 public void dragOver(DropTargetEvent event) {
151 event.operations &= ~DND.DROP_MOVE;
152 event.detail = DND.DROP_COPY;
nitind8245dde2008-02-20 19:00:17 +0000153 event.feedback |= DND.FEEDBACK_SCROLL;
david_williamscfdb2cd2004-11-11 08:37:49 +0000154 }
155
156 /**
157 */
158 public void drop(DropTargetEvent event) {
159 if (event.operations == DND.DROP_NONE)
160 return;
161
david_williamscfdb2cd2004-11-11 08:37:49 +0000162 Transfer[] ts = getTransfers();
163 for (int i = 0; i < ts.length; i++) {
164 if (ts[i].isSupportedType(event.currentDataType)) {
165 if (doDrop(ts[i], event)) {
nsandonatodd813552010-07-06 14:12:36 +0000166 IEditorPart part = targetEditor;
167 if (targetEditor instanceof StructuredTextEditor){
168 part = ((StructuredTextEditor) targetEditor).getEditorPart();
169 }
170 targetEditor.getSite().getPage().activate(part);
david_williamscfdb2cd2004-11-11 08:37:49 +0000171 break;
172 }
173 }
174 }
175 }
176
nitind50897002005-06-03 20:33:54 +0000177 public IEditorPart getTargetEditor() {
david_williamscfdb2cd2004-11-11 08:37:49 +0000178 return targetEditor;
179 }
180
181 public ITextViewer getTextViewer() {
182 return textViewer;
183 }
184
185 /**
186 * @return org.eclipse.swt.dnd.Transfer[]
187 */
188 public Transfer[] getTransfers() {
189 if (transfers == null) {
nitind503fc092005-11-01 20:17:10 +0000190 TransferBuilder tb = new TransferBuilder(useProxy);
david_williamscfdb2cd2004-11-11 08:37:49 +0000191 if (editorIds == null || editorIds.length == 0)
192 transfers = tb.getDropTargetTransfers(getTargetEditor().getClass().getName());
193 else
194 transfers = tb.getDropTargetTransfers(editorIds);
195 }
196 return transfers;
197 }
198
199 /**
200 */
nitind50897002005-06-03 20:33:54 +0000201 public void setTargetEditor(IEditorPart targetEditor) {
david_williamscfdb2cd2004-11-11 08:37:49 +0000202 this.targetEditor = targetEditor;
203 }
204
205 public void setTargetIDs(String[] ids) {
206 editorIds = ids;
207 }
208
209 public void setTextViewer(ITextViewer textViewer) {
210 this.textViewer = textViewer;
211 }
212
david_williamscfdb2cd2004-11-11 08:37:49 +0000213}