File: search_button_callback.C

package info (click to toggle)
peruser 4b33-10
  • links: PTS
  • area: main
  • in suites: woody
  • size: 2,944 kB
  • ctags: 1,064
  • sloc: cpp: 22,397; perl: 2,733; makefile: 345; sh: 335
file content (110 lines) | stat: -rw-r--r-- 3,023 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "npconfig.h"

void search_button_callback( GtkWidget *widget, gpointer data )
{
   NP_Config *config = ( NP_Config *)data;

   if ( !config->active_groups )
      return;

   if ( *config->search_text == '\n' || *config->search_text == '\0' )
      return;
   
   gtk_signal_handler_block( GTK_OBJECT( config->search_button ),
                             config->search_id );
   gtk_signal_handler_unblock( GTK_OBJECT( config->search_button ),
                               config->stop_id );
   gtk_label_set( GTK_LABEL( config->search_label ), " Stop " );

   static int changed = 0, old = 0;
   int result;
   
   static char memory[ 512 ] = "\0";
   char buffer[ 512 ];

   if ( *config->search_text == '\0' )
      return;
   
   if ( strcmp( memory, config->search_text ))
   {
      if ( config->regex_alloc )
         regfree( &config->regex );

      config->regex_alloc = 0;
      
      if (( result = regcomp( &config->regex, config->search_text,
                              REG_EXTENDED | REG_NOSUB )))
      {
         regerror( result, &config->regex, buffer, sizeof buffer );
         config->show_message( config->search_text, 0 );
         return;
      }

      old = 0;
      changed = 1;
      
      config->regex_alloc = 1;
      strcpy( memory, config->search_text );
   }
   else
   {
      changed = 0;
      
      if ( ++old >= config->active_groups )
         old = 0;
   }

   GtkWidget *clist
      = ( GtkWidget *)gtk_object_get_data( GTK_OBJECT( widget->parent ),
                                           "active" );

   config->busy_cursor_and_block_signals( 1 );

   if ( !changed && old != config->active_clist_line &&
        config->active_clist_line < config->active_groups )
      old = config->active_clist_line + 1;

   config->stop = 0;

   gtk_clist_freeze( GTK_CLIST( clist ));

   for( int i = old; i < config->active_groups; ++i )
   {
      char *pointer;
      gtk_clist_get_text( GTK_CLIST( clist ), i, 0, &pointer );

      if ( !( i % 200 ))
         SIGALRM_handler( 0 );

      if ( config->stop )
         break;

      if (( result = regexec( &config->regex, pointer, 0, NULL, 0 )))
         if ( result == REG_NOMATCH )
            continue;
         else
         {
            regerror( result, &config->regex, buffer, sizeof buffer );
            config->show_message( buffer, 0 );
            gtk_clist_thaw( GTK_CLIST( clist ));
            return;
         }

      gtk_clist_select_row( GTK_CLIST( clist ), i, 0 );
      gtk_clist_moveto( GTK_CLIST( clist ), i, -1, 0.5, 0.0 );
      config->active_clist_line = old = i;
      break;
   }

   gtk_clist_thaw( GTK_CLIST( clist ));
   config->busy_cursor_and_block_signals( 0 );

   gtk_signal_handler_block( GTK_OBJECT( config->search_button ),
                             config->stop_id );
   gtk_signal_handler_unblock( GTK_OBJECT( config->search_button ),
                               config->search_id );
   gtk_label_set( GTK_LABEL( config->search_label ), " Search " );

   return;
}