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