001package org.vishia.gral.widget; 002 003import java.io.File; 004import java.util.List; 005 006import org.vishia.cmd.CmdExecuter; 007import org.vishia.cmd.CmdGetterArguments; 008import org.vishia.cmd.JZtxtcmdScript; 009import org.vishia.gral.base.GralWidget; 010import org.vishia.gral.ifc.GralMngBuild_ifc; 011import org.vishia.gral.ifc.GralUserAction; 012import org.vishia.util.DataAccess; 013import org.vishia.gral.ifc.GralTableLine_ifc; 014 015/**This class is a widget to select commands from a table list. 016 * It can be used in any application in a window, which is opened on demand 017 * or which is open any time. The user can select a line with the command and click OK (Enter, Mouse). 018 * Then the command is send to the instance of {@link CmdExecuter} which is given by constructor 019 * and executed there in the thread of the {@link CmdExecuter}. It is possible to share the CmdQueue-instance 020 * with some other application parts. The execution is queued there. 021 * 022 * The commands are shown in a table. The appearance of the table can be controlled by the application 023 * or maybe by the user. Only one command can be selected to execute. 024 * 025 * All commands to select are contained in the public field {@link #cmdStore}. 026 * This storage of commands can be filled calling {@link CmdStore#readCmdCfg(File)} or in any other way 027 * of that class. 028 * 029 * @author Hartmut Schorrig 030 * 031 */ 032public class GralCommandSelector extends GralSelectList<JZtxtcmdScript.Subroutine> 033{ 034 035 036 /**Version, history and license. This String is visible in the about info. 037 * <ul> 038 * <li>2017-01-01 Now supports only {@link JZtxtcmdScript.Subroutine}, no more CmdStore. 039 * The CmdStore is the older concept before JZcmd was found. JZcmd contains more capabilities. 040 * <li>2013-10-00 Hartmut created 041 * </ul> 042 * 043 * <b>Copyright/Copyleft</b>:<br> 044 * For this source the LGPL Lesser General Public License, 045 * published by the Free Software Foundation is valid. 046 * It means: 047 * <ol> 048 * <li> You can use this source without any restriction for any desired purpose. 049 * <li> You can redistribute copies of this source to everybody. 050 * <li> Every user of this source, also the user of redistribute copies 051 * with or without payment, must accept this license for further using. 052 * <li> But the LPGL is not appropriate for a whole software product, 053 * if this source is only a part of them. It means, the user 054 * must publish this part of source, 055 * but doesn't need to publish the whole source of the own product. 056 * <li> You can study and modify (improve) this source 057 * for own using or for redistribution, but you have to license the 058 * modified sources likewise under this LGPL Lesser General Public License. 059 * You mustn't delete this Copyright/Copyleft inscription in this source file. 060 * </ol> 061 * If you intent to use this source without publishing its usage, you can get 062 * a second license subscribing a special contract with the author. 063 * 064 * @author Hartmut Schorrig = hartmut.schorrig@vishia.de 065 */ 066 //@SuppressWarnings("hiding") 067 public static final String version = "2016-12-27"; 068 069 070 /**Store of all possible commands given in the command file. 071 * See {@link CmdStore#readCmdCfg(File)} */ 072 //public final CmdStore cmdStore; 073 074 /**Execution instance in another thread. */ 075 //protected final CmdQueue cmdQueue; 076 protected final CmdExecuter cmdExecuter; 077 078 /** 079 * @since 2016-12 080 */ 081 protected final CmdGetterArguments getterArguments; 082 083 /**The currently selected command. 084 * 085 */ 086 protected JZtxtcmdScript.Subroutine selectedCmd; 087 088 089 final Appendable out; 090 091 public GralCommandSelector(String name, int rows, int[] columns, char size, CmdExecuter cmdExecuter, Appendable out, CmdGetterArguments getterArguments) 092 { super(name, rows, columns, size); 093 this.cmdExecuter = cmdExecuter; 094 this.out = out; 095 //this.cmdStore = new CmdStore(); 096 //this.cmdQueue = cmdQueue; 097 this.getterArguments = getterArguments; 098 099 } 100 101 102 @Override 103 public void createImplWidget_Gthread(){ 104 super.createImplWidget_Gthread(); 105 wdgdTable.specifyActionOnLineSelected(actionOnLineSelected); 106 } 107 108 109 110 111 public void clear() { wdgdTable.clearTable(); addJZsub2SelectTable.clear(); } 112 113 114 115 public JZtxtcmdScript.AddSub2List addJZsub2SelectTable = new JZtxtcmdScript.AddSub2List() { 116 117 int level = 1; 118 GralTableLine_ifc<JZtxtcmdScript.Subroutine> parentline = null, line = null; 119 120 @Override public void clear() 121 { parentline = null; line = null; 122 } 123 124 @Override 125 public void add2List(JZtxtcmdScript.JZcmdClass jzclass, int level) 126 { String[] texts = new String[2]; 127 texts[0] = jzclass.cmpnName; 128 texts[1] = "+"; 129 parentline = wdgdTable.addLine(jzclass.cmpnName, texts, null); 130 131 } 132 133 @Override 134 public void add2List(JZtxtcmdScript.Subroutine jzsub, int level) 135 { 136 String[] texts = new String[2]; 137 texts[0] = jzsub.name; 138 texts[1] = ""; 139 if(parentline !=null) { 140 parentline.addChildLine(jzsub.name, texts, jzsub); 141 } else { 142 wdgdTable.addLine(jzsub.name, texts, jzsub); 143 } 144 145 } 146 147 }; 148 149 150 151 152 /**Returns the currently selected command. */ 153 public JZtxtcmdScript.Subroutine getCurrCmd(){ return selectedCmd; } 154 155 156 157 /**Executes the command which is selected currently. 158 * Whether or not the selection is visible and recognized by the user, it should be defined in the application. 159 */ 160 public void executeCurrCmdWithFiles(){ 161 if(selectedCmd !=null){ 162 actionOk(selectedCmd, null); //Note: the argument line isn't used in the called method. 163 } 164 } 165 166 167 168 169 170 171 /**Action on click Ok at any line of table. 172 * @param userData It is the {@link GralTableLine_ifc#getUserData()}, which is the 173 * {@link CmdStore.CmdBlock}-instance which is assigned with the line. The method casts without check. 174 * @param line isn't used here. It can be null in direct invocations. 175 * @see org.vishia.gral.widget.GralSelectList#actionOk(java.lang.Object, org.vishia.gral.ifc.GralTableLine_ifc) 176 */ 177 @Override protected boolean actionOk(Object userData, GralTableLine_ifc<JZtxtcmdScript.Subroutine> line) 178 { 179 JZtxtcmdScript.Subroutine jzsub = (JZtxtcmdScript.Subroutine)userData; 180 //Map<String, DataAccess.Variable<Object>> jargs = getterArguments.getArguments(cmdBlock.)//cmdBlock.getArguments(getterFiles); 181 //File currFile = getterArguments.getCurrDir(); 182 183 //File currDir = currFile !=null? currFile.getParentFile(): null; 184 String sMsg = "GralCommandSelector - put cmd;" + jzsub.toString(); 185 System.out.println(sMsg); 186 List<DataAccess.Variable<Object>> args = getterArguments.getArguments(jzsub); 187 cmdExecuter.addCmd(jzsub, args, out, getterArguments.getCurrDir()); //to execute. 188 /* 189 } 190 else { 191 File[] files = new File[3]; 192 193 getterFiles.prepareFileSelection(); 194 files[0] = getterFiles.getFile1(); 195 files[1] = getterFiles.getFile2(); 196 files[2] = getterFiles.getFile3(); 197 File currDir; 198 if(files[0] !=null){ 199 currDir = files[0].getParentFile(); 200 } else { 201 currDir = new File("/"); 202 } 203 File currFile = getterFiles.getFile1(); 204 205 String sMsg = "GralCommandSelector - put cmd;" + cmdBlock.toString(); 206 System.out.println(sMsg); 207 cmdQueue.addCmd(cmdBlock, files, currDir); 208 } 209 */ 210 return true; 211 } 212 213 214 215 @Override protected void actionLeft(Object userData, GralTableLine_ifc line) 216 { 217 } 218 219 @Override protected void actionRight(Object userData, GralTableLine_ifc line) 220 { 221 } 222 223 224 @Override protected boolean actionUserKey(int key, Object userData, GralTableLine_ifc line) 225 { 226 // TODO Auto-generated method stub 227 return false; 228 } 229 230 231 private final GralUserAction actionOnLineSelected = new GralUserAction("actionOnLineSelected"){ 232 @Override public boolean userActionGui(int actionCode, GralWidget widgd, Object... params){ 233 @SuppressWarnings("unchecked") 234 GralTableLine_ifc<JZtxtcmdScript.Subroutine> line = (GralTableLine_ifc<JZtxtcmdScript.Subroutine>)params[0]; 235 if(line !=null){ 236 selectedCmd = line.getUserData(); 237 } 238 return true; 239 } 240 }; 241 242 public GralUserAction actionExecCmdWithFiles = new GralUserAction("actionExecCmdWithFiles"){ 243 @Override public boolean userActionGui(int actionCode, GralWidget widgd, Object... params){ 244 executeCurrCmdWithFiles(); 245 return true; 246 } 247 }; 248 249 250}