001package org.vishia.gral.cfg;
002
003import java.io.File;
004import java.text.ParseException;
005
006import org.vishia.gral.base.GralGraphicTimeOrder;
007import org.vishia.gral.base.GralMng;
008import org.vishia.gral.base.GralPanelContent;
009import org.vishia.gral.base.GralWindow;
010import org.vishia.gral.ifc.GralWindow_ifc;
011import org.vishia.mainCmd.MainCmdLogging_ifc;
012import org.vishia.msgDispatch.LogMessageStream;
013
014/*Test with Jbat: call Jbat with this java file with its full path:
015file: D:/vishia/Java/srcJava_vishiaGui/org/vishia/gral/cfg/GralCfgWindow.java
016==JZcmd==
017java org.vishia.gral.test.HelloWorld.openWindow();                 
018String windowTitle = <:>Test GralCfgWindow<.>;
019String gConfig = 
020<:>
021 ##A value to show, following by a label.
022 @4+2,2+30:Show("name"); Text("label");
023 @6..-2, 2..0: InputBox(box);
024<.>;
025Obj window = java org.vishia.gral.cfg.GralCfgWindow.createWindow("testCfgWind", windowTitle, gConfig, jzcmdsub.currdir, jzcmd.log);
026window.setTextIn("name", "example");
027window.setTextIn("box", "Box input");                 
028java org.vishia.gral.test.HelloWorld.waitForClosePrimaryWindow();
029==endJZcmd==
030*/
031
032/**This is the class to build a graphic window in any application which is configurable.
033 * It uses an existing instance of the {@link GralMng}
034 * <br><br>
035 * Note: See {@link org.vishia.gral.area9.GuiCfg}, that is an application with 9 areas for configuration. 
036 * 
037 * @author Hartmut Schorrig
038 *
039 */
040public class GralCfgWindow
041{
042  
043  /**The version, history and license.
044   * <ul>
045   * <li>2018-09-17 GralCfgWindow: with argument for size and AWT/SWT
046   * <li>2015-04-26 Hartmut created: For usage in Jzcmd-scripts.
047   * </ul>
048   * 
049   * <b>Copyright/Copyleft</b>:
050   * For this source the LGPL Lesser General Public License,
051   * published by the Free Software Foundation is valid.
052   * It means:
053   * <ol>
054   * <li> You can use this source without any restriction for any desired purpose.
055   * <li> You can redistribute copies of this source to everybody.
056   * <li> Every user of this source, also the user of redistribute copies
057   *    with or without payment, must accept this license for further using.
058   * <li> But the LPGL is not appropriate for a whole software product,
059   *    if this source is only a part of them. It means, the user
060   *    must publish this part of source,
061   *    but don't need to publish the whole source of the own product.
062   * <li> You can study and modify (improve) this source
063   *    for own using or for redistribution, but you have to license the
064   *    modified sources likewise under this LGPL Lesser General Public License.
065   *    You mustn't delete this Copyright/Copyleft inscription in this source file.
066   * </ol>
067   * If you are intent to use this sources without publishing its usage, you can get
068   * a second license subscribing a special contract with the author. 
069   * 
070   * @author Hartmut Schorrig = hartmut.schorrig@vishia.de
071   * 
072   * 
073   */
074  public final static int version = 0x20150426;
075
076  
077  final private MainCmdLogging_ifc log;
078  
079  /**The configuration data for graphical appearance. */
080  final private GralCfgData guiCfgData;
081
082  /**Directory for images. */
083  File imgDir;
084  
085  final public GralWindow window;
086  
087  /**Creates a new Window or opens the existing one with given name.
088   * @param sName Name of the window inside the gral manager to address the window.
089   * @param sTitle text in the title bar
090   * @param size 'A'...'E' as pixel/grid unit for SWT graphic. 'a'...'e' same for AWT-Graphic
091   * @param sCfg textual given configuration for the window.
092   * @param imgDir start directory path where images are located if given with relative path.
093   * @param log interface for logging output of parser and creation.
094   * @throws ParseException on errors in the sCfg
095   */
096  private GralCfgWindow(String sName, String sTitle, char size, CharSequence sCfg, File imgDir, MainCmdLogging_ifc log) throws ParseException {
097    this.log = log !=null ? log : log;
098    this.guiCfgData = new GralCfgData(null);  //no config conditions given.
099    this.imgDir = imgDir;
100    String swtOrawt;
101    if(size < 'a') { swtOrawt = "SWT"; }
102    else { size -= 'a'-'A'; swtOrawt = "AWT"; }
103    GralCfgZbnf cfgZbnf = new GralCfgZbnf();  //temporary instance for parsing
104    cfgZbnf.configureWithZbnf(sCfg, guiCfgData); //
105    int props = GralWindow_ifc.windRemoveOnClose | GralWindow_ifc.windConcurrently | GralWindow_ifc.windResizeable;
106    GralMng mng = GralMng.get();
107    mng.selectPrimaryWindow();
108    this.window = new GralWindow("10+50, 10+100", sName, sTitle, props);
109    configInGthread.getCtDone(0);
110    this.window.create(swtOrawt, size, log, configInGthread);
111    configInGthread.awaitExecution(1, 0);
112  }
113  
114  /**Creates a window with a given configuration.
115   * The window will be removed on closing.
116   * @param sName Name of the window inside the gral manager to address the window.
117   * @param sTitle text in the title bar
118   * @param size 'A'...'E' as pixel/grid unit for SWT graphic. 'a'...'e' same for AWT-Graphic
119   * @param sCfg textual given configuration for the window.
120   * @param imgDir start directory path where images are located if given with relative path.
121   * @param log log output for status and parse messages
122   * @throws ParseException on errors in the sCfg
123   */
124  public static GralWindow createWindow(String sName, String sTitle, char size, CharSequence sCfg, File imgDir, MainCmdLogging_ifc log) 
125  throws ParseException
126  {
127    GralCfgWindow thiz = new GralCfgWindow(sName, sTitle, size, sCfg, imgDir, log);
128    return thiz.window;
129  }
130  
131  
132  
133  
134
135  
136  /**Code snippet to run the ZBNF-configurator (text controlled GUI)
137   * 
138   */
139  @SuppressWarnings("synthetic-access")  
140  GralGraphicTimeOrder configInGthread = new GralGraphicTimeOrder("GralCfgWindow.config")
141  {
142    
143    private static final long serialVersionUID = 1L;
144
145    @Override public void executeOrder(){
146      GralMng mng = GralMng.get();
147      mng.selectPanel("primaryWindow");  //window position relative to the primary window.
148      window.setToPanel(mng);
149      window.setVisible(true);
150      GralCfgBuilder cfgBuilder = new GralCfgBuilder(guiCfgData, mng, imgDir);
151      cfgBuilder.buildGui(log, 0);        
152    }
153  ////
154  };
155
156
157  
158  
159}