package mekhq.gui.handler; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.util.StringTokenizer; import java.util.UUID; import javax.swing.JComponent; import javax.swing.JTree; import javax.swing.TransferHandler; import javax.swing.tree.TreePath; import mekhq.MekHQ; import mekhq.campaign.event.OrganizationChangedEvent; import mekhq.campaign.force.Force; import mekhq.campaign.unit.Unit; import mekhq.gui.CampaignGUI; public class OrgTreeTransferHandler extends TransferHandler { /** * */ private static final long serialVersionUID = -1276891849078287710L; private CampaignGUI gui; public OrgTreeTransferHandler(CampaignGUI gui) { super(); this.gui = gui; } @Override public int getSourceActions(JComponent c) { return MOVE; } @Override public void exportDone(JComponent c, Transferable t, int action) { if (action == MOVE) { Object node = ((JTree)c).getLastSelectedPathComponent(); if (node instanceof Unit) { MekHQ.triggerEvent(new OrganizationChangedEvent((Unit)node)); } else if (node instanceof Force) { MekHQ.triggerEvent(new OrganizationChangedEvent((Force)node)); } } } @Override protected Transferable createTransferable(JComponent c) { JTree tree = (JTree) c; Object node = tree.getLastSelectedPathComponent(); if (node instanceof Unit) { return new StringSelection("UNIT|" + ((Unit) node).getId().toString()); } else if (node instanceof Force) { return new StringSelection("FORCE|" + Integer.toString(((Force) node).getId())); } return null; } public boolean canImport(TransferHandler.TransferSupport support) { if (!support.isDrop()) { return false; } support.setShowDropLocation(true); if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) { return false; } // Extract transfer data. @SuppressWarnings("unused") // FIXME Unit unit = null; Force force = null; Transferable t = support.getTransferable(); try { StringTokenizer st = new StringTokenizer( (String) t.getTransferData(DataFlavor.stringFlavor), "|"); String type = st.nextToken(); String id = st.nextToken(); if (type.equals("UNIT")) { unit = gui.getCampaign().getUnit(UUID.fromString(id)); } if (type.equals("FORCE")) { force = gui.getCampaign().getForce(Integer.parseInt(id)); } } catch (UnsupportedFlavorException ufe) { System.out.println("UnsupportedFlavor: " + ufe.getMessage()); } catch (java.io.IOException ioe) { System.out.println("I/O error: " + ioe.getMessage()); } // Do not allow a drop on the drag source selections. JTree.DropLocation dl = (JTree.DropLocation) support .getDropLocation(); JTree tree = (JTree) support.getComponent(); int dropRow = tree.getRowForPath(dl.getPath()); int[] selRows = tree.getSelectionRows(); for (int i = 0; i < selRows.length; i++) { if (selRows[i] == dropRow) { return false; } } TreePath dest = dl.getPath(); Object parent = dest.getLastPathComponent(); Force superForce = null; if (parent instanceof Force) { superForce = (Force) parent; } else if (parent instanceof Unit) { superForce = gui.getCampaign().getForce( ((Unit) parent).getForceId()); } if (null != force && null != superForce && force.isAncestorOf(superForce)) { return false; } return parent instanceof Force || parent instanceof Unit; } public boolean importData(TransferHandler.TransferSupport support) { if (!canImport(support)) { return false; } // Extract transfer data. Unit unit = null; Force force = null; Transferable t = support.getTransferable(); try { StringTokenizer st = new StringTokenizer( (String) t.getTransferData(DataFlavor.stringFlavor), "|"); String type = st.nextToken(); String id = st.nextToken(); if (type.equals("UNIT")) { unit = gui.getCampaign().getUnit(UUID.fromString(id)); } if (type.equals("FORCE")) { force = gui.getCampaign().getForce(Integer.parseInt(id)); } } catch (UnsupportedFlavorException ufe) { System.out.println("UnsupportedFlavor: " + ufe.getMessage()); } catch (java.io.IOException ioe) { System.out.println("I/O error: " + ioe.getMessage()); } // Get drop location info. JTree.DropLocation dl = (JTree.DropLocation) support .getDropLocation(); TreePath dest = dl.getPath(); Force superForce = null; Object parent = dest.getLastPathComponent(); if (parent instanceof Force) { superForce = (Force) parent; } else if (parent instanceof Unit) { superForce = gui.getCampaign().getForce( ((Unit) parent).getForceId()); } if (null != superForce) { if (null != unit) { gui.getCampaign().addUnitToForce(unit, superForce.getId()); return true; } if (null != force) { gui.getCampaign().moveForce(force, superForce); return true; } } return false; } }