/**
* Copyright (c) 2010-2012 ISBAN S.L
*
* 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:
* Ruben De Dios (ISBAN S.L)
* Andrez Alvarez Mattos (ISBAN S.L)
*/
package org.eclipse.gmf.tooling.simplemap.diagram.properties.figure;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.util.EContentsEList;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.gmf.gmfgraph.BasicFont;
import org.eclipse.gmf.gmfgraph.Color;
import org.eclipse.gmf.gmfgraph.Figure;
import org.eclipse.gmf.gmfgraph.FigureDescriptor;
import org.eclipse.gmf.gmfgraph.FontStyle;
import org.eclipse.gmf.gmfgraph.GMFGraphPackage;
import org.eclipse.gmf.gmfgraph.RGBColor;
import org.eclipse.gmf.gmfgraph.Shape;
import org.eclipse.gmf.gmfgraph.provider.GMFGraphItemProviderAdapterFactory;
import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.gmf.runtime.diagram.ui.internal.util.FontHelper;
import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;
import org.eclipse.gmf.runtime.diagram.ui.properties.internal.l10n.DiagramUIPropertiesImages;
import org.eclipse.gmf.runtime.diagram.ui.properties.sections.appearance.ColorPalettePopup;
import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
import org.eclipse.gmf.tooling.simplemap.diagram.properties.AbstractExtendedPropertiesSection;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleCompartment;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleMappingElementWithFigure;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.CompositeImageDescriptor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.AccessibleAdapter;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
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.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbenchPart;
public class FigurePropertiesSection extends AbstractExtendedPropertiesSection {
protected static final String FONTS_LABEL = "Label Font";
protected static final String COLORS_LABEL = "Figure";
protected Button backgroundColorButton;
protected Button foregroundColorButton;
/** the default preference color */
protected static final RGB DEFAULT_TOP_NODE_BACKGROUND = new RGB(242, 245, 252);
protected static final RGB DEFAULT_TOP_NODE_FOREGROUND = new RGB(111, 142, 194);
protected static final RGB DEFAULT_COMPARTMENT_BACKGROUND = new RGB(251, 252, 255); //RED, GREEN, BLUE
protected static final RGB DEFAULT_COMPARTMENT_FOREGROUND = new RGB(133, 156, 194); //RED, GREEN, BLUE
// font family drop down
protected CCombo fontFamilyCombo;
protected CCombo shapeFamilyCombo;
protected Map<Shape, Integer> shapeFamilyMap;
// font size drop down
private CCombo fontSizeCombo;
private Button fontBoldButton;
private Button fontItalicButton;
protected Group fontGroup;
protected Group colorsGroup;
protected Group shapeGroup;
private Figure nodeFigure;
private RGB defaultBackgroundColor = DEFAULT_TOP_NODE_BACKGROUND;
private RGB defaultForegroundColor = DEFAULT_TOP_NODE_FOREGROUND;
private BasicFont labelFont;
private GMFGraphItemProviderAdapterFactory adapterFactory = new GMFGraphItemProviderAdapterFactory();
private static List<EClass> availableFigures = new ArrayList<EClass>();
static {
availableFigures.add(GMFGraphPackage.eINSTANCE.getRoundedRectangle());
availableFigures.add(GMFGraphPackage.eINSTANCE.getRectangle());
}
protected static class ColorOverlayImageDescriptor extends CompositeImageDescriptor {
/** default color icon width */
private static final Point ICON_SIZE = new Point(16, 16);
/** the basic icon */
private ImageData basicImgData;
/** the color of the thin color bar */
private RGB rgb;
/**
* Creates a new color menu image descriptor
*
* @param basicIcon
* The basic Image data
* @param rgb
* The color bar RGB value
*/
public ColorOverlayImageDescriptor(ImageData basicImgData, RGB rgb) {
this.basicImgData = basicImgData;
this.rgb = rgb;
}
/**
* @see org.eclipse.jface.resource.CompositeImageDescriptor#drawCompositeImage(int,
* int)
*/
protected void drawCompositeImage(int width, int height) {
// draw the thin color bar underneath
if (rgb != null) {
ImageData colorBar = new ImageData(width, height / 5, 1,
new PaletteData(new RGB[] { rgb }));
drawImage(colorBar, 0, height - height / 5);
}
// draw the base image
drawImage(basicImgData, 0, 0);
}
/**
* @see org.eclipse.jface.resource.CompositeImageDescriptor#getSize()
*/
protected Point getSize() {
return ICON_SIZE;
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gmf.runtime.diagram.ui.properties.sections.
* AbstractNotationPropertiesSection
* #initializeControls(org.eclipse.swt.widgets.Composite)
*/
protected void initializeControls(Composite parent) {
super.initializeControls(parent);
createFontsAndColorsGroups(composite);
}
/**
* Create fonts and colors group
*
* @param parent - parent composite
*/
protected Group createFontsAndColorsGroups(Composite parent) {
Group fontsLabelGroup = getWidgetFactory().createGroup(parent, "");
fontsLabelGroup.setLayout(new GridLayout(2, false));
GridLayout layout = new GridLayout(1, false);
colorsGroup = getWidgetFactory().createGroup(fontsLabelGroup, COLORS_LABEL);
colorsGroup.setLayout(layout);
createColorsGroup(colorsGroup);
fontGroup = getWidgetFactory().createGroup(fontsLabelGroup, FONTS_LABEL);
fontGroup.setLayout(layout);
createFontGroup(fontGroup);
return fontsLabelGroup;
}
/**
* Create font tool bar group
*
* @param parent - parent composite
* @return - font tool bar
*/
protected Composite createFontGroup(Composite parent) {
Composite familySize = getWidgetFactory().createComposite(parent);
GridLayout layout = new GridLayout(2, false);
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
layout.marginHeight = 0;
layout.marginWidth = 0;
familySize.setLayout(layout);
Composite toolBar = new Composite(parent, SWT.SHADOW_NONE);
toolBar.setLayout(new GridLayout(7, false));
toolBar.setBackground(parent.getBackground());
fontFamilyCombo = getWidgetFactory().createCCombo(familySize, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER);
fontFamilyCombo.setItems(FontHelper.getFontNames());
fontFamilyCombo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
updateFontFamily();
}
});
fontSizeCombo = getWidgetFactory().createCCombo(familySize, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER);
fontSizeCombo.setItems(FontHelper.getFontSizes());
fontSizeCombo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
updateFontSize();
}
});
fontBoldButton = new Button(toolBar, SWT.TOGGLE);
fontBoldButton.setImage(DiagramUIPropertiesImages.get(DiagramUIPropertiesImages.IMG_BOLD));
fontBoldButton.getAccessible().addAccessibleListener(new AccessibleAdapter() {
public void getName(AccessibleEvent e) {
e.result = DiagramUIMessages.PropertyDescriptorFactory_FontStyle_Bold;
}
});
fontBoldButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
updateFontBold();
}
});
fontItalicButton = new Button(toolBar, SWT.TOGGLE);
fontItalicButton.setImage(DiagramUIPropertiesImages.get(DiagramUIPropertiesImages.IMG_ITALIC));
fontItalicButton.getAccessible().addAccessibleListener(new AccessibleAdapter() {
public void getName(AccessibleEvent e) {
e.result = DiagramUIMessages.PropertyDescriptorFactory_FontStyle_Italic;
}
});
fontItalicButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
updateFontItalic();
}
});
return toolBar;
}
/**
* Create font tool bar group
*
* @param parent - parent composite
* @return - font tool bar
*/
protected Composite createColorsGroup(Composite parent) {
Composite toolBar = new Composite(parent, SWT.SHADOW_NONE);
toolBar.setLayout(new GridLayout(2, false));
toolBar.setBackground(parent.getBackground());
Label figureLabel = new Label(toolBar, SWT.LEFT);
figureLabel.setText("Shape");
shapeFamilyCombo = getWidgetFactory().createCCombo(toolBar, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER);
shapeFamilyCombo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
updateShapeFamily();
}
});
Label bckLabel = new Label(toolBar, SWT.LEFT);
bckLabel.setText("Background");
backgroundColorButton = new Button(toolBar, SWT.PUSH);
//backgroundColorButton.setImage(DiagramUIPropertiesImages.get(DiagramUIPropertiesImages.IMG_FILL_COLOR));
backgroundColorButton.getAccessible().addAccessibleListener(new AccessibleAdapter() {
public void getName(AccessibleEvent e) {
e.result = DiagramUIMessages.PropertyDescriptorFactory_FontColor;
}
});
backgroundColorButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
changeBackgroundColor(event);
}
});
GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
Point minSize = backgroundColorButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
data.widthHint = Math.max(120, minSize.x);
backgroundColorButton.setLayoutData(data);
Label foreLabel = new Label(toolBar, SWT.LEFT);
foreLabel.setText("Foreground");
foregroundColorButton = new Button(toolBar, SWT.PUSH);
//foregroundColorButton.setImage(DiagramUIPropertiesImages.get(DiagramUIPropertiesImages.IMG_FILL_COLOR));
foregroundColorButton.getAccessible().addAccessibleListener(new AccessibleAdapter() {
public void getName(AccessibleEvent e) {
e.result = DiagramUIMessages.PropertyDescriptorFactory_FontColor;
}
});
foregroundColorButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
changeForegroundColor(event);
}
});
foregroundColorButton.setLayoutData(data);
return toolBar;
}
/**
* Update font property
*/
protected void updateFontBold() {
// Update model in response to user
List<ICommand> commands = new ArrayList<ICommand>();
final FontStyle newStyle = Boolean.valueOf(fontBoldButton.getSelection()) ? FontStyle.BOLD_LITERAL : FontStyle.NORMAL_LITERAL;
commands.add(createCommand("UpdateFontStyle", labelFont.eResource(), new Runnable() {
public void run() {
labelFont.setStyle(newStyle);
}
}));
executeAsCompositeCommand("UpdateFontStyle", commands);
}
/**
* Update font property
*/
protected void updateFontItalic() {
// Update model in response to user
List<ICommand> commands = new ArrayList<ICommand>();
final FontStyle newStyle = Boolean.valueOf(fontItalicButton.getSelection()) ? FontStyle.ITALIC_LITERAL : FontStyle.NORMAL_LITERAL;
commands.add(createCommand("UpdateFontStyle", labelFont.eResource(), new Runnable() {
public void run() {
labelFont.setStyle(newStyle);
}
}));
executeAsCompositeCommand("UpdateFontStyle", commands);
}
/**
* Update font family property
*/
protected void updateFontFamily() {
// Update model in response to user
List<ICommand> commands = new ArrayList<ICommand>();
if (fontFamilyCombo.getText() != null && !fontFamilyCombo.getText().equals("")) { //$NON-NLS-1$
final String newFontFamily = fontFamilyCombo.getText();
commands.add(createCommand("UpdateFontFamily", labelFont.eResource(), new Runnable() {
public void run() {
labelFont.setFaceName(newFontFamily);
}
}));
executeAsCompositeCommand("UpdateFontFamily", commands);
}
}
/**
* Update font family property
*/
protected void updateShapeFamily() {
// Update model in response to user
List<ICommand> commands = new ArrayList<ICommand>();
final int newShapeID = shapeFamilyCombo.getSelectionIndex();
commands.add(createCommand("UpdateFontFamily", nodeFigure.eResource(), new Runnable() {
public void run() {
Shape newShape = null;
for (Map.Entry<Shape, Integer> entry : shapeFamilyMap.entrySet()) {
if (entry.getValue() == newShapeID)
newShape = entry.getKey();
}
Figure newFigure = (Figure) EcoreUtil.copy(newShape);
EStructuralFeature containingFeature = nodeFigure.eContainingFeature();
EObject container = nodeFigure.eContainer();
for (Setting setting : EcoreUtil.UsageCrossReferencer.find(nodeFigure, nodeFigure.eResource()))
if (!setting.getEStructuralFeature().isDerived())
EcoreUtil.replace(setting, nodeFigure, newFigure);
if (containingFeature != null)
EcoreUtil.replace(container, containingFeature, nodeFigure, newFigure);
nodeFigure = newFigure;
}
}));
executeAsCompositeCommand("UpdateShape", commands);
}
/**
* Update font size property
*/
protected void updateFontSize() {
List<ICommand> commands = new ArrayList<ICommand>();
if (fontSizeCombo.getText() != null && !fontSizeCombo.getText().equals("")) { //$NON-NLS-1$
final int newFontSize = new Integer(fontSizeCombo.getText());
commands.add(createCommand("UpdateFontSize", labelFont.eResource(), new Runnable() {
public void run() {
labelFont.setHeight(newFontSize);
}
}));
executeAsCompositeCommand("UpdateFontSize", commands);
}
}
/**
* Apply font color change
*
* @param event -
* font button selection event
*/
protected void changeBackgroundColor(SelectionEvent event) {
Color figureBackgroundColor = nodeFigure != null ? nodeFigure.getBackgroundColor() : null;
final RGBColor figureBackgroundRGBColor = figureBackgroundColor instanceof RGBColor ? (RGBColor) figureBackgroundColor : null;
RGB rgbBackgroundColor = getBackgroungRGBColor();
int previousBackgroundColor = rgbBackgroundColor != null ? FigureUtilities.RGBToInteger(rgbBackgroundColor) : FigureUtilities.RGBToInteger(defaultBackgroundColor);
final RGB pickedColor = pickColor(backgroundColorButton, previousBackgroundColor, defaultBackgroundColor);
if (pickedColor != null) {
List<ICommand> commands = new ArrayList<ICommand>();
backgroundColorButton.setBackground(new org.eclipse.swt.graphics.Color(null, pickedColor));
commands.add(createCommand("ChangeBackgroundColor", nodeFigure.eResource(), new Runnable() {
public void run() {
figureBackgroundRGBColor.setBlue(pickedColor.blue);
figureBackgroundRGBColor.setGreen(pickedColor.green);
figureBackgroundRGBColor.setRed(pickedColor.red);
}
}));
executeAsCompositeCommand("ChangeBackgroundColor", commands);
}
}
/**
* Apply font color change
*
* @param event -
* font button selection event
*/
protected void changeForegroundColor(SelectionEvent event) {
Color figureForegroundColor = nodeFigure != null ? nodeFigure.getForegroundColor() : null;
final RGBColor figureForegroundRGBColor = figureForegroundColor instanceof RGBColor ? (RGBColor) figureForegroundColor : null;
RGB rgbForegroundColor = getForegroundRGBColor();
int previousForegroundColor = rgbForegroundColor != null ? FigureUtilities.RGBToInteger(rgbForegroundColor) : FigureUtilities.RGBToInteger(defaultForegroundColor);
final RGB pickedColor = pickColor(foregroundColorButton, previousForegroundColor, defaultForegroundColor);
if (pickedColor != null) {
List<ICommand> commands = new ArrayList<ICommand>();
foregroundColorButton.setBackground(new org.eclipse.swt.graphics.Color(null, pickedColor));
commands.add(createCommand("ChangeForegroundColor", nodeFigure.eResource(), new Runnable() {
public void run() {
figureForegroundRGBColor.setBlue(pickedColor.blue);
figureForegroundRGBColor.setGreen(pickedColor.green);
figureForegroundRGBColor.setRed(pickedColor.red);
}
}));
executeAsCompositeCommand("ChangeForegroundColor", commands);
}
}
/**
* @param event -
* selection event
* @param button -
* event source
* @param propertyId -
* id of the property
* @param commandName -
* name of the command
* @param imageDescriptor -
* the image to draw overlay on the button after the new color is
* set
* @return - new RGB color, or null if none selected
*/
protected RGB pickColor(Button button, int previousColor, RGB defaultColor) {
ColorPalettePopup popup = new ColorPalettePopup(button.getParent().getShell(), IDialogConstants.BUTTON_BAR_HEIGHT);
popup.setPreviousColor(previousColor);
Rectangle r = button.getBounds();
Point location = button.getParent().toDisplay(r.x, r.y);
popup.open(new Point(location.x - r.height / 6, location.y - 6 * r.height));
final RGB selectedColor = popup.getSelectedColor();
if (selectedColor == null && popup.useDefaultColor()) {
return defaultColor;
}
return selectedColor;
}
/**
* @param event -
* selection event
* @param button -
* event source
* @param propertyId -
* id of the property
* @param commandName -
* name of the command
* @param imageDescriptor -
* the image to draw overlay on the button after the new color is
* set
* @return - new RGB color, or null if none selected
*/
protected RGB changeColor(SelectionEvent event, Button button, String commandName, ImageDescriptor imageDescriptor, final RGBColor inputColor, int previousColor) {
ColorPalettePopup popup = new ColorPalettePopup(button.getParent().getShell(), IDialogConstants.BUTTON_BAR_HEIGHT);
popup.setPreviousColor(previousColor);
Rectangle r = button.getBounds();
Point location = button.getParent().toDisplay(r.x, r.y);
popup.open(new Point(location.x, location.y + r.height));
if (popup.getSelectedColor() == null && !popup.useDefaultColor()) {
return null;
}
// selectedColor should be null if we are to use the default color
final RGB selectedColor = popup.getSelectedColor();
// Update model in response to user
List<ICommand> commands = new ArrayList<ICommand>();
RGB colorToReturn = selectedColor;
RGB color = selectedColor;
color = selectedColor;
// if (popup.useDefaultColor()) {
// Object preferredValue = ep.getPreferredValue(feature);
// if (preferredValue instanceof Integer) {
// color = FigureUtilities
// .integerToRGB((Integer) preferredValue);
// }
// }
// If we are using default colors, we want to return the color of the first selected element to be consistent
if (colorToReturn == null) {
colorToReturn = color;
}
if (color != null) {
final RGB finalColor = color; // need a final variable
commands.add(createCommand(commandName, inputColor.eResource(), new Runnable() {
public void run() {
inputColor.setBlue(finalColor.blue);
inputColor.setGreen(finalColor.green);
inputColor.setRed(finalColor.red);
}
}));
}
if (!commands.isEmpty()) {
executeAsCompositeCommand(commandName, commands);
Image overlyedImage = new ColorOverlayImageDescriptor(imageDescriptor.getImageData(), color).createImage();
disposeImage(button.getImage());
button.setImage(overlyedImage);
}
return colorToReturn;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.views.properties.tabbed.ISection#refresh()
*/
public void refresh() {
if (!isDisposed()) {
executeAsReadAction(new Runnable() {
public void run() {
boolean isReadOnly = isReadOnly();
boolean enableFontWidgets = labelFont != null && !isReadOnly;
fontFamilyCombo.setEnabled(enableFontWidgets);
fontSizeCombo.setEnabled(enableFontWidgets);
fontBoldButton.setEnabled(enableFontWidgets);
fontItalicButton.setEnabled(enableFontWidgets);
if (labelFont != null) {
fontFamilyCombo.setText(labelFont.getFaceName());
fontSizeCombo.setText(Integer.toString(labelFont.getHeight()));
fontBoldButton.setSelection(labelFont.getStyle() == FontStyle.BOLD_LITERAL);
fontItalicButton.setSelection(labelFont.getStyle() == FontStyle.ITALIC_LITERAL);
} else {
fontFamilyCombo.setText("");
fontSizeCombo.setText("");
fontBoldButton.setSelection(false);
fontItalicButton.setSelection(false);
}
for (Shape shape : shapeFamilyMap.keySet())
if (nodeFigure.eClass().equals(shape.eClass()))
shapeFamilyCombo.setText(getFigureLabel(shape));
RGB rgbBackgroundColor = getBackgroungRGBColor();
RGB rgbForegroundColor = getForegroundRGBColor();
backgroundColorButton.setEnabled(rgbBackgroundColor != null && !isReadOnly);
if (backgroundColorButton.isEnabled()) {
org.eclipse.swt.graphics.Color newButtonColor = new org.eclipse.swt.graphics.Color(null, rgbBackgroundColor);
backgroundColorButton.setBackground(newButtonColor);
backgroundColorButton.setForeground(newButtonColor);
setButtonImage(backgroundColorButton, rgbBackgroundColor, backgroundColorButton.getDisplay());
backgroundColorButton.setToolTipText(rgbBackgroundColor.toString());
}
foregroundColorButton.setEnabled(rgbForegroundColor != null && !isReadOnly);
if (foregroundColorButton.isEnabled()) {
org.eclipse.swt.graphics.Color newButtonColor = new org.eclipse.swt.graphics.Color(null, rgbForegroundColor);
foregroundColorButton.setBackground(newButtonColor);
foregroundColorButton.setForeground(newButtonColor);
setButtonImage(foregroundColorButton, rgbForegroundColor, foregroundColorButton.getDisplay());
foregroundColorButton.setToolTipText(rgbForegroundColor.toString());
}
}
});
}
}
/**
* Sets the image for a color button (square filled with the color that
* button represents)
*/
protected void setButtonImage(Button btn, RGB rgbColor, Display display) {
// First, dispose the current image, if any
Image image = btn.getImage();
if (image != null) {
image.dispose();
}
// Now set the new image based on rgbColor
org.eclipse.swt.graphics.Color color1 = new org.eclipse.swt.graphics.Color(display, rgbColor);
image = new Image(display, 80, 16);
GC gc = new GC(image);
gc.setBackground(color1);
Rectangle rect = image.getBounds();
gc.fillRectangle(rect);
gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
gc.drawRectangle(rect.x, rect.y, rect.width - 1, rect.height - 1);
gc.dispose();
color1.dispose();
btn.setImage(image);
}
/**
* Update if nessesary, upon receiving the model event. This event will only
* be processed when the reciever is visible (the default behavior is not to
* listen to the model events while not showing). Therefore it is safe to
* refresh the UI. Sublclasses, which will choose to override event
* listening behavior should take into account that the model events are
* sent all the time - regardless of the section visibility. Thus special
* care should be taken by the section that will choose to listen to such
* events all the time. Also, the default implementation of this method
* synchronizes on the GUI thread. The subclasses that overwrite it should
* do the same if they perform any GUI work (because events may be sent from
* a non-GUI thread).
*
* @see #aboutToBeShown()
* @see #aboutToBeHidden()
*
* @param notification
* notification object
* @param element
* element that has changed
*/
public void update(final Notification notification, final EObject element) {
if (!isDisposed() && isCurrentSelection(notification, element)) {
postUpdateRequest(new Runnable() {
public void run() {
if (!isDisposed() && isCurrentSelection(notification, element) && !isNotifierDeleted(notification))
//updateColorCache();
refresh();
}
});
}
}
// /**
// * react to selection or model change - updatye local cache
// */
// protected void updateColorCache() {
//
// executeAsReadAction(new Runnable() {
//
// public void run() {
//
// if(nodeFigure!=null)
// {
// Color figureBackgroundColor = nodeFigure!=null?nodeFigure.getBackgroundColor():null;
// Color figureForegroundColor = nodeFigure!=null?nodeFigure.getForegroundColor():null;
//
// figureBackgroundRGBColor = figureBackgroundColor instanceof RGBColor ? (RGBColor)figureBackgroundColor:null;
// figureForegroundRGBColor = figureForegroundColor instanceof RGBColor ? (RGBColor)figureForegroundColor:null;
//
// if (figureBackgroundRGBColor != null)
// rgbBackgroundColor = new RGB(figureBackgroundRGBColor.getRed(),figureBackgroundRGBColor.getGreen(), figureBackgroundRGBColor.getBlue());
//
// if (figureForegroundRGBColor != null)
// rgbForegroundColor = new RGB(figureForegroundRGBColor.getRed(),figureForegroundRGBColor.getGreen(), figureForegroundRGBColor.getBlue());
//
// }
//
// }
// });
//
// }
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.views.properties.tabbed.ISection#setInput(org.eclipse.
* ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
*/
public void setInput(IWorkbenchPart part, ISelection selection) {
super.setInput(part, selection);
nodeFigure = ((SimpleMappingElementWithFigure) getEObject()).getNodeFigure();
shapeFamilyMap = new HashMap<Shape, Integer>();
List<Object> childClasses = new ArrayList<Object>();
shapeFamilyCombo.removeAll();
for (Object childDescriptor : getEditingDomain().getNewChildDescriptors(null, nodeFigure))
if (childDescriptor instanceof CommandParameter)
childClasses.add(((CommandParameter) childDescriptor).getValue());
Collection<Object> figures = EcoreUtil.getObjectsByType(childClasses, GMFGraphPackage.eINSTANCE.getShape());
int i = 0;
for (Object figure : figures) {
shapeFamilyMap.put(((Shape) figure), i++);
shapeFamilyCombo.add(getFigureLabel(figure));
}
Figure labelFigure = ((SimpleMappingElementWithFigure) getEObject()).getLabelFigure();
labelFont = (labelFigure != null && labelFigure.getFont() instanceof BasicFont) ? (BasicFont) labelFigure.getFont() : null;
if (getEObject() instanceof SimpleCompartment) {
defaultBackgroundColor = DEFAULT_COMPARTMENT_BACKGROUND;
defaultForegroundColor = DEFAULT_COMPARTMENT_FOREGROUND;
} else {
defaultBackgroundColor = DEFAULT_TOP_NODE_BACKGROUND;
defaultForegroundColor = DEFAULT_TOP_NODE_FOREGROUND;
}
//updateColorCache();
}
/**
* @generated
*/
public String getFigureLabel(Object item) {
IItemLabelProvider labelProvider = (IItemLabelProvider) adapterFactory.adapt(item, IItemLabelProvider.class);
if (labelProvider != null) {
return labelProvider.getText(item);
}
return null;
}
/**
* Dispose the image if it was created locally to avoid a leak. Do not
* dispose the images in the registry.
*
* @param image
*/
protected void disposeImage(Image image) {
if (image == null) {
return;
}
if (image.equals(DiagramUIPropertiesImages.get(DiagramUIPropertiesImages.IMG_FILL_COLOR))) {
return;
}
if (!image.isDisposed()) {
image.dispose();
}
}
public void dispose() {
if (backgroundColorButton != null && !backgroundColorButton.isDisposed()) {
disposeImage(backgroundColorButton.getImage());
}
if (foregroundColorButton != null && !foregroundColorButton.isDisposed()) {
disposeImage(foregroundColorButton.getImage());
}
if (shapeFamilyCombo != null)
shapeFamilyCombo.dispose();
if (fontFamilyCombo != null)
fontFamilyCombo.dispose();
if (fontSizeCombo != null)
fontSizeCombo.dispose();
if (fontBoldButton != null)
fontBoldButton.dispose();
if (fontItalicButton != null)
fontItalicButton.dispose();
super.dispose();
}
private RGB getBackgroungRGBColor() {
final RGBColor figureBackgroundRGBColor = nodeFigure.getBackgroundColor() instanceof RGBColor ? (RGBColor) nodeFigure.getBackgroundColor() : null;
RGB rgbBackgroundColor = null;
if (figureBackgroundRGBColor != null)
rgbBackgroundColor = new RGB(figureBackgroundRGBColor.getRed(), figureBackgroundRGBColor.getGreen(), figureBackgroundRGBColor.getBlue());
return rgbBackgroundColor;
}
private RGB getForegroundRGBColor() {
final RGBColor figureForegroundRGBColor = nodeFigure.getForegroundColor() instanceof RGBColor ? (RGBColor) nodeFigure.getForegroundColor() : null;
RGB rgbForegroundColor = null;
if (figureForegroundRGBColor != null)
rgbForegroundColor = new RGB(figureForegroundRGBColor.getRed(), figureForegroundRGBColor.getGreen(), figureForegroundRGBColor.getBlue());
return rgbForegroundColor;
}
}