001package org.vishia.gral.swt;
002
003import java.util.Map;
004import java.util.TreeMap;
005
006import org.eclipse.swt.SWT;
007import org.eclipse.swt.graphics.Color;
008import org.eclipse.swt.graphics.Device;
009import org.eclipse.swt.graphics.Font;
010import org.eclipse.swt.graphics.RGB;
011import org.vishia.gral.base.GralGridProperties;
012import org.vishia.gral.ifc.GralColor;
013import org.vishia.gral.ifc.GralFont;
014
015
016public class SwtProperties extends GralGridProperties
017{
018        private final Device guiDevice;
019
020  public final Font smallPromptFont;
021  
022  public final Font stdInputFont;
023  
024  public final Font stdButtonFont;
025  
026  Map<Integer, Color> colorsSwt = new TreeMap<Integer, Color>();
027  
028  private final Color colorBlack;
029  
030  public final Color colorGrid, colorGridStrong;
031  
032  /**A common background color for all widgets which are paint at the background. */
033  public Color colorBackground;
034  
035  /**Initializes a properties object.
036   * <br><br>
037   * @param size number between 1..5 to determine the size of the content (font size, pixel per cell)
038   */
039  public SwtProperties(Device device, char sizeC)
040  { super(sizeC);
041        this.guiDevice = device;
042    this.colorBlack = new Color(guiDevice, 0,0,0);
043    this.colorGrid = colorSwt(0xe0e0e0);
044    this.colorGridStrong = colorSwt(0xc0c0c0);
045    this.colorBackground = colorSwt(colorBackground_);
046    this.smallPromptFont = new Font(device, "Arial", smallPromptFontSize[size], SWT.NORMAL);
047    this.stdInputFont = new Font(device, "Arial", stdInputFontSize[size], SWT.NORMAL);
048    this.stdButtonFont = new Font(device, "Arial", stdButtonFontSize[size], SWT.NORMAL);
049  }
050  
051  /**Returns a color with given Gui-independent color.
052   * The SWT-Color instance is taken from a pool if the color is used already.
053   * Elsewhere it is created newly and put into the pool.
054   * @param color The given color in system-indpending form.
055   * @return An instance of SWT-color
056   */
057  public Color colorSwt(GralColor color)
058  {
059    if(color.colorGuimpl == null){
060      int colorValue = color.getColorValue();
061      color.colorGuimpl = colorSwt(colorValue);
062    } else if(!(color.colorGuimpl instanceof Color)){
063      throw new IllegalArgumentException("unauthorized color setting");
064    }
065    return (Color)color.colorGuimpl;
066  }
067  
068  
069  /**Returns a color with given numeric color value.
070   * The SWT-Color instance is taken from a pool if the color is used already.
071   * Elsewhere it is created newly and put into the pool.
072   * @param colorValue red, green and blue
073   * @return An instance of SWT-color
074   */
075  public Color colorSwt(int colorValue){
076        Color color;
077        if(colorValue >=0 && colorValue < 0x1000000){
078                color = colorsSwt.get(colorValue);
079                if(color==null){
080                        color = new Color(guiDevice, (colorValue >>16)&0xff, (colorValue >>8)&0xff, (colorValue)&0xff );
081              //colorsSwt.put(colorValue, color);  //store it to reuse.
082                }
083        } else {
084                color = colorBlack;  //The values -1... may be used for palettes.
085        }
086        return color;
087  }
088  
089  /**Returns a color with given Gui-independent color name.
090   * The SWT-Color instance is taken from a pool if the color is used already.
091   * Elsewhere it is created newly and put into the pool.
092   * @param sColorName One of the registered color names.
093   * @return An instance of SWT-color
094   */
095  
096  public Color color(String sColorname)
097  { int nColor = getColorValue(sColorname);
098    return colorSwt(nColor);
099  }
100  
101  public Color colorBackgroundSwt(){ return colorSwt(colorBackground_); }
102  
103  /**Creates an instance of a GUI-system independent color with given SWT color.
104   * @param color The SWT-color
105   * @return a new instance.
106   */
107  public static GralColor createColorGui(Color color)
108  { RGB rgb = color.getRGB();
109    GralColor ret = new GralColor(rgb.red, rgb.green, rgb.blue);
110    return ret;
111  }
112  
113  public Font getSwtFont(float fontSize){ return fontSwt(super.getTextFont(fontSize)); }
114
115  
116  /*
117   * JLabel   Trace-GUI           56 x 16
118   * FileInputField              237 x 34
119   * JButton                      73 x 26
120   */
121
122  
123  
124  /**Returns a implementation font with given Gui-independent font.
125   * The SWT-Font instance is taken from a pool if the font is used already.
126   * Elsewhere it is created newly and put into the pool.
127   * @param forn The given Gral font in system-independent form.
128   * @return An instance of SWT-Font
129   */
130  public Font fontSwt(GralFont font)
131  {
132    if(font.fontImpl == null){
133      int styleSwt = 0;
134      switch(font.style){
135        case 'b': styleSwt |= SWT.BOLD; break;
136        case 'B': styleSwt |= SWT.BOLD; break;
137        case 'i': styleSwt |= SWT.ITALIC; break;
138        case 'I': styleSwt |= SWT.BOLD | SWT.ITALIC; break;
139        default: styleSwt = SWT.NORMAL;
140      }
141      String fontName;
142      //NOTE: on SWT there are not Java standardfonts, there are platform-depending.
143      if(font.fontName.equals(GralFont.fontMonospacedSansSerif)){ fontName = "Courier"; }
144      else if(font.fontName.equals(GralFont.fontMonospacedSmall)){ fontName = "Courier"; }
145      else if(font.fontName.equals(GralFont.fontMonospacedSerif)){ fontName = "Courier"; }
146      else if(font.fontName.equals(GralFont.fontSansSerif)){ fontName = "Arial"; }
147      else if(font.fontName.equals(GralFont.fontSerif)){ fontName = "Serif"; }
148      else {fontName = font.fontName; }
149      font.fontImpl = new Font(guiDevice, fontName, font.size, styleSwt);
150    } else if(!(font.fontImpl instanceof Font)){
151      throw new IllegalArgumentException("unauthorized font setting");
152    }
153    return (Font)font.fontImpl;
154  }
155  
156  
157
158  Font getTextFontSwt(float fontSize, char type, char style){
159    return fontSwt(getTextFont(fontSize, type, style));
160  }
161  
162  
163}