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>