001package org.vishia.commander; 002 003import java.io.BufferedReader; 004import java.io.File; 005import java.io.FileNotFoundException; 006import java.io.FileReader; 007import java.io.IOException; 008import java.util.Iterator; 009import java.util.LinkedList; 010import java.util.List; 011import java.util.ListIterator; 012import java.util.Map; 013 014import org.vishia.fileRemote.FileCluster; 015import org.vishia.fileRemote.FileRemote; 016import org.vishia.gral.base.GralPos; 017import org.vishia.gral.base.GralWidget; 018import org.vishia.gral.base.GralMng; 019import org.vishia.gral.base.GralTabbedPanel; 020import org.vishia.gral.base.GralWindow; 021import org.vishia.gral.ifc.GralColor; 022import org.vishia.gral.ifc.GralTextField_ifc; 023import org.vishia.gral.ifc.GralUserAction; 024import org.vishia.gral.ifc.GralWidget_ifc; 025import org.vishia.gral.ifc.GralWindow_ifc; 026import org.vishia.gral.widget.GralFileSelector; 027import org.vishia.mainCmd.MainCmd_ifc; 028import org.vishia.util.FileWriter; 029import org.vishia.util.KeyCode; 030import org.vishia.util.StringPart; 031 032/**This class implements the selection functionality of tabs and paths for the whole Java commander. 033 * It contains all actions which are instantiated one time but affects a special (the current) file panel. 034 * */ 035class FcmdFavorPathSelector 036{ 037 038 /**Version, history and license: 039 * <ul> 040 * <li>2012-03-09 Hartmut new menu entry menuBarFolderSync 041 * <li>2012-02-04 Hartmut new menu entries for refresh and origin dir 042 * </ul> 043 * 044 * 045 * <b>Copyright/Copyleft</b>: 046 * For this source the LGPL Lesser General Public License, 047 * published by the Free Software Foundation is valid. 048 * It means: 049 * <ol> 050 * <li> You can use this source without any restriction for any desired purpose. 051 * <li> You can redistribute copies of this source to everybody. 052 * <li> Every user of this source, also the user of redistribute copies 053 * with or without payment, must accept this license for further using. 054 * <li> But the LPGL ist not appropriate for a whole software product, 055 * if this source is only a part of them. It means, the user 056 * must publish this part of source, 057 * but don't need to publish the whole source of the own product. 058 * <li> You can study and modify (improve) this source 059 * for own using or for redistribution, but you have to license the 060 * modified sources likewise under this LGPL Lesser General Public License. 061 * You mustn't delete this Copyright/Copyleft inscription in this source file. 062 * </ol> 063 * If you are intent to use this sources without publishing its usage, you can get 064 * a second license subscribing a special contract with the author. 065 * 066 * @author Hartmut Schorrig = hartmut.schorrig@vishia.de 067 */ 068 public static final int version = 0x20120204; 069 070 /**Entry in the favorite list. */ 071 static class FavorPath 072 { /**The path of directory to select. */ 073 final String path; 074 /**The name shown in the list. */ 075 final String selectName; 076 077 final FileCluster fileCluster; 078 /**The label on the tab in tabbed panel. */ 079 //String label; 080 /**bit 0..2 present this favorite on the designated main panel 1..3 or l, m, r, 081 * it means, a tab with the label will be created. */ 082 int mMainPanel; 083 084 /**Origin dir adequate {@link #path}. It is null on initialization, but build on call of 085 * {@link #getOriginDir()}. */ 086 private FileRemote dir; 087 088 public FavorPath(String selectName, String path, FileCluster fileCluster) 089 { this.fileCluster = fileCluster; 090 this.path = path; 091 this.selectName = selectName; 092 } 093 094 095 /**Returns the dir instance for the origin path. The dir instance is built only one time 096 * but only if it is necessary. It means it is built on the first call of this method. 097 * @return 098 */ 099 public FileRemote getOriginDir(){ 100 if(dir == null){ //build it only one time, but only if it is necessary. 101 dir = fileCluster.getFile(path, null); //new FileRemote(path); 102 } 103 return dir; 104 } 105 106 107 @Override public String toString(){ return path; } //for debug 108 } 109 110 111 static class FavorFolder 112 { 113 /**The label on the tab in tabbed panel. */ 114 final String label; 115 /**The name shown in the list. */ 116 final String selectNameTab; 117 /**The associated list of selectInfos. */ 118 final List<FavorPath> listfavorPaths = new LinkedList<FavorPath>(); 119 /**bit 0..2 present this favorite on the designated main panel 1..3 or l, m, r, 120 * it means, a tab with the label will be created. */ 121 int mMainPanel; 122 123 public FavorFolder(String label, String selectNameTab) 124 { this.label = label; 125 this.selectNameTab = selectNameTab; 126 } 127 128 @Override public String toString(){ return label; } //for debug 129 130 } 131 132 /**All entries for the select list for all favorite path folders in the order of the configuration file. 133 * The elements of this list can be activated to present in cards with tabs. The cards contain the favor paths 134 * which are contained in {@link FcmdFavorPathSelector.FavorFolder#listfavorPaths}. 135 * But not all elements should be activated similar in all panels, it may be too much tabs per panel. 136 * */ 137 List<FcmdFavorPathSelector.FavorFolder> listAllFavorPathFolders = new LinkedList<FcmdFavorPathSelector.FavorFolder>(); 138 139 140 File fileCfg; 141 142 /**Instance to write the cfgFile. */ 143 FileWriter writerCfg = new FileWriter(); 144 145 /**The three tabbed panels. */ 146 final FcmdLeftMidRightPanel panelLeft, panelMid, panelRight; 147 148 GralFileSelector.WindowConfirmSearch windSearchFiles; 149 150 private final GralMng mng; 151 152 final Fcmd main; 153 154 /**All entries which are shown in all three select lists. */ 155 List<FavorPath> listAllFavorPaths = new LinkedList<FavorPath>(); 156 157 /**For output messages. */ 158 final MainCmd_ifc console; 159 160 161 /**The last selected SelectInfo. */ 162 FavorPath actFavorPathInfo; 163 164 boolean bSyncMidRight; 165 166 167 static class WindowConfirmAddFavorite 168 { 169 /**The window for confirming adding a new favorite. */ 170 GralWindow_ifc window; 171 172 /**The panel from where the window was opened. It helps to get the current selected line in favorites. */ 173 FcmdLeftMidRightPanel panelInvocation; 174 175 /**The short name input field in window confirm add favorite. */ 176 GralTextField_ifc widgShortName; 177 /**The tab input field in window confirm add favorite. */ 178 GralTextField_ifc widgLabel; 179 /**The path input field in window confirm add favorite. */ 180 GralTextField_ifc widgPath; 181 /**A field where "lmr" may be written to make the tab persistent. */ 182 GralTextField_ifc widgPersistent; 183 } 184 185 WindowConfirmAddFavorite windAddFavorite = new WindowConfirmAddFavorite(); 186 187 FcmdFavorPathSelector(MainCmd_ifc console, Fcmd main) 188 { this.main = main; 189 this.console = console; 190 this.mng = main._gralMng; 191 panelLeft = new FcmdLeftMidRightPanel(main, 'l', '1', mng); 192 panelMid = new FcmdLeftMidRightPanel(main, 'm','2', mng); 193 panelRight = new FcmdLeftMidRightPanel(main,'r', '3', mng); 194 195 } 196 197 198 199 200 201 /**Builds the content of the add-favorite window. The window is created static. It is shown 202 * whenever it is used. */ 203 void buildWindowAddFavorite(){ 204 205 windSearchFiles = GralFileSelector.createWindowConfirmSearchGthread(mng); 206 207 //main.gui.addMenuItemGThread("menuFileNaviRefresh", main.idents.menuFileNaviRefreshBar, actionRefreshFileTable); // / 208 //main.gui.addMenuItemGThread("menubarFolderCreate", main.idents.menuConfirmMkdirFileBar, main.mkCmd.actionOpenDialog); // / 209 //main.gui.addMenuItemGThread("menubarFolderSearch", main.idents.menuBarSearchFiles, actionSearchFiles); // / 210 main.gui.addMenuBarArea9ItemGThread("menuBarFolderSyncMidRight", main.idents.menuBarFolderSyncMidRight, actionSyncMidRight); // / 211 //main.gui.addMenuItemGThread("menubarFileProps", main.idents.menuFilePropsBar, main.filePropsCmd.actionOpenDialog); 212 //main.gui.addMenuItemGThread("test", main.idents.menuFileViewBar, main.viewCmd.actionOpenView); 213 //main.gui.addMenuItemGThread("test", main.idents.menuFileEditBar, main.actionEdit); 214 //main.gui.addMenuItemGThread("test", main.idents.menuBarEditIntern, main.editWind.actionOpenEdit); 215 //main.gui.addMenuItemGThread("test", main.idents.menuConfirmCopyBar, main.copyCmd.actionConfirmCopy); 216 //main.gui.addMenuItemGThread("test", main.idents.menuConfirmFileDelBar, main.deleteCmd.actionConfirmDelete); 217 //main.gui.addMenuItemGThread("test", main.idents.menuExecuteBar, main.executer.actionExecuteFileByExtension); 218 //main.gui.addMenuItemGThread("test", main.idents.menuExecuteCmdBar, main.cmdSelector.actionExecCmdWithFiles); 219 220 main.gui.addMenuBarArea9ItemGThread("menuBarCreateFavor", main.idents.menuBarCreateFavor, actionCreateFavor); // / 221 main.gui.addMenuBarArea9ItemGThread("menuDelTab", main.idents.menuDelTab, actionDelTab); // / 222 main.gui.addMenuBarArea9ItemGThread("menuSaveFavoriteSel", main.idents.menuSaveFavoriteSel, actionSaveFavoritePathes); // / 223 main.gui.addMenuBarArea9ItemGThread("menuReadFavoriteSel", main.idents.menuReadFavoriteSel, actionReadFavoritePathes); // / 224 225 226 227 main._gralMng.selectPanel("primaryWindow"); //"output"); //position relative to the output panel 228 //panelMng.setPosition(1, 30+GralGridPos.size, 1, 40+GralGridPos.size, 1, 'r'); 229 main._gralMng.setPosition(-19, 0, -47, 0, 1, 'r'); //right buttom, about half less display width and hight. 230 231 232 windAddFavorite.window = main._gralMng.createWindow("addFavoriteWindow", "add favorite", GralWindow.windConcurrently); 233 234 main._gralMng.setPosition(4, GralPos.size -4, 1, GralPos.size +34, 0, 'r'); 235 windAddFavorite.widgLabel = main._gralMng.addTextField("addFavoriteTab", true, "label", "t"); 236 windAddFavorite.widgLabel.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.favorpath.favorNew.tab."); 237 main._gralMng.setPosition(4, GralPos.size -4, 35, GralPos.size +10, 0, 'r'); 238 windAddFavorite.widgPersistent = main._gralMng.addTextField("addFavoriteTab", true, "lmr ?", "t"); 239 windAddFavorite.widgLabel.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.favorpath.favorNew.persist."); 240 241 main._gralMng.setPosition(8, GralPos.size -4, 1, GralPos.size +45, 0, 'd'); 242 windAddFavorite.widgShortName = main._gralMng.addTextField("addFavoriteAlias", true, "alias (show in list)", "t"); 243 windAddFavorite.widgShortName.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.favorpath.favorNew.alias."); 244 windAddFavorite.widgPath = main._gralMng.addTextField("addFavoritePath", true, "the directory path", "t"); 245 windAddFavorite.widgPath.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.favorpath.favorNew.dir."); 246 247 main._gralMng.setPosition(-4, -1, 1, 6, 0, 'r'); 248 main._gralMng.addButton("addFavoriteEsc", actionAddFavorite, "esc", null, "esc"); 249 main._gralMng.setPosition(-4, -1, -14, GralPos.size +6, 0, 'r',1); 250 GralWidget widg = main._gralMng.addButton("addFavoriteOk", actionAddFavorite, "temp", null, "temp"); 251 widg.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.favorpath.favorNew.temp."); 252 widg = main._gralMng.addButton("addFavoriteOk", actionAddFavorite, "ok", null, "Save"); 253 widg.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.favorpath.favorNew.save."); 254 255 } 256 257 258 259 260 261 262 /**Read the configuration file. It is called on startup of the Java commander. 263 * @param cfgFile 264 * @return an error message to output or null 265 */ 266 String readCfg(File cfgFile) 267 { this.fileCfg = cfgFile; 268 String sError = null; 269 BufferedReader reader = null; 270 try{ 271 reader = new BufferedReader(new FileReader(cfgFile)); 272 } catch(FileNotFoundException exc){ sError = "TabSelector - cfg file not found; " + cfgFile; } 273 if(reader !=null){ 274 try{ 275 listAllFavorPathFolders.clear(); 276 String sLine; 277 int posSep; 278 //List<FavorPath> list = null; 279 FcmdFavorPathSelector.FavorFolder favorTabInfo = null; 280 StringPart spLine = new StringPart(); 281 StringBuilder uLine = new StringBuilder(1000); 282 //boolean bAll = true; 283 while( sError == null && (sLine = reader.readLine()) !=null){ 284 if(sLine.contains("$")){ 285 uLine.append(sLine.trim()); 286 spLine.assignReplaceEnv(uLine); 287 sLine = uLine.toString(); 288 } else { 289 sLine = sLine.trim(); 290 spLine.assign(sLine); 291 } 292 if(sLine.length() >0){ 293 if( sLine.startsWith("==")){ 294 posSep = sLine.indexOf("==", 2); 295 //a new division 296 final String sDiv = sLine.substring(2,posSep).trim(); 297 final int pos1 = sDiv.indexOf(':'); 298 final String sLabel = pos1 >=0 ? sDiv.substring(0, pos1).trim() : sDiv; 299 final int pos2 = sDiv.indexOf(','); 300 //sDivText is the same as sLabel if pos1 <0 301 final String sDivText = pos2 >=0 ? sDiv.substring(pos1+1, pos2).trim() : sDiv.substring(pos1+1).trim(); 302 final String sSelect = pos2 >=0 ? sDiv.substring(pos2): ""; 303 favorTabInfo = null; //selectListOverview.get(sDiv); 304 if(favorTabInfo == null){ 305 favorTabInfo = new FcmdFavorPathSelector.FavorFolder(sLabel, sDivText); 306 if(sSelect.indexOf('l')>=0){ favorTabInfo.mMainPanel |=1;} 307 if(sSelect.indexOf('m')>=0){ favorTabInfo.mMainPanel |=2;} 308 if(sSelect.indexOf('r')>=0){ favorTabInfo.mMainPanel |=4;} 309 listAllFavorPathFolders.add(favorTabInfo); 310 } 311 /// 312 /* 313 if(sDiv.equals("left")){ list = panelLeft.selectListAllFavorites; } 314 else if(sDiv.equals("mid")){ list = panelMid.selectListAllFavorites; } 315 else if(sDiv.equals("right")){ list = panelRight.selectListAllFavorites; } 316 else if(sDiv.equals("all")){ list = selectAll; } 317 else { sError = "Error in cfg file: ==" + sDiv + "=="; } 318 */ 319 } else if(favorTabInfo !=null){ 320 String[] sParts = sLine.trim().split(","); 321 if(sParts.length < 2){ 322 sError = "SelectTab format error; " + sLine; 323 } else { 324 //info. = sParts[0].trim(); 325 String selectName = sParts[0].trim(); 326 String path = sParts[1].trim(); 327 FavorPath favorPathInfo = new FavorPath(selectName, path, main.fileCluster); 328 if(sParts.length >2){ 329 final String actTabEntry = sParts[2].trim(); 330 //final String actTab; 331 /* 332 final int posColon = actTabEntry.indexOf(':'); 333 if(posColon >0){ 334 String sPanelChars = actTabEntry.substring(0, posColon); 335 actTab = actTabEntry.substring(posColon+1).trim(); 336 if(sPanelChars.indexOf('l')>=0){ info.mMainPanel |= 1; } 337 if(sPanelChars.indexOf('m')>=0){ info.mMainPanel |= 2; } 338 if(sPanelChars.indexOf('r')>=0){ info.mMainPanel |= 4; } 339 } else { 340 actTab = actTabEntry.trim(); 341 } 342 info.label = actTab; 343 */ 344 } 345 //info.active = cActive; 346 //list.add(info); 347 favorTabInfo.listfavorPaths.add(favorPathInfo); 348 } 349 } 350 } 351 uLine.setLength(0); 352 }//while 353 spLine.close(); 354 } 355 catch(IOException exc){ sError = "selectTab - cfg file read error; " + cfgFile; } 356 catch(IllegalArgumentException exc){ sError = "selectTab - cfg file error; " + cfgFile + exc.getMessage(); } 357 catch(Exception exc){ sError = "selectTab - any exception; " + cfgFile + exc.getMessage(); } 358 try{ reader.close(); reader = null; } catch(IOException exc){} //close is close. 359 } 360 return sError; 361 } 362 363 364 /**Writes the configuration file. It is called if the configuration should be stored after user invocation. 365 * @param cfgFile 366 * @return an error message to output or null 367 */ 368 void writeCfg(File cfgFile) 369 { boolean bOk = true; 370 if(cfgFile.exists()){ 371 372 String sName = cfgFile.getName() + ".old"; 373 File cfgFileOld = new File(cfgFile.getParentFile(), sName); 374 if(cfgFileOld.exists()){ 375 bOk = cfgFileOld.delete(); 376 if(!bOk){ 377 main.mainCmd.writeError("can't delete " + cfgFileOld.getAbsolutePath()); 378 } 379 } 380 if(bOk){ 381 bOk = cfgFile.renameTo(cfgFileOld); 382 if(!bOk){ 383 main.mainCmd.writeError("can't rename " + cfgFile.getAbsolutePath()); 384 } 385 } 386 } 387 if(bOk){ 388 bOk = writerCfg.open(cfgFile.getAbsolutePath(), false) ==0; 389 } 390 if(bOk){ 391 try{ 392 for(FcmdFavorPathSelector.FavorFolder folder: listAllFavorPathFolders){ 393 writerCfg.append("==").append(folder.label).append(": ").append(folder.selectNameTab); 394 if((folder.mMainPanel & 7)!=0){ writerCfg.append(", "); } 395 if((folder.mMainPanel & 1)!=0){ writerCfg.append('l'); } 396 if((folder.mMainPanel & 2)!=0){ writerCfg.append('m'); } 397 if((folder.mMainPanel & 4)!=0){ writerCfg.append('r'); } 398 writerCfg.append("==\n"); 399 for(FavorPath favor: folder.listfavorPaths){ 400 writerCfg.append(favor.selectName).append(", ").append(favor.path).append("\n"); 401 } 402 writerCfg.append("\n"); 403 404 } 405 } 406 catch(IOException exc){ 407 main.mainCmd.writeError("error writing" , exc); 408 } 409 } 410 writerCfg.close(); 411 } 412 413 414 415 private void XXXwriteCfgLine(FavorPath favorPathInfo) throws IOException 416 { 417 writerCfg.append(favorPathInfo.selectName).append(", ").append(favorPathInfo.path); 418 /* 419 if(info.label !=null && info.label.length()>0){ 420 writerCfg.append(", "); 421 if((info.mMainPanel & 1)!=0){ writerCfg.append('l'); } 422 if((info.mMainPanel & 2)!=0){ writerCfg.append('m'); } 423 if((info.mMainPanel & 4)!=0){ writerCfg.append('r'); } 424 if((info.mMainPanel & 7)!=0){ writerCfg.append(": "); } 425 writerCfg.append(info.label); 426 } 427 */ 428 writerCfg.append("\n"); 429 } 430 431 432 433 434 void initActDir(Map<String, File> index, String key, String path) 435 { 436 if(index.get(key) == null){ 437 index.put(key, new File(path)); 438 } 439 } 440 441 442 443 /**Builds a tab for file or command view from a selected line of selection. 444 * @param info The selection info 445 */ 446 void buildTabFromSelection(FcmdFavorPathSelector.FavorPath info, GralTabbedPanel tabPanel) 447 { assert(false); 448 /* 449 tabPanel.addGridPanel(info.tabName1, info.tabName1,1,1,10,10); 450 mng.setPosition(0, 0, 0, -0, 1, 'd'); //the whole panel. 451 FileSelector fileSelector = new FileSelector("fileSelector-"+info.tabName1, mng); 452 fileSelector.setActionOnEnterFile(main.executer.actionExecute); 453 main.idxFileSelector.put(info.tabName1, fileSelector); 454 fileSelector.setToPanel(mng, info.tabName1, 5, new int[]{2,20,5,10}, 'A'); 455 fileSelector.fillIn(new File(info.path)); 456 */ 457 } 458 459 460 461 462 protected void setSortOrderFiles(char order){ 463 FcmdFileCard fileCard = main.getLastSelectedFileCard(); 464 if(fileCard !=null){ 465 fileCard.setSortOrder(order); 466 fileCard.fillInCurrentDir(); 467 } 468 } 469 470 471 472 void stop(){} 473 474 475 GralUserAction actionSearchFiles = new GralUserAction("actionSearchFiles"){ 476 @Override public boolean userActionGui(int key, GralWidget widgd, Object... params){ 477 if(KeyCode.isControlFunctionMouseUpOrMenu(key)){ 478 FcmdFileCard fileCard = main.lastFavorCard.fileTable; 479 windSearchFiles.confirmSearchInFiles(fileCard, main.gui.getOutputBox()); 480 } 481 return true; 482 } }; 483 484 485 486 GralUserAction actionSyncMidRight = new GralUserAction(""){ 487 @Override public boolean userActionGui(int key, GralWidget widgd, Object... params){ 488 if(KeyCode.isControlFunctionMouseUpOrMenu(key)){ 489 bSyncMidRight = ! bSyncMidRight; 490 if(bSyncMidRight){ 491 main.statusLine.widgSyncInfo.setBackColor(GralColor.getColor("gn"),0); 492 main.statusLine.widgSyncInfo.setText("sync mid-right"); 493 } else { 494 main.statusLine.widgSyncInfo.setBackColor(GralColor.getColor("wh"),0); 495 main.statusLine.widgSyncInfo.setText(""); 496 } 497 } 498 return true; 499 } }; 500 501 502 503 void confirmCreateNewFavor(){ 504 FcmdLeftMidRightPanel panel = main.lastFilePanels.get(0); 505 FcmdFileCard fileCard = panel.actFileCard; 506 windAddFavorite.panelInvocation = panel; 507 windAddFavorite.widgLabel.setText(fileCard.label); 508 windAddFavorite.widgShortName.setText("alias"); 509 File directory = fileCard.getCurrentDir(); 510 //String pathDir = FileSystem.getCanonicalPath(lastSelectedFile.getParentFile()); 511 windAddFavorite.widgPath.setText(directory.getPath()); 512 windAddFavorite.window.setFocus(); //WindowVisible(true); 513 514 } 515 516 517 GralUserAction actionCreateFavor = new GralUserAction(""){ 518 @Override public boolean userActionGui(int key, GralWidget widgd, Object... params){ 519 if(KeyCode.isControlFunctionMouseUpOrMenu(key)){ 520 confirmCreateNewFavor(); 521 } 522 return true; 523 } }; 524 525 526 527 528 GralUserAction actionDelTab = new GralUserAction(""){ 529 @Override public boolean userActionGui(int key, GralWidget widgd, Object... params){ 530 if(main.lastFavorCard !=null){ 531 FcmdFavorCard favorCard = main.lastFavorCard; 532 FcmdFileCard fileCard = favorCard.fileTable; 533 FcmdLeftMidRightPanel panel = fileCard.mainPanel; 534 if(fileCard !=null){ 535 fileCard.remove(); 536 panel.actFileCard = null; 537 panel.listTabs.remove(fileCard); 538 } 539 String nameWidgFavorCard = FcmdWidgetNames.tabFavorites + fileCard.nameFilePanel; 540 String nameWidgFileCard = FcmdWidgetNames.tabFile + fileCard.nameFilePanel; 541 panel.tabbedPanelFavorCards.removePanel(nameWidgFavorCard); 542 panel.tabbedPanelFileCards.removePanel(nameWidgFileCard); 543 panel.cardFavorThemes.setFocus(); 544 } 545 return true; 546 } }; 547 548 549 /**Sets the origin dir of the last focused file table. 550 * <br> 551 * Implementation note: The last focused file tab is searched using {@link Fcmd#getLastSelectedFileCards()}. 552 */ 553 GralUserAction actionSetDirOrigin = new GralUserAction(""){ 554 @Override public boolean userActionGui(int key, GralWidget widgd, Object... params) 555 { if(KeyCode.isControlFunctionMouseUpOrMenu(key)){ 556 GralFileSelector lastTab = main.getLastSelectedFileCards()[0]; 557 if(lastTab !=null){ 558 lastTab.fillInOriginDir(); 559 } else { 560 throw new IllegalArgumentException("last file tab not able to found"); 561 } 562 return true; 563 } else return false; 564 } 565 }; 566 567 568 569 /**Sets the origin dir of the last focused file table. 570 * <br> 571 * Implementation note: The last focused file tab is searched using {@link Fcmd#getLastSelectedFileCards()}. 572 */ 573 GralUserAction actionRefreshFileTable = new GralUserAction(""){ 574 @Override public boolean userActionGui(int key, GralWidget widgd, Object... params){ 575 if(KeyCode.isControlFunctionMouseUpOrMenu(key)){ //supress both mouse up and down reaction 576 FcmdFileCard lastTab = main.getLastSelectedFileCards()[0]; 577 if(lastTab !=null){ 578 FileRemote dir = lastTab.getCurrentDir(); 579 if(dir !=null){ 580 lastTab.forcefillIn(dir, false); 581 } 582 } else { 583 System.out.println("No filetable found to refresh"); 584 //throw new IllegalArgumentException("last file tab not able to found"); 585 } 586 return true; 587 } else return false; 588 } 589 }; 590 591 592 593 594 595 596 597 598 599 GralUserAction actionAddFavorite = new GralUserAction("") 600 { @Override public boolean userActionGui(int key, GralWidget infos, Object... params) 601 { if(KeyCode.isControlFunctionMouseUpOrMenu(key)){ 602 if(infos.sCmd.equals("ok") || infos.sCmd.equals("temp")){ 603 String path = windAddFavorite.widgPath.getText(); 604 String selectName = windAddFavorite.widgShortName.getText(); 605 FavorPath favorite = new FavorPath(selectName, path, main.fileCluster); 606 String tablabel = windAddFavorite.widgLabel.getText(); 607 favorite.mMainPanel = 1<< (windAddFavorite.panelInvocation.cNr - '1'); 608 FcmdFavorPathSelector.FavorFolder tabDst = null; 609 for(FcmdFavorPathSelector.FavorFolder tab:listAllFavorPathFolders){ //note: used break in loop 610 if(tab.label.equals(tablabel)){ 611 tabDst = tab; 612 break; 613 } 614 } 615 if(tabDst == null){ 616 //its a new tab 617 tabDst = new FcmdFavorPathSelector.FavorFolder(tablabel, tablabel); 618 listAllFavorPathFolders.add(tabDst); 619 } 620 tabDst.listfavorPaths.add(favorite); 621 windAddFavorite.panelInvocation.fillCards(); 622 /// 623 if(infos.sCmd.equals("ok")){ 624 writeCfg(fileCfg); 625 } 626 } 627 windAddFavorite.window.setVisible(false); 628 } 629 return true; 630 } 631 }; 632 633 634 635 636 GralUserAction actionSaveFavoritePathes = new GralUserAction("") 637 { @Override public boolean userActionGui(int key, GralWidget infos, Object... params) 638 { writeCfg(fileCfg); 639 return true; 640 } }; 641 642 643 GralUserAction actionReadFavoritePathes = new GralUserAction("") 644 { @Override public boolean exec(int key, GralWidget_ifc widg, Object... params) { 645 readCfg(fileCfg); 646 panelLeft.fillCards(); 647 panelMid.fillCards(); 648 panelRight.fillCards(); 649 return true; 650 } }; 651 652 653 654 /**Sort action. Note that the sort action is contained in the {@link GralFileSelector} 655 * already. But this sort action is available from menu of the Fcmd too. It is some different. 656 */ 657 GralUserAction actionSortFilePerNameCase = new GralUserAction("") 658 { @Override public boolean userActionGui(int key, GralWidget infos, Object... params) { 659 setSortOrderFiles(GralFileSelector.kSortName); 660 return true; 661 } }; 662 663 664 665 666 GralUserAction actionSortFilePerNameNonCase = new GralUserAction("") 667 { @Override public boolean userActionGui(int key, GralWidget infos, Object... params) { 668 setSortOrderFiles(GralFileSelector.kSortNameNonCase); 669 return true; 670 } }; 671 672 673 674 675 GralUserAction actionSortFilePerExtensionCase = new GralUserAction("") 676 { @Override public boolean userActionGui(int key, GralWidget infos, Object... params) { 677 setSortOrderFiles(GralFileSelector.kSortExtension); 678 return true; 679 } }; 680 681 682 GralUserAction actionSortFilePerExtensionNonCase = new GralUserAction("") 683 { @Override public boolean userActionGui(int key, GralWidget infos, Object... params) { 684 setSortOrderFiles(GralFileSelector.kSortExtensionNonCase); 685 return true; 686 } }; 687 688 689 690 691 692 GralUserAction actionSortFilePerTimestamp = new GralUserAction("") 693 { @Override public boolean userActionGui(int key, GralWidget infos, Object... params) { 694 setSortOrderFiles(GralFileSelector.kSortDateNewest); 695 return true; 696 } }; 697 698 699 700 701 GralUserAction actionSortFilePerTimestampOldestFirst = new GralUserAction("") 702 { @Override public boolean userActionGui(int key, GralWidget infos, Object... params) { 703 setSortOrderFiles(GralFileSelector.kSortDateOldest); 704 return true; 705 } }; 706 707 708 709 710 711 712 GralUserAction actionSortFilePerLenghLargestFirst = new GralUserAction("") 713 { @Override public boolean userActionGui(int key, GralWidget infos, Object... params) { 714 setSortOrderFiles(GralFileSelector.kSortSizeLargest); 715 return true; 716 } }; 717 718 719 720 721 GralUserAction actionSortFilePerLenghSmallestFirst = new GralUserAction("") 722 { @Override public boolean userActionGui(int key, GralWidget infos, Object... params) { 723 setSortOrderFiles(GralFileSelector.kSortSizeSmallest); 724 return true; 725 } }; 726 727 728 729 GralUserAction actionDeselectDirtree = new GralUserAction("actionDeselectDirtree") 730 { @Override public boolean exec(int key, GralWidget_ifc widgi, Object... params) { 731 FcmdFileCard fileCard = main.getLastSelectedFileCard(); 732 FileRemote[] lastFiles = main.getLastSelectedFiles(true, 1); 733 //if(fileCard !=null){ 734 if(lastFiles[0] !=null){ 735 FileCluster fc = lastFiles[0].itsCluster; 736 String sStartDir = lastFiles[0].getCanonicalPath(); 737 ListIterator<FileRemote> it = fc.listSubdirs(sStartDir); 738 while(it.hasNext()){ 739 FileRemote dir1 = it.next(); 740 if(!dir1.getCanonicalPath().startsWith(sStartDir)) { break; } 741 it.remove(); 742 } 743 lastFiles[0].resetMarkedRecurs(0xffffffff, null); 744 main.refreshFilePanel(lastFiles[0].getParentFile()); 745 //fileCard.f //TODO refresh 746 } 747 return true; 748 } }; 749 750 751 752 753 GralUserAction actionCleanFileRemote = new GralUserAction("actionCleanFileRemote") 754 { @Override public boolean exec(int key, GralWidget_ifc widgi, Object... params) { 755 FcmdFileCard fileCard = main.getLastSelectedFileCard(); 756 FileRemote[] lastFiles = main.getLastSelectedFiles(true, 1); 757 //if(fileCard !=null){ 758 if(lastFiles[0] !=null){ 759 FileCluster fc = lastFiles[0].itsCluster; 760 String sStartDir = lastFiles[0].getCanonicalPath(); 761 ListIterator<FileRemote> it = fc.listSubdirs(sStartDir); 762 while(it.hasNext()){ 763 FileRemote dir1 = it.next(); 764 if(!dir1.getCanonicalPath().startsWith(sStartDir)) { break; } 765 it.remove(); 766 } 767 lastFiles[0].resetMarkedRecurs(0xffffffff, null); 768 lastFiles[0].cleanChildren(); 769 main.refreshFilePanel(lastFiles[0].getParentFile()); 770 //fileCard.f //TODO refresh 771 } 772 return true; 773 } }; 774 775 776 777 778}