package org.gnue.forms; import javax.swing.JPanel; import javax.swing.JLabel; import java.awt.GridLayout; import java.awt.BorderLayout; import java.awt.Component; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; import java.util.Vector; import java.util.Enumeration; public class PageController extends JPanel implements DirectionKind, ContainerController { protected org.gnue.forms.Object model; protected Controller parent; private Vector blocks; public PageController() { super(new GridLayout(0, 1)); System.out.println("PageController::PageController()"); blocks = new Vector(); addPropertyChangeListener(new ModelObserver()); } public Enumeration blocks() { return blocks.elements(); } public void addBlock(BlockController block) { blocks.addElement(block); add(block); invalidate(); } public void removeBlock(BlockController block) { blocks.removeElement(block); remove(block); invalidate(); } // ContainerController methods public org.gnue.forms.Object getModel() { return model; } public void setModel(org.gnue.forms.Object model) { System.out.println("PageController->setModel()"); org.gnue.forms.Object oldModel = this.model; this.model = model; firePropertyChange(modelProperty, oldModel, model); } public Controller getParentController() { return parent; } public void transferFocus(int dir) { try { ViewFrame frame = (ViewFrame)getParentController(); Form form = (Form)frame.getModel(); Page[] pages = form.pages(); for (int i = 0; i < pages.length; i++) { if (pages[i] == this.model) { PageController controller = new PageController(); controller.setModel(dir == 0 ? pages[++i] : pages[--i]); frame.getContentPane().add((Component)controller, BorderLayout.CENTER); break; } } } catch (Exception exc) { System.err.println(exc); } } public Controller[] getTraversibleComponents() { return (Controller[])blocks.toArray(new BlockController[1]); } public class ModelObserver implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent event) { System.out.println("PageController::ModelObserver->propertyChange()"); if (event.getPropertyName().equals(modelProperty)) { Page model = (Page)event.getNewValue(); Block[] blocks = model.blocks(); // remove any existing blocks Enumeration enum = PageController.this.blocks(); while(enum.hasMoreElements()) { BlockController block = (BlockController)enum.nextElement(); PageController.this.removeBlock(block); } for (int i = 0; i < blocks.length; i++) { BlockController controller = new BlockController(); controller.setModel(blocks[i]); PageController.this.addBlock(controller); } } } } }