001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 2004 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.junit;
043:
044: import java.awt.Dimension;
045: import javax.swing.JPanel;
046: import javax.swing.SwingUtilities;
047:
048: /**
049: * Panel that changes its hight automatically if the components inside
050: * it cannot fit in the current size. The panel checks and changes only its
051: * height, not width. The panel changes not only height of its own but also
052: * height of the toplevel <code>Window</code> it is embedded into. The size
053: * change occurs only after this panel's children are <em>painted</em>.
054: * <p>
055: * This panel is supposed to be used as a replacement for a normal
056: * <code>JPanel</code> if this panel contains a wrappable text and the panel
057: * needs to be high enough so that all lines of the possibly wrapped text
058: * can fit.
059: * <p>
060: * This class overrides method <code>paintChildren(Graphics)</code>.
061: * If overriding this method in this subclasses of this class,
062: * call <code>super.paintChildren(...)</code> so that the routine which performs
063: * the size change is not skipped.
064: *
065: * @author Marian Petras
066: */
067: public class SelfResizingPanel extends JPanel {
068:
069: /**
070: * <code>false</code> until this panel's children are painted
071: * for the first time
072: */
073: private boolean painted = false;
074:
075: /** Creates a new instance of SelfResizingPanel */
076: public SelfResizingPanel() {
077: super ();
078: }
079:
080: /**
081: * Paints this panel's children and then displays the initial message
082: * (in the message area) if any.
083: * This method is overridden so that this panel receives a notification
084: * immediately after the children components are painted - it is necessary
085: * for computation of space needed by the message area for displaying
086: * the initial message.
087: * <p>
088: * The first time this method is called, method
089: * {@link #paintedFirstTime is called immediately after
090: * <code>super.paintChildren(..>)</code> finishes.
091: *
092: * @param g the <code>Graphics</code> context in which to paint
093: */
094: protected void paintChildren(java.awt.Graphics g) {
095:
096: /*
097: * This is a hack to make sure that window size adjustment
098: * is not done sooner than the text area is painted.
099: *
100: * The reason is that the window size adjustment routine
101: * needs the text area to compute height necessary for displaying
102: * the given message. But the text area does not return correct
103: * data (Dimension getPreferredSize()) until it is painted.
104: */
105:
106: super .paintChildren(g);
107: if (!painted) {
108: paintedFirstTime(g);
109: painted = true;
110: }
111: }
112:
113: /**
114: * This method is called the first time this panel's children are painted.
115: * By default, this method just calls {@link #adjustWindowSize()}.
116: *
117: * @param g <code>Graphics</code> used to paint this panel's children
118: */
119: protected void paintedFirstTime(java.awt.Graphics g) {
120: SwingUtilities.invokeLater(new Runnable() {
121: public void run() {
122: adjustWindowSize();
123: }
124: });
125: }
126:
127: /**
128: * Checks whether the dialog is large enough for the message (if any)
129: * to be displayed and adjusts the dialogs size if it is too small.
130: * <p>
131: * Note: Resizing the dialog works only once this panel and its children
132: * are {@linkplain #paintChildren(java.awt.Graphics) painted}.
133: */
134: protected void adjustWindowSize() {
135: Dimension currSize = getSize();
136: int currHeight = currSize.height;
137: int prefHeight = getPreferredSize().height;
138: if (currHeight < prefHeight) {
139: int delta = prefHeight - currHeight;
140: java.awt.Window win = SwingUtilities
141: .getWindowAncestor(this );
142: Dimension winSize = win.getSize();
143: win.setSize(winSize.width, winSize.height + delta);
144: }
145: }
146:
147: /**
148: * Has this panel's children been already painted?
149: *
150: * @return <code>true</code> if
151: * {@link #paintChildren #paintChildren(Graphics) has already been
152: * called; <code>false</code> otherwise
153: * @see #paintedFirstTime
154: */
155: protected boolean isPainted() {
156: return painted;
157: }
158:
159: }
|