1 /*******************************************************************************
2  * Copyright (c) 2008, 2018 Angelo Zerr and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
13  *     IBM Corporation - initial API and implementation
14  *******************************************************************************/
15 package org.eclipse.e4.ui.css.swt.helpers;
16 
17 import java.net.URL;
18 import org.eclipse.e4.ui.css.core.util.resources.IResourcesLocatorManager;
19 import org.eclipse.e4.ui.css.core.utils.StringUtils;
20 import org.eclipse.jface.resource.ImageDescriptor;
21 import org.eclipse.swt.graphics.Device;
22 import org.eclipse.swt.graphics.Image;
23 import org.eclipse.swt.widgets.Button;
24 import org.eclipse.swt.widgets.Control;
25 import org.eclipse.swt.widgets.Display;
26 import org.eclipse.swt.widgets.Item;
27 import org.eclipse.swt.widgets.Shell;
28 import org.eclipse.swt.widgets.ToolItem;
29 import org.eclipse.swt.widgets.Widget;
30 import org.w3c.dom.css.CSSPrimitiveValue;
31 import org.w3c.dom.css.CSSValue;
32 
33 public class CSSSWTImageHelper {
34 	private static final String DEFAULT_IMAGE = "defaultImage";
35 
36 	private static final String DEFAULT_HOT_IMAGE = "defaultHotImage";
37 
38 	private static final String DEFAULT_DISABLE_IMAGE = "defaultDisableImage";
39 
getImage(CSSValue value, IResourcesLocatorManager manager, Display display)40 	public static Image getImage(CSSValue value,
41 			IResourcesLocatorManager manager, Display display) throws Exception {
42 		if (value.getCssValueType() != CSSValue.CSS_PRIMITIVE_VALUE) {
43 			return null;
44 		}
45 		CSSPrimitiveValue primitiveValue = (CSSPrimitiveValue) value;
46 		switch (primitiveValue.getPrimitiveType()) {
47 		case CSSPrimitiveValue.CSS_URI:
48 			String path = primitiveValue.getStringValue();
49 			return loadImageFromURL(display, path, manager);
50 		}
51 		return null;
52 	}
53 
loadImageFromURL(Device device, String path, IResourcesLocatorManager manager)54 	private static Image loadImageFromURL(Device device, String path,
55 			IResourcesLocatorManager manager) throws Exception {
56 		Image result = null;
57 
58 		String s = manager.resolve(path);
59 		if (!StringUtils.isEmpty(s)) {
60 			result = ImageDescriptor.createFromURL(new URL(s)).createImage();
61 		}
62 
63 		return result;
64 	}
65 
storeDefaultImage(Shell shell)66 	public static void storeDefaultImage(Shell shell) {
67 		storeDefaultImage(shell, DEFAULT_IMAGE, shell.getImage());
68 	}
69 
storeDefaultImage(Item item)70 	public static void storeDefaultImage(Item item) {
71 		storeDefaultImage(item, DEFAULT_IMAGE, item.getImage());
72 	}
73 
storeDefaultImage(ToolItem item)74 	public static void storeDefaultImage(ToolItem item) {
75 		storeDefaultImage((Item) item);
76 		storeDefaultImage(item, DEFAULT_HOT_IMAGE, item.getHotImage());
77 		storeDefaultImage(item, DEFAULT_DISABLE_IMAGE, item.getDisabledImage());
78 	}
79 
storeDefaultImage(Button button)80 	public static void storeDefaultImage(Button button) {
81 		storeDefaultImage(button, DEFAULT_IMAGE, button.getImage());
82 	}
83 
restoreDefaultImage(Shell shell)84 	public static void restoreDefaultImage(Shell shell) {
85 		Image defaultImage = (Image) shell.getData(DEFAULT_IMAGE);
86 		if (defaultImage != null) {
87 			shell.setImage(defaultImage.isDisposed() ? null : defaultImage);
88 		}
89 	}
90 
restoreDefaultImage(Item item)91 	public static void restoreDefaultImage(Item item) {
92 		Image defaultImage = (Image) item.getData(DEFAULT_IMAGE);
93 		if (defaultImage != null) {
94 			item.setImage(defaultImage.isDisposed() ? null : defaultImage);
95 		}
96 	}
97 
restoreDefaultImage(ToolItem item)98 	public static void restoreDefaultImage(ToolItem item) {
99 		restoreDefaultImage((Item) item);
100 
101 		Image defaultImage = (Image) item.getData(DEFAULT_HOT_IMAGE);
102 		if (defaultImage != null) {
103 			item.setHotImage(defaultImage.isDisposed() ? null : defaultImage);
104 		}
105 
106 		defaultImage = (Image) item.getData(DEFAULT_DISABLE_IMAGE);
107 		if (defaultImage != null) {
108 			item.setDisabledImage(defaultImage.isDisposed() ? null
109 					: defaultImage);
110 		}
111 	}
112 
restoreDefaultImage(Button button)113 	public static void restoreDefaultImage(Button button) {
114 		Image defaultImage = (Image) button.getData(DEFAULT_IMAGE);
115 		if (defaultImage != null) {
116 			button.setImage(defaultImage.isDisposed() ? null : defaultImage);
117 		}
118 	}
119 
storeDefaultImage(Widget widget, String imageName, Image image)120 	private static void storeDefaultImage(Widget widget, String imageName,
121 			Image image) {
122 		if (widget.getData(imageName) == null) {
123 			widget.setData(imageName, image);
124 		}
125 	}
126 
127 	/** Helper function to avoid setting images unnecessarily */
setImage(Button button, Image image)128 	public static void setImage(Button button, Image image) {
129 		if (button.getImage() != image) {
130 			storeDefaultImage(button);
131 			button.setImage(image);
132 		}
133 	}
134 
135 	/** Helper function to avoid setting images unnecessarily */
setBackgroundImage(Control control, Image image)136 	public static void setBackgroundImage(Control control, Image image) {
137 		if (control != null && control.getBackgroundImage() != image) {
138 			control.setBackgroundImage(image);
139 		}
140 	}
141 }
142 
143