    001package org.vishia.gral.cfg;
    002
    003import java.io.IOException;
    004import java.io.Writer;
    005import java.util.Map;
    006
    007import org.vishia.gral.base.GralPos;
    008import org.vishia.msgDispatch.LogMessage;
    009
    010public class GralCfgWriter
    011{
    012
    013  /**Version and history
    014   * <ul>
    015   * <ul>2015-27-01 Hartmut new: Now a text field can be set editable. Usage of a boolean {@link GralCfgData#editable}
    016   *  instead changing the type of a text field from 'S' to 'T', but in {@link GralCfgWriter#writeShowField(org.vishia.gral.cfg.GralCfgData.GuiCfgShowField)}
    017   *  it is written as a "InputTextline(...". It means next read of the config reads it as editable.
    018   * <li>2011-06-00 Hartmut created,
    019   * </ul>
    020   *
    021   * <b>Copyright/Copyleft</b>:<br>
    022   * For this source the LGPL Lesser General Public License,
    023   * published by the Free Software Foundation is valid.
    024   * It means:
    025   * <ol>
    026   * <li> You can use this source without any restriction for any desired purpose.
    027   * <li> You can redistribute copies of this source to everybody.
    028   * <li> Every user of this source, also the user of redistribute copies
    029   *    with or without payment, must accept this license for further using.
    030   * <li> But the LPGL is not appropriate for a whole software product,
    031   *    if this source is only a part of them. It means, the user
    032   *    must publish this part of source,
    033   *    but doesn't need to publish the whole source of the own product.
    034   * <li> You can study and modify (improve) this source
    035   *    for own using or for redistribution, but you have to license the
    036   *    modified sources likewise under this LGPL Lesser General Public License.
    037   *    You mustn't delete this Copyright/Copyleft inscription in this source file.
    038   * </ol>
    039   * If you intent to use this source without publishing its usage, you can get
    040   * a second license subscribing a special contract with the author.
    041   *
    042   * @author Hartmut Schorrig = hartmut.schorrig@vishia.de
    043   */
    044  public static final String version = "2015-01-27";
    045
    046  private String sLastPanel;
    047
    048  final LogMessage log;
    049
    050  Writer writer;
    051
    052  public GralCfgWriter(LogMessage log)
    053  { this.log = log;
    054  }
    055
    056
    057  public String saveCfg(Writer dest, GralCfgData cfg)
    058  { this.writer = dest;
    059    String sError = null;
    060    try{
    061      writer.append("size(500,120); ");   //TODO it isn't used yet
    062      writeDataReplace(cfg);
    063      for(GralCfgElement cfge: cfg.listElementsInTextfileOrder) {
    064        writeElement(dest, cfge);
    065      }
    066      /*
    067      GralCfgElement cfge = cfg.firstElement;
    068      while(cfge !=null){
    069        writeElement(dest, cfge);
    070        cfge = cfge.next;
    071      }
    072      */
    073      dest.append("\n");
    074    } catch(IOException exc){ log.sendMsg(-1, "exception writing config"); }
    075    return sError;
    076  }
    077
    078
    079
    080  void writeDataReplace(GralCfgData cfg) throws IOException
    081  { writer.append("\n");
    082    if(cfg !=null)for( Map.Entry<String, String> entry: cfg.dataReplace.entrySet()){
    083      writer.append("DataReplace: ").append(entry.getKey()).append(" = ").append(entry.getValue()).append(";\n");
    084    }
    085    writer.append("\n");
    086
    087  }
    088
    089
    090  void writeElement(Writer ww, GralCfgElement cfge)
    091  throws IOException
    092  {
    093    if(cfge.widgetType instanceof GralCfgData.GuiCfgImage){
    094      ww.append("\n\n//================================================================================\n");
    095    }
    096
    097    if(cfge.widgetType.whatIs == 'w'){
    098      GralCfgPanel cfgp = (GralCfgPanel)cfge;
    099      writer.append("\n\n//================================================================================\n");
    100      writer.append("Window: @").append(cfgp.windPos);
    101      //writePosition(ww, cfge);
    102      writer.append(": ");
    103      writer.append(cfgp.name).append(", \"").append(cfgp.windTitle).append("\";\n\n");
    104
    105    } else {
    106      //<Element>
    107      writePosition(ww, cfge);
    108      if(cfge.widgetType instanceof GralCfgData.GuiCfgShowField){ writeShowField((GralCfgData.GuiCfgShowField)cfge.widgetType); }
    109      else if(cfge.widgetType instanceof GralCfgData.GuiCfgText){ writeText((GralCfgData.GuiCfgText)cfge.widgetType); }
    110      else if(cfge.widgetType instanceof GralCfgData.GuiCfgLed){ writeLed((GralCfgData.GuiCfgLed)cfge.widgetType); }
    111      else if(cfge.widgetType instanceof GralCfgData.GuiCfgImage){ writeImage((GralCfgData.GuiCfgImage)cfge.widgetType); }
    112      else if(cfge.widgetType instanceof GralCfgData.GuiCfgInputFile){ writeInputFile((GralCfgData.GuiCfgInputFile)cfge.widgetType); }
    113      //else if(cfge.widgetType instanceof GralCfgData.GuiCfgInputFile){ writeInputFile((GralCfgData.GuiCfgInputFile)cfge.widgetType); }
    114      else if(cfge.widgetType instanceof GralCfgData.GuiCfgButton){ writeButton((GralCfgData.GuiCfgButton)cfge.widgetType); }
    115      //else if(cfge.widgetType instanceof GuiCfgData.GuiCfg){ writeButton((GuiCfgData.GuiCfgButton)cfge.widgetType); }
    116      else if(cfge.widgetType.whatIs == 'T'){
    117        writer.append("InputTextline(");
    118        writeParam(cfge.widgetType);
    119        writer.append(");\n");
    120
    121      }
    122      else if(cfge.widgetType.whatIs == 't'){
    123        writer.append("InputBox(");
    124        writeParam(cfge.widgetType);
    125        writer.append(");\n");
    126
    127      }
    128      else {
    129        writeUnknown(cfge.widgetType);
    130      }
    131    }
    132  }
    133
    134
    135  void writePosition(Writer ww, GralCfgElement cfge) throws IOException
    136  {
    137    if(cfge.positionString !=null) {
    138      ww.append(cfge.positionString);
    139    } else {
    140      GralCfgPosition pp = cfge.positionInput;
    141      if(pp.yPos >=0 || pp.xPos >=0 || pp.ySizeDown !=0 || pp.xWidth !=0){
    142        if(pp.panel !=null){
    143          if(!pp.panel.equals(sLastPanel)) {
    144            ww.append("\n\n//================================================================================\n");
    145            sLastPanel = pp.panel;
    146          }
    147          ww.append("\n@").append(pp.panel).append(", ");
    148        } else {
    149          ww.append("\n@");
    150        }
    151        if(pp.yPosRelative) ww.append("&");
    152        if(pp.yPos>=0) ww.append(Integer.toString(pp.yPos));
    153        if(pp.yPosFrac !=0) ww.append(".").append(Integer.toString(pp.yPosFrac));
    154        if(pp.ySizeDown>0) ww.append("+").append(pp.ySizeDown == GralPos.useNatSize/*Integer.MAX_VALUE*/ ? "*" : Integer.toString(pp.ySizeDown));
    155        else if(pp.ySizeDown<0) ww.append(Integer.toString(pp.ySizeDown)); //with negativ sign!
    156        if(pp.ySizeFrac !=0) ww.append(".").append(Integer.toString(pp.ySizeFrac));
    157        if(pp.yIncr_) ww.append("++");
    158
    159        ww.append(",");
    160
    161        if(pp.xPosRelative) ww.append("&");
    162        if(pp.xPos>=0) ww.append(Integer.toString(pp.xPos));
    163        if(pp.xPosFrac !=0) ww.append(".").append(Integer.toString(pp.xPosFrac));
    164        if(pp.xWidth>0) ww.append("+").append(pp.xWidth == GralPos.useNatSize/*Integer.MAX_VALUE*/ ? "*" : Integer.toString(pp.xWidth));
    165        else if(pp.xWidth<0) ww.append(Integer.toString(pp.xWidth)); //width negativ sign!
    166        if(pp.xSizeFrac !=0) ww.append(".").append(Integer.toString(pp.xSizeFrac));
    167        if(pp.xIncr_) ww.append("++");
    168
    169        ww.append(": ");
    170      }
    171    }
    172  }
    173
    174
    175  void writeShowField(GralCfgData.GuiCfgShowField ee) throws IOException
    176  { //String sep = "";
    177    if(ee.editable){
    178      writer.append("InputTextline(");
    179    } else {
    180      writer.append("Show(");
    181    }
    182    writeParam(ee);
    183    writer.append("); ");
    184  }
    185
    186
    187  void writeLed(GralCfgData.GuiCfgLed ee) throws IOException
    188  { //String sep = "";
    189    writer.append("Led(");
    190    writeParam(ee);
    191    writer.append("); ");
    192  }
    193
    194
    195  void writeImage(GralCfgData.GuiCfgImage ee) throws IOException
    196  { //String sep = "";
    197    writer.append("Imagefile(file=\"");
    198    writer.append(ee.file_).append("\"");
    199    writeParam(ee, ",");
    200    writer.append(");\n");
    201  }
    202
    203
    204
    205  void writeInputFile(GralCfgData.GuiCfgInputFile ee) throws IOException
    206  { //String sep = "";
    207    writer.append("InputFile(");
    208    writeParam(ee);
    209    writer.append(");\n");
    210  }
    211
    212
    213
    214  void writeButton(GralCfgData.GuiCfgButton ee) throws IOException
    215  { //String sep = "";
    216    writer.append("Button(");
    217    writeParam(ee);
    218    writer.append(");\n");
    219  }
    220
    221
    222
    223  void writeText(GralCfgData.GuiCfgText ee) throws IOException
    224  { //String sep = "";
    225    writer.append("Text(");
    226    writeParam(ee);
    227    writer.append("); ");
    228  }
    229
    230
    231
    232  void writeUnknown(GralCfgData.GuiCfgWidget ee) throws IOException
    233  { //String sep = "";
    234    writer.append("Unknown(");
    235    writeParam(ee);
    236    writer.append("); ");
    237  }
    238
    239
    240  private void writeParam(GralCfgData.GuiCfgWidget pp) throws IOException
    241  {
    242    writeParam(pp, "");
    243  }
    244
    245
    246  private void writeParam(GralCfgData.GuiCfgWidget pp, String sep) throws IOException
    247  { //String sep = "";
    248    if(pp.prompt !=null && pp.promptPosition !=null && pp.promptPosition.length() >=1) {
    249      writer.append("%").append(pp.promptPosition).append(":\"")  .append(pp.prompt).append("\""); sep = ", ";
    250    }
    251    if(pp.text !=null)      { writer.append(sep).append("\"")       .append(pp.text).append("\""); sep = ", "; }
    252    if(pp.name !=null)      { writer.append(sep).append("name=")    .append(pp.name); sep = ", "; }
    253    if(pp.cmd  !=null)      { writer.append(sep).append("cmd=\"")   .append(pp.cmd).append("\"");  sep = ", "; }
    254    if(pp.showMethod !=null){ writer.append(sep).append("show=\"")  .append(pp.showMethod).append("\""); sep = ", "; }
    255    if(pp.format !=null)    { writer.append(sep).append("format=\"").append(pp.format).append("\""); sep = ", "; }
    256    if(pp.type !=null)      { writer.append(sep).append("type=")    .append(pp.type); sep = ", "; }
    257    if(pp.data !=null)      { writer.append(sep).append("data=\"")  .append(pp.data).append("\""); sep = ", "; }
    258    if(pp.userAction !=null){ writer.append(sep).append("action=\"")  .append(pp.userAction).append("\""); sep = ", "; }
    259    if(pp.dragFiles !=null) { writer.append(sep).append("dragFiles=\"") .append(pp.dragFiles).append("\""); sep = ", "; }
    260    if(pp.dragText !=null)  {
    261      writer.append(sep).append("dragText=\"")  .append(pp.dragText).append("\""); sep = ", "; }
    262    if(pp.dropFiles !=null) { writer.append(sep).append("dropFiles=\"") .append(pp.dropFiles).append("\""); sep = ", "; }
    263    if(pp.dropText !=null)  { writer.append(sep).append("dropText=\"")  .append(pp.dropText).append("\""); sep = ", "; }
    264    if(pp.color0 !=null)    { writer.append(sep).append("color=")       .append(pp.color0.color);
    265      if(pp.color1 !=null)  { writer            .append("/")            .append(pp.color1.color); }  sep = ", ";
    266    }
    267  }
    268
    269
    270
    271
    272
    273
    274
    275
    276}