    001package org.vishia.gral.swt;
    002
    003import org.eclipse.swt.events.PaintEvent;
    004import org.eclipse.swt.events.PaintListener;
    005import org.eclipse.swt.graphics.Color;
    006import org.eclipse.swt.graphics.GC;
    007import org.eclipse.swt.graphics.Rectangle;
    008import org.eclipse.swt.widgets.Canvas;
    009import org.eclipse.swt.widgets.Composite;
    010import org.vishia.gral.base.GralValueBar;
    011import org.vishia.gral.ifc.GralColor;
    012import org.vishia.gral.ifc.GralRectangle;
    013import org.vishia.gral.ifc.GralSetValue_ifc;
    014import org.vishia.gral.ifc.GralWidget_ifc;
    015
    016public class SwtValueBar extends GralValueBar.GraphicImplAccess // implements GralSetValue_ifc, GralWidget_ifc
    017{
    018
    019  /**It contains the association to the swt widget (Control) and the {@link SwtMng}
    020   * and implements some methods of {@link GralWidgImpl_ifc} which are delegate from this.
    021   */
    022  private final SwtWidgetHelper wdgh;
    023
    024        //final SwtMng mng;
    025
    026        protected BarWidget widgetSwt;
    027
    028        final Color black;
    029        //final Color colorValueOk, colorValueMinLimit, colorValueMaxLimit;
    030        //final Color white;
    031
    032        private Color[] colorBorder;
    033
    034        /**Creates a value bar.
    035         * @param mng The Gui-panel-manager contains information about the graphic frame and properties.
    036         * @param size The size of text in button, use 'A' or 'B' for small - bold
    037         */
    038        public SwtValueBar(GralValueBar widgg, SwtMng mng)
    039        {
    040    widgg.super(mng.mng);
    041    //mng.mng.setNextPosition();
    042    super.wdgimpl = this.wdgh = new SwtWidgetHelper(widgetSwt, mng);
    043    this.widgetSwt = this.new BarWidget();
    044                this.widgetSwt.setData(this);
    045                this.widgetSwt.setBackground(mng.propertiesGuiSwt.colorBackgroundSwt());
    046                //Control xx = mng.currPanel.panelComposite;
    047                black = mng.propertiesGuiSwt.colorSwt(0);
    048                //white = mng.propertiesGui.color(0xffffff);
    049                //colorValueOk = mng.propertiesGui.color(0xff4000);
    050                //colorValueMinLimit = mng.propertiesGui.color(0xff4000);
    051                //colorValueMaxLimit = mng.propertiesGui.color(0xff4000);
    052                colorBorder = new Color[1];  //at least 1 color, if not parametrized
    053                colorBorder[0] = mng.propertiesGuiSwt.color("red");
    054    //widget.setPanelMng(this);
    055  //  widget.setShowMethod(sShowMethod);
    056    //widget.widget.setData(widgetInfos);
    057    widgetSwt.addMouseListener(mng.mouseClickForInfo);
    058    setBounds();
    059
    060    mng.mng.registerWidget(widgg);
    061        }
    062
    063
    064
    065        public void setBounds(){
    066    pixBounds = wdgh.mng.calcWidgetPosAndSizeSwt(widgg.pos(), widgetSwt.getParent(), 10, 100);
    067    //mng.setPosAndSize_(widgetSwt);
    068    widgetSwt.setBounds(pixBounds.x, pixBounds.y, pixBounds.dx, pixBounds.dy);
    069    horizontal = pixBounds.dx > pixBounds.dy;
    070
    071        }
    072
    073
    074
    075  @Override public void repaintGthread(){
    076    widgetSwt.redraw();
    077  }
    078
    079
    080  @Override
    081  public void setBorderAndColorsImpl(String[] sColorLevels)
    082  {
    083        colorBorder = new Color[sColorLevels.length];
    084        int ix = -1;
    085        for(String sColor: sColorLevels){
    086                colorBorder[++ix] = wdgh.mng.propertiesGuiSwt.color(sColor);
    087        }
    088  }
    089
    090  @Override public Object getWidgetImplementation() { return widgetSwt; }
    091
    092
    093  @Override public boolean setFocusGThread(){ return widgetSwt.setFocus(); }
    094
    095  @Override public void setVisibleGThread(boolean bVisible) { super.setVisibleState(bVisible); wdgh.setVisibleGThread(bVisible); }
    096
    097
    098  protected void paintRoutine(BarWidget wdgs, PaintEvent e){
    099    // TODO Auto-generated method stub
    100    GC gc = e.gc;
    101    //gc.d
    102    Rectangle dim = wdgs.getBounds();
    103    int valuePixelMax = horizontal() ? dim.width -2: dim.height -2;
    104    if(valuePixelMax != 106)
    105      stop();
    106    /*
    107    if((SwtValueBar.this.valueMax != valuePixelMax || pixLevel == null)
    108      && fLevels !=null && fLevels.length >1) {  //at least one medium border
    109      pixLevel = new int[fLevels.length-1];
    110      for(int ix = 0; ix < pixLevel.length; ++ix){
    111        pixLevel[ix] = dim.height -1 - (int)(valueMax * ((fLevels[ix] - minRange) / (maxRange - minRange)));
    112      }
    113    }
    114    SwtValueBar.this.valueMax = valuePixelMax;
    115    */
    116    wdgs.drawBackground(e.gc, dim.x, dim.y, dim.width, dim.height);
    117    gc.setForeground(black);  //black
    118    //FontData fontData = mng.propertiesGui.stdButtonFont.getFontData();
    119    //fontData.
    120    gc.setLineWidth(1);
    121    gc.setForeground(black);  //black
    122    gc.drawRectangle(0,0,dim.width-1, dim.height-1);
    123    //The bar, colored:
    124    gc.setBackground(colorBorder[ixColor()]);  //black
    125    //gc.fillRectangle(1,dim.height -1 - value1 ,dim.width-2, value2 - value1);
    126    int start, size;
    127    if(pix0line() < pixvalue()){
    128      start = 1 + pix0line();
    129      size = pixvalue() - pix0line();  //difference start bar, end bar
    130    } else { //negative value
    131      start = pixvalue();
    132      size = pix0line() - pixvalue();
    133    }
    134    if(size > 150 && size < 230)
    135      stop();
    136    if(horizontal()){
    137      gc.fillRectangle(start,1 ,size, dim.height-2);
    138    } else {
    139      gc.fillRectangle(1,start ,dim.width-2, size);
    140    }
    141    //division lines for borders.
    142    if(pixLevel !=null){
    143      if(horizontal()){
    144        for(int pixel : pixLevel){
    145          gc.drawLine(pixel, 0, pixel, dim.height-1);
    146        }
    147      } else {
    148        for(int pixel : pixLevel){
    149          gc.drawLine(0, pixel, dim.width-1, pixel);
    150        }
    151      }
    152    }
    153    //gc.drawLine(3,dim.height-2,dim.width, dim.height-2);
    154  }
    155
    156
    157
    158
    159  public class BarWidget extends Canvas
    160        {
    161                BarWidget()
    162                {
    163                        super(wdgh.mng.getCurrentPanel(), 0);  //Canvas
    164                        wdgh.widgetSwt = this;
    165                        addPaintListener(paintListener);
    166
    167                }
    168
    169
    170          final PaintListener paintListener = new PaintListener(){
    171                        @Override
    172                        public void paintControl(PaintEvent e) { paintRoutine(BarWidget.this,e); }
    173          };
    174
    175          final Runnable redraw = new Runnable(){
    176                        @Override public void run()
    177                        { redraw();
    178                        }
    179                };
    180
    181
    182        }
    183
    184        void stop(){}
    185
    186
    187  @Override public void setBoundsPixel(int x, int y, int dx, int dy)
    188  { widgetSwt.setBounds(x,y,dx,dy);
    189  }
    190
    191
    192
    193  @Override public void removeWidgetImplementation()
    194  {
    195    widgetSwt.dispose();
    196    widgetSwt = null;
    197  }
    198
    199
    200  @Override
    201  public GralRectangle getPixelPositionSize()
    202  {
    203    // TODO Auto-generated method stub
    204    return null;
    205  }
    206
    207
    208}