Author: bpoussin Date: 2010-11-04 16:22:38 +0100 (Thu, 04 Nov 2010) New Revision: 291 Url: http://nuiton.org/repositories/revision/nuiton-widgets/291 Log: second version without listener, that cause probleme and are not necessary for good usage Modified: trunk/src/main/java/org/nuiton/widget/SwingSession.java Modified: trunk/src/main/java/org/nuiton/widget/SwingSession.java =================================================================== --- trunk/src/main/java/org/nuiton/widget/SwingSession.java 2010-11-04 15:08:51 UTC (rev 290) +++ trunk/src/main/java/org/nuiton/widget/SwingSession.java 2010-11-04 15:22:38 UTC (rev 291) @@ -17,8 +17,6 @@ import java.beans.Encoder; import java.beans.ExceptionListener; import java.beans.Expression; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.ByteArrayOutputStream; @@ -31,11 +29,9 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.Enumeration; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Map; -import javax.mail.Session; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; @@ -43,8 +39,6 @@ import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.JTextArea; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; @@ -59,10 +53,15 @@ * <li> javax.swing.JSplitPane (and subclasses) * <li> javax.swing.JTable (and subclasses) * - * You can use: + * usage: + * <li> create SwingSession object + * <li> add component that you want save * <li> explicite call to save - * <li> auto save * + * You can use same SwingSession for multiple window but in this case you must + * have setName for each window with different name, otherwize there are + * collision between window component and result is undetermisitic + * * This code is partialy inspired from http://kenai.com/projects/bsaf/pages/Home * project. This project is under LGPL v2.1 license. We can't reuse directly this * library because to many fields and methods are private and we can't implements @@ -232,20 +231,15 @@ registeredComponent.add(c); walkThrowComponent("", Collections.singleton(c), new RestoreStateAction()); - if (autoSave) { - // register do save if necessary - walkThrowComponent("", Collections.singleton(c), - new RegisterAsListenerAction()); - } } } + /** + * Remove component from component to save + * @param c + */ public void remove(Component c) { registeredComponent.remove(c); - if (autoSave) { - walkThrowComponent("/", Collections.singleton(c), - new UnregisterAsListenerAction()); - } } protected String getComponentName(Component c) { @@ -334,35 +328,10 @@ } } - static public class RegisterAsListenerAction implements Action { - @Override - public void doAction(SwingSession session, String path, Component c) { - State state = session.getStates(path); - if (state == null) { - State manager = session.getStateManager(c.getClass()); - state = manager.getState(c); - session.setStates(path, state); - } - state.addListener(c, state); - } - } - - static public class UnregisterAsListenerAction implements Action { - @Override - public void doAction(SwingSession session, String path, Component c) { - State state = session.getStates(path); - if (state != null) { - state.removeListener(c, state); - } - } - } - /** * get(save) and set(restore) state of object passed in argument */ static public interface State { - public void addListener(Object o, Object l); - public void removeListener(Object o, Object l); public State getState(Object o); public void setState(Object o, State state); } @@ -370,7 +339,7 @@ /** * State for JTabbedPane */ - static public class JTabbedPaneState implements State, ChangeListener { + static public class JTabbedPaneState implements State { protected int selectedIndex = -1; protected int tabCount; @@ -405,29 +374,14 @@ return (JTabbedPane) o; } - @Override - public void addListener(Object o, Object l) { - JTabbedPane p = checkComponent(o); - p.addChangeListener((ChangeListener)l); - } + public State getState(Object o) { + JTabbedPaneState result = new JTabbedPaneState(); - @Override - public void removeListener(Object o, Object l) { JTabbedPane p = checkComponent(o); - p.removeChangeListener((ChangeListener)l); - } + result.setSelectedIndex(p.getSelectedIndex()); + result.setTabCount(p.getTabCount()); - public void updateState(Object o, JTabbedPaneState state) { - JTabbedPane p = checkComponent(o); - state.setSelectedIndex(p.getSelectedIndex()); - state.setTabCount(p.getTabCount()); - } - - @Override - public State getState(Object o) { - JTabbedPaneState result = new JTabbedPaneState(); - updateState(o, result); return result; } @@ -447,19 +401,13 @@ throw new IllegalArgumentException("invalid state"); } } - - @Override - public void stateChanged(ChangeEvent e) { - updateState(e.getSource(), this); - } - } /** * State for JSplit * FIXME add listener for divider move action */ - static public class JSplitPaneState implements State, PropertyChangeListener { + static public class JSplitPaneState implements State { protected int dividerLocation = -1; protected int orientation = JSplitPane.HORIZONTAL_SPLIT; @@ -494,27 +442,13 @@ } @Override - public void addListener(Object o, Object l) { - throw new UnsupportedOperationException("Not supported yet."); - // FIXME poussin 20101104 est ce possible de se mettre listener - // pour recevoir les events de modification de la possition du split ? - } - - @Override - public void removeListener(Object o, Object l) { - throw new UnsupportedOperationException("Not supported yet."); - } - - protected void updateState(Object o, JSplitPaneState state) { + public State getState(Object o) { JSplitPane p = checkComponent(o); - state.setDividerLocation(p.getUI().getDividerLocation(p)); - state.setOrientation(p.getOrientation()); - } - @Override - public State getState(Object o) { JSplitPaneState result = new JSplitPaneState(); - updateState(o, result); + result.setDividerLocation(p.getUI().getDividerLocation(p)); + result.setOrientation(p.getOrientation()); + return result; } @@ -534,19 +468,13 @@ throw new IllegalArgumentException("invalid state"); } } - - @Override - public void propertyChange(PropertyChangeEvent evt) { - throw new UnsupportedOperationException("Not supported yet."); - } - } /** * State for JTable. * TODO add support for column order change */ - static public class JTableState implements State, PropertyChangeListener { + static public class JTableState implements State { protected int[] columnWidths = new int[0]; @@ -576,26 +504,8 @@ } @Override - public void addListener(Object o, Object l) { + public State getState(Object o) { JTable table = checkComponent(o); - for (Enumeration<TableColumn> tc = - table.getColumnModel().getColumns(); tc.hasMoreElements();) { - // on se met listener pour recevoir les events de resize - tc.nextElement().addPropertyChangeListener(this); - } - } - - @Override - public void removeListener(Object o, Object l) { - JTable table = checkComponent(o); - for (Enumeration<TableColumn> tc = - table.getColumnModel().getColumns(); tc.hasMoreElements();) { - tc.nextElement().removePropertyChangeListener(this); - } - } - - public void updateState(Object o, JTableState state) { - JTable table = checkComponent(o); int[] columnWidths = new int[table.getColumnCount()]; boolean resizableColumnExists = false; for (int i = 0; i < columnWidths.length; i++) { @@ -605,15 +515,11 @@ resizableColumnExists = true; } } + JTableState result = null; if (resizableColumnExists) { - state.setColumnWidths(columnWidths); + result = new JTableState(); + result.setColumnWidths(columnWidths); } - } - - @Override - public State getState(Object o) { - JTableState result = new JTableState(columnWidths); - updateState(o, result); return result; } @@ -636,18 +542,12 @@ } } } - - @Override - public void propertyChange(PropertyChangeEvent evt) { - updateState(evt.getSource(), this); - } - } /** * State for Window */ - static public class WindowState implements State, PropertyChangeListener { + static public class WindowState implements State { private static final String WINDOW_STATE_NORMAL_BOUNDS = "WindowState.normalBounds"; @@ -759,25 +659,7 @@ } @Override - public void addListener(Object o, Object l) { - Window w = checkComponent(o); - w.addPropertyChangeListener("extendedState", (PropertyChangeListener)l); - w.addPropertyChangeListener("bounds", (PropertyChangeListener)l); - } - - @Override - public void removeListener(Object o, Object l) { - Window w = checkComponent(o); - w.removePropertyChangeListener("extendedState", (PropertyChangeListener)l); - w.removePropertyChangeListener("bounds", (PropertyChangeListener)l); - } - - @Override - public void propertyChange(PropertyChangeEvent evt) { - updateState(evt.getSource(), this); - } - - protected void updateState(Object o, WindowState state) { + public State getState(Object o) { Window c = checkComponent(o); int frameState = Frame.NORMAL; if (c instanceof Frame) { @@ -793,18 +675,14 @@ if ((c instanceof JFrame) && (0 != (frameState & Frame.MAXIMIZED_BOTH))) { frameBounds = getWindowNormalBounds((JFrame) c); } - if (frameBounds.isEmpty()) { - return; + WindowState result = null; + if (!frameBounds.isEmpty()) { + result = new WindowState(); + result.setBounds(frameBounds); + result.setGcBounds(gcBounds); + result.setFrameState(frameState); } - state.setBounds(frameBounds); - state.setGcBounds(gcBounds); - state.setFrameState(frameState); - } - @Override - public State getState(Object o) { - WindowState result = new WindowState(); - updateState(o, result); return result; }