Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
se.cambio.openehr.view.util.CollapsiblePanel Maven / Gradle / Ivy
package se.cambio.openehr.view.util;
import se.cambio.openehr.util.OpenEHRImageUtil;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class CollapsiblePanel extends JPanel {
private static final long serialVersionUID = 1L;
CollapsibleTitledBorder border; // includes upper left component and line type
Border collapsedBorderLine = BorderFactory.createEmptyBorder(2, 2, 2, 2); // no border
Border expandedBorderLine = null; // because this is null, default is used, etched lowered border on MAC
AbstractButton titleComponent; // displayed in the titled border
static final int COLLAPSED = 0;
static final int EXPANDED = 1;
ImageIcon[] iconArrow = createExpandAndCollapseIcon();
JButton arrow = createArrowButton();
JPanel panel;
boolean collapsed;
public CollapsiblePanel(String text) {
arrow.setText(text);
titleComponent = arrow;
collapsed = true;
commonConstructor();
}
public JButton getActionButton() {
return arrow;
}
private void commonConstructor() {
setLayout(new BorderLayout());
panel = new JPanel();
panel.setLayout(new BorderLayout());
add(titleComponent, BorderLayout.CENTER);
add(panel, BorderLayout.CENTER);
setCollapsed(collapsed);
placeTitleComponent();
}
private void placeTitleComponent() {
Insets insets = this.getInsets();
Rectangle containerRectangle = this.getBounds();
Rectangle componentRectangle = border.getComponentRect(containerRectangle, insets);
titleComponent.setBounds(componentRectangle);
}
public void setTitleComponentText(String text) {
if (titleComponent instanceof JButton) {
titleComponent.setText(text);
}
placeTitleComponent();
}
public JPanel getContentPane() {
return panel;
}
public void setCollapsed(boolean collapse) {
if (collapse) {
remove(panel);
arrow.setIcon(iconArrow[COLLAPSED]);
border = new CollapsibleTitledBorder(collapsedBorderLine, titleComponent);
} else {
add(panel, BorderLayout.NORTH);
arrow.setIcon(iconArrow[EXPANDED]);
border = new CollapsibleTitledBorder(expandedBorderLine, titleComponent);
}
setBorder(border);
collapsed = collapse;
updateUI();
}
public boolean isCollapsed() {
return collapsed;
}
private ImageIcon[] createExpandAndCollapseIcon() {
ImageIcon[] iconArrow = new ImageIcon[2];
iconArrow[COLLAPSED] = OpenEHRImageUtil.EXPAND_ICON;
iconArrow[EXPANDED] = OpenEHRImageUtil.CONTRACT_ICON;
return iconArrow;
}
private JButton createArrowButton() {
JButton button = new JButton("arrow", iconArrow[COLLAPSED]);
button.setBorder(BorderFactory.createEmptyBorder(0, 1, 5, 1));
button.setVerticalTextPosition(AbstractButton.CENTER);
button.setHorizontalTextPosition(AbstractButton.LEFT);
button.setMargin(new Insets(0, 0, 3, 0));
//We want to use the same font as those in the titled border font
Font font = BorderFactory.createTitledBorder("Sample").getTitleFont();
Color color = BorderFactory.createTitledBorder("Sample").getTitleColor();
button.setFont(font);
button.setForeground(color);
button.setFocusable(false);
button.setContentAreaFilled(false);
button.addActionListener(new CollapsiblePanel.ExpandAndCollapseAction());
return button;
}
private class ExpandAndCollapseAction extends AbstractAction implements ActionListener, ItemListener {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent ev) {
setCollapsed(!isCollapsed());
}
public void itemStateChanged(ItemEvent ev) {
setCollapsed(!isCollapsed());
}
}
public AbstractButton getTitleComponent() {
return titleComponent;
}
private class CollapsibleTitledBorder extends TitledBorder {
private static final long serialVersionUID = 1L;
JComponent component;
//Border border;
public CollapsibleTitledBorder(Border border, JComponent component) {
this(border, component, LEFT, TOP);
}
public CollapsibleTitledBorder(Border border, JComponent component, int titleJustification, int titlePosition) {
//TitledBorder needs border, title, justification, position, font, and color
super(border, null, titleJustification, titlePosition, null, null);
this.component = component;
if (border == null) {
this.border = super.getBorder();
}
}
public void paintBorder(Component component, Graphics graphics, int varX, int varY, int width, int height) {
Rectangle borderR = new Rectangle(varX + EDGE_SPACING, varY + EDGE_SPACING, width - (EDGE_SPACING * 2), height - (EDGE_SPACING * 2));
Insets borderInsets;
if (border != null) {
borderInsets = border.getBorderInsets(component);
} else {
borderInsets = new Insets(0, 0, 0, 0);
}
Rectangle rect = new Rectangle(varX, varY, width, height);
Insets insets = getBorderInsets(component);
Rectangle compR = getComponentRect(rect, insets);
int diff;
switch (titlePosition) {
case ABOVE_TOP:
diff = compR.height + TEXT_SPACING;
borderR.y += diff;
borderR.height -= diff;
break;
case TOP:
case DEFAULT_POSITION:
diff = insets.top / 2 - borderInsets.top - EDGE_SPACING;
borderR.y += diff;
borderR.height -= diff;
break;
case BELOW_TOP:
case ABOVE_BOTTOM:
break;
case BOTTOM:
diff = insets.bottom / 2 - borderInsets.bottom - EDGE_SPACING;
borderR.height -= diff;
break;
case BELOW_BOTTOM:
diff = compR.height + TEXT_SPACING;
borderR.height -= diff;
break;
default:
}
border.paintBorder(component, graphics, borderR.x, borderR.y, borderR.width, borderR.height);
Color col = graphics.getColor();
graphics.setColor(component.getBackground());
graphics.fillRect(compR.x, compR.y, compR.width, compR.height);
graphics.setColor(col);
}
public Insets getBorderInsets(Component component, Insets insets) {
Insets borderInsets;
if (border != null) {
borderInsets = border.getBorderInsets(component);
} else {
borderInsets = new Insets(0, 0, 0, 0);
}
insets.top = EDGE_SPACING + TEXT_SPACING + borderInsets.top;
insets.right = EDGE_SPACING + TEXT_SPACING + borderInsets.right;
insets.bottom = EDGE_SPACING + TEXT_SPACING + borderInsets.bottom;
insets.left = EDGE_SPACING + TEXT_SPACING + borderInsets.left;
if (component == null || this.component == null) {
return insets;
}
int compHeight = this.component.getPreferredSize().height;
switch (titlePosition) {
case ABOVE_TOP:
insets.top += compHeight + TEXT_SPACING;
break;
case TOP:
case DEFAULT_POSITION:
insets.top += Math.max(compHeight, borderInsets.top) - borderInsets.top;
break;
case BELOW_TOP:
insets.top += compHeight + TEXT_SPACING;
break;
case ABOVE_BOTTOM:
insets.bottom += compHeight + TEXT_SPACING;
break;
case BOTTOM:
insets.bottom += Math.max(compHeight, borderInsets.bottom) - borderInsets.bottom;
break;
case BELOW_BOTTOM:
insets.bottom += compHeight + TEXT_SPACING;
break;
default:
}
return insets;
}
public Rectangle getComponentRect(Rectangle rect, Insets borderInsets) {
Dimension compD = component.getPreferredSize();
Rectangle compR = new Rectangle(0, 0, compD.width, compD.height);
switch (titlePosition) {
case ABOVE_TOP:
compR.y = EDGE_SPACING;
break;
case TOP:
case DEFAULT_POSITION:
if (titleComponent instanceof JButton) {
compR.y = EDGE_SPACING + (borderInsets.top - EDGE_SPACING - TEXT_SPACING - compD.height) / 2;
}
break;
case BELOW_TOP:
compR.y = borderInsets.top - compD.height - TEXT_SPACING;
break;
case ABOVE_BOTTOM:
compR.y = rect.height - borderInsets.bottom + TEXT_SPACING;
break;
case BOTTOM:
compR.y = rect.height - borderInsets.bottom + TEXT_SPACING + (borderInsets.bottom - EDGE_SPACING - TEXT_SPACING - compD.height) / 2;
break;
case BELOW_BOTTOM:
compR.y = rect.height - compD.height - EDGE_SPACING;
break;
default:
}
switch (titleJustification) {
case LEFT:
case DEFAULT_JUSTIFICATION:
//compR.x = TEXT_INSET_H + borderInsets.left;
compR.x = TEXT_INSET_H + borderInsets.left - EDGE_SPACING;
break;
case RIGHT:
compR.x = rect.width - borderInsets.right - TEXT_INSET_H - compR.width;
break;
case CENTER:
compR.x = (rect.width - compR.width) / 2;
break;
default:
}
return compR;
}
}
}
/*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 2.0/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 2.0 (the 'License'); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an 'AS IS' basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
*
* The Initial Developers of the Original Code are Iago Corbal and Rong Chen.
* Portions created by the Initial Developer are Copyright (C) 2012-2013
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Software distributed under the License is distributed on an 'AS IS' basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* ***** END LICENSE BLOCK *****
*/