001package org.vishia.gral.base; 002 003import java.util.Map; 004import java.util.TreeMap; 005 006import org.vishia.bridgeC.IllegalArgumentExceptionJc; 007import org.vishia.gral.ifc.GralColor; 008import org.vishia.gral.ifc.GralFont; 009 010public class GralGridProperties 011{ 012 /**Version, history and license. 013 * <ul> 014 * <li>2015-10-24 Hartmut chg: Size C is now 10 pixel per grid unit, size D is the older size C. 015 * <li>2015-10-11 Hartmut chg: The text font should be lesser because g, q, y are not proper able to read. 016 * TODO think about finer steps between A..C, but don't change existing sizes because some graphics are tuned with them. 017 * <li>2010-00-00 Hartmut created. The idea of a grid layout with different sizes as basic. 018 * </ul> 019 * <b>Copyright/Copyleft</b>: 020 * For this source the LGPL Lesser General Public License, 021 * published by the Free Software Foundation is valid. 022 * It means: 023 * <ol> 024 * <li> You can use this source without any restriction for any desired purpose. 025 * <li> You can redistribute copies of this source to everybody. 026 * <li> Every user of this source, also the user of redistribute copies 027 * with or without payment, must accept this license for further using. 028 * <li> But the LPGL is not appropriate for a whole software product, 029 * if this source is only a part of them. It means, the user 030 * must publish this part of source, 031 * but don't need to publish the whole source of the own product. 032 * <li> You can study and modify (improve) this source 033 * for own using or for redistribution, but you have to license the 034 * modified sources likewise under this LGPL Lesser General Public License. 035 * You mustn't delete this Copyright/Copyleft inscription in this source file. 036 * </ol> 037 * If you are indent to use this sources without publishing its usage, you can get 038 * a second license subscribing a special contract with the author. 039 * 040 * @author Hartmut Schorrig = hartmut.schorrig@vishia.de 041 * 042 * 043 */ 044 public final static int version = 0x20120303; 045 046 047 /**This are the font sizes for some heights of fields in the given sizes of presentation. 048 * First index is the height of field, second is the size of presentation. 049 */ 050 protected final static int[][] stdTextFontSize = 051 { {5, 5, 6, 7, 7, 8, 9} ////1, 1.1, 1.2 052 , {6, 6, 7, 8, 9, 9,10} // 1 1/3, 053 , {6, 7, 8, 9, 9,10,12} //1.5 054 , {7, 7, 8, 10,10,12,14} //1 2/3 055 , {7, 8, 9, 11,12,14,18} //2 056 , {8, 9, 10,11,12,14,18} //2 1/3 057 , {9,10, 11, 11,12,14,18} //2.5, 2 2/3 058 , {9,11, 11, 12, 12,14,18} //3 059 , {10,11,11,12, 12,14,18} //3.5 060 , {10,11,11,12, 12,14,18} //>=4 061 }; 062 063 protected final static int[] smallPromptFontSize = stdTextFontSize[0]; 064 protected final static int[] stdInputFontSize = stdTextFontSize[4]; 065 protected final static int[] stdButtonFontSize = stdTextFontSize[7]; 066 067 /** Number of pixel for fractional part and for the grid size. 068 * The array is organized in a 2-dimensional array <code>[frac][size]</code>. 069 * <ul> 070 * <li>The first column contains 0 for frac = 0. 071 * <li>The last column: <code>pixelFrac[size] [10]</code> contains the pixel size of the grid. 072 * <li>The fractional part is given in even numbers (1, 3, 5, 7, 9) to divide in part of 1/6: 073 * 1 = 1/6, 3 = 1/3, 5 = 1/2, 7 = 2/3, 9 = 5/6. It is decimal 0.166, 0.333, 0.5, 0.666, 0.833. 074 * <li>The fractional part is given in odd numbers (2, 4, 6, 8) to divide in part of 1/5 or decimal 2/10: 075 * 2 = 1/5 = 0.2, 4 = 2/5 = 0.4, 6 = 3/5 = 0.6, 8 = 4/5 = 0.8. 076 * </ul> 077 * Typical usage for grid units and associated pixel units in size C: 078 * <table> 079 * <tr><th>Type </td><td>units</td><td>pixel</td></tr> 080 * <tr><td>Label normal text size </td><td>2 </td><td>16 </td></tr> 081 * <tr><td>Button normal text size </td><td>3 </td><td>24 </td></tr> 082 * <tr><td>TextField </td><td>2 </td><td>16 </td></tr> 083 * <tr><td>Large InputField </td><td>4 </td><td>32 </td></tr> 084 * </table> 085 * Number of Grid Units for full display sizes. An application which needs about 40 lines of text or text fields 086 * needs 80 grid unit in vertical, it is about 80x120. It runs in a small window with 640 x 480 pixel on size A only. 087 * In full display mode on a standard display it can use the size C or D. 088 * <table> 089 * <tr><th>size </td><td>A </td><td>B </td><td>C </td><td>D </td><td>E </td><td>F </td></td><td>G </td></tr> 090 * <tr><td>pixel/grid </td><td> 6 </td><td> 7 </td><td> 8 </td><td> 9 </td><td> 10 </td><td>12 </td><td>15 </td></tr> 091 * <tr><td>640 x 480 </td><td><b>106 x 80</b></td><td>91 x 68</td><td> 80 x 60</td><td> todo </td><td> todo </td><td> todo </td></tr> 092 * <tr><td>800 x 600 </td><td>133 x 100</td><td><b>114 x 85</b></td><td>100 x 75</td><td> todo </td><td> todo </td><td> todo </td></tr> 093 * <tr><td>1024 x 768 </td><td>170 x 128</td><td>146 x 109</td><td><b>128 x 96</b></td><td>113 x 85</td><td>102 x 76</td><td>85 x 64</td><td>68 x 51</td></tr> 094 * <tr><td>1200 x 800 </td><td>200 x 133</td><td>171 x 114</td><td>150 x 100</td><td><b>133 x 88</b></td><td>120 x 80</td><td>100 x 66</td><td>80 x 53</td></tr> 095 * <tr><td>1680 x 1024 </td><td>280 x 170</td><td>240 x 146</td><td>210 x 128</td><td>186 x 113</td><td>168 x 102</td><td>140 x 85</td><td>112 x 68</td></tr> 096 * </table> 097 * <table> 098 * <tr><th>Type </td><td>unit</td><td>pixel</td></tr> 099 * <tr><td>JLabel normal text size </td><td>2 </td><td>0+6 </td></tr> 100 * <tr><td>JButton normal text size </td><td>3 </td><td>26 </td></tr> 101 * <tr><td>InputField </td><td>4 </td><td>34 </td></tr> 102 * </table> 103 */ 104 protected final static int[][] pixelFrac = 105 // 1/6 1/3 1/2 2/3 5/6 Divisions of 2, 3 and 6 106 // 1/5 2/5 3/5 4/5 Divisions of 5 107 // 1 2 3 4 5 6 7 8 9 0 the number given 108 { {0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6 } //pixel size A 109 , {0, 1, 1, 2, 3, 3, 4, 5, 6, 6, 7 } 110 , {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8 } 111 , {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9 } 112 , {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } 113 , {0, 1, 2, 4, 5, 6, 7, 8,10,11, 12 } 114 , {0, 2, 3, 5, 6, 7, 9,10,12,13, 15 } 115 }; 116 117 //protected final static int[][] yPixelFrac = xPixelFrac; 118 119 protected final int xPixelUnit; 120 121 //Map<Integer, GralColor> colors = new TreeMap<Integer, GralColor>(); 122 123 /**A common background color for all widgets which are paint at the background. */ 124 public GralColor colorBackground_; 125 126 /**Up to 10 font sizes for following hight of lettes: 127 * <table> 128 * <tr><td>..1.2</td><td>..1.4</td><td>..1.6</td><td>..1.8</td><td>..2.0</td><td>..2.4</td><td>..2.8</td><td>..3.1</td><td>..3.9</td><td>3.9...</td></tr> 129 * <tr><td> 0 </td><td> 1 </td><td> 2 </td><td> 3 </td><td> 4 </td><td> 5 </td><td> 6 </td><td> 7 </td><td> 8 </td><td> 9 </td><td></tr> 130 * </table> 131 * This table will be filled depending of the Grid size, see {@link #stdTextFontSize}. 132 * 133 */ 134 public final GralFont[] textFont = new GralFont[10]; 135 136 137 public final GralFont[] fontMonospacedSansSerif = new GralFont[10]; 138 139 /**The size of this propety set.*/ 140 protected final int size; 141 142 public GralGridProperties(char sizeC) 143 { 144 int size = (sizeC - 'A'); 145 if(size <0 || size >= stdInputFontSize.length) throw new IllegalArgumentException("parameter size should be 1.." + stdInputFontSize.length); 146 this.size = size; 147 this.xPixelUnit = pixelFrac[size][10]; 148 colorBackground_ = color(0xeeeeee); 149 this.textFont[0] = new GralFont("Arial", stdTextFontSize[0][size], 'n'); 150 this.textFont[1] = new GralFont("Arial", stdTextFontSize[1][size], 'n'); 151 this.textFont[2] = new GralFont("Arial", stdTextFontSize[2][size], 'n'); 152 this.textFont[3] = new GralFont("Arial", stdTextFontSize[3][size], 'n'); 153 this.textFont[4] = new GralFont("Arial", stdTextFontSize[4][size], 'n'); 154 this.textFont[5] = new GralFont("Arial", stdTextFontSize[5][size], 'n'); 155 this.textFont[6] = new GralFont("Arial", stdTextFontSize[6][size], 'n'); 156 this.textFont[7] = new GralFont("Arial", stdTextFontSize[7][size], 'n'); 157 this.textFont[8] = new GralFont("Arial", stdTextFontSize[8][size], 'n'); 158 this.textFont[9] = new GralFont("Arial", stdTextFontSize[9][size], 'n'); 159 String sMonospaced = GralFont.fontMonospacedSansSerif; 160 this.fontMonospacedSansSerif[0] = new GralFont(sMonospaced, stdTextFontSize[0][size], 'n'); 161 this.fontMonospacedSansSerif[1] = new GralFont(sMonospaced, stdTextFontSize[1][size], 'n'); 162 this.fontMonospacedSansSerif[2] = new GralFont(sMonospaced, stdTextFontSize[2][size], 'n'); 163 this.fontMonospacedSansSerif[3] = new GralFont(sMonospaced, stdTextFontSize[3][size], 'n'); 164 this.fontMonospacedSansSerif[4] = new GralFont(sMonospaced, stdTextFontSize[4][size], 'n'); 165 this.fontMonospacedSansSerif[5] = new GralFont(sMonospaced, stdTextFontSize[5][size], 'n'); 166 this.fontMonospacedSansSerif[6] = new GralFont(sMonospaced, stdTextFontSize[6][size], 'n'); 167 this.fontMonospacedSansSerif[7] = new GralFont(sMonospaced, stdTextFontSize[7][size], 'n'); 168 this.fontMonospacedSansSerif[8] = new GralFont(sMonospaced, stdTextFontSize[8][size], 'n'); 169 this.fontMonospacedSansSerif[9] = new GralFont(sMonospaced, stdTextFontSize[9][size], 'n'); 170 171 } 172 173 174 public int getColorValue(String sColorName) 175 { //Integer colorValue = 176 GralColor color = GralColor.getColor(sColorName); 177 if(color == null) return 0x606060; 178 else return color.getColorValue(); 179 } 180 181 182 public GralFont getTextFont(float size) 183 { 184 if(size <=1.2f) return textFont[0]; //1, 1.1, 1.2 185 if(size <=1.4f) return textFont[1]; // 1 1/3, 186 if(size <=1.6f) return textFont[2]; //1.5 187 if(size <=1.8f) return textFont[3]; //1 2/3 188 if(size <=2.0f) return textFont[4]; //2 189 if(size <=2.4f) return textFont[5]; //2 1/3 190 if(size <=2.8f) return textFont[6]; //2.5, 2 2/3 191 if(size <=3.1f) return textFont[7]; //3 192 if(size <=3.9f) return textFont[8]; //3.5 193 return textFont[9]; //>=4 194 195 } 196 197 /**The type: 198 * <ul> 199 * <li>m: monospaced small 200 * </ul> 201 * The style: not supported yet. TODO i, b for italic, bold,... 202 * 203 * @param fontHeight height of the text line in GralPos. 2.0f is standard. 204 * @param type 205 * @param style 206 * @return 207 */ 208 public GralFont getTextFont(float fontHeight, char type, char style) 209 { 210 int ifontSize; 211 if(fontHeight <=1.2f) ifontSize = 0; //1, 1.1, 1.2 212 else if(fontHeight <=1.4f) ifontSize = 1; // 1 1/3, 213 else if(fontHeight <=1.6f) ifontSize = 2; //1.5 214 else if(fontHeight <=1.8f) ifontSize = 3; //1 2/3 215 else if(fontHeight <=2.0f) ifontSize = 4; //2 216 else if(fontHeight <=2.4f) ifontSize = 5; //2 1/3 217 else if(fontHeight <=2.8f) ifontSize = 6; //2.5, 2 2/3 218 else if(fontHeight <=3.1f) ifontSize = 7; //3 219 else if(fontHeight <=3.9f) ifontSize = 8; //3.5 220 else ifontSize = 9; //>=4 221 final GralFont font; 222 switch(type){ 223 case 'm': font = fontMonospacedSansSerif[ifontSize]; break; 224 default: font = textFont[ifontSize]; 225 } 226 return font; 227 } 228 229 230 231 232 /**Returns a color with given numeric color value. 233 * The color instance is taken from a pool if the color is used already. 234 * Elsewhere it is created newly and put into the pool. 235 * @param colorValue red, green and blue 236 * @return An instance of color 237 */ 238 public GralColor color(int colorValue){ 239 GralColor color; 240 if(colorValue >=0 && colorValue < 0x1000000){ 241 color = GralColor.getColor(colorValue); 242 } else { 243 throw new IllegalArgumentExceptionJc("color value fault", colorValue); 244 } 245 return color; 246 } 247 248 249 250 251 public int yPixelFrac(int frac){ return pixelFrac[size][frac]; } 252 253 254 /**Gets the number of pixel for one unit of x-direction. It is approximately the half width of the letter 'm' 255 * for the standard input field font. To support visibility of a dedicated number of chars, you should use 256 * 2 * nrofChars units for a text field. In opposite, the Constructor for the javax.swing.TextField(int) 257 * sets the size of the text-field to the given number of 'm'-width. Here you should use factor 2. 258 * 259 * NOTE: A possibility to derive the xPixelUnit() from the font wasn't found. The cohesion between the font-widht for 'm' 260 * and the returned number of pixels is tested manually. It may be different if another font is used. 261 * @return Number of pixel for 1 unit in x-direction. 262 */ 263 public int xPixelUnit(){ return pixelFrac[size][10]; } 264 265 public int yPixelUnit(){ return pixelFrac[size][10]; } 266 267 public int xPixelFrac(int frac){ return pixelFrac[size][frac]; } 268 269 270 271 272}