]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTButton.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.views.swt.client / src / org / simantics / views / swt / client / impl / SWTButton.java
1 package org.simantics.views.swt.client.impl;\r
2 \r
3 import java.io.ByteArrayInputStream;\r
4 import java.util.Arrays;\r
5 \r
6 import org.eclipse.jface.resource.ImageDescriptor;\r
7 import org.eclipse.jface.resource.ResourceManager;\r
8 import org.eclipse.swt.events.SelectionEvent;\r
9 import org.eclipse.swt.events.SelectionListener;\r
10 import org.eclipse.swt.graphics.ImageData;\r
11 import org.eclipse.swt.graphics.ImageLoader;\r
12 import org.eclipse.swt.widgets.Button;\r
13 import org.eclipse.swt.widgets.Composite;\r
14 import org.simantics.scl.runtime.function.Function1;\r
15 import org.simantics.views.swt.client.base.SingleSWTViewNode;\r
16 \r
17 public class SWTButton extends SingleSWTViewNode<Button> {\r
18         \r
19         private static final long serialVersionUID = 7932335224632082902L;\r
20 \r
21         public Function1<Object, Object> modifier;\r
22         public byte[] image;\r
23         public String tooltip;\r
24 \r
25         private transient ImageDescriptor imageDesc;\r
26 \r
27         @Override\r
28         public void createControls(Composite parent) {\r
29                 \r
30                 control = new Button(parent, style);\r
31 \r
32                 setProperties();\r
33 \r
34                 control.addSelectionListener(new SelectionListener() {\r
35 \r
36                         @Override\r
37                         public void widgetSelected(SelectionEvent e) {\r
38                                 if(modifier != null)\r
39                                         modifier.apply(SWTButton.this);\r
40                         }\r
41 \r
42                         @Override\r
43                         public void widgetDefaultSelected(SelectionEvent e) {\r
44                                 widgetSelected(e);\r
45                         }\r
46                         \r
47                 });\r
48                 \r
49         }\r
50         \r
51         @Override\r
52         public void synchronizeText(String text) {\r
53                 if(text != null) {\r
54                         control.setText(text);\r
55                         // This seems to be necessary for correct size computations\r
56                         control.getParent().layout(true);\r
57                 }\r
58         }\r
59 \r
60         public void synchronizeImage(byte[] image) {\r
61                 ResourceManager rm =  getResourceManager();\r
62                 ImageDescriptor oldDesc = imageDesc;\r
63                 if (image != null)\r
64                         control.setImage(rm.createImage(imageDesc = new Descriptor(image)));\r
65                 if (oldDesc != null)\r
66                         rm.destroyImage(oldDesc);\r
67         }\r
68         \r
69         public void synchronizeModifier(Function1<Object, Object> modifier) {\r
70                 \r
71         }\r
72         \r
73         public void synchronizeTooltip(String tooltip) {\r
74                 if(tooltip != null) control.setToolTipText(tooltip);\r
75         }\r
76 \r
77         static class Descriptor extends ImageDescriptor {\r
78             \r
79             final byte[] data;\r
80             final int hash;\r
81             \r
82             public Descriptor(byte[] data) {\r
83                 this.data = data;\r
84                 this.hash = Arrays.hashCode(data);\r
85             }\r
86 \r
87             @Override\r
88             public ImageData getImageData() {\r
89                 return new ImageLoader().load(new ByteArrayInputStream(data))[0];\r
90             }\r
91 \r
92             @Override\r
93             public int hashCode() {\r
94                 return hash;\r
95             }\r
96 \r
97             @Override\r
98             public boolean equals(Object obj) {\r
99                 if (this == obj)\r
100                     return true;\r
101                 if (obj == null)\r
102                     return false;\r
103                 if (getClass() != obj.getClass())\r
104                     return false;\r
105                 Descriptor other = (Descriptor) obj;\r
106                 if (!Arrays.equals(data, other.data))\r
107                     return false;\r
108                 return true;\r
109             }\r
110 \r
111         }\r
112 \r
113 }\r