    001package org.vishia.gral.awt;
    002
    003import java.awt.Component;
    004import java.awt.Composite;
    005import java.awt.Container;
    006import java.awt.Dimension;
    007import java.awt.Font;
    008import java.awt.Color;
    009import java.awt.Frame;
    010import java.awt.Label;
    011import java.awt.Menu;
    012import java.awt.MenuBar;
    013import java.awt.Point;
    014import java.awt.PopupMenu;
    015import java.awt.Rectangle;
    016import java.awt.TextArea;
    017import java.awt.TextField;
    018import java.awt.Window;
    019import java.awt.event.FocusEvent;
    020import java.awt.event.FocusListener;
    021import java.awt.event.KeyEvent;
    022import java.awt.event.KeyListener;
    023import java.io.InputStream;
    024
    025import org.vishia.byteData.VariableContainer_ifc;
    026import org.vishia.gral.base.GralButton;
    027import org.vishia.gral.base.GralCurveView;
    028import org.vishia.gral.base.GralGraphicTimeOrder;
    029import org.vishia.gral.base.GralGraphicThread;
    030import org.vishia.gral.base.GralHtmlBox;
    031import org.vishia.gral.base.GralLed;
    032import org.vishia.gral.base.GralMenu;
    033import org.vishia.gral.base.GralMenu._GraphicImpl;
    034import org.vishia.gral.base.GralPanelActivated_ifc;
    035import org.vishia.gral.base.GralPanelContent;
    036import org.vishia.gral.base.GralPos;
    037import org.vishia.gral.base.GralTabbedPanel;
    038import org.vishia.gral.base.GralTable;
    039import org.vishia.gral.base.GralTextBox;
    040import org.vishia.gral.base.GralTextField;
    041import org.vishia.gral.base.GralWidget;
    042import org.vishia.gral.base.GralMng;
    043import org.vishia.gral.base.GralWindow;
    044import org.vishia.gral.ifc.GralColor;
    045import org.vishia.gral.ifc.GralFileDialog_ifc;
    046import org.vishia.gral.ifc.GralRectangle;
    047import org.vishia.gral.ifc.GralUserAction;
    048import org.vishia.gral.ifc.GralWindow_ifc;
    049import org.vishia.gral.widget.GralHorizontalSelector;
    050import org.vishia.gral.widget.GralLabel;
    051import org.vishia.msgDispatch.LogMessage;
    052
    053public class AwtWidgetMng extends GralMng.ImplAccess // implements GralMngBuild_ifc, GralMng_ifc
    054{
    055
    056  final AwtProperties propertiesGuiAwt;
    057
    058  //final Frame mainWindowAwt;
    059
    060
    061  /**The standard listener or action for mouse events, able to assign to all widgets which does not need an extra mouse behaviour. */
    062  final AwtGralMouseListener.MouseListenerGralAction mouseStdAction = new AwtGralMouseListener.MouseListenerGralAction(null);
    063
    064  /**Creates an instance.
    065   * @param guiContainer The container where the elements are stored in.
    066   * @param width in display-units for the window's width, the number of pixel depends from param displaySize.
    067   * @param height in display-units for the window's height, the number of pixel depends from param displaySize.
    068   * @param displaySize character 'A' to 'E' to determine the size of the content
    069   *        (font size, pixel per cell). 'A' is the smallest, 'E' the largest size. Default: use 'C'.
    070   */
    071  public AwtWidgetMng(AwtProperties propertiesGui
    072    //, VariableContainer_ifc variableContainer
    073    , LogMessage log
    074    )
    075  { super(GralMng.get(), propertiesGui);
    076    //mainWindowAwt = window;
    077    this.propertiesGuiAwt = propertiesGui;
    078    //mainWindowAwt.addKeyListener(mainKeyListener);
    079  }
    080
    081
    082
    083  @Override public Container getCurrentPanel(){ return (Container)pos().panel.getWidgetImplementation(); }
    084
    085
    086  public Container getWidgetsPanel(GralWidget widg){
    087    GralPos pos = widg.pos();
    088    if(pos == null) { pos = pos(); } //from GralMng
    089    return ((Container)pos.panel.getWidgetImplementation());
    090  }
    091
    092
    093
    094  @Override public void createImplWidget_Gthread(GralWidget widgg){
    095    if(widgg instanceof GralLabel){
    096      new AwtLabel((GralLabel)widgg, this);
    097    } else if(widgg instanceof GralTextField){
    098      new AwtTextField((GralTextField)widgg, this);
    099    } else if(widgg instanceof GralHorizontalSelector<?>){
    100      //SwtHorizontalSelector swtSel = new SwtHorizontalSelector(this, (GralHorizontalSelector<?>)widgg);
    101      mng.registerWidget(widgg);
    102    } else if(widgg instanceof GralTable<?>){
    103      //AwtTable.addTable((GralTable<?>)widgg, this);
    104    } else if(widgg instanceof GralButton){
    105      new AwtButton((GralButton)widgg, this);
    106    }
    107  }
    108
    109
    110
    111
    112  /** Adds a text field for showing or editing a text value.
    113   *
    114   * @param sName The registering name
    115   * @param width Number of grid units for length
    116   * @param editable true than edit-able, false to show content
    117   * @param prompt If not null, than a description label is shown
    118   * @param promptStylePosition Position and size of description label:
    119   *   upper case letter: normal font, lower case letter: small font
    120   *   'l' left, 't' top (above field)
    121   * @return
    122  //@Override
    123  public GralTextField addTextField(String name, boolean editable, String prompt, String promptStylePosition)
    124  { Container parent = getCurrentPanel();
    125    AwtTextField widg = new AwtTextField(name, editable ? 'T' : 'S', this, parent);
    126    widg.setPanelMng(mng);
    127    widg.widgetAwt.setFont(propertiesGuiAwt.stdInputFont);
    128    widg.widgetAwt.setEditable(editable);
    129    widg.widgetAwt.setBackground(propertiesGuiAwt.colorAwt(GralColor.getColor("wh")));
    130    //widg.widgetAwt.addFocusListener(focusListener);
    131
    132    //widg.widgetAwt.addMouseListener(mouseClickForInfo);
    133    int x =-1, y=-1;
    134    if(x >=0 && y >=0){
    135      //edit.setBounds(x, y, dx * properties.xPixelUnit(), 2* properties.yPixelUnit());
    136    } else {
    137      //widget.setSize(xIncr * propertiesGui.xPixelUnit()-1, 2* propertiesGui.yPixelUnit()-1);
    138    }
    139    //
    140    if(prompt != null && promptStylePosition.startsWith("t")){
    141      mng.setNextPosition();
    142      final Font promptFont;
    143      char sizeFontPrompt;
    144      GralRectangle boundsAll, boundsPrompt, boundsField;
    145      final GralPos posPrompt = new GralPos(), posField = new GralPos();
    146      boundsAll = mng.calcWidgetPosAndSize(this.pos(), 800, 600, 100, 20);
    147      float ySize = pos().height();
    148      //float xSize = pos.width();
    149          posPrompt.setPosition(this.pos(), GralPos.same, ySize * 0.37f + GralPos.size, GralPos.same, GralPos.same, 0, '.');
    150          posField.setPosition(this.pos(), GralPos.refer + ySize * 0.37f, GralPos.same, GralPos.same, GralPos.same, 0, '.');
    151      promptFont = propertiesGuiAwt.smallPromptFont;
    152      boundsPrompt = mng.calcWidgetPosAndSize(posPrompt, boundsAll.dx, boundsAll.dy, 10,100);
    153      boundsField = mng.calcWidgetPosAndSize(posField, boundsAll.dx, boundsAll.dy, 10,100);
    154      Label wgPrompt = new Label();
    155      parent.add(wgPrompt);
    156      wgPrompt.setFont(promptFont);
    157      wgPrompt.setText(prompt);
    158      /*TODO
    159      Point promptSize = wgPrompt.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
    160      if(promptSize.x > boundsPrompt.dx){
    161        boundsPrompt.dx = promptSize.x;  //use the longer value, if the prompt text is longer as the field.
    162      }
    163      wgPrompt.setBounds(boundsPrompt.x, boundsPrompt.y, boundsPrompt.dx, boundsPrompt.dy+1);
    164      widgetSwt.setBounds(boundsField.x, boundsField.y, boundsField.dx, boundsField.dy);
    165      posUsed = true;
    166      *//*
    167    } else {
    168      //without prompt
    169      setPosAndSize_(widg.widgetAwt);
    170    }
    171    //
    172    if(widg.name !=null && widg.name.charAt(0) == '$'){
    173      widg.name = sCurrPanel() + widg.name.substring(1);
    174    }
    175    //link the widget with is information together.
    176    widg.widgetAwt.setData(widg);
    177    if(widg.name !=null){
    178      if(!editable){
    179        mng.registerShowField(widg);
    180      }
    181    }
    182    mng.registerWidget(widg);
    183    return widg;
    184
    185  }
    186  */
    187
    188
    189
    190
    191  /** Adds a text box for showing or editing a text in multi lines.
    192   *
    193   * @param sName The registering name
    194   * @param width Number of grid units for length
    195   * @param editable true than edit-able, false to show content
    196   * @param prompt If not null, than a description label is shown
    197   * @param promptStylePosition Position and size of description label:
    198   *   upper case letter: normal font, lower case letter: small font
    199   *   'l' left, 't' top (above field)
    200   * @return
    201  //@Override
    202  public GralTextBox addTextBox(String name, boolean editable, String prompt, char promptStylePosition)
    203  { Container parent = (Container)pos().panel.getWidgetImplementation();
    204    AwtTextBox widgetSwt = new AwtTextBox(name, parent, 0, this);
    205    GralWidget widgetInfo = widgetSwt;
    206    widgetInfo.setPanelMng(mng);
    207    //Text widgetSwt = new Text(((PanelSwt)pos.panel).getPanelImpl(), SWT.MULTI);
    208    widgetSwt.textFieldSwt.setFont(propertiesGuiAwt.stdInputFont);
    209    widgetSwt.textFieldSwt.setEditable(editable);
    210    if(editable)
    211      stop();
    212    widgetSwt.textFieldSwt.setBackground(propertiesGuiAwt.colorAwt(GralColor.getColor("pbl")));
    213    //widgetSwt.textFieldSwt.addMouseListener(mouseClickForInfo);
    214    setPosAndSize_(widgetSwt.textFieldSwt);
    215    if(prompt != null && promptStylePosition == 't'){
    216      final int yPixelField;
    217      final Font promptFont;
    218      int ySize = (int)(pos().height());
    219      switch(ySize){
    220      case 3:  promptFont = propertiesGuiAwt.smallPromptFont;
    221               yPixelField = propertiesGuiAwt.yPixelUnit() * 2 -3;
    222               break;
    223      case 2:  promptFont = propertiesGuiAwt.smallPromptFont;
    224               yPixelField = (int)(1.5F * mng.propertiesGui.yPixelUnit());
    225               break;
    226      default: promptFont = propertiesGuiAwt.smallPromptFont;
    227               yPixelField = mng.propertiesGui.yPixelUnit() * 2 -3;
    228      }//switch
    229      Rectangle boundsField = widgetSwt.textFieldSwt.getBounds();
    230      Rectangle boundsPrompt = new Rectangle(boundsField.x, boundsField.y-3  //occupy part of field above, only above the normal letters
    231        , boundsField.width, boundsField.height );
    232
    233      if(promptStylePosition == 't'){
    234        boundsPrompt.height -= (yPixelField -4);
    235        boundsPrompt.y -= 1;
    236
    237        boundsField.y += (boundsField.height - yPixelField );
    238        boundsField.height = yPixelField;
    239      }
    240      Label wgPrompt = new Label();
    241      parent.add(wgPrompt);
    242      wgPrompt.setFont(promptFont);
    243      wgPrompt.setText(prompt);
    244      widgetSwt.textFieldSwt.setBounds(boundsField);
    245      wgPrompt.setBounds(boundsPrompt);
    246    }
    247    //
    248    if(widgetInfo.name !=null && widgetInfo.name.charAt(0) == '$'){
    249      widgetInfo.name = sCurrPanel() + widgetInfo.name.substring(1);
    250    }
    251    //link the widget with is information together.
    252    widgetSwt.textFieldSwt.setData(widgetInfo);
    253    if(widgetInfo.name !=null){
    254      if(!editable){
    255        mng.registerShowField(widgetInfo);
    256      }
    257    }
    258    mng.registerWidget(widgetInfo);
    259    return widgetSwt;
    260
    261  }
    262  */
    263
    264
    265  @Override public GralHtmlBox addHtmlBox(String name){
    266    return null;
    267  }
    268
    269
    270  @Override public GralCurveView addCurveViewY(String sName, int nrofXvalues, GralCurveView.CommonCurve common)
    271  {
    272    // TODO Auto-generated method stub
    273    return null;
    274  }
    275
    276  @Override
    277  public GralWidget addFocusAction(String sName, GralUserAction action, String sCmdEnter,
    278    String sCmdRelease)
    279  {
    280    // TODO Auto-generated method stub
    281    return null;
    282  }
    283
    284  @Override
    285  public void addFocusAction(GralWidget widgetInfo, GralUserAction action, String sCmdEnter,
    286    String sCmdRelease)
    287  {
    288    // TODO Auto-generated method stub
    289
    290  }
    291
    292  @Override
    293  public Object addImage(String sName, InputStream imageStream, int height, int width, String sCmd)
    294  {
    295    // TODO Auto-generated method stub
    296    return null;
    297  }
    298
    299  @Override
    300  public GralWidget addSlider(String sName, GralUserAction action, String sShowMethod,
    301    String sDataPath)
    302  {
    303    // TODO Auto-generated method stub
    304    return null;
    305  }
    306
    307  @Override
    308  public GralTable addTable(String sName, int height, int[] columnWidths)
    309  {
    310    // TODO Auto-generated method stub
    311    return null;
    312  }
    313
    314  public void add(GralTable<?> table){}
    315
    316
    317  @Override @Deprecated
    318  public GralWidget addText(String sText, char size, int color)
    319  {
    320    // TODO Auto-generated method stub
    321    return null;
    322  }
    323
    324
    325
    326
    327
    328  @Override protected GralMenu XXXaddPopupMenu(String sName){
    329    //Control panelSwt = (Control)pos.panel.getPanelImpl();
    330    //SwtMenu menu = new SwtMenu(sName, panelSwt, this);
    331    return null; //menu;
    332  }
    333
    334
    335  @Override protected GralMenu createContextMenu(GralWidget widg){
    336    Component widgSwt = (Component)widg._wdgImpl.getWidgetImplementation();
    337    GralMenu menu = new GralMenu(); new AwtMenu(widg, widgSwt, mng);  //TODO
    338    PopupMenu menuAwt = (PopupMenu)menu.getMenuImpl();
    339    widgSwt.add(menuAwt);
    340    menuAwt.show(widgSwt, 10, 10);
    341    return menu;
    342  }
    343
    344
    345
    346  @Override protected GralMenu createMenuBar(GralWindow windg){
    347    Frame windowAwt = (Frame)windg.getWidgetImplementation();
    348    GralMenu menu = new GralMenu(); new AwtMenu(windg, windowAwt, mng);  //TODO
    349    return menu;
    350  }
    351
    352
    353
    354
    355
    356
    357
    358  @Override public GralPanelContent createCompositeBox(String name)
    359  {
    360      //Composite box = new Composite(graphicFrame, 0);
    361      Container box = new Container();
    362      Container parent = (Container)pos().panel.getWidgetImplementation();
    363
    364      parent.add(box);
    365      setPosAndSize_(mng.getPosOldPositioning(), box);
    366      Dimension size = box.getSize();
    367      GralPanelContent panel = new AwtPanel(name, mng, box);
    368      //mng.registerPanel(panel);
    369      return panel;
    370  }
    371
    372  @Override
    373  public GralFileDialog_ifc createFileDialog()
    374  {
    375    // TODO Auto-generated method stub
    376    return null;
    377  }
    378
    379  @Override
    380  public GralPanelContent createGridPanel(String namePanel, GralColor backGround, int xG, int yG,
    381    int xS, int yS)
    382  {
    383    // TODO Auto-generated method stub
    384    return null;
    385  }
    386
    387  @Override
    388  public GralTabbedPanel addTabbedPanel(String namePanel, GralPanelActivated_ifc user,
    389    int properties)
    390  {
    391    // TODO Auto-generated method stub
    392    return null;
    393  }
    394
    395  @Override
    396  public GralWindow createWindow(String name, String title, int windPros)
    397  {
    398    // TODO Auto-generated method stub
    399    return null;
    400  }
    401
    402
    403  @Override public void createSubWindow(GralWindow windowGral){
    404    AwtSubWindow windowSwt = new AwtSubWindow(windowGral);
    405    //new SwtSubWindow(name, swtDevice.displaySwt, title, windProps, this);
    406    GralRectangle rect = calcPositionOfWindow(windowGral.pos());
    407    windowSwt.window.setBounds(rect.x, rect.y, rect.dx, rect.dy );
    408    //window.window.redraw();
    409    //window.window.update();
    410    windowGral._wdgImpl = windowSwt;
    411
    412  }
    413
    414  /**Calculates the position as absolute value on screen from a given position inside a panel.
    415   * @param posWindow contains any {@link GralPos#panel}. Its absolute position will be determined.
    416   *   from that position and size the absolute postion will be calculate, with this given grid positions
    417   *   inside the panel.
    418   * @return Absolute pixel coordinate.
    419   */
    420  GralRectangle calcPositionOfWindow(GralPos posWindow)
    421  {
    422    final GralRectangle windowFrame;
    423    if(posWindow.panel !=null) {
    424      Object awtWidg = posWindow.panel.getWidgetImplementation();
    425      Window parentFrame = (Frame)awtWidg; //((SwtPanel)(swtWidg)).panelComposite; //(Control)posWindow.panel.getPanelImpl();
    426      Point loc;
    427      windowFrame = getPixelUseableAreaOfWindow(posWindow.panel);
    428    } else {
    429      windowFrame = new GralRectangle(0,0,800,600);
    430    }
    431    int dxFrame = 400, dyFrame = 300;  //need if posWindow has coordinates from right or in percent
    432    Rectangle rectParent = null;
    433    /*
    434    if(parentFrame == window){
    435      dxFrame = windowFrame.dx; dyFrame = windowFrame.dy;
    436    } else {
    437      rectParent = parentFrame.getBounds();
    438      dxFrame = rectParent.width; dyFrame = rectParent.height;
    439    }
    440    */
    441    final GralRectangle rectangle = mng.calcWidgetPosAndSize(posWindow, dxFrame, dyFrame, 400, 300);
    442    rectangle.x += windowFrame.x;
    443    rectangle.y += windowFrame.y;
    444    /*
    445    //
    446    while ( parentFrame != window){ //The Shell is the last parentFrame
    447      //the bounds are relative to its container. Get all parent container and add all positions
    448      //until the shell is reached.
    449      rectParent = parentFrame.getBounds();
    450      rectangle.x += rectParent.x;
    451      rectangle.y += rectParent.y;
    452      parentFrame = parentFrame.getParent();
    453    }
    454    */
    455    return rectangle;
    456  }
    457
    458
    459
    460  GralRectangle getPixelUseableAreaOfWindow(GralWidget widgg)
    461  { Object oControl = widgg._wdgImpl.getWidgetImplementation();
    462    Frame control = (Frame)oControl;
    463    Frame window = control;
    464    Rectangle rectWindow = window.getBounds();
    465    Rectangle rectWindowArea = rectWindow; //window.getClientArea();  //it is inclusive the menu bar.
    466    //Problem: the x and y of client are are 0, it may bettet that they are the left top corner
    467    //inside the shell window.
    468    //assume that the client area is on bottom of the shell. Calculate top position:
    469    int dxBorder = rectWindow.width - rectWindowArea.width;
    470    int xPos = rectWindow.x + dxBorder/2;
    471    int dyTitleMenu = (rectWindow.height - rectWindowArea.height) - dxBorder;  //border and title bar
    472    MenuBar menu = window.getMenuBar();
    473    if(menu !=null){
    474      //assume that the menu has the same hight as title bar, there is not a way to determine it else
    475      dyTitleMenu *=2;
    476    }
    477    int yPos = rectWindow.y + dxBorder/2 + dyTitleMenu;
    478    GralRectangle ret = new GralRectangle(xPos, yPos, rectWindowArea.width, rectWindowArea.height - dyTitleMenu);
    479    return ret;
    480  }
    481
    482
    483
    484
    485  @Override
    486  public boolean remove(GralPanelContent compositeBox)
    487  {
    488    // TODO Auto-generated method stub
    489    return false;
    490  }
    491
    492
    493
    494  @Override public Color getColorImpl(GralColor color) { return propertiesGuiAwt.colorAwt(color); }
    495
    496  @Override
    497  public String getValueFromWidget(GralWidget widgetDescr)
    498  {
    499    // TODO Auto-generated method stub
    500    return null;
    501  }
    502
    503
    504  @Override
    505  public void redrawWidget(String sName)
    506  {
    507    // TODO Auto-generated method stub
    508
    509  }
    510
    511  @Override
    512  public void resizeWidget(GralWidget widgd, int xSizeParent, int ySizeParent)
    513  {
    514    Object owidg = widgd._wdgImpl.getWidgetImplementation();
    515    int test = 6;
    516    if(owidg !=null){
    517      Component swtWidget = (Component)owidg;
    518      GralPanelContent panel = widgd.pos().panel;
    519      GralRectangle size = panel._wdgImpl.getPixelPositionSize(); //PixelSize();
    520      GralRectangle posSize = mng.calcWidgetPosAndSize(widgd.pos(), size.dx, size.dy, 0, 0);
    521      //Note: the swtWidget may have a resizeListener, see there.
    522      swtWidget.setBounds(posSize.x, posSize.y, posSize.dx, posSize.dy );
    523      swtWidget.repaint();
    524    }
    525  }
    526
    527  @Override
    528  public void setSampleCurveViewY(String sName, float[] values)
    529  {
    530    // TODO Auto-generated method stub
    531
    532  }
    533
    534
    535
    536  /**Places a current component with knowledge of the current positions and the spreads of the component on graphic.
    537   * @param component The component to place.
    538   */
    539  void setBounds_(GralPos pos, Component component)
    540  { setPosAndSize_(pos, component);
    541    //setBounds_(component, 0,0, 0, 0);
    542  }
    543
    544
    545
    546
    547  protected void setPosAndSize_(GralPos pos, Component component)
    548  { setPosAndSizeAwt(pos, component, 0,0);
    549  }
    550
    551  /**
    552   * @param component
    553   * @param widthwidgetNat
    554   * @param heigthWidgetNat
    555   *
    556   * NOTE: 2015-07-13: This method is set to unused because it uses the mng-position additional to the constructor of GralWidget.
    557   * This is the old concept which is in conflict with the usuage there.
    558   */
    559  protected void XXXsetPosAndSize_(Component component, int widthwidgetNat, int heigthWidgetNat)
    560  {
    561    mng.setNextPosition();
    562    Component parentComp = component.getParent();
    563    //Rectangle pos;
    564    final GralRectangle rectangle;
    565    if(parentComp == null){
    566      rectangle = mng.calcWidgetPosAndSize(pos(), 800, 600, widthwidgetNat, heigthWidgetNat);
    567    } else {
    568      final Rectangle parentSize = parentComp.getBounds();
    569      rectangle = mng.calcWidgetPosAndSize(pos(), parentSize.width, parentSize.height, widthwidgetNat, heigthWidgetNat);
    570    }
    571    component.setBounds(rectangle.x, rectangle.y, rectangle.dx, rectangle.dy );
    572
    573  }
    574
    575
    576
    577
    578  /**Set bounds of a AWT component with a given position.
    579   * This method is package-private for SWT-implementation.
    580   * @param posP The Position for the component.
    581   * @param component The AWT-widget.
    582   * @param widthwidgetNat The natural size of the component.
    583   * @param heigthWidgetNat The natural size of the component.
    584   */
    585  void setPosAndSizeAwt(GralPos posP, Component component, int widthwidgetNat, int heigthWidgetNat)
    586  {
    587    GralRectangle rectangle = calcWidgetPosAndSizeAwt(posP, component, widthwidgetNat, heigthWidgetNat);
    588    //on SWT it invokes the resize listener if given.
    589    Component parentComp = component.getParent();
    590    //if(parentComp instanceof Frame){
    591      rectangle.y += 50;  //title and menu bar
    592    //}
    593    component.setBounds(rectangle.x, rectangle.y, rectangle.dx, rectangle.dy );
    594
    595  }
    596
    597
    598
    599
    600
    601
    602  /**Calculates the bounds of a widget with a given pos independent of this {@link #pos}.
    603   * This method is a part of the implementing GralMng because the GralPos is not implemented for
    604   * any underlying graphic system and the {@link #propertiesGuiSwt} are used.
    605   * It is possible to tune the bounds after calculation, for example to enhance the width if a text
    606   * is larger then the intended position.
    607   * @param pos The position.
    608   * @param widthwidgetNat The natural size of the component.
    609   * @param heigthWidgetNat The natural size of the component.
    610   * @return A rectangle with position and size.
    611   */
    612  @Override public GralRectangle calcWidgetPosAndSize(GralPos pos, int widthwidgetNat, int heigthWidgetNat){
    613    Component parentComp = (Component)pos.panel.getWidgetImplementation();
    614    //Rectangle pos;
    615    final GralRectangle rectangle;
    616    final Rectangle parentSize;
    617    if(parentComp == null){
    618      parentSize = new Rectangle(0,0,800, 600);
    619    /*
    620    } else if(parentComp instanceof Shell) {
    621      parentSize = ((Shell)parentComp).getClientArea();
    622    */
    623    } else {
    624      parentSize = parentComp.getBounds();
    625    }
    626    return pos.calcWidgetPosAndSize(mng.propertiesGui, parentSize.width, parentSize.height, widthwidgetNat, heigthWidgetNat);
    627  }
    628
    629
    630
    631
    632
    633
    634  /**Calculates the bounds of a SWT component with a given position independent of {@link #pos}.
    635   * This method is package-private for SWT-implementation.
    636   * It is possible to tune the bounds after calculation, for example to enhance the width if a text
    637   * is larger then the intended position.
    638   * @param pos The position.
    639   * @param component The SWT-widget.
    640   * @param widthwidgetNat The natural size of the component.
    641   * @param heigthWidgetNat The natural size of the component.
    642   * @return A rectangle with position and size.
    643   * @deprecated, use {@link #calcWidgetPosAndSizeSwt(GralPos, int, int)}
    644   */
    645  GralRectangle calcWidgetPosAndSizeAwt(GralPos pos, Component component, int widthwidgetNat, int heigthWidgetNat){
    646    Component parentComp = component.getParent();
    647    //Rectangle pos;
    648    final GralRectangle rectangle;
    649    final Rectangle parentSize;
    650    if(parentComp == null){
    651      parentSize = new Rectangle(0,0,800, 600);
    652    } else if(parentComp instanceof Frame) {
    653      parentSize = ((Frame)parentComp).getBounds(); // ??getAccessibleContext().  ??getClientArea();
    654      parentSize.height -= 50;
    655    } else {
    656      parentSize = parentComp.getBounds();
    657    }
    658    return mng.calcWidgetPosAndSize(pos, parentSize.width, parentSize.height, widthwidgetNat, heigthWidgetNat);
    659  }
    660
    661
    662
    663
    664
    665  @Override public boolean showContextMenuGthread(GralWidget widg) {
    666    boolean bOk;
    667    Component awtWidg = (Component)widg._wdgImpl.getWidgetImplementation();
    668    Menu contextMenu = null; //awtWidg.get;
    669    if(contextMenu == null){
    670      bOk = false;
    671    } else {
    672      //Rectangle pos = swtWidg.getBounds();
    673      GralRectangle pos = AwtWidgetHelper.getPixelPositionSize(awtWidg);
    674      //contextMenu.setLocation(pos.x + pos.dx, pos.y + pos.dy);
    675      //contextMenu.setVisible(true);
    676      bOk = true;
    677    }
    678    return bOk;
    679  }
    680
    681
    682
    683
    684  KeyListener XXXXX_mainKeyListener = new KeyListener(){
    685
    686    @Override
    687    public void keyPressed(KeyEvent e) {
    688      // TODO Auto-generated method stub
    689
    690    }
    691
    692    @Override
    693    public void keyReleased(KeyEvent e) {
    694      // TODO Auto-generated method stub
    695      stop();
    696    }
    697
    698    @Override
    699    public void keyTyped(KeyEvent e) {
    700      // TODO Auto-generated method stub
    701
    702    }
    703
    704  };
    705
    706  /**Universal focus listener to register which widgets were in focus in its order,
    707   * to set htmlHelp and to invoke the {@link GralWidget#setActionFocused(GralUserAction)}.
    708   */
    709  protected class AwtMngFocusListener implements FocusListener
    710  {
    711    GralMng.GralMngFocusListener gralFocus;
    712
    713    AwtMngFocusListener(){
    714      gralFocus = GralMng.get().new GralMngFocusListener();
    715    }
    716
    717    @Override public void focusLost(FocusEvent ev)
    718    { GralWidget widgg = GralWidget.ImplAccess.gralWidgetFromImplData(((AwtWidget)ev.getComponent()).getData());
    719      gralFocus.focusLostGral(widgg);
    720    }
    721
    722    @Override public void focusGained(FocusEvent ev)
    723    { GralWidget widgg = GralWidget.ImplAccess.gralWidgetFromImplData(((AwtWidget)ev.getComponent()).getData());
    724      gralFocus.focusGainedGral(widgg);
    725    }
    726  }
    727
    728  /**The package private universal focus listener. */
    729  protected AwtMngFocusListener focusListener = new AwtMngFocusListener();
    730
    731
    732
    733  void stop(){}
    734
    735
    736
    737  @Override
    738  public boolean XXXsetWindowsVisible(GralWindow_ifc window, GralPos atPos)
    739  {
    740    // TODO Auto-generated method stub
    741    return false;
    742  }
    743
    744
    745
    746
    747
    748
    749}