Class SetPieceProperty

All Implemented Interfaces:
IncrementProperty.Constraints, PropertyChangerConfigurer.Constraints, PropertyNameSource, PropertyPrompt.Constraints, PropertyPrompt.DialogParent, PropertySource, EditablePiece, GamePiece, PropertyExporter, StateMergeable, TranslatablePiece, PersistentPropertyContainer, Auditable, ImageSearchTarget, SearchTarget, RecursionLimiter.Loopable

public class SetPieceProperty extends DynamicProperty implements RecursionLimiter.Loopable
Author:
Brian Reynolds, Brent Easton A trait that allows counters to manipulate the value of the Dynamic Properties of OTHER pieces. Combines the Property manipulation functionality of DynamicProperty with the searching function of Global Key Commands
  • Field Details

    • propertyChangeSupport

      protected PropertyChangeSupport propertyChangeSupport
    • ID

      public static final String ID
      See Also:
    • description

      protected String description
    • target

      protected GlobalCommandTarget target
    • globalSetter

      protected GlobalSetter globalSetter
    • propertiesFilter

      protected PropertyExpression propertiesFilter
    • restrictRange

      protected boolean restrictRange
    • fixedRange

      protected boolean fixedRange
    • range

      protected int range
    • rangeProperty

      protected String rangeProperty
    • overrideConstraints

      protected boolean overrideConstraints
    • dec

      protected Decorator dec
  • Constructor Details

    • SetPieceProperty

      public SetPieceProperty()
    • SetPieceProperty

      public SetPieceProperty(String type, GamePiece p)
  • Method Details

    • getDescription

      public String getDescription()
      Description copied from interface: EditablePiece
      A plain-English description of this type of trait/piece - includes data from fields where appropriate
      Specified by:
      getDescription in interface EditablePiece
      Overrides:
      getDescription in class DynamicProperty
    • getBaseDescription

      public String getBaseDescription()
      Description copied from interface: EditablePiece
      Support 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:
      getBaseDescription in interface EditablePiece
      Overrides:
      getBaseDescription in class DynamicProperty
      Returns:
      name of trait/piece type, w/o additional data
    • getDescriptionField

      public String getDescriptionField()
      Description copied from class: Decorator
      If Decorator contains a description *field*, returns the current contents of it.
      Overrides:
      getDescriptionField in class DynamicProperty
      Returns:
      contents of "description" field, if it exists.
    • mySetType

      public void mySetType(String s)
      Description copied from interface: EditablePiece
      Sets the information for this piece. See Decorator.myGetType()
      Specified by:
      mySetType in interface EditablePiece
      Overrides:
      mySetType in class DynamicProperty
      Parameters:
      s - 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

      public String myGetType()
      Description copied from class: Decorator
      The "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.
      Overrides:
      myGetType in class DynamicProperty
      Returns:
      the type information of this trait alone
      See Also:
    • myGetState

      public String myGetState()
      Description copied from class: Decorator
      The "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.
      Overrides:
      myGetState in class DynamicProperty
      Returns:
      the game state information of this trait alone
      See Also:
    • mySetState

      public void mySetState(String state)
      Description copied from class: Decorator
      Sets the state of this-trait-only (inverse of Decorator.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.
      Overrides:
      mySetState in class DynamicProperty
      Parameters:
      state - New state information serialized in string form, ready to be passed to a SequenceEncoder#decode.
    • getProperty

      public Object getProperty(Object key)
      Description copied from class: Decorator
      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. The properties may or may not need to be encoded in the piece's Decorator.getState() method. Properties include the value of e.g. Marker Traits, DynamicProperty Traits, 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 the Decorator.setProperty(java.lang.Object, java.lang.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 the PropertySource interface, which allows Global Properties to be read by other types of object than GamePieces.
      Specified by:
      getProperty in interface GamePiece
      Specified by:
      getProperty in interface PropertySource
      Overrides:
      getProperty in class DynamicProperty
      Parameters:
      key - String key of property to be returned
      Returns:
      Object containing new value of the specified property
    • getLocalizedProperty

      public Object getLocalizedProperty(Object key)
      Description copied from class: Decorator
      Returns a localized translation of the specified property value, if available. Otherwise returns the non-localized version. See Decorator.getProperty(java.lang.Object).
      Specified by:
      getLocalizedProperty in interface PropertySource
      Overrides:
      getLocalizedProperty in class DynamicProperty
      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

      public void setProperty(Object key, Object val)
      Description copied from class: Decorator
      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. 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's Decorator.getState() method. Properties include the value of e.g. Marker Traits, DynamicProperty Traits, 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 by Decorator.getProperty(java.lang.Object) -- in this the two methods are not perfect mirrors.
      Specified by:
      setProperty in interface GamePiece
      Overrides:
      setProperty in class DynamicProperty
      Parameters:
      key - String key of property to be changed
      val - Object containing new value of the property
    • getPropertyNames

      public List<String> getPropertyNames()
      Description copied from class: DynamicProperty
      Return Property names exposed by this trait
      Specified by:
      getPropertyNames in interface PropertyNameSource
      Overrides:
      getPropertyNames in class DynamicProperty
      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. DynamicProperty or Marker) would provide an array of the property names here.
    • getHelpFile

      public HelpFile getHelpFile()
      Specified by:
      getHelpFile in interface EditablePiece
      Overrides:
      getHelpFile in class DynamicProperty
      Returns:
      the help file for this trait
    • makeSetTargetCommand

      public Command makeSetTargetCommand(GamePiece p)
      Our filter has found a matching piece. Check it for a matching Dynamic Property and if found apply our setter.
      Parameters:
      p - Piece to check for matching Dynamic Properties
      Returns:
      command to reproduce any work we do here
    • myKeyEvent

      public Command myKeyEvent(KeyStroke stroke)
      Description copied from class: Decorator
      The response of this trait alone to the given KeyStroke or the virtual keystroke of a NamedKeyStroke. 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 (see NamedKeyStroke.getKeyStroke()).
      Overrides:
      myKeyEvent in class DynamicProperty
      Parameters:
      stroke - KeyStroke to apply (to apply a Named Keystroke send NamedKeyStroke.getKeyStroke()
      Returns:
      Generated Command to reproduce any changes just made to to the game state, or null if no effect
      See Also:
    • createRemotePropertyChanger

      public RemotePropertyChanger createRemotePropertyChanger(PropertyChanger changer)
      Create a Remote version of a PropertyChanger that will operate sensibly on a DP in a remote piece
      Parameters:
      changer - Local propertyChanger
      Returns:
      Remote PropertyChanger
    • getMaximumValue

      public int getMaximumValue()
      Specified by:
      getMaximumValue in interface IncrementProperty.Constraints
      Specified by:
      getMaximumValue in interface PropertyPrompt.Constraints
      Overrides:
      getMaximumValue in class DynamicProperty
    • getMinimumValue

      public int getMinimumValue()
      Specified by:
      getMinimumValue in interface IncrementProperty.Constraints
      Specified by:
      getMinimumValue in interface PropertyPrompt.Constraints
      Overrides:
      getMinimumValue in class DynamicProperty
    • isNumeric

      public boolean isNumeric()
      Specified by:
      isNumeric in interface IncrementProperty.Constraints
      Specified by:
      isNumeric in interface PropertyPrompt.Constraints
      Overrides:
      isNumeric in class DynamicProperty
    • isWrap

      public boolean isWrap()
      Specified by:
      isWrap in interface IncrementProperty.Constraints
      Overrides:
      isWrap in class DynamicProperty
    • getEditor

      public PieceEditor getEditor()
      Specified by:
      getEditor in interface EditablePiece
      Overrides:
      getEditor in class DynamicProperty
      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.
    • testEquals

      public boolean testEquals(Object o)
      Description copied from class: Decorator
      Test 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:
      testEquals in class DynamicProperty
      Parameters:
      o - Object to compare this Decorator to
      Returns:
      true if the Class, type and state all match