/* * Copyright (C) 2007, 2008 Clam <clamisgood@gmail.com> * Copyright (C) 2008 IsmAvatar <IsmAvatar@gmail.com> * * This file is part of LateralGM. * LateralGM is free software and comes with ABSOLUTELY NO WARRANTY. * See LICENSE for details. */ package org.lateralgm.subframes; import static org.lateralgm.main.Util.deRef; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.lang.ref.WeakReference; import javax.swing.GroupLayout; import javax.swing.Icon; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.TransferHandler; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.plaf.basic.BasicToolBarUI; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreePath; import org.lateralgm.components.CustomJToolBar; import org.lateralgm.components.ResourceMenu; import org.lateralgm.components.impl.EventNode; import org.lateralgm.components.impl.IndexButtonGroup; import org.lateralgm.components.impl.ResNode; import org.lateralgm.components.mdi.MDIPane; import org.lateralgm.main.LGM; import org.lateralgm.main.Prefs; import org.lateralgm.main.UpdateSource.UpdateEvent; import org.lateralgm.main.UpdateSource.UpdateListener; import org.lateralgm.messages.Messages; import org.lateralgm.resources.GmObject; import org.lateralgm.resources.ResourceReference; import org.lateralgm.resources.sub.Event; import org.lateralgm.resources.sub.MainEvent; import org.lateralgm.subframes.GmObjectFrame.EventGroupNode; import org.lateralgm.subframes.GmObjectFrame.EventInstanceNode; public class EventPanel extends CustomJToolBar implements ActionListener,TreeSelectionListener, PropertyChangeListener, UpdateListener { private static final long serialVersionUID = 1L; public static final int FUNCTION_ADD = 0; public static final int FUNCTION_REPLACE = 1; public static final int FUNCTION_DUPLICATE = 2; public IndexButtonGroup function; public ResourceMenu<GmObject> linkSelect; public WeakReference<GmObjectFrame> linkedFrame; private MListener mListener = new MListener(); public EventNode root; public JTree events; public EventNode selectedNode; public EventNode collision; public JCheckBox stayOpen; public EventPanel() { super(VERTICAL); GroupLayout layout = new GroupLayout(this); // This will ensure it gets the proper Window title when floating setName(Messages.getString("Toolbar.EVENT_BUTTON")); function = new IndexButtonGroup(3,true,false); JRadioButton ra = new JRadioButton(Messages.getString("EventPanel.ADD")); //$NON-NLS-1$ JRadioButton rr = new JRadioButton(Messages.getString("EventPanel.REPLACE")); //$NON-NLS-1$ JRadioButton rd = new JRadioButton(Messages.getString("EventPanel.DUPLICATE")); //$NON-NLS-1$ function.add(ra); function.add(rr); function.add(rd); function.setValue(FUNCTION_ADD); JLabel windowLabel = new JLabel(Messages.getString("EventPanel.OBJECT_WINDOW")); linkSelect = new ResourceMenu<GmObject>(GmObject.class, Messages.getString("EventPanel.NO_LINK"),false,120,true,true); //$NON-NLS-1$ linkSelect.addActionListener(this); stayOpen = new JCheckBox(Messages.getString("EventPanel.STAY_OPEN")); //$NON-NLS-1$ JScrollPane treeScroll = new JScrollPane(makeTree()); layout.setVerticalGroup(layout.createSequentialGroup().addGap(10) /**/.addGroup(layout.createParallelGroup() /* */.addComponent(ra).addComponent(rr).addComponent(rd)) /**/.addGroup(layout.createParallelGroup() /* */.addComponent(windowLabel).addComponent(linkSelect)) /**/.addComponent(stayOpen).addComponent(treeScroll)); layout.setHorizontalGroup(layout.createParallelGroup() /**/.addGroup(layout.createSequentialGroup() /* */.addComponent(ra).addComponent(rr).addComponent(rd)) /**/.addGroup(layout.createSequentialGroup() /* */.addComponent(windowLabel).addComponent(linkSelect)) /**/.addComponent(stayOpen).addComponent(treeScroll)); // set the layout after you actually create the layout, otherwise it won't work for certain look and feels setLayout(layout); reload(); setPreferredSize(new Dimension(250,300)); } private JTree makeTree() { root = new EventNode("Root"); //$NON-NLS-1$ //CREATE root.add(MainEvent.EV_CREATE); //DESTROY root.add(MainEvent.EV_DESTROY); //ALARM EventNode alarm = new EventNode(MainEvent.EV_ALARM); root.add(alarm); for (int i = 0; i <= 11; i++) alarm.add(new EventNode( Messages.format("Event.EVENT2_X",i),MainEvent.EV_ALARM,Event.EV_ALARM0 + i)); //$NON-NLS-1$ //STEP EventNode step = new EventNode(MainEvent.EV_STEP); root.add(step); for (int i = Event.EV_STEP_NORMAL; i <= Event.EV_STEP_END; i++) step.add(MainEvent.EV_STEP,i); //COLLISION collision = new EventNode(MainEvent.EV_COLLISION); root.add(collision); //KEYBOARD EventNode keyboard = new EventNode(MainEvent.EV_KEYBOARD); root.add(keyboard); keyboard.add(MainEvent.EV_KEYBOARD,Event.EV_NO_KEY); keyboard.add(MainEvent.EV_KEYBOARD,Event.EV_ANY_KEY); keyboard.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_LEFT); keyboard.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_RIGHT); keyboard.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_UP); keyboard.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_DOWN); keyboard.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_CONTROL); keyboard.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_ALT); keyboard.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_SHIFT); keyboard.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_SPACE); keyboard.add(MainEvent.EV_KEYBOARD,Event.EV_ENTER_KEY); EventNode subkey; subkey = new EventNode(Messages.getString("EventPanel.KEYPAD"),MainEvent.EV_KEYBOARD,0); //$NON-NLS-1$ keyboard.add(subkey); for (int i = KeyEvent.VK_NUMPAD0; i <= KeyEvent.VK_NUMPAD9; i++) subkey.add(MainEvent.EV_KEYBOARD,i); subkey.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_DIVIDE); subkey.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_MULTIPLY); subkey.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_SUBTRACT); subkey.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_ADD); subkey.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_DECIMAL); subkey = new EventNode(Messages.getString("EventPanel.DIGITS"),MainEvent.EV_KEYBOARD,0); //$NON-NLS-1$ keyboard.add(subkey); for (int i = KeyEvent.VK_0; i <= KeyEvent.VK_9; i++) subkey.add(MainEvent.EV_KEYBOARD,i); subkey = new EventNode(Messages.getString("EventPanel.LETTERS"),MainEvent.EV_KEYBOARD,0); //$NON-NLS-1$ keyboard.add(subkey); for (int i = KeyEvent.VK_A; i <= KeyEvent.VK_Z; i++) subkey.add(MainEvent.EV_KEYBOARD,i); subkey = new EventNode(Messages.getString("EventPanel.FUNCTION_KEYS"),MainEvent.EV_KEYBOARD,0); //$NON-NLS-1$ keyboard.add(subkey); for (int i = KeyEvent.VK_F1; i <= KeyEvent.VK_F12; i++) subkey.add(MainEvent.EV_KEYBOARD,i); subkey = new EventNode(Messages.getString("EventPanel.OTHERS"),MainEvent.EV_KEYBOARD,0); //$NON-NLS-1$ keyboard.add(subkey); subkey.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_BACK_SPACE); subkey.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_ESCAPE); subkey.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_HOME); subkey.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_END); subkey.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_PAGE_UP); subkey.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_PAGE_DOWN); subkey.add(MainEvent.EV_KEYBOARD,Event.EV_DELETE_KEY); subkey.add(MainEvent.EV_KEYBOARD,Event.EV_INSERT_KEY); //MOUSE EventNode mouse = new EventNode(MainEvent.EV_MOUSE); root.add(mouse); for (int i = Event.EV_LEFT_BUTTON; i <= Event.EV_MOUSE_LEAVE; i++) mouse.add(MainEvent.EV_MOUSE,i); for (int i = Event.EV_MOUSE_WHEEL_UP; i <= Event.EV_MOUSE_WHEEL_DOWN; i++) mouse.add(MainEvent.EV_MOUSE,i); EventNode submouse; submouse = new EventNode(Messages.getString("EventPanel.GLOBAL_MOUSE"),MainEvent.EV_MOUSE,0); //$NON-NLS-1$ mouse.add(submouse); for (int i = Event.EV_GLOBAL_LEFT_BUTTON; i <= Event.EV_GLOBAL_MIDDLE_RELEASE; i++) submouse.add(MainEvent.EV_MOUSE,i); submouse = new EventNode(Messages.getString("EventPanel.JOYSTICK_1"),MainEvent.EV_MOUSE,0); //$NON-NLS-1$ mouse.add(submouse); for (int i = Event.EV_JOYSTICK1_LEFT; i <= Event.EV_JOYSTICK1_BUTTON8; i++) if (i != 20) submouse.add(MainEvent.EV_MOUSE,i); submouse = new EventNode(Messages.getString("EventPanel.JOYSTICK_2"),MainEvent.EV_MOUSE,0); //$NON-NLS-1$ mouse.add(submouse); for (int i = Event.EV_JOYSTICK2_LEFT; i <= Event.EV_JOYSTICK2_BUTTON8; i++) if (i != 35) submouse.add(MainEvent.EV_MOUSE,i); //OTHER EventNode other = new EventNode(MainEvent.EV_OTHER); root.add(other); for (int i = Event.EV_OUTSIDE; i <= Event.EV_NO_MORE_HEALTH; i++) other.add(MainEvent.EV_OTHER,i); other.add(MainEvent.EV_OTHER,Event.EV_CLOSEWINDOW); EventNode user = new EventNode( Messages.getString("EventPanel.USER_DEFINED"),MainEvent.EV_OTHER,0); //$NON-NLS-1$ other.add(user); for (int i = 0; i <= 15; i++) { user.add(new EventNode( Messages.format("Event.EVENT7_X",i),MainEvent.EV_OTHER,Event.EV_USER0 + i)); //$NON-NLS-1$ } EventNode outside = new EventNode( Messages.getString("EventPanel.OUTSIDE_VIEW"),MainEvent.EV_OTHER,0); //$NON-NLS-1$ other.add(outside); for (int i = 0; i <= 7; i++) { outside.add(new EventNode( Messages.format("Event.EVENT7_40X",i),MainEvent.EV_OTHER,Event.EV_OUTSIDEVIEW0 + i)); //$NON-NLS-1$ } EventNode boundary = new EventNode( Messages.getString("EventPanel.BOUNDARY_VIEW"),MainEvent.EV_OTHER,0); //$NON-NLS-1$ other.add(boundary); for (int i = 0; i <= 7; i++) { boundary.add(new EventNode( Messages.format("Event.EVENT7_50X",i),MainEvent.EV_OTHER,Event.EV_BOUNDARYVIEW0 + i)); //$NON-NLS-1$ } EventNode asynchronous = new EventNode( Messages.getString("EventPanel.ASYNCHRONOUS"),MainEvent.EV_OTHER,0); //$NON-NLS-1$ other.add(asynchronous); asynchronous.add(MainEvent.EV_OTHER,Event.EV_IMAGELOADED); asynchronous.add(MainEvent.EV_OTHER,Event.EV_SOUNDLOADED); asynchronous.add(MainEvent.EV_OTHER,Event.EV_HTTP); asynchronous.add(MainEvent.EV_OTHER,Event.EV_DIALOG); asynchronous.add(MainEvent.EV_OTHER,Event.EV_IAP); asynchronous.add(MainEvent.EV_OTHER,Event.EV_CLOUD); asynchronous.add(MainEvent.EV_OTHER,Event.EV_NETWORKING); asynchronous.add(MainEvent.EV_OTHER,Event.EV_STEAM); asynchronous.add(MainEvent.EV_OTHER,Event.EV_SOCIAL); //DRAW EventNode drawev = new EventNode(MainEvent.EV_DRAW); root.add(drawev); drawev.add(MainEvent.EV_DRAW,Event.EV_DRAW_NORMAL); drawev.add(MainEvent.EV_DRAW,Event.EV_DRAW_GUI); drawev.add(MainEvent.EV_DRAW,Event.EV_DRAW_RESIZE); //KEYPRESS EventNode keypress = new EventNode(MainEvent.EV_KEYPRESS); root.add(keypress); keypress.add(MainEvent.EV_KEYPRESS,Event.EV_NO_KEY); keypress.add(MainEvent.EV_KEYPRESS,Event.EV_ANY_KEY); keypress.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_LEFT); keypress.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_RIGHT); keypress.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_UP); keypress.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_DOWN); keypress.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_CONTROL); keypress.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_ALT); keypress.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_SHIFT); keypress.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_SPACE); keypress.add(MainEvent.EV_KEYPRESS,Event.EV_ENTER_KEY); subkey = new EventNode(Messages.getString("EventPanel.KEYPAD"),MainEvent.EV_KEYPRESS,0); //$NON-NLS-1$ keypress.add(subkey); for (int i = KeyEvent.VK_NUMPAD0; i <= KeyEvent.VK_NUMPAD9; i++) subkey.add(MainEvent.EV_KEYPRESS,i); subkey.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_DIVIDE); subkey.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_MULTIPLY); subkey.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_SUBTRACT); subkey.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_ADD); subkey.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_DECIMAL); subkey = new EventNode(Messages.getString("EventPanel.DIGITS"),MainEvent.EV_KEYPRESS,0); //$NON-NLS-1$ keypress.add(subkey); for (int i = KeyEvent.VK_0; i <= KeyEvent.VK_9; i++) subkey.add(MainEvent.EV_KEYPRESS,i); subkey = new EventNode(Messages.getString("EventPanel.LETTERS"),MainEvent.EV_KEYPRESS,0); //$NON-NLS-1$ keypress.add(subkey); for (int i = KeyEvent.VK_A; i <= KeyEvent.VK_Z; i++) subkey.add(MainEvent.EV_KEYPRESS,i); subkey = new EventNode(Messages.getString("EventPanel.FUNCTION_KEYS"),MainEvent.EV_KEYPRESS,0); //$NON-NLS-1$ keypress.add(subkey); for (int i = KeyEvent.VK_F1; i <= KeyEvent.VK_F12; i++) subkey.add(MainEvent.EV_KEYPRESS,i); subkey = new EventNode(Messages.getString("EventPanel.OTHERS"),MainEvent.EV_KEYPRESS,0); //$NON-NLS-1$ keypress.add(subkey); subkey.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_BACK_SPACE); subkey.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_ESCAPE); subkey.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_HOME); subkey.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_END); subkey.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_PAGE_UP); subkey.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_PAGE_DOWN); subkey.add(MainEvent.EV_KEYPRESS,Event.EV_DELETE_KEY); subkey.add(MainEvent.EV_KEYPRESS,Event.EV_INSERT_KEY); //KEYRELEASE EventNode keyrelase = new EventNode(MainEvent.EV_KEYRELEASE); root.add(keyrelase); keyrelase.add(MainEvent.EV_KEYRELEASE,Event.EV_NO_KEY); keyrelase.add(MainEvent.EV_KEYRELEASE,Event.EV_ANY_KEY); keyrelase.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_LEFT); keyrelase.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_RIGHT); keyrelase.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_UP); keyrelase.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_DOWN); keyrelase.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_CONTROL); keyrelase.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_ALT); keyrelase.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_SHIFT); keyrelase.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_SPACE); keyrelase.add(MainEvent.EV_KEYRELEASE,Event.EV_ENTER_KEY); subkey = new EventNode(Messages.getString("EventPanel.KEYPAD"),MainEvent.EV_KEYRELEASE,0); //$NON-NLS-1$ keyrelase.add(subkey); for (int i = KeyEvent.VK_NUMPAD0; i <= KeyEvent.VK_NUMPAD9; i++) subkey.add(MainEvent.EV_KEYRELEASE,i); subkey.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_DIVIDE); subkey.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_MULTIPLY); subkey.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_SUBTRACT); subkey.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_ADD); subkey.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_DECIMAL); subkey = new EventNode(Messages.getString("EventPanel.DIGITS"),MainEvent.EV_KEYRELEASE,0); //$NON-NLS-1$ keyrelase.add(subkey); for (int i = KeyEvent.VK_0; i <= KeyEvent.VK_9; i++) subkey.add(MainEvent.EV_KEYRELEASE,i); subkey = new EventNode(Messages.getString("EventPanel.LETTERS"),MainEvent.EV_KEYRELEASE,0); //$NON-NLS-1$ keyrelase.add(subkey); for (int i = KeyEvent.VK_A; i <= KeyEvent.VK_Z; i++) subkey.add(MainEvent.EV_KEYRELEASE,i); subkey = new EventNode(Messages.getString("EventPanel.FUNCTION_KEYS"),MainEvent.EV_KEYRELEASE,0); //$NON-NLS-1$ keyrelase.add(subkey); for (int i = KeyEvent.VK_F1; i <= KeyEvent.VK_F12; i++) subkey.add(MainEvent.EV_KEYRELEASE,i); subkey = new EventNode(Messages.getString("EventPanel.OTHERS"),MainEvent.EV_KEYRELEASE,0); //$NON-NLS-1$ keyrelase.add(subkey); subkey.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_BACK_SPACE); subkey.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_ESCAPE); subkey.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_HOME); subkey.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_END); subkey.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_PAGE_UP); subkey.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_PAGE_DOWN); subkey.add(MainEvent.EV_KEYRELEASE,Event.EV_DELETE_KEY); subkey.add(MainEvent.EV_KEYRELEASE,Event.EV_INSERT_KEY); events = new JTree(root); events.setCellRenderer(new EventNodeRenderer()); events.setRootVisible(false); events.setShowsRootHandles(true); events.setDragEnabled(true); events.setTransferHandler(new EventNodeTransferHandler()); events.addTreeSelectionListener(this); events.setScrollsOnExpand(true); events.addMouseListener(mListener); return events; } public void populate_collision_node() { collision.removeAllChildren(); if (Prefs.groupKind) { for (int i = 0; i < LGM.root.getChildCount(); i++) { ResNode group = (ResNode) LGM.root.getChildAt(i); if (group.kind != GmObject.class) continue; populate_object_nodes(collision,group); return; } } populate_object_nodes(collision,LGM.root); return; } @SuppressWarnings("unchecked") protected void populate_object_nodes(EventNode parent, ResNode group) { for (int i = 0; i < group.getChildCount(); i++) { ResNode child = (ResNode) group.getChildAt(i); if (child.kind != GmObject.class) continue; if (child.status == ResNode.STATUS_SECONDARY) parent.add(MainEvent.EV_COLLISION,(ResourceReference<GmObject>) child.getRes()); else if (child.status == ResNode.STATUS_GROUP) { EventNode subnode = new EventNode(child.getUserObject().toString(),MainEvent.EV_COLLISION,0); parent.add(subnode); if (child.getChildCount() > 0) populate_object_nodes(subnode,child); } } } public static class EventNodeRenderer extends DefaultTreeCellRenderer { private static final long serialVersionUID = 1L; @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree,value,sel,expanded,leaf,row,hasFocus); int mid = -1; if (value instanceof EventNode) { EventNode en = (EventNode) value; mid = en.mainId; if (mid == MainEvent.EV_COLLISION && ((DefaultMutableTreeNode) en.getParent()).isRoot()) leaf = false; } if (value instanceof EventInstanceNode) mid = ((EventInstanceNode) value).getUserObject().mainId; if (value instanceof EventGroupNode) mid = ((EventGroupNode) value).mainId; Icon i = LGM.getIconForKey("EventNode." + (leaf ? "EVENT" : "GROUP") + mid); if (i != null && i.getIconWidth() != -1) setIcon(i); return this; } } private class EventNodeTransferHandler extends TransferHandler { private static final long serialVersionUID = 1L; public EventNodeTransferHandler() { super(); } @Override protected Transferable createTransferable(JComponent c) { EventNode n = (EventNode) ((JTree) c).getLastSelectedPathComponent(); if (!n.isLeaf()) return null; return n; } @Override public int getSourceActions(JComponent c) { return COPY; } @Override public boolean canImport(TransferHandler.TransferSupport support) { return false; } } private class MListener extends MouseAdapter { @Override public void mouseReleased(MouseEvent e) { if (e.getSource() != events) return; int button = e.getButton(); int clicks = e.getClickCount(); if (button == MouseEvent.BUTTON1 || button == MouseEvent.BUTTON3) { TreePath path = events.getPathForLocation(e.getX(),e.getY()); if (path == null) return; events.setSelectionPath(path); if (events.isExpanded(path)) events.collapsePath(path); else events.expandPath(path); EventNode n = (EventNode) path.getLastPathComponent(); if (n == null) return; boolean added = (button == MouseEvent.BUTTON1 && clicks == 2) || (button == MouseEvent.BUTTON3 && clicks == 1); GmObjectFrame f = linkedFrame == null ? null : linkedFrame.get(); if (added && n.isLeaf() && f != null && n.isValid()) { f.functionEvent(n.mainId,n.eventId,n.other,null); f.toTop(); if (!stayOpen.isSelected() ^ e.isControlDown()) LGM.hideEventPanel(); } } } } @SuppressWarnings("unchecked") public void actionPerformed(ActionEvent e) { if (e.getSource() == linkSelect) { GmObject obj = deRef(((ResourceMenu<GmObject>) e.getSource()).getSelected()); if (obj != null) { ResNode node = obj.getNode(); GmObjectFrame f = (GmObjectFrame) node.frame; linkedFrame = new WeakReference<GmObjectFrame>(f); f.toTop(); } else linkedFrame = null; return; } } @Override public void setVisible(boolean b) { if (b == isVisible()) return; //workaround for java bug 4782243 if (((BasicToolBarUI) getUI()).isFloating()) { Container c = this, p = c.getParent(); while (p != null && p != LGM.frame && p != LGM.contents) { c = p; p = c.getParent(); } if (c != this) c.setVisible(b); } super.setVisible(b); LGM.eventButton.setSelected(b); } public void valueChanged(TreeSelectionEvent e) { selectedNode = (EventNode) e.getPath().getLastPathComponent(); //populate_collision_node(); } @SuppressWarnings("unchecked") public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals(MDIPane.SELECTED_FRAME_PROPERTY)) { JInternalFrame newFrame = (JInternalFrame) evt.getNewValue(); JInternalFrame oldFrame = (JInternalFrame) evt.getOldValue(); if (newFrame instanceof GmObjectFrame) { GmObjectFrame f = (GmObjectFrame) newFrame; linkedFrame = new WeakReference<GmObjectFrame>(f); linkSelect.setSelected((ResourceReference<GmObject>) f.node.getRes()); } else { if (newFrame == null && !oldFrame.isVisible()) linkSelect.setSelected(null); } } } public void updated(UpdateEvent e) { populate_collision_node(); events.updateUI(); } public void reload() { LGM.mdi.addPropertyChangeListener(MDIPane.SELECTED_FRAME_PROPERTY,this); LGM.root.updateSource.addListener(this); populate_collision_node(); events.updateUI(); } }