35 |
obligated to do so. If you do not wish to do so, delete this |
obligated to do so. If you do not wish to do so, delete this |
36 |
exception statement from your version. */ |
exception statement from your version. */ |
37 |
|
|
38 |
|
#include <assert.h> |
39 |
#include <QMenu> |
#include <QMenu> |
40 |
#include <gnu_java_awt_peer_qt_QtMenuPeer.h> |
#include <gnu_java_awt_peer_qt_QtMenuPeer.h> |
41 |
#include "nativewrapper.h" |
#include "nativewrapper.h" |
82 |
QMenu *menu; |
QMenu *menu; |
83 |
QAction *action; |
QAction *action; |
84 |
int isMenu; // 0 to add a menu, 1 to add an item, 2 to add a seperator |
int isMenu; // 0 to add a menu, 1 to add an item, 2 to add a seperator |
85 |
QAction **newAction; // adding an action creates a new duplicate. |
JavaVM *vm; |
86 |
|
jobject menuPeer; |
87 |
|
jobject itemPeer; |
88 |
|
|
89 |
public: |
public: |
90 |
MenuAction(QMenu *m, QAction *a, QAction **na, bool ismenu) : AWTEvent() |
MenuAction(JNIEnv *env, jobject mp, jobject ip, QMenu *m, QAction *a, |
91 |
|
bool ismenu) : AWTEvent() |
92 |
{ |
{ |
93 |
menu = m; |
menu = m; |
94 |
action = a; |
action = a; |
95 |
isMenu = ismenu; |
isMenu = ismenu; |
96 |
newAction = na; |
env->GetJavaVM( &vm ); |
97 |
|
menuPeer = env->NewGlobalRef( mp ); |
98 |
|
if( ip != NULL ) |
99 |
|
itemPeer = env->NewGlobalRef( ip ); |
100 |
|
else |
101 |
|
itemPeer = NULL; |
102 |
} |
} |
103 |
|
|
104 |
void runEvent() |
void runEvent() |
105 |
{ |
{ |
106 |
|
JNIEnv *env; |
107 |
|
QAction *newAction; // adding an action creates a new duplicate. |
108 |
|
vm->GetEnv((void **)&env, JNI_VERSION_1_1); |
109 |
|
|
110 |
switch(isMenu) |
switch(isMenu) |
111 |
{ |
{ |
112 |
case ADDMENU: |
case ADDMENU: |
113 |
*newAction = menu->addMenu( (QMenu *)action ); |
newAction = menu->addMenu( (QMenu *)action ); |
114 |
break; |
break; |
115 |
case ADDITEM: |
case ADDITEM: |
116 |
*newAction = menu->addAction(action->text()); |
newAction = menu->addAction(action->text()); |
117 |
(*newAction)->setSeparator(action->isSeparator()); |
newAction->setSeparator(action->isSeparator()); |
118 |
(*newAction)->setCheckable(action->isCheckable()); |
newAction->setCheckable(action->isCheckable()); |
119 |
delete action; |
// delete action; |
120 |
break; |
break; |
121 |
case ADDSEPA: |
case ADDSEPA: |
122 |
*newAction = menu->addSeparator(); |
newAction = menu->addSeparator(); |
123 |
break; |
break; |
124 |
} |
} |
125 |
|
|
126 |
|
jclass menuCls = env->GetObjectClass( menuPeer ); |
127 |
|
jmethodID mid = env->GetMethodID(menuCls, "add", "(J)V"); |
128 |
|
env->CallVoidMethod( menuPeer, mid, (jlong)newAction ); |
129 |
|
|
130 |
|
env->DeleteGlobalRef( menuPeer ); |
131 |
|
if( itemPeer != NULL ) |
132 |
|
{ |
133 |
|
setNativeObject( env, itemPeer, newAction ); |
134 |
|
connectAction(newAction, env, itemPeer); |
135 |
|
env->DeleteGlobalRef( itemPeer ); |
136 |
|
} |
137 |
} |
} |
138 |
}; |
}; |
139 |
|
|
183 |
/* |
/* |
184 |
* Inserts a seperator. |
* Inserts a seperator. |
185 |
*/ |
*/ |
186 |
JNIEXPORT jlong JNICALL Java_gnu_java_awt_peer_qt_QtMenuPeer_insertSeperator |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtMenuPeer_insertSeperator |
187 |
(JNIEnv *env, jobject obj) |
(JNIEnv *env, jobject obj) |
188 |
{ |
{ |
189 |
QMenu *menu = (QMenu *)getNativeObject( env, obj ); |
QMenu *menu = (QMenu *)getNativeObject( env, obj ); |
190 |
assert( menu ); |
assert( menu ); |
191 |
QAction *newAction = NULL; |
mainThread->postEventToMain( new MenuAction( env, obj, NULL, |
192 |
MenuAction *ma = new MenuAction( menu, NULL, &newAction, ADDSEPA ); |
menu, NULL, ADDSEPA ) ); |
|
|
|
|
while (newAction == NULL); // Wait for new action. |
|
|
|
|
|
return (jlong)newAction; |
|
193 |
} |
} |
194 |
|
|
195 |
/* |
/* |
196 |
* Inserts an item. |
* Inserts an item. |
197 |
*/ |
*/ |
198 |
JNIEXPORT jlong JNICALL Java_gnu_java_awt_peer_qt_QtMenuPeer_insertItem |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtMenuPeer_insertItem |
199 |
(JNIEnv *env, jobject obj, jobject item) |
(JNIEnv *env, jobject obj, jobject item) |
200 |
{ |
{ |
201 |
QMenu *menu = (QMenu *)getNativeObject( env, obj ); |
QMenu *menu = (QMenu *)getNativeObject( env, obj ); |
202 |
assert( menu ); |
assert( menu ); |
203 |
|
|
204 |
QAction *action = (QAction *)getNativeObject( env, item ); |
QAction *action = (QAction *)getNativeObject( env, item ); |
205 |
assert( action ); |
assert( action ); |
206 |
|
|
207 |
QAction *newAction = NULL; |
mainThread->postEventToMain( new MenuAction( env, obj, item, menu, action, ADDITEM )); |
|
MenuAction *ma = new MenuAction( menu, action, &newAction, ADDITEM ); |
|
|
mainThread->postEventToMain( ma ); |
|
|
|
|
|
while (newAction == NULL); // Wait for new action. |
|
|
|
|
|
connectAction(newAction, env, item); |
|
|
setNativeObject(env, item, newAction); // update the MenuItemPeer action. |
|
|
|
|
|
return (jlong)newAction; |
|
208 |
} |
} |
209 |
|
|
210 |
/* |
/* |
211 |
* Inserts a sub-menu |
* Inserts a sub-menu |
212 |
*/ |
*/ |
213 |
JNIEXPORT jlong JNICALL Java_gnu_java_awt_peer_qt_QtMenuPeer_insertMenu |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtMenuPeer_insertMenu |
214 |
(JNIEnv *env, jobject obj, jobject menu) |
(JNIEnv *env, jobject obj, jobject menu) |
215 |
{ |
{ |
216 |
assert( menu ); |
assert( menu ); |
219 |
QMenu *insMenu = (QMenu *)getNativeObject(env, menu); |
QMenu *insMenu = (QMenu *)getNativeObject(env, menu); |
220 |
assert( insMenu ); |
assert( insMenu ); |
221 |
|
|
222 |
QAction *newAction = NULL; |
mainThread->postEventToMain( new MenuAction( env, obj, menu, thisMenu, (QAction *)insMenu, ADDMENU ) ); |
|
MenuAction *ma = new MenuAction( thisMenu, (QAction *)insMenu, |
|
|
&newAction, ADDMENU ); |
|
|
mainThread->postEventToMain( ma ); |
|
|
|
|
|
while (newAction == NULL); // Wait for new action. |
|
|
|
|
|
connectAction(newAction, env, menu); |
|
|
return (jlong) newAction; |
|
223 |
} |
} |
224 |
|
|
225 |
/* |
/* |