You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by gb...@apache.org on 2009/05/21 15:21:34 UTC

svn commit: r777110 - in /incubator/pivot/trunk: tutorials/src/pivot/tutorials/navigation/ wtk/src/pivot/wtk/ wtk/src/pivot/wtk/skin/terra/ wtk/test/pivot/wtk/test/

Author: gbrown
Date: Thu May 21 13:21:33 2009
New Revision: 777110

URL: http://svn.apache.org/viewvc?rev=777110&view=rev
Log:
Disable tab button/accordion header when corresponding tab/panel is disabled.

Modified:
    incubator/pivot/trunk/tutorials/src/pivot/tutorials/navigation/tab_panes.wtkx
    incubator/pivot/trunk/wtk/src/pivot/wtk/AccordionListener.java
    incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraAccordionSkin.java
    incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraTabPaneSkin.java
    incubator/pivot/trunk/wtk/test/pivot/wtk/test/AccordionTest.java
    incubator/pivot/trunk/wtk/test/pivot/wtk/test/accordion_test.wtkx

Modified: incubator/pivot/trunk/tutorials/src/pivot/tutorials/navigation/tab_panes.wtkx
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/tutorials/src/pivot/tutorials/navigation/tab_panes.wtkx?rev=777110&r1=777109&r2=777110&view=diff
==============================================================================
--- incubator/pivot/trunk/tutorials/src/pivot/tutorials/navigation/tab_panes.wtkx (original)
+++ incubator/pivot/trunk/tutorials/src/pivot/tutorials/navigation/tab_panes.wtkx Thu May 21 13:21:33 2009
@@ -35,7 +35,8 @@
                                             styles="{horizontalAlignment:'center', verticalAlignment:'center'}">
                                             <Border>
                                                 <content>
-                                                    <Label text="240x180" preferredWidth="240" preferredHeight="180"/>
+                                                    <Label text="240x180" preferredWidth="240" preferredHeight="180"
+                                                        styles="{horizontalAlignment:'center', verticalAlignment:'center'}"/>
                                                 </content>
                                             </Border>
                                         </FlowPane>
@@ -44,7 +45,8 @@
                                             styles="{horizontalAlignment:'center', verticalAlignment:'center'}">
                                             <Border>
                                                 <content>
-                                                    <Label text="320x240" preferredWidth="320" preferredHeight="240"/>
+                                                    <Label text="320x240" preferredWidth="320" preferredHeight="240"
+                                                        styles="{horizontalAlignment:'center', verticalAlignment:'center'}"/>
                                                 </content>
                                             </Border>
                                         </FlowPane>
@@ -53,10 +55,13 @@
                                             styles="{horizontalAlignment:'center', verticalAlignment:'center'}">
                                             <Border>
                                                 <content>
-                                                    <Label text="480x360" preferredWidth="480" preferredHeight="360"/>
+                                                    <Label text="480x360" preferredWidth="480" preferredHeight="360"
+                                                        styles="{horizontalAlignment:'center', verticalAlignment:'center'}"/>
                                                 </content>
                                             </Border>
                                         </FlowPane>
+
+                                        <FlowPane TabPane.icon="pivot/tutorials/star.png" TabPane.name="Star" enabled="false"/>
                                     </tabs>
                                     <corner>
                                         <FlowPane wtkx:id="cornerFlowPane" styles="{horizontalAlignment:'right'}">

Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/AccordionListener.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/AccordionListener.java?rev=777110&r1=777109&r2=777110&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/AccordionListener.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/AccordionListener.java Thu May 21 13:21:33 2009
@@ -33,7 +33,7 @@
         public void panelInserted(Accordion accordion, int index) {
         }
 
-        public void panelsRemoved(Accordion accordion, int index, Sequence<Component> panels) {
+        public void panelsRemoved(Accordion accordion, int index, Sequence<Component> removed) {
         }
     }
 
@@ -50,7 +50,7 @@
      *
      * @param accordion
      * @param index
-     * @param panels
+     * @param removed
      */
-    public void panelsRemoved(Accordion accordion, int index, Sequence<Component> panels);
+    public void panelsRemoved(Accordion accordion, int index, Sequence<Component> removed);
 }

Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraAccordionSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraAccordionSkin.java?rev=777110&r1=777109&r2=777110&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraAccordionSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraAccordionSkin.java Thu May 21 13:21:33 2009
@@ -27,6 +27,7 @@
 import pivot.util.Vote;
 import pivot.wtk.Button;
 import pivot.wtk.Component;
+import pivot.wtk.ComponentStateListener;
 import pivot.wtk.Dimensions;
 import pivot.wtk.GraphicsUtilities;
 import pivot.wtk.HorizontalAlignment;
@@ -51,20 +52,13 @@
 
 /**
  * Accordion skin.
- * <p>
- * TODO Make headers focusable?
- * <p>
- * TODO Disable the header when the component is disabled? We'd need
- * style properties to present a disabled header state. We'd also need
- * to manage button enabled state independently of the accordion enabled
- * state.
  *
  * @author gbrown
  */
 public class TerraAccordionSkin extends ContainerSkin
     implements AccordionListener, AccordionSelectionListener, AccordionAttributeListener {
 	protected class PanelHeader extends Button {
-        public PanelHeader(Object panel) {
+        public PanelHeader(Component panel) {
             super(panel);
 
             super.setToggleButton(true);
@@ -74,17 +68,6 @@
         }
 
         @Override
-        public boolean isEnabled() {
-            Accordion accordion = (Accordion)TerraAccordionSkin.this.getComponent();
-            return accordion.isEnabled();
-        }
-
-        @Override
-        public void setEnabled(boolean enabled) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
         public void setToggleButton(boolean toggleButton) {
             throw new UnsupportedOperationException();
         }
@@ -200,7 +183,7 @@
         }
 
         public Color getDisabledColor() {
-        	return buttonColor;
+        	return disabledButtonColor;
         }
     }
 
@@ -253,14 +236,32 @@
     private Insets padding;
     private Font buttonFont;
     private Color buttonColor;
+    private Color disabledButtonColor;
     private Color buttonBackgroundColor;
     private Insets buttonPadding;
 
     // Derived colors
     private Color buttonBevelColor;
 
-	public static final int GRADIENT_BEVEL_THICKNESS = 4;
-	private static final Button.DataRenderer DEFAULT_DATA_RENDERER = new ButtonDataRenderer() {
+    private SelectionChangeTransition selectionChangeTransition = null;
+    private ClipDecorator previousSelectedPanelClipDecorator = new ClipDecorator();
+    private ClipDecorator selectedPanelClipDecorator = new ClipDecorator();
+
+    private ComponentStateListener panelStateListener = new ComponentStateListener.Adapter() {
+        @Override
+        public void enabledChanged(Component component) {
+            Accordion accordion = (Accordion)getComponent();
+            int i = accordion.getPanels().indexOf(component);
+            panelHeaders.get(i).setEnabled(component.isEnabled());
+        }
+    };
+
+    public static final int GRADIENT_BEVEL_THICKNESS = 4;
+
+    private static final Button.DataRenderer DEFAULT_DATA_RENDERER = new ButtonDataRenderer() {
+        {   getStyles().put("horizontalAlignment", HorizontalAlignment.LEFT);
+        }
+
         @Override
         public void render(Object data, Button button, boolean highlighted) {
             // TODO Create a custom inner renderer class that can display
@@ -272,17 +273,9 @@
         }
     };
 
-    private SelectionChangeTransition selectionChangeTransition = null;
-    public final ClipDecorator previousSelectedPanelClipDecorator = new ClipDecorator();
-    public final ClipDecorator selectedPanelClipDecorator = new ClipDecorator();
-
 	private static final int SELECTION_CHANGE_DURATION = 250;
 	private static final int SELECTION_CHANGE_RATE = 30;
 
-	static {
-		DEFAULT_DATA_RENDERER.getStyles().put("horizontalAlignment", HorizontalAlignment.LEFT);
-	}
-
     public TerraAccordionSkin() {
         TerraTheme theme = (TerraTheme)Theme.getTheme();
         setBackgroundColor(theme.getColor(4));
@@ -291,6 +284,7 @@
         padding = new Insets(4);
         buttonFont = theme.getFont().deriveFont(Font.BOLD);
         buttonColor = theme.getColor(15);
+        disabledButtonColor = theme.getColor(7);
         buttonBackgroundColor = theme.getColor(10);
         buttonPadding = new Insets(3, 4, 3, 4);
 
@@ -327,15 +321,17 @@
         accordion.getAccordionSelectionListeners().add(this);
         accordion.getAccordionAttributeListeners().add(this);
 
-        // Add header buttons for all existing panels
+        // Add headers for all existing panels
         for (Component panel : accordion.getPanels()) {
             PanelHeader panelHeader = new PanelHeader(panel);
             panelHeader.setGroup(panelHeaderGroup);
-            accordion.add(panelHeader);
             panelHeaders.add(panelHeader);
-        }
+            accordion.add(panelHeader);
 
-        selectedIndexChanged(accordion, -1);
+            // Listen for state changes on the panel
+            panelHeader.setEnabled(panel.isEnabled());
+            panel.getComponentStateListeners().add(panelStateListener);
+        }
     }
 
     public void uninstall() {
@@ -346,9 +342,13 @@
         accordion.getAccordionSelectionListeners().remove(this);
         accordion.getAccordionAttributeListeners().remove(this);
 
-        // Remove the header buttons
-        for (int i = 0, n = panelHeaders.getLength(); i < n; i++) {
-            accordion.remove(panelHeaders.get(i));
+        for (PanelHeader panelHeader : panelHeaders) {
+            // Stop listening for state changes on the panel
+            Component panel = (Component)panelHeader.getButtonData();
+            panel.getComponentStateListeners().remove(panelStateListener);
+
+            // Remove the header
+            accordion.remove(panelHeader);
         }
 
         super.uninstall();
@@ -642,14 +642,18 @@
             selectionChangeTransition.end();
         }
 
-        // Create a new button for the panel
+        // Add a header for the panel
         Component panel = accordion.getPanels().get(index);
         PanelHeader panelHeader = new PanelHeader(panel);
-
-        accordion.add(panelHeader);
         panelHeader.setGroup(panelHeaderGroup);
         panelHeaders.insert(panelHeader, index);
+        accordion.add(panelHeader);
+
+        // Listen for state changes on the panel
+        panelHeader.setEnabled(panel.isEnabled());
+        panel.getComponentStateListeners().add(panelStateListener);
 
+        // If this is the first panel, select it
         if (accordion.getPanels().getLength() == 1) {
             accordion.setSelectedIndex(0);
         }
@@ -657,17 +661,23 @@
         invalidateComponent();
     }
 
-    public void panelsRemoved(Accordion accordion, int index, Sequence<Component> panels) {
+    public void panelsRemoved(Accordion accordion, int index, Sequence<Component> removed) {
         if (selectionChangeTransition != null) {
             selectionChangeTransition.end();
         }
 
-        // Remove the buttons
-        Sequence<PanelHeader> removed = panelHeaders.remove(index, panels.getLength());
+        // Remove the headers
+        Sequence<PanelHeader> removedHeaders = panelHeaders.remove(index, removed.getLength());
 
-        for (int i = 0, n = removed.getLength(); i < n; i++) {
-            PanelHeader panelHeader = removed.get(i);
+        for (int i = 0, n = removedHeaders.getLength(); i < n; i++) {
+            PanelHeader panelHeader = removedHeaders.get(i);
             panelHeader.setGroup((Group)null);
+
+            // Stop listening for state changes on the panel
+            Component panel = (Component)panelHeader.getButtonData();
+            panel.getComponentStateListeners().remove(panelStateListener);
+
+            // Remove the header
             accordion.remove(panelHeader);
         }
 

Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraTabPaneSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraTabPaneSkin.java?rev=777110&r1=777109&r2=777110&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraTabPaneSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraTabPaneSkin.java Thu May 21 13:21:33 2009
@@ -26,6 +26,7 @@
 import pivot.util.Vote;
 import pivot.wtk.Button;
 import pivot.wtk.Component;
+import pivot.wtk.ComponentStateListener;
 import pivot.wtk.Dimensions;
 import pivot.wtk.FlowPane;
 import pivot.wtk.GraphicsUtilities;
@@ -54,14 +55,6 @@
 
 /**
  * Tab pane skin.
- * <p>
- * TODO Make tab buttons focusable?
- * <p>
- * TODO Disable the tab button when the component is disabled? We'd need
- * style properties to present a disabled tab button state. We'd also need
- * to manage button enabled state independently of tab pane enabled state.
- * <p>
- * TODO Add support for closeable attribute.
  *
  * @author gbrown
  */
@@ -73,7 +66,7 @@
      * @author gbrown
      */
     public class TabButton extends Button {
-        public TabButton(Object tab) {
+        public TabButton(Component tab) {
             super(tab);
 
             super.setToggleButton(true);
@@ -83,11 +76,6 @@
         }
 
         @Override
-        public void setEnabled(boolean enabled) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
         public void setToggleButton(boolean toggleButton) {
             throw new UnsupportedOperationException();
         }
@@ -275,7 +263,7 @@
         }
 
         public Color getDisabledColor() {
-        	return buttonColor;
+        	return disabledButtonColor;
         }
     }
 
@@ -353,9 +341,9 @@
     private Insets padding;
     private Font buttonFont;
     private Color buttonColor;
+    private Color disabledButtonColor;
     private Insets buttonPadding;
 
-    // Derived colors
     private Color buttonBevelColor;
 
     private boolean collapsible = false;
@@ -363,6 +351,15 @@
 
     private SelectionChangeTransition selectionChangeTransition = null;
 
+    private ComponentStateListener tabStateListener = new ComponentStateListener.Adapter() {
+        @Override
+        public void enabledChanged(Component component) {
+            TabPane tabPane = (TabPane)getComponent();
+            int i = tabPane.getTabs().indexOf(component);
+            buttonFlowPane.get(i).setEnabled(component.isEnabled());
+        }
+    };
+
     private static final int SELECTION_CHANGE_DURATION = 250;
     private static final int SELECTION_CHANGE_RATE = 30;
 
@@ -387,13 +384,17 @@
         padding = new Insets(6);
         buttonFont = theme.getFont();
         buttonColor = theme.getColor(1);
+        disabledButtonColor = theme.getColor(7);
         buttonPadding = new Insets(3, 4, 3, 4);
 
-        // Set the derived colors
         buttonBevelColor = TerraTheme.brighten(inactiveTabColor);
 
         setButtonSpacing(2);
 
+        buttonPanorama.getStyles().put("buttonBackgroundColor", borderColor);
+        buttonPanorama.getStyles().put("buttonPadding", 6);
+        buttonPanorama.setView(buttonFlowPane);
+
         tabButtonGroup.getGroupListeners().add(new Button.GroupListener() {
             public void selectionChanged(Group group, Button previousSelection) {
                 Button button = tabButtonGroup.getSelection();
@@ -415,18 +416,23 @@
         tabPane.getTabPaneSelectionListeners().add(this);
         tabPane.getTabPaneAttributeListeners().add(this);
 
-        // Add the button panorama and flow pane
-        buttonPanorama.getStyles().put("buttonBackgroundColor", borderColor);
-        buttonPanorama.getStyles().put("buttonPadding", 6);
-        buttonPanorama.setView(buttonFlowPane);
+        // Add the tab buttons
         tabPane.add(buttonPanorama);
 
-        // Add buttons for all existing tabs
-        for (Component tab : tabPane.getTabs()) {
+        Sequence<Component> tabs = tabPane.getTabs();
+        int selectedIndex = tabPane.getSelectedIndex();
+
+        for (int i = 0, n = tabs.getLength(); i < n; i++) {
+            Component tab = tabs.get(i);
+            tab.setVisible(i == selectedIndex);
+
             TabButton tabButton = new TabButton(tab);
             tabButton.setGroup(tabButtonGroup);
-
             buttonFlowPane.add(tabButton);
+
+            // Listen for state changes on the tab
+            tabButton.setEnabled(tab.isEnabled());
+            tab.getComponentStateListeners().add(tabStateListener);
         }
 
         selectedIndexChanged(tabPane, -1);
@@ -440,7 +446,12 @@
         tabPane.getTabPaneSelectionListeners().remove(this);
         tabPane.getTabPaneAttributeListeners().remove(this);
 
-        // Remove the button panorama
+        // Remove the tab state listeners
+        for (Component tab : tabPane.getTabs()) {
+            tab.getComponentStateListeners().remove(tabStateListener);
+        }
+
+        // Remove the tab buttons
         tabPane.remove(buttonPanorama);
 
         super.uninstall();
@@ -1074,15 +1085,19 @@
     	    selectionChangeTransition.end();
     	}
 
-        // Create a new button for the tab
         Component tab = tabPane.getTabs().get(index);
         tab.setVisible(false);
 
+        // Create a new button for the tab
         TabButton tabButton = new TabButton(tab);
         tabButton.setGroup(tabButtonGroup);
-
         buttonFlowPane.insert(tabButton, index);
 
+        // Listen for state changes on the tab
+        tabButton.setEnabled(tab.isEnabled());
+        tab.getComponentStateListeners().add(tabStateListener);
+
+    	// If this is the first tab, select it
         if (tabPane.getTabs().getLength() == 1) {
             tabPane.setSelectedIndex(0);
         }
@@ -1095,15 +1110,16 @@
     	    selectionChangeTransition.end();
     	}
 
-    	// Remove the buttons
-        Sequence<Component> removedButtons = buttonFlowPane.remove(index, removed.getLength());
+        // Remove the buttons
+    	Sequence<Component> removedButtons = buttonFlowPane.remove(index, removed.getLength());
 
         for (int i = 0, n = removed.getLength(); i < n; i++) {
-            Component tab = removed.get(i);
-            tab.setVisible(true);
-
             TabButton tabButton = (TabButton)removedButtons.get(i);
             tabButton.setGroup((Group)null);
+
+            // Stop listening for state changes on the tab
+            Component tab = (Component)tabButton.getButtonData();
+            tab.getComponentStateListeners().remove(tabStateListener);
         }
 
         invalidateComponent();

Modified: incubator/pivot/trunk/wtk/test/pivot/wtk/test/AccordionTest.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/test/pivot/wtk/test/AccordionTest.java?rev=777110&r1=777109&r2=777110&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/test/pivot/wtk/test/AccordionTest.java (original)
+++ incubator/pivot/trunk/wtk/test/pivot/wtk/test/AccordionTest.java Thu May 21 13:21:33 2009
@@ -21,20 +21,22 @@
 import pivot.wtk.DesktopApplicationContext;
 import pivot.wtk.Display;
 import pivot.wtk.Frame;
-import pivot.wtkx.WTKXSerializer;
+import pivot.wtkx.Bindable;
 
-public class AccordionTest implements Application {
-    private Frame frame = null;
+public class AccordionTest extends Bindable implements Application {
+    @Load(resourceName="accordion_test.wtkx") private Frame frame;
 
     public void startup(Display display, Dictionary<String, String> properties)
         throws Exception {
-        WTKXSerializer wtkxSerializer = new WTKXSerializer();
-        frame = (Frame)wtkxSerializer.readObject(getClass().getResource("accordion_test.wtkx"));
+        bind();
         frame.open(display);
     }
 
     public boolean shutdown(boolean optional) {
-        frame.close();
+        if (frame != null) {
+            frame.close();
+        }
+
         return true;
     }
 

Modified: incubator/pivot/trunk/wtk/test/pivot/wtk/test/accordion_test.wtkx
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/test/pivot/wtk/test/accordion_test.wtkx?rev=777110&r1=777109&r2=777110&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/test/pivot/wtk/test/accordion_test.wtkx (original)
+++ incubator/pivot/trunk/wtk/test/pivot/wtk/test/accordion_test.wtkx Thu May 21 13:21:33 2009
@@ -23,7 +23,7 @@
             <panels>
                 <Label Accordion.name="A" text="Hello"/>
                 <Label Accordion.name="B" text="World"/>
-                <Label Accordion.name="C" text="From"/>
+                <Label Accordion.name="C" text="From" enabled="false"/>
                 <Label Accordion.name="D" text="Pivot"/>
             </panels>
         </Accordion>