    001package org.vishia.gral.swt;
    002
    003import java.util.LinkedList;
    004import java.util.List;
    005
    006import org.eclipse.swt.graphics.Color;
    007import org.eclipse.swt.graphics.Point;
    008import org.eclipse.swt.graphics.Rectangle;
    009import org.eclipse.swt.widgets.Composite;
    010import org.eclipse.swt.widgets.Control;
    011import org.eclipse.swt.widgets.Menu;
    012import org.eclipse.swt.widgets.Scrollable;
    013import org.eclipse.swt.widgets.Shell;
    014import org.eclipse.swt.widgets.TabFolder;
    015import org.eclipse.swt.widgets.TabItem;
    016import org.vishia.gral.base.GralWidget;
    017import org.vishia.gral.base.GralWidgetHelper;
    018import org.vishia.gral.base.GralMenu;
    019import org.vishia.gral.base.GralMng;
    020import org.vishia.gral.ifc.GralColor;
    021import org.vishia.gral.ifc.GralRectangle;
    022import org.vishia.gral.impl_ifc.GralWidgetImpl_ifc;
    023import org.vishia.util.Debugutil;
    024
    025/**The static methods of this class are called in some situations, where same functionality is need in some classes.
    026 * @author Hartmut Schorrig
    027 *
    028 */
    029public class SwtWidgetHelper implements GralWidgetImpl_ifc
    030{
    031
    032  /**Version and history
    033   * <ul>
    034   * <li>2011-11-18 Hartmut chg: {@link #setFocusOfTabSwt(Control)} is the implementation of all
    035   *   {@link org.vishia.gral.base.GralWidget#setFocusGThread()} implementations. It regards that a tab in a TabFolder
    036   *   should be selected if any widget inside the tab-panel is focused. Used extensive in JavaCommander.
    037   * </ul>
    038   *
    039   */
    040  public final static int version = 0x20111119;
    041
    042
    043  private static SwtMng mngs;
    044
    045  public final SwtMng mng;
    046
    047  public Control widgetSwt;
    048
    049
    050
    051  public SwtWidgetHelper(Control widgetSwt, SwtMng mng)
    052  { if(SwtWidgetHelper.mngs !=null){ assert(SwtWidgetHelper.mngs == mng); }
    053    else {SwtWidgetHelper.mngs = mng; }
    054    this.widgetSwt = widgetSwt;
    055    this.mng = mng;
    056  }
    057
    058
    059
    060
    061  public static GralColor getColor(Color swtColor)
    062  {
    063    int colorValue = swtColor.getBlue() << 16 + swtColor.getGreen() << 8 + swtColor.getRed();
    064    return GralColor.getColor(colorValue);
    065  }
    066
    067
    068  public static Color getColor(GralColor color){ return mngs.propertiesGuiSwt.colorSwt(color); }
    069
    070  public static GralColor setBackgroundColor(GralColor color, Control swtWidget)
    071  { Color colorSwt = getColor(color);
    072    Color colorSwtOld = swtWidget.getBackground();
    073    swtWidget.setBackground(colorSwt);
    074    return getColor(colorSwtOld);
    075  }
    076
    077
    078  public static GralColor setForegroundColor(GralColor color, Control swtWidget)
    079  {
    080    Color colorSwt = (Color)color.colorGuimpl;
    081    Color colorSwtOld = swtWidget.getForeground();
    082    swtWidget.setForeground(colorSwt);
    083    return getColor(colorSwtOld);
    084  }
    085
    086
    087  /**Sets the correct TabItem if any widget at this TabItem is focused. That is not done by swt graphic
    088   * on Control.setFocus().
    089   * @param control
    090   */
    091  public static boolean setFocusOfTabSwt(Control control)
    092  {
    093    List<Control> parents = new LinkedList<Control>();
    094    Control parent = control;
    095    while( parent !=null && (parent = parent.getParent())!=null){
    096      parents.add(parent);
    097    }
    098    for(Control parent1: parents){
    099      Object gralObj = parent1.getData();
    100      if(gralObj !=null && gralObj instanceof SwtPanel){
    101        SwtPanel gralPanel = (SwtPanel) gralObj;
    102        TabItem tabitem = gralPanel.itsTabSwt;
    103        if(tabitem !=null){
    104          tabitem.getParent().setSelection(tabitem);
    105        }
    106      }
    107      if(parent1 instanceof TabFolder){
    108        TabFolder tf = (TabFolder)parent1;
    109        tf.setFocus();
    110      }
    111    }
    112    if(control == null){
    113      return false;         //TODO should not be.
    114    }
    115    control.forceFocus();
    116    return control.setFocus();
    117
    118
    119  }
    120
    121
    122
    123  public void swtUpdateRedraw(){
    124    widgetSwt.update();
    125    widgetSwt.redraw();
    126  }
    127
    128
    129
    130  public boolean setFocusGThread(){ return widgetSwt.setFocus(); }
    131
    132  /**Sets the implementation widget vible or not.
    133   * @see org.vishia.gral.base.GralWidgImpl_ifc#setVisibleGThread(boolean)
    134   */
    135  public void setVisibleGThread(boolean bVisible){
    136    widgetSwt.setVisible(bVisible);
    137  }
    138
    139
    140  public void removeWidgetImplementation()
    141  {
    142    if(widgetSwt !=null){
    143      widgetSwt.dispose();
    144      widgetSwt = null;
    145    }
    146  }
    147
    148
    149  public void setBoundsPixel(int x, int y, int dx, int dy)
    150  { widgetSwt.setBounds(x,y,dx,dy);
    151  }
    152
    153
    154  public GralRectangle getPixelPositionSize(){
    155    int posx = 0, posy = 0;
    156    Rectangle r = widgetSwt.getBounds();
    157    Composite parent;
    158    if(widgetSwt instanceof Composite){
    159      parent = (Composite) widgetSwt; //start with them, maybe the shell itself
    160    } else {
    161      parent = widgetSwt.getParent();
    162    }
    163    Rectangle pos;
    164    while( !( parent instanceof Shell ) ){
    165      pos = parent.getBounds();
    166      posx += pos.x; posy += pos.y;
    167      parent = parent.getParent();
    168    }
    169    assert(parent instanceof Shell);
    170    Rectangle s = parent.getClientArea();
    171    pos = parent.getBounds();
    172    int dframe = (pos.width - s.width) /2;   //width of the frame line.
    173    posx += r.x + dframe;               //absolute position of the client area!
    174    posy += r.y + (pos.height - s.height) - dframe;
    175    int dx, dy;
    176    if(parent == widgetSwt){
    177      dx = s.width;
    178      dy = s.height;
    179    } else {
    180      dx = r.width;
    181      dy = r.height;
    182    }
    183    GralRectangle posSize = new GralRectangle(posx, posy, dx, dy);
    184    return posSize;
    185  }
    186
    187
    188
    189  /**
    190   * @param widg
    191   * @return
    192   * @deprecated this routine is implemented in {@link SwtWidgetHelper}
    193   *   which can be used for all widgets (new concept).
    194   */
    195  @Deprecated
    196  public static GralRectangle getPixelPositionSize(Control widg){
    197    int posx = 0, posy = 0;
    198    Rectangle r = widg.getBounds();
    199    Composite parent;
    200    if(widg instanceof Composite){
    201      parent = (Composite) widg; //start with them, maybe the shell itself
    202    } else {
    203      parent = widg.getParent();
    204    }
    205    Rectangle pos;
    206    while( !( parent instanceof Shell ) ){
    207      pos = parent.getBounds();
    208      posx += pos.x; posy += pos.y;
    209      parent = parent.getParent();
    210    }
    211    assert(parent instanceof Shell);
    212    Rectangle s = parent.getClientArea();
    213    pos = parent.getBounds();
    214    int dframe = (pos.width - s.width) /2;   //width of the frame line.
    215    posx += r.x + dframe;               //absolute position of the client area!
    216    posy += r.y + (pos.height - s.height) - dframe;
    217    int dx, dy;
    218    if(parent == widg){
    219      dx = s.width;
    220      dy = s.height;
    221    } else {
    222      dx = r.width;
    223      dy = r.height;
    224    }
    225    GralRectangle posSize = new GralRectangle(posx, posy, dx, dy);
    226    return posSize;
    227  }
    228
    229
    230
    231
    232  @Override
    233  public void specifyContextMenu(GralMenu menu)
    234  {
    235    Menu swtMenu = (Menu)menu.getMenuImpl();
    236    if(swtMenu == null) {
    237      //GralMenu._GraphicImpl implMenu = new SwtMenu(menu, widgetSwt);
    238      //implMenu._implMenu();
    239      swtMenu = (Menu)menu.getMenuImpl();
    240    }
    241    try{
    242      //widgetSwt.setMenu(swtMenu);
    243    } catch(IllegalArgumentException exc){
    244      Debugutil.stop();
    245    }
    246
    247  }
    248
    249
    250
    251
    252}