    001package org.vishia.gral.awt;
    002
    003import java.awt.Canvas;
    004import java.awt.Color;
    005import java.awt.Container;
    006import java.awt.Font;
    007import java.awt.FontMetrics;
    008import java.awt.Graphics;
    009import java.awt.Rectangle;
    010
    011import org.vishia.gral.base.GralButton;
    012import org.vishia.gral.ifc.GralColor;
    013import org.vishia.gral.ifc.GralRectangle;
    014
    015public class AwtButton extends GralButton.GraphicImplAccess
    016{
    017  /**Version, history and license.
    018   * <ul>
    019   * <li>2013-12-22 Hartmut chg: Now {@link GralButton} uses the new concept of instantiation: It is not
    020   *   the super class of the implementation class. But it provides {@link GralButton.GraphicImplAccess}
    021   *   as the super class.
    022   * <li>2012-03-09 Hartmut new setFocus on press button
    023   * <li>2012-03-09 Hartmut new 3-state-Button.
    024   * <li>2012-03-09 Hartmut improved: appearance of the buttons.
    025   * <li>All other changes in 2010, 2011
    026   * </ul>
    027   *
    028   * <b>Copyright/Copyleft</b>:<br>
    029   * For this source the LGPL Lesser General Public License,
    030   * published by the Free Software Foundation is valid.
    031   * It means:
    032   * <ol>
    033   * <li> You can use this source without any restriction for any desired purpose.
    034   * <li> You can redistribute copies of this source to everybody.
    035   * <li> Every user of this source, also the user of redistribute copies
    036   *    with or without payment, must accept this license for further using.
    037   * <li> But the LPGL is not appropriate for a whole software product,
    038   *    if this source is only a part of them. It means, the user
    039   *    must publish this part of source,
    040   *    but doesn't need to publish the whole source of the own product.
    041   * <li> You can study and modify (improve) this source
    042   *    for own using or for redistribution, but you have to license the
    043   *    modified sources likewise under this LGPL Lesser General Public License.
    044   *    You mustn't delete this Copyright/Copyleft inscription in this source file.
    045   * </ol>
    046   * If you intent to use this source without publishing its usage, you can get
    047   * a second license subscribing a special contract with the author.
    048   *
    049   * @author Hartmut Schorrig = hartmut.schorrig@vishia.de
    050   */
    051  //@SuppressWarnings("hiding")
    052  public static final int version = 20130524;
    053
    054  AwtWidgetHelper helper;
    055
    056  AwtButtonImpl widgetSwt;
    057
    058  final Color black;
    059  final Color white;
    060
    061  final Font fontText;
    062
    063
    064  final AwtGralMouseListener.MouseListenerGralAction mouseListener;
    065
    066
    067
    068  //public AwtButton(String sName, AwtWidgetMng mng, Container parent, int styleSwt, char size)
    069  AwtButton(GralButton widgg, AwtWidgetMng mng)
    070  {
    071    widgg.super(widgg, mng.mng);
    072    mouseListener = new AwtGralMouseListener.MouseListenerGralAction(mouseWidgetAction);
    073    float ySize = widgg.pos().height();
    074    char size1 = ySize > 3? 'B' : 'A';
    075    switch(size1){
    076      case 'A': fontText = mng.propertiesGuiAwt.stdInputFont; break;
    077      case 'B': fontText = mng.propertiesGuiAwt.stdButtonFont; break;
    078      default: throw new IllegalArgumentException("param size must be A or B");
    079      }
    080      //Control xx = mng.pos.panel.panelComposite;
    081      black = mng.propertiesGuiAwt.colorAwt(GralColor.getColor("bk"));
    082      white = mng.propertiesGuiAwt.colorAwt(GralColor.getColor("wh"));
    083      Container panelSwt = mng.getCurrentPanel();
    084      int styleSwt = 0;
    085      widgetSwt = new AwtButtonImpl(panelSwt, styleSwt);
    086      widgetSwt.setData(widgg);
    087      widgetSwt.setBackground(mng.propertiesGuiAwt.colorBackground);
    088      widgetSwt.addMouseListener(mouseListener);
    089      setBoundsGraphic(mng);
    090      helper = new AwtWidgetHelper(widgetSwt, mng);
    091  }
    092
    093
    094
    095  @Override public GralRectangle getPixelPositionSize(){ return helper.getPixelPositionSize(); }
    096
    097
    098  void setBoundsGraphic(AwtWidgetMng mng)
    099  {
    100    //widgetSwt.setSize(mng.propertiesGui.xPixelUnit() * xSize -2, mng.propertiesGui.yPixelUnit() * ySize -2);
    101    mng.setBounds_(widgg.pos(), widgetSwt);
    102
    103  }
    104
    105
    106
    107
    108  @Override public boolean setFocusGThread()
    109  { return AwtWidgetHelper.setFocusOfTabSwt(widgetSwt);
    110  }
    111
    112
    113
    114
    115  @Override
    116  public void removeWidgetImplementation()
    117  {
    118    // TODO Auto-generated method stub
    119
    120  }
    121
    122  @Override
    123  public Object getWidgetImplementation()
    124  { return widgetSwt; }
    125
    126
    127  @Override public void setBoundsPixel(int x, int y, int dx, int dy)
    128  { widgetSwt.setBounds(x,y,dx,dy);
    129  }
    130
    131  protected void paintRoutine(Graphics gc, Canvas canvas){
    132    Rectangle dim = canvas.getBounds();
    133    AwtButton.this.paint1();
    134
    135    Color colorBack = helper.mng.getColorImpl(colorgback);
    136    canvas.setBackground(colorBack);
    137    //drawBackground(gc, dim.x+1, dim.y+1, dim.width-1, dim.height-1);
    138    Color color = canvas.getForeground(); //of the widget.
    139    canvas.setForeground(color);  //black
    140    gc.setFont(fontText);
    141    //FontData fontData = mng.propertiesGui.stdButtonFont.getFontData();
    142    //fontData.
    143    if(isPressed()){
    144      //gc.setLineWidth(3);
    145      gc.drawRect(1,1,dim.width-2, dim.height-2);
    146      //gc.setLineStyle(SWT.LINE_DOT);
    147      gc.drawRect(3,3,dim.width-6, dim.height-6);
    148    } else {
    149      //gc.setLineWidth(1);
    150      //setForeground(colorBack);
    151      gc.setColor(colorBack);
    152      gc.fillRect(2,2,dim.width-6, dim.height-6);
    153      canvas.setForeground(black);
    154      gc.drawRect(1,1,dim.width-5, dim.height-5);
    155      //setForeground(white);
    156      gc.setColor(black);
    157      //gc.setLineWidth(3);
    158      gc.drawLine(0, dim.height-2,dim.width, dim.height-2);
    159      gc.drawLine(dim.width-1, 0, dim.width-1, dim.height);
    160    }
    161    if(sButtonText !=null){
    162      FontMetrics fontMetrics = gc.getFontMetrics();
    163      int charWidth = 8; //fontMetrics.getAverageCharWidth();
    164      int halfWidthButtonText = charWidth * sButtonText.length() /2;
    165      int xText = dim.width / 2 - halfWidthButtonText;
    166      if(xText < 2){ xText = 2; }
    167      int halfHeightButtonText = fontMetrics.getHeight() /2;
    168      int yText = dim.height / 2 + halfHeightButtonText;
    169      canvas.setForeground(black);
    170      gc.drawString(sButtonText, xText, yText);
    171    }
    172     System.out.println("Button") ;
    173  }
    174
    175
    176  private class AwtButtonImpl extends Canvas implements AwtWidget
    177  {
    178
    179    private Object data;
    180
    181
    182
    183    AwtButtonImpl(Container parent, int style){
    184      super();
    185      setForeground(black);
    186      parent.add(this);
    187      //addPaintListener(paintListener);
    188
    189    }
    190
    191    public Object getData(){ return data; }
    192
    193    public void setData(Object dataP){ data = dataP; }
    194
    195    //PaintListener paintListener = new PaintListener(){
    196      @Override public void paint(Graphics gc) {
    197        paintRoutine(gc, this);
    198     }
    199   }
    200
    201
    202
    203  @Override
    204  public void repaintGthread() {
    205    // TODO Auto-generated method stub
    206
    207  };
    208
    209
    210
    211  /**Sets the implementation widget vible or not.
    212   * @see org.vishia.gral.base.GralWidgImpl_ifc#setVisibleGThread(boolean)
    213   */
    214  @Override public void setVisibleGThread(boolean bVisible){ super.setVisibleState(bVisible); helper.setVisibleGThread(bVisible); }
    215
    216
    217
    218
    219}