/******************************************************************************* * Copyright (c) 2008, 2015 Angelo Zerr 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: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation * IBM Corporation *******************************************************************************/ package org.eclipse.e4.ui.css.swt.properties.css2; import org.eclipse.e4.ui.css.core.dom.properties.Gradient; import org.eclipse.e4.ui.css.core.dom.properties.css2.AbstractCSSPropertyBackgroundHandler; import org.eclipse.e4.ui.css.core.dom.properties.css2.ICSSPropertyBackgroundHandler; import org.eclipse.e4.ui.css.core.engine.CSSEngine; import org.eclipse.e4.ui.css.swt.dom.CompositeElement; import org.eclipse.e4.ui.css.swt.dom.WidgetElement; import org.eclipse.e4.ui.css.swt.helpers.CSSSWTColorHelper; import org.eclipse.e4.ui.css.swt.helpers.CSSSWTImageHelper; import org.eclipse.e4.ui.css.swt.helpers.SWTElementHelpers; import org.eclipse.e4.ui.css.swt.properties.GradientBackgroundListener; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Widget; import org.w3c.dom.css.CSSValue; public class CSSPropertyBackgroundSWTHandler extends AbstractCSSPropertyBackgroundHandler { public final static ICSSPropertyBackgroundHandler INSTANCE = new CSSPropertyBackgroundSWTHandler(); @Override public boolean applyCSSProperty(Object element, String property, CSSValue value, String pseudo, CSSEngine engine) throws Exception { Widget widget = SWTElementHelpers.getWidget(element); if (widget != null) { // super.applyCSSProperty(widget, property, value, pseudo, engine); super.applyCSSProperty(element, property, value, pseudo, engine); return true; } return false; } @Override public String retrieveCSSProperty(Object element, String property, String pseudo, CSSEngine engine) throws Exception { Widget widget = SWTElementHelpers.getWidget(element); if (widget != null) { return super.retrieveCSSProperty(widget, property, pseudo, engine); } return null; } @Override public void applyCSSPropertyBackgroundColor(Object element, CSSValue value, String pseudo, CSSEngine engine) throws Exception { Widget widget = (Widget) ((WidgetElement) element).getNativeWidget(); if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) { Color newColor = (Color) engine.convert(value, Color.class, widget .getDisplay()); if (widget instanceof CTabItem) { CTabFolder folder = ((CTabItem) widget).getParent(); if ("selected".equals(pseudo)) { // tab folder selection manages gradients CSSSWTColorHelper.setSelectionBackground(folder, newColor); } else { CSSSWTColorHelper.setBackground(folder, newColor); } } else if (widget instanceof Control) { GradientBackgroundListener.remove((Control) widget); CSSSWTColorHelper.setBackground((Control) widget, newColor); CompositeElement.setBackgroundOverriddenByCSSMarker(widget); } } else if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) { Gradient grad = (Gradient) engine.convert(value, Gradient.class, widget.getDisplay()); if (grad == null) { return; // warn? } if (widget instanceof CTabItem) { CTabFolder folder = ((CTabItem) widget).getParent(); Color[] colors = CSSSWTColorHelper.getSWTColors(grad, folder.getDisplay(), engine); int[] percents = CSSSWTColorHelper.getPercents(grad); if ("selected".equals(pseudo)) { folder.setSelectionBackground(colors, percents, true); } else { folder.setBackground(colors, percents, true); } } else if (widget instanceof Control) { GradientBackgroundListener.handle((Control) widget, grad); CompositeElement.setBackgroundOverriddenByCSSMarker(widget); } } } @Override public void applyCSSPropertyBackgroundImage(Object element, CSSValue value, String pseudo, CSSEngine engine) throws Exception { // Widget control = (Widget) element; Widget widget = (Widget) ((WidgetElement) element).getNativeWidget(); Image image = (Image) engine.convert(value, Image.class, widget.getDisplay()); if (widget instanceof CTabFolder && "selected".equals(pseudo)) { ((CTabFolder) widget).setSelectionBackground(image); } else if (widget instanceof Button) { Button button = ((Button) widget); // Image oldImage = button.getImage(); // if (oldImage != null) // oldImage.dispose(); CSSSWTImageHelper.setImage(button, image); } else if (widget instanceof Control) { CSSSWTImageHelper.setBackgroundImage((Control) widget, image); } } @Override public String retrieveCSSPropertyBackgroundAttachment(Object widget, String pseudo, CSSEngine engine) throws Exception { return null; } @Override public String retrieveCSSPropertyBackgroundColor(Object element, String pseudo, CSSEngine engine) throws Exception { Widget widget = (Widget) element; Color color = null; if (widget instanceof CTabItem) { if ("selected".equals(pseudo)) { color = ((CTabItem) widget).getParent() .getSelectionBackground(); } else { color = ((CTabItem) widget).getParent().getBackground(); } } else if (widget instanceof Control) { color = ((Control) widget).getBackground(); } return engine.convert(color, Color.class, null); } @Override public String retrieveCSSPropertyBackgroundImage(Object widget, String pseudo, CSSEngine engine) throws Exception { // TODO : manage path of Image. return "none"; } @Override public String retrieveCSSPropertyBackgroundPosition(Object widget, String pseudo, CSSEngine engine) throws Exception { return null; } @Override public String retrieveCSSPropertyBackgroundRepeat(Object widget, String pseudo, CSSEngine engine) throws Exception { return null; } }