00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00026
00027
00028
00029
00030
00031 #include <liberdm/display.h>
00032 #include "browserTypes.h"
00033 #include "find.h"
00034 #include "browserLog.h"
00035
00036
00037 #include "nsCOMPtr.h"
00038 #include "nsMemory.h"
00039 #include "gtkmozembed_internal.h"
00040 #include "nsIInterfaceRequestorUtils.h"
00041 #include "nsString.h"
00042 #include "nsIWebBrowser.h"
00043 #include "nsIWebBrowserFind.h"
00044 #include "languages.h"
00045
00046 #ifdef FIND_DIALOG_ENABLED
00047
00048
00049 static void find_dialog_ok_button_cb(GtkWidget * button, gpointer data);
00050
00051
00052 static gboolean mozilla_find_text_in_page(GtkMozEmbed * b,
00053 char *text,
00054 gboolean matchCase, gboolean findBackwards, gboolean entireWord, gboolean wrapFind,
00055 gboolean searchFrames);
00056
00057 static PRUnichar *mozilla_locale_to_unicode(const gchar * locStr);
00058
00059 void browser_find_dialog_create(Ereader * theEreader)
00060 {
00061 GtkWidget *dialog;
00062 GtkWidget *hbox;
00063
00064
00065 GtkWidget *vbox_toggle_buttons;
00066 GtkWidget *entry;
00067 GtkWidget *label;
00068 GtkWidget *match_case;
00069 GtkWidget *find_backwards;
00070 GtkWidget *entire_word;
00071 GtkWidget *wrap_find;
00072 GtkWidget *button;
00073
00074 if (theEreader)
00075 {
00076 BR_LOGPRINTF("entry");
00077
00078
00079
00080
00081 dialog = gtk_dialog_new();
00082
00083 theEreader->dialog = dialog;
00084
00085 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);
00086 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
00087 gtk_window_set_keep_above(GTK_WINDOW(dialog), TRUE);
00088 gtk_widget_set_size_request(dialog, FIND_DIALOG_WIDTH, FIND_DIALOG_HEIGHT);
00089 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
00090 gtk_window_set_title(GTK_WINDOW(dialog), _("Find in this Page"));
00091
00092 hbox = gtk_hbox_new(FALSE, 0);
00093 gtk_container_set_border_width(GTK_CONTAINER(hbox), 4);
00094 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0);
00095
00096 label = gtk_label_new(gettext("Find: "));
00097 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
00098
00099 entry = gtk_entry_new();
00100 g_object_set_data(G_OBJECT(dialog), "entry", entry);
00101 gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0);
00102
00103 vbox_toggle_buttons = gtk_vbox_new(FALSE, 0);
00104 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), vbox_toggle_buttons, FALSE, FALSE, 0);
00105
00106 match_case = gtk_check_button_new_with_label(gettext("Match upper/lower case"));
00107 g_object_set_data(G_OBJECT(dialog), "match_case", match_case);
00108 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(match_case), TRUE);
00109 gtk_box_pack_start(GTK_BOX(vbox_toggle_buttons), match_case, FALSE, FALSE, 0);
00110
00111 find_backwards = gtk_check_button_new_with_label(gettext("Search backwards"));
00112 g_object_set_data(G_OBJECT(dialog), "find_backwards", find_backwards);
00113 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(find_backwards), FALSE);
00114 gtk_box_pack_start(GTK_BOX(vbox_toggle_buttons), find_backwards, FALSE, FALSE, 0);
00115
00116 entire_word = gtk_check_button_new_with_label(gettext("Whole words only"));
00117 g_object_set_data(G_OBJECT(dialog), "entire_word", entire_word);
00118 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(entire_word), FALSE);
00119 gtk_box_pack_start(GTK_BOX(vbox_toggle_buttons), entire_word, FALSE, FALSE, 0);
00120
00121 wrap_find = gtk_check_button_new_with_label(gettext("Wrap around"));
00122 g_object_set_data(G_OBJECT(dialog), "wrap_find", wrap_find);
00123 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(wrap_find), FALSE);
00124 gtk_box_pack_start(GTK_BOX(vbox_toggle_buttons), wrap_find, FALSE, FALSE, 0);
00125
00126 button = gtk_button_new_from_stock(GTK_STOCK_FIND);
00127 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, FALSE, FALSE, 0);
00128 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(find_dialog_ok_button_cb), theEreader);
00129
00130 button = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
00131 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, FALSE, FALSE, 0);
00132 g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer) dialog);
00133
00134 gtk_widget_show_all(dialog);
00135 gtk_widget_grab_focus(entry);
00136 }
00137
00138 return;
00139 }
00140
00141 static void find_dialog_ok_button_cb(GtkWidget * button, gpointer data)
00142 {
00143 GtkWidget *dialog;
00144 GtkEntry *entry;
00145 gboolean matchCase;
00146 gboolean findBackwards;
00147 gboolean entireWord;
00148 gboolean wrapFind;
00149 Ereader *theEreader;
00150 gboolean returnValue;
00151
00152 BR_LOGPRINTF("entry");
00153
00154 theEreader = (Ereader *) data;
00155
00156 if (theEreader)
00157 {
00158 dialog = theEreader->dialog;
00159
00160 if (dialog)
00161 {
00162 matchCase = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(dialog), "match_case")));
00163 findBackwards = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(dialog), "find_backwards")));
00164 entireWord = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(dialog), "entire_word")));
00165 wrapFind = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(dialog), "wrap_find")));
00166
00167 BR_LOGPRINTF("match_case=%s find_backwards=%s entire_word=%s wrap_find=%s -- entry",
00168 matchCase ? "TRUE" : "FALSE", findBackwards ? "TRUE" : "FALSE", entireWord ? "TRUE" : "FALSE",
00169 wrapFind ? "TRUE" : "FALSE");
00170
00171 entry = GTK_ENTRY(g_object_get_data(G_OBJECT(dialog), "entry"));
00172
00173 returnValue = mozilla_find_text_in_page(GTK_MOZ_EMBED(theEreader->mozEmbed), (char *) gtk_entry_get_text(entry), matchCase, findBackwards, entireWord, wrapFind, TRUE);
00174
00175
00176 if (returnValue == TRUE)
00177 {
00178 BR_LOGPRINTF("mozilla_find_text_in_page returned TRUE");
00179 }
00180 else
00181 {
00182 BR_LOGPRINTF("mozilla_find_text_in_page returned FALSE");
00183 }
00184 }
00185 }
00186
00187 BR_LOGPRINTF("destroy the dialog box");
00188
00189 gtk_widget_destroy(dialog);
00190 theEreader->dialog = NULL;
00191 }
00192
00193
00194
00195
00196
00197
00198
00199 static gboolean
00200 mozilla_find_text_in_page(GtkMozEmbed * b,
00201 char *text, gboolean matchCase, gboolean findBackwards, gboolean entireWord, gboolean wrapFind,
00202 gboolean searchFrames)
00203 {
00204 gboolean DidFind = FALSE;
00205 PRUnichar *search_string;
00206 nsIWebBrowser *wb = nsnull;
00207
00208 nsCOMPtr < nsIWebBrowserFind > finder;
00209
00210 BR_LOGPRINTF("entry");
00211
00212 g_return_val_if_fail(b != NULL, FALSE);
00213 gtk_moz_embed_get_nsIWebBrowser(b, &wb);
00214
00215 finder = do_GetInterface(wb);
00216
00217 if (wb)
00218 {
00219 if (finder)
00220 {
00221 search_string = mozilla_locale_to_unicode(text);
00222
00223 finder->SetSearchString(search_string);
00224 finder->SetMatchCase(matchCase);
00225 finder->SetFindBackwards(findBackwards);
00226 finder->SetWrapFind(wrapFind);
00227 finder->SetEntireWord(entireWord);
00228 finder->SetSearchFrames(searchFrames);
00229 finder->FindNext(&DidFind);
00230
00231
00232 g_free(search_string);
00233
00234 }
00235 else
00236 {
00237 BR_ERRORPRINTF("wb = NULL");
00238 }
00239 }
00240 else
00241 {
00242 BR_ERRORPRINTF("finder = NULL");
00243 }
00244
00245 return (DidFind);
00246 }
00247
00248
00249
00250
00251
00252
00253
00254 PRUnichar *mozilla_locale_to_unicode(const gchar * locStr)
00255 {
00256 if (locStr == NULL)
00257 {
00258 return (NULL);
00259 }
00260 nsAutoString autoStr;
00261
00262 autoStr.AssignWithConversion(locStr);
00263 PRUnichar *uniStr = ToNewUnicode(autoStr);
00264
00265 return (uniStr);
00266 }
00267
00268 #endif //FIND_DIALOG_ENABLED