001package org.vishia.gral.swt;
002
003import org.eclipse.swt.graphics.Rectangle;
004import org.eclipse.swt.widgets.Composite;
005import org.eclipse.swt.widgets.Control;
006import org.eclipse.swt.widgets.Shell;
007import org.vishia.gral.base.GralWidgImpl_ifc;
008import org.vishia.gral.ifc.GralRectangle;
009
010/**This class wraps a SWT widget. In this form it is able to reference in the SWT-independent GRAL
011 * @author Hartmut Schorrig
012 *
013 */
014public class SwtWidgetSimpleWrapper implements GralWidgImpl_ifc
015{
016  protected Control widgetSwt;
017
018  protected final SwtMng mng;
019  
020  public SwtWidgetSimpleWrapper(Control widgetSwt, SwtMng mng)
021  { this.mng = mng;
022    this.widgetSwt = widgetSwt;
023  }
024
025  
026  @Override public void repaintGthread(){
027    widgetSwt.redraw();
028  }
029
030  
031  public void swtUpdateRedraw(){
032    widgetSwt.update();
033    widgetSwt.redraw();
034  }
035  
036  
037  
038  @Override public Object getWidgetImplementation()
039  { return widgetSwt;
040  }
041  
042  @Override public boolean setFocusGThread(){ return widgetSwt.setFocus(); }
043
044  @Override public void setVisibleGThread(boolean bVisible) { widgetSwt.setVisible(bVisible); }
045
046
047  @Override public void removeWidgetImplementation()
048  {
049    if(widgetSwt !=null){ 
050      widgetSwt.dispose();
051      widgetSwt = null;
052    }
053  }
054
055
056  @Override public void setBoundsPixel(int x, int y, int dx, int dy)
057  { widgetSwt.setBounds(x,y,dx,dy);
058  }
059  
060  
061  @Override public GralRectangle getPixelPositionSize(){
062    int posx = 0, posy = 0;
063    Rectangle r = widgetSwt.getBounds();
064    Composite parent;
065    if(widgetSwt instanceof Composite){
066      parent = (Composite) widgetSwt; //start with them, maybe the shell itself
067    } else {
068      parent = widgetSwt.getParent();
069    }
070    Rectangle pos;
071    while( !( parent instanceof Shell ) ){
072      pos = parent.getBounds();
073      posx += pos.x; posy += pos.y;
074      parent = parent.getParent();
075    }
076    assert(parent instanceof Shell);
077    Rectangle s = parent.getClientArea();
078    pos = parent.getBounds();
079    int dframe = (pos.width - s.width) /2;   //width of the frame line.
080    posx += r.x + dframe;               //absolute position of the client area!
081    posy += r.y + (pos.height - s.height) - dframe;
082    int dx, dy;
083    if(parent == widgetSwt){
084      dx = s.width;
085      dy = s.height;
086    } else {
087      dx = r.width;
088      dy = r.height;
089    }
090    GralRectangle posSize = new GralRectangle(posx, posy, dx, dy);
091    return posSize;
092  }
093
094
095  
096  
097
098}