[ 1855851 ] Propose New Look for Collapseable Field Group

This commit is contained in:
Heng Sin Low 2007-12-25 09:06:33 +00:00
parent 35fa73dbdb
commit 87926396d6
2 changed files with 422 additions and 0 deletions

View File

@ -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.<br>
*
* Based on the StackedBox component develop by
* <a href="mailto:fred@L2FProd.com">Frederic Lavigne</a>
*
* @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;
}
}

View File

@ -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.<br>
*
* <p>
* The <code>StackedBox</code> can be added to a
* {@link javax.swing.JScrollPane}.
*
* <p>
*
* @author <a href="mailto:fred@L2FProd.com">Frederic Lavigne</a>
*/
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 <code>StackedBox</code>
*
* @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);
}
}
}