tools.c

Go to the documentation of this file.
00001 /***************************************************************************
00002  *            tools.c
00003  *
00004  *  Sun Sep 24 12:14:07 2006
00005  *  Copyright  2006-2007  Neil Williams
00006  *  linux@codehelp.co.uk
00007  ****************************************************************************/
00013 /*
00014     This package is free software; you can redistribute it and/or modify
00015     it under the terms of the GNU General Public License as published by
00016     the Free Software Foundation; either version 3 of the License, or
00017     (at your option) any later version.
00018 
00019     This program is distributed in the hope that it will be useful,
00020     but WITHOUT ANY WARRANTY; without even the implied warranty of
00021     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00022     GNU General Public License for more details.
00023 
00024     You should have received a copy of the GNU General Public License
00025     along with this program.  If not, see <http://www.gnu.org/licenses/>.
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     /* We don't want to match against already-filtered records */
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 /*  QlContext * qlc;
00138     QlTabData * tab;
00139 
00140     qlc = ql_get_context (GTK_WIDGET(data));
00141     tab = ql_get_tabdata (qlc);
00142 
00143     if (!strcmp ("Find OK", gtk_widget_get_name (w)))
00144     {
00145         gchar *match_string = g_strdup (gtk_entry_get_text
00146             (GTK_ENTRY (match_entry)));
00147         if (tab->view->current_compare)
00148             g_free (tab->view->current_compare);
00149         tab->view->current_compare = match_string;
00150         if (!tools_find_text (match_string))
00151             level2_error (_("Nothing found."));
00152     }
00153     else if (!strcmp ("Match OK", gtk_widget_get_name (w)))
00154     {
00155         gchar *match_string = g_strdup (gtk_entry_get_text
00156             (GTK_ENTRY (match_entry)));
00157         if (tab->view->current_compare)
00158             g_free (tab->view->current_compare);
00159         tab->view->current_compare = match_string;
00160         tools_match_text (tab, match_string);
00161 //      cancel_level1 ((GtkWidget *) data, NULL, NULL);
00162     }
00163     else if (!strcmp ("Match Reset", gtk_widget_get_name (w)))
00164     {
00165         tools_match_text ("");
00166 //      cancel_level1 ((GtkWidget *) data, NULL, NULL);
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     /* Manipulates some globals to give us a unified dialog box */
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     /* names are just for the code, not users. Don't translate */
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 }

Generated on Mon Jan 28 22:02:10 2008 for quicklist by  doxygen 1.5.4