001package org.vishia.gral.cfg; 002 003import org.vishia.gral.base.GralPos; 004 005/**ZBNF: position::= ... ; 006 * Class for instance to capture and store the position in an element. */ 007public final class GralCfgPosition implements Cloneable 008{ 009 /**Version and history 010 * <ul> 011 * </ul> 012 * 013 * <b>Copyright/Copyleft</b>:<br> 014 * For this source the LGPL Lesser General Public License, 015 * published by the Free Software Foundation is valid. 016 * It means: 017 * <ol> 018 * <li> You can use this source without any restriction for any desired purpose. 019 * <li> You can redistribute copies of this source to everybody. 020 * <li> Every user of this source, also the user of redistribute copies 021 * with or without payment, must accept this license for further using. 022 * <li> But the LPGL is not appropriate for a whole software product, 023 * if this source is only a part of them. It means, the user 024 * must publish this part of source, 025 * but doesn't need to publish the whole source of the own product. 026 * <li> You can study and modify (improve) this source 027 * for own using or for redistribution, but you have to license the 028 * modified sources likewise under this LGPL Lesser General Public License. 029 * You mustn't delete this Copyright/Copyleft inscription in this source file. 030 * </ol> 031 * If you intent to use this source without publishing its usage, you can get 032 * a second license subscribing a special contract with the author. 033 * 034 * @author Hartmut Schorrig = hartmut.schorrig@vishia.de 035 */ 036 public static final int version = 20120303; 037 038 039 public String panel; 040 public boolean yPosRelative; 041 public int yPos = -1, yPosFrac; 042 public int ySizeDown, ySizeFrac; 043 boolean yIncr_; 044 045 public boolean xPosRelative; 046 public int xPos = -1, xPosFrac; 047 public int xWidth, xSizeFrac; 048 boolean xIncr_ = false; 049 050 public void set_xIncr(){ xIncr_ = true; yIncr_ = false; } 051 public void set_yIncr(){ yIncr_ = true; xIncr_ = false; } 052 public void set_xOwnSize(){ xWidth = GralPos.useNatSize; } //Integer.MAX_VALUE; } 053 public void set_yOwnSize(){ ySizeDown = GralPos.useNatSize; } //Integer.MAX_VALUE; } 054 055 @Override protected GralCfgPosition clone() 056 { GralCfgPosition clone = null; 057 try{ clone = (GralCfgPosition)super.clone(); } 058 catch(CloneNotSupportedException exc){ assert(false); } 059 return clone; 060 } 061 062 /**Sets all data from src. It is similar as {@link #clone()} but it uses a given instance. 063 * @param src of data 064 */ 065 public void set(GralCfgPosition src){ 066 panel = src.panel; 067 yPosRelative = src.yPosRelative; 068 yPos = src.yPos; 069 yPosFrac = src.yPosFrac; 070 ySizeDown = src.ySizeDown; 071 ySizeFrac = src.ySizeFrac; 072 yIncr_ = src.yIncr_; 073 xPosRelative = src.xPosRelative; 074 xPos = src.xPos; 075 xPosFrac = src.xPosFrac; 076 xWidth = src.xWidth; 077 xSizeFrac = src.xSizeFrac; 078 xIncr_ = src.yIncr_; 079 080 } 081 082 083 /**Sets a position element. It is able to call from a configuration input or gui input. 084 * @param what use y, x, h, w for pos-y, pos-x, height, width. All other chars causes an IllegalArgumentException. 085 * @param sVal String given Value in ZBNF-syntax-form ::=[< ?posRelative> &+]< #?val>[ \. <#?frac> ]. Fault inputs causes return false. 086 * It should not have leeding or trailing spaces! Trim outside. 087 * It is admissible that the string is empty, then no action is done. 088 * @return true on success. False if the sVal contains numberFormat errors. True on empty sVal 089 */ 090 public boolean setPosElement(char what, String sVal) 091 { boolean ok = true; 092 final int val; final int frac; 093 if(sVal.length() >0){ 094 boolean posRelativ = sVal.charAt(0)=='&'; 095 int pos1 = posRelativ ? 1: 0; 096 if(sVal.charAt(pos1) == '+'){ 097 pos1 +=1; //skip over a '+', it disturbs Integer.parseInt 098 } 099 int posPoint = sVal.indexOf('.'); 100 try{ 101 if(posPoint >=0){ 102 val = Integer.parseInt(sVal.substring(pos1, posPoint)); 103 frac = Integer.parseInt(sVal.substring(posPoint +1)); 104 } else { 105 val = Integer.parseInt(sVal.substring(pos1)); 106 frac = 0; 107 } 108 switch(what){ 109 case 'y': yPos = val; yPosFrac = frac; yPosRelative = posRelativ; break; 110 case 'x': xPos = val; xPosFrac = frac; xPosRelative = posRelativ; break; 111 case 'h': ySizeDown = val; ySizeFrac = frac; break; 112 case 'w': xWidth = val; xSizeFrac = frac; break; 113 } 114 } catch(NumberFormatException exc){ ok = false; } 115 } 116 return ok; 117 } 118 119 120 121}