// Eigenschaftsgruppen für Plugins gehören grundsetzlich in das Paket TAPplugins:
package TAPplugins;



// Das TAP-Paket muss importiert werden, damit Sie von der Klasse TAPPropertyGroup
// ableiten  können
import TAP.*;
import java.util.NoSuchElementException;





public class PGMinimal extends TAPPropertyGroup {

////////////////////////////////////////////////////////////////////////////
//      data fields
////////////////////////////////////////////////////////////////////////////


  /**
   * Diese Eigenschaftsgruppe vewaltet die Eigenschaften
   * statement: Text der im Minimal-Element angezeigt werden soll
   * isBold: Boolsches Flag, das bestimmt, ob der Text fett ausgegeben werden soll
   * offset: Relativer Offset der x-Position des Textes, Fließkommazahl innerhalb eines
   * Wertebereiches
   */

   // Defaultwerte für alle Eigenschaften festlegen:
  static private String defaultStatement = "I am Minimal.";
  static private boolean defaultIsBold = false;
  static private float defaultOffset = 0.0f;

  // Datenfelder für aktuelle und zwischengespeicherte Eigenschaftswerte:

  private String statementStart, statementCurr = defaultStatement;
  private boolean isBoldStart, isBoldCurr = defaultIsBold;
  private float offsetStart, offsetCurr = defaultOffset;


  // Einmaliges Erzeugen der Eigenschaftsbeschreibungen:

  private final static TAPPropertyInformation propertyInfoStatement =
                              new TAPPropertyInformation(
                                     "statement",STRING_TYPE,null,null,
                                    AlternativesIterator.getEmptyIterator());

  private final static TAPPropertyInformation propertyInfoIsBold =
                              new TAPPropertyInformation(
                                     "isBold",BOOLEAN_TYPE,null,null,
                                    AlternativesIterator.getEmptyIterator());

  private final static TAPPropertyInformation propertyInfoOffset =
                              new TAPPropertyInformation(
                                     "offset",REALSCALE_TYPE,new Integer (-100), new Integer(100),
                                    AlternativesIterator.getEmptyIterator());


//////////////////////////////////////////////////////////////////////////
// Privat constructor for copies
/////////////////////////////////////////////////////////////////////

public PGMinimal() {}

private PGMinimal(String statement, boolean isBold, float offset) {
      statementCurr = statement;
      isBoldCurr  =  isBold;
      offsetCurr = offset;
}

////////////////////////////////////////////////////////////////////////////
//      all abstract methods that need to be implemented in subclasses
////////////////////////////////////////////////////////////////////////////


    public void restartRuntime() {

     /***
      * hier müssen die aktuellen Werte der Eigenschaften gesichert werden,
      * damit diese nach Beenden eines Kurses wieder zurück gesetzt werden
      * können.
      */

      statementStart = statementCurr;
      isBoldStart = isBoldCurr;
      offsetStart = offsetCurr;

    }

    public void resetEdittime() {
     /***
      * hier müssen die aktuellen Werte der Eigenschaften wieder auf die
      * Startwerte zurück gesetzt werden
      */

        statementCurr = statementStart;
        isBoldCurr = isBoldStart;
        offsetCurr = offsetStart;

    }


    public TAPPropertyGroup getACopy() {

       return new  PGMinimal (statementCurr, isBoldCurr , offsetCurr);


    }

    /** returns the name of the property group
     * if the class which extends TAPPropertyGroup is called PGxxx
     * the name of the PropertyGroup should be xxx
     * e.g. PGExample has the name "Example"
     */
    public String getPropertyGroupName() {
       /***
        * Liefert den Namen der von Ihnen definierten Eigenschaftsgruppe
        * zurück. Dieser Name entspricht dem Namen der Klasse ohne das
        * vorangestellte PG.
        */

       return "Minimal";
    }



     public String getAttrStr() {

      StringBuffer attrStr = new StringBuffer(512);

        addStringPropertyToBuffer("statement",statementCurr,defaultStatement,attrStr);
        addBooleanPropertyToBuffer("isBold",isBoldCurr,defaultIsBold,attrStr);
        addFloatPropertyToBuffer("offset",offsetCurr,defaultOffset,0.000001f,attrStr);


      return attrStr.toString();

    }


   public boolean setProperty(String propertyName, String propertyValue) {

     /**
      * Über diese Methode sollten sich die Werte aller Eigenschaften
      * dieser Eigenschaftsgruppe setzen lassen. propertyName bestimmt, welche
      * Eigenschaft gesetzt werden soll. Der Eigenschaftsname wurd in
      * den Eigenschaftsbeschreibungen für jede Eigenschaft festgelegt.
      * In propertyValue ist der neue Eigenschaftswert als String abgelegt.
      * Für Eigenschaften, die in anders getypten Datenfeldern gepeichert sind,
      * muss der String in den entsprechenden Datentyp umgewandelt werden.
      *
      */

      if (propertyName.equals("statement")) {
          statementCurr = propertyValue;
          return true;
      }

      if (propertyName.equals("isBold")) {
          isBoldCurr = Boolean.valueOf(propertyValue).booleanValue();
          return true;
      }


      if (propertyName.equals("offset")) {
          offsetCurr = Float.valueOf(propertyValue).floatValue();
          return true;
      }


      // für den Fall, dass propertyName eine Eigenschaft benennt,
      // die nicht zu dieser Eigenschaftsgruppe gehört, geben wir false zurück
      return false;



   }


   public String getProperty(String propertyName) {
     /**
      * Über diese Methode sollten sich die Werte aller Eigenschaften
      * dieser Eigenschaftsgruppe auslesen lassen. propertyName bestimmt, welche
      * Eigenschaft ausgelesen werden soll. Der Eigenschaftsname wurde in
      * den Eigenschaftsbeschreibungen für jede Eigenschaft festgelegt.
      */

       if (propertyName.equals("statement"))
           return statementCurr;

       if (propertyName.equals("isBold"))
           return String.valueOf(isBoldCurr);



       if (propertyName.equals("offset"))
           return String.valueOf(offsetCurr);



      // für den Fall, dass propertyName eine Eigenschaft benennt,
      // die nicht zu dieser Eigenschaftsgruppe gehört, geben wir null zurück
      return null;

   }


     public int getPropertyCount() {
        return 3;  // statement, isBold und offset ---> 3 Properties
     }

     public TAPPropertyInformation propertyAt(int index)  {

      switch (index) {
        case 0: return propertyInfoStatement;
        case 1: return propertyInfoIsBold;
        case 2: return propertyInfoOffset;

        default:  throw new NoSuchElementException("PGLocation contains only n property groups!");
      } // end switch

    }



////////////////////////////////////////////////////////////////////////////
//      the methods that come with a default implementation
////////////////////////////////////////////////////////////////////////////


    // Eigenschaft offset soll interpolierbar sein ---> Eigenschaftsgruppe interpolierbar machen

    public boolean isInterpolatable() {
      return
        true;
    }


/////////////////////////////////////////////////
///  getter - methods for fast access to property values
/////////////////////////////////////////////////

  public String getStatement() { return statementCurr; }
  public boolean getIsBold() { return isBoldCurr; }
  public float getOffset() { return offsetCurr; }


}

