--- /dev/null
+package org.simantics.views.swt.client.impl;\r
+\r
+import java.io.ByteArrayInputStream;\r
+import java.util.Arrays;\r
+\r
+import org.eclipse.jface.resource.ImageDescriptor;\r
+import org.eclipse.jface.resource.ResourceManager;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.events.SelectionListener;\r
+import org.eclipse.swt.graphics.ImageData;\r
+import org.eclipse.swt.graphics.ImageLoader;\r
+import org.eclipse.swt.widgets.Button;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.simantics.scl.runtime.function.Function1;\r
+import org.simantics.views.swt.client.base.SingleSWTViewNode;\r
+\r
+public class SWTButton extends SingleSWTViewNode<Button> {\r
+ \r
+ private static final long serialVersionUID = 7932335224632082902L;\r
+\r
+ public Function1<Object, Object> modifier;\r
+ public byte[] image;\r
+ public String tooltip;\r
+\r
+ private transient ImageDescriptor imageDesc;\r
+\r
+ @Override\r
+ public void createControls(Composite parent) {\r
+ \r
+ control = new Button(parent, style);\r
+\r
+ setProperties();\r
+\r
+ control.addSelectionListener(new SelectionListener() {\r
+\r
+ @Override\r
+ public void widgetSelected(SelectionEvent e) {\r
+ if(modifier != null)\r
+ modifier.apply(SWTButton.this);\r
+ }\r
+\r
+ @Override\r
+ public void widgetDefaultSelected(SelectionEvent e) {\r
+ widgetSelected(e);\r
+ }\r
+ \r
+ });\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void synchronizeText(String text) {\r
+ if(text != null) {\r
+ control.setText(text);\r
+ // This seems to be necessary for correct size computations\r
+ control.getParent().layout(true);\r
+ }\r
+ }\r
+\r
+ public void synchronizeImage(byte[] image) {\r
+ ResourceManager rm = getResourceManager();\r
+ ImageDescriptor oldDesc = imageDesc;\r
+ if (image != null)\r
+ control.setImage(rm.createImage(imageDesc = new Descriptor(image)));\r
+ if (oldDesc != null)\r
+ rm.destroyImage(oldDesc);\r
+ }\r
+ \r
+ public void synchronizeModifier(Function1<Object, Object> modifier) {\r
+ \r
+ }\r
+ \r
+ public void synchronizeTooltip(String tooltip) {\r
+ if(tooltip != null) control.setToolTipText(tooltip);\r
+ }\r
+\r
+ static class Descriptor extends ImageDescriptor {\r
+ \r
+ final byte[] data;\r
+ final int hash;\r
+ \r
+ public Descriptor(byte[] data) {\r
+ this.data = data;\r
+ this.hash = Arrays.hashCode(data);\r
+ }\r
+\r
+ @Override\r
+ public ImageData getImageData() {\r
+ return new ImageLoader().load(new ByteArrayInputStream(data))[0];\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ return hash;\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (this == obj)\r
+ return true;\r
+ if (obj == null)\r
+ return false;\r
+ if (getClass() != obj.getClass())\r
+ return false;\r
+ Descriptor other = (Descriptor) obj;\r
+ if (!Arrays.equals(data, other.data))\r
+ return false;\r
+ return true;\r
+ }\r
+\r
+ }\r
+\r
+}\r