001package org.vishia.guiBzr; 002 003import java.io.File; 004import java.util.ArrayList; 005import java.util.LinkedList; 006import java.util.List; 007 008import org.vishia.gral.base.GralTable; 009import org.vishia.gral.base.GralWidget; 010import org.vishia.gral.ifc.GralButtonKeyMenu; 011import org.vishia.gral.ifc.GralMngBuild_ifc; 012import org.vishia.gral.ifc.GralTableLine_ifc; 013import org.vishia.gral.ifc.GralUserAction; 014import org.vishia.gral.ifc.GralWidget_ifc; 015import org.vishia.util.FileSystem; 016import org.vishia.util.KeyCode; 017import org.vishia.util.StringFormatter; 018import org.vishia.util.FileSystem.FileAndBasePath; 019 020/**The panel which contains a table to select SVM archive locations 021 * @author Hartmut Schorrig 022 * @since 2013.03-29 023 * 024 */ 025public class GuiSelectPanel 026{ 027 028 String sWorkingTreeBaseDir = "D:/Bzr/D"; 029 030 String sArchiveTreeBaseDir = "D:/Bzr/Archive"; 031 032 String sRemoteArchiveTreeBaseDir = "A:/Bzr/Archive"; 033 034 StringFormatter formatter = new StringFormatter(); 035 036 /**TODO only private local using here, it should be a part of DataProject. 037 * 038 */ 039 //List<File> listBzrDirs = new LinkedList<File>(); 040 041 List<FileAndBasePath> listBzrDirs = new ArrayList<FileAndBasePath>(); 042 043 044 /**Aggregation to the main data of the GUI. */ 045 final MainData mainData; 046 047 /**Aggregation to the build interface of the manager where the panel is member of. */ 048 final GralMngBuild_ifc mng; 049 050 GralTable tableSelect; 051 052 /**Widget to select the project path. 053 * The project is a user-project which contains one or more source archive-sandboxes. 054 * 055 * */ 056 GralWidget widgdProjektpath; 057 058 public GuiSelectPanel(MainData mainData, GralMngBuild_ifc panelBuildifc) 059 { 060 this.mng = panelBuildifc; 061 this.mainData = mainData; 062 } 063 064 065 /**Initializes the graphic. 066 * It will be called in the GUI-Thread. 067 */ 068 void initGui(){ 069 mng.selectPanel("Select"); 070 mng.setPosition(0,2,0,30,0,'r',0); 071 mng.addText("Component"); 072 mng.addText("Working Tree"); 073 mng.addText("Archive Tree"); 074 mng.addText("Remote Tree"); 075 mng.setPosition(2,-3,0,0,0,'.',0); 076 int[] columns = {30,30,30,30}; 077 tableSelect = mng.addTable("selectTable", 100, columns); 078 tableSelect.specifyActionOnLineSelected(actionOnSelectedLine); 079 mng.setPosition(-3,0,0,9,0,'.',1); 080 // 081 String fnkey = "cleanSelectTable"; 082 GralButtonKeyMenu fn = mainData.panels.idents.get(fnkey); 083 mng.addButton(fnkey+"-button", fn.action, fn.buttontext); 084 // 085 fnkey = "statusCmpn"; 086 fn = mainData.panels.idents.get(fnkey); 087 mng.addButton(fnkey+"-button", fn.action, fn.buttontext); 088 // 089 fnkey = "revertAll"; 090 fn = mainData.panels.idents.get(fnkey); 091 mng.addButton(fnkey+"-button", fn.action, fn.buttontext); 092 } 093 094 095 096 /**Searches all locations of source-archives in the current project folder and all sub folders. 097 * A project means a software project with some sources consisting of some Components with its own archives. 098 * @calls {@link #captureStatus(DataCmpn)} for all found software-archives. 099 * @param sProjectPath Path to the project folder. 100 * 101 */ 102 void getBzrLocations() 103 { 104 listBzrDirs.clear(); 105 try{ 106 File baseDirAllCmpn = new File(sWorkingTreeBaseDir); 107 FileSystem.addFilesWithBasePath(baseDirAllCmpn, "/**/.bzr", listBzrDirs); 108 //FileSystem.addFileToList(sWorkingTreeBaseDir + "/**/.bzr", listBzrDirs); 109 } catch(Exception exc){ 110 111 } 112 int zCmpn = listBzrDirs.size(); 113 mainData.currPrj.init(zCmpn); 114 //int ixCmpn = 0; 115 tableSelect.clearTable(); 116 File dirBaseArchive = new File(sArchiveTreeBaseDir); 117 File dirBaseRemoteArchive = new File(sRemoteArchiveTreeBaseDir); 118 if(!dirBaseRemoteArchive.exists()){ 119 dirBaseRemoteArchive = null; 120 } 121 for(FileAndBasePath entrylist: listBzrDirs){ 122 File fileBzr = entrylist.file; 123 File dirArchive = new File(dirBaseArchive, entrylist.localPath); 124 File dirRemoteArchive = dirBaseRemoteArchive == null ? null : new File(dirBaseRemoteArchive, entrylist.localPath); 125 File dirWorkingTree = fileBzr.getParentFile(); 126 String nameCmpn = dirWorkingTree.getName(); 127 String[] cellTexts = new String[4]; 128 cellTexts[0] = entrylist.localPath; 129 cellTexts[1] = "?"; 130 cellTexts[2] = "?"; 131 cellTexts[3] = "?"; 132 DataCmpn dataCmpn = new DataCmpn(dirWorkingTree, dirArchive, dirRemoteArchive); 133 tableSelect.addLine(nameCmpn, cellTexts, dataCmpn); 134 } 135 } 136 137 138 139 140 141 142 143 144 GralUserAction actionRefreshSelectTable = new GralUserAction("actionRefreshSelection"){ 145 @Override public boolean exec(int actionCode, GralWidget_ifc widgi, Object... oArgs){ 146 if(KeyCode.isControlFunctionMouseUpOrMenu(actionCode)){ 147 getBzrLocations(); 148 } 149 return true; 150 } 151 }; 152 153 154 155 /**Gets the status for the Component of the actual line, refresh the line. */ 156 GralUserAction actionGetStatus = new GralUserAction("actionGetStatus"){ 157 @Override public boolean exec(int actionCode, GralWidget_ifc widgi, Object... oArgs){ 158 if(KeyCode.isControlFunctionMouseUpOrMenu(actionCode)){ 159 if(mainData.currTableline !=null){ 160 mainData.getterStatus.captureStatusAllArchives(mainData.currCmpn); 161 162 formatter.reset(); 163 String sDate = formatter.convertTimestampToday(mainData.currCmpn.revisionWorkingTreeTop.date); 164 if(mainData.currCmpn.revisionWorkingTreeTop.nr !=null){ 165 formatter.add(sDate).add(": rev=").add(mainData.currCmpn.revisionWorkingTreeTop.nr); 166 } else { 167 formatter.add("not found"); 168 } 169 mainData.currTableline.setCellText(formatter.getContent(), 1); 170 171 formatter.reset(); 172 if(mainData.currCmpn.revisionArchive.nr !=null){ 173 sDate = formatter.convertTimestampToday(mainData.currCmpn.revisionArchive.date); 174 formatter.add(sDate).add(": rev=").add(mainData.currCmpn.revisionArchive.nr); 175 mainData.currTableline.setCellText(formatter.getContent(), 2); 176 } else { 177 mainData.currTableline.setCellText("not available", 2); 178 } 179 180 if(mainData.currCmpn.dirRemoteArchive !=null){ 181 formatter.reset(); 182 sDate = formatter.convertTimestampToday(mainData.currCmpn.revisionRemoteArchive.date); 183 formatter.add(sDate).add(": rev=").add(mainData.currCmpn.revisionRemoteArchive.nr); 184 mainData.currTableline.setCellText(formatter.getContent(), 3); 185 } else { 186 mainData.currTableline.setCellText("not available", 3); 187 } 188 } 189 return true; 190 } else return false; 191 } 192 }; 193 194 195 196 GralUserAction actionOnSelectedLine = new GralUserAction("actionRefreshSelectCmpn"){ 197 @Override public boolean exec(int actionCode, GralWidget_ifc widgi, Object... oArgs){ 198 assert(oArgs.length >=1 && oArgs[0] instanceof GralTableLine_ifc); 199 mainData.currTableline = (GralTableLine_ifc)oArgs[0]; 200 mainData.currCmpn = (DataCmpn)mainData.currTableline.getUserData(); 201 return true; 202 } 203 }; 204 205 206}