package org.archstudio.resources.core;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.archstudio.resources.IResources;
import org.archstudio.swtutils.OverlayImageIcon;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
/**
* Myx brick: "Resources Impl"
*
* @see org.archstudio.resources.core.ResourcesMyxComponentStub
* @generated
*/
public class ResourcesMyxComponent extends org.archstudio.resources.core.ResourcesMyxComponentStub {
private final Object lock = new Object();
class ResourcesProxy implements InvocationHandler {
IResources resources = ResourcesMyxComponent.this;
List<Runnable> toExec = new ArrayList<Runnable>();
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
synchronized (lock) {
final Method fMethod = method;
final Object[] fArgs = args;
if (void.class.equals(method.getReturnType())) {
if (display == null) {
toExec.add(new Runnable() {
@Override
public void run() {
try {
fMethod.invoke(resources, fArgs);
}
catch (Throwable t) {
t.printStackTrace();
}
}
});
return null;
}
else if (Display.getCurrent() == null) {
display.asyncExec(new Runnable() {
@Override
public void run() {
try {
fMethod.invoke(resources, fArgs);
}
catch (Throwable t) {
t.printStackTrace();
}
}
});
return null;
}
}
if (Display.getCurrent() == null) {
SWT.error(SWT.ERROR_THREAD_INVALID_ACCESS);
}
if (display == null) {
setDisplay(Display.getCurrent());
for (Runnable runnable : toExec) {
runnable.run();
}
toExec.clear();
}
return method.invoke(resources, args);
}
}
}
protected Display display = null;
protected FontRegistry fontRegistry = null;
protected ImageRegistry imageRegistry = null;
protected ColorRegistry colorRegistry = null;
protected void setDisplay(Display display) {
synchronized (lock) {
if (this.display != null) {
this.display = null;
imageRegistry.dispose();
fontRegistry = null;
imageRegistry = null;
colorRegistry = null;
}
if (display != null) {
this.display = display;
fontRegistry = new FontRegistry(display);
imageRegistry = new ImageRegistry(display);
colorRegistry = new ColorRegistry(display);
createColor(IResources.COLOR_ARCHSTUDIO, IResources.RGB_ARCHSTUDIO_MAIN);
createColor(IResources.COLOR_BANNER_BRIGHT, IResources.RGB_BANNER_BRIGHT);
createColor(IResources.COLOR_BANNER_DARK, IResources.RGB_BANNER_DARK);
display.disposeExec(new Runnable() {
@Override
public void run() {
setDisplay(null);
}
});
}
lock.notifyAll();
}
}
public ResourcesMyxComponent() {
}
protected void checkDevice() {
if (Display.getCurrent() == null) {
SWT.error(SWT.ERROR_THREAD_INVALID_ACCESS);
}
synchronized (lock) {
if (this.display == null) {
setDisplay(Display.getDefault());
}
}
}
@Override
public Image getPlatformImage(String symbolicName) {
checkDevice();
return PlatformUI.getWorkbench().getSharedImages().getImage(symbolicName);
}
@Override
public ImageDescriptor getPlatformImageDescriptor(String symbolicName) {
checkDevice();
return PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(symbolicName);
}
@Override
public Font getPlatformFont(String symbolicName) {
checkDevice();
return JFaceResources.getFont(symbolicName);
}
@Override
public Font getBoldPlatformFont(String symbolicName) {
checkDevice();
FontRegistry fr = JFaceResources.getFontRegistry();
return fr.getBold(symbolicName);
}
@Override
public Font getItalicPlatformFont(String symbolicName) {
checkDevice();
FontRegistry fr = JFaceResources.getFontRegistry();
return fr.getItalic(symbolicName);
}
@Override
public Font getFont(String symbolicName) {
checkDevice();
return fontRegistry.get(symbolicName);
}
@Override
public void createFont(String symbolicName, FontData[] fontData) {
checkDevice();
fontRegistry.put(symbolicName, fontData);
}
@Override
public void createDerivedFont(String newSymbolicName, FontData[] existingFontData, int newHeight, int newStyle) {
checkDevice();
FontData[] fds = existingFontData;
FontData[] nfds = new FontData[fds.length];
for (int i = 0; i < fds.length; i++) {
int h = newHeight;
if (newHeight == 0) {
h = fds[i].getHeight();
}
int s = newStyle;
if (newStyle == 0) {
s = fds[i].getStyle();
}
nfds[i] = new FontData(fds[i].getName(), h, s);
}
createFont(newSymbolicName, nfds);
}
// this approach does not work with plugins
// public void createImage(String symbolicName, String url){
// createImage(symbolicName, url, null);
// }
// public void createImage(String symbolicName, String url, Class resourceClass){
// if(imageRegistry.get(symbolicName) != null) return;
// try{
// InputStream is = SystemUtils.openURL(url, resourceClass);
// ImageData id = new ImageData(is);
// ImageDescriptor desc = ImageDescriptor.createFromImageData(id);
// Image img = desc.createImage();
// imageRegistry.put(symbolicName, img);
// is.close();
// }
// catch(Exception e){
// e.printStackTrace();
// }
// }
@Override
public void createImage(String symbolicName, byte[] bytes) {
createImage(symbolicName, new ByteArrayInputStream(bytes));
}
private void createImage(String symbolicName, InputStream is) {
checkDevice();
if (imageRegistry.get(symbolicName) != null) {
return;
}
try {
ImageData id = new ImageData(is);
ImageDescriptor desc = ImageDescriptor.createFromImageData(id);
Image img = desc.createImage();
createImage(symbolicName, img);
is.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void createImage(String symbolicName, Image img) {
checkDevice();
if (imageRegistry.get(symbolicName) != null) {
return;
}
try {
imageRegistry.put(symbolicName, img);
}
catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void createImage(String symbolicName, ImageDescriptor imageDescriptor) {
createImage(symbolicName, imageDescriptor.createImage());
}
@Override
public void createOverlayImage(String symbolicName, Image base, Image[] overlays, int[] overlayPositions) {
checkDevice();
if (imageRegistry.get(symbolicName) != null) {
return;
}
OverlayImageIcon oii = new OverlayImageIcon(base, overlays, overlayPositions);
imageRegistry.put(symbolicName, oii);
}
@Override
public Image getImage(String symbolicName) {
checkDevice();
return imageRegistry.get(symbolicName);
}
@Override
public ImageDescriptor getImageDescriptor(String symbolicName) {
checkDevice();
return imageRegistry.getDescriptor(symbolicName);
}
@Override
public void createColor(String symbolicName, RGB colorData) {
checkDevice();
if (colorRegistry.get(symbolicName) != null) {
return;
}
colorRegistry.put(symbolicName, colorData);
}
@Override
public Color getColor(String symbolicName) {
checkDevice();
return colorRegistry.get(symbolicName);
}
}