001package org.vishia.gral.awt;
002
003import java.awt.Container;
004import java.awt.Dimension;
005import java.awt.Font;
006import java.awt.FontMetrics;
007import java.awt.Label;
008
009import org.vishia.gral.base.GralWidget;
010import org.vishia.gral.ifc.GralRectangle;
011import org.vishia.gral.widget.GralLabel;
012
013public class AwtLabel extends GralLabel.GraphicImplAccess
014{
015  /**Version, history and license.
016   * <ul>
017   * <li>2013-12-23 Hartmut new: Uses the new concept of widget implementation.
018   * </ul>
019   * 
020   * <b>Copyright/Copyleft</b>:
021   * For this source the LGPL Lesser General Public License,
022   * published by the Free Software Foundation is valid.
023   * It means:
024   * <ol>
025   * <li> You can use this source without any restriction for any desired purpose.
026   * <li> You can redistribute copies of this source to everybody.
027   * <li> Every user of this source, also the user of redistribute copies
028   *    with or without payment, must accept this license for further using.
029   * <li> But the LPGL is not appropriate for a whole software product,
030   *    if this source is only a part of them. It means, the user
031   *    must publish this part of source,
032   *    but doesn't need to publish the whole source of the own product.
033   * <li> You can study and modify (improve) this source
034   *    for own using or for redistribution, but you have to license the
035   *    modified sources likewise under this LGPL Lesser General Public License.
036   *    You mustn't delete this Copyright/Copyleft inscription in this source file.
037   * </ol>
038   * If you intent to use this source without publishing its usage, you can get
039   * a second license subscribing a special contract with the author. 
040   * 
041   * @author Hartmut Schorrig = hartmut.schorrig@vishia.de
042   * 
043   * 
044   */
045  @SuppressWarnings("hiding")
046  public static final int version = 20120317;
047  
048  /**It contains the association to the swt widget (Control) and the {@link SwtMng}
049   * and implements some methods of {@link GralWidgImpl_ifc} which are delegate from this.
050   */
051  private final AwtWidgetHelper widgHelper;
052  
053  protected Label labelAwt;
054
055  private Font fontAwt;
056  
057  
058  AwtLabel(GralLabel widgg, AwtWidgetMng mng)
059  {
060    widgg.super(widgg, mng.mng);
061    //Container panelSwt = mng.getCurrentPanel();
062    //int styleSwt = 0;
063    int mode;
064    switch(origin()){
065    case 1: mode = Label.LEFT; break;
066    case 2: mode = Label.CENTER; break;
067    case 3: mode = Label.RIGHT; break;
068    case 4: mode = Label.LEFT; break;
069    case 5: mode = Label.CENTER; break;
070    case 6: mode = Label.RIGHT; break;
071    case 7: mode = Label.LEFT; break;
072    case 8: mode = Label.CENTER; break;
073    case 9: mode = Label.RIGHT; break;
074    default: mode = 0;
075    }
076    labelAwt = new Label(dyda().displayedText, mode);
077    Container panelAwt = (Container)widgg.pos().panel.getWidgetImplementation();
078    panelAwt.add(labelAwt);
079    widgHelper = new AwtWidgetHelper(labelAwt, mng);
080    labelAwt.setAlignment(mode);
081    mng.setBounds_(widgg.pos(), labelAwt);
082    mng.mng.registerWidget(widgg);
083    repaintGthread();  //to set text etc.
084  }
085
086
087  @Override
088  public GralRectangle getPixelPositionSize(){ return widgHelper.getPixelPositionSize(); }
089
090
091  @Override
092  public Object getWidgetImplementation(){ return labelAwt; }
093
094
095  @Override public void removeWidgetImplementation()
096  { widgHelper.removeWidgetImplementation();
097    labelAwt = null;
098  }
099
100
101  @Override
102  public void repaintGthread()
103  {
104    if(labelAwt !=null){ //do nothing if the graphic implementation widget is removed.
105      GralWidget.DynamicData dyda = dyda();
106      int chg, catastrophicalCount =0;
107      while( (chg = getChanged()) !=0){ //widgg.dyda.whatIsChanged.get();
108        if(++catastrophicalCount > 10000) 
109          throw new RuntimeException("atomic failed");
110        if((chg & chgColorText)!=0) {  //firstly set the font.
111          AwtProperties props = widgHelper.mng.propertiesGuiAwt;
112          if(dyda.textFont !=null){
113            fontAwt = props.fontAwt(dyda.textFont);
114            labelAwt.setFont(fontAwt);
115          }
116          if(dyda.textColor !=null){
117            labelAwt.setForeground(props.colorAwt(dyda.textColor));
118          }
119          if(dyda.backColor !=null){
120            labelAwt.setBackground(props.colorAwt(dyda.backColor));
121          }
122        }
123        if((chg & chgText) !=0 && dyda.displayedText !=null){ 
124          labelAwt.setText(dyda.displayedText);
125          //font.getFontData()[0].
126          //FontMetrics ff; ff.
127          //labelAwt.getFontMetrics(font)
128          Dimension textSize = new Dimension(10* dyda.displayedText.length(), 20);
129              //labelSwt.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
130          //int width = sText.length();
131          //widget.setSize(sizePixel);
132          
133          Dimension widgetSize = labelAwt.getSize();
134          if(widgetSize.width < textSize.width){
135            labelAwt.setSize(textSize);
136          }
137          //labelAwt.setSize(textSize);
138        }
139        acknChanged(chg);
140      }
141      labelAwt.repaint();
142    }
143  }
144
145
146  @Override public void setBoundsPixel(int x, int y, int dx, int dy)
147  { widgHelper.setBoundsPixel(x, y, dx, dy); 
148  }
149
150
151  @Override public boolean setFocusGThread()
152  { return widgHelper.setFocusGThread(); }
153
154
155  /**Sets the implementation widget vible or not.
156   * @see org.vishia.gral.base.GralWidgImpl_ifc#setVisibleGThread(boolean)
157   */
158  @Override public void setVisibleGThread(boolean bVisible){ super.setVisibleState(bVisible); widgHelper.setVisibleGThread(bVisible); }
159
160  
161}