3 * Rob Zimmermann. All rights reserved.
5 * Keith Bostic. All rights reserved.
7 * See the LICENSE file for redistribution information.
13 static const char sccsid
[] = "$Id: m_search.c,v 8.3 1996/12/10 21:07:46 bostic Exp $ (Berkeley) $Date: 1996/12/10 21:07:46 $";
18 #include <X11/Intrinsic.h>
19 #include <Xm/DialogS.h>
22 #include <Xm/PushBG.h>
24 #include <Xm/ToggleB.h>
25 #include <Xm/RowColumn.h>
35 static save_dialog
*dialogs
= NULL
;
54 static String expr_image
[] = {
61 /* globals and constants */
63 static String ExpressionWidget
= "option",
64 PatternWidget
= "text";
66 static Boolean ignore_case
,
70 static ToggleData toggle_data
[] = {
71 { "Ignore Case", &ignore_case
},
72 { "Wrap End Of File", &wrap_search
},
73 { "Incremental", &incremental_search
}
76 static void next_func(),
80 static ButtonData button_data
[] = {
81 { "Next", True
, next_func
},
82 { "Previous", False
, prev_func
},
83 { "Cancel", False
, done_func
}
86 ExpressionKind expr_kind
;
88 String pattern
= NULL
;
94 static Widget
get_child_widget( Widget parent
, String name
)
96 static Widget
get_child_widget( parent
, name
)
103 strcpy( buffer
, "*" );
104 strcat( buffer
, name
);
105 return XtNameToWidget( parent
, buffer
);
109 #if defined(__STDC__)
110 static String
get_widget_string( Widget w
, String resource
)
112 static String
get_widget_string( w
, resource
)
120 XtVaGetValues( w
, resource
, &xmstr
, 0 );
121 XmStringGetLtoR( xmstr
, XmSTRING_DEFAULT_CHARSET
, &str
);
122 XmStringFree( xmstr
);
128 /* sync the global state */
130 #if defined(__STDC__)
131 static void get_state( Widget w
)
133 static void get_state( w
)
141 /* get all the data from the root of the widget tree */
142 while ( ! XtIsShell(shell
) ) shell
= XtParent(shell
);
144 /* which regular expression kind? */
145 if (( w
= get_child_widget( shell
, ExpressionWidget
)) != NULL
) {
146 w
= XmOptionButtonGadget( w
);
147 str
= get_widget_string( w
, XmNlabelString
);
148 for (i
=0; i
<XtNumber(expr_image
); i
++) {
149 if ( strcmp( str
, expr_image
[i
] ) == 0 ) {
150 expr_kind
= (ExpressionKind
) i
;
158 for (i
=0; i
<XtNumber(toggle_data
); i
++) {
159 if (( w
= get_child_widget( shell
, toggle_data
[i
].name
)) != NULL
) {
160 XtVaGetValues( w
, XmNset
, toggle_data
[i
].value
, 0 );
164 /* what's the pattern? */
165 if (( w
= get_child_widget( shell
, PatternWidget
)) != NULL
) {
166 if ( pattern
!= NULL
) XtFree( pattern
);
167 pattern
= XmTextFieldGetString( w
);
172 /* Translate the user's actions into nvi commands */
174 #if defined(__STDC__)
175 static void send_command( Widget w
)
177 static void send_command( w
)
181 String safe_pattern
= (pattern
) ? pattern
: "";
184 #if defined(SelfTest)
185 printf( "%s [\n", (w
== NULL
) ? "Find Next" : XtName(w
) );
186 printf( "\tPattern\t\t%s\n", safe_pattern
);
187 printf( "\tExpression Kind\t%s\n", expr_image
[(int)expr_kind
] );
188 for( i
=0; i
<XtNumber(toggle_data
); i
++ )
189 printf( "\t%s\t%d\n", toggle_data
[i
].name
, *toggle_data
[i
].value
);
195 strcpy( buffer
, "/" );
196 strcat( buffer
, pattern
);
197 __vi_send_command_string( buffer
);
203 #if defined(__STDC__)
204 static void next_func( Widget w
)
206 static void next_func( w
)
210 /* get current data from the root of the widget tree? */
211 if ( w
!= NULL
) get_state( w
);
218 #if defined(__STDC__)
219 static void prev_func( Widget w
)
221 static void prev_func( w
)
225 /* get current data from the root of the widget tree */
233 #if defined(__STDC__)
234 static void done_func( Widget w
)
236 static void done_func( w
)
242 #if defined(SelfTest)
246 while ( ! XtIsShell(w
) ) w
= XtParent(w
);
249 /* save it for later */
250 ptr
= (save_dialog
*) malloc( sizeof(save_dialog
) );
257 /* create a set of push buttons */
259 #define SpacingRatio 4 /* 3:1 button to spaces */
261 #if defined(__STDC__)
262 static Widget
create_push_buttons( Widget parent
,
267 static Widget
create_push_buttons( parent
, data
, count
)
276 base
= SpacingRatio
*count
+ 1;
277 form
= XtVaCreateManagedWidget( "buttons",
280 XmNleftAttachment
, XmATTACH_FORM
,
281 XmNrightAttachment
, XmATTACH_FORM
,
282 XmNfractionBase
, base
,
283 XmNshadowType
, XmSHADOW_ETCHED_IN
,
284 XmNshadowThickness
, 2,
285 XmNverticalSpacing
, 4,
289 while ( count
-- > 0 ) {
290 w
= XtVaCreateManagedWidget(data
->name
,
291 xmPushButtonGadgetClass
,
293 XmNtopAttachment
, XmATTACH_FORM
,
294 XmNbottomAttachment
,XmATTACH_FORM
,
295 XmNleftAttachment
, XmATTACH_POSITION
,
296 XmNleftPosition
, pos
,
297 XmNshowAsDefault
, data
->is_default
,
298 XmNdefaultButtonShadowThickness
, data
->is_default
,
299 XmNrightAttachment
, XmATTACH_POSITION
,
300 XmNrightPosition
, pos
+SpacingRatio
-1,
303 if ( data
->is_default
)
304 XtVaSetValues( form
, XmNdefaultButton
, w
, 0 );
305 XtAddCallback( w
, XmNactivateCallback
, data
->cb
, 0 );
314 /* create a set of check boxes */
316 #if defined(__STDC__)
317 static Widget
create_check_boxes( Widget parent
,
322 static Widget
create_check_boxes( parent
, toggles
, count
)
331 base
= SpacingRatio
*count
+1;
332 form
= XtVaCreateManagedWidget( "toggles",
335 XmNleftAttachment
, XmATTACH_FORM
,
336 XmNrightAttachment
, XmATTACH_FORM
,
337 XmNfractionBase
, base
,
338 XmNverticalSpacing
, 4,
342 while ( count
-- > 0 ) {
343 XtVaCreateManagedWidget(toggles
->name
,
344 xmToggleButtonWidgetClass
,
346 XmNtopAttachment
, XmATTACH_FORM
,
347 XmNbottomAttachment
, XmATTACH_FORM
,
348 XmNleftAttachment
, XmATTACH_POSITION
,
349 XmNleftPosition
, pos
,
350 XmNrightAttachment
, XmATTACH_POSITION
,
351 XmNrightPosition
, pos
+SpacingRatio
-1,
362 /* Routines to handle the text field widget */
364 /* when the user hits 'CR' in a text widget, fire the default pushbutton */
365 #if defined(__STDC__)
366 static void text_cr( Widget w
, void *ptr
, void *ptr2
)
368 static void text_cr( w
, ptr
, ptr2
)
378 /* when the user hits any other character, if we are doing incremental
379 * search, send the updated string to nvi
381 #if defined(__STDC__)
382 static void value_changed( Widget w
, void *ptr
, void *ptr2
)
384 static void value_changed( w
, ptr
, ptr2
)
390 /* get all the data from the root of the widget tree */
394 if ( incremental_search
) send_command( w
);
398 /* Draw and display a dialog the describes nvi search capability */
400 #if defined(__STDC__)
401 static Widget
create_search_dialog( Widget parent
, String title
)
403 static Widget
create_search_dialog( parent
, title
)
408 Widget box
, form
, label
, text
, checks
, options
, buttons
, form2
;
409 XmString opt_str
, reg_str
, xtd_str
, non_str
;
412 /* use an existing one? */
413 if ( dialogs
!= NULL
) {
414 box
= dialogs
->shell
;
421 box
= XtVaCreatePopupShell( title
,
422 xmDialogShellWidgetClass
,
425 XmNallowShellResize
, False
,
429 form
= XtVaCreateWidget( "form",
432 XmNverticalSpacing
, 4,
433 XmNhorizontalSpacing
, 4,
437 form2
= XtVaCreateManagedWidget( "form",
440 XmNtopAttachment
, XmATTACH_FORM
,
441 XmNleftAttachment
, XmATTACH_FORM
,
442 XmNrightAttachment
, XmATTACH_FORM
,
446 label
= XtVaCreateManagedWidget( "Pattern:",
449 XmNalignment
, XmALIGNMENT_END
,
450 XmNtopAttachment
, XmATTACH_FORM
,
451 XmNbottomAttachment
,XmATTACH_FORM
,
452 XmNrightAttachment
, XmATTACH_POSITION
,
453 XmNrightPosition
, 25,
457 text
= XtVaCreateManagedWidget( PatternWidget
,
458 xmTextFieldWidgetClass
,
460 XmNtopAttachment
, XmATTACH_FORM
,
461 XmNbottomAttachment
,XmATTACH_FORM
,
462 XmNleftAttachment
, XmATTACH_POSITION
,
464 XmNrightAttachment
, XmATTACH_FORM
,
467 XtAddCallback( text
, XmNvalueChangedCallback
, value_changed
, 0 );
468 XtAddCallback( text
, XmNactivateCallback
, text_cr
, 0 );
470 opt_str
= XmStringCreateSimple( "Regular Expression Type" );
471 reg_str
= XmStringCreateSimple( expr_image
[(int)ExprStandard
] );
472 xtd_str
= XmStringCreateSimple( expr_image
[(int)ExprExtended
] );
473 non_str
= XmStringCreateSimple( expr_image
[(int)ExprNone
] );
474 options
= XmVaCreateSimpleOptionMenu( form
,
480 XmVaPUSHBUTTON
, reg_str
, 0, 0, 0,
481 XmVaPUSHBUTTON
, xtd_str
, 0, 0, 0,
482 XmVaPUSHBUTTON
, non_str
, 0, 0, 0,
483 XmNtopAttachment
, XmATTACH_WIDGET
,
485 XmNleftAttachment
, XmATTACH_POSITION
,
487 XmNrightAttachment
, XmATTACH_FORM
,
490 XmStringFree( opt_str
);
491 XmStringFree( reg_str
);
492 XmStringFree( xtd_str
);
493 XmStringFree( non_str
);
494 XtManageChild( options
);
496 buttons
= create_push_buttons( form
, button_data
, XtNumber(button_data
) );
497 XtVaSetValues( buttons
,
498 XmNbottomAttachment
, XmATTACH_FORM
,
502 checks
= create_check_boxes( form
, toggle_data
, XtNumber(toggle_data
) );
503 XtVaSetValues( checks
,
504 XmNtopAttachment
, XmATTACH_WIDGET
,
505 XmNtopWidget
, options
,
506 XmNbottomAttachment
, XmATTACH_WIDGET
,
507 XmNbottomWidget
, buttons
,
511 XtManageChild( form
);
516 /* Module interface to the outside world
518 * xip_show_search_dialog( parent, title )
519 * pops up a search dialog
522 * simulates a 'next' assuming that a search has been done
525 #if defined(__STDC__)
526 void __vi_show_search_dialog( Widget parent
, String title
)
528 void __vi_show_search_dialog( parent
, data
, cbs
)
533 Widget db
= create_search_dialog( parent
, title
);
536 /* we can handle getting taller and wider or narrower, but not shorter */
537 XtVaGetValues( db
, XmNheight
, &height
, 0 );
538 XtVaSetValues( db
, XmNminHeight
, height
, 0 );
540 /* post the dialog */
541 XtPopup( db
, XtGrabNone
);
543 /* request initial focus to the text widget */
544 XmProcessTraversal( get_child_widget( db
, PatternWidget
),
550 void __vi_next_search()
556 #if defined(SelfTest)
558 #if defined(__STDC__)
559 static void show_search( Widget w
, XtPointer data
, XtPointer cbs
)
561 static void show_search( w
, data
, cbs
)
567 __vi_show_search_dialog( data
, "Search" );
570 main( int argc
, char *argv
[] )
573 Widget top_level
, rc
, button
;
576 /* create a top-level shell for the window manager */
577 top_level
= XtVaAppInitialize( &ctx
,
579 NULL
, 0, /* options */
581 argv
, /* might get modified */
586 rc
= XtVaCreateManagedWidget( "rc",
587 xmRowColumnWidgetClass
,
592 button
= XtVaCreateManagedWidget( "Pop up search dialog",
593 xmPushButtonGadgetClass
,
597 XtAddCallback( button
, XmNactivateCallback
, show_search
, rc
);
599 button
= XtVaCreateManagedWidget( "Quit",
600 xmPushButtonGadgetClass
,
604 XtAddCallback( button
, XmNactivateCallback
, exit
, 0 );
606 XtRealizeWidget(top_level
);