src/main/java/xelfi/design/components/xawt/XLabel.java
author Jaroslav Tulach <jaroslav.tulach@xelfi.cz>
Tue, 17 Jan 2017 21:08:47 +0100
changeset 6 947ce1156833
parent 5 2c326fbd80f2
permissions -rw-r--r--
Renaming setName to setDesignName and setSize to setDesignSize to avoid clash with added methods of java.awt.Component that return void
     1 /**
     2 * Xelfi
     3 */
     4 
     5 package xelfi.design.components.xawt;
     6 
     7 /**
     8   *
     9   * @version 	2.12, 03 Apr 1997
    10   * @author 	Petr Hamernik, Ian Formanek
    11   *
    12   */
    13 
    14 import java.awt.*;
    15 import java.io.*;
    16 import xelfi.design.components.*;
    17 import xelfi.design.components.property.*;
    18 import xelfi.design.forms.XelfiDesignForm;
    19 import xelfi.design.util.XFDesignConstants;
    20 import xelfi.design.util.XFDesignOptions;
    21 import xelfi.design.util.XFDesignUtils;
    22 
    23 public class XLabel extends XAWTPanel {
    24 	private Label label;
    25 	private static int propertyCount = 10;
    26 	private Object propDef[];
    27 	private boolean propDefSet = false;
    28 	private static int eventCount = 2;
    29 	private String events[] = new String[eventCount];
    30 	protected static Image icon = null;
    31 
    32 	private boolean labeled = false;
    33 	
    34 	public XLabel() { 
    35 		super(XAWTPanel.WITH_DRAGBORDER);
    36 		setComponent(label = new Label());
    37 		propDef = new Object[propertyCount];
    38 		for (int i=0; i<propertyCount; i++)
    39 			propDef[i] = null;
    40 		if (icon == null)
    41 			icon = loadIcon("label.gif");
    42 	}
    43 
    44 	protected void regenForm(int what) {
    45 		if (parentForm != null)
    46 			parentForm.regenerateCode(this, what);
    47 	}
    48 
    49 	public int setDesignName(String aName) {
    50 		if (!labeled) {
    51 			label.setText(aName); 
    52 			if (autoSize)
    53 				setDesignSize(0,0);
    54 		}
    55 		super.setDesignName(aName);
    56 		if (!labeled) return XFDesignConstants.RSP_OTHER_PROP;
    57 		else return XFDesignConstants.RSP_OK;
    58 	}
    59 
    60 	public String[] neededImports() {
    61 		String[] ret = new String[1];
    62 		ret[0] = "java.awt.Label";
    63 		return ret;
    64 	}
    65 
    66 	public Image getIcon() {
    67 		return icon; 
    68 	}
    69 
    70 	private boolean propertyDefault(int i) throws XFPropertyIndexOutOfBoundsException {
    71 		if (propDefSet)
    72 			propertiesSetDefault();
    73 		if (propDef[i] == null)
    74 			return false;
    75 		switch (i) {
    76 			case 0: return ((Color) propDef[i]).equals(label.getBackground());
    77 			case 1: return ((Color) propDef[i]).equals(label.getForeground());
    78 			case 2: return (((Boolean) propDef[i]).booleanValue() == label.isEnabled());
    79 			case 3: return (((Boolean) propDef[i]).booleanValue() == bVisible);
    80 			case 4: return ((Font) propDef[i]).equals(label.getFont());
    81 			case 5: return false;
    82 			case 6: return (((Boolean) propDef[i]).booleanValue() == autoSize);
    83 			case 7: return (((Boolean) propDef[i]).booleanValue() == parentColor);
    84 			case 8: return (((Boolean) propDef[i]).booleanValue() == parentFont);
    85 			case 9: return (((Integer) propDef[i]).intValue() == label.getAlignment());
    86 			default: throw new XFPropertyIndexOutOfBoundsException();
    87 		}
    88 	}
    89 
    90 	private void propertiesSetDefault() {
    91 		if (propDefSet)
    92 			return;
    93 		propDefSet = true;
    94 		if (label.getBackground() != null)
    95 				propDef[0] = new Color(label.getBackground().getRGB());
    96 		if (label.getForeground() != null)
    97 				propDef[1] = new Color(label.getForeground().getRGB());
    98 		propDef[2] = new Boolean(label.isEnabled());
    99 		propDef[3] = new Boolean(bVisible);
   100 		if (label.getFont() != null)
   101 			propDef[4] = new Font(label.getFont().getName(),label.getFont().getStyle(),label.getFont().getSize());
   102 		propDef[5] = new String("");
   103 		propDef[6] = new Boolean(autoSize);
   104 		propDef[7] = new Boolean(parentColor);
   105 		propDef[8] = new Boolean(parentFont);
   106 		propDef[9] = new Integer(label.getAlignment());
   107 	}
   108 		
   109 	public int getPropertyCount() { return propertyCount; }
   110 	
   111 	public Object getProperty(int index) throws XFPropertyIndexOutOfBoundsException { 
   112 		switch (index) {
   113 			case 0: return label.getBackground();
   114 			case 1: return label.getForeground();
   115 			case 2: return (label.isEnabled()) ? Boolean.TRUE : Boolean.FALSE;
   116 			case 3: return (bVisible) ? Boolean.TRUE : Boolean.FALSE;
   117 			case 4: return label.getFont();
   118 			case 5: return label.getText();
   119 			case 6: return (autoSize) ? Boolean.TRUE : Boolean.FALSE;
   120 			case 7: return (parentColor) ? Boolean.TRUE : Boolean.FALSE;
   121 			case 8: return (parentFont) ? Boolean.TRUE : Boolean.FALSE;
   122 			case 9: return new Integer(label.getAlignment());
   123 			default: throw new XFPropertyIndexOutOfBoundsException();
   124 		}
   125 	}
   126 			
   127 	public String[] getPropertyNames() { 
   128 		String list[] = new String[propertyCount];
   129 		list[0] = "Background Color";
   130 		list[1] = "Foreground Color";
   131 		list[2] = "Enabled";
   132 		list[3] = "Visible";
   133 		list[4] = "Font";
   134 		list[5] = "Text";
   135 		list[6] = "Auto Size";
   136 		list[7] = "Parent Color";
   137 		list[8] = "Parent Font";
   138 		list[9] = "Alignment";
   139 		return list;
   140 	}
   141 		
   142 	public String getPropertyString(int index) throws 
   143 		XFPropertyIndexOutOfBoundsException { 
   144 		switch (index) {
   145 			case 0: 
   146 			case 1: return XColorPropertyType.viewString(getProperty(index));
   147 			case 2:
   148 			case 3: return XBooleanPropertyType.viewString(getProperty(index));
   149 			case 4: return XFontPropertyType.viewString(getProperty(index));
   150 			case 5: return XStringPropertyType.viewString(getProperty(index));
   151 			case 6: 
   152 			case 7: 
   153 			case 8: return XBooleanPropertyType.viewString(getProperty(index));
   154 			case 9: return XIntegerPropertyType.viewString(getProperty(index)); //!!!
   155 			default: throw new XFPropertyIndexOutOfBoundsException();
   156 		}
   157 	}
   158 
   159 	public int getPropertyViewerType(int index) throws 
   160 		XFPropertyIndexOutOfBoundsException {
   161 		switch (index) {
   162 			case 0: 
   163 			case 1: return XFDesignConstants.PVT_SPECIAL;
   164 			case 2:
   165 			case 3: return XFDesignConstants.PVT_CHECK;
   166 			case 4: return XFDesignConstants.PVT_SPECIAL;
   167 			case 5: return XFDesignConstants.PVT_INPUT_STRING;
   168 			case 6: 
   169 			case 7: 
   170 			case 8: return XFDesignConstants.PVT_CHECK;
   171 			case 9: return XFDesignConstants.PVT_CHOICE_STRICT;
   172 			default: throw new XFPropertyIndexOutOfBoundsException();
   173 		}
   174 	}
   175 
   176 	public String[] getPropertyValueNames(int index) throws 
   177 		XFPropertyIndexOutOfBoundsException {
   178 		switch (index) {
   179 			case 9: String[] ret = new String[3];
   180 					ret[0] = "CENTER";
   181 					ret[1] = "LEFT";
   182 					ret[2] = "RIGHT";
   183 					return ret;
   184 			default: throw new XFPropertyIndexOutOfBoundsException();
   185 		}
   186 	}
   187 
   188 	public Object[] getPropertyValueValues(int index) throws 
   189 		XFPropertyIndexOutOfBoundsException {
   190 		switch (index) {
   191 			case 9: Integer[] ret = new Integer[3];
   192 					ret[0] = new Integer(label.CENTER);
   193 					ret[1] = new Integer(label.LEFT);
   194 					ret[2] = new Integer(label.RIGHT);
   195 					return ret;
   196 			default: throw new XFPropertyIndexOutOfBoundsException();
   197 		}
   198 	}
   199 
   200 	public int setProperty(int index, Object value) throws 	
   201 		XFPropertyIndexOutOfBoundsException,
   202 		XFPropertyBadValueTypeException 
   203 	{ 
   204 		int ret = XFDesignConstants.RSP_OK;
   205 		int regen = XFDesignConstants.GEN_SETPROPS;
   206 		if (!propDefSet)
   207 			propertiesSetDefault();
   208 		switch (index) { 
   209 			case 0: if (!(value instanceof Color)) throw new XFPropertyBadValueTypeException();
   210 					label.setBackground((Color)value);
   211 					ret = ret | XFDesignConstants.RSP_REPAINT_COMP;
   212 					label.hide();
   213 					label.show();
   214 					if (parentColor) {
   215 						parentColor = false;
   216 						ret = ret | XFDesignConstants.RSP_OTHER_PROP;
   217 					}
   218 					break;
   219 			case 1:	if (!(value instanceof Color)) throw new XFPropertyBadValueTypeException();
   220 					label.setForeground((Color)value);
   221 					ret = ret | XFDesignConstants.RSP_REPAINT_COMP;
   222 					label.hide();
   223 					label.show();
   224 					if (parentColor) {
   225 						parentColor = false;
   226 						ret = ret | XFDesignConstants.RSP_OTHER_PROP;
   227 					}
   228 					break;
   229 			case 2:	if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
   230 					label.enable(((Boolean)value).booleanValue());
   231 					break;
   232 			case 3:	if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
   233 					bVisible = ((Boolean)value).booleanValue();
   234 					break;
   235 			case 4:	if (!(value instanceof Font)) throw new XFPropertyBadValueTypeException();
   236 					label.setFont((Font)value); 
   237 					ret = ret | XFDesignConstants.RSP_REPAINT_COMP | XFDesignConstants.RSP_OTHER_PROP;
   238 					if (parentFont) {
   239 						parentFont = false;
   240 						if (autoSize) {
   241 							setDesignSize(0,0);
   242 							regen = regen | XFDesignConstants.GEN_RESHAPE;
   243 						}
   244 					}
   245 					repaintComponent();
   246 					break;
   247 			case 5:	if (!(value instanceof String)) throw new XFPropertyBadValueTypeException();
   248 					label.setText((String)value);
   249 					labeled = true; // so that caption of a button does not change with its name no more
   250 					regen = regen | XFDesignConstants.GEN_INIT;
   251 					if (autoSize) {
   252 						setDesignSize(0,0);
   253 						regen = regen | XFDesignConstants.GEN_RESHAPE;
   254 						ret = ret | XFDesignConstants.RSP_REPAINT_COMP;
   255 						ret = ret | XFDesignConstants.RSP_OTHER_PROP;
   256 					}
   257 					repaintComponent();
   258 					break;
   259 			case 6: if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
   260 					setAutoSize(((Boolean)value).booleanValue());
   261 					if (autoSize) {
   262 						repaintComponent();
   263 						setDesignSize(0,0);
   264 						ret = ret | XFDesignConstants.RSP_OTHER_PROP;
   265 					}
   266 					regen = regen | XFDesignConstants.GEN_RESHAPE;
   267 					ret = ret | XFDesignConstants.RSP_REPAINT_COMP;
   268 					break;
   269 			case 7: if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
   270 					setParentColor(((Boolean)value).booleanValue());
   271 					if (parentColor)
   272 						ret = ret | XFDesignConstants.RSP_REPAINT_COMP;
   273 					break;
   274 			case 8:	if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
   275 					setParentFont(((Boolean)value).booleanValue());
   276 					if (parentFont)
   277 						ret = ret | XFDesignConstants.RSP_REPAINT_COMP;
   278 					if (autoSize)
   279 					 	ret = ret | XFDesignConstants.RSP_OTHER_PROP;
   280 					break;
   281 			case 9:	if (!(value instanceof Integer)) throw new XFPropertyBadValueTypeException();
   282 					label.setAlignment(((Integer)value).intValue());
   283 					ret = ret | XFDesignConstants.RSP_REPAINT_COMP;
   284 					break;
   285 			default: throw new XFPropertyIndexOutOfBoundsException();
   286 		}
   287 		if (parentForm != null)
   288 			parentForm.regenerateCode(this, regen);
   289 		
   290 		return ret;
   291 	}
   292 			
   293 	public void specialPropertyInput(Frame parent, int index) throws 	
   294 		XFPropertyIndexOutOfBoundsException, 
   295 		XFPropertyNoSpecialInputException { 
   296 		if ((index < 0) || (index >= propertyCount)) throw new XFPropertyIndexOutOfBoundsException();
   297 		switch (index) { 
   298 			case 0:
   299 			case 1: XColorPropertyType.invokeSpecialInput(parent, this, index);
   300 						break;
   301 			case 4: XFontPropertyType.invokeSpecialInput(parent, this, index);
   302 						break;
   303 			default: throw new XFPropertyNoSpecialInputException();
   304 		}
   305 	}
   306 
   307 	public int getEventCount() {
   308 		return eventCount;
   309 	}
   310 
   311 	public String[] getEventNames() {
   312 		String list[] = new String[eventCount];
   313 		list[0] = "OnGotFocus";
   314 		list[1] = "OnLostFocus";
   315 		return list;
   316 	}
   317 
   318 	public String getEvent(int index) throws 
   319 		XFPropertyIndexOutOfBoundsException {
   320 		if ((index>=0) && (index<eventCount)) {
   321 			if (events[index] == null)
   322 				return null;
   323 			else
   324 				return new String(events[index]); 
   325 		}
   326 		else throw new XFPropertyIndexOutOfBoundsException();
   327 	}		
   328 		
   329 	public void setEvent(int index, String value) throws 
   330 		XFPropertyIndexOutOfBoundsException {
   331 		if ((index>=0) && (index<eventCount))
   332 			events[index] = value;
   333 		else throw new XFPropertyIndexOutOfBoundsException();
   334 	}		
   335 
   336 	public String getClassName() {
   337 		return "Label";
   338 	}
   339 	
   340 	public String generateCode(int what) {
   341 		String gen = "";
   342 		switch (what) {
   343 			case XFDesignConstants.GEN_VARIABLE: 
   344 				gen = getClassName()+" "+ name + ";\n";
   345 				break;
   346 			case XFDesignConstants.GEN_INIT: 
   347 				gen = name + " = new " + getClassName() + "(\"" + label.getText() + "\");\n";
   348 				break;
   349 			case XFDesignConstants.GEN_SETPROPS:
   350 				if (!propDefSet)
   351 					propertiesSetDefault();
   352 				for (int i = 0; i < propertyCount; i++) {
   353 					if (!propertyDefault(i)) {
   354 						switch(i) {
   355 							case 0: if (!parentColor)
   356 										gen = gen + name + ".setBackground(" +
   357 											XFDesignUtils.genColor(label.getBackground()) + ");\n";
   358 									break;
   359 							case 1: if (!parentColor)
   360 										gen = gen + name + ".setForeground(" +
   361 											XFDesignUtils.genColor(label.getForeground()) + ");\n";
   362 									break;
   363 							case 2: gen = gen + name + (label.isEnabled() ? ".enable();\n" : ".disable();\n");
   364 									break;
   365 							case 3: gen = gen + name + ((bVisible) ? ".show();\n" : ".hide();\n");
   366 									break;
   367 							case 4: if (!parentFont) {
   368 										gen = gen + name + ".setFont(" + 
   369 											XFDesignUtils.genFont(label.getFont())+");\n";
   370 									}
   371 									break;
   372 							case 9: gen = gen + name + ".setAlignment(Label.";
   373 									switch (label.getAlignment()) {
   374 										case Label.CENTER: gen = gen + "CENTER"; break;
   375 										case Label.LEFT: gen = gen + "LEFT"; break;
   376 										case Label.RIGHT: gen = gen + "RIGHT"; break;
   377 									}
   378 									gen = gen + ");\n";
   379 									break;
   380 						}
   381 					}
   382 				}
   383 				break;			
   384 			case XFDesignConstants.GEN_RESHAPE:
   385 				if (((XelfiVisualContainer) getParent()).getDesignLayout().allowsDragging()) {
   386 					if (!autoSize) 
   387 						if (getParent() instanceof XelfiDesignForm)
   388 							gen = name + ".reshape(insets.left+"+position.x+", insets.top+"+position.y+","+size.width+","+size.height+");\n";
   389 						else 
   390 							gen = name + ".reshape("+position.x+","+position.y+","+size.width+","+size.height+");\n";
   391 					else {
   392 						gen = name + ".resize(" + name + ".preferredSize());\n";
   393 						if (getParent() instanceof XelfiDesignForm)
   394 							gen = gen + name + ".move(insets.left+"+position.x+", insets.top+"+position.y+");\n";
   395 						else
   396 							gen = gen + name + ".move("+position.x+","+position.y+");\n";
   397 					}
   398 				}
   399 				break;
   400 		}
   401 		return gen;
   402 	}
   403 
   404 	public String generateEventCondition(int index) throws XFPropertyIndexOutOfBoundsException {
   405 		String evt = XFDesignOptions.eventVarName;
   406 		switch (index) { 
   407 			case 0: return evt +".id == Event.GOT_FOCUS && "+evt+".target == "+getName();
   408 			case 1: return evt +".id == Event.LOST_FOCUS && "+evt+".target == "+getName();
   409 			default: throw new XFPropertyIndexOutOfBoundsException();
   410 		}
   411 	}
   412 
   413 	public void loadFromStream(DataInput stream) throws IOException {
   414 
   415 		super.loadFromStream(stream);
   416 
   417 		if (!propDefSet)
   418 			propertiesSetDefault();
   419 
   420 		for (int i = 0; i < propertyCount; i++) {
   421 			if (stream.readBoolean()) {
   422 				propDef[i] = null;
   423 				if (i == 5) 
   424 					label.setText(name); // default label = component name
   425 			}
   426 			else switch (i) {
   427 				case 0: label.setBackground(XColorPropertyType.loadFromStream(stream)); break;
   428 				case 1: label.setForeground(XColorPropertyType.loadFromStream(stream)); break;
   429 				case 2: label.enable(XBooleanPropertyType.loadBFromStream(stream)); break;
   430 				case 3: bVisible = XBooleanPropertyType.loadBFromStream(stream); break;
   431 				case 4: label.setFont(XFontPropertyType.loadFromStream(stream)); break;
   432 				case 5: label.setText(XStringPropertyType.loadFromStream(stream)); break;
   433 				case 6: setAutoSize(XBooleanPropertyType.loadBFromStream(stream)); break;
   434 				case 7: setParentColor(XBooleanPropertyType.loadBFromStream(stream)); break;
   435 				case 8: setParentFont(XBooleanPropertyType.loadBFromStream(stream)); break;
   436 				case 9: label.setAlignment(XIntegerPropertyType.loadFromStream(stream).intValue()); break;
   437 			}
   438 		}
   439 
   440 		for (int i = 0; i < eventCount; i++) {
   441 			if (stream.readBoolean())
   442 				parentForm.assignEvent(this, i, stream.readUTF());
   443 		}
   444 	}		
   445 	
   446 	public void saveToStream(DataOutput stream) throws IOException {
   447 
   448 		super.saveToStream(stream);
   449 
   450 		for (int i = 0; i < propertyCount; i++) {
   451 			boolean b = propertyDefault(i);
   452 			stream.writeBoolean(b);
   453 			if (!b) {
   454 				switch (i) {
   455 					case 0: XColorPropertyType.saveToStream(label.getBackground(), stream); break;
   456 					case 1: XColorPropertyType.saveToStream(label.getForeground(), stream); break;
   457 					case 2: XBooleanPropertyType.saveToStream(label.isEnabled(), stream); break;
   458 					case 3: XBooleanPropertyType.saveToStream(bVisible, stream); break;
   459 					case 4: XFontPropertyType.saveToStream(label.getFont(), stream); break;
   460 					case 5: XStringPropertyType.saveToStream(label.getText(), stream); break;
   461 					case 6: XBooleanPropertyType.saveToStream(autoSize, stream); break;
   462 					case 7: XBooleanPropertyType.saveToStream(parentColor, stream); break;
   463 					case 8: XBooleanPropertyType.saveToStream(parentFont, stream); break;
   464 					case 9: XIntegerPropertyType.saveToStream(new Integer(label.getAlignment()), stream); break;
   465 				}
   466 			}
   467 		}
   468 		for (int i = 0; i < eventCount; i++) {
   469 			if ((events[i] != null) && (events[i].length() > 0)) {
   470 				stream.writeBoolean(true);
   471 				stream.writeUTF(events[i]);
   472 			}
   473 			else stream.writeBoolean(false);
   474 		}
   475 	}
   476 	
   477 }