    001package org.vishia.gral.awt;
    002
    003import java.awt.Color;
    004import java.awt.Component;
    005import java.awt.Dimension;
    006import java.awt.Point;
    007import java.awt.Rectangle;
    008import java.awt.event.MouseEvent;
    009import java.awt.event.MouseListener;
    010import java.awt.event.MouseMotionListener;
    011
    012import org.vishia.gral.base.GralMouseWidgetAction_ifc;
    013import org.vishia.gral.base.GralWidget;
    014import org.vishia.gral.base.GralMng;
    015import org.vishia.gral.ifc.GralRectangle;
    016import org.vishia.gral.ifc.GralUserAction;
    017import org.vishia.gral.ifc.GralWidget_ifc;
    018import org.vishia.util.KeyCode;
    019
    020/**Common used {@link MouseListener} for all gral widgets.
    021 *
    022 * @author Hartmut Schorrig
    023 *
    024 */
    025public class AwtGralMouseListener
    026{
    027  /**This class implements a MouseListener which does not call a user method.
    028   * Only the information about the clicked widget are stored in the GralMng
    029   * and the Gral designer is supported.
    030   *
    031   */
    032  public static class MouseListenerNoAction implements MouseListener
    033  {
    034
    035
    036    public MouseListenerNoAction()
    037    {
    038    }
    039
    040    int xDown, yDown;
    041
    042    /**The mouse-down action save some informations about the widget.
    043     * It may be overridden by an derived class, then this method should be invoked within.
    044     */
    045    @Override public void mousePressed(MouseEvent ev)
    046    {
    047      AwtWidget widget = (AwtWidget)ev.getComponent();
    048      Object oInfo = widget.getData();
    049      if(oInfo instanceof GralWidget){
    050        GralWidget widgetInfo = (GralWidget)oInfo;
    051        GralMng guiMng = widgetInfo.gralMng();
    052        try{
    053          if(widgetInfo ==null || widgetInfo.getDataPath() ==null || !widgetInfo.getDataPath().equals("widgetInfo")){
    054            guiMng.setLastClickedWidget(widgetInfo );
    055          }
    056          if(guiMng.bDesignMode){
    057            GralRectangle rr = new GralRectangle(ev.getX(), ev.getY(), 0, 0);
    058            if(ev.getButton() == 1){ //left
    059              xDown = ev.getX(); yDown = ev.getY();
    060              guiMng.pressedLeftMouseDownForDesign(widgetInfo, rr);
    061            } else if(ev.getButton() == 3){ //right
    062              //guiMng.pressedRightMouseDownForDesign(widgetInfo, rr);
    063            }
    064          }
    065        } catch(Exception exc){ guiMng.writeLog(0, exc); }
    066
    067    }
    068
    069    }
    070
    071    /**The mouse up is left empty. It may be overridden by an derived class. */
    072    @Override public void mouseReleased(MouseEvent ev)
    073    { AwtWidget widget = (AwtWidget)ev.getComponent();
    074      Object oInfo = widget.getData();
    075      if(oInfo instanceof GralWidget){
    076        GralWidget widgetInfo = (GralWidget)oInfo;
    077        GralMng guiMng = widgetInfo.gralMng();
    078        try{
    079          GralWidget widgd = (GralWidget)oInfo;
    080          int dx = ev.getX() - xDown, dy = ev.getY() - yDown;
    081          if(dx < 10 && dx > -10 && dy < 10 && dy > -10){
    082            GralWidget_ifc.ActionChange action = widgd.getActionChange(GralWidget_ifc.ActionChangeWhen.onMouse1Up);
    083            if(action !=null){
    084              Object[] args = action.args();
    085              if(args == null){ action.action().exec(KeyCode.mouse1Up, widgd, new Integer(ev.getX()), new Integer(ev.getY())); }
    086              else {
    087                //additional 2 arguments: copy in one args2.
    088                Object[] args2 = new Object[args.length +2];
    089                System.arraycopy(args, 0, args2, 0, args.length);
    090                args2[args.length] = new Integer(ev.getX());
    091                args2[args.length+1] = new Integer(ev.getY());
    092                action.action().exec(KeyCode.mouse1Up, widgd, args2);
    093              }
    094            }
    095          } else if(guiMng.bDesignMode && ev.getButton() == 1){
    096            boolean bCopy = (ev.getModifiers() & 99999) !=0;
    097            GralRectangle rr = new GralRectangle(ev.getX(), ev.getY(), 0, 0);
    098            guiMng.releaseLeftMouseForDesign(widgd, rr, bCopy);
    099          }
    100          //widgd.redraw();
    101        } catch(Exception exc){ guiMng.writeLog(0, exc); }
    102
    103      }
    104
    105    }
    106
    107
    108
    109    /**The mouse doubleclick is left empty. It may be overridden by an derived class. */
    110       @Override
    111    public void mouseClicked(MouseEvent e)
    112    {
    113      // TODO Auto-generated method stub
    114
    115    }
    116
    117    @Override
    118    public void mouseEntered(MouseEvent e)
    119    {
    120      // TODO Auto-generated method stub
    121
    122    }
    123
    124    @Override
    125    public void mouseExited(MouseEvent e)
    126    {
    127      // TODO Auto-generated method stub
    128
    129    }
    130
    131
    132
    133  }
    134
    135
    136
    137
    138
    139
    140  public static class MouseListenerGralAction extends MouseListenerNoAction
    141  implements MouseListener
    142  {
    143
    144    /**Positions saved on mouse press, to detect whether the mouse-release occurs in the pressed area.
    145     * If the mouse-position is shifted outside the area of the widget, the mouse-release-user-action
    146     * is not executed.
    147     */
    148    private int xMousePress, yMousePress;
    149
    150    private Color backgroundWhilePressed;
    151
    152    /**Used in the implementation level for the paint routine. Therefore it is package private.
    153     */
    154    protected boolean isPressed;
    155
    156
    157
    158    protected final GralMouseWidgetAction_ifc mouseWidgetAction;
    159
    160
    161    /**Constructor.
    162     * @param guiMng The Gui-manager
    163     * @param userCmdGui The users method for the action.
    164     * @param sCmdPress command string provided as first parameter on mouse button press.
    165     * @param sCmdRelease
    166     * @param sCmdDoubleClick
    167     */
    168    public MouseListenerGralAction(GralMouseWidgetAction_ifc mouseWidgetAction)
    169    { super();
    170      this.mouseWidgetAction = mouseWidgetAction;
    171    }
    172
    173
    174
    175    @Override
    176    public void mouseClicked(MouseEvent ev) {
    177      xMousePress = ev.getX();
    178      yMousePress = ev.getY();
    179      AwtWidget widget = (AwtWidget)ev.getComponent();
    180      GralWidget widgg = (GralWidget)widget.getData();
    181      GralWidget_ifc.ActionChange action = widgg.getActionChange(GralWidget_ifc.ActionChangeWhen.onMouse1Double);
    182      if(action !=null){
    183        Object[] args = action.args();
    184        if(args == null){ action.action().exec(KeyCode.mouse1Double, widgg, new Integer(ev.getX()), new Integer(ev.getY())); }
    185        else {
    186          //additional 2 arguments: copy in one args2.
    187          Object[] args2 = new Object[args.length +2];
    188          System.arraycopy(args, 0, args2, 0, args.length);
    189          args2[args.length] = new Integer(ev.getX());
    190          args2[args.length+1] = new Integer(ev.getY());
    191          action.action().exec(KeyCode.mouse1Double, widgg, args2);
    192        }
    193      }
    194    }
    195
    196    @Override public void mousePressed(MouseEvent e) {
    197      super.mousePressed(e);
    198      isPressed = true;
    199      xMousePress = e.getX();
    200      yMousePress = e.getY();
    201      Component widget = e.getComponent();
    202      AwtWidget widgetAwt = (AwtWidget)widget;
    203      widget.addMouseMotionListener(mouseMoveListener);
    204      Object oData = widgetAwt.getData();
    205      GralWidget widgg = (GralWidget)oData;  //maybe null
    206      Dimension size = widget.getSize();
    207      try{
    208        final int keyCode;
    209        switch(e.getButton()){
    210          case 1: keyCode = KeyCode.mouse1Down; break;
    211          case 2: keyCode = KeyCode.mouse2Down; break;
    212          case 3: keyCode = KeyCode.mouse3Down; break;
    213          default: keyCode = KeyCode.mouse3Down; break;  //other key
    214        }
    215        if(mouseWidgetAction !=null){
    216          switch(e.getButton()){
    217            case 1: mouseWidgetAction.mouse1Down(keyCode, xMousePress, yMousePress, size.width, size.height, widgg); break;
    218            case 2: mouseWidgetAction.mouse2Down(keyCode, xMousePress, yMousePress, size.width, size.height, widgg); break;
    219          }
    220        }
    221        GralWidget_ifc.ActionChange action = widgg.getActionChange(null);
    222        if(action !=null){
    223          Object[] args = action.args();
    224          if(args == null){ action.action().exec(keyCode, widgg, new Integer(e.getX()), new Integer(e.getY())); }
    225          else {
    226            //additional 2 arguments: copy in one args2.
    227            Object[] args2 = new Object[args.length +2];
    228            System.arraycopy(args, 0, args2, 0, args.length);
    229            args2[args.length] = new Integer(e.getX());
    230            args2[args.length+1] = new Integer(e.getY());
    231            action.action().exec(keyCode, widgg, args2);
    232          }
    233        }
    234      } catch(Exception exc){ System.err.printf("AwtGralMouseListener - any exception while mouse down; %s\n", exc.getMessage()); }
    235    }
    236
    237
    238
    239
    240    @Override public void mouseReleased(MouseEvent e) {
    241      //set the background color to the originally value again if it was changed.
    242      super.mouseReleased(e);
    243      if(isPressed){
    244        Component widget = e.getComponent();
    245        AwtWidget widgetAwt = (AwtWidget)widget;
    246        Dimension size = widget.getSize();
    247        GralWidget widgg = (GralWidget)widgetAwt.getData();
    248        widget.removeMouseMotionListener(mouseMoveListener);
    249        isPressed = false;
    250        final int keyCode;
    251        GralWidget_ifc.ActionChangeWhen whenAction;
    252        switch(e.getButton()){
    253          case 1: keyCode = KeyCode.mouse1Up; whenAction = GralWidget_ifc.ActionChangeWhen.onMouse1Up; break;
    254          case 2: keyCode = KeyCode.mouse2Up; whenAction = GralWidget_ifc.ActionChangeWhen.onMouse2Up; break;
    255          case 3: keyCode = KeyCode.mouse3Up; whenAction = null; break;
    256          default: keyCode = KeyCode.mouse3Up; whenAction = null; break;  //other key
    257        }
    258        if(mouseWidgetAction !=null){
    259          switch(e.getButton()){
    260            case 1: mouseWidgetAction.mouse1Up(keyCode, e.getX(), e.getY(), size.width, size.height, widgg); break;
    261            case 2: mouseWidgetAction.mouse2Up(keyCode, e.getX(), e.getY(), size.width, size.height, widgg); break;
    262          }
    263        }
    264        backgroundWhilePressed = null;
    265        try{
    266          GralWidget_ifc.ActionChange action = widgg.getActionChange(whenAction);
    267          if(action !=null){
    268            Object[] args = action.args();
    269            if(args == null){ action.action().exec(keyCode, widgg); }
    270            else { action.action().exec(keyCode, widgg, args); }
    271          }
    272        } catch(Exception exc){ System.err.printf("SwtGralMouseListener - any exception while mouse down; %s\n", exc.getMessage()); }
    273        //widgg.repaint();
    274      }
    275    }
    276
    277    protected MouseMotionListener mouseMoveListener = new MouseMotionListener()
    278    {
    279
    280      @Override public void mouseMoved(MouseEvent e)
    281      {
    282      }//method mouseMoved
    283
    284      @Override
    285      public void mouseDragged(MouseEvent e)
    286      {
    287        if(e.getComponent() instanceof AwtWidget){
    288          Component widget = e.getComponent();
    289          AwtWidget widgetAwt = (AwtWidget)widget;
    290          Rectangle size = widget.getBounds();
    291          if(mouseWidgetAction !=null){
    292            if(!mouseWidgetAction.mouseMoved(e.getX(), e.getY(), size.x, size.y)){
    293              isPressed = false;
    294              widget.removeMouseMotionListener(mouseMoveListener);
    295            }
    296            mouseWidgetAction.mouseMoved(e.getX(), e.getY(), size.x, size.y);
    297            //mouseWidgetAction.removeMouseCursorFromWidgetWhilePressed();
    298          }
    299        }
    300      }//method mouseDragged
    301    };
    302
    303
    304  }
    305
    306
    307
    308
    309}