1 package org.columba.mail.gui.tree; 17 18 import java.awt.datatransfer.DataFlavor ; 19 import java.awt.datatransfer.Transferable ; 20 21 import javax.swing.JComponent ; 22 import javax.swing.TransferHandler ; 23 import javax.swing.tree.DefaultMutableTreeNode ; 24 import javax.swing.tree.TreePath ; 25 26 import org.columba.api.gui.frame.IFrameMediator; 27 import org.columba.core.command.CommandProcessor; 28 import org.columba.core.facade.DialogFacade; 29 import org.columba.mail.command.IMailFolderCommandReference; 30 import org.columba.mail.command.MailFolderCommandReference; 31 import org.columba.mail.folder.IMailFolder; 32 import org.columba.mail.folder.IMailbox; 33 import org.columba.mail.folder.command.CopyMessageCommand; 34 import org.columba.mail.folder.command.MoveFolderCommand; 35 import org.columba.mail.folder.command.MoveMessageCommand; 36 import org.columba.mail.gui.frame.MailFrameMediator; 37 import org.columba.mail.gui.table.MessageReferencesTransfer; 38 39 54 public class TreeViewTransferHandler extends TransferHandler { 55 56 private IFrameMediator frameMediator; 57 58 public TreeViewTransferHandler(IFrameMediator frameMediator) { 59 this.frameMediator = frameMediator; 60 } 61 62 63 public boolean importData(JComponent comp, Transferable transferProxy) { 64 boolean dataWasImported = false; 65 66 if (comp instanceof TreeView) { 67 TreeView treeView = (TreeView) comp; 68 69 try { 70 DataFlavor [] dataFlavors = transferProxy 71 .getTransferDataFlavors(); 72 73 for (int i = 0; (i < dataFlavors.length) && (!dataWasImported); i++) { 74 if (dataFlavors[i].equals(FolderTransfer.FLAVOR)) { 75 dataWasImported = importFolderReferences(treeView, 76 (FolderTransfer) transferProxy 77 .getTransferData(FolderTransfer.FLAVOR)); 78 } else if (dataFlavors[i] 79 .equals(MessageReferencesTransfer.FLAVOR)) { 80 MessageReferencesTransfer messageTransferable = (MessageReferencesTransfer) transferProxy 81 .getTransferData(MessageReferencesTransfer.FLAVOR); 82 dataWasImported = importMessageReferences(treeView, 83 messageTransferable); 84 } 85 } 86 } catch (Exception e) { DialogFacade.showExceptionDialog(e); 88 } 89 } 90 91 return dataWasImported; 92 } 93 94 108 private boolean importFolderReferences(TreeView treeView, 109 FolderTransfer transferable) { 110 boolean dataWasImported = false; 111 112 IMailFolder destFolder = treeView.getDropTargetFolder(); 113 IMailbox draggedFolder = transferable.getFolderReference(); 114 115 if ((destFolder != null) && (draggedFolder != null)) { 116 dataWasImported = true; 119 } 120 121 return dataWasImported; 122 } 123 124 135 private boolean importMessageReferences(TreeView treeView, 136 MessageReferencesTransfer transferable) { 137 boolean dataWasImported = false; 138 139 IMailbox destFolder = null; 140 141 if (transferable.isDragOperation()) 142 destFolder = (IMailbox) treeView.getDropTargetFolder(); 143 else if (transferable.isClipboardOperation()) 144 destFolder = (IMailbox) ((MailFrameMediator) frameMediator) 145 .getTableSelection().getSourceFolder(); 146 147 IMailFolderCommandReference result = transferable.getFolderReferences(); 148 result.setDestinationFolder(destFolder); 149 150 if (transferable.getAction() == TransferHandler.MOVE) { 151 MoveMessageCommand command = new MoveMessageCommand(result); 153 CommandProcessor.getInstance().addOp(command); 154 } else if (transferable.getAction() == TransferHandler.COPY) { 155 CopyMessageCommand command = new CopyMessageCommand(result); 157 CommandProcessor.getInstance().addOp(command); 158 } 159 160 164 dataWasImported = true; 165 166 return dataWasImported; 167 } 168 169 170 protected void exportDone(JComponent source, Transferable data, int action) { 171 if (source instanceof TreeView) { 172 TreeView treeView = (TreeView) source; 173 174 if (data instanceof FolderTransfer) { 175 IMailbox draggedFolder = ((FolderTransfer) data) 176 .getFolderReference(); 177 exportFolder(treeView, draggedFolder); 178 } 179 } 180 } 181 182 191 private void exportFolder(TreeView treeView, IMailbox folder) { 192 MailFolderCommandReference commandRef = new MailFolderCommandReference( 193 folder); 194 IMailFolder destFolder = (IMailFolder) treeView.getDropTargetFolder(); 195 196 if (folder.equals(destFolder)) 197 return; 198 199 commandRef.setDestinationFolder(destFolder); 200 treeView.resetDropTargetFolder(); 201 202 CommandProcessor.getInstance().addOp(new MoveFolderCommand(commandRef)); 203 } 204 205 206 public int getSourceActions(JComponent c) { 207 int action = TransferHandler.NONE; 208 209 if (c instanceof TreeView) { 210 action = TransferHandler.MOVE; 211 } 212 213 return action; 214 } 215 216 217 protected Transferable createTransferable(JComponent c) { 218 Transferable exportObject = null; 219 220 if (c instanceof TreeView) { 221 TreeView treeView = (TreeView) c; 222 TreePath path = treeView.getSelectionModel().getSelectionPath(); 223 224 IMailFolder folderNode = (IMailFolder) path.getLastPathComponent(); 225 226 if (folderNode.supportsMove()) { 227 exportObject = new FolderTransfer((IMailbox) folderNode); 228 } 229 } 230 231 return exportObject; 232 } 233 234 235 public boolean canImport(JComponent comp, DataFlavor [] transferFlavors) { 236 boolean canHandleOneOfDataFlavors = false; 237 238 if (comp instanceof TreeView) { 239 TreeView treeView = (TreeView) comp; 240 241 IMailFolder dropTarget = treeView.getDropTargetFolder(); 242 243 if (dropTarget != null) { 244 for (int k = 0; (k < transferFlavors.length) 245 && (!canHandleOneOfDataFlavors); k++) { 246 if (transferFlavors[k] 247 .equals(MessageReferencesTransfer.FLAVOR)) { 248 canHandleOneOfDataFlavors = canHandleMessageImport( 249 treeView, dropTarget); 250 } else if (transferFlavors[k].equals(FolderTransfer.FLAVOR)) { 251 canHandleOneOfDataFlavors = canHandleFolderImport( 252 treeView, dropTarget); 253 } 254 } 255 } 256 } 257 258 return canHandleOneOfDataFlavors; 259 } 260 261 270 private boolean canHandleFolderImport(TreeView treeView, 271 IMailFolder dropTarget) { 272 boolean canImport = false; 273 274 DefaultMutableTreeNode dragTarget = treeView 275 .getSelectedNodeBeforeDragAction(); 276 277 if ((dragTarget != null) 278 && (!dragTarget 279 .isNodeDescendant((DefaultMutableTreeNode ) dropTarget)) 280 && (dragTarget != dropTarget)) { 281 canImport = dropTarget.supportsAddFolder(((IMailFolder) dragTarget) 282 .getType()); 283 } 284 285 return canImport; 286 } 287 288 299 private boolean canHandleMessageImport(TreeView treeView, 300 IMailFolder dropTarget) { 301 boolean canImport = false; 302 303 IMailFolder dragTarget = (IMailFolder) treeView 304 .getSelectedNodeBeforeDragAction(); 305 306 if (dragTarget != dropTarget) { 307 canImport = dropTarget.supportsAddMessage(); 308 } 309 310 return canImport; 311 } 312 } | Popular Tags |