001package org.vishia.commander; 002 003import java.io.File; 004import java.util.LinkedList; 005import java.util.List; 006import java.util.Map; 007import java.util.TreeMap; 008 009import org.vishia.fileRemote.FileRemote; 010import org.vishia.gral.base.GralPanelContent; 011import org.vishia.gral.base.GralTabbedPanel; 012import org.vishia.gral.base.GralWidget; 013import org.vishia.gral.base.GralMng; 014import org.vishia.gral.ifc.GralMngBuild_ifc; 015import org.vishia.gral.ifc.GralTableLine_ifc; 016import org.vishia.gral.ifc.GralUserAction; 017import org.vishia.gral.widget.GralSelectList; 018import org.vishia.mainCmd.MainCmd; 019import org.vishia.util.Assert; 020import org.vishia.util.KeyCode; 021 022/**Data for one panel left, middle or right. 023 * It contains the tab-card for the favor folder selection. 024 */ 025public class FcmdLeftMidRightPanel 026{ 027 028 /**Version and history 029 * <ul> 030 * <li>2012-01-08 Hartmut the extra class FcmdFavorTabCard is now an inner class here because 031 * it needs some elements shared with this outer class. 032 * <li>2011-11-00 Hartmut creation 033 * </ul> 034 */ 035 public static final int version = 0x20120113; 036 037 final Fcmd main; 038 039 /**The container for all tabs of this TabbedPanel. It is a {@link GralPanelContent} of the primaryWindow 040 * associated to one of the frame areas of the GralArea9_ifc. */ 041 GralTabbedPanel tabbedPanelFileCards; 042 043 /**The container for the tabs for selection. 044 * It is the first {@link GralPanelContent} inside the {@link #tabbedPanelFileCards} designated with "a-F1" etc. 045 */ 046 GralTabbedPanel tabbedPanelFavorCards; 047 048 /**Table widget for the select table.*/ 049 FcmdFavorThemeCard cardFavorThemes; 050 051 /**List of all Tabs of this Panel, used and unused. This tabs are presented in the {@link FcmdFavorThemeCard} table*/ 052 List<FcmdFileCard> listTabs = new LinkedList<FcmdFileCard>(); 053 054 /**The current opened file card. */ 055 FcmdFileCard actFileCard; 056 057 /**If the favor card is in foreground, it contains true. If the file card is in foreground, it contains false. 058 * The information will be set in the select line methods of the table. 059 */ 060 boolean bFavorCardHasFocus = true; 061 062 boolean bFavorThemeCardHasFocus= true; 063 064 //final FcmdFavorPathSelector.FavorFolder actFavorFolder; 065 066 /**Stores the current directory for all actual file panels. */ 067 final Map<String, String> indexActualDir = new TreeMap<String, String>(); 068 069 /**File panel. */ 070 //FcmdFileTable fileSelectorMain; 071 072 //String actualDir; 073 074 /**Characteristic char for the panel: l, m, r*/ 075 final char cc; 076 077 /**Characteristic number for the panel: 1, 2, 3 */ 078 final char cNr; 079 080 /**Index of panel 0, 1, 2. */ 081 final int ixMainPanel; 082 083 084 /**The order number of the panel in order of usage. 085 * 1 = actual focused panel, 2 = last focused, 3 = third focused, 0 = no file panel. */ 086 int orderMainPanel; 087 088 //final int[] widthSelecttableMain = new int[]{6, 20, 30}; 089 090 final int[] widthSelecttableSub = new int[]{2, 20, 30}; 091 092 093 FcmdLeftMidRightPanel(Fcmd javaCmd, char cc, char cNr, GralMng mng){ 094 this.main = javaCmd; 095 this.cc = cc; 096 this.cNr = cNr; 097 this.ixMainPanel = cNr - '1'; 098 cardFavorThemes = new FcmdFavorThemeCard(main, FcmdWidgetNames.tableFavoritesMain + cNr, this); 099 100 } 101 102 103 104 /**Build the initial content of one of the three tabbed panels, called in the build phase of the GUI. 105 * @param which Number 1 2 3 for left, mid, right 106 */ 107 void buildInitialTabs() 108 { 109 GralMng mng = main._gralMng; 110 String sName = "Sel" + cNr; 111 //inside the left/mid/right tabbed panel: create the panel which contains a tabbed panel for selection 112 String nameGridPanel = FcmdWidgetNames.tabFavoritesLeftMidRight + cNr; 113 String tabLabelGridPanel = "a-F"+cNr; 114 mng.setPosition(tabbedPanelFileCards.pos(), 0, 0, 0, 0, 1, 'd'); 115 tabbedPanelFileCards.addGridPanel(nameGridPanel, tabLabelGridPanel,1,1,10,10); 116 mng.setPosition(0, 0, 0, -0, 1, 'd'); 117 //A tabbed panel inside the left, middle or right tab for selection. 118 String nameTabPanel = FcmdWidgetNames.panelFavoritesLeftMidRight + cNr; 119 mng.setPosition(tabbedPanelFileCards.pos(), 0, 0, 0, 0, 1, 'd'); 120 tabbedPanelFavorCards = mng.addTabbedPanel(nameTabPanel, null, GralMngBuild_ifc.propZoomedPanel); 121 //The panel for selection from all favorites: 122 nameGridPanel = FcmdWidgetNames.tabMainFavorites + cNr; 123 tabLabelGridPanel = "a-F"+cNr; 124 mng.setPosition(tabbedPanelFavorCards.pos(), 0, 0, 0, 0, 1, 'd'); 125 tabbedPanelFavorCards.addGridPanel(nameGridPanel, tabLabelGridPanel, 1,1,10,10); 126 mng.setPosition(0, 0, 0, -0, 1, 'd'); //inside the new tab 127 cardFavorThemes.createImplWidget_Gthread(); 128 fillCards(); //build the rest of all tabs and panels depending on content of favorites. 129 130 if(cNr == '1'){ //commands only in the left panel. 131 tabbedPanelFileCards.addGridPanel("cmd", "Cmd",1,1,10,10); 132 mng.setPosition(2, -2, 0, -0, 1, 'd'); 133 main.executer.cmdSelector.createImplWidget_Gthread(); 134 } 135 136 } 137 138 139 void setFocus(){ 140 main.setLastSelectedPanel(this); 141 if(actFileCard !=null){ 142 actFileCard.setFocusFavorOrFile(); 143 } else { 144 cardFavorThemes.setFocus(); 145 } 146 } 147 148 149 150 /** 151 * @param which Number 1 2 3 for left, mid, right 152 */ 153 void fillCards(){ 154 155 cardFavorThemes.clear(); //the common favor path table. 156 //clear index of entries, it is a mirror of content of the GUI-visible table and prevents 157 //twice adding. 158 cardFavorThemes.indexFavorFolders.clear(); 159 //clear all GUI tables of this main tab. 160 for(FcmdFileCard fileTabs: listTabs){ 161 fileTabs.favorCard.clear(); 162 fileTabs.favorCard.indexFavorPaths.clear(); 163 } 164 //insert from left, from right etc. with the panels as first elements in the list: 165 final FcmdLeftMidRightPanel favorFolderFrom1, favorFolderFrom2; 166 final String from1, from2; 167 switch(cc){ 168 case 'l':{ 169 favorFolderFrom1 = main.favorPathSelector.panelMid; 170 favorFolderFrom2 = main.favorPathSelector.panelRight; 171 from1 = "from mid"; from2 = "from right"; 172 } break; 173 case 'm':{ 174 favorFolderFrom1 = main.favorPathSelector.panelLeft; 175 favorFolderFrom2 = main.favorPathSelector.panelRight; 176 from1 = "from left"; from2 = "from rigth"; 177 } break; 178 case 'r':{ 179 favorFolderFrom1 = main.favorPathSelector.panelLeft; 180 favorFolderFrom2 = main.favorPathSelector.panelMid; 181 from1 = "from left"; from2 = "from mid"; 182 } break; 183 default: favorFolderFrom1 = favorFolderFrom2 = null; 184 from1 = from2 = null; 185 } 186 final String[] cells = new String[2]; 187 cells[0] = ""; 188 cells[1] = from1; 189 cardFavorThemes.wdgdTable.addLine(null, cells, favorFolderFrom1); 190 cells[1] = from2; 191 cardFavorThemes.wdgdTable.addLine(null, cells, favorFolderFrom2); 192 193 //List of favor pathes for this main panel 194 for(FcmdFavorPathSelector.FavorFolder favorFolder: main.favorPathSelector.listAllFavorPathFolders){ //panel specific favorites 195 int mMainTab = 0x1 << (cNr-'1'); //1, 2 or 4 196 if((favorFolder.mMainPanel & mMainTab) !=0 && favorFolder.label !=null && favorFolder.label.length() >0){ 197 //create Panels for the file table and favor path table if not found yet, otherwise search it. 198 FcmdFileCard fileTab = searchOrCreateFileCard(favorFolder.label); 199 //Favor select list of the associated File table 200 fileTab.favorCard.fillFavorPaths(favorFolder); 201 } else { 202 //The fileTable may be existend, then 203 FcmdFileCard fileTab = searchFileCard(favorFolder.label); 204 if(fileTab !=null && fileTab.label.equals(favorFolder.label)){ 205 fileTab.favorCard.fillFavorPaths(favorFolder); 206 } 207 } 208 cardFavorThemes.addFavorFolder(favorFolder); 209 //tabSelector.initActDir(indexActualDir, info.selectName, info.path); 210 211 } 212 } 213 214 215 216 FcmdFileCard searchOrCreateFileCard(String label){ 217 //search or create the tab 218 FcmdFileCard fileCard = null; 219 String labelTab = label + "." + cNr; 220 for(FcmdFileCard item: listTabs){ 221 if(item.nameFilePanel.equals(labelTab)){ 222 fileCard = item; break; 223 } 224 } 225 if(fileCard == null){ 226 fileCard = new FcmdFileCard(this, label); 227 listTabs.add(fileCard); 228 } 229 return fileCard; 230 } 231 232 233 234 FcmdFileCard searchFileCard(String label){ 235 //search or create the tab 236 FcmdFileCard fileCard = null; 237 String labelTab = label + "." + cNr; 238 for(FcmdFileCard item: listTabs){ 239 if(item.nameFilePanel.equals(labelTab)){ 240 fileCard = item; break; 241 } 242 } 243 return fileCard; 244 } 245 246 247 void checkRefresh(long since){ 248 if(actFileCard !=null) actFileCard.checkRefresh(since); 249 } 250 251 252 @Override public String toString(){ return "panel " + cc; } 253 254 255 boolean focusLeftCard(){ 256 FcmdFileCard fileTableLeft = null; 257 boolean found = false; 258 for(FcmdFileCard fileTable: listTabs){ 259 if(fileTable == actFileCard){ found = true; break;} 260 fileTableLeft = fileTable; //save this table as table left, use if found. 261 } 262 if(found){ 263 if(fileTableLeft !=null){ 264 actFileCard = fileTableLeft; 265 fileTableLeft.setFocusFavorOrFile(); 266 } else { //left from first is the selectAllTable of this panel. 267 cardFavorThemes.setFocus(); 268 } 269 } 270 return true; 271 } 272 273 274 boolean focusRightCard(){ 275 //sets focus to right 276 FcmdFileCard fileTableRight = null; 277 boolean found = bFavorThemeCardHasFocus; //true if the left card is focused. 278 for(FcmdFileCard fileTable: listTabs){ 279 if(found){ fileTableRight = fileTable; break; } //use this next table if found before. 280 if(fileTable == actFileCard) { found = true; } 281 } 282 if(fileTableRight !=null){ 283 actFileCard = fileTableRight; 284 fileTableRight.setFocusFavorOrFile(); 285 } else { 286 //remain the last 287 } 288 return true; 289 } 290 291 292 293 static class FcmdFavorThemeCard extends GralSelectList 294 { 295 296 private final FcmdLeftMidRightPanel mainPanel; 297 298 /**Index of all entries in the visible list. */ 299 Map<String, FcmdFavorPathSelector.FavorFolder> indexFavorFolders = new TreeMap<String, FcmdFavorPathSelector.FavorFolder>(); 300 301 //final int[] widthSelecttableMain = new int[]{10, 30}; 302 303 public FcmdFavorThemeCard(Fcmd main, String name, FcmdLeftMidRightPanel panel) 304 { //super(name, mng); 305 super(name, 20, new int[]{10, 30}, 'C'); 306 307 mainPanel = panel; 308 } 309 310 311 312 @Override 313 public void createImplWidget_Gthread(){ 314 super.createImplWidget_Gthread(); 315 wdgdTable.specifyActionOnLineSelected(actionFavorThemeLineSelected); 316 wdgdTable.setHtmlHelp(mainPanel.main.cargs.dirHtmlHelp + "/Fcmd.html#Topic.FcmdHelp.favorpath.tabSelect."); 317 } 318 319 /**Adds a line to this table. 320 * @param ix Show which index is used for a local table, 0..2 for left, mid, right, 321 * than show the label in the left cell (column) 322 * @param favorTabInfo The favorite info 323 */ 324 void addFavorFolder(FcmdFavorPathSelector.FavorFolder favorTabInfo) 325 { 326 if(indexFavorFolders.get(favorTabInfo.label) == null){ 327 indexFavorFolders.put(favorTabInfo.label, favorTabInfo); 328 String[] cells = new String[2]; 329 cells[0] = favorTabInfo.label; 330 cells[1] = favorTabInfo.selectNameTab; 331 GralTableLine_ifc line = wdgdTable.addLine(null, cells, favorTabInfo); 332 //line.setUserData(favorTabInfo); 333 //line.setCellText(favorTabInfo.label, 0); 334 //line.setCellText(favorTabInfo.selectNameTab, 1); 335 line.repaint(100, 0); 336 } 337 } 338 339 340 @Override public boolean setFocus(){ 341 mainPanel.bFavorThemeCardHasFocus = true; 342 return super.setFocus(); 343 } 344 345 void clear() 346 { 347 wdgdTable.clearTable(); 348 } 349 350 351 @Override protected boolean actionOk(Object userData, GralTableLine_ifc line) 352 { 353 FcmdFavorPathSelector.FavorFolder favorTabInfo = null; 354 final String label; 355 final FileRemote currentDir; 356 Object oLineData = line.getUserData(); 357 if(oLineData instanceof FcmdFavorPathSelector.FavorFolder){ 358 favorTabInfo = (FcmdFavorPathSelector.FavorFolder)line.getUserData(); 359 label = favorTabInfo.label; //from favorite list 360 //label is known in the favorite list, use it. The panel should be existing or it is created. 361 //search or create the tab, representing by its fileTable: 362 mainPanel.actFileCard = mainPanel.searchOrCreateFileCard(label); 363 //before changing the content of this fileTable, store the current directory 364 //to restore if this favor respectively selection is used ones more. 365 if(mainPanel.actFileCard.favorPathInfo !=null){ 366 currentDir = mainPanel.actFileCard.getCurrentDir(); //.getAbsolutePath(); 367 } else { 368 //nothing selected, its a new tab. Don't show files. 369 currentDir = null; 370 //FcmdFavorPathSelector.FavorPath favorPathInfo = favorTabInfo.listfavorPaths.get(0); 371 //actFileCard.favorPathInfo = favorPathInfo; 372 //currentDir = favorPathInfo.getOriginDir(); 373 } 374 } else { 375 //it have to be a: 376 final FcmdLeftMidRightPanel panel = (FcmdLeftMidRightPanel)oLineData; //from left, from mid etc 377 final FcmdFileCard fileCard = panel.actFileCard; //the current filecard in the other panel 378 label = fileCard.label; 379 mainPanel.actFileCard = mainPanel.searchOrCreateFileCard(label); //search or create such filecard with this label here. 380 mainPanel.actFileCard.favorPathInfo = fileCard.favorPathInfo; //copy it, it is the same instance for all 3 panels. 381 //mainPanel.actFileCard.currentFile = fileCard.currentFile(); //select the same file. 382 mainPanel.actFileCard.fillIn(fileCard.currentDir(), false); //select the same file. 383 currentDir = fileCard.getCurrentDir(); //.getAbsolutePath(); 384 if(mainPanel.actFileCard == null){ 385 Assert.check(false); 386 } 387 //search the proper FavorFolder for the label. 388 //Note it isn't stored in the file card yet though the file card is associated to the label. 389 for(FcmdFavorPathSelector.FavorFolder folder: mainPanel.main.favorPathSelector.listAllFavorPathFolders){ 390 if(folder.label.equals(label)){ 391 favorTabInfo = folder; 392 break; //found. 393 } 394 } 395 Assert.check(favorTabInfo != null); 396 } 397 398 //adds all favorite pathes to it newly. 399 mainPanel.actFileCard.favorCard.fillFavorPaths(favorTabInfo); 400 if(currentDir !=null){ 401 mainPanel.indexActualDir.put(mainPanel.actFileCard.favorPathInfo.selectName, currentDir.getPath()); 402 mainPanel.actFileCard.fillIn(currentDir, false); 403 mainPanel.actFileCard.setFocus(); 404 } else { 405 mainPanel.actFileCard.favorCard.setFocus(); 406 } 407 return true; 408 } 409 410 @Override 411 protected void actionLeft(Object userData, GralTableLine_ifc line) 412 { 413 // TODO Auto-generated method stub 414 415 } 416 417 @Override 418 protected void actionRight(Object userData, GralTableLine_ifc line) 419 { 420 // TODO Auto-generated method stub 421 422 } 423 424 /**Handle the keys for the JavaCommander-Selection of favorites 425 * <ul> 426 * <li>sh-F1 .. shF3: activates fileSelector for left, middle and right panel. 427 * </ul> 428 * @see org.vishia.gral.widget.GralSelectList#actionUserKey(int, java.lang.Object, org.vishia.gral.ifc.GralTableLine_ifc) 429 */ 430 @Override protected boolean actionUserKey(int key, Object userData, GralTableLine_ifc line) 431 { boolean ret = true; 432 ret = false; 433 return ret; 434 } 435 436 /**Action is called any time if a line was focused in the favor theme table. */ 437 GralUserAction actionFavorThemeLineSelected = new GralUserAction("actionFavorThemeLineSelected"){ 438 @Override public boolean userActionGui(int actionCode, GralWidget widgd, Object... params) { 439 if(actionCode == KeyCode.userSelect){ 440 mainPanel.bFavorThemeCardHasFocus = true; 441 //GralTableLine_ifc line = (GralTableLine_ifc) params[0]; 442 //Object oData = line.getUserData(); 443 //System.out.println("FcmdFavorCard.actionFavorSelected: " + fileTable.label); 444 } 445 return true; 446 } 447 }; 448 449 450 451 } 452 453 454 455}