/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 * * 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 org.apache.directory.studio.ldapbrowser.ui.views.browser; import org.eclipse.swt.dnd.DropTargetListener; /** * This class implements the {@link DropTargetListener} for the browser view. * * TODO: The code isn't working yet, just a test implementation. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class DropListener /* implements DropTargetListener, ModelModifier */ {/* * * private Shell shell; private Clipboard systemClipboard; private * InternalClipboard internalClipboard; * * * public DropListener(Shell shell, Clipboard systemClipboard, * InternalClipboard internalClipboard) { this.shell = shell; * this.systemClipboard = systemClipboard; this.internalClipboard = * internalClipboard; * } public void dispose() { this.shell = null; this.systemClipboard = * null; this.internalClipboard = null; * } * * private int dragOperation = DND.DROP_NONE; * * public void dragEnter(DropTargetEvent event) { * //System.out.println("dragEnter: " + event.detail); dragOperation = * event.detail; event.currentDataType = * BrowserTransfer.getInstance().getSupportedTypes()[0]; * this.check(event); } * * public void dragLeave(DropTargetEvent event) { * //System.out.println("dragLeave: " + event.detail); dragOperation = * DND.DROP_NONE; } * * public void dragOperationChanged(DropTargetEvent event) { * //System.out.println("dragOperationChanged: " + event.detail); * dragOperation = event.detail; this.check(event); } * * public void dragOver(DropTargetEvent event) { * //System.out.println("dragOver: " + event.item.getData()); * * this.check(event); * * //System.out.println("dragOver: " + event.detail); * * //System.out.println(); * //System.out.println(event.item.getClass().getName()); * //System.out.println(event.item.getData().getClass().getName()); * //System.out.println(event.currentDataType.type); } * * private void check(DropTargetEvent event) { if(event.item != null && * event.item.getData() != null) { if * (BrowserTransfer.getInstance().isSupportedType(event.currentDataType)) { * if(event.item.getData() instanceof ISearch && * this.internalClipboard.getObjectToTransfer() instanceof ISearch[]) { * event.detail = dragOperation; return; } else if(event.item.getData() * instanceof BrowserCategory && * ((BrowserCategory)event.item.getData()).getType() == * BrowserCategory.TYPE_SEARCHES && * this.internalClipboard.getObjectToTransfer() instanceof ISearch[]) { * event.detail = dragOperation; return; } else if(event.item.getData() * instanceof IEntry && this.internalClipboard.getObjectToTransfer() * instanceof IEntry[]) { event.detail = dragOperation; * * IEntry[] entries = * (IEntry[])this.internalClipboard.getObjectToTransfer(); for(int i=0; * i<entries.length; i++) { if(entries[i].hasChildren()) { event.detail = * DND.DROP_COPY; return; } } * * return; } else if(event.item.getData() instanceof IEntry && * this.internalClipboard.getObjectToTransfer() instanceof * ISearchResult[]) { event.detail = dragOperation; * * ISearchResult[] srs = * (ISearchResult[])this.internalClipboard.getObjectToTransfer(); * for(int i=0; i<srs.length; i++) { * if(!srs[i].getEntry().hasChildren()) { event.detail = DND.DROP_COPY; * return; } } * * return; } else { event.detail = DND.DROP_NONE; } } else { * event.detail = DND.DROP_NONE; } } else { event.detail = * DND.DROP_NONE; } } * * public void drop(DropTargetEvent event) { * * //System.out.println("drop: " + event); * * try { * * if * (BrowserTransfer.getInstance().isSupportedType(event.currentDataType) && * event.data instanceof String && * this.internalClipboard.getClass().getName().equals(event.data)) { * * if(event.detail == DND.DROP_MOVE) { * this.internalClipboard.setOperationType(InternalClipboard.TYPE_MOVE_OPERATION); } * else if(event.detail == DND.DROP_COPY) { * this.internalClipboard.setOperationType(InternalClipboard.TYPE_DUPLICATE_OPERATION); } * else { * this.internalClipboard.setOperationType(InternalClipboard.TYPE_UNKNOWN); } * * * ISearch[] selectedSearches = new ISearch[0]; IEntry[] selectedEntries = * new IEntry[0]; ISearchResult[] selectedSearchResults = new * ISearchResult[0]; BrowserCategory[] selectedBrowserViewCategories = * new BrowserCategory[0]; * * if (event.item != null && event.item.getData() instanceof ISearch) { * selectedSearches = new ISearch[]{(ISearch) event.item.getData()}; } * else if (event.item != null && event.item.getData() instanceof * IEntry) { selectedEntries = new IEntry[]{(IEntry) * event.item.getData()}; } else if (event.item != null && * event.item.getData() instanceof ISearchResult) { * selectedSearchResults = new ISearchResult[]{(ISearchResult) * event.item.getData()}; } else if (event.item != null && * event.item.getData() instanceof BrowserCategory) { * selectedBrowserViewCategories = new * BrowserCategory[]{(BrowserCategory) event.item.getData()}; } * * this.runPaste(this.internalClipboard, selectedSearches, * selectedEntries, selectedSearchResults, * selectedBrowserViewCategories); * * * // // get search to handle and its search manager // ISearch[] * searches = (ISearch[]) event.data; // for(int i=0; i<searches.length; * i++) { // ISearch search = searches[i]; // IConnection connection = * search.getConnection(); // SearchManager dragSearchManager = * connection.getSearchManager(); // // // get position // //int * position = dragSearchManager.indexOf(search); // // // get drop * search manager and drop position, // // default is last and the drop * search // int dropPosition = -1; // SearchManager dropSearchManager = * null; // if (event.item != null && event.item.getData() instanceof * ISearch) { // ISearch dropSearch = (ISearch) event.item.getData(); // * dropSearchManager = dropSearch.getConnection().getSearchManager(); // * dropPosition = dropSearchManager.indexOf(dropSearch); // } else { // * dropSearchManager = this.selectedConnection.getSearchManager(); // * dropPosition = dropSearchManager.getSearchCount(); // } // if * (dropPosition == -1) { // dropSearchManager = dragSearchManager; // * dropPosition = dragSearchManager.getSearchCount(); // } // // // if * MOVE operation, first remove from old position // if (event.detail == * DND.DROP_MOVE && dragSearchManager == dropSearchManager) { // * dragSearchManager.removeSearch(search); // * if(dropPosition>dragSearchManager.getSearchCount()) { // * dropPosition--; // } // dropSearchManager.addSearch(dropPosition, * search); // event.detail = DND.DROP_NONE; // // } else if * (event.detail == DND.DROP_COPY || // (event.detail == DND.DROP_MOVE && * dragSearchManager != dropSearchManager)) { // ISearch newSearch = * (ISearch) search.clone(); // * newSearch.setConnection(dropSearchManager.getConnection()); // * dropSearchManager.addSearch(dropPosition, newSearch); // // } // else { // * event.detail = DND.DROP_NONE; // } // } } } catch (Exception e) { * event.detail = DND.DROP_NONE; e.printStackTrace(); } * } * * public void dropAccept(DropTargetEvent event) { * //System.out.println("dropAccept: " + event.detail + event.feedback); * event.currentDataType = * BrowserTransfer.getInstance().getSupportedTypes()[0]; check(event); } * * * * * public void runPaste(InternalClipboard internalClipboard, ISearch[] * selectedSearches, IEntry[] selectedEntries, ISearchResult[] * selectedSearchResults, BrowserCategory[] * selectedBrowserViewCategories) { Object objectToTransfer = * internalClipboard.getObjectToTransfer(); * * if (objectToTransfer != null && objectToTransfer instanceof ISearch[] && * selectedSearches.length > 0 && selectedEntries.length == 0 && * selectedSearchResults.length == 0) { ISearch[] searchesToTransfer = * (ISearch[]) objectToTransfer; if (searchesToTransfer != null && * searchesToTransfer.length > 0) { ISearch pasteSearch = * selectedSearches[selectedSearches.length-1]; IConnection connection = * pasteSearch.getConnection(); SearchManager searchManager = * connection.getSearchManager(); * * int index = searchManager.indexOf(pasteSearch); * * for(int i=0; i<searchesToTransfer.length; i++) { ISearch newSearch = * (ISearch) searchesToTransfer[i].clone(); * newSearch.setConnection(connection); * if(internalClipboard.getOperationType() == * InternalClipboard.TYPE_DUPLICATE_OPERATION) { * searchManager.addSearch(index+1+i, newSearch); } else * if(internalClipboard.getOperationType() == * InternalClipboard.TYPE_MOVE_OPERATION) { * searchesToTransfer[i].getConnection().getSearchManager().removeSearch(searchesToTransfer[i].getName()); * searchManager.addSearch(index+i, newSearch); * if(searchManager.indexOf(pasteSearch) < index) { index = * searchManager.indexOf(pasteSearch); } } } } } else if * (objectToTransfer != null && objectToTransfer instanceof ISearch[] && * selectedBrowserViewCategories.length == 1 && * selectedBrowserViewCategories[0].getType()==BrowserCategory.TYPE_SEARCHES) { * ISearch[] searchesToTransfer = (ISearch[]) objectToTransfer; if * (searchesToTransfer != null && searchesToTransfer.length > 0) { * IConnection connection = * selectedBrowserViewCategories[0].getParent(); SearchManager * searchManager = connection.getSearchManager(); for(int i=0; i<searchesToTransfer.length; * i++) { ISearch newSearch = (ISearch) searchesToTransfer[i].clone(); * newSearch.setConnection(connection); * if(internalClipboard.getOperationType() == * InternalClipboard.TYPE_DUPLICATE_OPERATION) { * searchManager.addSearch(searchManager.getSearchCount(), newSearch); } * else if(internalClipboard.getOperationType() == * InternalClipboard.TYPE_MOVE_OPERATION) { * searchesToTransfer[i].getConnection().getSearchManager().removeSearch(searchesToTransfer[i].getName()); * searchManager.addSearch(searchManager.getSearchCount(), newSearch); } } } } * else if (objectToTransfer != null && objectToTransfer instanceof * IEntry[] && selectedEntries.length == 1 && selectedSearches.length == * 0 && selectedSearchResults.length == 0) { IEntry[] entries = * (IEntry[]) objectToTransfer; if (entries != null && entries.length > * 0) { if(internalClipboard.getOperationType() == * InternalClipboard.TYPE_DUPLICATE_OPERATION) new * CopyEntriesRunnable(selectedEntries[0], entries).execute(); else * if(internalClipboard.getOperationType() == * InternalClipboard.TYPE_MOVE_OPERATION) this.move(selectedEntries[0], * entries); } } else if (objectToTransfer != null && objectToTransfer * instanceof ISearchResult[] && selectedEntries.length == 1 && * selectedSearches.length == 0 && selectedSearchResults.length == 0) { * ISearchResult[] searchResults = (ISearchResult[]) objectToTransfer; * IEntry[] entries = new IEntry[searchResults.length]; for(int i=0; i<searchResults.length; * i++) { entries[i] = searchResults[i].getEntry(); } if (entries != * null && entries.length > 0) { if(internalClipboard.getOperationType() == * InternalClipboard.TYPE_DUPLICATE_OPERATION) new * CopyEntriesRunnable(selectedEntries[0], entries).execute(); else * if(internalClipboard.getOperationType() == * InternalClipboard.TYPE_MOVE_OPERATION) this.move(selectedEntries[0], * entries); } } * * if(internalClipboard.getOperationType() == * InternalClipboard.TYPE_MOVE_OPERATION) { internalClipboard.clear(); } } * * private void move (final IEntry newParent, final IEntry[] * entriesToMove) { * * for(int i=0; i<entriesToMove.length; i++) { try { * entriesToMove[i].moveTo(newParent, this); } * catch(ModelModificationException mme) { * BrowserUIPlugin.getDefault().getExceptionHandler().handleException(mme.getMessage(), * mme); } catch(Exception e) { * BrowserUIPlugin.getDefault().getExceptionHandler().handleException(e.getMessage(), * e); } } * * //EventRegistry.fireEntryUpdated(new * ChildrenInitializedEvent(newParent, newParent.getConnection()), * this); } */ }