mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			246 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			246 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C++
		
	
	
	
/* eventmethods.cpp --
 | 
						|
   Copyright (C)  2005, 2006  Free Software Foundation, Inc.
 | 
						|
 | 
						|
This file is part of GNU Classpath.
 | 
						|
 | 
						|
GNU Classpath is free software; you can redistribute it and/or modify
 | 
						|
it under the terms of the GNU General Public License as published by
 | 
						|
the Free Software Foundation; either version 2, or (at your option)
 | 
						|
any later version.
 | 
						|
 | 
						|
GNU Classpath is distributed in the hope that it will be useful, but
 | 
						|
WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
General Public License for more details.
 | 
						|
 | 
						|
You should have received a copy of the GNU General Public License
 | 
						|
along with GNU Classpath; see the file COPYING.  If not, write to the
 | 
						|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
						|
02110-1301 USA.
 | 
						|
 | 
						|
Linking this library statically or dynamically with other modules is
 | 
						|
making a combined work based on this library.  Thus, the terms and
 | 
						|
conditions of the GNU General Public License cover the whole
 | 
						|
combination.
 | 
						|
 | 
						|
As a special exception, the copyright holders of this library give you
 | 
						|
permission to link this library with independent modules to produce an
 | 
						|
executable, regardless of the license terms of these independent
 | 
						|
modules, and to copy and distribute the resulting executable under
 | 
						|
terms of your choice, provided that you also meet, for each linked
 | 
						|
independent module, the terms and conditions of the license of that
 | 
						|
module.  An independent module is a module which is not derived from
 | 
						|
or based on this library.  If you modify this library, you may extend
 | 
						|
this exception to your version of the library, but you are not
 | 
						|
obligated to do so.  If you do not wish to do so, delete this
 | 
						|
exception statement from your version. */
 | 
						|
 | 
						|
#ifdef I_KNOW_WHAT_IM_DOING
 | 
						|
 | 
						|
bool draw;
 | 
						|
  
 | 
						|
private:
 | 
						|
  JavaVM* vm;
 | 
						|
  jobject target;
 | 
						|
  jclass componentCls;
 | 
						|
 | 
						|
  void setup(JNIEnv *env, jobject obj)
 | 
						|
  {
 | 
						|
    env->GetJavaVM(&vm);
 | 
						|
    componentCls = NULL;
 | 
						|
    target = env->NewGlobalRef(obj);
 | 
						|
    componentCls = (jclass)env->NewGlobalRef(env->GetObjectClass( target ));
 | 
						|
    setMouseTracking( true );
 | 
						|
    draw = true;
 | 
						|
  }
 | 
						|
 | 
						|
  void destroy()
 | 
						|
  {
 | 
						|
    JNIEnv *env;
 | 
						|
    vm->GetEnv((void **)&env, JNI_VERSION_1_1);
 | 
						|
    env->DeleteGlobalRef(target);
 | 
						|
    env->DeleteGlobalRef(componentCls);
 | 
						|
  }
 | 
						|
 | 
						|
  void callVoidMethod(const char *methodName)
 | 
						|
  {
 | 
						|
    JNIEnv *env;
 | 
						|
    vm->GetEnv((void **)&env, JNI_VERSION_1_1);
 | 
						|
    jmethodID fireEventID = env->GetMethodID( componentCls,
 | 
						|
					      methodName,
 | 
						|
					      "()V" );
 | 
						|
    env->CallVoidMethod( target, fireEventID );
 | 
						|
  }
 | 
						|
 | 
						|
  void callMouseMethod(const char *methodName,
 | 
						|
		       int modifiers, int x, int y, int clickCount)
 | 
						|
  {
 | 
						|
    JNIEnv *env;
 | 
						|
    vm->GetEnv((void **)&env, JNI_VERSION_1_1);
 | 
						|
    jmethodID fireEventID = env->GetMethodID( componentCls,
 | 
						|
					      methodName,
 | 
						|
					      "(IIII)V" );
 | 
						|
    env->CallVoidMethod( target, fireEventID, modifiers, x, y, clickCount );
 | 
						|
  }
 | 
						|
 | 
						|
protected:
 | 
						|
 | 
						|
  void closeEvent( QCloseEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::closeEvent(e);
 | 
						|
    callVoidMethod("closeEvent");
 | 
						|
  }
 | 
						|
  
 | 
						|
  void focusInEvent( QFocusEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::focusInEvent(e);
 | 
						|
    callVoidMethod("focusInEvent");
 | 
						|
  }
 | 
						|
 | 
						|
  void focusOutEvent( QFocusEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::focusOutEvent(e);
 | 
						|
    callVoidMethod("focusOutEvent");
 | 
						|
  }
 | 
						|
 | 
						|
  void enterEvent( QEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::enterEvent(e);
 | 
						|
    QPoint p = mapFromGlobal( QCursor::pos() );
 | 
						|
    int modifiers = getKeyModifiers( QApplication::keyboardModifiers() );
 | 
						|
    callMouseMethod("enterEvent", modifiers, p.x(), p.y(), 0);
 | 
						|
  }
 | 
						|
 | 
						|
  void keyPressEvent( QKeyEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::keyPressEvent(e);
 | 
						|
    int modifiers, x, y;
 | 
						|
    modifiers = getKeyModifiers(e->modifiers());
 | 
						|
    x = mapKeyCode(e);
 | 
						|
    y = getUnicode(e);
 | 
						|
    callMouseMethod("keyPressEvent", modifiers, x, y, 0);
 | 
						|
  }
 | 
						|
 | 
						|
  void keyReleaseEvent( QKeyEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::keyReleaseEvent(e);
 | 
						|
    int modifiers, x, y;
 | 
						|
    modifiers = getKeyModifiers(e->modifiers());
 | 
						|
    x = mapKeyCode(e);
 | 
						|
    y = getUnicode(e);
 | 
						|
    callMouseMethod("keyReleaseEvent", modifiers, x, y, 0);
 | 
						|
  }
 | 
						|
 | 
						|
  void leaveEvent( QEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::leaveEvent(e);
 | 
						|
    QPoint p = mapFromGlobal( QCursor::pos() );
 | 
						|
    int modifiers = getKeyModifiers( QApplication::keyboardModifiers() );
 | 
						|
    callMouseMethod("leaveEvent", modifiers, p.x(), p.y(), 0);
 | 
						|
  }
 | 
						|
 | 
						|
  void mouseDoubleClickEvent( QMouseEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::mouseDoubleClickEvent(e);
 | 
						|
    int modifiers, x, y, clickCount;
 | 
						|
    clickCount = 2;
 | 
						|
    modifiers = getMouseModifiers(e);
 | 
						|
    x = e->x();
 | 
						|
    y = e->y();
 | 
						|
    callMouseMethod("mouseDoubleClickEvent", modifiers, x, y, clickCount);
 | 
						|
  }
 | 
						|
 | 
						|
  void mouseMoveEvent( QMouseEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::mouseMoveEvent(e);
 | 
						|
    int modifiers, x, y, clickCount;
 | 
						|
    clickCount = 0;
 | 
						|
    modifiers = getMouseModifiers(e);
 | 
						|
    x = e->x();
 | 
						|
    y = e->y();
 | 
						|
    callMouseMethod("mouseMoveEvent", modifiers, x, y, clickCount);
 | 
						|
  }
 | 
						|
 | 
						|
  void mousePressEvent( QMouseEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::mousePressEvent(e);
 | 
						|
    int modifiers, x, y, clickCount;
 | 
						|
    clickCount = 0;
 | 
						|
    modifiers = getMouseModifiers(e);
 | 
						|
    x = e->x();
 | 
						|
    y = e->y();
 | 
						|
    callMouseMethod("mousePressEvent", modifiers, x, y, clickCount);
 | 
						|
  }
 | 
						|
 | 
						|
  void mouseReleaseEvent( QMouseEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::mouseReleaseEvent(e);
 | 
						|
    int modifiers, x, y, clickCount;
 | 
						|
    modifiers = 0;
 | 
						|
 | 
						|
    modifiers |= getReleaseModifiers( e );
 | 
						|
    x = e->x();
 | 
						|
    y = e->y();
 | 
						|
    callMouseMethod("mouseReleaseEvent", modifiers, x, y, 0);
 | 
						|
  }
 | 
						|
 | 
						|
  void moveEvent( QMoveEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::moveEvent(e);
 | 
						|
    callMouseMethod("moveEvent", e->pos().x(), e->pos().y(),
 | 
						|
		    e->oldPos().x(), e->oldPos().y());
 | 
						|
  }
 | 
						|
 | 
						|
  void resizeEvent( QResizeEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::resizeEvent(e);
 | 
						|
    callMouseMethod("resizeEvent", 
 | 
						|
		    e->oldSize().width(), e->oldSize().height(),
 | 
						|
		    e->size().width(), e->size().height());
 | 
						|
  }
 | 
						|
 | 
						|
  void hideEvent( QHideEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::hideEvent(e);
 | 
						|
    callVoidMethod("hideEvent");
 | 
						|
  }
 | 
						|
 | 
						|
  void showEvent( QShowEvent *e )
 | 
						|
  {
 | 
						|
    PARENT::showEvent(e);
 | 
						|
    callVoidMethod("showEvent");
 | 
						|
  }
 | 
						|
 | 
						|
  void paintEvent ( QPaintEvent * e )
 | 
						|
  {
 | 
						|
    PARENT::paintEvent( e );
 | 
						|
    if ( draw )
 | 
						|
      {
 | 
						|
	// Create a QPainter
 | 
						|
	GraphicsPainter painter( this );
 | 
						|
	int x, y, w, h;
 | 
						|
	e->rect().getRect ( &x, &y, &w, &h );
 | 
						|
 | 
						|
	// Get the environment.
 | 
						|
	JNIEnv *env;
 | 
						|
	vm->GetEnv((void **)&env, JNI_VERSION_1_1);
 | 
						|
 | 
						|
	// create a QtGraphics wrapper for the QPainter
 | 
						|
	jclass cls = env->FindClass( "gnu/java/awt/peer/qt/QtComponentGraphics" );
 | 
						|
	jmethodID mid = env->GetMethodID(cls, "<init>", "(JLgnu/java/awt/peer/qt/QtComponentPeer;IIII)V");
 | 
						|
	jobject graphics = env->NewObject(cls, mid, (jlong)&painter, target,
 | 
						|
					  (jint)x, (jint)y, (jint)w, (jint)h);
 | 
						|
 | 
						|
	// call QtComponentPeer.paintEvent()
 | 
						|
	jmethodID paintEventID = env->GetMethodID( componentCls,
 | 
						|
						   "paint",
 | 
						|
						   "(Ljava/awt/Graphics;)V" );
 | 
						|
	env->CallVoidMethod( target, paintEventID, graphics );
 | 
						|
	env->DeleteLocalRef( cls );
 | 
						|
	env->DeleteLocalRef( graphics );
 | 
						|
	painter.end();
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
#endif
 |