package open.dolphin.client; import java.awt.EventQueue; import java.awt.Window; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import javax.swing.*; import open.dolphin.delegater.StampDelegater; import open.dolphin.infomodel.IInfoModel; import open.dolphin.infomodel.ModuleInfoBean; import open.dolphin.infomodel.ModuleModel; import open.dolphin.infomodel.StampModel; import open.dolphin.project.Project; import open.dolphin.stampbox.StampTreeNode; import open.dolphin.util.BeanUtils; /** * StampHolderTransferHandler * * @author Kazushi Minagawa. Digital Globe, Inc. * */ public class StampHolderTransferHandler extends TransferHandler implements IKarteTransferHandler { private final KartePane pPane; private final StampHolder stampHolder; public StampHolderTransferHandler(KartePane pPane, StampHolder sh) { this.pPane = pPane; this.stampHolder = sh; } @Override protected Transferable createTransferable(JComponent c) { StampHolder source = (StampHolder) c; KartePane context = source.getKartePane(); context.setDrragedStamp(new ComponentHolder[]{source}); context.setDraggedCount(1); ModuleModel stamp = source.getStamp(); OrderList list = new OrderList(new ModuleModel[]{stamp}); Transferable tr = new OrderListTransferable(list); return tr; } @Override public int getSourceActions(JComponent c) { return COPY_OR_MOVE; } private void replaceStamp(final StampHolder target, final ModuleInfoBean stampInfo) { Runnable r = () -> { try { StampDelegater sdl = new StampDelegater(); StampModel getStamp = sdl.getStamp(stampInfo.getStampId()); final ModuleModel stamp = new ModuleModel(); if (getStamp != null) { stamp.setModel((IInfoModel) BeanUtils.xmlDecode(getStamp.getStampBytes())); stamp.setModuleInfoBean(stampInfo); } Runnable awt = () -> { target.importStamp(stamp); }; EventQueue.invokeLater(awt); } catch (Exception e) { e.printStackTrace(System.err); } }; Thread t = new Thread(r); t.setPriority(Thread.NORM_PRIORITY); t.start(); } private void confirmReplace(StampHolder target, ModuleInfoBean stampInfo) { Window w = SwingUtilities.getWindowAncestor(target); java.util.ResourceBundle bundle = ClientContext.getMyBundle(StampHolderTransferHandler.class); String replace = bundle.getString("optionText.replace"); String cancel = GUIFactory.getCancelButtonText(); String question = bundle.getString("question.replaceStamp"); String title = bundle.getString("title.optionPane"); title = ClientContext.getFrameTitle(title); int option = JOptionPane.showOptionDialog( w, question, title, JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[]{replace, cancel}, replace); if (option==0) { replaceStamp(target, stampInfo); } } @Override public boolean importData(TransferHandler.TransferSupport support) { if (canImport(support)) { final StampHolder target = (StampHolder)support.getComponent(); Transferable tr = support.getTransferable(); StampTreeNode droppedNode; try { droppedNode = (StampTreeNode) tr.getTransferData(LocalStampTreeNodeTransferable.localStampTreeNodeFlavor); } catch (UnsupportedFlavorException | IOException e) { e.printStackTrace(System.err); return false; } if (droppedNode == null || (!droppedNode.isLeaf())) { return false; } final ModuleInfoBean stampInfo = (ModuleInfoBean) droppedNode.getStampInfo(); String role = stampInfo.getStampRole(); if (!role.equals(IInfoModel.ROLE_P)) { return false; } if (Project.getBoolean("replaceStamp", false)) { replaceStamp(target, stampInfo); } else { Runnable r = () -> { confirmReplace(target, stampInfo); }; EventQueue.invokeLater(r); } return true; } return false; } @Override protected void exportDone(JComponent c, Transferable tr, int action) { StampHolder test = (StampHolder) c; KartePane context = test.getKartePane(); if (action == MOVE && context.getDrragedStamp() != null && context.getDraggedCount() == context.getDroppedCount()) { //s.oh^ 2013/11/26 スクロールバーのリセット //context.removeStamp(test); // TODO context.removeStamp(test, false); //s.oh$ } context.setDrragedStamp(null); context.setDraggedCount(0); context.setDroppedCount(0); } /** * インポート可能かどうかを返す。 * @return */ @Override public boolean canImport(TransferHandler.TransferSupport support) { StampHolder test = (StampHolder)support.getComponent(); JTextPane tc = (JTextPane) test.getKartePane().getTextPane(); boolean ok = tc.isEditable(); ok = ok && hasFlavor(support.getDataFlavors()); return ok; } protected boolean hasFlavor(DataFlavor[] flavors) { for (DataFlavor flavor : flavors) { if (LocalStampTreeNodeTransferable.localStampTreeNodeFlavor.equals(flavor)) { return true; } } return false; } /** * スタンプをクリップボードへ転送する。 */ @Override public void exportToClipboard(JComponent comp, Clipboard clip, int action) { StampHolder sh = (StampHolder) comp; Transferable tr = createTransferable(comp); clip.setContents(tr, null); if (action == MOVE) { KartePane kartePane = sh.getKartePane(); if (kartePane.getTextPane().isEditable()) { //s.oh^ 2013/11/26 スクロールバーのリセット //kartePane.removeStamp(sh); kartePane.removeStamp(sh, true); //s.oh$ } } } @Override public JComponent getComponent() { return stampHolder; } @Override public void enter(ActionMap map) { stampHolder.setSelected(true); map.get(GUIConst.ACTION_COPY).setEnabled(true); boolean canCut = (pPane.getTextPane().isEditable()); map.get(GUIConst.ACTION_CUT).setEnabled(canCut); map.get(GUIConst.ACTION_PASTE).setEnabled(false); } @Override public void exit(ActionMap map) { stampHolder.setSelected(false); } }