    001package org.vishia.gral.base;
    002
    003import java.io.File;
    004
    005import org.vishia.byteData.VariableAccess_ifc;
    006import org.vishia.byteData.VariableContainer_ifc;
    007import org.vishia.gral.ifc.GralColor;
    008import org.vishia.gral.ifc.GralMngBuild_ifc;
    009import org.vishia.gral.ifc.GralUserAction;
    010import org.vishia.gral.ifc.GralWidget_ifc;
    011import org.vishia.gral.widget.GralInfoBox;
    012import org.vishia.util.KeyCode;
    013import org.vishia.util.Java4C;
    014
    015/**This class contains some standard {@link GralUserAction} for widgets.
    016 * The show methods can be used by giving its name with {@link GralWidget#setShowMethod(String)} in the configuration
    017 * of any widget. The show method may use parameter given with {@link GralWidget#setDataPath(String)}
    018 * or alternatively with parameter of the show method, for example:
    019 * <pre>
    020 * myWidget.setShowMethod("showBool(datapath, green, red)";
    021 * </pre>
    022 * The string given parameters should be separated with a colon. They are evaluated by first calling the show method.
    023 * The show method can be configured in a script, see {@link org.vishia.gral.cfg.GralCfgZbnf}.
    024 *
    025 * @author Hartmut Schorrig
    026 *
    027 */
    028//@Java4C.ParseError
    029public class GralShowMethods
    030{
    031
    032
    033  /**Version, history and license.
    034   * <ul>
    035   * <li>2014-01-15 Hartmut chg: {@link #showBackColor} stores the value which is used in {@link GralWidget#getFloatValue()} (dyda).
    036   * <li>2013-03-13 Hartmut new {@link #setBar} for a {@link GralValueBar}
    037   * <li>2012-06-00 Hartmut created as common container for methods for different widgets.
    038   * </ul>
    039   *
    040   * <b>Copyright/Copyleft</b>:<br>
    041   * For this source the LGPL Lesser General Public License,
    042   * published by the Free Software Foundation is valid.
    043   * It means:
    044   * <ol>
    045   * <li> You can use this source without any restriction for any desired purpose.
    046   * <li> You can redistribute copies of this source to everybody.
    047   * <li> Every user of this source, also the user of redistribute copies
    048   *    with or without payment, must accept this license for further using.
    049   * <li> But the LPGL is not appropriate for a whole software product,
    050   *    if this source is only a part of them. It means, the user
    051   *    must publish this part of source,
    052   *    but doesn't need to publish the whole source of the own product.
    053   * <li> You can study and modify (improve) this source
    054   *    for own using or for redistribution, but you have to license the
    055   *    modified sources likewise under this LGPL Lesser General Public License.
    056   *    You mustn't delete this Copyright/Copyleft inscription in this source file.
    057   * </ol>
    058   * If you intent to use this source without publishing its usage, you can get
    059   * a second license subscribing a special contract with the author.
    060   *
    061   * @author Hartmut Schorrig = hartmut.schorrig@vishia.de
    062   */
    063  public static final int version = 20130313;
    064
    065
    066
    067
    068  private String getParams;
    069
    070
    071  /**Common aggregation to variables. */
    072  protected final VariableContainer_ifc variableContainer;
    073
    074
    075
    076  public GralShowMethods(VariableContainer_ifc container){
    077    variableContainer = container;
    078  }
    079
    080
    081  /**Shows the back color of the widget depending on the boolean value of the associated variable.
    082   * The params[0] of exec should be an {@link VariableAccess_ifc} instance from which the value is read.
    083   * It is because the routine is called as show method in {@link GralWidget#refreshFromVariable(VariableContainer_ifc)}.
    084   * The colors should be part of the textual arguments of the show method given in {@link GralWidget#setActionShow(GralUserAction, String[])}.
    085   * That textual colors are converted and stored in {@link GralWidget.ConfigData#showParam}.
    086   * <br><br>
    087   * The value which is read from the variable is stored in {@link GralWidget.DynamicData#fValue} for further using,
    088   * for example for a change action (on mouse pressed etc. ).
    089   *
    090   * param of exec should be a VariableAccess_ifc-instance. The int value 0, 1, ... is used to select one of the back colors.
    091   */
    092  public final GralUserAction showBackColor = new GralUserAction("showBackColor"){
    093
    094    //Note: don't save data here. It is a common instance.
    095
    096    @Override public boolean exec(int actionCode, GralWidget_ifc widgd, Object... params){
    097      GralWidget widgg = (GralWidget) widgd;
    098      if(widgg.cfg.showParam == null){ //not configurated yet:
    099        String[] sColors = widgg.getShowParam();
    100        if(sColors == null){
    101          System.err.println("GralShowMethods.showBackColor config error; The show methods should contain \"(color, color)\";"
    102              + widgg.getShowMethod());
    103          widgg.cfg.showParam = new GralColor[1];
    104          widgg.cfg.showParam[0] = GralColor.getColor("ma");
    105        } else {
    106          widgg.cfg.showParam = new GralColor[sColors.length];
    107          for(int iDst = 0; iDst < sColors.length; ++iDst){
    108            widgg.cfg.showParam[iDst] = GralColor.getColor(sColors[iDst]);
    109          }
    110        }
    111      }
    112      int value;
    113      if(params[0] instanceof VariableAccess_ifc){
    114        VariableAccess_ifc variable = (VariableAccess_ifc)params[0];
    115        value = variable.getInt();
    116        widgg.dyda.fValue = value;        //store the value from variable.
    117        if(value>=0 && value < widgg.cfg.showParam.length){ widgd.setBackColor((GralColor)widgg.cfg.showParam[value], 0); }
    118        else { widgd.setBackColor((GralColor)widgg.cfg.showParam[0], 0); }
    119      } else {
    120        String name = widgd.getName();
    121        System.err.println("GralShowMethods.showBackColor parameter error; widget=" + name);
    122      }
    123      return true;
    124    }
    125
    126  };
    127
    128
    129
    130  /**Shows the back color of the widget depending on the boolean value of a variable.
    131   * param of exec should be a VariableAccessWithIdx-instance. The variable value 0, 1, ... is used to select one of the back colors. */
    132  public final GralUserAction setBar = new GralUserAction("setBar"){
    133
    134    //Note: don't save data here. It is a common instance.
    135
    136    @Override public boolean exec(int actionCode, GralWidget_ifc wdgi, Object... params){
    137      if(!(wdgi instanceof GralValueBar)) return false;
    138      GralValueBar wdg = (GralValueBar) wdgi;
    139      if(wdg.fLevels == null){ //not configurated yet:
    140        String[] sShowParam = wdg.getShowParam();
    141        wdg.setBorderAndColors(sShowParam);
    142      }
    143      if(params[0] instanceof VariableAccess_ifc){
    144        VariableAccess_ifc variable = (VariableAccess_ifc)params[0];
    145        float value = variable.getFloat();
    146        wdg.setValue(value);
    147      } else {
    148        String name = wdgi.getName();
    149        System.err.println("GralShowMethods.showBackColor parameter error; widget=" + name);
    150      }
    151      return true;
    152    }
    153
    154  };
    155
    156
    157
    158  /**This userAction can be used by name (calling {@link #addFocusAction(String, GralUserAction, String, String)}
    159   * to set a variable when an input field is leaved.
    160   */
    161  public final GralUserAction syncVariableOnFocus = new GralUserAction("syncVariableOnFocus")
    162  { /**Writes the value to the named variable on leaving the focus.
    163     * The name of the variable is contained in the {@link GralWidget}.
    164     * @see org.vishia.gral.ifc.GralUserAction#userActionGui(java.lang.String, org.vishia.gral.base.GralWidget, java.lang.Object[])
    165     */
    166    @Override public boolean exec(int actionCode, GralWidget_ifc widgi, Object... params)
    167    {
    168      GralWidget widg = (GralWidget)widgi;
    169      final VariableAccess_ifc variable = widg.getVariable(variableContainer);
    170      if(variable !=null){
    171        if(actionCode == KeyCode.focusGained){
    172          widg.setText(variable.getString());
    173          //if(oWidget instanceof Text){ sValue = ((Text)oWidget).getText(); variable.setString(sValue); }
    174          //else { sValue = null; }
    175        } else if(actionCode == KeyCode.focusLost){
    176          if(widg.isChanged(true)){
    177            String sValue = widg.getValue();
    178            variable.setString(sValue);
    179          }
    180          //if(oWidget instanceof Text){ sValue = variable.getString(); ((Text)oWidget).setText(sValue == null ? "" : sValue); }
    181          //else { sValue = null; }
    182        } //else throw new IllegalArgumentException("GralMng.syncVariableOnFocus: unexpected intension on focus: " + actionCode);
    183      } else {
    184        //throw new IllegalArgumentException("GralMng.syncVariableOnFocus: variable not found: " + widg.getDataPath());
    185      }
    186      return true;
    187    }
    188  };
    189
    190
    191
    192
    193
    194  /**This userAction can be used by name (calling {@link #addFocusAction(String, GralUserAction, String, String)}
    195   * to set a variable when an input field is leaved.
    196   */
    197  public final GralUserAction action_openWindow = new GralUserAction("openWindow")
    198  { /**Writes the value to the named variable on leaving the focus.
    199     * The name of the variable is contained in the {@link GralWidget}.
    200     * @see org.vishia.gral.ifc.GralUserAction#userActionGui(java.lang.String, org.vishia.gral.base.GralWidget, java.lang.Object[])
    201     */
    202    @Override public boolean exec(int actionCode, GralWidget_ifc widgi, Object... params)
    203    {
    204      if(KeyCode.isControlFunctionMouseUpOrMenu(actionCode) || actionCode == KeyCode.mouse1Double) {
    205        GralWidget widg = (GralWidget)widgi;
    206        String nameWindow = (params.length >=1 && (params[0] instanceof String)) ? (String)params[0] : widg.sCmd;  //sCmd for buttons
    207        if(nameWindow !=null) {
    208          if(nameWindow.endsWith("wind")) { nameWindow = nameWindow.substring(0, nameWindow.length()-4); }
    209          GralMng mng = GralMng.get();
    210          GralPanelContent panelWind = mng.getPanel(nameWindow);
    211          if(panelWind !=null) { panelWind.setFocus(); }
    212          else { System.err.println("action_openWindow: window not found: " + nameWindow); }
    213        }
    214        else  { System.err.println("action_openWindow: name not given: ");}
    215      }
    216      return true;
    217    }
    218  };
    219
    220
    221
    222
    223
    224  /**This userAction can be used by name (calling {@link #addFocusAction(String, GralUserAction, String, String)}
    225   * to set a variable when an input field is leaved.
    226   */
    227  public final GralUserAction action_openHelp = new GralUserAction("openHtml")
    228  { /**Writes the value to the named variable on leaving the focus.
    229     * The name of the variable is contained in the {@link GralWidget}.
    230     * @see org.vishia.gral.ifc.GralUserAction#userActionGui(java.lang.String, org.vishia.gral.base.GralWidget, java.lang.Object[])
    231     */
    232    @Override public boolean exec(int actionCode, GralWidget_ifc widgi, Object... params)
    233    {
    234      if(KeyCode.isControlFunctionMouseUpOrMenu(actionCode) || actionCode == KeyCode.mouse1Double) {
    235        GralWidget widg = (GralWidget)widgi;
    236        String path = (params.length >=1 && (params[0] instanceof String)) ? (String)params[0] : widg.sCmd;  //sCmd for buttons
    237        File fileCurrdir = new File(".").getAbsoluteFile();
    238        String sDir = System.getProperty("pwd");
    239        String path2 = fileCurrdir.getAbsolutePath() + "/" + path;
    240        GralMng mng = GralMng.get();
    241        GralInfoBox windhelp= mng.infoHelp;
    242        windhelp.activate();
    243        windhelp.setUrl(path2);
    244        //GralPanelContent panelWind = mng.getPanel("help");
    245        //if(panelWind !=null) { panelWind.setFocus(); }
    246        //else { System.err.println("action_openWindow: window not found: help"); }
    247      }
    248      return true;
    249    }
    250  };
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260  public void registerShowMethods(GralMngBuild_ifc mng){
    261    mng.registerUserAction("showBackColor", showBackColor);
    262    mng.registerUserAction("syncVariableOnFocus", this.syncVariableOnFocus);
    263    mng.registerUserAction("setBar", this.setBar);
    264    mng.registerUserAction("openWindow", action_openWindow);
    265    mng.registerUserAction("openHelp", action_openHelp);
    266
    267  }
    268
    269
    270}