1 package com.tapina.robe.swi.wimp;
2
3 import com.tapina.robe.swi.os.Sprite;
4
5 import javax.swing.*;
6 import java.awt.*;
7 import java.awt.event.MouseEvent;
8 import java.awt.event.MouseListener;
9 import java.util.logging.Logger;
10
11 /***
12 * Created by IntelliJ IDEA.
13 * User: gareth
14 * Date: Sep 4, 2003
15 * Time: 6:21:30 PM
16 */
17 public final class Icon {
18 public static final int LEFT = 0, CENTRE = 1, RIGHT = 2;
19 public static final int TOP = 3, MIDDLE = 4, BOTTOM = 5;
20
21 public static final int IGNORE = 0, NOTIFY = 1, CLICK = 2, CLICK_ONCE = 3, RELEASE = 4, DOUBLE_CLICK = 5,
22 CLICK_ONCE_DRAG = 6, RELEASE_DRAG = 7, DOUBLE_CLICK_DRAG = 8, MENU = 9, CLICK_DOUBLE_CLICK_DRAG = 10,
23 CLICK_SELECT_DRAG = 11, CARET_DRAG = 14, CARET = 15;
24
25 public static final int TEXTICON = 1, SPRITEICON = 2, BORDERED = 4, H_CENTER = 8, V_CENTER = 16,
26 FILLED = 32, ANTI_ALIASED = 64, NEEDS_REDRAW = 128, INDIRECTED = 256, RIGHT_JUSTIFY = 512,
27 MULTI_SELECT_ADJUST = 1024, HALF_SIZE_SPRITE = 2048, SELECTED = 1<<21, SHADED = 1<<22, DELETED = 1<<23;
28
29 private final Logger log = Logger.getLogger(getClass().getName());
30 private Rectangle boundingBox;
31 private int iconFlags;
32 public int buttonType;
33 public int selectionGroup;
34 public int foregroundColour;
35 public int backgroundColour;
36
37 String text;
38 int textIndirectAddress;
39 String validationString;
40 int validationIndirectAddress;
41 Sprite sprite;
42
43 public Icon() {
44 this.boundingBox = new Rectangle();
45 }
46
47 public Icon(Rectangle boundingBox, int iconFlags, int buttonType, int esg, int foregroundColour,
48 int backgroundColour) {
49 this.boundingBox = boundingBox;
50 this.iconFlags = iconFlags;
51 this.buttonType = buttonType;
52 this.selectionGroup = esg;
53 this.foregroundColour = foregroundColour;
54 this.backgroundColour = backgroundColour;
55 }
56
57
58
59 public final int getBackgroundColour() {
60 return backgroundColour;
61 }
62
63 public final Rectangle getBoundingBox() {
64 return boundingBox;
65 }
66
67 public final int getButtonType() {
68 return buttonType;
69 }
70
71 public final int getForegroundColour() {
72 return foregroundColour;
73 }
74
75 public final int getIconFlags() {
76 return iconFlags;
77 }
78
79 public final int getSelectionGroup() {
80 return selectionGroup;
81 }
82
83 public final String getText() {
84 return text;
85 }
86
87 public final void setText(String text) {
88 this.text = text;
89 }
90
91 public final String getValidationString() {
92 return validationString;
93 }
94
95 public final void setValidationString(String validationString) {
96 this.validationString = validationString;
97 }
98
99 public final Sprite getSprite() {
100 return sprite;
101 }
102
103 public final void setSprite(Sprite sprite) {
104 this.sprite = sprite;
105 }
106
107 public final int getTextPositionH() {
108 if (isTextIcon() && isSpriteIcon()) {
109 return ((iconFlags & H_CENTER) == 0)?
110 (((iconFlags & RIGHT_JUSTIFY) != 0 && (iconFlags & V_CENTER) == 0)? RIGHT : LEFT)
111 :
112 (((iconFlags & V_CENTER) != 0 && (iconFlags & RIGHT_JUSTIFY) != 0)? RIGHT : CENTRE);
113 } else {
114 return ((iconFlags & H_CENTER) != 0)? CENTRE :
115 (((iconFlags & RIGHT_JUSTIFY) != 0)? RIGHT : LEFT);
116 }
117 }
118
119 public final int getTextPositionV() {
120 if ((iconFlags & V_CENTER) != 0) {
121 return MIDDLE;
122 } else if (isTextIcon() && isSpriteIcon()) {
123 return ((iconFlags & H_CENTER) != 0 && (iconFlags & RIGHT_JUSTIFY) != 0)? TOP : BOTTOM;
124 } else {
125 return TOP;
126 }
127 }
128
129 public final int getSpritePositionH() {
130 if (isTextIcon() && isSpriteIcon()) {
131 return ((iconFlags & H_CENTER) == 0)?
132 (((iconFlags & RIGHT_JUSTIFY) == 0)? LEFT : RIGHT)
133 :
134 (((iconFlags & V_CENTER) != 0 && (iconFlags & RIGHT_JUSTIFY) != 0)? LEFT : CENTRE);
135 } else {
136 return ((iconFlags & H_CENTER) != 0)? CENTRE :
137 (((iconFlags & RIGHT_JUSTIFY) != 0)? RIGHT : LEFT);
138 }
139 }
140
141 public final int getSpritePositionV() {
142 if ((iconFlags & V_CENTER) != 0) {
143 return MIDDLE;
144 } else if (isTextIcon() && isSpriteIcon()) {
145 return ((iconFlags & H_CENTER) != 0 && (iconFlags & RIGHT_JUSTIFY) != 0)? BOTTOM : TOP;
146 } else {
147 return TOP;
148 }
149 }
150
151 public final boolean isTextIcon() {
152 return (iconFlags & TEXTICON) != 0;
153 }
154
155 public final boolean isSpriteIcon() {
156 return (iconFlags & SPRITEICON) != 0;
157 }
158
159 public void setBoundingBox(Rectangle boundingBox) {
160 this.boundingBox = boundingBox;
161 }
162
163 /***
164 * @todo Update component to reflect this.
165 */
166 public void setIconFlags(int iconFlags) {
167 this.iconFlags = iconFlags;
168 }
169
170 public void setButtonType(int buttonType) {
171 this.buttonType = buttonType;
172 }
173
174 public void setSelectionGroup(int selectionGroup) {
175 this.selectionGroup = selectionGroup;
176 }
177
178 public void setForegroundColour(int foregroundColour) {
179 this.foregroundColour = foregroundColour;
180 }
181
182 public void setBackgroundColour(int backgroundColour) {
183 this.backgroundColour = backgroundColour;
184 }
185
186 public int getTextIndirectAddress() {
187 return textIndirectAddress;
188 }
189
190 public void setTextIndirectAddress(int textIndirectAddress) {
191 this.textIndirectAddress = textIndirectAddress;
192 }
193
194 public int getValidationIndirectAddress() {
195 return validationIndirectAddress;
196 }
197
198 public void setValidationIndirectAddress(int validationIndirectAddress) {
199 this.validationIndirectAddress = validationIndirectAddress;
200 }
201
202 /***
203 * @todo Need to make this component re-check indirected data in case it has been updated when redrawing
204 */
205 public final JComponent getComponent() {
206 final JComponent component;
207 final JLabel label = new JLabel();
208 if (isTextIcon()) {
209 component = label;
210 label.setText(text);
211 if (isSpriteIcon()) {
212 label.setIcon(new ImageIcon(sprite.getImage()));
213 }
214 } else if (isSpriteIcon()) {
215 component = label;
216 label.setIcon(new ImageIcon(sprite.getImage()));
217 } else {
218 component = new JPanel();
219 }
220 component.setBounds(boundingBox);
221 component.addMouseListener(new MouseListener() {
222 public void mouseClicked(MouseEvent e) {
223 if (buttonType != IGNORE && buttonType != NOTIFY && buttonType != CARET) {
224 log.info("CLICK");
225 }
226 }
227
228 public void mousePressed(MouseEvent e) {
229 if (buttonType == NOTIFY) {
230 log.info("NOTIFY");
231 }
232 }
233
234 public void mouseReleased(MouseEvent e) {
235
236 }
237
238 public void mouseEntered(MouseEvent e) {
239
240 }
241
242 public void mouseExited(MouseEvent e) {
243
244 }
245 });
246
247 return component;
248 }
249 }