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 1997-2006 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: * TabData.java
042: *
043: * Created on May 26, 2003, 3:54 PM
044: */
045:
046: package org.netbeans.swing.tabcontrol;
047:
048: import javax.swing.*;
049: import java.awt.*;
050:
051: /**
052: * Class representing data needed to represent a component in a tab. While
053: * immutable to client code, changes to the data model may change the values
054: * returned by the methods of this class. TabData objects are the data
055: * component of TabDataModel.
056: * <p/>
057: * TabData objects implement their <code>equals()</code> and
058: * <code>hashCode</code> contract based on the equality of the user object and
059: * the text. The icon and the tooltip text are not considered when testing
060: * equality.
061: *
062: * @author Tim Boudreau
063: * @see TabDataModel
064: * @see DefaultTabDataModel
065: */
066: public final class TabData implements Comparable {
067: //Fields below are intentionally package-private, not private.
068: Icon icon;
069: String txt;
070: String tip;
071: Object userObject;
072:
073: /**
074: * Create a new TabData object.
075: *
076: * @param userObject The object or component that should be displayed when
077: * the tab is selected. For use in TabbedContainer, this
078: * should be an instance of <code>java.awt.Component</code>
079: * @param i The icon for the tab
080: * @param caption The caption for the tab
081: * @param tooltip The tooltip for the tab
082: */
083: public TabData(Object userObject, Icon i, String caption,
084: String tooltip) {
085: this .userObject = userObject;
086: icon = i;
087: txt = caption;
088: tip = tooltip;
089: }
090:
091: public Object getUserObject() {
092: return userObject;
093: }
094:
095: /**
096: * The component for the tab. Returns null if the user object is not an
097: * instance of Component.
098: *
099: * @return The component
100: */
101: public Component getComponent() {
102: if (userObject instanceof Component) {
103: return (Component) userObject;
104: } else {
105: return null;
106: }
107: }
108:
109: /**
110: * The icon for the tab. Note that this method is guaranteed to return
111: * non-null - if the icon specified is null, a 0-width, 0-height icon whose
112: * paintIcon method is a no-op will be returned.
113: *
114: * @return The icon
115: */
116: public Icon getIcon() {
117: if (icon == null) {
118: return NO_ICON;
119: } else {
120: return icon;
121: }
122: }
123:
124: /**
125: * The text for the tab
126: *
127: * @return The text
128: */
129: public String getText() {
130: return txt;
131: }
132:
133: /**
134: * The tooltip for the tab
135: *
136: * @return The tooltip text
137: */
138: public String getTooltip() {
139: return tip;
140: }
141:
142: /**
143: * Get a string representation of this object
144: *
145: * @return String representation of this object
146: */
147: public String toString() {
148: return txt;
149: }
150:
151: /**
152: * Returns true if the text and component properties of this TabData object
153: * match the passed one. Tooltip and icon equality are not evaluated.
154: */
155: public boolean equals(Object o) {
156: if (o == this )
157: return true;
158: if (o instanceof TabData) {
159: TabData td = (TabData) o;
160: boolean result = td.userObject.equals(userObject)
161: && td.txt.equals(txt);
162: return result;
163: } else {
164: return false;
165: }
166: }
167:
168: /**
169: * Munges the text and component hash codes
170: */
171: public int hashCode() {
172: return (txt == null ? 0 : txt.hashCode())
173: ^ (userObject == null ? 0 : userObject.hashCode());
174: }
175:
176: /**
177: * Compares the text based on java.lang.String's implementation of
178: * Comparable.
179: */
180: public int compareTo(Object o) {
181: String arg1, arg2;
182: arg1 = getText();
183: if (o instanceof TabData) {
184: arg2 = ((TabData) o).getText();
185: } else {
186: arg2 = null;
187: }
188: if (arg2 == null) {
189: if (arg1 == null) {
190: // both with null-name, equal
191: return 0;
192: } else {
193: // any name before null-name
194: return 1;
195: }
196: } else {
197: if (arg1 == null) {
198: // null-name after any name
199: return -1;
200: } else {
201: // compare by names
202: return arg1.compareTo(arg2);
203: }
204: }
205: }
206:
207: /**
208: * An empty icon to be used when null is passed for the icon - internally we
209: * don't support null icons, but Components may legally have them
210: */
211: static final Icon NO_ICON = new Icon() {
212: public int getIconHeight() {
213: return 0;
214: }
215:
216: public int getIconWidth() {
217: return 0;
218: }
219:
220: public void paintIcon(Component c, Graphics g, int x, int y) {
221: }
222:
223: public String toString() {
224: return "empty icon";
225: }; //NOI18N
226: };
227: }
|