001 /*
002 * $Id: JXTaskPaneContainer.java 3038 2008-08-22 18:24:45Z kschaefe $
003 *
004 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
005 * Santa Clara, California 95054, U.S.A. All rights reserved.
006 *
007 * This library is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * This library is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this library; if not, write to the Free Software
019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
020 */
021 package org.jdesktop.swingx;
022
023 import java.awt.event.ContainerAdapter;
024 import java.awt.event.ContainerEvent;
025
026 import javax.swing.JViewport;
027 import javax.swing.Scrollable;
028
029 import org.jdesktop.swingx.plaf.LookAndFeelAddons;
030 import org.jdesktop.swingx.plaf.TaskPaneContainerAddon;
031 import org.jdesktop.swingx.plaf.TaskPaneContainerUI;
032
033 /**
034 * <code>JXTaskPaneContainer</code> provides an elegant view
035 * to display a list of tasks ordered by groups ({@link org.jdesktop.swingx.JXTaskPane}s).
036 *
037 * <p>
038 * Although {@link org.jdesktop.swingx.JXTaskPane} can be added to any other
039 * container, the <code>JXTaskPaneContainer</code> will provide better
040 * fidelity when it comes to matching the look and feel of the host operating
041 * system than any other panel. As example, when using on a Windows platform,
042 * the <code>JXTaskPaneContainer</code> will be painted with a light gradient
043 * background. Also <code>JXTaskPaneContainer</code> takes care of using the
044 * right {@link java.awt.LayoutManager} (as required by
045 * {@link org.jdesktop.swingx.JXCollapsiblePane}) so that
046 * {@link org.jdesktop.swingx.JXTaskPane} behaves correctly when collapsing and
047 * expanding its content.
048 *
049 * <p>
050 * <code>JXTaskPaneContainer<code> can be added to a JScrollPane.
051 *
052 * <p>
053 * Example:
054 * <pre>
055 * <code>
056 * JXFrame frame = new JXFrame();
057 *
058 * // a container to put all JXTaskPane together
059 * JXTaskPaneContainer taskPaneContainer = new JXTaskPaneContainer();
060 *
061 * // add JXTaskPanes to the container
062 * JXTaskPane actionPane = createActionPane();
063 * JXTaskPane miscActionPane = createMiscActionPane();
064 * JXTaskPane detailsPane = createDetailsPane();
065 * taskPaneContainer.add(actionPane);
066 * taskPaneContainer.add(miscActionPane);
067 * taskPaneContainer.add(detailsPane);
068 *
069 * // put the action list on the left in a JScrollPane
070 * // as we have several taskPane and we want to make sure they
071 * // all get visible.
072 * frame.add(new JScrollPane(taskPaneContainer), BorderLayout.EAST);
073 *
074 * // and a file browser in the middle
075 * frame.add(fileBrowser, BorderLayout.CENTER);
076 *
077 * frame.pack().
078 * frame.setVisible(true);
079 * </code>
080 * </pre>
081 *
082 * @author <a href="mailto:fred@L2FProd.com">Frederic Lavigne</a>
083 *
084 * @javabean.attribute
085 * name="isContainer"
086 * value="Boolean.TRUE"
087 * rtexpr="true"
088 *
089 * @javabean.class
090 * name="JXTaskPaneContainer"
091 * shortDescription="A component that contains JTaskPaneGroups."
092 * stopClass="java.awt.Component"
093 *
094 * @javabean.icons
095 * mono16="JXTaskPaneContainer16-mono.gif"
096 * color16="JXTaskPaneContainer16.gif"
097 * mono32="JXTaskPaneContainer32-mono.gif"
098 * color32="JXTaskPaneContainer32.gif"
099 */
100 public class JXTaskPaneContainer extends JXPanel {
101
102 public final static String uiClassID = "swingx/TaskPaneContainerUI";
103
104 // ensure at least the default ui is registered
105 static {
106 LookAndFeelAddons.contribute(new TaskPaneContainerAddon());
107 }
108
109 /**
110 * Creates a new empty taskpane.
111 */
112 public JXTaskPaneContainer() {
113 super(null);
114 updateUI();
115
116 addContainerListener(new ContainerAdapter() {
117 public void componentRemoved(ContainerEvent e) {
118 repaint();
119 }
120 });
121 }
122
123 /**
124 * {@inheritDoc}
125 */
126 public TaskPaneContainerUI getUI() {
127 return (TaskPaneContainerUI) super.getUI();
128 }
129
130 /**
131 * Notification from the <code>UIManager</code> that the L&F has changed.
132 * Replaces the current UI object with the latest version from the <code>UIManager</code>.
133 *
134 * @see javax.swing.JComponent#updateUI
135 */
136 public void updateUI() {
137 setUI((TaskPaneContainerUI)LookAndFeelAddons.getUI(this, TaskPaneContainerUI.class));
138 }
139
140 /**
141 * Sets the L&F object that renders this component.
142 *
143 * @param ui the <code>TaskPaneContainerUI</code> L&F object
144 * @see javax.swing.UIDefaults#getUI
145 *
146 * @beaninfo bound: true hidden: true description: The UI object that
147 * implements the taskpane's LookAndFeel.
148 */
149 public void setUI(TaskPaneContainerUI ui) {
150 super.setUI(ui);
151 }
152
153 /**
154 * Returns the name of the L&F class that renders this component.
155 *
156 * @return the string {@link #uiClassID}
157 * @see javax.swing.JComponent#getUIClassID
158 * @see javax.swing.UIDefaults#getUI
159 */
160 public String getUIClassID() {
161 return uiClassID;
162 }
163
164 /**
165 * Adds a <code>JXTaskPane</code> to this JXTaskPaneContainer.
166 *
167 * @param group
168 */
169 public void add(JXTaskPane group) {
170 super.add(group);
171 }
172
173 /**
174 * Removes a <code>JXTaskPane</code> from this JXTaskPaneContainer.
175 *
176 * @param group
177 */
178 public void remove(JXTaskPane group) {
179 super.remove(group);
180 }
181
182 /**
183 * @see Scrollable#getScrollableTracksViewportHeight()
184 */
185 public boolean getScrollableTracksViewportHeight() {
186 if (getParent() instanceof JViewport) {
187 return (((JViewport)getParent()).getHeight() > getPreferredSize().height);
188 } else {
189 return false;
190 }
191 }
192
193 /**
194 * @see Scrollable#getScrollableTracksViewportWidth()
195 */
196 public boolean getScrollableTracksViewportWidth() {
197 return true;
198 }
199 }