001package org.vishia.commander; 002 003import java.io.File; 004 005import org.vishia.fileRemote.FileRemote; 006import org.vishia.gral.base.GralMenu; 007import org.vishia.gral.base.GralPanelContent; 008import org.vishia.gral.base.GralWidget; 009import org.vishia.gral.base.GralMng; 010import org.vishia.gral.ifc.GralColor; 011import org.vishia.gral.ifc.GralTableLine_ifc; 012import org.vishia.gral.ifc.GralTextField_ifc; 013import org.vishia.gral.ifc.GralUserAction; 014import org.vishia.gral.ifc.GralWidget_ifc; 015import org.vishia.gral.widget.GralFileSelector; 016import org.vishia.gral.widget.GralHorizontalSelector; 017import org.vishia.util.Assert; 018import org.vishia.util.FileCompare; 019import org.vishia.util.KeyCode; 020 021/**This is one file table in the the.File.commander. Each main panel (left, middle, right) 022 * has maybe more as one tabs, each tab has exactly one file table. The file table is reused 023 * for the several tabs of the main panel, and they are reused too if the directory is changed. 024 * <br><br> 025 * <b>Synchronization of 2 file cards</b>:<br> 026 * If the synchronization is switch on with {@link FcmdFavorPathSelector#bSyncMidRight} then 027 * {@link #syncWithSecondPanel(String)} is called with the filename. Therewith the same file 028 * in the second panel (middle or right) will be selected if it exists. If an existing directory 029 * is selected, the other file card follows it if it exists. So the user can walk through two file trees 030 * which have the same structure, but maybe some different content. It is proper for comparison. 031 * <br><br> 032 * <br><br> 033 * 034 * @author Hartmut Schorrig 035 * 036 */ 037public class FcmdFileCard extends GralFileSelector 038{ 039 /**Version, history and license 040 * <ul> 041 * <li>2012-03-09 Hartmut new: Now the synchronization between 2 panels works independent of 042 * the comparison with a improved algorithm. 043 * <li>2012-02-04 Hartmut new: {@link #searchCompareResult(File)} supports working with 044 * comparison result, used to set equal if a file was copied. 045 * </ul> 046 * 047 * 048 * <b>Copyright/Copyleft</b>: 049 * For this source the LGPL Lesser General Public License, 050 * published by the Free Software Foundation is valid. 051 * It means: 052 * <ol> 053 * <li> You can use this source without any restriction for any desired purpose. 054 * <li> You can redistribute copies of this source to everybody. 055 * <li> Every user of this source, also the user of redistribute copies 056 * with or without payment, must accept this license for further using. 057 * <li> But the LPGL ist not appropriate for a whole software product, 058 * if this source is only a part of them. It means, the user 059 * must publish this part of source, 060 * but don't need to publish the whole source of the own product. 061 * <li> You can study and modify (improve) this source 062 * for own using or for redistribution, but you have to license the 063 * modified sources likewise under this LGPL Lesser General Public License. 064 * You mustn't delete this Copyright/Copyleft inscription in this source file. 065 * </ol> 066 * If you are intent to use this sources without publishing its usage, you can get 067 * a second license subscribing a special contract with the author. 068 * 069 * @author Hartmut Schorrig = hartmut.schorrig@vishia.de 070 * 071 * 072 */ 073 @SuppressWarnings("hiding") 074 public static final int version = 0x20120626; 075 076 /**Table widget for the select table of the file tab.*/ 077 FcmdFavorCard favorCard; 078 079 /**The component */ 080 final Fcmd main; 081 082 /**The left, mid or right main panel where this tabbed file table is associated. */ 083 final FcmdLeftMidRightPanel mainPanel; 084 085 GralColor[] colorSelectFocused123 = new GralColor[3]; 086 087 /**The organization unit for this FileSelector. */ 088 //final LeftMidRightPanel.FileTabs fileTabs; 089 090 /**The search-name of the tabbed file panel where this Table is placed on. 091 * It is the visible label of the tab, following by ".1" till ".3" for the three panels. */ 092 final String nameFilePanel; 093 094 /**The label which is written in the line of favor file after l:label m:label r:label 095 * It is the label on the tab. 096 */ 097 final String label; 098 099 //final GralTextField_ifc widgLabel; /// 100 101 final GralHorizontalSelector<Object> wdgCardSelector; 102 103 /**Association to the current used favor path selection. 104 * Note that this instance is re-used for more as one selection. 105 */ 106 FcmdFavorPathSelector.FavorPath favorPathInfo; 107 108 /**The last selected file and its directory. */ 109 //FileRemote currentFile, currentDir; 110 111 /**If not null, then should synchronize with this file card. Used in */ 112 FcmdFileCard otherFileCardtoSync; 113 114 115 /**If not null, then it is the base dir for synchronization with the {@link #otherFileCardtoSync}. 116 * It will be set in {@link FcmdFilesCp#setDirs()}. */ 117 String sDirSync; 118 119 /**length of sDirSync or -1 120 * It will be set in {@link FcmdFilesCp#setDirs()}. */ 121 int zDirSync; 122 123 String sLocalpath, sLocaldir; 124 125 126 /**Creates the cards with tabs for the files and for the favorite paths. 127 * This ctor will be called in the graphic thread. Therefore it can initialize the graphic 128 * for the fileCard and for the associated favor card in this code. 129 * @param mainPanelP The left, mid or right panel where this cards are assigned to 130 * @param label The label of the tab, it builds the name of all widgets. 131 */ 132 FcmdFileCard(FcmdLeftMidRightPanel mainPanelP, String label){ 133 super(null, 50, new int[]{2,0,-6,-12}, null); 134 this.label = label; 135 this.main = mainPanelP.main; 136 this.mainPanel = mainPanelP; 137 this.nameFilePanel = label+ "." + mainPanelP.cNr; 138 this.colorSelectFocused123[0] = GralColor.getColor("lgn"); 139 this.colorSelectFocused123[1] = GralColor.getColor("lbl"); 140 this.colorSelectFocused123[2] = GralColor.getColor("lgr"); 141 String namePanelFile = FcmdWidgetNames.tableFile + nameFilePanel; 142 143 this.setNameWidget(namePanelFile); 144 main.idxFileSelector.put(namePanelFile, this); //it is WidgetNames.tableFile + label +.123, see super(...) 145 GralMng mng = main._gralMng; 146 // 147 //The favorite paths card 148 String nameTableSelection = FcmdWidgetNames.tableFavorites + nameFilePanel; 149 favorCard = new FcmdFavorCard(main, nameTableSelection, this, mainPanel); 150 GralPanelContent panelFavors = mainPanel.tabbedPanelFavorCards.addGridPanel(FcmdWidgetNames.tabFavorites + nameFilePanel, label,1,1,10,10); 151 mng.setPosition(0, 0, 0, -0, 1, 'd'); 152 favorCard.createImplWidget_Gthread(); 153 favorCard.wdgdTable.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.favorpath.favorSelect."); 154 panelFavors.setPrimaryWidget(favorCard.wdgdTable); 155 // 156 //The files card 157 GralPanelContent panelFiles = mainPanel.tabbedPanelFileCards.addGridPanel(FcmdWidgetNames.tabFile + nameFilePanel, label,1,1,10,10); 158 //to show the properties of the selected file in the info line: 159 // 160 //sets this Widget to the selected panel, it is the grid panel which was created even yet. 161 /* 162 mng.setPosition(0, 2, 0, 20, 1, 'd'); 163 String nameWidgLabel = FcmdWidgetNames.labelWidgFile + nameFilePanel; 164 widgLabel = mng.addTextField(nameWidgLabel, false, null, null); 165 */ 166 mng.setPosition(0, 2, 0, 0, 1, 'd'); 167 wdgCardSelector = new GralHorizontalSelector<Object>("cards", actionSetFromTabSelection); 168 wdgCardSelector.setToPanel(mng); 169 //mng.addHorizontalSelector(wdgCardSelector); 170 171 mng.setPosition(2, 0, 0, 0, 1, 'd'); 172 //set the base class GralFileSelector to the panel. It contains the path and the table for file selection. 173 setToPanel(mng); 174 //GralPos.Coordinate[] columns = new GralPos.Coordinate[4]; 175 //Sets the columns for the table. 176 //super.selectList.wdgdTable.setColumnWidth(50, new int[]{2,0,-6,-11}); 177 super.selectList.wdgdTable.setHtmlHelp(main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.fileSelect."); 178 GralMenu menuFolder = super.widgdPathDir.getContextMenu(); 179 menuFolder.addMenuItem("contextfolder-setOrigin", main.idents.menuContextSetOriginDir, main.favorPathSelector.actionSetDirOrigin); 180 menuFolder.addMenuItem("menuContextCreateFavor", main.idents.menuContextCreateFavor, main.favorPathSelector.actionCreateFavor); 181 menuFolder.addMenuItem("context-filescp", main.idents.menuFilesCpContext, main.filesCp.actionConfirmCp); 182 menuFolder.addMenuItem("contextfolder-create", main.idents.menuConfirmMkDirFileContext, main.mkCmd.actionOpenDialog); 183 menuFolder.addMenuItem("contextfolder-search", main.idents.menuContextSearchFiles, main.favorPathSelector.actionSearchFiles); 184 menuFolder.addMenuItem("contextfolder-refresh", main.idents.menuFileNaviRefreshContext, main.favorPathSelector.actionRefreshFileTable); 185 panelFiles.setPrimaryWidget(super.selectList.wdgdTable); 186 // 187 //sets the action for a simple table: what to do on line selected: Show file names. 188 this.specifyActionOnFileSelected(actionOnFileSelection); 189 selectList.wdgdTable.setActionFocused(actionFocused); 190 //Note: some menu entries are set in the super class already. 191 selectList.wdgdTable.addContextMenuEntryGthread(1, "test", main.idents.menuFilePropsContext, main.filePropsCmd.actionOpenDialog); 192 selectList.wdgdTable.addContextMenuEntryGthread(1, "test", main.idents.menuFileViewContext, main.viewCmd.actionOpenView); 193 selectList.wdgdTable.addContextMenuEntryGthread(1, "test", main.idents.menuContextEditIntern, main.editWind.actionOpenEdit); 194 selectList.wdgdTable.addContextMenuEntryGthread(1, "test", main.idents.menuFileEditContext, main.actionEdit); 195 selectList.wdgdTable.addContextMenuEntryGthread(1, "test", main.idents.menuConfirmCopyContext, main.copyCmd.actionConfirmCopy); 196 selectList.wdgdTable.addContextMenuEntryGthread(1, "test", main.idents.menuConfirmFileDelContext, main.deleteCmd.actionConfirmDelete); 197 selectList.wdgdTable.addContextMenuEntryGthread(1, "test", main.idents.menuExecuteContext, main.executer.actionExecuteFileByExtension); 198 selectList.wdgdTable.addContextMenuEntryGthread(1, "test", main.idents.menuExecuteCmdContext, main.executer.cmdSelector.actionExecCmdWithFiles); 199 //selectList.wdgdTable.addContextMenuEntryGthread(1, "deSelDir", main.idents.deselectRecursFiles.menuContext, main.favorPathSelector.actionDeselectDirtree); 200 favorCard.wdgdTable.specifyActionOnLineSelected(favorCard.actionFavorSelected); 201 // 202 //sets the action for Select a file: open the execute menu 203 setActionOnEnterFile(main.executer.actionOnEnterFile); 204 setActionSetFileLineAttrib(actionSetFileLineAttrib); 205 } 206 207 208 private void buildGraphic(){ 209 //see ctor 210 } 211 212 213 /**Sets a new content for this file table because another favor or tab is selected 214 * @param favorPathInfoP 215 * @param dir 216 * @param mode 0 no tab, 1 -temporary tab, 2 - new tab 217 */ 218 void setNewContent(FcmdFavorPathSelector.FavorPath favorPathInfoP, FileRemote dir){ 219 favorPathInfo = favorPathInfoP; 220 if(favorCard == null){ 221 System.err.println("FcmdFileCard.setNewContent - favorCard is null; " + favorPathInfo); 222 } else { 223 favorCard.add(favorPathInfo); //only it is a new one, it will be checked. 224 setOriginDir(favorPathInfo.getOriginDir()); 225 //widgLabel.setText(favorPathInfo.selectName); 226 fillIn(dir, false); 227 setFocus(); 228 } 229 } 230 231 void setFocusFavorOrFile(){ 232 if(mainPanel.bFavorCardHasFocus){ 233 favorCard.setFocus(); 234 } else { 235 this.setFocus(); 236 } 237 } 238 239 240 241 242 /**Overrides the {@link GralFileSelector#setFocus()} and calls him, before that sets the color 243 * of the current line of table of all 3 current file panels to the 3-stage color 244 * to see which table has the focus. 245 */ 246 @Override public void setFocus(){ 247 mainPanel.bFavorCardHasFocus = false; 248 mainPanel.bFavorThemeCardHasFocus = false; 249 setActFilePanel_setColorCurrLine(); 250 super.setFocus(); 251 } 252 253 254 255 256 257 /**Removes this file card with its widgets and data. It is 'close tab'. */ 258 @Override public boolean remove(){ 259 if(favorCard !=null) { 260 favorCard.remove(); 261 } 262 favorCard = null; 263 favorPathInfo = null; 264 return super.remove(); 265 } 266 267 268 269 /**Searches whether the given file has a comparison result in this file card. 270 * That method is used to present the file in the table with comparison result information 271 * and to change the comparison result if the file was copied. 272 * @param file The file, usual selected in the file table 273 * @return null a comparison result is not existed, elsewhere the result. 274 */ 275 FileCompare.Result searchCompareResult(File file){ 276 /// 277 final FileCompare.Result result; 278 if(sDirSync !=null){ 279 zDirSync = sDirSync.length(); 280 String sPath = file.getAbsolutePath(); 281 if(sPath.startsWith(sDirSync) && sPath.length() > zDirSync){ 282 String sLocalPath = sPath.substring(sDirSync.length()+1); 283 result = main.filesCp.idxFilepath4Result.get(sLocalPath); 284 } else { 285 result = null; //outside of sDirSync 286 } 287 } else { 288 zDirSync = -1; 289 result = null; //no comparison active 290 } 291 return result; 292 } 293 294 295 296 297 @Override public boolean actionUserKey(int keyCode, Object oData, GralTableLine_ifc line) 298 { boolean ret = true; 299 //FileRemote data = (FileRemote)oData; 300 switch(keyCode){ 301 //case KeyCode.alt + KeyCode.F + '7': FileSystem.searchInFiles(new File[]{data}, "ordersBackground"); break; 302 default: ret = false; 303 } 304 /* 305 if (keyCode == main.keyActions.keyCreateFavorite){ 306 main.favorPathSelector.windAddFavorite.panelInvocation = mainPanel; 307 main.favorPathSelector.windAddFavorite.widgLabel.setText(nameFilePanel); 308 main.favorPathSelector.windAddFavorite.widgShortName.setText("alias"); 309 FileRemote lastSelectedFile = getSelectedFile(); 310 //String pathDir = FileSystem.getCanonicalPath(lastSelectedFile.getParentFile()); 311 main.favorPathSelector.windAddFavorite.widgPath.setText(lastSelectedFile.getParent()); 312 main.favorPathSelector.windAddFavorite.window.setWindowVisible(true); 313 } else*/ 314 if (keyCode == main.keyActions.keyPanelSelection){ 315 //focuses the panel which is the selection panel for this file table. 316 GralWidget tableSelection = main._gralMng.getWidget(FcmdWidgetNames.tableFavorites + nameFilePanel); 317 tableSelection.setFocus(); 318 /* 319 } else if (keyCode == main.keyActions.keyPanelLeft){ 320 //sets focus to left 321 FcmdFileCard fileTableLeft = null; 322 boolean found = false; 323 for(FcmdFileCard fileTable: mainPanel.listTabs){ 324 if(fileTable == this){ found = true; break;} 325 fileTableLeft = fileTable; //save this table as table left, use if found. 326 } 327 if(found){ 328 if(fileTableLeft !=null){ 329 fileTableLeft.setFocus(); 330 } else { //left from first is the selectAllTable of this panel. 331 //panel.selectTableAll.wdgdTable.setFocus(); 332 } 333 } 334 } else if (keyCode == main.keyActions.keyPanelRight){ 335 //sets focus to right 336 FcmdFileCard fileTableRight = null; 337 boolean found = false; //(mainPanel.selectTableAll == this); 338 for(FcmdFileCard fileTable: mainPanel.listTabs){ 339 if(found){ fileTableRight = fileTable; break; } //use this next table if found before. 340 if(fileTable == this) { found = true; } 341 } 342 if(fileTableRight !=null){ 343 fileTableRight.setFocus(); 344 } 345 346 } else if (keyCode == main.keyActions.keyMainPanelLeft){ 347 FcmdLeftMidRightPanel dstPanel = mainPanel == main.favorPathSelector.panelRight ? 348 main.favorPathSelector.panelMid : main.favorPathSelector.panelLeft; 349 if(dstPanel.actFileCard !=null){ dstPanel.actFileCard.setFocus(); } 350 } else if (keyCode == main.keyActions.keyMainPanelRight){ 351 FcmdLeftMidRightPanel dstPanel = mainPanel == main.favorPathSelector.panelLeft ? 352 main.favorPathSelector.panelMid : main.favorPathSelector.panelRight; 353 if(dstPanel.actFileCard !=null){ dstPanel.actFileCard.setFocus(); } 354 */ 355 } else { 356 ret = false; 357 } 358 return ret; 359 } 360 361 362 363 /**This routine is invoked from {@link #actionOnFileSelection} action listener whenever a file in any file card 364 * will be selected (key up, down, mouse click etc.). 365 * The routine writes infos about the file and may synchronize with another file card. 366 * @param file The currently selected file. 367 * @param sFileName Text in the cell, especially ".." for the parent dir entry. 368 */ 369 protected void actionOnFileSelection(FileRemote file, String sFileName){ 370 //note the file, able to use for some actions. 371 main.selectedFiles123[mainPanel.ixMainPanel] = file; 372 373 if(mainPanel.orderMainPanel == 1){ 374 //only if it is the focused panel: 375 //note the file card in order of usage. 376 377 main.lastFavorCard = favorCard; 378 main.currentFileCard = this; 379 mainPanel.actFileCard = this; 380 main.statusLine.setFileInfo(file); 381 382 String sPath = file.getAbsolutePath(); 383 if( main.favorPathSelector.bSyncMidRight 384 && mainPanel.actFileCard == this //from actFileCard to the second one! 385 && mainPanel.orderMainPanel == 1 386 ){ 387 try{ syncWithSecondPanel(sFileName); } 388 catch(Exception exc){ 389 CharSequence msg = Assert.exceptionInfo("Fcmd.actionOnFileSelection.syncWithSecondPanel() - exception, ", exc, 0, 20); 390 System.out.append(msg); 391 } 392 System.out.println("FcmdFileCard - syncWithSecondPanel; " + toString()); 393 } 394 /* 395 else { 396 397 boolean bSync = main.filesCp.widgSyncWalk.isOn() 398 && sDirSync !=null && sPath.length() >= zDirSync; 399 if(bSync){ 400 sLocalpath = sPath.substring(zDirSync); 401 String sDir = getCurrentDirPath(); 402 bSync = sDir.length() >= zDirSync; 403 if(bSync){ 404 sLocaldir = sDir.substring(zDirSync); 405 String sDirOtherSet = otherFileCardtoSync.sDirSync + sLocaldir; 406 String sDirOtherAct = otherFileCardtoSync.getCurrentDirPath(); 407 if(!sDirOtherSet.equals(sDirOtherAct)){ 408 //bSync = false; 409 otherFileCardtoSync.fillIn(new FileRemote(sDirOtherSet)); 410 } 411 String fileName = file.getName(); 412 if(fileName.endsWith(".~1~")){ 413 fileName = fileName.substring(0, fileName.length() -4); 414 } 415 otherFileCardtoSync.selectFile(fileName); 416 } 417 } 418 } 419 */ 420 } 421 } 422 423 424 425 void syncWithSecondPanel(String sFileName){ 426 //String fileName = currentFile.getName(); 427 System.out.println("FcmdFileCard -SyncWithSecondPanel;" + mainPanel.cc + ";" + sFileName); 428 FcmdFileCard otherFileCard; 429 boolean bFillInReq = false; 430 if(mainPanel.cc == 'm'){ otherFileCard = main.favorPathSelector.panelRight.actFileCard; } 431 else if(mainPanel.cc == 'r'){ otherFileCard = main.favorPathSelector.panelMid.actFileCard; } 432 else if(mainPanel.cc == 'l'){ otherFileCard = main.favorPathSelector.panelMid.actFileCard; } 433 else { otherFileCard = null; } 434 if(otherFileCard !=null){ //NOTE: though mid and right is selected, the otherFileCard may be null because no tab is open. 435 String sDirName = getCurrentDir().getName(); 436 //check whether the other file card contains a entry with this directory name 437 GralTableLine_ifc<FileRemote> line = otherFileCard.selectList.wdgdTable.getLine(sDirName); 438 if(line !=null){ 439 FileRemote dir = line.getUserData(); 440 bFillInReq = true; 441 otherFileCard.fillIn(dir, false); //use that directory. 442 } 443 boolean bSameFile = otherFileCard.selectFile(sFileName); //".." also 444 if(!bSameFile){ 445 //check whether the file is a directory and it is the directory of the other panel: 446 boolean bToRoot = false; 447 if(currentFile.isDirectory()){ 448 FileRemote otherDir = otherFileCard.getCurrentDir(); 449 if(otherDir != null){ 450 String sDirPath = otherDir.getName(); 451 bToRoot = sDirPath.equals(sFileName); 452 if(bToRoot){ 453 //the directory of other is the current selected dir of this: 454 FileRemote otherParent = otherDir.getParentFile(); 455 if(!bFillInReq){ 456 otherFileCard.fillIn(otherParent, false); 457 otherFileCard.selectFile(sFileName); 458 bFillInReq = true; 459 } 460 } 461 } 462 } 463 if(!bToRoot && otherFileCard !=null && otherFileCard.currentFile !=null){ 464 //check whether a sub dir is selected: 465 String sOtherSelectedFile = otherFileCard.currentFile.getName(); 466 if(sOtherSelectedFile.equals(sDirName) && !bFillInReq){ 467 otherFileCard.fillIn(otherFileCard.currentFile,false); 468 otherFileCard.selectFile(sFileName); 469 } 470 } 471 } 472 } 473 474 } 475 476 477 478 479 /**Sets the panel which contains this File card as actual, adjust the order of actual file panels 480 * and sets the color of the current line of table of all 3 current file panels to the 3-stage color 481 * to see which table has the focus. 482 * Sets {@link Fcmd#lastFavorCard}, {@link FcmdLeftMidRightPanel#actFileCard}, 483 * {@link Fcmd#lastFilePanels}. 484 */ 485 private void setActFilePanel_setColorCurrLine(){ 486 main.lastFavorCard = favorCard; 487 main.currentFileCard = this; 488 mainPanel.actFileCard = FcmdFileCard.this; 489 main.setLastSelectedPanel(mainPanel); 490 System.out.println(Assert.stackInfo("FcmdFileCard - setActFilePanel_setColorLine;",10)); 491 int ixMainPanel = -1; 492 for(FcmdLeftMidRightPanel panel: main.lastFilePanels){ 493 if(ixMainPanel >=2) { 494 break; 495 } 496 if(panel.actFileCard !=null){ 497 panel.actFileCard.selectList.wdgdTable.setColorBackSelectedLine(colorSelectFocused123[++ixMainPanel]); 498 panel.orderMainPanel = ixMainPanel +1; //order in list 1, 2, 3 499 } else { 500 panel.orderMainPanel = 0; //not used. 501 } 502 } 503 } 504 505 506 /**Action to show the file properties in the info line. This action is called anytime if a line 507 * was changed in the file view table. */ 508 GralUserAction actionOnFileSelection = new GralUserAction("FcmdFileCard-actionOnFileSelection"){ 509 /**The action called from {@link GralTable}. 510 * @param params [0] is the Table line. The content of table cells are known here, 511 * because it is the file table itself. The {@link GralTableLine_ifc#getUserData()} 512 * returns the {@link FileRemote} file Object. 513 * @see org.vishia.gral.ifc.GralUserAction#userActionGui(int, org.vishia.gral.base.GralWidget, java.lang.Object[]) 514 */ 515 @Override public boolean userActionGui(int actionCode, GralWidget widgd, Object... params) { 516 mainPanel.bFavorCardHasFocus = false; 517 mainPanel.bFavorThemeCardHasFocus = false; 518 GralTableLine_ifc line = (GralTableLine_ifc) params[0]; 519 String sFileCell = line.getCellText(GralFileSelector.kColFilename); 520 Object oData = line.getUserData(); 521 if(oData instanceof File){ 522 actionOnFileSelection((FileRemote)oData, sFileCell); 523 } 524 return true; 525 } 526 }; 527 528 529 /**Sets the color of the table line adequate to the select state of the file. */ 530 GralUserAction actionSetFileLineAttrib = new GralUserAction("actionSetFileLineAttrib"){ 531 /**@param params [0] the table line. It contains the file. 532 * @see org.vishia.gral.ifc.GralUserAction#exec(int, org.vishia.gral.ifc.GralWidget_ifc, java.lang.Object[]) 533 */ 534 @Override public boolean exec(int actionCode, GralWidget_ifc widgd, Object... params) { 535 //check whether any of the 2 compare directories are base for the current file: 536 try{ 537 GralTableLine_ifc line = (GralTableLine_ifc)(params[0]); 538 File file = (File)line.getUserData(); 539 if(file instanceof FileRemote){ 540 if(file.getName().equals("exe")) 541 Assert.stop(); 542 if(file.getName().equals("Fcmd.jar")) 543 Assert.stop(); 544 FileRemote file2 = (FileRemote)file; 545 int flags = file2.getFlags(); 546 if(file2.isMarked(0xffff)){ 547 line.setMarked(1, null); 548 //line.setBackColor(GralColor.getColor("pbl"), 1); 549 line.setLineColor(GralColor.getColor("rd"), 1); 550 } else { 551 //line.setBackColor(GralColor.getColor("wh"), 1); 552 line.setLineColor(GralColor.getColor("bk"), 1); 553 } 554 } 555 FileCompare.Result result = searchCompareResult(file); 556 if(result !=null){ 557 if(!result.equal){ line.setCellText("#", 0); } 558 else if(result.alone){ line.setCellText("+", 0); } 559 else if(result.missingFiles){ line.setCellText("-", 0); } 560 } 561 } catch(Exception exc){ 562 main._gralMng.log.sendMsg(0, "Exception in FcmdFileCard.actionSetFileLineAttrib"); 563 } 564 return true; 565 } }; 566 567 568 /**This action is bound in the File selection table. If it is focused, the current file tables 569 * of the other file panels will gotten the {@link #colorSelectNonFocused} to show that are not 570 * the first one. The file table of this is set with the {@link #colorSelectFocused}. 571 * Twice the {@link Fcmd#lastFilePanels} list is ordered with this panel as first one. 572 * 573 */ 574 GralUserAction actionFocused = new GralUserAction("actionFocused"){ 575 @SuppressWarnings("synthetic-access") @Override public boolean userActionGui(int actionCode, GralWidget widgd, Object... params) { 576 if(actionCode == KeyCode.focusGained){ 577 setActFilePanel_setColorCurrLine(); 578 } 579 return true; 580 } }; 581 582 583 GralUserAction actionSetFromTabSelection = new GralUserAction("actionSetFromTabSelection"){ 584 @Override public boolean exec(int actionCode, GralWidget_ifc widgd, Object... params) { 585 FcmdFavorPathSelector.FavorPath favorPathNew = (FcmdFavorPathSelector.FavorPath)params[0]; 586 //before changing the content of this fileTable, store the current directory 587 //to restore if this favor respectively selection is used ones more. 588 FileRemote dir = null; 589 String sCurrentDir; 590 if(favorPathInfo !=null){ 591 dir = getCurrentDir(); 592 if(dir != null){ 593 sCurrentDir = dir.getAbsolutePath(); 594 if(sCurrentDir !=null){ 595 mainPanel.indexActualDir.put(favorPathInfo.selectName, sCurrentDir); 596 } } } 597 main.favorPathSelector.actFavorPathInfo = favorPathNew; //The last used selection (independent of tab left, middle, right) 598 if(favorPathNew == null){ 599 //TODO clear filecard 600 } else { 601 sCurrentDir = mainPanel.indexActualDir.get(favorPathNew.selectName); 602 if(sCurrentDir == null){ 603 sCurrentDir = favorPathNew.path; 604 } 605 //dir = new FileRemote(currentDir); 606 dir = main.fileCluster.getFile(sCurrentDir, null); 607 FcmdFileCard.this.setNewContent(favorPathNew, dir); 608 } 609 return true; 610 } }; 611 612 613 614 @Override public String toString(){ return label + "/" + nameFilePanel; } 615 616 617}