Java tutorial
/******************************************************************************* * Copyright (c) 2000, 2013 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package chuck.terran.admin.ui.jface; import jo.util.ui.ctrl.LineAttributesSwath; import org.eclipse.core.commands.common.EventManager; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.accessibility.AccessibleAdapter; import org.eclipse.swt.accessibility.AccessibleEvent; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.LineAttributes; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; /** * The <code>LineSelector</code> is a wrapper for a button that displays a * selected <code>Color</code> and allows the user to change the selection. */ public class LineSelector extends EventManager { /** * Property name that signifies the selected color of this * <code>LineSelector</code> has changed. * * @since 3.0 */ public static final String PROP_LINECHANGE = "lineValue"; //$NON-NLS-1$ private Button fButton; private LineAttributes fLineValue; private Point fExtent; private Image fImage; private Color fFGColor; private Color fBGColor; /** * Create a new instance of the reciever and the button that it wrappers in * the supplied parent <code>Composite</code>. * * @param parent * The parent of the button. */ public LineSelector(Composite parent) { fButton = new Button(parent, SWT.PUSH); fFGColor = fButton.getDisplay().getSystemColor(SWT.COLOR_BLACK); fBGColor = fButton.getDisplay().getSystemColor(SWT.COLOR_WHITE); fExtent = computeImageSize(parent); fImage = new Image(parent.getDisplay(), fExtent.x, fExtent.y); GC gc = new GC(fImage); gc.setBackground(fButton.getBackground()); gc.fillRectangle(0, 0, fExtent.x, fExtent.y); gc.dispose(); fButton.setImage(fImage); fButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { open(); } }); fButton.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent event) { if (fImage != null) { fImage.dispose(); fImage = null; } } }); fButton.getAccessible().addAccessibleListener(new AccessibleAdapter() { @Override public void getName(AccessibleEvent e) { e.result = JFaceResources.getString("LineSelector.Name"); //$NON-NLS-1$ } }); } /** * Adds a property change listener to this <code>LineSelector</code>. * Events are fired when the color in the control changes via the user * clicking an selecting a new one in the color dialog. No event is fired in * the case where <code>setColorValue(RGB)</code> is invoked. * * @param listener * a property change listener * @since 3.0 */ public void addListener(IPropertyChangeListener listener) { addListenerObject(listener); } /** * Compute the size of the image to be displayed. * * @param window - * the window used to calculate * @return <code>Point</code> */ private Point computeImageSize(Control window) { GC gc = new GC(window); Font f = JFaceResources.getFontRegistry().get(JFaceResources.DIALOG_FONT); gc.setFont(f); int height = gc.getFontMetrics().getHeight(); gc.dispose(); Point p = new Point(height * 3 - 6, height); return p; } /** * Get the button control being wrappered by the selector. * * @return <code>Button</code> */ public Button getButton() { return fButton; } /** * Return the currently displayed color. * * @return <code>RGB</code> */ public LineAttributes getLineValue() { return fLineValue; } /** * Removes the given listener from this <code>LineSelector</code>. Has * no effect if the listener is not registered. * * @param listener * a property change listener * @since 3.0 */ public void removeListener(IPropertyChangeListener listener) { removeListenerObject(listener); } /** * Set the current color value and update the control. * * @param rgb * The new color. */ public void setLineValue(LineAttributes rgb) { fLineValue = rgb; updateLineImage(); } /** * Set whether or not the button is enabled. * * @param state * the enabled state. */ public void setEnabled(boolean state) { getButton().setEnabled(state); } /** * Update the image being displayed on the button using the current color * setting. */ protected void updateLineImage() { GC gc = new GC(fImage); LineAttributesSwath.paintSwath(gc, fImage.getBounds(), fFGColor, fBGColor, fLineValue); gc.dispose(); fButton.setImage(fImage); } /** * Activate the editor for this selector. This causes the color selection * dialog to appear and wait for user input. * * @since 3.2 */ public void open() { LineDialog lineDialog = new LineDialog(fButton.getShell()); lineDialog.setAttributes(fLineValue); LineAttributes newLine = lineDialog.openDialog(); if (newLine != null) { LineAttributes oldValue = fLineValue; fLineValue = newLine; final Object[] finalListeners = getListeners(); if (finalListeners.length > 0) { PropertyChangeEvent pEvent = new PropertyChangeEvent(this, PROP_LINECHANGE, oldValue, newLine); for (int i = 0; i < finalListeners.length; ++i) { IPropertyChangeListener listener = (IPropertyChangeListener) finalListeners[i]; listener.propertyChange(pEvent); } } updateLineImage(); } } public Color getFGColor() { return fFGColor; } public void setFGColor(Color fFGColor) { this.fFGColor = fFGColor; updateLineImage(); } public Color getBGColor() { return fBGColor; } public void setBGColor(Color fBGColor) { this.fBGColor = fBGColor; updateLineImage(); } }