blob: 1f44b689fa1c191a9b2ac1dba8ede9bb1d2833a4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Laurent CARON.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Laurent CARON (laurent.caron@gmail.com) - initial API and implementation
*******************************************************************************/
package org.mihalis.opal.titledSeparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Listener;
import org.mihalis.opal.utils.SWTGraphicUtil;
/**
* Instances of this class provide a separator with a title and/or an image.
* <p>
* <dl>
* <dt><b>Styles:</b></dt>
* <dd>BORDER</dd>
* <dt><b>Events:</b></dt>
* <dd>(none)</dd>
* </dl>
* </p>
*/
public class TitledSeparator extends Composite {
/** The alignment. */
private int alignment;
/** The image. */
private Image image;
/** The text. */
private String text;
/**
* Constructs a new instance of this class given its parent and a style
* value describing its behavior and appearance.
* <p>
* The style value is either one of the style constants defined in class
* <code>SWT</code> which is applicable to instances of this class, or must
* be built by <em>bitwise OR</em>'ing together (that is, using the
* <code>int</code> "|" operator) two or more of those <code>SWT</code>
* style constants. The class description lists the style constants that are
* applicable to the class. Style bits are also inherited from superclasses.
* </p>
*
* @param parent a composite control which will be the parent of the new
* instance (cannot be null)
* @param style the style of control to construct
*
* @exception IllegalArgumentException <ul>
* <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
* </ul>
* @exception SWTException <ul>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
* thread that created the parent</li>
* </ul>
*
*/
public TitledSeparator(final Composite parent, final int style) {
super(parent, style);
this.alignment = SWT.LEFT;
final Color originalColor = new Color(getDisplay(), 0, 88, 150);
setForeground(originalColor);
final Font originalFont;
final FontData[] fontData = getFont().getFontData();
if (fontData != null && fontData.length > 0) {
final FontData fd = fontData[0];
fd.setStyle(SWT.BOLD);
originalFont = new Font(getDisplay(), fd);
setFont(originalFont);
} else {
originalFont = null;
}
this.addListener(SWT.Resize, new Listener() {
@Override
public void handleEvent(final Event event) {
redrawComposite();
}
});
SWTGraphicUtil.addDisposer(this, originalColor);
SWTGraphicUtil.addDisposer(this, originalFont);
}
/**
* Redraw the composite.
*/
private void redrawComposite() {
// Dispose previous content
for (final Control c : this.getChildren()) {
c.dispose();
}
int numberOfColumns = 1;
if (this.text != null) {
numberOfColumns++;
}
if (this.image != null) {
numberOfColumns++;
}
if (this.alignment == SWT.CENTER) {
numberOfColumns++;
}
super.setLayout(new GridLayout(numberOfColumns, false));
createContent();
}
/**
* Create the content.
*/
private void createContent() {
switch (this.alignment) {
case SWT.CENTER:
createSeparator();
createTitle();
createSeparator();
break;
case SWT.LEFT:
createTitle();
createSeparator();
break;
default:
createSeparator();
createTitle();
break;
}
}
/**
* Create a separator.
*/
private void createSeparator() {
final Label separator = new Label(this, SWT.SEPARATOR | SWT.HORIZONTAL);
separator.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
separator.setBackground(getBackground());
}
/**
* Create the title.
*/
private void createTitle() {
if (this.image != null) {
final Label imageLabel = createLabel();
imageLabel.setImage(this.image);
}
if (this.text != null && !this.text.trim().equals("")) {
final Label textLabel = createLabel();
textLabel.setText(this.text);
}
}
/**
* Creates the label.
*
* @return a SWT label
*/
private Label createLabel() {
final Label label = new Label(this, SWT.NONE);
label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
label.setFont(getFont());
label.setForeground(getForeground());
label.setBackground(getBackground());
return label;
}
/**
* Sets the layout.
*
* @param layout the new layout
* @see org.eclipse.swt.widgets.Composite#setLayout(org.eclipse.swt.widgets.Layout)
*/
@Override
public void setLayout(final Layout layout) {
throw new UnsupportedOperationException("Not supported");
}
/**
* Returns a value which describes the position of the text or image in the
* receiver. The value will be one of <code>LEFT</code>, <code>RIGHT</code>
* or <code>CENTER</code>.
*
* @return the alignment
*
* @exception SWTException <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been
* disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
* thread that created the receiver</li>
* </ul>
*/
public int getAlignment() {
checkWidget();
return this.alignment;
}
/**
* Returns the receiver's image if it has one, or null if it does not.
*
* @return the receiver's image
*
* @exception SWTException <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been
* disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
* thread that created the receiver</li>
* </ul>
*/
public Image getImage() {
checkWidget();
return this.image;
}
/**
* Returns the receiver's text.
*
* @return the receiver's text
*
* @exception SWTException <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been
* disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
* thread that created the receiver</li>
* </ul>
*/
public String getText() {
checkWidget();
return this.text;
}
/**
* Controls how text will be displayed in the receiver. The argument should
* be one of <code>LEFT</code>, <code>RIGHT</code> or <code>CENTER</code>.
*
* @param alignment the new alignment
*
* @exception SWTException <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been
* disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
* thread that created the receiver</li>
* </ul>
*/
public void setAlignment(final int alignment) {
checkWidget();
this.alignment = alignment;
}
/**
* Sets the receiver's image to the argument, which may be null indicating
* that no image should be displayed.
*
* @param image the image to display on the receiver (may be null)
*
* @exception IllegalArgumentException <ul>
* <li>ERROR_INVALID_ARGUMENT - if the image has been
* disposed</li>
* </ul>
* @exception SWTException <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been
* disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
* thread that created the receiver</li>
* </ul>
*/
public void setImage(final Image image) {
checkWidget();
this.image = image;
}
/**
* Sets the receiver's text.
*
* @param text the new text
* @exception IllegalArgumentException <ul>
* <li>ERROR_NULL_ARGUMENT - if the text is null</li>
* </ul>
* @exception SWTException <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been
* disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
* thread that created the receiver</li>
* </ul>
*/
public void setText(final String text) {
checkWidget();
this.text = text;
}
}