/******************************************************************************* * Copyright (c) 2004, 2006 Sybase, Inc. 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: *     Sybase, Inc. - initial API and implementation *******************************************************************************/package org.eclipse.jst.jsf.facesconfig.ui.preference;import org.eclipse.core.runtime.Assert;import org.eclipse.jface.dialogs.IDialogConstants;import org.eclipse.jface.preference.FieldEditor;import org.eclipse.jface.preference.PreferenceConverter;import org.eclipse.jface.resource.ColorRegistry;import org.eclipse.jface.resource.JFaceResources;import org.eclipse.jface.resource.StringConverter;import org.eclipse.swt.SWT;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.FontData;import org.eclipse.swt.graphics.RGB;import org.eclipse.swt.layout.GridData;import org.eclipse.swt.widgets.Button;import org.eclipse.swt.widgets.Composite;import org.eclipse.swt.widgets.Control;import org.eclipse.swt.widgets.FontDialog;import org.eclipse.swt.widgets.Label;import org.eclipse.swt.widgets.Text;/** *  * A field editor for a font type preference. *  *//*package*/ class ColorFontFieldEditor extends FieldEditor {	private static final int NUM_CONTROLS_WHEN_PREVIEWER = 4;    private static final int NUM_CONTROLS_WHEN_NO_PREVIEWER = 3;    /**	 * 	 * The change font button, or <code>null</code> if none	 * 	 * (before creation and after disposal).	 * 	 */	private Button changeFontButton = null;	/**	 * 	 * The text for the change font button, or <code>null</code>	 * 	 * if missing.	 * 	 */	private String changeButtonText;	/**	 * 	 * The text for the preview, or <code>null</code> if no preview is desired	 * 	 */	private String previewText;	/**	 * 	 * Font data for the chosen font button, or <code>null</code> if none.	 * 	 */	private FontData[] chosenFont;	/**	 * 	 * Font color for the chosen font	 * 	 */	private RGB fontRGB;	/**	 * 	 * The label that displays the selected font, or <code>null</code> if	 * none.	 * 	 */	private Label valueControl;	/**	 * 	 * The previewer, or <code>null</code> if none.	 * 	 */	private DefaultPreviewer previewer;	/**	 * 	 * Internal font previewer implementation.	 * 	 */	private static class DefaultPreviewer {		private Text text;		private String string;		private Font font;		private Color color;		/**		 * @param s		 * @param parent		 */		public DefaultPreviewer(String s, Composite parent) {			string = s;			text = new Text(parent, SWT.READ_ONLY | SWT.BORDER);			text.addDisposeListener(new DisposeListener() {				public void widgetDisposed(DisposeEvent e) {					if (font != null)						font.dispose();				}			});			if (string != null)				text.setText(string);		}		/**		 * @return the text control		 */		public Control getControl() {			return text;		}		/**		 * @param fontData		 */		public void setFont(FontData[] fontData) {			if (font != null && !font.isDisposed())				font.dispose();			font = new Font(text.getDisplay(), fontData);			text.setFont(font);		}		/**		 * @param fontRGB		 */		public void setRGB(RGB fontRGB) {			if (fontRGB != null) {				if (color != null && !color.isDisposed())					color.dispose();				color = new Color(null, fontRGB);				text.setForeground(color);			}		}		/**		 * @return the preferred extent		 */		public int getPreferredExtent() {			return 40;		}	}	/**	 * 	 * Creates a new font field editor	 * 	 */	protected ColorFontFieldEditor() {        // control instantiation	}	/**	 * 	 * Creates a font field editor with an optional preview area.	 * 	 * 	 * 	 * @param name	 *            the name of the preference this field editor works on	 * 	 * @param labelText	 *            the label text of the field editor	 * 	 * @param previewAreaText	 *            the text used for the preview window. If it is	 * 	 * <code>null</code> there will be no preview area,	 * 	 * @param parent	 *            the parent of the field editor's control	 * 	 */	public ColorFontFieldEditor(	String name,	String labelText,	String previewAreaText,	Composite parent) {		init(name, labelText);		previewText = previewAreaText;		changeButtonText = JFaceResources.getString("openChange"); //$NON-NLS-1$		createControl(parent);	}	/**	 * 	 * Creates a font field editor without a preview.	 * 	 * 	 * 	 * @param name	 *            the name of the preference this field editor works on	 * 	 * @param labelText	 *            the label text of the field editor	 * 	 * @param parent	 *            the parent of the field editor's control	 * 	 */	public ColorFontFieldEditor(String name, String labelText, Composite parent) {		this(name, labelText, null, parent);	}	/*	 * (non-Javadoc)	 * 	 * Method declared on FieldEditor.	 * 	 */	protected void adjustForNumColumns(int numColumns) {		GridData data = new GridData();		if (valueControl.getLayoutData() != null)			data = (GridData) valueControl.getLayoutData();		data.horizontalSpan = numColumns - getNumberOfControls() + 1;		valueControl.setLayoutData(data);	}	/*	 * (non-Javadoc)	 * 	 * Method declared on FieldEditor.	 * 	 */	protected void applyFont() {		if (chosenFont != null && previewer != null)			previewer.setFont(chosenFont);	}	/*	 * (non-Javadoc)	 * 	 * Method declared on FieldEditor.	 * 	 */	protected void doFillIntoGrid(Composite parent, int numColumns) {		getLabelControl(parent);		valueControl = getValueControl(parent);		GridData gd = new GridData(GridData.FILL_HORIZONTAL				| GridData.GRAB_HORIZONTAL);		gd.horizontalSpan = numColumns - getNumberOfControls() + 1;		valueControl.setLayoutData(gd);		if (previewText != null) {			previewer = new DefaultPreviewer(previewText, parent);			gd = new GridData(GridData.FILL_HORIZONTAL);			gd.heightHint = previewer.getPreferredExtent();			gd.widthHint = previewer.getPreferredExtent();			previewer.getControl().setLayoutData(gd);		}		changeFontButton = getChangeControl(parent);		gd = new GridData();		int widthHint = convertHorizontalDLUsToPixels(changeFontButton,				IDialogConstants.BUTTON_WIDTH);		gd.widthHint = Math.max(widthHint, changeFontButton.computeSize(				SWT.DEFAULT, SWT.DEFAULT, true).x);		changeFontButton.setLayoutData(gd);	}	/*	 * (non-Javadoc)	 * 	 * Method declared on FieldEditor.	 * 	 */	protected void doLoad() {		if (changeFontButton == null)			return;		fontRGB = PreferenceConverter.getColor(getPreferenceStore(),				getPreferenceName() + "Color");		updateFont(PreferenceConverter.getFontDataArray(getPreferenceStore(),				getPreferenceName()));	}	/*	 * (non-Javadoc)	 * 	 * Method declared on FieldEditor.	 * 	 */	protected void doLoadDefault() {		if (changeFontButton == null)			return;		updateFont(PreferenceConverter.getDefaultFontDataArray(				getPreferenceStore(), getPreferenceName()));	}	/*	 * (non-Javadoc)	 * 	 * Method declared on FieldEditor.	 * 	 */	protected void doStore() {		if (chosenFont != null) {			PreferenceConverter.setValue(getPreferenceStore(),					getPreferenceName(), chosenFont);		}		if (fontRGB != null) {			PreferenceConverter.setValue(getPreferenceStore(),					getPreferenceName() + "Color", fontRGB);		}	}	/**	 * 	 * Returns the change button for this field editor.	 * 	 * 	 * @param parent 	 * @return the change button	 * 	 */	protected Button getChangeControl(Composite parent) {		if (changeFontButton == null) {			changeFontButton = new Button(parent, SWT.PUSH);			if (changeButtonText != null)				changeFontButton.setText(changeButtonText);			changeFontButton.addSelectionListener(new SelectionAdapter() {				public void widgetSelected(SelectionEvent event) {					FontDialog fontDialog = new FontDialog(changeFontButton							.getShell());					if (chosenFont != null)						fontDialog.setFontList(chosenFont);					if (fontRGB != null)						fontDialog.setRGB(fontRGB);					FontData font = fontDialog.open();					if (font != null) {						FontData[] oldFont = chosenFont;						if (oldFont == null)							oldFont = JFaceResources.getDefaultFont()									.getFontData();						setPresentsDefaultValue(false);						FontData[] newData = new FontData[1];						newData[0] = font;						fontRGB = fontDialog.getRGB();						updateFont(newData);						fireValueChanged(VALUE, oldFont[0], font);					}				}			});			changeFontButton.addDisposeListener(new DisposeListener() {				public void widgetDisposed(DisposeEvent event) {					changeFontButton = null;				}			});			changeFontButton.setFont(parent.getFont());			setButtonLayoutData(changeFontButton);		} else			checkParent(changeFontButton, parent);		return changeFontButton;	}	/*	 * (non-Javadoc)	 * 	 * Method declared on FieldEditor.	 * 	 */	public int getNumberOfControls() {		if (previewer == null)        {			return NUM_CONTROLS_WHEN_NO_PREVIEWER;        }        return NUM_CONTROLS_WHEN_PREVIEWER;	}	/**	 * 	 * Returns the preferred preview height.	 * 	 * 	 * 	 * @return the height, or <code>-1</code> if no previewer	 * 	 * is installed	 * 	 */	public int getPreferredPreviewHeight() {		if (previewer == null)			return -1;		return previewer.getPreferredExtent();	}	/**	 * 	 * Returns the preview control for this field editor.	 * 	 * 	 * 	 * @return the preview control	 * 	 */	public Control getPreviewControl() {		if (previewer == null)			return null;		return previewer.getControl();	}	/**	 * 	 * Returns the value control for this field editor. The value control	 * 	 * displays the currently selected font name.	 * @param parent 	 * 	 * 	 * 	 * @return the value control	 * 	 */	protected Label getValueControl(Composite parent) {		if (valueControl == null) {			valueControl = new Label(parent, SWT.LEFT);			valueControl.setFont(parent.getFont());			valueControl.addDisposeListener(new DisposeListener() {				public void widgetDisposed(DisposeEvent event) {					valueControl = null;				}			});		} else			checkParent(valueControl, parent);		return valueControl;	}	/**	 * 	 * Sets the text of the change button.	 * 	 * 	 * 	 * @param text	 *            the new text	 * 	 */	public void setChangeButtonText(String text) {		Assert.isNotNull(text);		changeButtonText = text;		if (changeFontButton != null)			changeFontButton.setText(text);	}	/**	 * 	 * Updates the change font button and the previewer to reflect the	 * 	 * newly selected font.	 * 	 */	private void updateFont(FontData font[]) {		FontData[] bestFont = JFaceResources.getFontRegistry().filterData(				font, valueControl.getDisplay());		// if we have nothing valid do as best we can		if (bestFont == null)			bestFont = getDefaultFontData();		// Now cache this value in the receiver		this.chosenFont = bestFont;		if (valueControl != null) {			if (fontRGB != null) {				ColorRegistry registry = JFaceResources.getColorRegistry();				Color color = registry.get(fontRGB.toString());				if (color == null) {					registry.put(fontRGB.toString(), fontRGB);					color = registry.get(fontRGB.toString());				}				valueControl.setForeground(color);			}			valueControl.setText(StringConverter.asString(chosenFont[0]));		}		if (previewer != null) {			previewer.setFont(bestFont);		}	}	/**	 * 	 * Store the default preference for the field	 * 	 * being edited	 * 	 */	protected void setToDefault() {		FontData[] defaultFontData = PreferenceConverter				.getDefaultFontDataArray(getPreferenceStore(),						getPreferenceName());		PreferenceConverter.setValue(getPreferenceStore(), getPreferenceName(),				defaultFontData);	}	/**	 * 	 * Get the system default font data.	 * 	 */	private FontData[] getDefaultFontData() {		return valueControl.getDisplay().getSystemFont().getFontData();	}	/*	 * 	 * @see FieldEditor.setEnabled(boolean,Composite).	 * 	 */	public void setEnabled(boolean enabled, Composite parent) {		super.setEnabled(enabled, parent);		getChangeControl(parent).setEnabled(enabled);		getValueControl(parent).setEnabled(enabled);	}}