001 /* 002 * $Id: JXTitledSeparator.java,v 1.2 2006/05/14 15:55:55 dmouse Exp $ 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 022 package org.jdesktop.swingx; 023 024 import java.awt.Color; 025 import java.awt.Dimension; 026 import java.awt.GridBagConstraints; 027 import java.awt.GridBagLayout; 028 import java.awt.Insets; 029 import javax.swing.Box; 030 import javax.swing.Icon; 031 import javax.swing.JLabel; 032 import javax.swing.JSeparator; 033 import javax.swing.SwingConstants; 034 import javax.swing.UIManager; 035 036 /** 037 * <p>A simple horizontal separator that contains a title.<br/> 038 * <img src="http://www.jgui.com/SwingLabs/SwingX/JXTitledSeparator/JXTitledSeparator.png"/></p> 039 * 040 * <p>JXTitledSeparator allows you to specify the title via the #setTitle method. 041 * The title alignment may be specified by using the #setHorizontalAlignment 042 * method, and accepts all the same arguments as the JLabel#setHorizontalAlignment 043 * method.</p> 044 * 045 * <p>In addition, you may specify an Icon to use with this separator. The icon 046 * will appear "leading" the title (on the left in left-to-right languages, 047 * on the right in right-to-left languages). To change the position of the 048 * title with respect to the icon, call #setHorizontalTextPosition.</p> 049 * 050 * <p>The default font and color of the title comes from the LookAndFeel, mimicking 051 * the font and color of the TitledBorder</p> 052 * 053 * <p>Here are a few example code snippets: 054 * <pre><code> 055 * //create a plain separator 056 * JXTitledSeparator sep = new JXTitledSeparator(); 057 * sep.setText("Customer Info"); 058 * 059 * //create a separator with an icon 060 * sep = new JXTitledSeparator(); 061 * sep.setText("Customer Info"); 062 * sep.setIcon(new ImageIcon("myimage.png")); 063 * 064 * //create a separator with an icon to the right of the title, 065 * //center justified 066 * sep = new JXTitledSeparator(); 067 * sep.setText("Customer Info"); 068 * sep.setIcon(new ImageIcon("myimage.png")); 069 * sep.setHorizontalAlignment(SwingConstants.CENTER); 070 * sep.setHorizontalTextPosition(SwingConstants.TRAILING); 071 * </code></pre> 072 * 073 * @author rbair 074 */ 075 public class JXTitledSeparator extends JXPanel { 076 /** 077 * Implementation detail: the label used to display the title 078 */ 079 private JLabel label; 080 /** 081 * Implementation detail: a separator to use on the left of the 082 * title if alignment is centered or right justified 083 */ 084 private JSeparator leftSeparator; 085 /** 086 * Implementation detail: a separator to use on the right of the 087 * title if alignment is centered or left justified 088 */ 089 private JSeparator rightSeparator; 090 091 /** 092 * Creates a new instance of JXSeparator. The default title is simply 093 * and empty string. Default justification is LEADING, and the default 094 * horizontal text position is TRAILING (title follows icon) 095 */ 096 public JXTitledSeparator() { 097 setLayout(new GridBagLayout()); 098 099 label = new JLabel(""); 100 leftSeparator = new JSeparator(); 101 rightSeparator = new JSeparator(); 102 103 layoutSeparator(); 104 105 Dimension prefSize = getPreferredSize(); 106 prefSize.width = Math.max(prefSize.width, 50); 107 setPreferredSize(prefSize); 108 109 label.setForeground(UIManager.getColor("TitledBorder.titleColor")); 110 label.setFont(UIManager.getFont("TitledBorder.font")); 111 } 112 113 /** 114 * Implementation detail. lays out this component, showing/hiding components 115 * as necessary. Actually changes the containment (removes and adds components). 116 * JXTitledSeparator is treated as a single component rather than a container. 117 */ 118 private void layoutSeparator() { 119 removeAll(); 120 121 switch (label.getHorizontalAlignment()) { 122 case SwingConstants.LEFT: 123 case SwingConstants.LEADING: 124 case SwingConstants.WEST: 125 add(label, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0)); 126 add(Box.createHorizontalStrut(3), new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0)); 127 add(rightSeparator, new GridBagConstraints(2, 0, 1, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0), 0, 0)); 128 break; 129 case SwingConstants.RIGHT: 130 case SwingConstants.TRAILING: 131 case SwingConstants.EAST: 132 add(rightSeparator, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0), 0, 0)); 133 add(Box.createHorizontalStrut(3), new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0)); 134 add(label, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0)); 135 break; 136 case SwingConstants.CENTER: 137 default: 138 add(leftSeparator, new GridBagConstraints(0, 0, 1, 1, 0.5, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0), 0, 0)); 139 add(Box.createHorizontalStrut(3), new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0)); 140 add(label, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0)); 141 add(Box.createHorizontalStrut(3), new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0)); 142 add(rightSeparator, new GridBagConstraints(4, 0, 1, 1, 0.5, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0), 0, 0)); 143 } 144 } 145 146 /** 147 * Sets the title for the separator. This may be simple html, or plain 148 * text. 149 * 150 * @param title the new title. Any string input is acceptable 151 */ 152 public void setTitle(String title) { 153 String old = getTitle(); 154 label.setText(title); 155 firePropertyChange("title", old, getTitle()); 156 } 157 158 /** 159 * @return the title being used for this JXTitledSeparator. This will be 160 * the raw title text, and so may include html tags etc if they 161 * were so specified in #setTitle. 162 */ 163 public String getTitle() { 164 return label.getText(); 165 } 166 167 /** 168 * Sets the alignment of the title along the X axis. If left/leading, then 169 * the title will lead the separator (in left-to-right languages, 170 * the title will be to the left and the separator to the right). If centered, 171 * then a separator will be to the left, followed by the titled (centered), 172 * followed by a separator to the right. Right/trailing will have the title 173 * on the right with a separator to its left. 174 * 175 * @param alignment One of the following constants 176 * defined in <code>SwingConstants</code>: 177 * <code>LEFT</code>, 178 * <code>CENTER</code>, 179 * <code>RIGHT</code>, 180 * <code>LEADING</code> (the default) or 181 * <code>TRAILING</code>. 182 * 183 * @see SwingConstants 184 * @see #getHorizontalAlignment 185 */ 186 public void setHorizontalAlignment(int alignment) { 187 int old = getHorizontalAlignment(); 188 label.setHorizontalAlignment(alignment); 189 if (old != getHorizontalAlignment()) { 190 layoutSeparator(); 191 } 192 firePropertyChange("horizontalAlignment", old, getHorizontalAlignment()); 193 } 194 195 /** 196 * Returns the alignment of the title contents along the X axis. 197 * 198 * @return The value of the horizontalAlignment property, one of the 199 * following constants defined in <code>SwingConstants</code>: 200 * <code>LEFT</code>, 201 * <code>CENTER</code>, 202 * <code>RIGHT</code>, 203 * <code>LEADING</code> or 204 * <code>TRAILING</code>. 205 * 206 * @see #setHorizontalAlignment 207 * @see SwingConstants 208 */ 209 public int getHorizontalAlignment() { 210 return label.getHorizontalAlignment(); 211 } 212 213 /** 214 * Sets the horizontal position of the title's text, 215 * relative to the icon. 216 * 217 * @param position One of the following constants 218 * defined in <code>SwingConstants</code>: 219 * <code>LEFT</code>, 220 * <code>CENTER</code>, 221 * <code>RIGHT</code>, 222 * <code>LEADING</code>, or 223 * <code>TRAILING</code> (the default). 224 * @exception IllegalArgumentException 225 */ 226 public void setHorizontalTextPosition(int position) { 227 int old = getHorizontalTextPosition(); 228 label.setHorizontalTextPosition(position); 229 firePropertyChange("horizontalTextPosition", old, getHorizontalTextPosition()); 230 } 231 232 /** 233 * Returns the horizontal position of the title's text, 234 * relative to the icon. 235 * 236 * @return One of the following constants 237 * defined in <code>SwingConstants</code>: 238 * <code>LEFT</code>, 239 * <code>CENTER</code>, 240 * <code>RIGHT</code>, 241 * <code>LEADING</code> or 242 * <code>TRAILING</code>. 243 * 244 * @see SwingConstants 245 */ 246 public int getHorizontalTextPosition() { 247 return label.getHorizontalTextPosition(); 248 } 249 250 /** 251 * Defines the icon this component will display. If 252 * the value of icon is null, nothing is displayed. 253 * <p> 254 * The default value of this property is null. 255 * 256 * @see #setHorizontalTextPosition 257 * @see #getIcon 258 */ 259 public void setIcon(Icon icon) { 260 Icon old = getIcon(); 261 label.setIcon(icon); 262 firePropertyChange("icon", old, getIcon()); 263 } 264 265 /** 266 * Returns the graphic image (glyph, icon) that the JXTitledSeparator displays. 267 * 268 * @return an Icon 269 * @see #setIcon 270 */ 271 public Icon getIcon() { 272 return label.getIcon(); 273 } 274 275 /** 276 * @inheritDoc 277 * Passes the foreground on to the label 278 */ 279 @Override 280 public void setForeground(Color foreground) { 281 if (label != null) { 282 label.setForeground(foreground); 283 } 284 super.setForeground(foreground); 285 } 286 }