[vassalengine-svn-trunk] [vassalengine-svn] SF.net SVN: vassalengine:[8274] VASSAL-src/trunk
Brought to you by:
rodneykinney,
uckelman
From: <uck...@us...> - 2012-08-14 20:14:48
|
Revision: 8274 http://vassalengine.svn.sourceforge.net/vassalengine/?rev=8274&view=rev Author: uckelman Date: 2012-08-14 20:14:40 +0000 (Tue, 14 Aug 2012) Log Message: ----------- Merged Brent-3.2-New@8269. Bug 4462: ABR: StackOverflowError Processing ErrorDialog when BeanShell errro in Counter name Bug 4402: ABR: StackOverflowError recursive loop generating counter name with Label Modified Label trait - Added a Description field to the Label trait to improve error reporting of problems involving Label traits. - Convert any $PieceName$ typed by designer to $pieceName$, $PieceName$ will always cause an infinite loop Rationalised the way all Loopable Decorators report their name during Recursion Limiter exceptions. Use the name of the inner piece to prevent setting off a infinite loop during error reporting. Modified Paths: -------------- VASSAL-src/trunk/src/VASSAL/counters/ActionButton.java VASSAL-src/trunk/src/VASSAL/counters/CalculatedProperty.java VASSAL-src/trunk/src/VASSAL/counters/CounterGlobalKeyCommand.java VASSAL-src/trunk/src/VASSAL/counters/Labeler.java VASSAL-src/trunk/src/VASSAL/counters/TriggerAction.java VASSAL-src/trunk/src/VASSAL/counters/UsePrototype.java Property Changed: ---------------- VASSAL-src/trunk/ Property changes on: VASSAL-src/trunk ___________________________________________________________________ Modified: svn:mergeinfo - /VASSAL-src/branches/3.1:7756,7764,7810,7812-7813,7872,7876,7879,7909,7913,7964,7966,7968,7998,8097,8111-8112,8159-8162,8172,8181-8182,8233,8235-8238,8241,8244,8246,8260-8261 /VASSAL-src/branches/Brent-3.2:8206,8216-8217,8219-8220,8222,8225,8227,8248,8252 /VASSAL-src/branches/Brent-3.2-New:8263,8267,8272 /VASSAL-src/branches/brent-3.2:7824-7825,7862-7865,7875,7878,7882,7884,7886,7896,7903,7911,7917,7929,7942,7988,7995 /VASSAL-src/branches/george973-bugs:7800,7806,7962-7963 /VASSAL-src/branches/george973-bugs-3.2:8081 /VASSAL-src/branches/george973-ocs:8167-8169 /VASSAL-src/branches/lance-3.2 8085:8127 /VASSAL-src/branches/lancel-3.1:7680 /VASSAL-src/branches/pgeerkens-3.2:7836-7837,7839,7841-7842,7849,7893,7899,7902,7904,7906,7922,7930 /VASSAL-src/branches/uckelman-integration:7971-8007 /VASSAL-src/branches/uckelman-working2:7194-7700 /VASSAL-src/branches/viewport-3.2:7992 + /VASSAL-src/branches/3.1:7756,7764,7810,7812-7813,7872,7876,7879,7909,7913,7964,7966,7968,7998,8097,8111-8112,8159-8162,8172,8181-8182,8233,8235-8238,8241,8244,8246,8260-8261 /VASSAL-src/branches/Brent-3.2:8206,8216-8217,8219-8220,8222,8225,8227,8248,8252 /VASSAL-src/branches/Brent-3.2-New:8263,8267,8269,8272 /VASSAL-src/branches/brent-3.2:7824-7825,7862-7865,7875,7878,7882,7884,7886,7896,7903,7911,7917,7929,7942,7988,7995 /VASSAL-src/branches/george973-bugs:7800,7806,7962-7963 /VASSAL-src/branches/george973-bugs-3.2:8081 /VASSAL-src/branches/george973-ocs:8167-8169 /VASSAL-src/branches/lance-3.2 8085:8127 /VASSAL-src/branches/lancel-3.1:7680 /VASSAL-src/branches/pgeerkens-3.2:7836-7837,7839,7841-7842,7849,7893,7899,7902,7904,7906,7922,7930 /VASSAL-src/branches/uckelman-integration:7971-8007 /VASSAL-src/branches/uckelman-working2:7194-7700 /VASSAL-src/branches/viewport-3.2:7992 Modified: VASSAL-src/trunk/src/VASSAL/counters/ActionButton.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/counters/ActionButton.java 2012-08-14 19:24:12 UTC (rev 8273) +++ VASSAL-src/trunk/src/VASSAL/counters/ActionButton.java 2012-08-14 20:14:40 UTC (rev 8274) @@ -135,7 +135,8 @@ // Implement Loopable public String getComponentName() { - return Decorator.getOutermost(this).getLocalizedName(); + // Use inner name to prevent recursive looping when reporting errors. + return piece.getName(); } public String getComponentTypeName() { Modified: VASSAL-src/trunk/src/VASSAL/counters/CalculatedProperty.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/counters/CalculatedProperty.java 2012-08-14 19:24:12 UTC (rev 8273) +++ VASSAL-src/trunk/src/VASSAL/counters/CalculatedProperty.java 2012-08-14 20:14:40 UTC (rev 8274) @@ -220,17 +220,14 @@ } } - /** - * Return this components name. - * DO NOT return getName(), as any references to us from another trait will - * cause an infinite loop - */ + // Implement Loopable public String getComponentName() { - return piece.getProperty(BasicPiece.BASIC_NAME)+"-"+name; + // Use inner name to prevent recursive looping when reporting errors. + return piece.getName(); } public String getComponentTypeName() { - return "Calculated Property"; + return getDescription(); } /** Modified: VASSAL-src/trunk/src/VASSAL/counters/CounterGlobalKeyCommand.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/counters/CounterGlobalKeyCommand.java 2012-08-14 19:24:12 UTC (rev 8273) +++ VASSAL-src/trunk/src/VASSAL/counters/CounterGlobalKeyCommand.java 2012-08-14 20:14:40 UTC (rev 8274) @@ -302,9 +302,9 @@ } // Implement Loopable - // Be careful not to start a new infinite loop. public String getComponentName() { - return piece.getProperty(BasicPiece.BASIC_NAME).toString(); + // Use inner name to prevent recursive looping when reporting errors. + return piece.getName(); } public String getComponentTypeName() { Modified: VASSAL-src/trunk/src/VASSAL/counters/Labeler.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/counters/Labeler.java 2012-08-14 19:24:12 UTC (rev 8273) +++ VASSAL-src/trunk/src/VASSAL/counters/Labeler.java 2012-08-14 20:14:40 UTC (rev 8274) @@ -63,6 +63,9 @@ import VASSAL.i18n.TranslatablePiece; import VASSAL.tools.FormattedString; import VASSAL.tools.NamedKeyStroke; +import VASSAL.tools.RecursionLimitException; +import VASSAL.tools.RecursionLimiter; +import VASSAL.tools.RecursionLimiter.Loopable; import VASSAL.tools.SequenceEncoder; import VASSAL.tools.image.ImageUtils; import VASSAL.tools.imageop.AbstractTileOpImpl; @@ -71,7 +74,7 @@ /** * Displays a text label, with content specified by the user at runtime. */ -public class Labeler extends Decorator implements TranslatablePiece { +public class Labeler extends Decorator implements TranslatablePiece, Loopable { public static final String ID = "label;"; protected Color textBg = Color.black; protected Color textFg = Color.white; @@ -94,6 +97,7 @@ private FormattedString nameFormat = new FormattedString("$" + PIECE_NAME + "$ ($" + LABEL + "$)"); private FormattedString labelFormat = new FormattedString(""); private static final String PIECE_NAME = "pieceName"; + private static final String BAD_PIECE_NAME = "PieceName"; private static final String LABEL = "label"; protected ScaledImagePainter imagePainter = new ScaledImagePainter(); @@ -107,6 +111,7 @@ protected int rotateDegrees; protected String propertyName; protected KeyCommand menuKeyCommand; + protected String description; private Point position = null; // Label position cache @@ -134,14 +139,23 @@ horizontalOffset = st.nextInt(0); verticalJust = st.nextChar('b'); horizontalJust = st.nextChar('c'); - nameFormat.setFormat(st.nextToken("$" + PIECE_NAME + "$ ($" + LABEL + "$)")); + nameFormat.setFormat(clean(st.nextToken("$" + PIECE_NAME + "$ ($" + LABEL + "$)"))); final String fontFamily = st.nextToken("Dialog"); final int fontStyle = st.nextInt(Font.PLAIN); font = new Font(fontFamily, fontStyle, fontSize); rotateDegrees = st.nextInt(0); propertyName = st.nextToken("TextLabel"); + description = st.nextToken(""); } + /* + * Clean up any property names that will cause an infinite loop when used in a label name + */ + protected String clean(String s) { + // Cannot use $PieceName$ in a label format, must use $pieceName$ + return s.replaceAll("$"+BAD_PIECE_NAME+"$", "$"+PIECE_NAME+"$"); + } + @Override public Object getLocalizedProperty(Object key) { if (key.equals(propertyName)) { @@ -186,7 +200,8 @@ .append(font.getFamily()) .append(font.getStyle()) .append(String.valueOf(rotateDegrees)) - .append(propertyName); + .append(propertyName) + .append(description); return ID + se.getValue(); } @@ -199,14 +214,25 @@ } public String getName() { + String result = ""; if (label.length() == 0) { - return piece.getName(); + result = piece.getName(); } else { nameFormat.setProperty(PIECE_NAME, piece.getName()); nameFormat.setProperty(LABEL, getLabel()); - return nameFormat.getText(Decorator.getOutermost(this)); + try { + RecursionLimiter.startExecution(this); + result = nameFormat.getText(Decorator.getOutermost(this)); + } + catch (RecursionLimitException e) { + e.printStackTrace(); + } + finally { + RecursionLimiter.endExecution(); + } } + return result; } public String getLocalizedName() { @@ -221,6 +247,7 @@ return f.getLocalizedText(Decorator.getOutermost(this)); } } + // FIXME: This doesn't belong here. Should be in ImageUtils instead? public static void drawLabel(Graphics g, String text, int x, int y, int hAlign, int vAlign, Color fgColor, Color bgColor) { @@ -610,7 +637,7 @@ } public String getDescription() { - return "Text Label"; + return "Text Label" + (description.length() > 0 ? (" - "+description) : ""); } public HelpFile getHelpFile() { @@ -646,10 +673,14 @@ private IntConfigurer rotate; private BooleanConfigurer bold, italic; private StringConfigurer propertyNameConfig; + private StringConfigurer descConfig; public Ed(Labeler l) { controls.setLayout(new BoxLayout(controls, BoxLayout.Y_AXIS)); + descConfig = new StringConfigurer(null, "Description: ", l.description); + controls.add(descConfig.getControls()); + initialValue = new StringConfigurer(null, "Text: ", l.label); controls.add(initialValue.getControls()); @@ -784,7 +815,8 @@ if (i == null) i = 0; se.append(i.toString()) - .append(propertyNameConfig.getValueString()); + .append(propertyNameConfig.getValueString()) + .append(descConfig.getValueString()); return ID + se.getValue(); } @@ -828,4 +860,13 @@ new String[] {labelFormat.getFormat(), nameFormat.getFormat(), menuCommand}, new String[] {"Label Text", "Label Format", "Change Label Command"}); } + + public String getComponentTypeName() { + // Use inner name to prevent recursive looping when reporting errors. + return piece.getName(); + } + + public String getComponentName() { + return getDescription(); + } } Modified: VASSAL-src/trunk/src/VASSAL/counters/TriggerAction.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/counters/TriggerAction.java 2012-08-14 19:24:12 UTC (rev 8273) +++ VASSAL-src/trunk/src/VASSAL/counters/TriggerAction.java 2012-08-14 20:14:40 UTC (rev 8274) @@ -602,7 +602,8 @@ // Implement Loopable public String getComponentName() { - return Decorator.getOutermost(this).getLocalizedName(); + // Use inner name to prevent recursive looping when reporting errors. + return piece.getName(); } public String getComponentTypeName() { Modified: VASSAL-src/trunk/src/VASSAL/counters/UsePrototype.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/counters/UsePrototype.java 2012-08-14 19:24:12 UTC (rev 8273) +++ VASSAL-src/trunk/src/VASSAL/counters/UsePrototype.java 2012-08-14 20:14:40 UTC (rev 8274) @@ -228,10 +228,10 @@ // Implement Loopable public String getComponentName() { - return getDescription(); + return piece.getName(); } public String getComponentTypeName() { - return "Prototype"; + return getDescription(); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ vassalengine-svn mailing list vas...@li... https://lists.sourceforge.net/lists/listinfo/vassalengine-svn |