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 }