001package org.vishia.gral.base;
002
003import org.vishia.gral.ifc.GralWidget_ifc;
004
005/**This interface is implemented in the Widget adaption for the Gral level.
006 * It should not be known by the user, except the user creates new widget types.
007 * The interface is the connection from Mouse listeners in the graphic implementation layer (swt, swing)
008 * to the gral widgets.
009 * See {@link org.vishia.gral.swt.SwtGralMouseListener} for an usage in graphic implementation layer.
010 * 
011 * 
012 * @author Hartmut Schorrig
013 *
014 */
015public interface GralMouseWidgetAction_ifc
016{
017  /**Version, history and licence
018   * 
019   * <ul>
020   * <li>2013-10-13 Hartmut new: {@link #mouse1Double(int, int, int, int, int, GralWidget)}.
021   *   #new 
022   * <li>2013-05-13 Hartmut chg: All methods changed, parameter key, position. 
023   * </ul>
024   * 
025   * <b>Copyright/Copyleft</b>:
026   * For this source the LGPL Lesser General Public License,
027   * published by the Free Software Foundation is valid.
028   * It means:
029   * <ol>
030   * <li> You can use this source without any restriction for any desired purpose.
031   * <li> You can redistribute copies of this source to everybody.
032   * <li> Every user of this source, also the user of redistribute copies
033   *    with or without payment, must accept this license for further using.
034   * <li> But the LPGL ist not appropriate for a whole software product,
035   *    if this source is only a part of them. It means, the user
036   *    must publish this part of source,
037   *    but don't need to publish the whole source of the own product.
038   * <li> You can study and modify (improve) this source
039   *    for own using or for redistribution, but you have to license the
040   *    modified sources likewise under this LGPL Lesser General Public License.
041   *    You mustn't delete this Copyright/Copyleft inscription in this source file.
042   * </ol>
043   * If you are indent to use this sources without publishing its usage, you can get
044   * a second license subscribing a special contract with the author. 
045   * 
046   * @author Hartmut Schorrig = hartmut.schorrig@vishia.de
047   * 
048   * 
049   */
050  public final static int version = 0x20120303;
051
052  
053  /**Bit mask to determine which mouse action should invoke the {@link GralWidget#getActionChange()}.
054   * It is the second parameter of {@link GralWidget#setActionMouse(GralMouseWidgetAction_ifc, int)}. 
055   * Use an | of this conditions. mUserAll includes any key of mouse.
056   */
057  public final static int mUser1down = 1, mUser2down = 0x2, mUser3down = 0x4, mUserAlldown = 0xf
058    , mUser1up = 0x10, mUser2up = 0x20, mUser3up = 0x40, mUserAllup = 0xf
059    , mUserDouble = 0x100
060    , mUserAll = 0xffff; 
061  
062  /**Called from the graphic implementation layer if the standard left mouse button is pressed.
063   * @param xMousePixel
064   * @param yMousePixel
065   */
066  void mouse1Down(int key, int xMousePixel, int yMousePixel, int xWidgetSizePixel, int yWidgetSizePixel, GralWidget widgg);
067  
068  void mouse1Up(int key, int xMousePixel, int yMousePixel, int xWidgetSizePixel, int yWidgetSizePixel, GralWidget widgg);
069  
070  /**Called from the graphic implementation layer if the standard right mouse button is pressed.
071   * @param xMousePixel
072   * @param yMousePixel
073   */
074  void mouse2Down(int key, int xMousePixel, int yMousePixel, int xWidgetSizePixel, int yWidgetSizePixel, GralWidget widgg);
075  
076  void mouse2Up(int key, int xMousePixel, int yMousePixel, int xWidgetSizePixel, int yWidgetSizePixel, GralWidget widgg);
077  
078
079  void mouse1Double(int key, int xMousePixel, int yMousePixel, int xWidgetSizePixel, int yWidgetSizePixel, GralWidget widgg);
080
081  
082  
083  /**It is called if the mouse button is pressed, and then the mouse cursor is removed from the widget.
084   * The mouse-button-up action won't be called then. Usual the user should done its action
085   * while the button-up is detected, non on button down. It is an advantage for handling,
086   * because on button-up the hit widget should be marked visible firstly. 
087   * 
088   */
089  //void removeMouseCursorFromWidgetWhilePressed();
090
091  
092  
093  /**This routine is called only if a mouse button is pressed while moving the mouse cursor.
094   * @param xMousePixel The current mouse cursor x value
095   * @param yMousePixel The current mouse cursor y value
096   * @param xWidgetSizePixel Width of the associated widget.
097   * @param yWidgetSizePixel Height of the associated widget.
098   * @return true if the mouse should be still accepted as pressed, 
099   *   false if the mouse button up action should be prevented. The mouse is not accepted as pressed any more. 
100   */
101  boolean mouseMoved(int xMousePixel, int yMousePixel, int xWidgetSizePixel, int yWidgetSizePixel);
102  
103  
104  
105  /**Invoke the proper action for mouse events.
106   * This routine is used inside the graphic implementing mouse handlers.
107   * The action with the 'when' designation is searched. If found it is invoked with its own arguments
108   * and then with the mouse position in line and column grid values of the panel and a possible delta position.
109   * @param widgg The widget where the mouse handling is associated to
110   * @param keyCode The possible additional modifying key (ctrl, alt, sh) and the mouse key
111   * @param when which mouse action should be used.
112   * @param mouse_x The pixel position of the mouse inside the panel
113   * @param mouse_y
114   * @param dx An additional delta-position in pixel.
115   * @param dy
116   * @throws any exception which is catched in the mouse listener.
117   * NOTE: yet unused. Write a class with gral mouse adaption!
118  public static void executeActionForMouse(GralWidget widgg, int keyCode, GralWidget_ifc.ActionChangeWhen when, int mouse_x, int mouse_y, int dx, int dy) {
119    GralWidget_ifc.ActionChange action = widgg.getActionChangeStrict(when, true); 
120    if(action !=null){
121      //TODO: calc grid positions from pixel!
122      Object[] args = action.args();
123      if(args == null){ action.action().exec(keyCode, widgg, new Integer(mouse_x), new Integer(mouse_y), new Integer(dx), new Integer(dy)); }
124      else { 
125        //additional 2 arguments: copy in one args2.
126        Object[] args2 = new Object[args.length +4];
127        System.arraycopy(args, 0, args2, 0, args.length);
128        args2[args.length] = new Integer(mouse_y);
129        args2[args.length+1] = new Integer(mouse_x);
130        args2[args.length+2] = new Integer(dy);
131        args2[args.length+3] = new Integer(dx);
132        action.action().exec(keyCode, widgg, args2); 
133      }
134    }
135  }
136   */
137  
138  
139}