| /******************************************************************************* |
| * Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) 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: |
| * Soyatec - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.xwt.tools.ui.designer.properties.tabbed.sections; |
| |
| import org.eclipse.xwt.XWTMaps; |
| import org.eclipse.xwt.converters.StringToColor; |
| import org.eclipse.xwt.utils.NamedColorsUtil; |
| import org.eclipse.jface.resource.JFaceResources; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.custom.CCombo; |
| 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.Point; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Event; |
| import org.eclipse.swt.widgets.Listener; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.xwt.tools.ui.designer.dialogs.ColorChooser; |
| |
| /** |
| * @author jliu (jin.liu@soyatec.com) |
| */ |
| public abstract class ColorSection extends AbstractAttributeSection { |
| |
| private Button colorSelector; |
| private CCombo swtColorsCombo; |
| private CCombo namedColorsCombo; |
| private Point fExtent; |
| private Image fImage; |
| |
| private String colorStr; |
| private Color fColor; |
| |
| public ColorSection() { |
| colorStr = defaultColor(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @seeorg.eclipse.xwt.tools.ui.designer.properties.tabbed.sections. |
| * AbstractAttributeSection#createSection(org.eclipse.swt.widgets.Composite) |
| */ |
| protected Control createSection(Composite parent) { |
| Composite control = getWidgetFactory().createComposite(parent); |
| control.setLayout(new GridLayout(3, false)); |
| |
| swtColorsCombo = getWidgetFactory() |
| .createCCombo(control, SWT.READ_ONLY); |
| { |
| GridData gridData = new GridData(GridData.FILL_HORIZONTAL |
| | GridData.GRAB_HORIZONTAL); |
| gridData.widthHint = 100; |
| swtColorsCombo.setLayoutData(gridData); |
| } |
| swtColorsCombo.setItems(XWTMaps.getColorKeys().toArray(new String[0])); |
| swtColorsCombo.addListener(SWT.Selection, this); |
| |
| namedColorsCombo = getWidgetFactory().createCCombo(control, |
| SWT.READ_ONLY); |
| { |
| GridData gridData = new GridData(GridData.FILL_HORIZONTAL |
| | GridData.GRAB_HORIZONTAL); |
| gridData.widthHint = 100; |
| namedColorsCombo.setLayoutData(gridData); |
| } |
| namedColorsCombo.setItems(NamedColorsUtil.getColorNames()); |
| namedColorsCombo.addListener(SWT.Selection, this); |
| |
| colorSelector = getWidgetFactory().createButton(control, "", SWT.NONE); |
| fExtent = computeImageSize(parent); |
| fImage = new Image(parent.getDisplay(), fExtent.x, fExtent.y); |
| GC gc = new GC(fImage); |
| gc.setBackground(colorSelector.getBackground()); |
| gc.fillRectangle(0, 0, fExtent.x, fExtent.y); |
| gc.dispose(); |
| colorSelector.setImage(fImage); |
| colorSelector.addListener(SWT.Selection, this); |
| colorSelector.addListener(SWT.Dispose, new Listener() { |
| public void handleEvent(Event event) { |
| if (fImage != null) { |
| fImage.dispose(); |
| } |
| } |
| }); |
| return control; |
| } |
| |
| protected void updateColorImage() { |
| if (colorSelector == null || colorSelector.isDisposed()) { |
| return; |
| } |
| |
| Display display = colorSelector.getDisplay(); |
| if (fImage != null) { |
| fImage.dispose(); |
| } |
| fImage = new Image(display, fExtent.x, fExtent.y); |
| GC gc = new GC(fImage); |
| gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK)); |
| gc.drawRectangle(0, 2, fExtent.x - 1, fExtent.y - 4); |
| fColor = (Color) StringToColor.instance.convert(colorStr); |
| if (fColor != null && !fColor.isDisposed()) { |
| gc.setBackground(fColor); |
| } |
| gc.fillRectangle(1, 3, fExtent.x - 2, fExtent.y - 5); |
| gc.dispose(); |
| colorSelector.setImage(fImage); |
| } |
| |
| public void doRefresh() { |
| colorStr = getValue(); |
| if (colorStr == null) { |
| colorStr = defaultColor(); |
| if (namedColorsCombo != null && !namedColorsCombo.isDisposed()) { |
| namedColorsCombo.setText(""); |
| } |
| if (swtColorsCombo != null && !swtColorsCombo.isDisposed()) { |
| swtColorsCombo.setText(""); |
| } |
| } else { |
| if (swtColorsCombo != null && !swtColorsCombo.isDisposed() |
| && swtColorsCombo.indexOf(colorStr) != -1) { |
| swtColorsCombo.removeListener(SWT.Selection, this); |
| swtColorsCombo.select(swtColorsCombo.indexOf(colorStr)); |
| swtColorsCombo.addListener(SWT.Selection, this); |
| namedColorsCombo.setText(""); |
| } |
| if (namedColorsCombo != null && !namedColorsCombo.isDisposed() |
| && namedColorsCombo.indexOf(colorStr) != -1) { |
| namedColorsCombo.removeListener(SWT.Selection, this); |
| namedColorsCombo.select(namedColorsCombo.indexOf(colorStr)); |
| namedColorsCombo.addListener(SWT.Selection, this); |
| swtColorsCombo.setText(""); |
| } |
| } |
| updateColorImage(); |
| } |
| |
| 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; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @seeorg.eclipse.xwt.tools.ui.designer.properties.tabbed.sections. |
| * AbstractAttributeSection#getNewValue() |
| */ |
| protected String getNewValue(Event event) { |
| if (event.widget == colorSelector) { |
| colorStr = chooseColor(); |
| } else if (event.widget == swtColorsCombo) { |
| colorStr = swtColorsCombo.getItem(swtColorsCombo |
| .getSelectionIndex()); |
| namedColorsCombo.setText(""); |
| } else if (event.widget == namedColorsCombo) { |
| colorStr = namedColorsCombo.getItem(namedColorsCombo |
| .getSelectionIndex()); |
| swtColorsCombo.setText(""); |
| } |
| updateColorImage(); |
| return colorStr; |
| } |
| |
| private String chooseColor() { |
| ColorChooser chooser = new ColorChooser(new Shell(), colorStr); |
| if (chooser.open() == Window.OK) { |
| return chooser.getColor(); |
| } |
| return colorStr; |
| } |
| |
| protected abstract String defaultColor(); |
| } |