00001
00002
00003
00004
00005
00006
00007
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "config.h"
00029
00030 #include <string.h>
00031 #include <glib.h>
00032 #include <gtk/gtk.h>
00033 #include <glib/gi18n.h>
00034 #include <gtkextra/gtksheet.h>
00035 #include "types.h"
00036 #include "main.h"
00037 #include "tools.h"
00038 #include "dialog_initial.h"
00039
00040 #define ROW_IS_VISIBLE(trow) (tab->view->sheet->row [trow].is_visible)
00041
00042 static GtkWidget *match_entry, *case_sensitive_check;
00043
00044 static gboolean G_GNUC_UNUSED
00045 tools_find_text (QlTabData * tab, gchar * search)
00046 {
00047 gchar *entry;
00048 gchar *low_entry = NULL;
00049 gboolean doing_nocase;
00050 gint32 i, j;
00051 gint32 start_selection = tab->view->sheet->range.row0;
00052
00053 if (!search)
00054 return FALSE;
00055
00056 if ((doing_nocase = !gtk_toggle_button_get_active
00057 (GTK_TOGGLE_BUTTON (case_sensitive_check))))
00058 g_strdown (search);
00059
00060 for (i = 1; i <= tab->file->last_row; i++)
00061 for (j = 0; j <= tab->file->last_field; j++)
00062 {
00063 entry = g_strdup (gtk_sheet_cell_get_text
00064 (tab->view->sheet,
00065 (start_selection + i) % tab->file->last_row, j));
00066 if (entry)
00067 {
00068 if (doing_nocase)
00069 g_strdown (low_entry = g_strdup (entry));
00070 if (strstr ((doing_nocase ? low_entry : entry), search)
00071 && ROW_IS_VISIBLE ((start_selection + i)
00072 % (tab->file->last_row)))
00073 {
00074 gtk_sheet_select_row (tab->view->sheet,
00075 (start_selection + i) % (tab->file->last_row));
00076 gtk_sheet_moveto (tab->view->sheet,
00077 tab->view->sheet->range.row0, 0, 0.0, 0.0);
00078 if (doing_nocase)
00079 g_free (low_entry);
00080 return TRUE;
00081 }
00082 if (doing_nocase)
00083 g_free (low_entry);
00084 g_free (entry);
00085 }
00086 }
00087 return FALSE;
00088 }
00089
00090 static void G_GNUC_UNUSED
00091 tools_match_text (QlTabData * tab, gchar * search)
00092 {
00093 gchar *entry, *low_entry = NULL;
00094 gint32 i, j;
00095 gboolean doing_nocase;
00096
00097 if ((doing_nocase = !gtk_toggle_button_get_active
00098 (GTK_TOGGLE_BUTTON (case_sensitive_check))))
00099 g_strdown (search);
00100
00101
00102 big_draw_start (tab);
00103
00104 for (i = 0; i < tab->file->last_row; i++)
00105 gtk_sheet_row_set_visibility (tab->view->sheet, i, TRUE);
00106 tab->file->filter_ptr = NULL;
00107
00108 gtk_sheet_unselect_range (tab->view->sheet);
00109
00110 for (i = 0; i < tab->file->last_row; i++)
00111 {
00112 gtk_sheet_row_set_visibility (tab->view->sheet, i, FALSE);
00113 for (j = 0; j <= tab->file->last_field; j++)
00114 {
00115 entry = g_strdup (gtk_sheet_cell_get_text (
00116 tab->view->sheet, i, j));
00117 if (entry)
00118 {
00119 if (doing_nocase)
00120 g_strdown (low_entry = g_strdup (entry));
00121 if (strstr (doing_nocase ? low_entry : entry, search))
00122 gtk_sheet_row_set_visibility (tab->view->sheet,
00123 i, TRUE);
00124 g_free (low_entry);
00125 }
00126 }
00127 }
00128 big_draw_end (tab);
00129 }
00130
00134 static void
00135 tools_button_clicked (GtkAction G_GNUC_UNUSED * w, gpointer G_GNUC_UNUSED data)
00136 {
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169 }
00170
00171 void
00172 tools_find (GtkAction G_GNUC_UNUSED * w, gpointer data)
00173 {
00174 GtkWidget *find_dialog, *ok_button, *cancel_button, *hbox;
00175 QlContext * qlc;
00176 QlTabData * tab;
00177
00178 qlc = ql_get_context (GTK_WIDGET(data));
00179 tab = ql_get_tabdata (qlc);
00180 CHECK_CHANGED(tab);
00181
00182
00183 find_dialog = gtk_dialog_new ();
00184 gtk_window_set_modal (GTK_WINDOW (find_dialog), TRUE);
00185 gtk_window_set_position (GTK_WINDOW (find_dialog), GTK_WIN_POS_CENTER);
00186 gtk_window_set_resizable (GTK_WINDOW (find_dialog), TRUE);
00187 gtk_container_set_border_width (GTK_CONTAINER (find_dialog), 5);
00188
00189 gtk_window_set_title (GTK_WINDOW (find_dialog), _("Find next"));
00190 g_signal_connect_object (GTK_OBJECT (find_dialog), "destroy",
00191 G_CALLBACK (gtk_widget_destroy), GTK_OBJECT (find_dialog),
00192 G_CONNECT_AFTER);
00193
00194 ok_button = gtk_button_new_from_stock (GTK_STOCK_OK);
00195
00196 gtk_widget_set_name (ok_button, "Find OK");
00197 g_signal_connect (GTK_OBJECT (ok_button), "clicked",
00198 G_CALLBACK (tools_button_clicked), find_dialog);
00199
00200 cancel_button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
00201 g_signal_connect_object (GTK_OBJECT (cancel_button), "clicked",
00202 G_CALLBACK (gtk_widget_destroy), GTK_OBJECT (find_dialog),
00203 G_CONNECT_AFTER);
00204
00205 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (find_dialog)->action_area),
00206 ok_button, FALSE, FALSE, 0);
00207 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (find_dialog)->action_area),
00208 cancel_button, FALSE, FALSE, 0);
00209
00210 gtk_widget_show (ok_button);
00211 gtk_widget_show (cancel_button);
00212
00213 match_entry = gtk_entry_new ();
00214 gtk_widget_set_name (match_entry, "Find OK");
00215 g_signal_connect (GTK_OBJECT (match_entry), "activate",
00216 G_CALLBACK (tools_button_clicked), NULL);
00217 gtk_widget_show (match_entry);
00218
00219 if (tab->view->current_compare)
00220 gtk_entry_set_text (GTK_ENTRY (match_entry),
00221 tab->view->current_compare);
00222
00223 case_sensitive_check = gtk_check_button_new_with_label
00224 (_("Case sensitive"));
00225 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (case_sensitive_check),
00226 FALSE);
00227 gtk_widget_set_sensitive (case_sensitive_check, TRUE);
00228 gtk_widget_show (case_sensitive_check);
00229
00230 hbox = gtk_hbox_new (FALSE, 5);
00231 gtk_box_pack_start (GTK_BOX (hbox), match_entry, TRUE, TRUE, 5);
00232 gtk_box_pack_start (GTK_BOX (hbox), case_sensitive_check,
00233 TRUE, TRUE, 5);
00234 gtk_widget_show (hbox);
00235 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (find_dialog)->vbox), hbox,
00236 TRUE, TRUE, 5);
00237
00238 gtk_widget_grab_focus (match_entry);
00239 gtk_widget_show (find_dialog);
00240 }
00241
00242 void
00243 tools_match (GtkAction G_GNUC_UNUSED * w, gpointer data)
00244 {
00245 GtkWidget *match_dialog,
00246 *ok_button, *cancel_button, *reset_button, *hbox;
00247 gchar *tmp;
00248 QlContext * qlc;
00249 QlTabData * tab;
00250
00251 qlc = ql_get_context (GTK_WIDGET(data));
00252 tab = ql_get_tabdata (qlc);
00253 CHECK_CHANGED(tab);
00254 match_dialog = gtk_dialog_new ();
00255 gtk_window_set_modal (GTK_WINDOW (match_dialog), TRUE);
00256 gtk_window_set_position (GTK_WINDOW (match_dialog), GTK_WIN_POS_CENTER);
00257 gtk_window_set_resizable (GTK_WINDOW (match_dialog), TRUE);
00258 gtk_container_set_border_width (GTK_CONTAINER (match_dialog), 5);
00259
00260 gtk_window_set_title (GTK_WINDOW (match_dialog), _("Match with"));
00261 g_signal_connect_object (GTK_OBJECT (match_dialog), "destroy",
00262 G_CALLBACK (gtk_widget_destroy), GTK_OBJECT (match_dialog),
00263 G_CONNECT_AFTER);
00264
00265 ok_button = gtk_button_new_from_stock (GTK_STOCK_OK);
00266 gtk_widget_set_name (ok_button, "Match OK");
00267 g_signal_connect (GTK_OBJECT (ok_button), "clicked",
00268 G_CALLBACK (tools_button_clicked), match_dialog);
00269
00270 cancel_button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
00271 g_signal_connect_object (GTK_OBJECT (cancel_button), "clicked",
00272 G_CALLBACK (gtk_widget_destroy), GTK_OBJECT (match_dialog),
00273 G_CONNECT_AFTER);
00274 tmp = g_strconcat (" ", _("Show All"), " ", NULL);
00275 reset_button = gtk_button_new_with_label (tmp);
00276
00277 gtk_widget_set_name (reset_button, "Match Reset");
00278 g_signal_connect (GTK_OBJECT (reset_button), "clicked",
00279 G_CALLBACK (tools_button_clicked), match_dialog);
00280
00281 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (match_dialog)->action_area),
00282 ok_button, FALSE, FALSE, 0);
00283 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (match_dialog)->action_area),
00284 reset_button, FALSE, FALSE, 0);
00285 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (match_dialog)->action_area),
00286 cancel_button, FALSE, FALSE, 0);
00287
00288 gtk_widget_show (ok_button);
00289 gtk_widget_show (reset_button);
00290 gtk_widget_show (cancel_button);
00291
00292 match_entry = gtk_entry_new ();
00293 gtk_widget_set_name (match_entry, "Match OK");
00294 g_signal_connect (GTK_OBJECT (match_entry), "activate",
00295 G_CALLBACK (tools_button_clicked), match_dialog);
00296 gtk_widget_show (match_entry);
00297
00298 if (tab->view->current_compare)
00299 gtk_entry_set_text (GTK_ENTRY (match_entry),
00300 tab->view->current_compare);
00301
00302 case_sensitive_check = gtk_check_button_new_with_label
00303 (_("Case sensitive"));
00304 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (case_sensitive_check),
00305 FALSE);
00306 gtk_widget_set_sensitive (case_sensitive_check, TRUE);
00307 gtk_widget_show (case_sensitive_check);
00308
00309 hbox = gtk_hbox_new (FALSE, 5);
00310 gtk_box_pack_start (GTK_BOX (hbox), match_entry, TRUE, TRUE, 5);
00311 gtk_box_pack_start (GTK_BOX (hbox), case_sensitive_check, TRUE, TRUE,
00312 5);
00313 gtk_widget_show (hbox);
00314 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (match_dialog)->vbox), hbox,
00315 TRUE, TRUE, 5);
00316
00317 gtk_widget_grab_focus (match_entry);
00318 gtk_widget_show (match_dialog);
00319 }