001package org.vishia.gral.area9; 002 003import java.io.File; 004import java.util.ArrayList; 005 006import org.vishia.gral.awt.AwtFactory; 007import org.vishia.gral.base.GralGridProperties; 008import org.vishia.gral.base.GralWindow; 009import org.vishia.gral.ifc.GralFactory; 010import org.vishia.gral.base.GralMng; 011import org.vishia.gral.swt.SwtFactory; 012import org.vishia.inspectorTarget.Inspector; 013import org.vishia.mainCmd.MainCmd; 014import org.vishia.msgDispatch.LogMessage; 015import org.vishia.msgDispatch.MsgDispatchSystemOutErr; 016import org.vishia.msgDispatch.MsgPrintStream; 017 018/**This class is an extension of the {@link MainCmd} for graphic applications. 019 * It provides up to 9 areas for panels. With them a basic partitioning of panels can be done. 020 * See {@link GralArea9_ifc}. 021 * This instance can used for graphical output without any inheritance in an user application. 022 * The user application may inherit from {@link GuiCfg} instead or use GuiCfg with a special plugin 023 * and text-given graphic configuration. GuiCfg aggregates this class. 024 * Follow the pattern in {@link GuiCfg#main(String[])} to build a users application. 025 * 026 * @author Hartmut Schorrig 027 * 028 */ 029public class GralArea9MainCmd extends MainCmd 030{ 031 032 /**Version, history and license. 033 * <ul> 034 * <li>2016-07-10 Hartmut chg: Positioning of Windows on open, especiallythe top level window: with pos-String, it is the new concept of opsitioning of a GralWidget 035 * <li>2015-05-16 Hartmut new "-help:" for help base dir in argument check, "-msgcfg:" in argument check. 036 * It is moved from Fcmd to this base class of Fcmd, available generally. 037 * <li>2013-11-22 Hartmut chg: title of main window as argument -title= 038 * <li>2013-01-26 Hartmut chg: The MsgDispatchSystemOutErr.create(file) was invoked in this constructor. Therefore 039 * all Applications redirect the System.out and System.err outputs to the message system. The outputs were completed 040 * with the time stamp and a number, the {@link org.vishia.msgDispatch.MsgDispatcher} was prepared to use. 041 * This capability is removed from here yet. It should be a part of the application. See {@link GuiCfg#main(String[])}. 042 * <li>2012-07-09 Hartmut new: The {@link Inspector} will be initialized only if the command line argument 043 * "-inspectorPort=" is given. That parameter in form "UDP:ip:port" is used. 044 * <li>2012-04-22 Hartmut new: {@link #parseArgumentsAndInitGraphic(String, String, int, int, int, int)} 045 * for determination of display coordinates in the users application. 046 * Getting size arguments from main-args. 047 * <li>2012-03-30 MsgPrintStream systemErrAdapter used here. 048 * Now System.err.println can be used to generate an dispatch-able message with numeric identifier. 049 * </ul> 050 * <b>Copyright/Copyleft</b>: 051 * For this source the LGPL Lesser General Public License, 052 * published by the Free Software Foundation is valid. 053 * It means: 054 * <ol> 055 * <li> You can use this source without any restriction for any desired purpose. 056 * <li> You can redistribute copies of this source to everybody. 057 * <li> Every user of this source, also the user of redistribute copies 058 * with or without payment, must accept this license for further using. 059 * <li> But the LPGL ist not appropriate for a whole software product, 060 * if this source is only a part of them. It means, the user 061 * must publish this part of source, 062 * but don't need to publish the whole source of the own product. 063 * <li> You can study and modify (improve) this source 064 * for own using or for redistribution, but you have to license the 065 * modified sources likewise under this LGPL Lesser General Public License. 066 * You mustn't delete this Copyright/Copyleft inscription in this source file. 067 * </ol> 068 * If you are intent to use this sources without publishing its usage, you can get 069 * a second license subscribing a special contract with the author. 070 * 071 * @author Hartmut Schorrig = hartmut.schorrig@vishia.de 072 * 073 * 074 */ 075 public final static int version = 20130126; 076 077 public GralArea9_ifc gui; 078 079 //final MsgPrintStream systemErrAdapter; 080 //final MsgDispatchSystemOutErr msgDisp; 081 082 083 final LogMessage log; 084 085 /**Aggregation to given instance for the command-line-argument. The instance can be arranged anywhere else. 086 * It is given as ctor-parameter. 087 */ 088 protected final GuiCallingArgs cargs; 089 090 public GralMng gralMng; 091 092 String sArgError = null; 093 094 /**ctor called in static main. 095 * @param cargs aggregation to command-line-argument data, it will be filled here. 096 * @param args The command-line-calling arguments from static main 097 * @param sTitle Title in title line 098 * @param sOutputArea area for output, for example "3A3C". 099 */ 100 public GralArea9MainCmd(GuiCallingArgs cargs, String[] args) 101 { 102 super(args); 103 this.cargs = cargs; 104 this.log = getLogMessageErrorConsole(); 105 //this.msgDisp = MsgDispatchSystemOutErr.create("D:/DATA/msg/log$yyyy-MMM-dd-HH_mm$.log"); 106 107 108 } 109 110 111 /**Builds the graphic and parses the command line parameters. Possible command line argument errors 112 * or help texts are outputted to the window in the output box. 113 * @param sTitle Title for window 114 * @param sOutputArea Use 1..3 for row and A..C for column in form for example "3A3C". 115 * In this example the output box occupies all 3 columns (A to C) from the 3. (= bottom) row 116 * of the 9 areas. If null is used, the default selection is "3A3C". 117 * @return true if it is successfully. 118 */ 119 public boolean parseArgumentsAndInitGraphic(String sTitle, String sOutputArea) 120 { 121 return parseArgumentsAndInitGraphic(sTitle, sOutputArea, '.', null); 122 } 123 124 125 /**Builds the graphic and parses the command line parameters. Possible command line argument errors 126 * or help texts are outputted to the window in the output box. 127 * @param sTitle Title for window as default if -title= is not given as arg 128 * @param sOutputArea Use 1..3 for row and A..C for column in form for example "3A3C". 129 * In this example the output box occupies all 3 columns (A to C) from the 3. (= bottom) row 130 * of the 9 areas. If null is used, the default selection is "3A3C". 131 * @return true if it is successfully. 132 */ 133 public boolean parseArgumentsAndInitGraphic(String sTitle, String sOutputArea, char sizeShow, String position) 134 { 135 boolean bOk = true; 136 try{ parseArguments(); } 137 catch(Exception exception) 138 { sArgError = "Cmdline argument error:" + exception.getLocalizedMessage(); 139 setExitErrorLevel(exitWithArgumentError); 140 bOk = false; 141 } 142 GralMng.create(log); 143 gralMng = GralMng.get(); 144 if(cargs.graphicFactory == null){ 145 cargs.graphicFactory = new SwtFactory(); 146 } 147 148 if(sOutputArea == null){ sOutputArea = "A3C3"; } 149 if("\0 .".indexOf(sizeShow) >=0){ //undefined per parameter, use args 150 sizeShow = cargs.sizeShow; 151 } 152 String posWindow1 = cargs.positionWindow !=null ? cargs.positionWindow : position !=null ? position : "0+80, 10+120"; 153 154 String sTitle1 = cargs.sTitle !=null ? cargs.sTitle : sTitle != null ? sTitle: cargs.fileGuiCfg !=null ? cargs.fileGuiCfg.getName() : " no -cfg given"; 155 GralWindow primaryWindow = new GralWindow(posWindow1, "primaryWindow", sTitle1, GralWindow.windResizeable + GralWindow.windHasMenu); 156 GralFactory.createGraphic(primaryWindow, sizeShow, log, "SWT"); 157 //cargs.graphicFactory.createWindow(primaryWindow, sizeShow); 158 gui = new GralArea9Window(this, primaryWindow); 159 gui.getGralMng().setApplicationAdapter(gui); 160 if(cargs.dirHtmlHelp !=null) { 161 try{ 162 gui.setHelpBase(cargs.dirHtmlHelp.getAbsolutePath()); 163 } catch(Exception exc) { 164 System.err.println("GralArea9MainCmd - help faulty, " + cargs.dirHtmlHelp.toString()); 165 } 166 } 167 gui.initGraphic(sOutputArea); 168 if(sArgError !=null){ 169 writeError(sArgError); 170 } 171 return bOk; 172 } 173 174 //public void setFullScreen(boolean full){ gui.setFullScreen(full); } 175 176 /*---------------------------------------------------------------------------------------------*/ 177 /** Tests one argument. This method is invoked from parseArgument. It is abstract in the superclass MainCmd 178 and must be overwritten from the user. 179 :TODO: user, test and evaluate the content of the argument string 180 or test the number of the argument and evaluate the content in dependence of the number. 181 182 @param argc String of the actual parsed argument from cmd line 183 @param nArg number of the argument in order of the command line, the first argument is number 1. 184 @return true is okay, 185 false if the argument doesn't match. The parseArgument method in MainCmd throws an exception, 186 the application should be aborted. 187 */ 188 @Override protected boolean testArgument(String arg, int nArg) 189 { boolean bOk = true; //set to false if the argc is not passed 190 try { 191 if(arg.startsWith("-title=")) 192 { cargs.sTitle = getArgument(7); //the graphic GUI-appearance 193 } 194 else if(arg.startsWith("-gui=")) 195 { cargs.fileGuiCfg = new File(getArgument(5)); //the graphic GUI-appearance 196 197 } 198 else if(arg.startsWith("-cfg=")) 199 { String sCfg = getArgument(5); //the graphic GUI-appearance 200 if(cargs.cfgConditions == null){ 201 cargs.cfgConditions = new ArrayList<String>(); 202 } 203 cargs.cfgConditions.add(sCfg); 204 } 205 else if(arg.startsWith("-ownIpc=")) 206 { cargs.sOwnIpcAddr = getArgument(8); //an example for default output 207 } 208 else if(arg.startsWith("-inspectorPort=")) 209 { cargs.sInspectorOwnPort = getArgument(15); //an example for default output 210 } 211 else if(arg.startsWith("-timeZone=")) 212 { cargs.sTimeZone = getArgument(10); //an example for default output 213 } 214 else if(arg.startsWith("-size=")) 215 { String sValue = getArgument(6); 216 if(sValue.length() >=1){ 217 cargs.sizeShow = sValue.charAt(0); 218 } else { 219 bOk = false; 220 } 221 } 222 else if(arg.startsWith("-pos=")) 223 { cargs.positionWindow = getArgument(5); 224 } 225 else if(arg.startsWith("-fullscreen")) 226 { cargs.positionWindow = "0..0,0..0"; 227 } 228 else if (arg.startsWith("-help:") || arg.startsWith("help=")) { 229 File file1 = new File(arg.substring(6)); 230 String sPathHelpAbs = file1.getAbsolutePath(); 231 cargs.dirHtmlHelp = new File(sPathHelpAbs); //should be absolute because browser. 232 } else if (arg.startsWith("-msgcfg:") || arg.startsWith("-msgcfg=")) { 233 cargs.msgConfig = new File(arg.substring(8)); 234 } 235 else if(arg.startsWith("-syntax=")) 236 { cargs.sPathZbnf = getArgument(8); //an example for default output 237 } 238 else if(arg.startsWith("-plugin=")) 239 { cargs.sPluginClass = getArgument(8); //an example for default output 240 } 241 242 else if(arg.startsWith("-SWT")) 243 { cargs.graphicFactory = new SwtFactory(); //an example for default output 244 } 245 246 else if(arg.startsWith("-AWT")) 247 { cargs.graphicFactory = new AwtFactory(); //an example for default output 248 } 249 250 else if(arg.startsWith("-_")) 251 { //accept but ignore it. Commented calling arguments. 252 } 253 else 254 { bOk=false; 255 } 256 } catch(Exception exc){ 257 } 258 return bOk; 259 } 260 261 262 /** Invoked from parseArguments if no argument is given. In the default implementation a help info is written 263 * and the application is terminated. The user should overwrite this method if the call without comand line arguments 264 * is meaningfull. 265 * 266 */ 267 @Override protected void callWithoutArguments() 268 { //overwrite with empty method - if the calling without arguments 269 //having equal rights than the calling with arguments - no special action. 270 } 271 272 /*---------------------------------------------------------------------------------------------*/ 273 /**Checks the cmdline arguments relation together. 274 If there is an inconsistents, a message should be written. It may be also a warning. 275 :TODO: the user only should determine the specific checks, this is a sample. 276 @return true if successfull, false if failed. 277 */ 278 @Override protected boolean checkArguments() 279 { boolean bOk = true; 280 return bOk; 281 282 } 283 284 285 @Override public void exit() 286 { gui.mainWindow().closeWindow(); 287 } 288 289}