001package org.vishia.guiBzr; 002 003import java.io.File; 004 005import org.vishia.gral.base.GralPanelContent; 006import org.vishia.gral.base.GralTable; 007import org.vishia.gral.base.GralWidget; 008import org.vishia.gral.base.GralWindow; 009import org.vishia.gral.ifc.GralMngBuild_ifc; 010import org.vishia.gral.ifc.GralMng_ifc; 011import org.vishia.gral.ifc.GralWindow_ifc; 012import org.vishia.gral.ifc.GralUserAction; 013import org.vishia.gral.ifc.GralTableLine_ifc; 014import org.vishia.gral.widget.GralSwitchExclusiveButtonMng; 015import org.vishia.util.FileSystem; 016import org.vishia.util.KeyCode; 017 018/**This class contains all data and methods of the status (select) panel. 019 * 020 * @author Hartmut Schorrig 021 * 022 */ 023public class GuiStatusPanel 024{ 025 026 private static class SelectInfoBoxWidgds 027 { 028 final GralPanelContent box; 029 final DataCmpn data; 030 GralWidget widgdTextRevision, widgdTextStatus; 031 032 SelectInfoBoxWidgds(GralPanelContent box, DataCmpn data) 033 { this.box = box; this.data = data; } 034 035 } 036 037 /**Aggregation to the main data of the GUI. */ 038 final MainData mainData; 039 040 /**Aggregation to the build interface of the manager where the panel is member of. */ 041 final GralMngBuild_ifc panelBuildifc; 042 043 044 /**Widget to select the project path. 045 * The project is a user-project which contains one or more source archive-sandboxes. 046 * 047 * */ 048 GralWidget widgdProjektpath; 049 050 051 /**A Panel which contains the table to select some projectPaths. */ 052 private GralWindow selectorProjectPath; 053 054 /**The table (list) which contains the selectable project paths. */ 055 private GralTable selectorProjectPathTable; 056 057 058 /**Any component has its PanelManager. It is one line with some widgets. 059 */ 060 private final GralPanelContent[] bzrComponentBox = new GralPanelContent[100]; 061 062 private GralWindow_ifc testDialogBox; 063 064 065 /**Instance for some buttons to exclude switch on only for one button. 066 * GUI-concept: This is an alternative to TODO 067 * 068 */ 069 private GralSwitchExclusiveButtonMng switchExcluder; 070 071 /**Save the switchButtons to remove it when the widget is removed. */ 072 private GralWidget[] switchButtons; 073 074 075 public GuiStatusPanel(MainData mainData, GralMngBuild_ifc panelBuildifc) 076 { 077 this.panelBuildifc = panelBuildifc; 078 this.mainData = mainData; 079 } 080 081 /**Initializes the graphic. 082 * It will be called in the GUI-Thread. 083 */ 084 void initGui() 085 { int xposProjectPath = 0, yposProjectPath=5; 086 087 panelBuildifc.selectPanel("Select-old"); 088 panelBuildifc.setPositionSize(yposProjectPath, xposProjectPath, -3, 70, 'r'); 089 //widgdProjektpath = panelBuildifc.addTextField("projectPath", true, "Project path", 't'); 090 widgdProjektpath = panelBuildifc.addFileSelectField("projectPath", null, "D:/:/", "Project path", "t"); 091 panelBuildifc.setPositionSize(-1, -1, -2, 2, 'r'); 092 panelBuildifc.addButton("selectProjectPath", selectProjectPath, "c", "f", "?"); 093 /// 094 //WidgetDescriptor widgdRefresh = new WidgetDescriptor("refresh", 'B'); 095 //widgdRefresh.setAction(refreshProjectBzrComponents); 096 panelBuildifc.setPositionSize(-1, -1, -3, 10, 'r'); 097 panelBuildifc.addButton("Brefresh", refreshProjectBzrComponents, "c", "d", "Get/Refresh"); 098 099 String[] lines = {"1", "2"}; 100 101 //testDialogBox = panelBuildifc.createInfoBox( "Title", lines, true); 102 //testDialogBox = new InfoBox(mainData.guifc.getitsGraphicFrame(), "Title", lines, true); 103 104 panelBuildifc.setPositionSize(yposProjectPath, xposProjectPath, 20, 60, 'r'); 105 selectorProjectPath = panelBuildifc.createWindow("sel", null, GralWindow.windConcurrently); 106 int[] columnWidths = {40, 10}; 107 panelBuildifc.setPositionSize(0, 0, 10, 60, 'd'); 108 selectorProjectPathTable = panelBuildifc.addTable("selectProjectPath", 20, columnWidths); 109 selectorProjectPathTable.setActionChange(actionSelectorProjectPathTable); 110 panelBuildifc.setPositionSize(20, 0, -3, 10, 'r'); 111 panelBuildifc.addButton("closeProjectBzrComponents", actionCloseProjectBzrComponents, "ok"); 112 String sPrjPath = null; 113 for(String sPrjPath1: mainData.cfg.listSwPrjs){ 114 if(sPrjPath ==null){ sPrjPath = sPrjPath1; } //The first is offered. 115 GralTableLine_ifc<Object> line = selectorProjectPathTable.insertLine(sPrjPath1, 0, null, null); 116 line.setCellText(sPrjPath1, 0); 117 } 118 if(sPrjPath==null){ 119 sPrjPath = "??no project directories found."; 120 } 121 //Test only in one Project 122 widgdProjektpath.setValue(GralMng_ifc.cmdInsert, 0,sPrjPath); 123 mainData.currPrj = new DataProject(FileSystem.absolutePath(sPrjPath, null)); 124 125 } 126 127 128 /**Removes all existing GUI-container for selection and info of the components. 129 * It is called if a new project is selected. 130 */ 131 private void cleanComponentsInfoSelectBoxes() 132 { 133 if(bzrComponentBox !=null){ 134 panelBuildifc.selectPanel("Select"); 135 for(int ii=0; ii< bzrComponentBox.length; ++ii){ 136 GralPanelContent item = bzrComponentBox[ii]; 137 if(item !=null){ 138 bzrComponentBox[ii] = null; 139 panelBuildifc.remove(item); 140 } 141 } 142 } 143 } 144 145 146 /**Builds all select and info GUI-components for all source-components of the given project. 147 * 148 */ 149 private void buildComponentsInfoSelectBoxes() 150 { 151 String sProjectPath = widgdProjektpath.getValue(); 152 sProjectPath = "d:/Bzr/D/vishia"; 153 // 154 mainData.getterStatus.getBzrLocations(FileSystem.absolutePath(sProjectPath, null)); 155 // 156 cleanComponentsInfoSelectBoxes(); 157 switchExcluder = new GralSwitchExclusiveButtonMng(); 158 switchButtons = new GralWidget[mainData.currPrj.data.length]; 159 // 160 //Only one of the switch buttons are checked. If another button is pressed, it should be deselect. 161 //The switchExcluder helps to do so. 162 //It contains a special method, which captures the text of the last pressed switch button. 163 for(int ixCmpn = 0; ixCmpn < mainData.currPrj.data.length; ++ixCmpn){ 164 createComponentsInfoSelectBox(ixCmpn); 165 } 166 } 167 168 169 170 private void createComponentsInfoSelectBox(int iComponent) 171 { int yPosComponents = 10 + 2* iComponent; 172 if(bzrComponentBox[iComponent]!=null){ 173 panelBuildifc.remove(bzrComponentBox[iComponent]); 174 } 175 DataCmpn data = mainData.currPrj.data[iComponent]; 176 String sName = data.getBzrLocationDir().getName(); 177 String sNamePanel = "BzrStatusSelect-"+sName; 178 panelBuildifc.selectPanel("Select"); 179 panelBuildifc.setPositionSize(yPosComponents, 1, 2, 70, 'r'); 180 GralPanelContent box; 181 bzrComponentBox[iComponent] = box = panelBuildifc.createCompositeBox(sNamePanel); 182 SelectInfoBoxWidgds widgds = new SelectInfoBoxWidgds(box,data); 183 panelBuildifc.selectPanel(sNamePanel); 184 panelBuildifc.setPositionSize(0, 0, 2, 2, 'r'); 185 if(switchButtons[iComponent] !=null){ 186 switchExcluder.remove(switchButtons[iComponent]); 187 } 188 GralWidget widgdButton = panelBuildifc.addSwitchButton("selectMain", actionSelectCmpn, "", data.sNameCmpn, "", "wh", "rd"); 189 switchExcluder.add(widgdButton); 190 widgdButton.setContentInfo(widgds); 191 switchButtons[iComponent] = widgdButton; 192 panelBuildifc.setPositionSize(0, 6, 2, 15, 'r'); 193 panelBuildifc.addText(sName, 'B', 0); 194 widgds.widgdTextRevision = panelBuildifc.addText("Rev. unknown", 'B', 0x808080); 195 widgds.widgdTextStatus = panelBuildifc.addText("- select it", 'B', 0x808080); 196 197 } 198 199 200 private void setInfoWidgetsInSelectBox(SelectInfoBoxWidgds widgds) 201 { 202 panelBuildifc.selectPanel(widgds.box.name); 203 panelBuildifc.remove(widgds.widgdTextRevision); 204 panelBuildifc.remove(widgds.widgdTextStatus); 205 panelBuildifc.setPositionSize(0, 21, 2, 15, 'r'); 206 String sRev = "Rev. "; 207 if(widgds.data.revisionWorkingTreeTop.nr == widgds.data.revisionSbox.nr){ 208 sRev = "Rev. " + widgds.data.revisionSbox.nr + " uptodate "; 209 } else { 210 sRev = "Rev. " + widgds.data.revisionSbox.nr + " / "+ widgds.data.revisionWorkingTreeTop.nr; 211 } 212 widgds.widgdTextRevision = panelBuildifc.addText(sRev, 'B', 0x0); 213 String sBzrStatus = widgds.data.uBzrStatusOutput.toString(); 214 boolean isModified = sBzrStatus.indexOf("modified:") >=0; 215 boolean hasNew = sBzrStatus.indexOf("non-versioned:") >=0; 216 if(isModified){ 217 //bzrComponentBox[iComponent].setPosition(0, 40, 2, 10, 'r'); 218 widgds.widgdTextStatus = panelBuildifc.addText("- modified", 'B', 0xff0000); 219 } else if(hasNew){ 220 //bzrComponentBox[iComponent].setPosition(0, 40, 2, 10, 'r'); 221 widgds.widgdTextStatus = panelBuildifc.addText("- new Files", 'B', 0xff0000); 222 } else { 223 widgds.widgdTextStatus = panelBuildifc.addText("- no changes", 'B', 0x00ff00); 224 } 225 panelBuildifc.repaintCurrentPanel(); 226 } 227 228 229 230 private final GralUserAction selectProjectPath = new GralUserAction() 231 { 232 @Override public boolean userActionGui(int key, GralWidget widgetInfos, Object... values) 233 { 234 //testDialogBox.open(); 235 selectorProjectPath.setWindowVisible(true); 236 return true; 237 } 238 }; 239 240 241 242 /**Action if a line is confirmed. 243 * If a line is confirmed, the path is set to {@link #widgdProjektpath}. 244 * If the top line is leaved, the table will be closed. 245 * 246 */ 247 private final GralUserAction actionSelectorProjectPathTable = new GralUserAction() 248 { 249 @Override 250 public boolean userActionGui(int key, GralWidget widgetInfos, Object... values) 251 { boolean bDone = true; 252 if(key == KeyCode.enter){ 253 GralTableLine_ifc line = (GralTableLine_ifc)values[0]; 254 String sPath = line.getCellText(0); 255 widgdProjektpath.setValue(GralMng_ifc.cmdInsert, 0, sPath); 256 buildComponentsInfoSelectBoxes(); 257 selectorProjectPath.setWindowVisible(false); 258 } else { bDone = false; } 259 return bDone; 260 } 261 }; 262 263 264 private final GralUserAction actionCloseProjectBzrComponents = new GralUserAction() 265 { 266 @Override 267 public boolean userActionGui(int key, GralWidget widgetInfos, Object... values) 268 { 269 selectorProjectPath.setWindowVisible(false); 270 return true; 271 } 272 }; 273 274 275 private final GralUserAction refreshProjectBzrComponents = new GralUserAction() 276 { 277 @Override 278 public boolean userActionGui(int key, GralWidget widgetInfos, Object... values) 279 { buildComponentsInfoSelectBoxes(); 280 return true; 281 } 282 }; 283 284 285 286 private final GralUserAction actionSelectCmpn = new GralUserAction() 287 { 288 @Override 289 public boolean userActionGui(int key, GralWidget widgd, Object... values) 290 { 291 mainData.currCmpn = mainData.currPrj.selectComponent(widgd.getDataPath()); 292 // 293 //gets the status of the components archive in the GUI-action, 294 //because the appearance of the GUI should be updated: 295 mainData.getterStatus.captureStatus(mainData.currCmpn); 296 // 297 //Build the GUI widgets for this project new: 298 //it is an example for dynamic GUI appearance. 299 //Here it may be possible too to set only other information to the given widgets. 300 SelectInfoBoxWidgds widgds = (SelectInfoBoxWidgds)widgd.getContentInfo(); 301 setInfoWidgetsInSelectBox(widgds); 302 // 303 //Gets all information about files in background. 304 //It is necessary in another panel (Files & Diff). 305 mainData.addOrderBackground(mainData.mainAction.initNewComponent); 306 307 //call the exclusion of the other button: 308 switchExcluder.switchAction.userActionGui(key, widgd, values); 309 return true; 310 } 311 }; 312 313 314 void stop(){} 315}