    001package org.vishia.gral.swt;
    002
    003import java.util.List;
    004
    005import org.eclipse.swt.events.MouseEvent;
    006import org.eclipse.swt.events.MouseListener;
    007import org.eclipse.swt.events.PaintEvent;
    008import org.eclipse.swt.events.PaintListener;
    009import org.eclipse.swt.graphics.Color;
    010import org.eclipse.swt.graphics.Font;
    011import org.eclipse.swt.graphics.GC;
    012import org.eclipse.swt.graphics.Point;
    013import org.eclipse.swt.graphics.Rectangle;
    014import org.eclipse.swt.widgets.Canvas;
    015import org.eclipse.swt.widgets.Composite;
    016import org.eclipse.swt.widgets.Control;
    017import org.vishia.gral.base.GralWidgImpl_ifc;
    018import org.vishia.gral.ifc.GralColor;
    019import org.vishia.gral.ifc.GralRectangle;
    020import org.vishia.gral.widget.GralHorizontalSelector;
    021
    022/**This class is a selector in one line. You can set the cursor into the field.
    023 * @author Hartmut Schorrig
    024 *
    025 */
    026public class SwtHorizontalSelector extends GralHorizontalSelector.GraphicImplAccess implements GralWidgImpl_ifc
    027{
    028  /**Version, history and copyright/copyleft.
    029   * <ul>
    030   * <li>2013-06-18 Hartmut created, new idea.
    031   * </ul>
    032   *
    033   * <b>Copyright/Copyleft</b>:<br>
    034   * For this source the LGPL Lesser General Public License,
    035   * published by the Free Software Foundation is valid.
    036   * It means:
    037   * <ol>
    038   * <li> You can use this source without any restriction for any desired purpose.
    039   * <li> You can redistribute copies of this source to everybody.
    040   * <li> Every user of this source, also the user of redistribute copies
    041   *    with or without payment, must accept this license for further using.
    042   * <li> But the LPGL is not appropriate for a whole software product,
    043   *    if this source is only a part of them. It means, the user
    044   *    must publish this part of source,
    045   *    but doesn't need to publish the whole source of the own product.
    046   * <li> You can study and modify (improve) this source
    047   *    for own using or for redistribution, but you have to license the
    048   *    modified sources likewise under this LGPL Lesser General Public License.
    049   *    You mustn't delete this Copyright/Copyleft inscription in this source file.
    050   * </ol>
    051   * If you intent to use this source without publishing its usage, you can get
    052   * a second license subscribing a special contract with the author.
    053   *
    054   * @author Hartmut Schorrig = hartmut.schorrig@vishia.de
    055   */
    056  //@SuppressWarnings("hiding")
    057  public static final int version = 20130618;
    058
    059  //private final GralHorizontalSelector<?> wdgGral;
    060
    061  //public final GralWidgetAccess wdgGralAccess;
    062
    063
    064  /**It contains the association to the swt widget (Control) and the {@link SwtMng}
    065   * and implements some methods of {@link GralWidgImpl_ifc} which are delegate from this.
    066   */
    067  private final SwtWidgetHelper swtWdgW;
    068
    069
    070  //protected Canvas widgetSwt;
    071
    072  //protected final SwtMng mng;
    073
    074
    075
    076  private Font fontText;
    077
    078
    079
    080  public SwtHorizontalSelector(SwtMng mng, GralHorizontalSelector<?> wdgGral)
    081  { super(wdgGral, mng.mng);  //Invoke constructor of the super class, with knowledge of its outer class.
    082    //this.mng = mng;
    083    Composite panel = (Composite)outer.pos().panel.getWidgetImplementation();
    084    //widgetSwt = new Canvas(panel,0);
    085    super.wdgimpl = this.swtWdgW = new SwtWidgetHelper(new Canvas(panel,0), mng);
    086    swtWdgW.widgetSwt.setData(wdgGral);
    087    swtWdgW.widgetSwt.addPaintListener(paintListener);
    088    swtWdgW.widgetSwt.addMouseListener(mouseListener);
    089    mng.setBounds_(wdgGral.pos(), swtWdgW.widgetSwt);
    090    float ySize = outer.pos().height();
    091    char size1 = ySize > 3? 'B' : 'A';
    092    switch(size1){
    093      case 'A': fontText = mng.propertiesGuiSwt.stdInputFont; break;
    094      case 'B': fontText = mng.propertiesGuiSwt.stdButtonFont; break;
    095      default: throw new IllegalArgumentException("param size must be A or B");
    096    }
    097    super.execAfterCreationImplWidget();
    098
    099  }
    100
    101
    102
    103  @Override public void repaintGthread(){ swtWdgW.swtUpdateRedraw(); }
    104
    105
    106  @Override public Object getWidgetImplementation(){ return swtWdgW.widgetSwt; }
    107
    108  @Override public boolean setFocusGThread(){ return swtWdgW.setFocusGThread(); }
    109
    110  @Override public void setVisibleGThread(boolean bVisible) { super.setVisibleState(bVisible); swtWdgW.setVisibleGThread(bVisible); }
    111
    112  @Override public void removeWidgetImplementation(){ swtWdgW.removeWidgetImplementation(); }
    113
    114  @Override public void setBoundsPixel(int x, int y, int dx, int dy){ swtWdgW.setBoundsPixel(x, y, dx, dy); }
    115
    116
    117  @Override public GralRectangle getPixelPositionSize(){ return swtWdgW.getPixelPositionSize(); }
    118
    119
    120  //@Override public boolean setVisible(boolean visible){ return swtWidgWrapper.setVisible(visible); }
    121
    122
    123
    124
    125
    126  @SuppressWarnings("unchecked")
    127  protected void paintControl(Canvas swt, PaintEvent e){
    128    GC gc = e.gc;
    129    //gc.d
    130    Rectangle dim = swt.getBounds();
    131    GralHorizontalSelector.Item<?> actItem = super.actItem();
    132    int nrActItem = super.nrItem();
    133    Color swtColorBack = swtWdgW.mng.getColorImpl(super.outer.colorBack);
    134    Color swtColorText = swtWdgW.mng.getColorImpl(super.outer.colorText);
    135    Color swtColorSelect = swtWdgW.mng.getColorImpl(super.outer.colorSelect);
    136    gc.setBackground(swtColorBack);
    137    swt.drawBackground(e.gc, dim.x+1, dim.y+1, dim.width-1, dim.height-1);
    138    gc.setFont(fontText);
    139    //FontData fontData = mng.propertiesGui.stdButtonFont.getFontData();
    140    //fontData.
    141    gc.setForeground(swtColorBack);
    142    gc.fillRectangle(1,0,dim.width-1, dim.height);
    143    int xArrow = 20;
    144    super.calcLeftTab(dim.width, xArrow);
    145    int xText = 2;
    146    int yText = 0;
    147    int ixLeftItem = super.nrLeftTab();
    148    if(ixLeftItem >0){
    149      gc.setForeground(swtColorText);
    150      gc.drawString("<<", xText+4, yText);
    151      xText += 20;
    152    }
    153    //
    154    //paint tabs
    155    //
    156    if(ixLeftItem >=0){
    157      int ixItem = ixLeftItem;
    158      int zItem = super.nrofTabs();
    159      if(ixItem >= zItem){
    160        ixItem = zItem -1;
    161      }
    162      do {
    163        GralHorizontalSelector.Item item = super.tab(ixItem);
    164        if(item.xSize == 0){
    165          Point size = gc.stringExtent(item.text);
    166          if(size.x < 150 - 10){ item.xSize = size.x + 10;}
    167          else { item.xSize = 150; }
    168        }
    169        int xEnd = xText + item.xSize;
    170        if(xEnd < (dim.width - (ixItem == (zItem-1) ? xArrow +4 : 4))){
    171          if(ixItem == nrActItem){
    172            gc.setForeground(swtColorSelect);  //black
    173            gc.setLineWidth(2);
    174          } else {
    175            gc.setForeground(swtColorText);
    176            gc.setLineWidth(1);
    177          }
    178          gc.drawString(item.text, xText+4, yText);
    179          gc.drawLine(xText+1, 3, xText+1, dim.height);
    180          gc.drawLine(xText+1, 3, xText+4, 0);
    181          gc.drawLine(xEnd-1, 3, xEnd-1, dim.height);
    182          gc.drawLine(xEnd-1, 3, xEnd-4, 0);
    183          gc.drawLine(xEnd-4, 0, xEnd-item.xSize+4, 0);
    184          xText = xEnd;
    185          ixItem +=1;
    186        } else break;
    187      } while(ixItem < zItem);
    188      if(ixItem < zItem){
    189        gc.setForeground(swtColorText);
    190        gc.drawString(">>", dim.width-16, yText);
    191      }
    192    }
    193  }
    194
    195
    196
    197  protected void mouseDown(MouseEvent e)
    198  {
    199    super.findTab(e.x);
    200    swtWdgW.widgetSwt.redraw();
    201
    202  }
    203
    204
    205  public void mouseUp(MouseEvent e)
    206  {
    207    Rectangle dim = swtWdgW.widgetSwt.getBounds();
    208    if(e.button == 1){
    209      if(e.y >0 && e.y < dim.height){
    210        super.setDstToActItem();
    211      } else {
    212        super.clearDstItem();
    213      }
    214      swtWdgW.widgetSwt.redraw();  //because selection is changed.
    215    }
    216    //else: content menu does the action.
    217  }
    218
    219
    220
    221  PaintListener paintListener = new PaintListener(){
    222    @Override public void paintControl(PaintEvent e) {
    223      SwtHorizontalSelector.this.paintControl((Canvas)swtWdgW.widgetSwt, e);
    224    }
    225  };
    226
    227
    228
    229  MouseListener mouseListener = new MouseListener(){
    230
    231    @Override
    232    public void mouseDoubleClick(MouseEvent e)
    233    {
    234      // TODO Auto-generated method stub
    235
    236    }
    237
    238    @Override
    239    public void mouseDown(MouseEvent e)
    240    { SwtHorizontalSelector.this.mouseDown(e);
    241    }
    242
    243    @Override
    244    public void mouseUp(MouseEvent e)
    245    { SwtHorizontalSelector.this.mouseUp(e);
    246    }
    247
    248  };
    249
    250
    251
    252
    253
    254}