001: package org.osbl.client.wings.form.layouter;
002:
003: import org.wings.*;
004: import org.wingx.XCalendar;
005: import org.wingx.XSuggest;
006: import org.osbl.client.wings.XButton;
007:
008: import javax.swing.event.EventListenerList;
009: import java.util.*;
010:
011: public abstract class AbstractLayouter implements Layouter {
012: EventListenerList listenerList = new EventListenerList();
013: List<SComponent> components = new ArrayList<SComponent>();
014: List<SComponent> focusableComponents = new ArrayList<SComponent>();
015:
016: public static final List<Class> FOCUSABLE_COMPONENT_CLASSES = Arrays
017: .asList(new Class[] { STextField.class,
018: SFormattedTextField.class, SPasswordField.class,
019: STextArea.class, SComboBox.class, SCheckBox.class,
020: XCalendar.class, XSuggest.class, XButton.class, });
021: private int focusTraversalIndex;
022:
023: public List<SComponent> getFocusableComponents() {
024: return focusableComponents;
025: }
026:
027: public List<SComponent> getVisibles() {
028: List<SComponent> visibles = new ArrayList<SComponent>(
029: components.size());
030: for (SComponent component : components) {
031: if (component.isRecursivelyVisible())
032: visibles.add(component);
033: }
034: return visibles;
035: }
036:
037: public List<SComponent> getInvisibles() {
038: List<SComponent> invisibles = new ArrayList<SComponent>(
039: components.size());
040: for (SComponent component : components) {
041: if (!component.isRecursivelyVisible())
042: invisibles.add(component);
043: }
044: return invisibles;
045: }
046:
047: public void addVisibilityListener(VisibilityListener listener) {
048: listenerList.add(VisibilityListener.class, listener);
049: }
050:
051: public void removeVisibilityListener(VisibilityListener listener) {
052: listenerList.remove(VisibilityListener.class, listener);
053: }
054:
055: protected void fireVisibilityEvent() {
056: VisibilityEvent event = null;
057: Object[] listeners = listenerList.getListenerList();
058: for (int i = listeners.length - 2; i >= 0; i -= 2) {
059: if (event == null)
060: event = new VisibilityEvent(this , getVisibles(),
061: getInvisibles());
062: ((VisibilityListener) listeners[i + 1])
063: .visibilityChanged(event);
064: }
065: }
066:
067: protected void collectComponents(SContainer container) {
068: focusTraversalIndex = 0;
069: collect(container);
070: }
071:
072: private void collect(SContainer container) {
073: int count = container.getComponentCount();
074: for (int i = 0; i < count; i++) {
075: SComponent component = container.getComponent(i);
076: if (component.getClientProperty("instruction") != null)
077: components.add(component);
078:
079: if (component instanceof SContainer)
080: collect((SContainer) component);
081:
082: if (AbstractLayouter.FOCUSABLE_COMPONENT_CLASSES
083: .contains(component.getClass())) {
084: component.setFocusTraversalIndex(++focusTraversalIndex);
085: focusableComponents.add(component);
086: }
087: }
088: }
089:
090: public void setApplicability(Instruction instruction,
091: boolean applicable) {
092: for (SComponent component : components) {
093: Object current = component.getClientProperty("instruction");
094: if (current == instruction) {
095: if (instruction instanceof Page)
096: setApplicability((Page) instruction, component,
097: applicable);
098: else if (instruction instanceof Division)
099: setApplicability((Division) instruction, component,
100: applicable);
101: }
102: }
103: }
104:
105: protected abstract void setApplicability(Page page,
106: SComponent component, boolean applicable);
107:
108: protected abstract void setApplicability(Division division,
109: SComponent component, boolean applicable);
110: }
|