001    /*
002     * Copyright 2006 Google Inc.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     * 
008     * http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package com.google.gwt.user.client.ui;
017    
018    import com.google.gwt.core.client.GWT;
019    import com.google.gwt.user.client.DOM;
020    import com.google.gwt.user.client.Event;
021    import com.google.gwt.user.client.ui.impl.FocusImpl;
022    
023    /**
024     * A simple panel that makes its contents focusable, and adds the ability to
025     * catch mouse and keyboard events.
026     */
027    public class FocusPanel extends SimplePanel implements HasFocus,
028        SourcesClickEvents, SourcesMouseEvents {
029    
030      static FocusImpl impl = (FocusImpl) GWT.create(FocusImpl.class);
031    
032      private ClickListenerCollection clickListeners;
033      private FocusListenerCollection focusListeners;
034      private KeyboardListenerCollection keyboardListeners;
035      private MouseListenerCollection mouseListeners;
036    
037      public FocusPanel() {
038        super(impl.createFocusable());
039        sinkEvents(Event.FOCUSEVENTS | Event.KEYEVENTS | Event.ONCLICK
040          | Event.MOUSEEVENTS);
041      }
042    
043      public FocusPanel(Widget child) {
044        this();
045        add(child);
046      }
047    
048      public void addClickListener(ClickListener listener) {
049        if (clickListeners == null)
050          clickListeners = new ClickListenerCollection();
051        clickListeners.add(listener);
052      }
053    
054      public void addFocusListener(FocusListener listener) {
055        if (focusListeners == null)
056          focusListeners = new FocusListenerCollection();
057        focusListeners.add(listener);
058      }
059    
060      public void addKeyboardListener(KeyboardListener listener) {
061        if (keyboardListeners == null)
062          keyboardListeners = new KeyboardListenerCollection();
063        keyboardListeners.add(listener);
064      }
065    
066      public void addMouseListener(MouseListener listener) {
067        if (mouseListeners == null)
068          mouseListeners = new MouseListenerCollection();
069        mouseListeners.add(listener);
070      }
071    
072      public int getTabIndex() {
073        return impl.getTabIndex(getElement());
074      }
075    
076      public void onBrowserEvent(Event event) {
077        switch (DOM.eventGetType(event)) {
078          case Event.ONCLICK:
079            if (clickListeners != null)
080              clickListeners.fireClick(this);
081            break;
082    
083          case Event.ONMOUSEDOWN:
084          case Event.ONMOUSEUP:
085          case Event.ONMOUSEMOVE:
086          case Event.ONMOUSEOVER:
087          case Event.ONMOUSEOUT:
088            if (mouseListeners != null)
089              mouseListeners.fireMouseEvent(this, event);
090            break;
091    
092          case Event.ONBLUR:
093          case Event.ONFOCUS:
094            if (focusListeners != null)
095              focusListeners.fireFocusEvent(this, event);
096            break;
097    
098          case Event.ONKEYDOWN:
099          case Event.ONKEYUP:
100          case Event.ONKEYPRESS:
101            if (keyboardListeners != null)
102              keyboardListeners.fireKeyboardEvent(this, event);
103            break;
104        }
105      }
106    
107      public void removeClickListener(ClickListener listener) {
108        if (clickListeners != null)
109          clickListeners.remove(listener);
110      }
111    
112      public void removeFocusListener(FocusListener listener) {
113        if (focusListeners != null)
114          focusListeners.remove(listener);
115      }
116    
117      public void removeKeyboardListener(KeyboardListener listener) {
118        if (keyboardListeners != null)
119          keyboardListeners.remove(listener);
120      }
121    
122      public void removeMouseListener(MouseListener listener) {
123        if (mouseListeners != null)
124          mouseListeners.remove(listener);
125      }
126    
127      public void setAccessKey(char key) {
128        impl.setAccessKey(getElement(), key);
129      }
130    
131      public void setFocus(boolean focused) {
132        if (focused)
133          impl.focus(getElement());
134        else
135          impl.blur(getElement());
136      }
137    
138      public void setTabIndex(int index) {
139        impl.setTabIndex(getElement(), index);
140      }
141    }