diff --git a/looks/src/org/compiere/swing/CollapsiblePanel.java b/looks/src/org/compiere/swing/CollapsiblePanel.java new file mode 100644 index 0000000000..fc04877e4d --- /dev/null +++ b/looks/src/org/compiere/swing/CollapsiblePanel.java @@ -0,0 +1,210 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 2007 Adempiere, Inc. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package org.compiere.swing; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Insets; + +import javax.swing.Action; +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.UIManager; +import javax.swing.border.Border; +import javax.swing.border.CompoundBorder; + +import org.adempiere.plaf.AdempierePLAF; +import org.jdesktop.swingx.JXCollapsiblePane; +import org.jdesktop.swingx.JXHyperlink; +import org.jdesktop.swingx.VerticalLayout; + +/** + * Collapsible panel with a title and contents.
+ * + * Based on the StackedBox component develop by + * Frederic Lavigne + * + * @author hengsin + */ +public class CollapsiblePanel extends JPanel { + + private Color titleBackgroundColor; + private Color titleForegroundColor; + private Color separatorColor; + private Border separatorBorder; + private JXHyperlink link; + private JXCollapsiblePane collapsible; + + /** + * + * @param title + */ + public CollapsiblePanel(String title) { + setLayout(new VerticalLayout()); + setOpaque(true); + setBackground(Color.WHITE); + + separatorBorder = new SeparatorBorder(); + setTitleForegroundColor(Color.BLACK); + setTitleBackgroundColor(new Color(248, 248, 248)); + setSeparatorColor(new Color(214, 223, 247)); + + collapsible = new JXCollapsiblePane(); + collapsible.getContentPane().setBackground( + AdempierePLAF.getFormBackground()); + collapsible.setBorder(new CompoundBorder(separatorBorder, collapsible + .getBorder())); + + Action toggleAction = collapsible.getActionMap().get( + JXCollapsiblePane.TOGGLE_ACTION); + // use the collapse/expand icons from the JTree UI + toggleAction.putValue(JXCollapsiblePane.COLLAPSE_ICON, UIManager + .getIcon("Tree.expandedIcon")); + toggleAction.putValue(JXCollapsiblePane.EXPAND_ICON, UIManager + .getIcon("Tree.collapsedIcon")); + + link = new JXHyperlink(toggleAction); + link.setText(title); + link.setFont(link.getFont().deriveFont(Font.BOLD)); + link.setOpaque(true); + link.setBackground(getTitleBackgroundColor()); + link.setFocusPainted(false); + + link.setUnclickedColor(getTitleForegroundColor()); + link.setClickedColor(getTitleForegroundColor()); + + link.setBorder(new CompoundBorder(separatorBorder, BorderFactory + .createEmptyBorder(2, 4, 2, 4))); + link.setBorderPainted(true); + + super.add(link); + super.add(collapsible); + + } + + /** + * + * @return color + */ + public Color getSeparatorColor() { + return separatorColor; + } + + /** + * + * @param separatorColor + */ + public void setSeparatorColor(Color separatorColor) { + this.separatorColor = separatorColor; + } + + /** + * get title foreground color + * + * @return color + */ + public Color getTitleForegroundColor() { + return titleForegroundColor; + } + + /** + * Set title foreground color + * + * @param titleForegroundColor + */ + public void setTitleForegroundColor(Color titleForegroundColor) { + this.titleForegroundColor = titleForegroundColor; + } + + /** + * + * @return title background color + */ + public Color getTitleBackgroundColor() { + return titleBackgroundColor; + } + + /** + * Set background color of title + * + * @param titleBackgroundColor + */ + public void setTitleBackgroundColor(Color titleBackgroundColor) { + this.titleBackgroundColor = titleBackgroundColor; + } + + /** + * Set title of the section + * + * @param title + */ + public void setTitle(String title) { + if (link != null) + link.setText(title); + } + + /** + * + * @return collapsible pane + */ + public JXCollapsiblePane getCollapsiblePane() { + return collapsible; + } + + /** + * The border between the stack components. It separates each component with + * a fine line border. + */ + class SeparatorBorder implements Border { + + boolean isFirst(Component c) { + return c.getParent() == null || c.getParent().getComponent(0) == c; + } + + public Insets getBorderInsets(Component c) { + // if the collapsible is collapsed, we do not want its border to be + // painted. + if (c instanceof JXCollapsiblePane) { + if (((JXCollapsiblePane) c).isCollapsed()) { + return new Insets(0, 0, 0, 0); + } + } + return new Insets(4, 0, 1, 0); + } + + public boolean isBorderOpaque() { + return true; + } + + public void paintBorder(Component c, Graphics g, int x, int y, + int width, int height) { + g.setColor(getSeparatorColor()); + if (isFirst(c)) { + g.drawLine(x, y + 2, x + width, y + 2); + } + g.drawLine(x, y + height - 1, x + width, y + height - 1); + } + } + + @Override + public Component add(Component comp) { + if (collapsible != null) + return collapsible.add(comp); + + return null; + } + +} diff --git a/looks/src/org/compiere/swing/StackedBox.java b/looks/src/org/compiere/swing/StackedBox.java new file mode 100644 index 0000000000..8f2ca1f58b --- /dev/null +++ b/looks/src/org/compiere/swing/StackedBox.java @@ -0,0 +1,212 @@ +/* + * $Id: StackedBox.java.txt,v 1.1 2006/03/09 20:48:47 rbair Exp $ + * + * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, + * Santa Clara, California 95054, U.S.A. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +package org.compiere.swing; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Insets; +import java.awt.Rectangle; + +import javax.swing.Action; +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.JViewport; +import javax.swing.Scrollable; +import javax.swing.UIManager; +import javax.swing.border.Border; +import javax.swing.border.CompoundBorder; + +import org.jdesktop.swingx.JXCollapsiblePane; +import org.jdesktop.swingx.JXHyperlink; +import org.jdesktop.swingx.VerticalLayout; + +/** + * Stacks components vertically in boxes. Each box is created with a title and a + * component.
+ * + *

+ * The StackedBox can be added to a + * {@link javax.swing.JScrollPane}. + * + *

+ * + * @author Frederic Lavigne + */ +public class StackedBox extends JPanel implements Scrollable { + + private Color titleBackgroundColor; + private Color titleForegroundColor; + private Color separatorColor; + private Border separatorBorder; + + public StackedBox() { + setLayout(new VerticalLayout()); + setOpaque(true); + setBackground(Color.WHITE); + + separatorBorder = new SeparatorBorder(); + setTitleForegroundColor(Color.BLACK); + setTitleBackgroundColor(new Color(248, 248, 248)); + setSeparatorColor(new Color(214, 223, 247)); + } + + public Color getSeparatorColor() { + return separatorColor; + } + + public void setSeparatorColor(Color separatorColor) { + this.separatorColor = separatorColor; + } + + public Color getTitleForegroundColor() { + return titleForegroundColor; + } + + public void setTitleForegroundColor(Color titleForegroundColor) { + this.titleForegroundColor = titleForegroundColor; + } + + public Color getTitleBackgroundColor() { + return titleBackgroundColor; + } + + public void setTitleBackgroundColor(Color titleBackgroundColor) { + this.titleBackgroundColor = titleBackgroundColor; + } + + /** + * Adds a new component to this StackedBox + * + * @param title + * @param component + */ + public void addBox(String title, Component component) { + final JXCollapsiblePane collapsible = new JXCollapsiblePane(); + collapsible.getContentPane().setBackground(Color.WHITE); + collapsible.add(component); + collapsible.setBorder(new CompoundBorder(separatorBorder, collapsible + .getBorder())); + + Action toggleAction = collapsible.getActionMap().get( + JXCollapsiblePane.TOGGLE_ACTION); + // use the collapse/expand icons from the JTree UI + toggleAction.putValue(JXCollapsiblePane.COLLAPSE_ICON, UIManager + .getIcon("Tree.expandedIcon")); + toggleAction.putValue(JXCollapsiblePane.EXPAND_ICON, UIManager + .getIcon("Tree.collapsedIcon")); + + JXHyperlink link = new JXHyperlink(toggleAction); + link.setText(title); + link.setFont(link.getFont().deriveFont(Font.BOLD)); + link.setOpaque(true); + link.setBackground(getTitleBackgroundColor()); + link.setFocusPainted(false); + + link.setUnclickedColor(getTitleForegroundColor()); + link.setClickedColor(getTitleForegroundColor()); + + link.setBorder(new CompoundBorder(separatorBorder, BorderFactory + .createEmptyBorder(2, 4, 2, 4))); + link.setBorderPainted(true); + + add(link); + add(collapsible); + } + + /** + * @see Scrollable#getPreferredScrollableViewportSize() + */ + public Dimension getPreferredScrollableViewportSize() { + return getPreferredSize(); + } + + /** + * @see Scrollable#getScrollableBlockIncrement(java.awt.Rectangle, int, int) + */ + public int getScrollableBlockIncrement(Rectangle visibleRect, + int orientation, int direction) { + return 10; + } + + /** + * @see Scrollable#getScrollableTracksViewportHeight() + */ + public boolean getScrollableTracksViewportHeight() { + if (getParent() instanceof JViewport) { + return (((JViewport)getParent()).getHeight() > getPreferredSize().height); + } else { + return false; + } + } + + /** + * @see Scrollable#getScrollableTracksViewportWidth() + */ + public boolean getScrollableTracksViewportWidth() { + return true; + } + + /** + * @see Scrollable#getScrollableUnitIncrement(java.awt.Rectangle, int, int) + */ + public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, + int direction) { + return 10; + } + + /** + * The border between the stack components. It separates each component with a + * fine line border. + */ + class SeparatorBorder implements Border { + + boolean isFirst(Component c) { + return c.getParent() == null || c.getParent().getComponent(0) == c; + } + + public Insets getBorderInsets(Component c) { + // if the collapsible is collapsed, we do not want its border to be + // painted. + if (c instanceof JXCollapsiblePane) { + if (((JXCollapsiblePane)c).isCollapsed()) { return new Insets(0, 0, 0, + 0); } + } + return new Insets(isFirst(c)?4:1, 0, 1, 0); + } + + public boolean isBorderOpaque() { + return true; + } + + public void paintBorder(Component c, Graphics g, int x, int y, int width, + int height) { + g.setColor(getSeparatorColor()); + if (isFirst(c)) { + g.drawLine(x, y + 2, x + width, y + 2); + } + g.drawLine(x, y + height - 1, x + width, y + height - 1); + } + } + +}