Commit 70fe145b4cdfa3f054600e78b41857228d748cf6
1 parent
9cc790e6
Exists in
master
and in
5 other branches
Incluindo plugin java
Showing
15 changed files
with
861 additions
and
11 deletions
Show diff stats
Makefile.in
... | ... | @@ -136,6 +136,12 @@ $(BINDIR)/Debug/plugins/%@DLLEXT@: src/plugins/%/* $(BINDIR)/Debug/$(PACKAGE_TAR |
136 | 136 | $(BINDIR)/Release/plugins/%@DLLEXT@: src/plugins/%/* $(BINDIR)/Release/$(PACKAGE_TARNAME)$(EXEEXT) |
137 | 137 | @make $(PLUGIN_RELEASE_ARGS) -C $(dir $<) Release |
138 | 138 | |
139 | +$(BINDIR)/Debug/plugins/j3270@DLLEXT@: src/java/* $(BINDIR)/Debug/$(PACKAGE_TARNAME)$(EXEEXT) | |
140 | + @make BINDIR="../../$(BINDIR)" PW3270_LIBS="-L../../$(BINDIR)/Debug@DLLDIR@ -l3270 -lpw3270" PW3270_CFLAGS="-I../include" -C $(dir $<) Debug | |
141 | + | |
142 | +$(BINDIR)/Release/plugins/j3270@DLLEXT@: src/java/* $(BINDIR)/Release/$(PACKAGE_TARNAME)$(EXEEXT) | |
143 | + @make BINDIR="../../$(BINDIR)" PW3270_LIBS="-L../../$(BINDIR)/Release@DLLDIR@ -l3270 -lpw3270" PW3270_CFLAGS="-I../include" -C $(dir $<) Release | |
144 | + | |
139 | 145 | #---[ Release targets ]-------------------------------------------------------- |
140 | 146 | |
141 | 147 | all: Release | ... | ... |
configure.ac
... | ... | @@ -345,12 +345,67 @@ if test "$app_cv_java" = "yes" ; then |
345 | 345 | AC_PATH_TOOL([JAVADOC], [javadoc], [no], [$JDK_HOME/bin:$JRE_HOME/bin:$PATH]) |
346 | 346 | |
347 | 347 | EXTENSIONS="$EXTENSIONS java" |
348 | + PLUGINS="$PLUGINS j3270" | |
348 | 349 | |
349 | 350 | fi |
350 | 351 | |
352 | +# Set JVM arch | |
353 | +case $host_cpu in | |
354 | + | |
355 | +x86_64) | |
356 | + jvm_arch=amd64 | |
357 | + ;; | |
358 | + | |
359 | +i?86) | |
360 | + jvm_arch=i386 | |
361 | + ;; | |
362 | + | |
363 | +*) | |
364 | + jvm_arch="$host_cpu" | |
365 | + ;; | |
366 | + | |
367 | +esac | |
368 | + | |
369 | +# JVMDIR | |
370 | +if test "_$JVMDIR" = "_" ; then | |
371 | + | |
372 | + case "$host" in | |
373 | + *-mingw32) | |
374 | + JVMDIR="\$(JRE_HOME)/bin" | |
375 | + ;; | |
376 | + | |
377 | + *-apple-*) | |
378 | + JVMDIR="\$(JRE_HOME)/lib/$jvm_arch/server" | |
379 | + ;; | |
380 | + | |
381 | + *) | |
382 | + JVMDIR="\$(JRE_HOME)/lib/$jvm_arch/server" | |
383 | + esac | |
384 | + | |
385 | +fi | |
386 | + | |
387 | + | |
388 | +# Java link options depends on OS | |
389 | +case "$host" in | |
390 | + *-mingw32) | |
391 | + jvm_libs="-L\$(JVMDIR) -Wl,-rpath,\$(JVMDIR) -ljvm" | |
392 | + ;; | |
393 | + | |
394 | + *-apple-*) | |
395 | + jvm_libs="-L\$(JVMDIR) -Wl,-rpath,\$(JVMDIR) -ljvm" | |
396 | + ;; | |
397 | + | |
398 | + *) | |
399 | + jvm_libs="-L\$(JVMDIR) -Wl,-rpath,\$(JVMDIR) -ljvm" | |
400 | +esac | |
401 | + | |
402 | + | |
403 | +AC_SUBST(JVM_LIBS,$jvm_libs) | |
404 | + | |
351 | 405 | AC_SUBST(JAVAC) |
352 | 406 | AC_SUBST(JAVAH) |
353 | 407 | AC_SUBST(JAVADOC) |
408 | +AC_SUBST(JVMDIR) | |
354 | 409 | AC_SUBST(jnidir) |
355 | 410 | AC_SUBST(jvmjardir) |
356 | 411 | AC_SUBST(javadocdir) | ... | ... |
pw3270.cbp
... | ... | @@ -102,6 +102,62 @@ |
102 | 102 | <Unit filename="src/include/pw3270/trace.h" /> |
103 | 103 | <Unit filename="src/include/pw3270/v3270.h" /> |
104 | 104 | <Unit filename="src/include/rules.mak.in" /> |
105 | + <Unit filename="src/java/Makefile.in"> | |
106 | + <Option target="Debug" /> | |
107 | + <Option target="Release" /> | |
108 | + </Unit> | |
109 | + <Unit filename="src/java/actions.cc"> | |
110 | + <Option target="Debug" /> | |
111 | + <Option target="Release" /> | |
112 | + </Unit> | |
113 | + <Unit filename="src/java/connect.cc"> | |
114 | + <Option target="Debug" /> | |
115 | + <Option target="Release" /> | |
116 | + </Unit> | |
117 | + <Unit filename="src/java/cursor.cc"> | |
118 | + <Option target="Debug" /> | |
119 | + <Option target="Release" /> | |
120 | + </Unit> | |
121 | + <Unit filename="src/java/getset.cc"> | |
122 | + <Option target="Debug" /> | |
123 | + <Option target="Release" /> | |
124 | + </Unit> | |
125 | + <Unit filename="src/java/info.cc"> | |
126 | + <Option target="Debug" /> | |
127 | + <Option target="Release" /> | |
128 | + </Unit> | |
129 | + <Unit filename="src/java/keyboard.cc"> | |
130 | + <Option target="Debug" /> | |
131 | + <Option target="Release" /> | |
132 | + </Unit> | |
133 | + <Unit filename="src/java/main.cc"> | |
134 | + <Option target="Debug" /> | |
135 | + <Option target="Release" /> | |
136 | + </Unit> | |
137 | + <Unit filename="src/java/plugin.cc"> | |
138 | + <Option target="Debug" /> | |
139 | + <Option target="Release" /> | |
140 | + </Unit> | |
141 | + <Unit filename="src/java/private.h"> | |
142 | + <Option target="Debug" /> | |
143 | + <Option target="Release" /> | |
144 | + </Unit> | |
145 | + <Unit filename="src/java/sample/bbsample.java"> | |
146 | + <Option target="Debug" /> | |
147 | + <Option target="Release" /> | |
148 | + </Unit> | |
149 | + <Unit filename="src/java/sample/efglobe.java"> | |
150 | + <Option target="Debug" /> | |
151 | + <Option target="Release" /> | |
152 | + </Unit> | |
153 | + <Unit filename="src/java/terminal.java"> | |
154 | + <Option target="Debug" /> | |
155 | + <Option target="Release" /> | |
156 | + </Unit> | |
157 | + <Unit filename="src/java/testprogram.java"> | |
158 | + <Option target="Debug" /> | |
159 | + <Option target="Release" /> | |
160 | + </Unit> | |
105 | 161 | <Unit filename="src/lib3270/3270ds.h" /> |
106 | 162 | <Unit filename="src/lib3270/Makefile.in" /> |
107 | 163 | <Unit filename="src/lib3270/X11keysym.h" /> | ... | ... |
src/java/Makefile.in
... | ... | @@ -25,7 +25,7 @@ |
25 | 25 | # |
26 | 26 | |
27 | 27 | PACKAGE_NAME=@PACKAGE_NAME@ |
28 | -SOURCES=main.cc info.cc connect.cc getset.cc cursor.cc keyboard.cc actions.cc | |
28 | +SOURCES=main.cc info.cc connect.cc getset.cc cursor.cc keyboard.cc actions.cc field.cc dialog.cc clipboard.cc | |
29 | 29 | PLUGIN_SRC=plugin.cc |
30 | 30 | |
31 | 31 | #---[ Paths ]------------------------------------------------------------------ |
... | ... | @@ -55,6 +55,7 @@ JAR=@JAR@ |
55 | 55 | JAVADOC=@JAVADOC@ |
56 | 56 | JDK_HOME=@JDK_HOME@ |
57 | 57 | JRE_HOME=@JRE_HOME@ |
58 | +JVMDIR=@JVMDIR@ | |
58 | 59 | |
59 | 60 | #---[ Paths ]------------------------------------------------------------------ |
60 | 61 | |
... | ... | @@ -78,8 +79,14 @@ include $(CLASSLIBDIR)/class.mak |
78 | 79 | #---[ Build options ]---------------------------------------------------------- |
79 | 80 | |
80 | 81 | CXXFLAGS=@CXXFLAGS@ @DLL_CFLAGS@ @JNI_CPPFLAGS@ -I../include |
81 | -PLUGIN_CFLAGS=@CXXFLAGS@ @DLL_CFLAGS@ @JNI_CPPFLAGS@ @GTK_CFLAGS@ @GTKMAC_CFLAGS@ -I../include | |
82 | -PLUGINS_LIBS=@GTK_LIBS@ @GTKMAC_LIBS@ | |
82 | + | |
83 | +PW3270_LIBS ?= -L../../.bin/Debug@DLLDIR@ -l3270 -lpw3270 | |
84 | +PW3270_CFLAGS ?= -I../include | |
85 | + | |
86 | +PLUGIN_CFLAGS=@CXXFLAGS@ @DLL_CFLAGS@ @JNI_CPPFLAGS@ -DJNIDIR="\"$(jnidir)\"" \ | |
87 | + -DJARDIR="\"$(jvmjardir)\"" @GTK_CFLAGS@ @GTKMAC_CFLAGS@ $(PW3270_CFLAGS) | |
88 | + | |
89 | +PLUGIN_LIBS=@GTK_LIBS@ @GTKMAC_LIBS@ $(PW3270_LIBS) @JVM_LIBS@ | |
83 | 90 | |
84 | 91 | #---[ Rules ]------------------------------------------------------------------ |
85 | 92 | |
... | ... | @@ -146,14 +153,14 @@ $(BINRLS)@DLLDIR@/@DLLPREFIX@jni3270@DLLEXT@: \ |
146 | 153 | |
147 | 154 | @echo " LD `basename $@`" |
148 | 155 | @$(MKDIR) `dirname $@` |
149 | - @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -o $@ $^ $(CLASS_LIBS) | |
156 | + @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -Wl,-soname,`basename $@` -o $@ $^ $(CLASS_LIBS) | |
150 | 157 | |
151 | 158 | $(BINRLS)/plugins/j3270@DLLEXT@: \ |
152 | 159 | $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJRLS)/j3270/$(SRC)@OBJEXT@) |
153 | 160 | |
154 | 161 | @echo " LD `basename $@`" |
155 | 162 | @$(MKDIR) `dirname $@` |
156 | - @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -o $@ $^ $(CLASS_LIBS) $(PLUGIN_LIBS) -ljni3270 | |
163 | + @$(CXX) @SYSDLL_FLAGS@ -Wl,--rpath,$(jnidir) $(LDFLAGS) -o $@ $^ $(CLASS_LIBS) $(PLUGIN_LIBS) -L$(BINDBG)@DLLDIR@ -ljni3270 | |
157 | 164 | |
158 | 165 | #---[ Debug targets ]---------------------------------------------------------- |
159 | 166 | |
... | ... | @@ -167,7 +174,7 @@ $(BINDBG)@DLLDIR@/@DLLPREFIX@jni3270@DLLEXT@: \ |
167 | 174 | |
168 | 175 | @echo " LD `basename $@`" |
169 | 176 | @$(MKDIR) `dirname $@` |
170 | - @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -o $@ $^ $(CLASS_LIBS) | |
177 | + @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -Wl,-soname,`basename $@` -o $@ $^ $(CLASS_LIBS) | |
171 | 178 | |
172 | 179 | $(BINDBG)/plugins/j3270@DLLEXT@: \ |
173 | 180 | $(BINDBG)@DLLDIR@/@DLLPREFIX@jni3270@DLLEXT@ \ |
... | ... | @@ -175,10 +182,10 @@ $(BINDBG)/plugins/j3270@DLLEXT@: \ |
175 | 182 | |
176 | 183 | @echo " LD `basename $@`" |
177 | 184 | @$(MKDIR) `dirname $@` |
178 | - @$(CXX) @SYSDLL_FLAGS@ @DBGRPATH@ $(LDFLAGS) -o $@ $^ $(CLASS_LIBS) $(PLUGIN_LIBS) -L$(BINDBG)@DLLDIR@ -ljni3270 | |
185 | + $(CXX) @SYSDLL_FLAGS@ -Wl,--rpath,.bin/Debug@DLLDIR@ $(LDFLAGS) -Wl,-soname,`basename $@` -o $@ $^ $(CLASS_LIBS) $(PLUGIN_LIBS) -L$(BINDBG)@DLLDIR@ -ljni3270 | |
179 | 186 | |
180 | 187 | run: $(BINDBG)@DLLDIR@/@DLLPREFIX@jni3270@DLLEXT@ $(BINDIR)/java/testprogram.class |
181 | - @LD_LIBRARY_PATH=../../.bin/Debug/lib/ java -Djava.library.path=$(BINDBG)@DLLDIR@ -cp .bin/java/ testprogram | |
188 | + @LD_LIBRARY_PATH=../../.bin/Debug@DLLDIR@/ java -Djava.library.path=$(BINDBG)@DLLDIR@ -cp .bin/java/ testprogram | |
182 | 189 | |
183 | 190 | #---[ Misc targets ]----------------------------------------------------------- |
184 | 191 | ... | ... |
... | ... | @@ -0,0 +1,117 @@ |
1 | +/* | |
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
5 | + * | |
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
7 | + * | |
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
10 | + * Free Software Foundation. | |
11 | + * | |
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
15 | + * obter mais detalhes. | |
16 | + * | |
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | |
19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | |
20 | + * | |
21 | + * Este programa está nomeado como dialog.cc e possui - linhas de código. | |
22 | + * | |
23 | + * Contatos: | |
24 | + * | |
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
27 | + * | |
28 | + */ | |
29 | + | |
30 | + #include "jni3270.h" | |
31 | + #include "private.h" | |
32 | + | |
33 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | |
34 | + | |
35 | +JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1copy(JNIEnv *env, jobject obj, jstring j_str) { | |
36 | + | |
37 | + const char * str = env->GetStringUTFChars(j_str, 0); | |
38 | + jint rc = -1; | |
39 | + | |
40 | + try { | |
41 | + | |
42 | + rc = getHandle(env,obj)->set_copy(str); | |
43 | + | |
44 | + } catch(std::exception &e) { | |
45 | + | |
46 | + env->ReleaseStringUTFChars( j_str, str); | |
47 | + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); | |
48 | + return -1; | |
49 | + | |
50 | + } | |
51 | + | |
52 | + env->ReleaseStringUTFChars( j_str, str); | |
53 | + return rc; | |
54 | + | |
55 | +} | |
56 | + | |
57 | +JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1copy(JNIEnv *env, jobject obj) { | |
58 | + | |
59 | + string str; | |
60 | + | |
61 | + try { | |
62 | + | |
63 | + str = getHandle(env,obj)->get_copy(); | |
64 | + | |
65 | + | |
66 | + } catch(std::exception &e) { | |
67 | + | |
68 | + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); | |
69 | + | |
70 | + } | |
71 | + | |
72 | + return env->NewStringUTF(str.c_str()); | |
73 | + | |
74 | + | |
75 | +} | |
76 | + | |
77 | +JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1clipboard(JNIEnv *env, jobject obj) { | |
78 | + | |
79 | + string str; | |
80 | + | |
81 | + try { | |
82 | + | |
83 | + str = getHandle(env,obj)->get_clipboard(); | |
84 | + | |
85 | + | |
86 | + } catch(std::exception &e) { | |
87 | + | |
88 | + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); | |
89 | + | |
90 | + } | |
91 | + | |
92 | + return env->NewStringUTF(str.c_str()); | |
93 | + | |
94 | +} | |
95 | + | |
96 | +JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1clipboard(JNIEnv *env, jobject obj, jstring j_str) { | |
97 | + | |
98 | + const char * str = env->GetStringUTFChars(j_str, 0); | |
99 | + jint rc = -1; | |
100 | + | |
101 | + try { | |
102 | + | |
103 | + rc = getHandle(env,obj)->set_clipboard(str); | |
104 | + | |
105 | + } catch(std::exception &e) { | |
106 | + | |
107 | + env->ReleaseStringUTFChars( j_str, str); | |
108 | + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); | |
109 | + return -1; | |
110 | + | |
111 | + } | |
112 | + | |
113 | + env->ReleaseStringUTFChars( j_str, str); | |
114 | + return rc; | |
115 | + | |
116 | + | |
117 | +} | ... | ... |
... | ... | @@ -0,0 +1,91 @@ |
1 | +/* | |
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
5 | + * | |
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
7 | + * | |
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
10 | + * Free Software Foundation. | |
11 | + * | |
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
15 | + * obter mais detalhes. | |
16 | + * | |
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | |
19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | |
20 | + * | |
21 | + * Este programa está nomeado como dialog.cc e possui - linhas de código. | |
22 | + * | |
23 | + * Contatos: | |
24 | + * | |
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
27 | + * | |
28 | + */ | |
29 | + | |
30 | + #include "jni3270.h" | |
31 | + #include "private.h" | |
32 | + | |
33 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | |
34 | + | |
35 | +JNIEXPORT jint JNICALL Java_pw3270_terminal_popup_1dialog(JNIEnv *env, jobject obj, jint id, jstring j_title, jstring j_message, jstring j_secondary) { | |
36 | + | |
37 | + const char * title = env->GetStringUTFChars(j_title, 0); | |
38 | + const char * message = env->GetStringUTFChars(j_message, 0); | |
39 | + const char * secondary = env->GetStringUTFChars(j_secondary, 0); | |
40 | + jint rc; | |
41 | + | |
42 | + try { | |
43 | + | |
44 | + rc = (jint) getHandle(env,obj)->popup_dialog((LIB3270_NOTIFY) id, title, message, secondary); | |
45 | + | |
46 | + } catch(std::exception &e) { | |
47 | + | |
48 | + env->ReleaseStringUTFChars( j_title, title); | |
49 | + env->ReleaseStringUTFChars( j_message, message); | |
50 | + env->ReleaseStringUTFChars( j_secondary, secondary); | |
51 | + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); | |
52 | + | |
53 | + } | |
54 | + | |
55 | + env->ReleaseStringUTFChars( j_title, title); | |
56 | + env->ReleaseStringUTFChars( j_message, message); | |
57 | + env->ReleaseStringUTFChars( j_secondary, secondary); | |
58 | + | |
59 | + return rc; | |
60 | + | |
61 | +} | |
62 | + | |
63 | +JNIEXPORT jstring JNICALL Java_pw3270_terminal_file_1chooser_1dialog(JNIEnv *env, jobject obj, jint action, jstring j_title, jstring j_extension, jstring j_filename) { | |
64 | + | |
65 | + string str; | |
66 | + const char * title = env->GetStringUTFChars(j_title, 0); | |
67 | + const char * extension = env->GetStringUTFChars(j_extension, 0); | |
68 | + const char * filename = env->GetStringUTFChars(j_filename, 0); | |
69 | + jint rc; | |
70 | + | |
71 | + try { | |
72 | + | |
73 | + str = getHandle(env,obj)->file_chooser_dialog((int) action, title, extension, filename); | |
74 | + | |
75 | + } catch(std::exception &e) { | |
76 | + | |
77 | + env->ReleaseStringUTFChars( j_title, title); | |
78 | + env->ReleaseStringUTFChars( j_extension, extension); | |
79 | + env->ReleaseStringUTFChars( j_filename, filename); | |
80 | + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); | |
81 | + | |
82 | + } | |
83 | + | |
84 | + env->ReleaseStringUTFChars( j_title, title); | |
85 | + env->ReleaseStringUTFChars( j_extension, extension); | |
86 | + env->ReleaseStringUTFChars( j_filename, filename); | |
87 | + | |
88 | + return env->NewStringUTF(str.c_str()); | |
89 | + | |
90 | + | |
91 | +} | ... | ... |
... | ... | @@ -0,0 +1,91 @@ |
1 | +/* | |
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
5 | + * | |
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
7 | + * | |
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
10 | + * Free Software Foundation. | |
11 | + * | |
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
15 | + * obter mais detalhes. | |
16 | + * | |
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | |
19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | |
20 | + * | |
21 | + * Este programa está nomeado como field.cc e possui - linhas de código. | |
22 | + * | |
23 | + * Contatos: | |
24 | + * | |
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
27 | + * | |
28 | + */ | |
29 | + | |
30 | + #include "jni3270.h" | |
31 | + #include "private.h" | |
32 | + | |
33 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | |
34 | + | |
35 | +JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1field_1start (JNIEnv *env, jobject obj, jint baddr) { | |
36 | + | |
37 | + jint rc; | |
38 | + | |
39 | + try { | |
40 | + | |
41 | + rc = getHandle(env,obj)->get_field_start((int) baddr); | |
42 | + | |
43 | + | |
44 | + } catch(std::exception &e) { | |
45 | + | |
46 | + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); | |
47 | + | |
48 | + } | |
49 | + | |
50 | + return rc; | |
51 | + | |
52 | +} | |
53 | + | |
54 | +JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1field_1len (JNIEnv *env, jobject obj, jint baddr) { | |
55 | + | |
56 | + jint rc; | |
57 | + | |
58 | + try { | |
59 | + | |
60 | + rc = getHandle(env,obj)->get_field_len((int) baddr); | |
61 | + | |
62 | + | |
63 | + } catch(std::exception &e) { | |
64 | + | |
65 | + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); | |
66 | + | |
67 | + } | |
68 | + | |
69 | + return rc; | |
70 | + | |
71 | +} | |
72 | + | |
73 | +JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1next_1unprotected(JNIEnv *env, jobject obj, jint baddr) { | |
74 | + | |
75 | + jint rc; | |
76 | + | |
77 | + try { | |
78 | + | |
79 | + rc = getHandle(env,obj)->get_next_unprotected((int) baddr); | |
80 | + | |
81 | + | |
82 | + } catch(std::exception &e) { | |
83 | + | |
84 | + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); | |
85 | + | |
86 | + } | |
87 | + | |
88 | + return rc; | |
89 | + | |
90 | + | |
91 | +} | ... | ... |
src/java/getset.cc
... | ... | @@ -138,3 +138,43 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_input_1string(JNIEnv *env, jobject o |
138 | 138 | |
139 | 139 | } |
140 | 140 | |
141 | +JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1connected(JNIEnv *env, jobject obj) { | |
142 | + | |
143 | + jboolean rc = false; | |
144 | + | |
145 | + try { | |
146 | + | |
147 | + rc = getHandle(env,obj)->is_connected(); | |
148 | + | |
149 | + } catch(std::exception &e) { | |
150 | + | |
151 | + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); | |
152 | + return rc; | |
153 | + | |
154 | + } | |
155 | + | |
156 | + | |
157 | + return rc; | |
158 | + | |
159 | +} | |
160 | + | |
161 | +JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1ready(JNIEnv *env, jobject obj) { | |
162 | + | |
163 | + jboolean rc = false; | |
164 | + | |
165 | + try { | |
166 | + | |
167 | + rc = getHandle(env,obj)->is_ready(); | |
168 | + | |
169 | + } catch(std::exception &e) { | |
170 | + | |
171 | + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); | |
172 | + return rc; | |
173 | + | |
174 | + } | |
175 | + | |
176 | + | |
177 | + return rc; | |
178 | + | |
179 | +} | |
180 | + | ... | ... |
src/java/jni3270.cbp
... | ... | @@ -39,12 +39,20 @@ |
39 | 39 | <Add option="-Wall" /> |
40 | 40 | </Compiler> |
41 | 41 | <Unit filename="../../configure.ac" /> |
42 | + <Unit filename="../classlib/exception.cc" /> | |
43 | + <Unit filename="../classlib/local.cc" /> | |
44 | + <Unit filename="../classlib/remote.cc" /> | |
45 | + <Unit filename="../classlib/session.cc" /> | |
46 | + <Unit filename="../classlib/testprogram.cc" /> | |
42 | 47 | <Unit filename="../include/lib3270.h" /> |
43 | 48 | <Unit filename="../include/pw3270/class.h" /> |
44 | 49 | <Unit filename="Makefile.in" /> |
45 | 50 | <Unit filename="actions.cc" /> |
51 | + <Unit filename="clipboard.cc" /> | |
46 | 52 | <Unit filename="connect.cc" /> |
47 | 53 | <Unit filename="cursor.cc" /> |
54 | + <Unit filename="dialog.cc" /> | |
55 | + <Unit filename="field.cc" /> | |
48 | 56 | <Unit filename="getset.cc" /> |
49 | 57 | <Unit filename="info.cc" /> |
50 | 58 | <Unit filename="jni3270.h" /> | ... | ... |
src/java/main.cc
... | ... | @@ -121,3 +121,23 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_wait_1for_1ready(JNIEnv *env, jobjec |
121 | 121 | return 0; |
122 | 122 | |
123 | 123 | } |
124 | + | |
125 | +JNIEXPORT void JNICALL Java_pw3270_terminal_log(JNIEnv *env, jobject obj, jstring j_str) { | |
126 | + | |
127 | + const char * str = env->GetStringUTFChars(j_str, 0); | |
128 | + | |
129 | + try { | |
130 | + | |
131 | + getHandle(env,obj)->log("%s", str); | |
132 | + | |
133 | + } catch(std::exception &e) { | |
134 | + | |
135 | + env->ReleaseStringUTFChars( j_str, str); | |
136 | + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); | |
137 | + return; | |
138 | + | |
139 | + } | |
140 | + | |
141 | + env->ReleaseStringUTFChars( j_str, str); | |
142 | + | |
143 | +} | ... | ... |
src/java/plugin.cc
... | ... | @@ -313,7 +313,7 @@ |
313 | 313 | |
314 | 314 | LIB3270_EXPORT int pw3270_plugin_start(GtkWidget *window) |
315 | 315 | { |
316 | - trace("%s",__FUNCTION__); | |
316 | + trace("JAVA: %s",__FUNCTION__); | |
317 | 317 | #if GTK_CHECK_VERSION(2,32,0) |
318 | 318 | g_mutex_init(&mutex); |
319 | 319 | #endif // GTK_CHECK_VERSION |
... | ... | @@ -326,7 +326,224 @@ |
326 | 326 | #if GTK_CHECK_VERSION(2,32,0) |
327 | 327 | g_mutex_clear(&mutex); |
328 | 328 | #endif // GTK_CHECK_VERSION |
329 | - trace("%s",__FUNCTION__); | |
329 | + trace("JAVA: %s",__FUNCTION__); | |
330 | 330 | return 0; |
331 | 331 | } |
332 | 332 | |
333 | + void call_java_program(GtkAction *action, GtkWidget *widget, const gchar *filename) | |
334 | + { | |
335 | + | |
336 | +#if GTK_CHECK_VERSION(2,32,0) | |
337 | + if(!g_mutex_trylock(&mutex)) { | |
338 | +#else | |
339 | + if(!g_static_mutex_trylock(&mutex)) { | |
340 | +#endif // GTK_CHECK_VERSION | |
341 | + | |
342 | + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), | |
343 | + GTK_DIALOG_DESTROY_WITH_PARENT, | |
344 | + GTK_MESSAGE_ERROR, | |
345 | + GTK_BUTTONS_CANCEL, | |
346 | + _( "Can't start %s program" ), "java" ); | |
347 | + | |
348 | + gtk_window_set_title(GTK_WINDOW(dialog),_( "JVM busy" )); | |
349 | + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),_( "%s interpreter is busy" ), "java"); | |
350 | + | |
351 | + gtk_dialog_run(GTK_DIALOG (dialog)); | |
352 | + gtk_widget_destroy(dialog); | |
353 | + | |
354 | + return; | |
355 | + } | |
356 | + | |
357 | + v3270_set_script(widget,'J',TRUE); | |
358 | + | |
359 | + // Start JNI | |
360 | + JavaVMInitArgs vm_args; | |
361 | + JavaVMOption options[5]; | |
362 | + | |
363 | + JavaVM * jvm = NULL; | |
364 | + JNIEnv * env = NULL; | |
365 | + jint rc = 0; | |
366 | + | |
367 | + memset(&vm_args,0,sizeof(vm_args)); | |
368 | + memset(options,0,sizeof(options)); | |
369 | + | |
370 | + vm_args.version = JNI_VERSION_1_2; | |
371 | + vm_args.nOptions = 0; | |
372 | + vm_args.options = options; | |
373 | + | |
374 | +#ifdef DEBUG | |
375 | + options[vm_args.nOptions++].optionString = g_strdup("-verbose"); | |
376 | +#endif | |
377 | + | |
378 | + gchar * dirname = g_path_get_dirname(filename); | |
379 | + | |
380 | +#if defined( WIN32 ) | |
381 | + | |
382 | + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s","."); | |
383 | + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=.;%s",dirname); | |
384 | + | |
385 | +#else | |
386 | + | |
387 | + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",JNIDIR); | |
388 | + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s:%s",JARDIR,dirname); | |
389 | + | |
390 | +#endif // JNIDIR | |
391 | + | |
392 | + g_free(dirname); | |
393 | + | |
394 | + rc = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args); | |
395 | + | |
396 | + // Release options | |
397 | + for(size_t f=0;f<vm_args.nOptions;f++) { | |
398 | + trace("Releasing option %d: %s",f,options[f].optionString); | |
399 | + g_free(options[f].optionString); | |
400 | + } | |
401 | + | |
402 | + if(rc < 0) { | |
403 | + | |
404 | + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), | |
405 | + GTK_DIALOG_DESTROY_WITH_PARENT, | |
406 | + GTK_MESSAGE_ERROR, | |
407 | + GTK_BUTTONS_CANCEL, | |
408 | + "%s", _( "Can't create java VM" )); | |
409 | + | |
410 | + gtk_window_set_title(GTK_WINDOW(dialog), _( "Script startup failure" )); | |
411 | + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),_( "The error code was %d" ), (int) rc); | |
412 | + | |
413 | + gtk_dialog_run(GTK_DIALOG (dialog)); | |
414 | + gtk_widget_destroy(dialog); | |
415 | + | |
416 | + } else { | |
417 | + | |
418 | + gchar * classname = g_path_get_basename(filename); | |
419 | + | |
420 | + gchar * ptr = strchr(classname,'.'); | |
421 | + if(ptr) { | |
422 | + *ptr = 0; | |
423 | + } | |
424 | + | |
425 | + jclass cls = env->FindClass(classname); | |
426 | + | |
427 | + if(cls == 0) { | |
428 | + | |
429 | + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), | |
430 | + GTK_DIALOG_DESTROY_WITH_PARENT, | |
431 | + GTK_MESSAGE_ERROR, | |
432 | + GTK_BUTTONS_CANCEL, | |
433 | + _( "Can't find class %s" ), classname ); | |
434 | + | |
435 | + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java script failure" )); | |
436 | + if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) | |
437 | + gtk_main_quit(); | |
438 | + gtk_widget_destroy(dialog); | |
439 | + | |
440 | + } else { | |
441 | + | |
442 | + jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V"); | |
443 | + | |
444 | + if(mid == 0) { | |
445 | + | |
446 | + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), | |
447 | + GTK_DIALOG_DESTROY_WITH_PARENT, | |
448 | + GTK_MESSAGE_ERROR, | |
449 | + GTK_BUTTONS_OK_CANCEL, | |
450 | + _( "Can't find class \"%s\"" ), classname ); | |
451 | + | |
452 | + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java script failure" )); | |
453 | + if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) | |
454 | + gtk_main_quit(); | |
455 | + gtk_widget_destroy(dialog); | |
456 | + | |
457 | + } else { | |
458 | + | |
459 | + jobjectArray args = env->NewObjectArray(0, env->FindClass("java/lang/String"), env->NewStringUTF("")); | |
460 | + | |
461 | + env->CallStaticVoidMethod(cls, mid, args); | |
462 | + | |
463 | + } | |
464 | + | |
465 | + } | |
466 | + | |
467 | + g_free(classname); | |
468 | + | |
469 | + | |
470 | + jvm->DestroyJavaVM(); | |
471 | + } | |
472 | + | |
473 | + // And release | |
474 | + v3270_set_script(widget,'J',FALSE); | |
475 | + | |
476 | +#if GTK_CHECK_VERSION(2,32,0) | |
477 | + g_mutex_unlock(&mutex); | |
478 | +#else | |
479 | + g_static_mutex_unlock(&mutex); | |
480 | +#endif // GTK_CHECK_VERSION | |
481 | + | |
482 | + | |
483 | + } | |
484 | + | |
485 | + | |
486 | +extern "C" | |
487 | +{ | |
488 | + LIB3270_EXPORT void pw3270_action_java_activated(GtkAction *action, GtkWidget *widget) | |
489 | + { | |
490 | + gchar *filename = (gchar *) g_object_get_data(G_OBJECT(action),"src"); | |
491 | + | |
492 | + lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p",gtk_action_get_name(action),widget); | |
493 | + | |
494 | +#if GTK_CHECK_VERSION(3,10,0) | |
495 | + g_simple_action_set_enabled(G_SIMPLE_ACTION(action),FALSE); | |
496 | +#else | |
497 | + gtk_action_set_sensitive(action,FALSE); | |
498 | +#endif // GTK(3,10) | |
499 | + | |
500 | + if(filename) | |
501 | + { | |
502 | + // Has filename, call it directly | |
503 | + call_java_program(action,widget,filename); | |
504 | + } | |
505 | + else | |
506 | + { | |
507 | + // No filename, ask user | |
508 | + static const struct _list | |
509 | + { | |
510 | + const gchar *name; | |
511 | + const gchar *pattern; | |
512 | + } list[] = | |
513 | + { | |
514 | + { N_( "Java class file" ), "*.class" } | |
515 | + }; | |
516 | + | |
517 | + GtkFileFilter * filter[G_N_ELEMENTS(list)+1]; | |
518 | + unsigned int f; | |
519 | + | |
520 | + memset(filter,0,sizeof(filter)); | |
521 | + | |
522 | + for(f=0;f<G_N_ELEMENTS(list);f++) | |
523 | + { | |
524 | + filter[f] = gtk_file_filter_new(); | |
525 | + gtk_file_filter_set_name(filter[f],gettext(list[f].name)); | |
526 | + gtk_file_filter_add_pattern(filter[f],list[f].pattern); | |
527 | + } | |
528 | + | |
529 | + filename = pw3270_get_filename(widget,"java","script",filter,_( "Select script to run" )); | |
530 | + | |
531 | + if(filename) | |
532 | + { | |
533 | + call_java_program(action,widget,filename); | |
534 | + g_free(filename); | |
535 | + } | |
536 | + | |
537 | + | |
538 | + } | |
539 | + | |
540 | +#if GTK_CHECK_VERSION(3,10,0) | |
541 | + g_simple_action_set_enabled(G_SIMPLE_ACTION(action),TRUE); | |
542 | +#else | |
543 | + gtk_action_set_sensitive(action,TRUE); | |
544 | +#endif // GTK(3,10) | |
545 | + | |
546 | + } | |
547 | + | |
548 | +} | |
549 | + | ... | ... |
src/java/terminal.java
... | ... | @@ -251,6 +251,103 @@ public class terminal |
251 | 251 | } |
252 | 252 | |
253 | 253 | /** |
254 | + * Get the field start address. | |
255 | + * | |
256 | + * @param baddr address of the field. | |
257 | + * | |
258 | + * @return Address of current field start. | |
259 | + * | |
260 | + */ | |
261 | + public native int get_field_start(int baddr); | |
262 | + | |
263 | + /** | |
264 | + * Get the current field start address. | |
265 | + * | |
266 | + * @return Current field start address. | |
267 | + * | |
268 | + */ | |
269 | + public int get_field_start() { | |
270 | + return get_field_start(-1); | |
271 | + } | |
272 | + | |
273 | + /** | |
274 | + * Get the field length. | |
275 | + * | |
276 | + * @param baddr Address of the field. | |
277 | + * | |
278 | + * @return Field length. | |
279 | + * | |
280 | + */ | |
281 | + public native int get_field_len(int baddr); | |
282 | + | |
283 | + /** | |
284 | + * Get the current field length. | |
285 | + * | |
286 | + * @return Current field length. | |
287 | + * | |
288 | + */ | |
289 | + public int get_field_len() { | |
290 | + return get_field_len(-1); | |
291 | + } | |
292 | + | |
293 | + /** | |
294 | + * Get next field address. | |
295 | + * | |
296 | + * @param Field address. | |
297 | + * | |
298 | + * @return Address of the next field. | |
299 | + * | |
300 | + */ | |
301 | + public native int get_next_unprotected(int baddr); | |
302 | + | |
303 | + /** | |
304 | + * Get next field address. | |
305 | + * | |
306 | + * @return Address of the next field. | |
307 | + * | |
308 | + */ | |
309 | + public int get_next_unprotected() { | |
310 | + return get_next_unprotected(-1); | |
311 | + } | |
312 | + | |
313 | + /** | |
314 | + * Open popup dialog. | |
315 | + * | |
316 | + * @param id Dialog type. | |
317 | + * @param title Window title. | |
318 | + * @param message Dialog message. | |
319 | + * @param secondary Dialog secondary text. | |
320 | + * | |
321 | + * @return reserved. | |
322 | + * | |
323 | + */ | |
324 | + public native int popup_dialog(int id, String title, String message, String secondary); | |
325 | + | |
326 | + /** | |
327 | + * File selection dialog. | |
328 | + * | |
329 | + * @param action Dialog action. | |
330 | + * @param title Window title. | |
331 | + * @param extension File extension. | |
332 | + * @param filename Default file name; | |
333 | + * | |
334 | + * @return Selected file name. | |
335 | + * | |
336 | + */ | |
337 | + public native String file_chooser_dialog(int action, String title, String extension, String filename); | |
338 | + | |
339 | + public native int set_copy(String text); | |
340 | + public native String get_copy(); | |
341 | + | |
342 | + public native String get_clipboard(); | |
343 | + public native int set_clipboard(String text); | |
344 | + | |
345 | + public native boolean is_connected(); | |
346 | + public native boolean is_ready(); | |
347 | + | |
348 | + public native void log(String msg); | |
349 | + | |
350 | + /** | |
254 | 351 | * Creates a tn3270 terminal associated with a |
255 | 352 | * pw3270 window. |
256 | 353 | * | ... | ... |
src/java/testprogram.java
... | ... | @@ -38,6 +38,9 @@ public class testprogram |
38 | 38 | System.err.println("Begin"); |
39 | 39 | |
40 | 40 | terminal host = new terminal(); |
41 | + | |
42 | + host.log("Sample message"); | |
43 | + | |
41 | 44 | System.err.println("pw3270 version " + host.get_version() + " revision " + host.get_revision() + " encoding " + host.get_encoding()); |
42 | 45 | |
43 | 46 | ... | ... |
src/pw3270/Makefile.in
... | ... | @@ -148,7 +148,7 @@ $(BINDBG)/$(PACKAGE_TARNAME)$(EXEEXT): $(LIBDBG)/@DLLPREFIX@$(PACKAGE_TARNAME)@D |
148 | 148 | $(foreach SRC, $(basename $(APP_SOURCES)), $(OBJDBG)/$(SRC)$(OBJEXT)) |
149 | 149 | @echo " CCLD `basename $@`" |
150 | 150 | @$(MKDIR) `dirname $@` |
151 | - $(LD) @LDARCH@ @DBGRPATH@ -o $@ $(foreach SRC, $(basename $(APP_SOURCES)), $(OBJDBG)/$(SRC)$(OBJEXT)) $(LIBS) $(LIB3270_LIBS) -l$(PACKAGE_TARNAME) | |
151 | + @$(LD) @LDARCH@ @DBGRPATH@ -o $@ $(foreach SRC, $(basename $(APP_SOURCES)), $(OBJDBG)/$(SRC)$(OBJEXT)) $(LIBS) $(LIB3270_LIBS) -l$(PACKAGE_TARNAME) | |
152 | 152 | |
153 | 153 | $(LIBDBG)/@DLLPREFIX@$(PACKAGE_TARNAME)@DLLEXT@: $(LIBDBG)/@DLLPREFIX@$(PACKAGE_TARNAME)@DLLEXT@.@VERSION@ |
154 | 154 | @rm -f $@ | ... | ... |
... | ... | @@ -0,0 +1,42 @@ |
1 | +<!----------------------------------------------------------------------------- | |
2 | + | |
3 | + Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
4 | + (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
5 | + aplicativos mainframe. Registro no INPI sob o nome G3270. | |
6 | + | |
7 | + Copyright (C) <2008> <Banco do Brasil S.A.> | |
8 | + | |
9 | + Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
10 | + os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
11 | + Free Software Foundation. | |
12 | + | |
13 | + Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
14 | + GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
15 | + A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
16 | + obter mais detalhes. | |
17 | + | |
18 | + Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
19 | + programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
20 | + St, Fifth Floor, Boston, MA 02110-1301 USA | |
21 | + | |
22 | + | |
23 | + Contatos: | |
24 | + | |
25 | + perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | + erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
27 | + licinio@bb.com.br (Licínio Luis Branco) | |
28 | + kraucer@bb.com.br (Kraucer Fernandes Mazuco) | |
29 | + | |
30 | +------------------------------------------------------------------------------> | |
31 | + | |
32 | +<ui> | |
33 | + <menubar name='topmenu' topmenu='yes'> | |
34 | + <menu name='FileMenu' label='_File' /> | |
35 | + <menu name='EditMenu' label='_Edit' /> | |
36 | + <menu name='View' label='_View' /> | |
37 | + <menu name='ScriptsMenu' label='Scripts' visible='yes' > | |
38 | + <menuitem action='java' label='External Java Application'/> | |
39 | + </menu> | |
40 | + </menubar> | |
41 | +</ui> | |
42 | + | ... | ... |