Ignore:
Timestamp:
12/16/13 12:01:14 (11 years ago)
Author:
jts21
Message:

Make widgets pass F-keys on to Expeditee, and fix Widget resizing so they redraw correctly after resizing

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/expeditee/items/widgets/InteractiveWidget.java

    r573 r626  
    88import java.awt.Point;
    99import java.awt.Rectangle;
     10import java.awt.event.ContainerEvent;
     11import java.awt.event.ContainerListener;
     12import java.awt.event.KeyEvent;
     13import java.awt.event.KeyListener;
    1014import java.awt.event.MouseEvent;
    1115import java.lang.reflect.Constructor;
    1216import java.util.ArrayList;
     17import java.util.Arrays;
    1318import java.util.Collection;
    1419import java.util.Collections;
     
    2530import org.expeditee.gui.FrameGraphics;
    2631import org.expeditee.gui.FrameIO;
     32import org.expeditee.gui.FrameKeyboardActions;
    2733import org.expeditee.gui.FreeItems;
    2834import org.expeditee.gui.MouseEventRouter;
     
    3945 *
    4046 */
    41 public abstract class InteractiveWidget {
     47public abstract class InteractiveWidget implements ContainerListener, KeyListener {
    4248
    4349        protected JComponent _swingComponent;
     
    431437
    432438                _swingComponent = component;
     439                _swingComponent.addContainerListener(this);
     440                keyListenerToChildren(_swingComponent, true);
     441               
    433442                _textRepresentation = source;
    434443
     
    17491758        }
    17501759       
     1760        /**
     1761         * Makes sure we add our KeyListener to every child component,
     1762         * since it seems that's the only way to make sure we capture key events in Java
     1763         * (without using KeyBindings which seem to only support the keyTyped event)
     1764         */
     1765        @Override
     1766        public void componentAdded(ContainerEvent e) {
     1767                if(e == null || e.getChild() == null) {
     1768                        return;
     1769                }
     1770                keyListenerToChildren(e.getChild(), true);
     1771        }
     1772       
     1773        @Override
     1774        public void componentRemoved(ContainerEvent e) {
     1775                if(e == null || e.getChild() == null) {
     1776                        return;
     1777                }
     1778                keyListenerToChildren(e.getChild(), false);
     1779        }
     1780       
     1781        @Override
     1782    public void keyTyped(KeyEvent e) {
     1783               
     1784                int keyCode = e.getKeyCode();
     1785       
     1786        if (keyCode >= KeyEvent.VK_F1 && keyCode <= KeyEvent.VK_F12) {
     1787                FrameKeyboardActions.getInstance().keyTyped(e);
     1788        }
     1789    }
     1790
     1791        @Override
     1792    public void keyPressed(KeyEvent e) {
     1793        int keyCode = e.getKeyCode();
     1794       
     1795        if (keyCode >= KeyEvent.VK_F1 && keyCode <= KeyEvent.VK_F12) {
     1796                FrameKeyboardActions.getInstance().keyPressed(e);
     1797        }
     1798    }
     1799   
     1800        @Override
     1801    public void keyReleased(KeyEvent e) {
     1802                int keyCode = e.getKeyCode();
     1803       
     1804        if (keyCode >= KeyEvent.VK_F1 && keyCode <= KeyEvent.VK_F12) {
     1805                FrameKeyboardActions.getInstance().keyReleased(e);
     1806        }
     1807    }
     1808       
     1809        private void keyListenerToChildren(Component parent, boolean add) {
     1810                List<Component> components = new LinkedList<Component>();
     1811                components.add(parent);
     1812                while(!components.isEmpty()) {
     1813                        Component c = components.remove(0);
     1814                        if(c instanceof Container) {
     1815                                components.addAll(Arrays.asList(((Container)c).getComponents()));
     1816                        }
     1817                        if(add && !Arrays.asList(c.getKeyListeners()).contains(this)) {
     1818                                c.addKeyListener(this);
     1819                        } else if (!add && Arrays.asList(c.getKeyListeners()).contains(this)) {
     1820                                c.removeKeyListener(this);
     1821                }
     1822                }
     1823        }
     1824       
     1825        public void onResized() {
     1826                invalidateSelf();
     1827        onBoundsChanged();
     1828        layout(_swingComponent);
     1829        }
     1830       
    17511831}
Note: See TracChangeset for help on using the changeset viewer.