From: Danny B. <dan...@us...> - 2011-01-08 13:41:57
|
Update of /cvsroot/roadmap/roadmap/src/android In directory sfp-cvsdas-4.v30.ch3.sourceforge.com:/tmp/cvs-serv1886 Modified Files: AndroidManifest.xml roadmap_dialog.c roadmap_main.c roadmap_messagebox.c Log Message: Work in progress. Much of the user interface is starting to work, too long since last commit of this stuff. Index: AndroidManifest.xml =================================================================== RCS file: /cvsroot/roadmap/roadmap/src/android/AndroidManifest.xml,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** AndroidManifest.xml 14 Aug 2010 13:54:44 -0000 1.2 --- AndroidManifest.xml 8 Jan 2011 13:41:48 -0000 1.3 *************** *** 2,5 **** --- 2,6 ---- <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.sourceforge.projects.roadmap" + android:installLocation="internalOnly" android:versionCode="1" android:versionName="1.0"> Index: roadmap_dialog.c =================================================================== RCS file: /cvsroot/roadmap/roadmap/src/android/roadmap_dialog.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** roadmap_dialog.c 29 Aug 2010 12:30:11 -0000 1.2 --- roadmap_dialog.c 8 Jan 2011 13:41:48 -0000 1.3 *************** *** 3,7 **** * * Copyright 2002 Pascal F. Martin ! * Copyright (c) 2008, 2010, Danny Backx. * * This file is part of RoadMap. --- 3,7 ---- * * Copyright 2002 Pascal F. Martin ! * Copyright (c) 2008, 2010, 2011, Danny Backx. * * This file is part of RoadMap. *************** *** 73,76 **** --- 73,78 ---- typedef struct roadmap_dialog_item *RoadMapDialogItem; + #define MAX_CALLBACKS 3 + struct roadmap_dialog_item { *************** *** 85,89 **** int widget_type; ! int w; short rank; --- 87,91 ---- int widget_type; ! int w; /**< the dialog id */ short rank; *************** *** 93,96 **** --- 95,101 ---- RoadMapDialogCallback callback; + int nbutton; /**< number of buttons already seen */ + RoadMapDialogCallback callbacks[MAX_CALLBACKS]; /**< callbacks for buttons on some dialogs, Android supports up to three */ + char *value; RoadMapDialogSelection *choice; *************** *** 136,141 **** } ! /* ! * roadmap_dialog.c */ static RoadMapDialogItem roadmap_dialog_get (RoadMapDialogItem parent, --- 141,149 ---- } ! /** ! * @brief find the id of a dialog by name, create it if it doesn't exist yet ! * @param parent the dialog looked for should be a child of this parent (not recursive !) ! * @param name what are we looking fore ! * @return pointer to the dialog structure */ static RoadMapDialogItem roadmap_dialog_get (RoadMapDialogItem parent, *************** *** 143,146 **** --- 151,155 ---- // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_get(%s)", name); RoadMapDialogItem child; + int i; if (parent == NULL) { *************** *** 152,155 **** --- 161,165 ---- while (child != NULL) { if (strcmp (child->name, name) == 0) { + // roadmap_log(ROADMAP_WARNING, "roadmap_dialog_get(%p,%s) -> %p", parent, name, child); return child; } *************** *** 166,170 **** child->widget_type = ROADMAP_WIDGET_CONTAINER; /* Safe default. */ ! child->w = NULL; child->count = 0; child->name = strdup(name); --- 176,180 ---- child->widget_type = ROADMAP_WIDGET_CONTAINER; /* Safe default. */ ! child->w = 0; child->count = 0; child->name = strdup(name); *************** *** 176,179 **** --- 186,193 ---- child->choice = NULL; + child->nbutton = 0; + for (i=0; i<MAX_CALLBACKS; i++) + child->callbacks[i] = NULL; + if (parent != NULL) { *************** *** 194,202 **** --- 208,245 ---- RoadMapDialogWindows = child; RoadMapDialogCurrent = child; + // roadmap_log(ROADMAP_WARNING, "roadmap_dialog_get(%s) -> current", name); } + // roadmap_log(ROADMAP_WARNING, "roadmap_dialog_get(%p,%s) -> %p", parent, name, child); return child; } + /** + * @brief lookup by number, don't create a new one if not found + * @param parent look in the hierarchy under this + * @param id look for this dialog + * @return the dialog pointer + */ + static RoadMapDialogItem roadmap_dialog_get_nr (RoadMapDialogItem parent, const int id) { + // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_get_nr(%d)", id); + RoadMapDialogItem child; + + if (parent == NULL) { + child = RoadMapDialogWindows; + } else { + child = parent->children; + } + + while (child != NULL) { + if (child->w == id) { + // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_get_nr -> %p", child); + return child; + } + // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_get_nr found %d", child->w); + child = child->next; + } + + return NULL; + } static void roadmap_dialog_hide_window (RoadMapDialogItem dialog) { *************** *** 208,232 **** } static RoadMapDialogItem roadmap_dialog_new_item (const char *frame, const char *name) { RoadMapDialogItem parent; RoadMapDialogItem child; - // __android_log_print (ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_new_item(%s,%s)", frame, name); parent = roadmap_dialog_get (RoadMapDialogCurrent, frame); child = roadmap_dialog_get (parent, name); ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_new_item -> parent->w %d", parent->w); ! // if (child) __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_new_item -> child->w %d", child->w); ! if (parent->w == NULL) { /* ! * New sub-dialog : create a separate Android dialog */ jclass cls = TheRoadMapClass(); ! jmethodID mid = TheMethod(cls, "CreateDialog", "(Ljava/lang/String;I)I"); jstring js = (*RoadMapJniEnv)->NewStringUTF(RoadMapJniEnv, frame); ! parent->w = (*RoadMapJniEnv)->CallIntMethod(RoadMapJniEnv, RoadMapThiz, mid, js, ! parent->parent->w); // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "CreateDialog -> parent->w %d", parent->w); } --- 251,282 ---- } + /** + * @brief + * @param frame + * @param name + * @return + */ static RoadMapDialogItem roadmap_dialog_new_item (const char *frame, const char *name) { RoadMapDialogItem parent; RoadMapDialogItem child; parent = roadmap_dialog_get (RoadMapDialogCurrent, frame); child = roadmap_dialog_get (parent, name); ! // roadmap_log(ROADMAP_WARNING, "roadmap_dialog_new_item(%s,%s) parent %d child %d", frame, name, parent->w, child ? child->w : -1); ! if (parent->w == 0) { /* ! * Create a heading, don't do structural changes so no additional level of hierarchy. ! * Because of "no additional level", the widget is copied from the parent */ + parent->w = parent->parent->w; + jclass cls = TheRoadMapClass(); ! jmethodID mid = TheMethod(cls, "CreateHeading", "(Ljava/lang/String;I)I"); jstring js = (*RoadMapJniEnv)->NewStringUTF(RoadMapJniEnv, frame); ! (*RoadMapJniEnv)->CallIntMethod(RoadMapJniEnv, RoadMapThiz, mid, js, ! parent->w); // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "CreateDialog -> parent->w %d", parent->w); } *************** *** 238,244 **** if (name[0] != '.') { jclass cls = TheRoadMapClass(); ! jmethodID mid = TheMethod(cls, "DialogAddButton", "(ILjava/lang/String;)I"); jstring js = (*RoadMapJniEnv)->NewStringUTF(RoadMapJniEnv, name); child->w = (*RoadMapJniEnv)->CallIntMethod(RoadMapJniEnv, RoadMapThiz, mid, parent->w, js); } else { --- 288,295 ---- if (name[0] != '.') { jclass cls = TheRoadMapClass(); ! jmethodID mid = TheMethod(cls, "DialogAddLabel", "(ILjava/lang/String;)I"); jstring js = (*RoadMapJniEnv)->NewStringUTF(RoadMapJniEnv, name); + // child->w = (*RoadMapJniEnv)->CallIntMethod(RoadMapJniEnv, RoadMapThiz, mid, RoadMapDialogCurrent->w, js); child->w = (*RoadMapJniEnv)->CallIntMethod(RoadMapJniEnv, RoadMapThiz, mid, parent->w, js); } else { *************** *** 246,249 **** --- 297,301 ---- } + // roadmap_log(ROADMAP_WARNING, "roadmap_dialog_new_item -> %d", child->w); return child; } *************** *** 256,260 **** * If the dialog did exist already, it will be shown on top and * roadmap_dialog_activate() returns 0. ! * This function never fails. The given dialog becomes the curent dialog. * @param name * @param context --- 308,313 ---- * If the dialog did exist already, it will be shown on top and * roadmap_dialog_activate() returns 0. ! * This function never fails. The given dialog becomes the current dialog. ! * * @param name * @param context *************** *** 263,272 **** int roadmap_dialog_activate (const char *name, void *context) { ! __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_activate(%s)", name); RoadMapDialogItem dialog = roadmap_dialog_get (NULL, name); dialog->context = context; ! if (dialog->w != NULL) { /* The dialog exists already: show it on top. */ RoadMapDialogCurrent = dialog; --- 316,325 ---- int roadmap_dialog_activate (const char *name, void *context) { ! roadmap_log(ROADMAP_WARNING, "roadmap_dialog_activate(%s)", name); RoadMapDialogItem dialog = roadmap_dialog_get (NULL, name); dialog->context = context; ! if (dialog->w != 0) { /* The dialog exists already: show it on top. */ RoadMapDialogCurrent = dialog; *************** *** 290,294 **** dialog->w = (*RoadMapJniEnv)->CallIntMethod(RoadMapJniEnv, RoadMapThiz, mid, js, 0); ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "CreateDialog -> dialog->w %d, int name %s", dialog->w, dialog->name); return 1; /* Tell the caller this is a new, undefined, dialog. */ --- 343,347 ---- dialog->w = (*RoadMapJniEnv)->CallIntMethod(RoadMapJniEnv, RoadMapThiz, mid, js, 0); ! // roadmap_log(ROADMAP_WARNING, "CreateDialog(%s) -> %d", name, dialog->w); return 1; /* Tell the caller this is a new, undefined, dialog. */ *************** *** 301,306 **** void roadmap_dialog_hide (const char *name) { ! __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_hide(%s)", name); ! roadmap_dialog_hide_window (roadmap_dialog_get (NULL, name)); } --- 354,359 ---- void roadmap_dialog_hide (const char *name) { ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_hide(%s)", name); ! // roadmap_dialog_hide_window (roadmap_dialog_get (NULL, name)); } *************** *** 311,327 **** */ void roadmap_dialog_new_entry (const char *frame, const char *name) { - // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_new_entry(%s,%s)", frame, name); - jclass cls = TheRoadMapClass(); - jmethodID mid = TheMethod(cls, "DialogAddTextEntry", "(ILjava/lang/String;)I"); - jstring js = (*RoadMapJniEnv)->NewStringUTF(RoadMapJniEnv, name); ! /* Side effect of .._new_item() : creates a widget with this name */ ! RoadMapDialogItem child = roadmap_dialog_new_item (frame, name); ! // RoadMapDialogItem parent = roadmap_dialog_get (NULL, frame); ! // RoadMapDialogItem child = roadmap_dialog_get (parent, name); ! RoadMapDialogItem parent = roadmap_dialog_get (RoadMapDialogCurrent, frame); ! /* Now also create the real "edit" widget */ ! int w = (*RoadMapJniEnv)->CallIntMethod(RoadMapJniEnv, RoadMapThiz, mid, parent->w, js); } --- 364,388 ---- */ void roadmap_dialog_new_entry (const char *frame, const char *name) { ! // roadmap_log(ROADMAP_WARNING, "roadmap_dialog_new_entry(%s,%s)", frame, name); ! jclass cls = TheRoadMapClass(); ! jmethodID mid = TheMethod(cls, "DialogAddTextEntry", "(ILjava/lang/String;)I"); ! jstring js = (*RoadMapJniEnv)->NewStringUTF(RoadMapJniEnv, name); ! RoadMapDialogItem parent, child; ! #if 0 ! child = roadmap_dialog_new_item (frame, name); ! int w = (*RoadMapJniEnv)->CallIntMethod(RoadMapJniEnv, RoadMapThiz, mid, child->w, js); ! /* Return value is the index of the text field in the container widget */ ! child->w = w; ! #else ! child = roadmap_dialog_new_item (frame, name); ! parent = roadmap_dialog_get (RoadMapDialogCurrent, frame); ! child = roadmap_dialog_get (parent, name); ! int w = (*RoadMapJniEnv)->CallIntMethod(RoadMapJniEnv, RoadMapThiz, mid, parent->w, js); ! /* Return value is the index of the text field in the container widget */ ! child->w = w; ! #endif ! // roadmap_log(ROADMAP_WARNING, "roadmap_dialog_new_entry(%s,%s) child->w %d w %d", frame, name, child->w, w); } *************** *** 386,390 **** void *values, RoadMapDialogCallback callback) { ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_new_choice(%s,%s)", frame, name); } --- 447,451 ---- void *values, RoadMapDialogCallback callback) { ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_new_choice(%s,%s) -> count %d", frame, name, count); } *************** *** 398,405 **** */ void roadmap_dialog_new_list (const char *frame, const char *name) { ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_new_list(%s,%s)", frame, name); } void roadmap_dialog_show_list (const char *frame, const char *name, --- 459,522 ---- */ void roadmap_dialog_new_list (const char *frame, const char *name) { ! // roadmap_log(ROADMAP_WARNING, "roadmap_dialog_new_list(%s,%s)", frame, name); ! ! RoadMapDialogItem parent, child; ! if (name[0] == '.') name += 1; ! child = roadmap_dialog_new_item (frame, name); ! ! jclass cls = TheRoadMapClass(); ! jmethodID mid = TheMethod(cls, "DialogCreateList", "(I)V"); ! ! parent = roadmap_dialog_get (RoadMapDialogCurrent, frame); ! (*RoadMapJniEnv)->CallVoidMethod(RoadMapJniEnv, RoadMapThiz, mid, RoadMapDialogCurrent->w); ! ! // child->widget_type = ROADMAP_WIDGET_LIST; ! } + /* + * This used to be a local variable in roadmap_dialog_show_list but then roadmap_dialog_chosen + * can't use it, and the Android NDK/SDK pair aren't good at passing this type of info along. + */ + RoadMapDialogSelection *choice; + + void roadmap_dialog_chosen (int position, long id) { + + RoadMapDialogSelection *selection = &choice[position]; + + if (selection != NULL) { + + selection->item->value = selection->value; + + if (selection->callback != NULL) { + + RoadMapDialogItem item = selection->item; + + while (item->parent != NULL) { + item = item->parent; + } + RoadMapDialogCurrent = item; + + (*selection->callback) (item->name, item->context); + } + } + } + void Java_net_sourceforge_projects_roadmap_RoadMap_RoadMapDialogChosen(JNIEnv* env, jobject thiz, int position, long id) + { + roadmap_dialog_chosen(position, id); + } + + /** + * @brief show a list of items. + * When the user selects an item, the callback must be called with the name of that item and + * its context (used?). + * @param frame determine the dialog + * @param name determine the dialog + * @param count number of list items + * @param labels list item strings + * @param values + * @param callback to be called when user selects + */ void roadmap_dialog_show_list (const char *frame, const char *name, *************** *** 408,412 **** void **values, RoadMapDialogCallback callback) { ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_show_list(%s,%s)", frame, name); } --- 525,583 ---- void **values, RoadMapDialogCallback callback) { ! roadmap_log(ROADMAP_WARNING, "roadmap_dialog_show_list(%s,%s)", frame, name); ! int i; ! RoadMapDialogItem parent; ! RoadMapDialogItem child; ! ! parent = roadmap_dialog_get (RoadMapDialogCurrent, frame); ! child = roadmap_dialog_get (parent, name); ! ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_show_list(%s,%s) -> count %d, cur %d, par %d, child %d", frame, name, count, RoadMapDialogCurrent->w, parent->w, child->w); ! ! // model = gtk_tree_view_get_model (GTK_TREE_VIEW(child->w)); ! if (child->choice != NULL) { ! // gtk_list_store_clear (GTK_LIST_STORE(model)); ! free (child->choice); ! child->choice = NULL; ! } ! ! choice = (RoadMapDialogSelection *) calloc (count, sizeof(*choice)); ! roadmap_check_allocated(choice); ! ! // gtk_tree_selection_set_select_function ! // (gtk_tree_view_get_selection (GTK_TREE_VIEW (child->w)), ! // roadmap_dialog_list_selected, ! // (gpointer)choice, ! // NULL); ! ! jstring js; ! jobjectArray joa; ! jclass cls = TheRoadMapClass(); ! jmethodID mid = TheMethod(cls, "DialogSetListContents", "(I[Ljava/lang/String;)V"); ! ! joa = (*RoadMapJniEnv)->NewObjectArray(RoadMapJniEnv, count, cls, NULL); ! ! for (i = 0; i < count; ++i) { ! ! choice[i].typeid = "RoadMapDialogSelection"; ! choice[i].item = child; ! choice[i].value = values[i]; ! choice[i].callback = callback; ! ! // gtk_list_store_append (GTK_LIST_STORE(model), &iterator); ! // gtk_list_store_set (GTK_LIST_STORE(model), &iterator, ! // RM_LIST_WAYPOINT_NAME, labels[i], ! // -1); ! ! js = (*RoadMapJniEnv)->NewStringUTF(RoadMapJniEnv, labels[i]); ! (*RoadMapJniEnv)->SetObjectArrayElement(RoadMapJniEnv, joa, i, js); ! } ! child->choice = choice; ! child->value = choice[0].value; ! ! // gtk_widget_show (parent->w); ! ! (*RoadMapJniEnv)->CallVoidMethod(RoadMapJniEnv, RoadMapThiz, mid, RoadMapDialogCurrent->w, joa); ! // (*RoadMapJniEnv)->ReleaseObjectArrayElements(RoadMapJniEnv, NULL, joa, JNI_ABORT); } *************** *** 418,422 **** void roadmap_dialog_add_button (const char *label, RoadMapDialogCallback callback) { ! __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_add_button(%s)", label); } --- 589,625 ---- void roadmap_dialog_add_button (const char *label, RoadMapDialogCallback callback) { ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_add_button(%s,%p)", label, callback); ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", " Parent dialog %d {%s}", RoadMapDialogCurrent->w, RoadMapDialogCurrent->name); ! ! jclass cls = TheRoadMapClass(); ! jmethodID mid = TheMethod(cls, "DialogAddSpecialButton", "(ILjava/lang/String;I)I"); ! jstring js = (*RoadMapJniEnv)->NewStringUTF(RoadMapJniEnv, label); ! ! if (RoadMapDialogCurrent->nbutton < 0 || RoadMapDialogCurrent->nbutton > MAX_CALLBACKS) { ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_add_button error nbutton %d", RoadMapDialogCurrent->nbutton); ! return; ! } ! ! (*RoadMapJniEnv)->CallIntMethod(RoadMapJniEnv, RoadMapThiz, mid, ! RoadMapDialogCurrent->w, /* which dialog */ ! js, ! RoadMapDialogCurrent->nbutton); /* which button */ ! ! RoadMapDialogCurrent->callbacks[RoadMapDialogCurrent->nbutton] = callback; ! RoadMapDialogCurrent->nbutton++; ! } ! ! /* ! * @brief callback from one of the "special" buttons in a dialog ! */ ! void ! Java_net_sourceforge_projects_roadmap_RoadMap_DialogSpecialCallback(JNIEnv* env, jobject thiz, int dlg, int btn) ! { ! RoadMapDialogItem dlgp; ! ! dlgp = roadmap_dialog_get_nr(NULL, dlg); ! ! if (dlgp && dlgp->callbacks && dlgp->callbacks[btn]) ! dlgp->callbacks[btn](dlgp->name, dlgp); } *************** *** 443,449 **** void *roadmap_dialog_get_data (const char *frame, const char *name) { ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_get_data(%s,%s)", frame, name); } --- 646,689 ---- + #if 0 + static char *ReturnStringDataHack = NULL; + + void Java_net_sourceforge_projects_roadmap_RoadMap_ReturnStringDataHack(JNIEnv* env, jobject thiz, jstring js) + { + ReturnStringDataHack = (*env)->GetStringUTFChars(env, js, NULL); + } + #endif + + /** + * @brief Look up which selection has been made in this dialog + * @param frame used to determine the dialog + * @param name used to determine the dialog + * @return pointer to the data passed back + */ void *roadmap_dialog_get_data (const char *frame, const char *name) { ! RoadMapDialogItem this_frame, this_item; ! ! // roadmap_log(ROADMAP_WARNING, "roadmap_dialog_get_data(%s,%s)", frame, name); ! this_frame = roadmap_dialog_get (RoadMapDialogCurrent, frame); ! this_item = roadmap_dialog_get (this_frame, name); ! ! if (RoadMapDialogCurrent->w == 0 && this_item->w == 0) { ! roadmap_log(ROADMAP_WARNING, "roadmap_dialog_get_data(%s,%s) null", frame, name); ! return NULL; ! } ! #if 0 ! jclass cls = TheRoadMapClass(); ! jmethodID mid = TheMethod(cls, "DialogGetData", "(II)V"); ! ! (*RoadMapJniEnv)->CallVoidMethod(RoadMapJniEnv, RoadMapThiz, mid, ! RoadMapDialogCurrent->w, ! this_item->w); ! ! this_item->value = ReturnStringDataHack; ! #endif ! roadmap_log(ROADMAP_WARNING, "roadmap_dialog_get_data(%s,%s) -> {%p,%s}", frame, name, this_item->value, this_item->value); ! ! return (void *)this_item->value; } *************** *** 451,455 **** void roadmap_dialog_set_data (const char *frame, const char *name, const void *data) { - // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_dialog_set_data(%s,%s)", frame, name); RoadMapDialogItem this_frame, this_item; --- 691,694 ---- *************** *** 457,473 **** this_item = roadmap_dialog_get (this_frame, name); ! switch (this_item->widget_type) { ! ! case ROADMAP_WIDGET_ENTRY: ! // gtk_entry_set_text (GTK_ENTRY(this_item->w), (const char *)data); ! break; ! case ROADMAP_WIDGET_LABEL: ! // gtk_label_set_text (GTK_LABEL(this_item->w), (const char *)data); ! break; ! } ! this_item->value = (char *)data; } --- 696,711 ---- this_item = roadmap_dialog_get (this_frame, name); ! // roadmap_log(ROADMAP_WARNING, "roadmap_dialog_set_data(%s,%s) cur %d fr %d it %d", frame, name, RoadMapDialogCurrent->w, this_frame->w, this_item->w); ! this_item->value = (char *)data; ! jclass cls = TheRoadMapClass(); ! jmethodID mid = TheMethod(cls, "DialogSetData", "(IILjava/lang/String;)V"); ! jstring js = (*RoadMapJniEnv)->NewStringUTF(RoadMapJniEnv, (const char *)data); ! (*RoadMapJniEnv)->CallVoidMethod(RoadMapJniEnv, RoadMapThiz, mid, ! /* dialog id */ RoadMapDialogCurrent->w, ! /* row id in the dialog */ this_item->w, ! js); } *************** *** 483,484 **** --- 721,770 ---- #warning implement roadmap_dialog_set_progress } + + void roadmap_dialog_shutdown(void) + { + RoadMapDialogWindows = NULL; + RoadMapDialogCurrent = NULL; + } + + #if 0 + /** + * @brief this is a debug function, recursive, prints the hierarchy of the Dialog table + * @param parent + * @param level how many levels deep are we already + */ + void roadmap_dialog_test_r(RoadMapDialogItem parent, int level) + { + RoadMapDialogItem p; + RoadMapDialogItem child; + char prefix[8]; + + strcpy(prefix, "\t\t\t\t\t\t\t"); + prefix[level] = '\0'; + + for (p = parent; p; p = p->next) { + roadmap_log(ROADMAP_WARNING, "%sDialog %p {%s} parent %p next %p widget %d", + prefix, + p, p->name, p->parent, p->next, p->w); + + child = p->children; + while (child != NULL) { + if (child->parent == parent) { + roadmap_log(ROADMAP_WARNING, "%s Child %p {%s}", + prefix, child, child->name); + roadmap_dialog_test_r(child, level + 1); + } + child = child->next; + } + } + } + + /** + * @brief Kickstart the recursive debug function to print the dialog table + */ + void roadmap_dialog_test(void) + { + roadmap_log(ROADMAP_WARNING, "\n OVERVIEW OF DIALOGS \n\tCurrent %p\n\n", RoadMapDialogCurrent); + roadmap_dialog_test_r(RoadMapDialogWindows, 0); + } + #endif Index: roadmap_messagebox.c =================================================================== RCS file: /cvsroot/roadmap/roadmap/src/android/roadmap_messagebox.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** roadmap_messagebox.c 14 Aug 2010 06:22:54 -0000 1.1 --- roadmap_messagebox.c 8 Jan 2011 13:41:48 -0000 1.2 *************** *** 88,93 **** } void roadmap_messagebox_die (const char *title, const char *message) { ! exit(1); } --- 88,104 ---- } + /** + * @brief show a message, then terminate + * All of the real action is in Java, except the hard exit, which is in roadmap_main.c + */ void roadmap_messagebox_die (const char *title, const char *message) { ! jclass cls = TheRoadMapClass(); ! jmethodID mid = TheMethod(cls, "MessageBoxWait", "(Ljava/lang/String;Ljava/lang/String;)V"); ! jstring jstitle, jsmessage; ! ! jstitle = title ? (*RoadMapJniEnv)->NewStringUTF(RoadMapJniEnv, title) : NULL; ! jsmessage = message ? (*RoadMapJniEnv)->NewStringUTF(RoadMapJniEnv, message) : NULL; ! ! (*RoadMapJniEnv)->CallVoidMethod(RoadMapJniEnv, RoadMapThiz, mid, jstitle, jsmessage); } Index: roadmap_main.c =================================================================== RCS file: /cvsroot/roadmap/roadmap/src/android/roadmap_main.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** roadmap_main.c 20 Aug 2010 18:27:33 -0000 1.2 --- roadmap_main.c 8 Jan 2011 13:41:48 -0000 1.3 *************** *** 135,139 **** /** * @brief Create a new menu. ! * Not used on Android, except ... * * @return returned value must be non-null for menus to work (see roadmap_factory.c) --- 135,139 ---- /** * @brief Create a new menu. ! * On Android, this doesn't do much except assigning a unique number. * * @return returned value must be non-null for menus to work (see roadmap_factory.c) *************** *** 145,149 **** jstring js; ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_main_new_menu(%s)", title); js = (*RoadMapJniEnv)->NewStringUTF(RoadMapJniEnv, title); --- 145,149 ---- jstring js; ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_main_new_menu(%s)", title); js = (*RoadMapJniEnv)->NewStringUTF(RoadMapJniEnv, title); *************** *** 162,165 **** --- 162,166 ---- void roadmap_main_add_menu (RoadMapMenu menu, const char *label) { + // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_main_add_menu(%d,%s)", (int)menu, label); /* int m = (int)menu; *************** *** 178,182 **** void roadmap_main_popup_menu (RoadMapMenu menu, const RoadMapGuiPoint *position) { ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_main_popup_menu FIX ME"); } --- 179,183 ---- void roadmap_main_popup_menu (RoadMapMenu menu, const RoadMapGuiPoint *position) { ! __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_main_popup_menu FIX ME"); } *************** *** 184,187 **** --- 185,189 ---- struct callback { RoadMapCallback callback; + char *label; // only for debug } callbacks[150] /* FIX ME make dynamic */; *************** *** 191,196 **** RoadMapCallback callback) { ! if (label == NULL) return; int m = (int)menu; --- 193,200 ---- RoadMapCallback callback) { ! if (label == NULL) { ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_main_add_menu_item(%d,NULL,cb %p)", menu, callback); return; + } int m = (int)menu; *************** *** 202,208 **** int i = (*RoadMapJniEnv)->CallIntMethod(RoadMapJniEnv, RoadMapThiz, mid, m, js); ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_main_add_menu_item(%d,%s,cb %p) -> %d", m, label, callback, i); callbacks[i].callback = callback; } --- 206,213 ---- int i = (*RoadMapJniEnv)->CallIntMethod(RoadMapJniEnv, RoadMapThiz, mid, m, js); ! // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_main_add_menu_item(%d,%s,cb %p) -> %d", m, label, callback, i); callbacks[i].callback = callback; + callbacks[i].label = strdup(label); // only for debug } *************** *** 216,227 **** int roadmap_main_callback(int item) { - // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_main_callback(%d)", item); if (callbacks[item].callback) { (*(callbacks[item].callback))(); return 1; } return 0; } void roadmap_main_add_separator (RoadMapMenu menu) { --- 221,243 ---- int roadmap_main_callback(int item) { if (callbacks[item].callback) { + // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_main_callback(%d,%s) %p", item, callbacks[item].label, callbacks[item].callback); (*(callbacks[item].callback))(); return 1; } + // __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "roadmap_main_callback(%d,%s) %p -> 0", item, callbacks[item].label, callbacks[item].callback); return 0; } + /** + * @brief + * @return 1 if ok, 0 if not found + */ + int + Java_net_sourceforge_projects_roadmap_RoadMap_MenuCallback(JNIEnv* env, jobject thiz, int id) + { + return roadmap_main_callback(id); + } + void roadmap_main_add_separator (RoadMapMenu menu) { *************** *** 508,513 **** --- 524,531 ---- int argc = 1; + roadmap_log(ROADMAP_ERROR, "RoadMap_roadmapStart"); roadmap_option(argc, argv, 0, NULL); roadmap_start(argc, argv); + roadmap_log(ROADMAP_ERROR, "RoadMap_roadmapStart (end)"); return (*env)->NewStringUTF(env, "Hello"); *************** *** 541,544 **** --- 559,565 ---- { RoadMapJniEnv = env; + + __android_log_print(ANDROID_LOG_ERROR, "RoadMap", "RoadMap->JniStart"); + RoadMapJniClass = (*env)->NewGlobalRef(env, (*env)->FindClass(env, "net/sourceforge/projects/roadmap/RoadMap")); *************** *** 597,610 **** /** ! * @brief * @return 1 if ok, 0 if not found */ ! int ! Java_net_sourceforge_projects_roadmap_RoadMap_MenuCallback(JNIEnv* env, jobject thiz, int id) { ! extern int roadmap_main_callback(int); ! ! return roadmap_main_callback(id); } /** * @brief Terminate RoadMap --- 618,630 ---- /** ! * @brief Hard exit * @return 1 if ok, 0 if not found */ ! void ! Java_net_sourceforge_projects_roadmap_RoadMap_HardExit(JNIEnv* env, jobject thiz, int rc) { ! exit(rc); } + /** * @brief Terminate RoadMap *************** *** 628,629 **** --- 648,655 ---- (*RoadMapJniEnv)->CallVoidMethod(RoadMapJniEnv, RoadMapThiz, mid); } + + void roadmap_android_test(void) + { + char *p = NULL; + *p = 'a'; + } |