/* * 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.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; 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.BoxLayout; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.TransferHandler; import javax.swing.event.InternalFrameEvent; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreePath; 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.MDIFrame; 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.Resource; 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 EventFrame extends MDIFrame 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 JPanel keySelectPanel; public ResourceMenu<GmObject> collisionSelect; public JPanel collisionSelectPanel; public JPanel emptyPanel; public ResourceMenu<GmObject> linkSelect; public WeakReference<GmObjectFrame> linkedFrame; public JButton okButton; private MListener mListener = new MListener(); public EventNode root; public JTree events; public EventNode selectedNode; public JPopupMenu eventMenu; public EventNode collision; protected static final ImageIcon GROUP_ICO = LGM.getIconForKey("GmTreeGraphics.GROUP"); //$NON-NLS-1$; public EventFrame() { super(Messages.getString("EventFrame.TITLE"),true,true,true,true); //$NON-NLS-1$ setSize(250,355); setDefaultCloseOperation(JInternalFrame.HIDE_ON_CLOSE); setFrameIcon(LGM.getIconForKey("LGM.TOGGLE_EVENT")); //$NON-NLS-1$ setMinimumSize(new Dimension(250,355)); setLayout(new BoxLayout(getContentPane(),BoxLayout.Y_AXIS)); JPanel side1 = new JPanel(new BorderLayout()); makeTree(side1); JPanel side2Parent = new JPanel(); FlowLayout side2Layout = new FlowLayout(FlowLayout.LEADING); side2Layout.setHgap(12); JPanel side2 = new JPanel(side2Layout); side2Parent.add(side2); side2.setPreferredSize(new Dimension(250,50)); side2.setMaximumSize(new Dimension(250,50)); side2.setMinimumSize(new Dimension(250,50)); JPanel objectFramePanel = new JPanel(new BorderLayout(0,0)); side2.add(objectFramePanel); JLabel windowLabel = new JLabel(Messages.getString("EventFrame.OBJECT_WINDOW")); objectFramePanel.add(windowLabel,BorderLayout.CENTER); //$NON-NLS-1$ linkSelect = new ResourceMenu<GmObject>(Resource.Kind.OBJECT, Messages.getString("EventFrame.NO_LINK"),false,140,true,true); //$NON-NLS-1$ linkSelect.addActionListener(this); objectFramePanel.add(linkSelect,BorderLayout.EAST); JPanel functionPanel = new JPanel(new BorderLayout(8,0)); side2.add(functionPanel); function = new IndexButtonGroup(3,true,false); JRadioButton rad = new JRadioButton(Messages.getString("EventFrame.ADD")); //$NON-NLS-1$ function.add(rad); functionPanel.add(rad,BorderLayout.WEST); rad = new JRadioButton(Messages.getString("EventFrame.REPLACE")); //$NON-NLS-1$ function.add(rad); functionPanel.add(rad,BorderLayout.CENTER); rad = new JRadioButton(Messages.getString("EventFrame.DUPLICATE")); //$NON-NLS-1$ function.add(rad); functionPanel.add(rad,BorderLayout.EAST); function.setValue(FUNCTION_ADD); add(side2Parent); add(side1); LGM.mdi.addPropertyChangeListener(MDIPane.SELECTED_FRAME_PROPERTY,this); LGM.root.updateSource.addListener(this); } private void makeTree(JPanel side1) { 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); populate_collision_node(); //KEYBOARD EventNode keyboard = new EventNode(MainEvent.EV_KEYBOARD); root.add(keyboard); 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,KeyEvent.VK_ENTER); EventNode subkey; subkey = new EventNode(Messages.getString("EventFrame.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("EventFrame.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("EventFrame.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("EventFrame.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("EventFrame.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,KeyEvent.VK_DELETE); subkey.add(MainEvent.EV_KEYBOARD,KeyEvent.VK_INSERT); //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("EventFrame.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("EventFrame.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("EventFrame.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); EventNode user = new EventNode( Messages.getString("EventFrame.USER_DEFINED"),MainEvent.EV_OTHER,0); //$NON-NLS-1$ other.add(user); for (int i = 0; i <= 14; i++) { user.add(new EventNode( Messages.format("Event.EVENT7_X",i),MainEvent.EV_OTHER,Event.EV_USER0 + i)); //$NON-NLS-1$ } //DRAW root.add(MainEvent.EV_DRAW); //KEYPRESS EventNode keypress = new EventNode(MainEvent.EV_KEYPRESS); root.add(keypress); 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,KeyEvent.VK_ENTER); subkey = new EventNode(Messages.getString("EventFrame.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("EventFrame.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("EventFrame.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("EventFrame.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("EventFrame.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,KeyEvent.VK_DELETE); subkey.add(MainEvent.EV_KEYPRESS,KeyEvent.VK_INSERT); //KEYRELEASE EventNode keyrelase = new EventNode(MainEvent.EV_KEYRELEASE); root.add(keyrelase); 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,KeyEvent.VK_ENTER); subkey = new EventNode(Messages.getString("EventFrame.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("EventFrame.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("EventFrame.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("EventFrame.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("EventFrame.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,KeyEvent.VK_DELETE); subkey.add(MainEvent.EV_KEYRELEASE,KeyEvent.VK_INSERT); 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); JScrollPane scroll = new JScrollPane(events); scroll.setMinimumSize(new Dimension(120,260)); side1.add(scroll,BorderLayout.CENTER); } 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 != Resource.Kind.OBJECT) 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 != Resource.Kind.OBJECT) 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; 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(); } protected Transferable createTransferable(JComponent c) { EventNode n = (EventNode) ((JTree) c).getLastSelectedPathComponent(); if (!n.isLeaf()) return null; return n; } public int getSourceActions(JComponent c) { return COPY; } public boolean canImport(TransferHandler.TransferSupport support) { return false; } } private class MListener extends MouseAdapter { 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(); } } } } @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(); if (isVisible()) toTop(); } else linkedFrame = null; return; } } public void fireInternalFrameEvent(int id) { if (id == InternalFrameEvent.INTERNAL_FRAME_ICONIFIED) LGM.mdi.setLayer(getDesktopIcon(),0); super.fireInternalFrameEvent(id); } public void setVisible(boolean b) { super.setVisible(b); if (!b && events != null) for (int m = events.getRowCount() - 1; m >= 0; m--) events.collapseRow(m); } 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(); } }