Class Attachment
java.lang.Object
VASSAL.search.AbstractImageFinder
VASSAL.counters.Decorator
VASSAL.counters.Attachment
- All Implemented Interfaces:
PropertyNameSource, PropertySource, EditablePiece, GamePiece, PropertyExporter, StateMergeable, TranslatablePiece, PersistentPropertyContainer, Auditable, ImageSearchTarget, SearchTarget, RecursionLimiter.Loopable
Trait allowing creation of an "attachment" to one or more other pieces, which can then be sent GKCs very swiftly and whose
properties can be easily read (and if a Dynamic Property can also be set with a Set Global Property trait)
-
Nested Class Summary
Nested Classes -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected booleanstatic final Stringstatic final Stringstatic final Stringprotected Stringprotected NamedKeyStrokeprotected Stringprotected booleanstatic final Stringprotected static final String[]static final Stringprotected static final String[]protected Stringprotected Stringprotected NamedKeyStrokeprotected Stringprotected PropertyExpressionprotected NamedKeyStrokeprotected GlobalCommandTargetprotected KeyCommand[]protected Stringprotected booleanprotected GlobalAttachstatic final Stringstatic final Stringstatic final Stringprotected static final String[]static final Stringprotected static final String[]protected static final String[]static final Stringprotected static final String[]static final Stringprotected Stringprotected Stringprotected PropertyExpressionprotected intprotected Stringprotected booleanprotected GlobalCommandTargetFields inherited from interface PropertyExporter
LOCALIZED_NAMEFields inherited from interface TranslatablePiece
PREFIX -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionattach()Runs a search using the provided filter (same as a Global Key Command), and any matching pieces become our attachments (stored in our "contents" list)voidautoAttach(Attachment attach) Auto-attach to a piece 1.clearAll()Clears all existing attachment(s)voidDraw this GamePieceintgetAttachedPieceAt(int index) getAttachList(GamePiece piece, String attachmentName) Return the named attachment list on the supplied GamePieceSupport for a basic-name-only description introduced later, so this default retrofits it from the full description if an explicit one is not defined.A plain-English description of this type of trait/piece - includes data from fields where appropriateIf Decorator contains a description *field*, returns the current contents of it.Returns a localized translation of the specified property value, if available.getName()The plain English name for this piecegetProperty(Object key) Properties can be associated with a piece -- many may be game-specific, but others are standard, such as the LocationName property exposed by BasicPiece -- and can be read through this interface.Return Property names exposed by this traitgetShape()booleanbooleanbooleanAdds a target and returns a command to duplicate the operation on another clientRemoves a piece from our list of targets, and returns a Command to duplicate the changes on another clientprotected KeyCommand[]The "state information" is "game state" information that can change during the course of a game.The "type information" of a piece or trait is information that does not change during the course of a game.myKeyEvent(KeyStroke stroke) The response of this trait alone to the given KeyStroke or the virtual keystroke of aNamedKeyStroke.voidmySetState(String newState) Sets the state of this-trait-only (inverse ofDecorator.myGetState()).voidSets the information for this piece.voidRemoves a piece from our list of targetsvoidresolvePendingAtttachment(String target) An attachment could not be satisfied during game load.voidsetContents(List<GamePiece> newContents) voidsetProperty(Object key, Object value) Within a Trait/Decorator, the default behavior when setting a property is to handle changing our own inner/outer links directly, to cache the selection state (while also passing it inward), and to simply pass every other property change request inward.booleantestEquals(Object o) Test if this Decorator's Class, Type and State are equal to another trait.Checks if a property reference could be a reference to a property on an attached pieceMethods inherited from class Decorator
addImageNamesRecursively, addMenuCommand, buildDescription, buildDescription, buildDescription, getCommandDesc, getCommandDescription, getComponentName, getComponentTypeName, getDecorator, getDecorators, getFormattedStringList, getI18nData, getI18nData, getI18nData, getId, getInner, getInnermost, getKeyCommands, getLocalizedName, getMap, getOuter, getOutermost, getParent, getPersistentProperty, getPosition, getProperties, getState, getTranslation, getType, isMenuCommand, isSelected, keyEvent, mergeState, putOldProperties, repack, repack, reportDataError, reportDataError, reportDataError, setDynamicProperties, setDynamicProperties, setDynamicProperty, setId, setInner, setMap, setParent, setPersistentProperty, setPosition, setSelected, setState, toStringModifier and TypeMethodDescriptionvoidImageSearchTargetAdds all images used by this component AND any children to the collectionprotected voidaddMenuCommand(List<KeyCommand> list, String menuText, NamedKeyStroke keyStroke) If text/keystroke pair is valid, add it to the provided listprotected StringbuildDescription(String i18nKey) protected StringbuildDescription(String i18nKey, String description) Build a description of a trait of the form Type - Description Where Type is the translated trait type description and Description is a supplied additional descriptionprotected StringbuildDescription(String i18nKey, String value, String description) Build a description of a trait of the form Type - value - DescriptiongetCommandDesc(String command, NamedKeyStroke key) protected StringgetCommandDescription(String description, String command) Return the name of the GamePiece this Decorator is a part of.Return a description of the Type of trait or Component an Auditable isstatic GamePiecegetDecorator(GamePiece p, Class<?> type) getDecorators(GamePiece p, Class<?> type) Return Internationalization (I18n) data for this pieceprotected PieceI18nDatagetI18nData(String[] commands, String[] descriptions) protected PieceI18nDatagetI18nData(String command, String description) getId()Each GamePiece must have a unique String identifiergetInner()static GamePieceprotected KeyCommand[]And the translated name for this piecegetMap()getOuter()static GamePiecegetProperties(Map<String, Object> result) Implement PropertyExporter.getProperties at the Decorator level.getState()protected StringgetTranslation(String key) getType()The type of a Decorator/Trait is a composition ofDecorator.myGetType()and the type information of its inner piece member(s).protected booleanisMenuCommand(String menuText, NamedKeyStroke keystroke) protected booleanSupport caching Selection status locallyThe primary way for the piece or trait to receive events.voidmergeState(String newState, String oldState) Compute the difference betweennewStateandoldStateand apply that difference to the current state.static Command* Set the Oldxxxx properties related to movement (e.g.static voidUtility methods to allow Decorator Editors to repack themselves.static voidrepack(Configurer c) Utility methods to allow Decorator Editors to repack themselves.protected static voidreportDataError(EditablePiece piece, String message) Report a Data Error detected by a traitprotected static voidreportDataError(EditablePiece piece, String message, String data) Report a Data Error detected by a traitprotected static voidreportDataError(EditablePiece piece, String message, String data, Throwable e) Report a Data Error detected by a traitstatic CommandsetDynamicProperties(List<Parameter> parameters, GamePiece piece, PropertySource source, Auditable owner) Find and set a series of Dynamic Properties in the supplied GamePiece named propertyName and generate a Command to set it to the specified values in other clientsstatic CommandsetDynamicProperties(List<Parameter> parameters, GamePiece piece, PropertySource source, Auditable owner, AuditTrail auditSoFar) static CommandsetDynamicProperty(String propertyName, String value, GamePiece piece, PropertySource source, Auditable owner, AuditTrail audit) Find a Dynamic Property in the supplied GamePiece named propertyName and generate a Command to set it to the specified valuevoidEach GamePiece must have a unique String identifiervoidvoidvoidsetPersistentProperty(Object key, Object val) Default behavior for a Trait/Decorator is to pass requests to set persistent properties inward to the next member of the piece.voidsetPosition(Point p) protected voidsetSelected(boolean b) Support caching Selection status locallyvoidExtract the string describing this trait's state and forward the remaining string to the inner piece.toString()Methods inherited from class AbstractImageFinder
addLocalImageNames, getAllImageNames, getLocalImageNamesModifier and TypeMethodDescriptionvoidClasses extending AbstractImageFinder should override this method in order to add the names of any image files they use to the collection.Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface EditablePiece
checkTrueMoved, finishMove, finishMove, prepareMoveModifier and TypeMethodDescriptiondefault CommandCentralized method used when finishing up after a piece moves.default CommandfinishMove(Command c, boolean afterburner, boolean findmat) default CommandfinishMove(Command c, boolean afterburner, boolean findmat, boolean mark_moved) Centralized method for finishing up after a piece moves.default CommandprepareMove(Command c, boolean mark_moved) Centralized method for preparing a piece to move.Methods inherited from interface PropertyExporter
getPropertiesModifier and TypeMethodDescriptionReturn a Map of propertiesMethods inherited from interface TranslatablePiece
getI18nDataModifier and TypeMethodDescriptionReturn a PieceI18nData object returning the I18n data about this GamePiece.
-
Field Details
-
ID
- See Also:
-
ATTACH_NAME
- See Also:
-
ATTACH_LIST
- See Also:
-
ATTACH_COUNT
- See Also:
-
BEFORE_ATTACH_NOTHING
- See Also:
-
BEFORE_ATTACH_CLEAR
- See Also:
-
BEFORE_ATTACH_OPTIONS
-
BEFORE_ATTACH_KEYS
-
ON_ATTACH_NOTHING
- See Also:
-
ON_ATTACH_FOLLOW_BACK
- See Also:
-
ON_ATTACH_ATTACH_ALL
- See Also:
-
ON_ATTACH_OPTIONS
-
ON_ATTACH_KEYS
-
ON_DETACH_NOTHING
- See Also:
-
ON_DETACH_REMOVE
- See Also:
-
ON_DETACH_OPTIONS
-
ON_DETACH_KEYS
-
attachName
-
desc
-
contents
-
target
-
clearTarget
-
command
-
attachCommandName
-
attachKey
-
globalAttach
-
propertiesFilter
-
restrictRange
protected boolean restrictRange -
fixedRange
protected boolean fixedRange -
range
protected int range -
rangeProperty
-
clearAllCommandName
-
clearAllKey
-
clearMatchingCommandName
-
clearMatchingKey
-
clearMatchingFilter
-
onAttach
-
onDetach
-
beforeAttach
-
allowSelfAttach
protected boolean allowSelfAttach -
autoAttach
protected boolean autoAttach
-
-
Constructor Details
-
Attachment
public Attachment() -
Attachment
-
-
Method Details
-
isAutoAttach
public boolean isAutoAttach() -
isAllowSelfAttach
public boolean isAllowSelfAttach() -
getAttachList
-
mySetType
Description copied from interface:EditablePieceSets the information for this piece. SeeDecorator.myGetType()- Specified by:
mySetTypein interfaceEditablePiece- Parameters:
type- a serialized configuration string to set the "type information" of this piece, which is information that doesn't change during the course of a single game (e.g. Image Files, Context Menu strings, etc). Typically ready to be processed e.g. by SequenceEncoder.decode()
-
myGetType
Description copied from class:DecoratorThe "type information" of a piece or trait is information that does not change during the course of a game. Image file names, context menu strings, etc., all should be reflected in the type. The type information is returned serialized string form, ready to be decoded by a SequenceEncoder#decode. -
myGetKeyCommands
- Specified by:
myGetKeyCommandsin classDecorator- Returns:
- the key commands for this trait alone
- See Also:
-
myGetState
Description copied from class:DecoratorThe "state information" is "game state" information that can change during the course of a game. State information is saved when the game is saved and is transferred between players on the server. For example, the relative order of pieces in a stack is state information, but whether the stack is expanded is not.- Specified by:
myGetStatein classDecorator- Returns:
- the game state information of this trait alone
- See Also:
-
attach
Runs a search using the provided filter (same as a Global Key Command), and any matching pieces become our attachments (stored in our "contents" list)- Returns:
- Command to replicate action
-
clearAll
-
clearMatching
-
myKeyEvent
Description copied from class:DecoratorThe response of this trait alone to the given KeyStroke or the virtual keystroke of aNamedKeyStroke. NamedKeyStrokes are allocated a unique internal KeyStroke when they are first used in a module, and that KeyStroke is passed up and down the decorator stack to represent them (seeNamedKeyStroke.getKeyStroke()).- Specified by:
myKeyEventin classDecorator- Parameters:
stroke- KeyStroke to apply (to apply a Named Keystroke sendNamedKeyStroke.getKeyStroke()- Returns:
- Generated Command to reproduce any changes just made to to the game state, or null if no effect
- See Also:
-
getContents
-
setContents
-
mySetState
Description copied from class:DecoratorSets the state of this-trait-only (inverse ofDecorator.myGetState()). The "state information" is information that can change during the course of a game. State information is saved when the game is saved and is transferred between players on the server. For example, the relative order of pieces in a stack is state information, but whether the stack is expanded is not.- Specified by:
mySetStatein classDecorator- Parameters:
newState- New state information serialized in string form, ready to be passed to a SequenceEncoder#decode.
-
autoAttach
Auto-attach to a piece 1. We must be in auto-attach mode 2. Must not already be attached to the piece. NOTE: Auto-attach is handled locally by each client, no Commands are generated- Parameters:
attach- Attachment trait within the target piece
-
resolvePendingAtttachment
An attachment could not be satisfied during game load. Game Load is now finished and the Attachment Manager is calling us to retry that attachment. This does not need to generate any Commands.- Parameters:
target- Id of target piece
-
hasTarget
- Parameters:
p- a particular game piece- Returns:
- true if the given piece is on our list of targets
-
makeAddTargetCommand
-
removeTarget
Removes a piece from our list of targets- Parameters:
p- Cargo to remove
-
makeRemoveTargetCommand
-
boundingBox
- Specified by:
boundingBoxin interfaceGamePiece- Returns:
- The area which this GamePiece occupies when drawn at the point (0,0)
-
draw
Description copied from interface:GamePieceDraw this GamePiece -
getName
-
getShape
- Specified by:
getShapein interfaceGamePiece- Returns:
- The shape of the piece from the user's viewpoint. This defines the area
in which the user must click to select or move the piece, for example.
Like
GamePiece.boundingBox(), it assumes the position is (0,0) -- which to be clear is normally aligned with the CENTER of the piece image -- and must be translated to the actual location where the piece is being drawn. For most ordinary pieces, the shape returned here will simply be equivalent to the bounding box, but seeNonRectangular.
-
getEditor
- Specified by:
getEditorin interfaceEditablePiece- Overrides:
getEditorin classDecorator- Returns:
- the configurer for this trait - the dialog which allows the editing the piece's type information. Default
configurer is a
SimplePieceEditor, but many traits will want to provide custom versions.
-
getDescription
Description copied from interface:EditablePieceA plain-English description of this type of trait/piece - includes data from fields where appropriate- Specified by:
getDescriptionin interfaceEditablePiece
-
getBaseDescription
Description copied from interface:EditablePieceSupport for a basic-name-only description introduced later, so this default retrofits it from the full description if an explicit one is not defined.- Specified by:
getBaseDescriptionin interfaceEditablePiece- Returns:
- name of trait/piece type, w/o additional data
-
getDescriptionField
Description copied from class:DecoratorIf Decorator contains a description *field*, returns the current contents of it.- Overrides:
getDescriptionFieldin classDecorator- Returns:
- contents of "description" field, if it exists.
-
getPropertyPiece
- Returns:
- first piece in our list of attachments that still exists (hasn't been deleted), or null if none
-
translatePropertyName
Checks if a property reference could be a reference to a property on an attached piece- Parameters:
key- Property name to be checked if it's an attachment reference (it's a reference if it is attachName_propertyName- Returns:
- propertyName for use in reading property from attached piece, if the key referenced a valid attachment property. (null otherwise)
-
getAttachName
-
getAttachCount
public int getAttachCount()- Returns:
- number of attached pieces, not counting any that have since been deleted (from the game).
-
getAttachedPieceAt
- Parameters:
index- index (0-based)- Returns:
- the attached piece at a given index (0-based)
-
getAttachList
-
getProperty
Description copied from class:DecoratorProperties can be associated with a piece -- many may be game-specific, but others are standard, such as the LocationName property exposed by BasicPiece -- and can be read through this interface. The properties may or may not need to be encoded in the piece'sDecorator.getState()method. Properties include the value of e.g.MarkerTraits,DynamicPropertyTraits, and so forth. Furthermore they include the values of any visible "Global Property" in a Vassal module, whether at the module level, map level, or zone level -- but these "higher level" properties, coming from "outside the piece", CANNOT be written to by theDecorator.setProperty(Object, Object)method even though they can be read by this method -- in this sense the two methods are NOT perfect mirrors.
Within a Trait/Decorator, default behavior is to process some requests directly (e.g. requests for our "inner" or "outer" link), process our *part* of certain other requests (e.g. request for our game state information we supply state information for this trait and then append any information obtained from passing the same request inward), and then for any other requests that we cannot process we simply pass the request to the next trait/member inward.
When using this interface a piece's own properties are preferred to those of "Global Properties", and those in turn are searched Zone-first then Map, then Module.
This method implements thePropertySourceinterface, which allows Global Properties to be read by other types of object than GamePieces.- Specified by:
getPropertyin interfaceGamePiece- Specified by:
getPropertyin interfacePropertySource- Overrides:
getPropertyin classDecorator- Parameters:
key- String key of property to be returned- Returns:
- Object containing new value of the specified property
-
getLocalizedProperty
Description copied from class:DecoratorReturns a localized translation of the specified property value, if available. Otherwise returns the non-localized version. SeeDecorator.getProperty(Object).- Specified by:
getLocalizedPropertyin interfacePropertySource- Overrides:
getLocalizedPropertyin classDecorator- Parameters:
key- String key of property to be returned- Returns:
- Object containing localized text of the specified property, if available, otherwise non-localized value
-
setProperty
Description copied from class:DecoratorWithin a Trait/Decorator, the default behavior when setting a property is to handle changing our own inner/outer links directly, to cache the selection state (while also passing it inward), and to simply pass every other property change request inward. A Trait with its own properties to maintain would intercept and process those requests, while sending the rest inward to the next member of the piece.
Properties can be associated with a piece -- many may be game-specific, but others are standard, such as the LocationName property exposed by BasicPiece -- and can be set through this interface. The properties may or may not need to be encoded in the piece'sDecorator.getState()method. Properties include the value of e.g.MarkerTraits,DynamicPropertyTraits, and so forth.
NOTE: Not all properties maintained by traits can be "set" by setProperty, even though they can be read by getProperty -- they may be "read only" for instance. You will need to check the code for individual traits to see what they support in this regard.
NOTE: Properties outside the piece CANNOT be set by this method (e.g. Global Properties), even though they can be read byDecorator.getProperty(Object)-- in this the two methods are not perfect mirrors.- Specified by:
setPropertyin interfaceGamePiece- Overrides:
setPropertyin classDecorator- Parameters:
key- String key of property to be changedvalue- Object containing new value of the property
-
testEquals
Description copied from class:DecoratorTest if this Decorator's Class, Type and State are equal to another trait. Implementations of this method should compare the individual values of the fields that make up the Decorators Type and State. Implementations should NOT compare the values returned by myGetType() or myGetState(). This method is intended to be used by Unit Tests to verify that a trait is unchanged after going through a process such as serialization/deserialization.- Overrides:
testEqualsin classDecorator- Parameters:
o- Object to compare this Decorator to- Returns:
- true if the Class, type and state all match
-
getHelpFile
- Specified by:
getHelpFilein interfaceEditablePiece- Returns:
- the help file for this trait
-
getPropertyNames
Return Property names exposed by this trait- Specified by:
getPropertyNamesin interfacePropertyNameSource- Overrides:
getPropertyNamesin classDecorator- Returns:
- List of property names "exposed" by this piece -- that are available to other Traits and components to read.
Default behavior for a Trait is not to expose any properties, but Traits which should expose some (e.g.
DynamicPropertyorMarker) would provide an array of the property names here.
-
getExpressionList
- Specified by:
getExpressionListin interfaceSearchTarget- Overrides:
getExpressionListin classDecorator- Returns:
- a list of the Decorator's string/expression fields if any (for search)
-
getMenuTextList
- Specified by:
getMenuTextListin interfaceSearchTarget- Overrides:
getMenuTextListin classDecorator- Returns:
- a list of any Menu/Button/Tooltip Text strings referenced in the Decorator, if any (for search)
-
getNamedKeyStrokeList
- Specified by:
getNamedKeyStrokeListin interfaceSearchTarget- Overrides:
getNamedKeyStrokeListin classDecorator- Returns:
- a list of any Named KeyStrokes referenced in the Decorator, if any (for search)
-
getPropertyList
- Specified by:
getPropertyListin interfaceSearchTarget- Overrides:
getPropertyListin classDecorator- Returns:
- a list of any Property Names referenced in the Decorator, if any (for search)
-