001package org.vishia.gral.cfg; 002 003import java.text.ParseException; 004 005import org.vishia.gral.base.GralMng; 006import org.vishia.gral.base.GralPos; 007import org.vishia.gral.cfg.GralCfgData.GuiCfgButton; 008import org.vishia.gral.cfg.GralCfgData.GuiCfgCurveview; 009import org.vishia.gral.cfg.GralCfgData.GuiCfgImage; 010import org.vishia.gral.cfg.GralCfgData.GuiCfgInputFile; 011import org.vishia.gral.cfg.GralCfgData.GuiCfgLed; 012import org.vishia.gral.cfg.GralCfgData.GuiCfgLine; 013import org.vishia.gral.cfg.GralCfgData.GuiCfgShowField; 014import org.vishia.gral.cfg.GralCfgData.GuiCfgTable; 015import org.vishia.gral.cfg.GralCfgData.GuiCfgText; 016import org.vishia.gral.cfg.GralCfgData.GuiCfgWidget; 017import org.vishia.gral.ifc.GralMngBuild_ifc; 018import org.vishia.gral.ifc.GralWidgetCfg_ifc; 019 020 021/**ZBNF: Element::= ... ; 022 * Class for instance to capture and store one element. Any widget type is an Element. 023 * The distinction between different types are given with the {@link #itsCfgData}. 024 * <pre> 025 * 026 * 027 * 028 * */ 029public class GralCfgElement implements Cloneable, GralWidgetCfg_ifc 030{ 031 /**Version and history 032 * <ul> 033 * <li>2012-04-22 Hartmut chg {@link #setPos(GralMngBuild_ifc)} moved from {@link GralCfgBuilder#buildWidget(GralCfgElement)} 034 * <li>2012-04-22 Hartmut new {@link #new_ValueBar()} 035 * <li>2011-05-00 Hartmut created, the old ZbnfCfg.. class is obsolte now. 036 * </ul> 037 * 038 * <b>Copyright/Copyleft</b>:<br> 039 * For this source the LGPL Lesser General Public License, 040 * published by the Free Software Foundation is valid. 041 * It means: 042 * <ol> 043 * <li> You can use this source without any restriction for any desired purpose. 044 * <li> You can redistribute copies of this source to everybody. 045 * <li> Every user of this source, also the user of redistribute copies 046 * with or without payment, must accept this license for further using. 047 * <li> But the LPGL is not appropriate for a whole software product, 048 * if this source is only a part of them. It means, the user 049 * must publish this part of source, 050 * but doesn't need to publish the whole source of the own product. 051 * <li> You can study and modify (improve) this source 052 * for own using or for redistribution, but you have to license the 053 * modified sources likewise under this LGPL Lesser General Public License. 054 * You mustn't delete this Copyright/Copyleft inscription in this source file. 055 * </ol> 056 * If you intent to use this source without publishing its usage, you can get 057 * a second license subscribing a special contract with the author. 058 * 059 * @author Hartmut Schorrig = hartmut.schorrig@vishia.de 060 */ 061 public static final int version = 20120422; 062 063 /**The previous element is necessary because non complete coordinates are resolved with previous. 064 * The next element is need to build a queue in order of the text. */ 065 GralCfgElement previous, next; 066 067 //final GralCfgData itsCfgData; 068 069 070 /**The content is set in textual form too. It is because [<?Element>...] was written */ 071 String content; 072 073 /**The position is set in textual form too. It is because [<?Element>...] was written */ 074 String positionString; 075 076 /**ZBNF: Position coordinates will be filled from [<?position>.... 077 * The instance contains only that position data, which are found in the textual config file. 078 * It is important to rewrite only that data, which are contained in the originally one. */ 079 final GralCfgPosition positionInput = new GralCfgPosition(); 080 081 /**This obj contains all position data. Missed position data in the {@link #positionInput} 082 * are completed by knowledge of the position of the previous elements. 083 * The position is filled only in {@link #setPos(GralMngBuild_ifc)} and used nearly only temporary 084 * */ 085 private final GralCfgPosition position = new GralCfgPosition(); 086 087 //private final GralPos posInput = new GralPos(); 088 089 GuiCfgWidget widgetType; 090 091 GralCfgElement() //GralCfgData itsCfgData) 092 { //this.itsCfgData = itsCfgData; 093 } 094 095 @Override 096 public GralCfgElement clone(){ 097 GralCfgElement newObj = new GralCfgElement(); //this.itsCfgData); 098 newObj.widgetType = widgetType.clone(); ///use a new cloned instance (use data). 099 newObj.positionInput.set(this.positionInput); 100 /*NOTE: don't use super.clone() because it copies the references to final elements. We need cloned new elements 101 GralCfgElement newObj = null; 102 try{ newObj = (GralCfgElement)super.clone(); 103 newObj.position = new GralCfgPosition(); //use a new empty instance in cloned object, empty data. 104 newObj.positionInput = positionInput.clone(); ///use a new cloned instance (use data). 105 newObj.widgetType = widgetType.clone(); ///use a new cloned instance (use data). 106 } catch(CloneNotSupportedException exc){ assert(false); } 107 */ 108 newObj.previous = this; //link it in queue after this. 109 newObj.next = next; 110 next = newObj; 111 return newObj; 112 } 113 114 115 116 117 /**Builds the position. 118 * @param cfge deprecated, it is this. 119 * @param guiMng to set the position. 120 * @return 121 * @throws ParseException 122 */ 123 void setPos(GralMngBuild_ifc guiMng) 124 throws ParseException 125 { GralMng mng = GralMng.get(); 126 if(positionString !=null) { 127 mng.setPos(positionString); 128 } else { 129 GralCfgPosition p = positionInput; 130 if(p.yPos >=0 || p.xPos >=0 || p.ySizeDown !=0 || p.xWidth !=0) { 131 132 int ySize = p.ySizeDown == GralPos.useNatSize ? p.ySizeDown : 133 p.ySizeDown == 0 ? GralPos.samesize : 134 (p.ySizeFrac > 0 && p.ySizeDown < 0 ? p.ySizeDown -1 : p.ySizeDown) + GralPos.size; 135 int xSize = p.xWidth == GralPos.useNatSize ? p.xWidth : 136 p.xWidth == 0 ? GralPos.samesize : 137 (p.xSizeFrac > 0 && p.xWidth < 0 ? p.xWidth -1 : p.xWidth) + GralPos.size; 138 mng.setFinePosition(p.yPos, p.yPosFrac, ySize, p.ySizeFrac, p.xPos, p.xPosFrac, xSize, p.xSizeFrac, 0, 'r', 0, 0, null); 139 } 140 else { 141 stop(); 142 //no position given. The new position will be set relative to the old one on widget.setToPanel. 143 } 144 // setPosOld(guiMng); //use inputPos 145 } 146 } 147 148 149 150 151 public String getPanel(){ return positionInput.panel; } 152 153 void setPanel(String panel){ position.panel = positionInput.panel = panel; } 154 155 public int get_xPos(){ return positionInput.xPos; } 156 157 public int get_yPos(){ return positionInput.yPos; } 158 159 160 /**ZBNF: <?position> */ 161 public GralCfgPosition new_position(){ return positionInput; } 162 163 /**ZBNF: <*:?position> */ 164 public void set_positionString(String val) { this.positionString = val; } 165 166 /**ZBNF: [<?position> ] it is unnecessary*/ 167 public void set_position(String val) { } 168 169 /**ZBNF: <?position> */ 170 public void set_position(GralCfgPosition val) { } //is set only 171 172 /**ZBNF: Text::= */ 173 public GuiCfgText new_Text() 174 { GuiCfgText widgetType1 = new GuiCfgText(this); 175 this.widgetType = widgetType1; 176 return widgetType1; 177 } 178 179 /**ZBNF: Text::= */ 180 public void set_Text(GuiCfgText data){ } 181 182 public GuiCfgWidget new_InputTextbox() 183 { GralCfgData.GuiCfgWidget widgt = new GralCfgData.GuiCfgWidget(this, 't'); 184 this.widgetType = widgt; 185 return widgt; 186 } 187 188 public void set_InputTextbox(GuiCfgWidget data) { } 189 190 public GuiCfgWidget new_OutputTextbox() 191 { GralCfgData.GuiCfgWidget widgt = new GralCfgData.GuiCfgWidget(this, 't'); 192 this.widgetType = widgt; 193 return widgt; 194 } 195 196 public void set_OutputTextbox(GuiCfgWidget data) { } 197 198 public GuiCfgWidget new_InputTextline() 199 { GralCfgData.GuiCfgWidget widgt = new GralCfgData.GuiCfgWidget(this, 'T'); 200 this.widgetType = widgt; 201 return widgt; 202 } 203 204 public void set_InputTextline(GuiCfgWidget data) { } 205 206 public GuiCfgWidget new_InputFile() 207 { GuiCfgInputFile widgt = new GuiCfgInputFile(this); 208 this.widgetType = widgt; 209 return widgt; 210 } 211 212 public void set_InputFile(GuiCfgWidget data) { } 213 214 public GuiCfgWidget new_Button() 215 { GuiCfgButton widgt = new GuiCfgButton(this); 216 this.widgetType = widgt; 217 return widgt; 218 } 219 220 public void set_Button(GuiCfgWidget data) { } 221 222 public GuiCfgWidget new_SwitchButton() 223 { GuiCfgButton widgt = new GuiCfgButton(this, true); 224 this.widgetType = widgt; 225 return widgt; 226 } 227 228 public void set_SwitchButton(GuiCfgWidget data) { } 229 230 /**ZBNF: Led::= */ 231 public GuiCfgLed new_Led() 232 { GuiCfgLed widgetType1 = new GuiCfgLed(this); 233 this.widgetType = widgetType1; 234 return widgetType1; 235 } 236 237 /**ZBNF: Led::= */ 238 public void set_Led(GuiCfgLed data){ } 239 240 /**ZBNF: ValueBar::= */ 241 public GralCfgData.GuiCfgWidget new_ValueBar() 242 { GralCfgData.GuiCfgWidget widgt = new GralCfgData.GuiCfgWidget(this, 'U'); 243 this.widgetType = widgt; 244 return widgt; 245 } 246 247 248 /**ZBNF: ValueBar::= */ 249 public void set_ValueBar(GralCfgData.GuiCfgWidget data){ } 250 251 /**ZBNF: Line::= */ 252 public GuiCfgLine new_Line() 253 { GuiCfgLine widgetType1 = new GuiCfgLine(this); 254 this.widgetType = widgetType1; 255 return widgetType1; 256 } 257 258 /**ZBNF: Line::= */ 259 public void set_Line(GuiCfgLine data){ } 260 261 /**ZBNF: Imagefile::= */ 262 public GuiCfgImage new_Imagefile() 263 { GuiCfgImage widgetType1 = new GuiCfgImage(this); 264 this.widgetType = widgetType1; 265 return widgetType1; 266 } 267 268 /**ZBNF: ShowField::= */ 269 public void set_Imagefile(GuiCfgImage data){ } 270 271 /**ZBNF: ShowField::= */ 272 public GuiCfgShowField new_ShowField() 273 { GuiCfgShowField widgetType1 = new GuiCfgShowField(this); 274 this.widgetType = widgetType1; 275 return widgetType1; 276 } 277 278 /**ZBNF: ShowField::= */ 279 public void set_ShowField(GuiCfgShowField data){ } 280 281 /**ZBNF: Table::= */ 282 public GuiCfgTable new_Table() 283 { GuiCfgTable widgetType1 = new GuiCfgTable(this); 284 this.widgetType = widgetType1; 285 return widgetType1; 286 } 287 288 /**ZBNF: Table::= */ 289 public void set_Table(GuiCfgTable data){ } 290 291 /**ZBNF: Curveview::= */ 292 public GuiCfgCurveview new_Curveview() 293 { GuiCfgCurveview widgetType1 = new GuiCfgCurveview(this); 294 this.widgetType = widgetType1; 295 return widgetType1; 296 } 297 298 /**ZBNF: Curveview::= */ 299 public void set_Curveview(GuiCfgCurveview data){ } 300 301 302 private void stop(){} 303 304}//class GuiCfgElement 305