1cda75f87dcf223804481a4cdb0f9301e8c4a4ce
[sdk/ide/common-eplugin.git] / org.tizen.common / src / org / tizen / common / swt / PictureLabel.java
1 /*\r
2 *  Common\r
3 *\r
4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
5 *\r
6 * Contact: \r
7 * Kangho Kim <kh5325.kim@samsung.com>\r
8\r
9 * Licensed under the Apache License, Version 2.0 (the "License");\r
10 * you may not use this file except in compliance with the License.\r
11 * You may obtain a copy of the License at\r
12 *\r
13 * http://www.apache.org/licenses/LICENSE-2.0\r
14 *\r
15 * Unless required by applicable law or agreed to in writing, software\r
16 * distributed under the License is distributed on an "AS IS" BASIS,\r
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
18 * See the License for the specific language governing permissions and\r
19 * limitations under the License.\r
20 *\r
21 * Contributors:\r
22 * - S-Core Co., Ltd\r
23 *\r
24 */\r
25 \r
26 package org.tizen.common.swt;\r
27 \r
28 import java.util.List;\r
29 import java.util.ArrayList;\r
30 \r
31 import org.eclipse.swt.*;\r
32 import org.eclipse.swt.graphics.*;\r
33 import org.eclipse.swt.widgets.*;\r
34 import org.eclipse.swt.events.*;\r
35 \r
36 /**\r
37  * Reference to http://www.eclipse.org/articles/Article-Writing%20Your%20Own%20Widget/Writing%20Your%20Own%20Widget.htm\r
38  * \r
39  * @author Jihoon Song {@literal <jihoon80.song@samsung.com>} (S-Core)\r
40  */\r
41 public class PictureLabel extends Canvas {\r
42         private Image image;\r
43         private String text;\r
44         private boolean selected;\r
45         private List<ImageClickedListener> imageClickedListeners = new ArrayList<ImageClickedListener>();\r
46 \r
47         public PictureLabel(Composite parent, int style) {\r
48                 super(parent, style);\r
49 \r
50                 // default background color\r
51                 setBackground(getDisplay().getSystemColor(SWT.COLOR_WHITE));\r
52 \r
53                 // add listener\r
54                 addDisposeListener(new DisposeListener() {\r
55                         public void widgetDisposed(DisposeEvent e) {}\r
56                 });\r
57                 addPaintListener(new PaintListener() {\r
58                         public void paintControl(PaintEvent e) {\r
59                                 PictureLabel.this.paintControl(e);\r
60                         }\r
61                 });\r
62                 addMouseListener(new MouseAdapter() {\r
63                         public void mouseDown(MouseEvent event) {\r
64                                 if (event.button == java.awt.event.MouseEvent.BUTTON1) {\r
65                                         PictureLabel.this.mouseDown(event);\r
66                                 }\r
67                         }\r
68                 });\r
69                 addMouseTrackListener(new MouseTrackAdapter() {\r
70                         public void mouseEnter(MouseEvent event) {\r
71                                 PictureLabel.this.mouseEnter(event);\r
72                         }\r
73                         public void mouseExit(MouseEvent event) {\r
74                                 PictureLabel.this.mouseExit(event);\r
75                         }\r
76                 });\r
77 \r
78                 setSelection(false);\r
79         }\r
80 \r
81         public void mouseDown(MouseEvent event) {\r
82                 ImageClickedEvent e = new ImageClickedEvent(this, event.x, event.y);\r
83                 setSelection(!selected);\r
84                 for (ImageClickedListener listener : imageClickedListeners) {\r
85                         listener.imageClicked(e);\r
86                 }\r
87         }\r
88 \r
89         protected void mouseEnter(MouseEvent event) {\r
90                 setBackground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));\r
91         }\r
92 \r
93         protected void mouseExit(MouseEvent event) {\r
94                 setBackground(getDisplay().getSystemColor(selected ? SWT.COLOR_GRAY : SWT.COLOR_WHITE));\r
95         }\r
96 \r
97         public void setSelection(boolean selected) {\r
98                 this.selected = selected;\r
99                 setBackground(getDisplay().getSystemColor(selected ? SWT.COLOR_GRAY : SWT.COLOR_WHITE));\r
100         }\r
101 \r
102         public void addImageClickedListener(ImageClickedListener listener) {\r
103                 imageClickedListeners.add(listener);\r
104         }\r
105 \r
106         public void removeImageClickedListener(ImageClickedListener listener) {\r
107                 imageClickedListeners.remove(listener);\r
108         }\r
109 \r
110         void paintControl(PaintEvent e) {\r
111                 GC gc = e.gc;\r
112                 int x = 1;\r
113                 int y = 1;\r
114                 int clientAreaWidth = getClientArea().width;\r
115                 int textWidth = gc.stringExtent(text).x;\r
116                 int imageWidth = image.getBounds().width;\r
117                 int imageHeght = image.getBounds().height;\r
118                 int maxWidth = Math.max(Math.max(imageWidth, imageWidth), clientAreaWidth);\r
119 \r
120                 if ((image != null) & (text != null)) {\r
121                         x = 1 + (maxWidth - imageWidth) / 2;\r
122                         gc.drawImage(image, x, y);\r
123                         y = y + imageHeght + 5;\r
124                         x = 1 + (maxWidth - textWidth) / 2;\r
125                         gc.drawText(text, x, y);\r
126                 } else if (image != null) {\r
127                         x = 1 + (maxWidth - imageWidth) / 2;\r
128                         gc.drawImage(image, x, 1);\r
129                 } else if (text != null) {\r
130                         x = 1 + (maxWidth - textWidth) / 2;\r
131                         gc.drawText(text, x, 1);\r
132                 }\r
133                 gc.dispose();\r
134         }\r
135 \r
136         public Image getImage() {\r
137                 return image;\r
138         }\r
139 \r
140         public void setImage(Image image) {\r
141                 this.image = image;\r
142                 redraw();\r
143         }\r
144 \r
145         public String getText() {\r
146                 return text;\r
147         }\r
148 \r
149         public void setText(String text) {\r
150                 this.text = text;\r
151                 redraw();\r
152         }\r
153 \r
154         public Point computeSize(int wHint, int hHint, boolean changed) {\r
155                 int width = 0;\r
156                 int height = 0;\r
157                 if (image != null && text != null) {\r
158                         GC gc = new GC(this);\r
159                         int textWidth = gc.stringExtent(text).x;\r
160                         int textHeight = gc.stringExtent(text).y;\r
161                         int imageWidth = image.getBounds().width;\r
162                         int imageHeight = image.getBounds().height;\r
163                         gc.dispose();\r
164                         if (imageWidth >= textWidth)\r
165                                 width = imageWidth + 2;\r
166                         else\r
167                                 width = textWidth + 2;\r
168                         height = textHeight + imageHeight + 7;\r
169                 } else if (image != null) {\r
170                         Rectangle bounds = image.getBounds();\r
171                         width = bounds.width + 2;\r
172                         height = bounds.height + 2;\r
173                 } else if (text != null) {\r
174                         GC gc = new GC(this);\r
175                         Point extent = gc.stringExtent(text);\r
176                         gc.dispose();\r
177                         width = extent.x + 2;\r
178                         height = extent.y + 2;\r
179                 }\r
180                 if (wHint != -1)\r
181                         width = wHint;\r
182                 if (hHint != -1)\r
183                         height = hHint;\r
184 \r
185                 return new Point(width + 2, height + 2);\r
186         }\r
187 \r
188         public boolean isSelected() {\r
189                 return selected;\r
190         }\r
191 }\r
192 \r
193 class ImageClickedEvent extends java.util.EventObject {\r
194         public int x, y;\r
195 \r
196         public ImageClickedEvent(Object source, int x, int y) {\r
197                 super(source);\r
198 \r
199                 this.x = x;\r
200                 this.y = y;\r
201         }\r
202 }\r
203 \r
204 interface ImageClickedListener extends java.util.EventListener {\r
205         public void imageClicked(ImageClickedEvent event);\r
206 }\r