openesb-components/jbi-cdk/jbisupport/jbicomponentsupport/src/org/netbeans/modules/jbi/apisupport/xmlmv/ui/SectionContainer.java

414 lines
17 KiB
Java
Executable File

/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common
* Development and Distribution License("CDDL") (collectively, the
* "License"). You may not use this file except in compliance with the
* License. You can obtain a copy of the License at
* http://www.netbeans.org/cddl-gplv2.html
* or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
* specific language governing permissions and limitations under the
* License. When distributing the software, include this License Header
* Notice in each file and include the License file at
* nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the GPL Version 2 section of the License file that
* accompanied this code. If applicable, add the following below the
* License Header, with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* Contributor(s):
*
* The Original Software is NetBeans. The Initial Developer of the Original
* Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
* Microsystems, Inc. All Rights Reserved.
*
* If you wish your version of this file to be governed by only the CDDL
* or only the GPL Version 2, indicate your decision by adding
* "[Contributor] elects to include this software in this distribution
* under the [CDDL or GPL Version 2] license." If you do not indicate a
* single choice of license, a recipient has the option to distribute
* your version of this file under either the CDDL, the GPL Version 2 or
* to extend the choice of license to its licensees as provided above.
* However, if you add GPL Version 2 code and therefore, elected the GPL
* Version 2 license, then the option applies only if the new code is
* made subject to such option by the copyright holder.
*/
package org.netbeans.modules.jbi.apisupport.xmlmv.ui;
import java.awt.*;
import java.util.*;
import java.net.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import org.openide.nodes.Node;
import org.netbeans.modules.jbi.apisupport.xmlmv.Utils;
/**
* A container for <code>NodeSectionPanel</code>s. Provides fold button and support
* for defining "header actions", i.e. top level actions by means of <code>setHeaderActions()</code>
* method.
*
*
* @author mkuchtiak
*/
public class SectionContainer extends javax.swing.JPanel implements NodeSectionPanel, ContainerPanel {
//private HashMap map = new HashMap();
//private JScrollPane scrollPane;
private Node activeNode=null;
private SectionView sectionView;
private String title;
private Node root;
private boolean active;
private int sectionCount=0;
private int index;
private boolean foldable;
public SectionContainer(SectionView sectionView, Node root, String title) {
this(sectionView, root, title, true);
}
public SectionContainer(SectionView sectionView, Node root, String title, boolean foldable) {
this.sectionView=sectionView;
this.root=root;
this.title=title;
this.foldable=foldable;
initComponents();
setBackground(SectionVisualTheme.getDocumentBackgroundColor());
headerSeparator.setForeground(SectionVisualTheme.getSectionHeaderLineColor());
titlePanel.setBackground(foldable?SectionVisualTheme.getSectionHeaderColor():SectionVisualTheme.getContainerHeaderColor());
actionPanel.setBackground(SectionVisualTheme.getDocumentBackgroundColor());
fillerLine.setForeground(SectionVisualTheme.getFoldLineColor());
fillerEnd.setForeground(SectionVisualTheme.getFoldLineColor());
titleButton.setText(title);
titleButton.setFont(new Font(getFont().getFontName(), Font.BOLD, getFont().getSize() + 2));
titleButton.addMouseListener(new org.openide.awt.MouseUtils.PopupMouseAdapter() {
protected void showPopup(java.awt.event.MouseEvent e) {
JPopupMenu popup = getNode().getContextMenu();
popup.show(titleButton,e.getX(), e.getY());
}
});
if (foldable) {
foldButton.setSelected(true);
} else {
remove(fillerLine);
remove(fillerEnd);
remove(foldButton);
}
setIcon(true);
}
/** Method from NodeSectionPanel interface */
public Node getNode() {
return root;
}
/** Method from ContainerPanel interface */
public Node getRoot() {
return root;
}
/** Method from NodeSectionPanel interface */
public void open(){
if (foldable) {
foldButton.setSelected(true);
contentPanel.setVisible(true);
fillerLine.setVisible(true);
fillerEnd.setVisible(true);
setIcon(true);
}
}
/** Method from NodeSectionPanel interface */
public void scroll() {
Utils.scrollToVisible(this);
}
/** Method from NodeSectionPanel interface */
public void setActive(boolean active) {
titlePanel.setBackground(active?SectionVisualTheme.getSectionHeaderActiveColor():
(foldable?SectionVisualTheme.getSectionHeaderColor():SectionVisualTheme.getContainerHeaderColor()));
if (active && !this.equals(sectionView.getActivePanel())) {
sectionView.sectionSelected(true);
sectionView.setActivePanel(this);
sectionView.selectNode(root);
}
this.active=active;
}
/** Method from NodeSectionPanel interface */
public boolean isActive() {
return active;
}
/** Maps section to a node
*/
private void mapSection(Node key, NodeSectionPanel panel){
sectionView.mapSection(key,panel);
}
/** Maps section to a node
*/
private void deleteSection(Node key){
sectionView.deleteSection(key);
}
/** Method from ContainerPanel interface */
public NodeSectionPanel getSection(Node key){
return sectionView.getSection(key);
}
public void addSection(NodeSectionPanel section, boolean open) {
addSection(section);
if (open) {
section.open();
section.scroll();
section.setActive(true);
}
}
/** Method from ContainerPanel interface */
public void addSection(NodeSectionPanel section){
GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = sectionCount;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
contentPanel.add((JPanel)section,gridBagConstraints);
section.setIndex(sectionCount);
mapSection(section.getNode(), section);
sectionCount++;
}
/** Method from ContainerPanel interface */
public void removeSection(NodeSectionPanel section) {
int panelIndex = section.getIndex();
contentPanel.remove((JPanel)section);
// the rest components have to be moved up
java.awt.Component[] components = contentPanel.getComponents();
java.util.AbstractList removedPanels = new java.util.ArrayList();
for (int i=0;i<components.length;i++) {
if (components[i] instanceof NodeSectionPanel) {
NodeSectionPanel pan = (NodeSectionPanel)components[i];
int index = pan.getIndex();
if (index>panelIndex) {
contentPanel.remove((JPanel)pan);
pan.setIndex(index-1);
removedPanels.add(pan);
}
}
}
for (int i=0;i<removedPanels.size();i++) {
NodeSectionPanel pan = (NodeSectionPanel)removedPanels.get(i);
java.awt.GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = pan.getIndex();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
//gridBagConstraints.insets = new java.awt.Insets(6, 0, 0, 6);
contentPanel.add((JPanel)pan,gridBagConstraints);
}
deleteSection(section.getNode());
sectionCount--;
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
foldButton = new javax.swing.JToggleButton();
headerSeparator = new javax.swing.JSeparator();
contentPanel = new javax.swing.JPanel();
actionPanel = new javax.swing.JPanel();
fillerLine = new javax.swing.JSeparator();
fillerEnd = new javax.swing.JSeparator();
titlePanel = new javax.swing.JPanel();
titleButton = new javax.swing.JButton();
setLayout(new java.awt.GridBagLayout());
foldButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/netbeans/modules/jbi/apisupport/xmlmv/resources/plus.gif"))); // NOI18N
foldButton.setBorder(null);
foldButton.setBorderPainted(false);
foldButton.setContentAreaFilled(false);
foldButton.setFocusPainted(false);
foldButton.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/netbeans/modules/jbi/apisupport/xmlmv/resources/minus.gif"))); // NOI18N
foldButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
foldButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 2, 0, 2);
add(foldButton, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 0, 0, 0);
add(headerSeparator, gridBagConstraints);
contentPanel.setLayout(new java.awt.GridBagLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 0, 0, 0);
add(contentPanel, gridBagConstraints);
actionPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT, 2, 0));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(6, 0, 0, 0);
add(actionPanel, gridBagConstraints);
fillerLine.setOrientation(javax.swing.SwingConstants.VERTICAL);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridheight = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 6, 0, 0);
add(fillerLine, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
gridBagConstraints.insets = new java.awt.Insets(0, 6, 0, 2);
add(fillerEnd, gridBagConstraints);
titlePanel.setLayout(new java.awt.BorderLayout());
titleButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
titleButton.setBorderPainted(false);
titleButton.setContentAreaFilled(false);
titleButton.setFocusPainted(false);
titleButton.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
titleButton.setMargin(new java.awt.Insets(0, 4, 0, 4));
titleButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
titleButtonActionPerformed(evt);
}
});
titlePanel.add(titleButton, java.awt.BorderLayout.CENTER);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(6, 0, 0, 0);
add(titlePanel, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
private void titleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_titleButtonActionPerformed
// TODO add your handling code here:
if (foldable) {
if (!foldButton.isSelected()) {
open();
foldButton.setSelected(true);
} else {
if (isActive()) {
foldButton.setSelected(false);
contentPanel.setVisible(false);
fillerLine.setVisible(false);
fillerEnd.setVisible(false);
setIcon(false);
}
}
}
if (!isActive()) setActive(true);
}//GEN-LAST:event_titleButtonActionPerformed
private void foldButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_foldButtonActionPerformed
// TODO add your handling code here:
contentPanel.setVisible(foldButton.isSelected());
fillerLine.setVisible(foldButton.isSelected());
fillerEnd.setVisible(foldButton.isSelected());
setIcon(foldButton.isSelected());
}//GEN-LAST:event_foldButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel actionPanel;
private javax.swing.JPanel contentPanel;
private javax.swing.JSeparator fillerEnd;
private javax.swing.JSeparator fillerLine;
private javax.swing.JToggleButton foldButton;
private javax.swing.JSeparator headerSeparator;
private javax.swing.JButton titleButton;
private javax.swing.JPanel titlePanel;
// End of variables declaration//GEN-END:variables
/** Method from NodeSectionPanel interface */
public void setIndex(int index) {
this.index=index;
}
/** Method from NodeSectionPanel interface */
public int getIndex() {
return index;
}
private javax.swing.JButton[] headerButtons;
public void setHeaderActions(Action[] actions) {
headerButtons = new javax.swing.JButton[actions.length];
for (int i=0;i<actions.length;i++) {
headerButtons[i] = new javax.swing.JButton(actions[i]);
headerButtons[i].setMargin(new java.awt.Insets(0,14,0,14));
headerButtons[i].setOpaque(false);
actionPanel.add(headerButtons[i]);
}
}
public javax.swing.JButton[] getHeaderButtons(){
return headerButtons;
}
public boolean isFoldable() {
return foldable;
}
private void setIcon(boolean opened) {
java.awt.Image image=null;
if (opened)
image = (root == null ? null : root.getOpenedIcon(java.beans.BeanInfo.ICON_COLOR_16x16));
else
image = (root == null ? null : root.getIcon(java.beans.BeanInfo.ICON_COLOR_16x16));
if (image != null) {
titleButton.setIcon(new javax.swing.ImageIcon(image));
}
}
}