001: /*
002: * Copyright (C) 2005 Jeff Tassin
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2.1 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018:
019: package com.jeta.swingbuilder.gui.focus;
020:
021: import java.awt.Component;
022: import java.awt.Point;
023: import java.awt.event.ActionEvent;
024: import java.awt.event.ActionListener;
025: import java.util.ArrayList;
026:
027: import javax.swing.SwingUtilities;
028:
029: import com.jeta.forms.gui.focus.FormFocusManager;
030: import com.jeta.forms.gui.form.FormComponent;
031: import com.jeta.forms.gui.form.GridViewEvent;
032: import com.jeta.forms.gui.form.GridViewListener;
033: import com.jeta.forms.store.memento.FocusPolicyMemento;
034: import com.jeta.open.gui.framework.JETAPanel;
035:
036: /**
037: * This component renders the focus order icons over the Form.
038: *
039: * @author Jeff Tassin
040: */
041: public class FocusView extends JETAPanel implements GridViewListener {
042: /**
043: * The view associated with this overlay
044: */
045: private FormComponent m_form;
046:
047: /**
048: * A common listener for all focus boxes
049: */
050: private FocusBoxListener m_focus_box_listener = new FocusBoxListener();
051:
052: private Runnable m_swing_updater = new Runnable() {
053: public void run() {
054: showFocusBoxes();
055: }
056: };
057:
058: /** ctor */
059: public FocusView(FormComponent form) {
060: m_form = form;
061: setOpaque(false);
062: setLayout(null);
063: showFocusBoxes();
064:
065: }
066:
067: /**
068: * Shows the focus boxes on the view
069: */
070: public void showFocusBoxes() {
071: removeAll();
072: FormFocusManager focus_mgr = new FormFocusManager(m_form);
073: int comp_count = focus_mgr.getComponentCount();
074: for (int index = 0; index < comp_count; index++) {
075: Component comp = focus_mgr.getComponent(index);
076: if (comp != null) {
077: Point pt = SwingUtilities.convertPoint(comp, 0, 0,
078: m_form);
079: FocusBox fbox = new FocusBox(index + 1, comp_count,
080: comp);
081: fbox.addActionListener(m_focus_box_listener);
082: fbox.setLocation(pt.x, pt.y);
083: fbox.setSize(fbox.getPreferredSize());
084: add(fbox);
085: }
086: }
087: revalidate();
088: repaint();
089: }
090:
091: /**
092: * This method makes sure an ArrayList has at least sz elements. This
093: * guarantees that a call to list.size() will be valid for sz elements.
094: *
095: * @param list
096: * the list to add elements to
097: * @param sz
098: * the size to ensure
099: */
100: public static void ensureSize(ArrayList list, int sz) {
101: if (list == null) {
102: assert (false);
103: return;
104: }
105:
106: if (sz <= list.size())
107: return;
108:
109: int old_size = list.size();
110: for (int index = 0; index < (sz - old_size); index++) {
111: list.add(null);
112: }
113: }
114:
115: /**
116: * @return the focus policy memento that represents the current focus
117: * ordering for this manager
118: */
119: public FocusPolicyMemento getFocusPolicyMemento() {
120: ArrayList focus_order = new ArrayList();
121:
122: for (int index = 0; index < getComponentCount(); index++) {
123: FocusBox fbox = (FocusBox) getComponent(index);
124: int focus_index = fbox.getFocusIndex() - 1;
125: ensureSize(focus_order, focus_index + 1);
126: Component comp = (Component) focus_order.get(focus_index);
127: if (comp == null) {
128: focus_order.set(focus_index, fbox.getComponent());
129: } else {
130: assert (false);
131: focus_order.add(focus_index, fbox.getComponent());
132: }
133: }
134:
135: FormFocusManager fmgr = new FormFocusManager(m_form,
136: focus_order);
137: return fmgr.getFocusPolicyMemento();
138: }
139:
140: /** GridViewListener implementation */
141: public void gridChanged(GridViewEvent evt) {
142: if (evt.getId() != GridViewEvent.EDIT_COMPONENT
143: && evt.getId() != GridViewEvent.CELL_SELECTED) {
144: SwingUtilities.invokeLater(m_swing_updater);
145: }
146: }
147:
148: public class FocusBoxListener implements ActionListener {
149: private boolean m_silent = false;
150:
151: public void actionPerformed(ActionEvent evt) {
152: if (isSilent())
153: return;
154:
155: FocusBox fbox = (FocusBox) evt.getSource();
156: if (FocusBox.FOCUS_BOX_ACTIVATED.equals(evt
157: .getActionCommand())) {
158: for (int index = 0; index < getComponentCount(); index++) {
159: Component child = getComponent(index);
160: if (child != fbox) {
161: ((FocusBox) child).deactivateSpinner();
162: }
163: }
164: } else if (FocusBox.FOCUS_INDEX_CHANGED.equals(evt
165: .getActionCommand())) {
166: try {
167: setSilent(true);
168: int new_idx = fbox.getSpinnerValue();
169: int old_idx = fbox.getFocusIndex();
170: for (int index = 0; index < getComponentCount(); index++) {
171: FocusBox child = (FocusBox) getComponent(index);
172: if (child.getFocusIndex() == new_idx) {
173: assert (child != fbox);
174: child.setFocusIndex(old_idx);
175: break;
176: }
177: }
178: fbox.setFocusIndex(new_idx);
179: } catch (Exception e) {
180: e.printStackTrace();
181: } finally {
182: setSilent(false);
183: }
184: }
185: }
186:
187: boolean isSilent() {
188: return m_silent;
189: }
190:
191: void setSilent(boolean silent) {
192: m_silent = silent;
193: }
194: }
195:
196: }
|