6 static gint _get_position_in_array (gint window,
8 static gint _get_position_in_parameters (gint window,
11 static void _create_output_window (OutputWindow **outwin);
12 static gboolean _create_select_tests_window (AtkObject *obj,
14 OutputWindow **outwin);
15 static void _toggle_selectedcb (GtkWidget *widget,
17 static void _testselectioncb (GtkWidget *widget,
19 static void _destroy (GtkWidget *widget,
22 /* General functions */
25 * find_object_by_role:
27 * @roles: An array of roles to search for
28 * @num_roles: The number of entries in @roles
30 * Find the #AtkObject which is a decendant of the specified @obj
31 * which is of an #AtkRole type specified in the @roles array.
33 * Returns: the #AtkObject that meets the specified criteria or NULL
34 * if no object is found.
37 find_object_by_role (AtkObject *obj,
42 * Find the first object which is a descendant of the specified object
43 * which matches the specified role.
45 * This function returns a reference to the AtkObject which should be
46 * removed when finished with the object.
55 for (j=0; j < num_roles; j++)
57 if (atk_object_get_role (obj) == roles[j])
61 n_children = atk_object_get_n_accessible_children (obj);
62 for (i = 0; i < n_children; i++)
66 child = atk_object_ref_accessible_child (obj, i);
71 for (j=0; j < num_roles; j++)
73 if (atk_object_get_role (child) == roles[j])
77 found_obj = find_object_by_role (child, roles, num_roles);
78 g_object_unref (child);
86 * find_object_by_name_and_role:
88 * @name: The GTK widget name
89 * @roles: An array of roles to search for
90 * @num_roles: The number of entries in @roles
92 * Find the #AtkObject which is a decendant of the specified @obj
93 * which is of an #AtkRole type specified in the @roles array which
94 * also has the GTK widget name specified in @name.
96 * Returns: the #AtkObject that meets the specified criteria or NULL
97 * if no object is found.
100 find_object_by_name_and_role(AtkObject *obj,
113 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
114 if (GTK_IS_WIDGET (widget))
116 if (strcmp (name, gtk_widget_get_name(GTK_WIDGET (widget))) == 0)
118 for (j=0; j < num_roles; j++)
120 if (atk_object_get_role (obj) == roles[j])
126 n_children = atk_object_get_n_accessible_children (obj);
127 for (i = 0; i < n_children; i++)
129 AtkObject* found_obj;
131 child = atk_object_ref_accessible_child (obj, i);
136 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (child));
137 if (GTK_IS_WIDGET (widget))
139 if (strcmp(name, gtk_widget_get_name(GTK_WIDGET (widget))) == 0)
141 for (j=0; j < num_roles; j++)
143 if (atk_object_get_role (child) == roles[j])
148 found_obj = find_object_by_name_and_role (child, name, roles, num_roles);
149 g_object_unref (child);
157 * find_object_by_accessible_name_and_role:
158 * @obj: An #AtkObject
159 * @name: The accessible name
160 * @roles: An array of roles to search for
161 * @num_roles: The number of entries in @roles
163 * Find the #AtkObject which is a decendant of the specified @obj
164 * which has the specified @name and matches one of the
167 * Returns: the #AtkObject that meets the specified criteria or NULL
168 * if no object is found.
171 find_object_by_accessible_name_and_role (AtkObject *obj,
179 G_CONST_RETURN gchar *accessible_name;
184 accessible_name = atk_object_get_name (obj);
185 if (accessible_name && (strcmp(name, accessible_name) == 0))
187 for (j=0; j < num_roles; j++)
189 if (atk_object_get_role (obj) == roles[j])
194 n_children = atk_object_get_n_accessible_children (obj);
195 for (i = 0; i < n_children; i++)
197 AtkObject* found_obj;
199 child = atk_object_ref_accessible_child (obj, i);
204 accessible_name = atk_object_get_name (child);
205 if (accessible_name && (strcmp(name, accessible_name) == 0))
207 for (j=0; j < num_roles; j++)
209 if (atk_object_get_role (child) == roles[j])
213 found_obj = find_object_by_accessible_name_and_role (child, name,
215 g_object_unref (child);
223 * find_object_by_name_and_role:
224 * @obj: An #AtkObject
227 * Find the #AtkObject which is a decendant of the specified @obj
228 * which has the specified @type.
230 * Returns: the #AtkObject that meets the specified criteria or NULL
231 * if no object is found.
234 find_object_by_type (AtkObject *obj,
238 * Find the first object which is a descendant of the specified object
239 * which matches the specified type.
241 * This function returns a reference to the AtkObject which should be
242 * removed when finished with the object.
247 G_CONST_RETURN gchar * typename = NULL;
252 typename = g_type_name (G_OBJECT_TYPE (obj));
253 if (strcmp (typename, type) == 0)
256 n_children = atk_object_get_n_accessible_children (obj);
257 for (i = 0; i < n_children; i++)
259 AtkObject* found_obj;
261 child = atk_object_ref_accessible_child (obj, i);
266 typename = g_type_name (G_OBJECT_TYPE (child));
268 if (strcmp (typename, type) == 0)
271 found_obj = find_object_by_type (child, type);
272 g_object_unref (child);
280 * already_accessed_atk_object
281 * @obj: An #AtkObject
283 * Keeps a static GPtrArray of objects that have been passed into this
286 * Returns: TRUE if @obj has been passed into this function before
287 * and FALSE otherwise.
290 already_accessed_atk_object (AtkObject *obj)
292 static GPtrArray *obj_array = NULL;
293 gboolean found = FALSE;
297 * We create a property handler for each object if one was not associated
300 * We add it to our array of objects which have property handlers; if an
301 * object is destroyed it remains in the array.
303 if (obj_array == NULL)
304 obj_array = g_ptr_array_new ();
306 for (i = 0; i < obj_array->len; i++)
308 if (obj == g_ptr_array_index (obj_array, i))
315 g_ptr_array_add (obj_array, obj);
322 * @obj: An #AtkObject
323 * @depth: Number of spaces to indent output.
324 * @child_number: The child number of this object.
326 * Displays the hierarchy of widgets starting from @obj.
329 display_children (AtkObject *obj,
333 display_children_to_depth(obj, -1, depth, child_number);
337 * display_children_to_depth
338 * @obj: An #AtkObject
339 * @to_depth: Display to this depth.
340 * @depth: Number of spaces to indent output.
341 * @child_number: The child number of this object.
343 * Displays the hierarchy of widgets starting from @obj only
344 * to the specified depth.
347 display_children_to_depth (AtkObject *obj,
353 const gchar *rolename;
354 const gchar *typename;
355 gint n_children, parent_index, i;
357 if (to_depth >= 0 && depth > to_depth)
363 for (i=0; i < depth; i++)
366 role = atk_object_get_role (obj);
367 rolename = atk_role_get_name (role);
370 * Note that child_number and parent_index should be the same
371 * unless there is an error.
373 parent_index = atk_object_get_index_in_parent(obj);
374 g_print("child <%d == %d> ", child_number, parent_index);
376 n_children = atk_object_get_n_accessible_children (obj);
377 g_print ("children <%d> ", n_children);
380 g_print("role <%s>, ", rolename);
382 g_print("role <error>");
384 if (GTK_IS_ACCESSIBLE(obj))
388 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
389 g_print("name <%s>, ", gtk_widget_get_name(GTK_WIDGET (widget)));
392 g_print("name <NULL>, ");
394 typename = g_type_name (G_OBJECT_TYPE (obj));
395 g_print ("typename <%s>\n", typename);
397 for (i = 0; i < n_children; i++)
401 child = atk_object_ref_accessible_child (obj, i);
404 display_children_to_depth (child, to_depth, depth + 1, i);
405 g_object_unref (G_OBJECT (child));
412 /* GUI Information for the Select Tests Window */
415 GtkWidget *selecttestsWindow;
419 GtkWidget *textInsert;
421 gchar *selecttestsTitle;
424 /* Functionality information about each added test */
427 GtkWidget *toggleButton;
429 GtkWidget *parameterLabel[MAX_PARAMS];
430 GtkWidget *parameterInput[MAX_PARAMS];
442 static MainDialog *md[MAX_WINDOWS];
443 static OutputWindow *ow;
445 /* An array containing function information on all of the tests */
446 static TestList listoftests[MAX_WINDOWS][MAX_TESTS];
448 /* A counter for the actual number of added tests */
451 /* A global for keeping track of the window numbers */
452 static gint window_no = 0;
453 /* An array containing the names of the tests that are "on" */
454 static gchar *onTests[MAX_WINDOWS][MAX_TESTS];
455 static gint g_visibleDialog = 0;
456 static gint testcount[MAX_WINDOWS];
457 static TestCB testcb[MAX_WINDOWS];
461 * @obj: An #AtkObject
462 * @runtest: The callback function to run when the "Run Tests" button
464 * @outwin: The output window to use. If NULL is passed in, then
467 * Creates the test window and the output window (if @outwin is NULL)
468 * Runs _create_output_window() and _create_select_tests_window()
469 * and sets g_visibleDialog to 1
471 * Returns: The window number of the created window if successful, -1 otherwise.
474 create_windows (AtkObject *obj,
476 OutputWindow **outwin)
482 _create_output_window(outwin);
483 valid = _create_select_tests_window(obj, runtest, outwin);
495 * _create_output_window
496 * @outwin: If outwin is passed in as NULL, a new output window is created
497 * otherwise, the outwin passed in is shared.
499 * Creates the Test Result Output Window .
502 _create_output_window (OutputWindow **outwin)
505 GtkWidget *scrolled_window;
506 OutputWindow *localow;
510 localow = (OutputWindow *) malloc (sizeof(OutputWindow));
512 localow->outputBuffer = gtk_text_buffer_new(NULL);
513 view = gtk_text_view_new_with_buffer(GTK_TEXT_BUFFER(localow->outputBuffer));
514 gtk_widget_set_size_request (view, 700, 500);
515 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
516 gtk_text_view_set_editable(GTK_TEXT_VIEW(view), FALSE);
518 localow->outputWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
519 gtk_window_set_title(GTK_WINDOW(localow->outputWindow), "Test Output");
520 scrolled_window = gtk_scrolled_window_new(NULL, NULL);
522 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
523 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
524 gtk_container_add(GTK_CONTAINER(localow->outputWindow), scrolled_window);
525 gtk_container_add(GTK_CONTAINER(scrolled_window), view);
526 gtk_text_buffer_get_iter_at_offset(localow->outputBuffer, &localow->outputIter, 0);
527 gtk_widget_show(view);
528 gtk_widget_show(scrolled_window);
529 gtk_widget_show(localow->outputWindow);
531 gtk_text_buffer_set_text(GTK_TEXT_BUFFER(localow->outputBuffer),
532 "\n\nWelcome to the test GUI:\nTest results are printed here\n\n", 58);
533 gtk_text_buffer_get_iter_at_offset(GTK_TEXT_BUFFER(localow->outputBuffer),
534 &localow->outputIter, 0);
541 * _create_select_tests_window:
542 * @obj: An #AtkObject
543 * @runtest: The callback function that is run when the "Run Tests"
545 * @outwin: The output window to use.
547 * Creates the Test Select Window
549 * Returns: TRUE if successful, FALSE otherwise
552 _create_select_tests_window (AtkObject *obj,
554 OutputWindow **outwin)
557 GtkWidget *hbuttonbox;
558 GtkWidget *scrolledWindow;
560 if (window_no >= 0 && window_no < MAX_WINDOWS)
562 md[window_no] = (MainDialog *) malloc (sizeof(MainDialog));
564 textwidget = ATK_TEXT (obj);
567 md[window_no]->selecttestsTitle = "Test Setting";
568 md[window_no]->selecttestsWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
569 gtk_window_set_title (GTK_WINDOW( ow->outputWindow),
570 md[window_no]->selecttestsTitle);
571 gtk_window_set_resizable (GTK_WINDOW(md[window_no]->selecttestsWindow),
573 gtk_window_set_position (GTK_WINDOW(md[window_no]->selecttestsWindow),
575 g_signal_connect (md[window_no]->selecttestsWindow,
577 G_CALLBACK (_destroy),
578 &md[window_no]->selecttestsWindow);
580 /* Setup Scrolling */
581 scrolledWindow = gtk_scrolled_window_new(NULL, NULL);
582 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledWindow),
583 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
584 gtk_widget_set_size_request (scrolledWindow, 500, 600);
585 gtk_container_add (GTK_CONTAINER (md[window_no]->selecttestsWindow),
589 md[window_no]->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
590 gtk_box_set_homogeneous (GTK_BOX (md[window_no]->vbox), TRUE);
591 md[window_no]->button = gtk_button_new_with_mnemonic ("_Run Tests");
592 hbuttonbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
593 gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox),
594 GTK_BUTTONBOX_SPREAD);
595 gtk_box_pack_end (GTK_BOX (hbuttonbox),
596 GTK_WIDGET (md[window_no]->button), TRUE, TRUE, 0);
597 gtk_box_pack_end (GTK_BOX (md[window_no]->vbox), hbuttonbox,
599 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolledWindow),
600 md[window_no]->vbox);
602 testcb[window_no].runtest = runtest;
603 testcb[window_no].obj = obj;
604 testcb[window_no].win_num = window_no;
605 g_signal_connect (md[window_no]->button,
607 G_CALLBACK (_testselectioncb),
608 (gpointer)&testcb[window_no]);
611 gtk_widget_grab_focus (md[window_no]->button);
612 gtk_widget_show (md[window_no]->button);
613 gtk_widget_show (hbuttonbox);
614 gtk_widget_show (scrolledWindow);
615 gtk_widget_show_all (GTK_WIDGET (md[window_no]->selecttestsWindow));
624 * @window: The window number
625 * @name: The test name
626 * @num_params: The number of arguments the test uses.
627 * @parameter_names: The names of each argument.
628 * @default_names: The default values of each argument.
630 * Adds a Test with the passed-in details to the Tests Select Window.
632 * Returns: FALSE if the num_params passed in is greater than
633 * MAX_PARAMS, otherwise returns TRUE
637 add_test (gint window,
640 gchar* parameter_names[],
641 gchar* default_names[])
645 if (num_params > MAX_PARAMS)
649 md[window]->hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
650 gtk_box_set_spacing (GTK_BOX (md[window]->hbox), 10);
651 gtk_container_set_border_width (GTK_CONTAINER (md[window]->hbox), 10);
652 gtk_container_add (GTK_CONTAINER (md[window]->vbox), md[window]->hbox);
653 listoftests[window][testcount[window]].toggleButton =
654 gtk_toggle_button_new_with_label (name);
655 gtk_box_pack_start (GTK_BOX (md[window]->hbox),
656 listoftests[window][testcount[window]].toggleButton, FALSE, FALSE, 0);
657 listoftests[window][testcount[window]].testName = name;
658 listoftests[window][testcount[window]].numParameters = num_params;
659 for (i=0; i<num_params; i++)
661 listoftests[window][testcount[window]].parameterLabel[i] =
662 gtk_label_new (parameter_names[i]);
663 gtk_box_pack_start (GTK_BOX (md[window]->hbox),
664 listoftests[window][testcount[window]].parameterLabel[i], FALSE, FALSE, 0);
665 listoftests[window][testcount[window]].parameterInput[i] = gtk_entry_new();
666 gtk_entry_set_text (GTK_ENTRY (listoftests[window][testcount[window]].parameterInput[i]),
668 gtk_widget_set_size_request (listoftests[window][testcount[window]].parameterInput[i], 50, 22);
669 gtk_box_pack_start (GTK_BOX (md[window]->hbox),
670 listoftests[window][testcount[window]].parameterInput[i], FALSE, FALSE, 0);
671 gtk_widget_set_sensitive (
672 GTK_WIDGET (listoftests[window][testcount[window]].parameterLabel[i]), FALSE);
673 gtk_widget_set_sensitive (
674 GTK_WIDGET (listoftests[window][testcount[window]].parameterInput[i]), FALSE);
675 gtk_widget_show (listoftests[window][testcount[window]].parameterLabel[i]);
676 gtk_widget_show (listoftests[window][testcount[window]].parameterInput[i]);
678 g_signal_connect (listoftests[window][testcount[window]].toggleButton,
680 G_CALLBACK (_toggle_selectedcb),
681 (gpointer)&(listoftests[window][testcount[window]]));
682 gtk_widget_show (listoftests[window][testcount[window]].toggleButton);
683 gtk_widget_show (md[window]->hbox);
684 gtk_widget_show (md[window]->vbox);
694 * @window: The window number
695 * @count: Passes back the number of tests on.
697 * Gets an array of strings corresponding to the tests that are "on".
698 * A test is assumed on if the toggle button is on and if all its
699 * parameters have values.
701 * Returns: an array of strings corresponding to the tests that
704 gchar **tests_set(gint window, int *count)
706 gint i =0, j = 0, num;
711 for (i = 0; i < MAX_TESTS; i++)
712 onTests[window][i] = NULL;
714 for (i = 0; i < testcount[window]; i++)
717 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (listoftests[window][i].toggleButton)))
719 num = listoftests[window][i].numParameters;
720 for (j = 0; j < num; j++)
722 input = gtk_editable_get_chars (
723 GTK_EDITABLE (listoftests[window][i].parameterInput[j]), 0, -1);
725 if (input != NULL && (! strcmp(input, "")))
730 onTests[window][*count] = listoftests[window][i].testName;
735 return onTests[window];
739 * _get_position_in_array:
740 * @window: The window number
741 * @the_test_name: The name of the test
743 * Gets the index of the passed-in @the_test_name.
745 * Returns: the position in listoftests[] of @the_test_name
748 _get_position_in_array(gint window,
749 gchar *the_test_name)
753 for (i = 0; i < testcount[window]; i++)
755 if (strcmp(listoftests[window][i].testName, the_test_name) == 0)
762 * _get_position_in_parameters:
763 * @window: The window number
764 * @label: The label name
765 * @position: The parameter position
767 * Gets the index of the passed-in parameter @label.
769 * Returns: the position in parameterLabel[] (a member of
770 * listoftests[]) of @label
773 _get_position_in_parameters(gint window,
778 G_CONST_RETURN gchar *label_string;
780 for (i = 0; i < MAX_PARAMS; i++)
782 label_string = gtk_label_get_text(
783 GTK_LABEL (listoftests[window][position].parameterLabel[i]));
785 if (strcmp(label_string, label) == 0)
793 * @output: The string to add to the output buffer
795 * Tidies up the output Window
798 set_output_buffer(gchar *output)
800 gtk_text_buffer_insert (GTK_TEXT_BUFFER (ow->outputBuffer),
801 &ow->outputIter, output, strlen(output));
802 gtk_text_buffer_get_iter_at_offset (GTK_TEXT_BUFFER (ow->outputBuffer),
809 * Informs user if a visible test window running.
811 * Returns: TRUE if g_visibleDialog is set to 1, otherwise FALSE
814 isVisibleDialog(void)
816 if (g_visibleDialog >= 1)
824 * @window: The window number
825 * @function_name: The name of the function
826 * @arg_label: The label of the argument.
828 * Gets the user input associated with the @function_name and @arg_label.
830 * Returns: the user input associated with the @function_name and @arg_label.
833 get_arg_of_func (gint window,
834 gchar *function_name,
837 G_CONST_RETURN gchar *argString;
839 gint position, paramPosition;
841 position = _get_position_in_array(window, function_name);
845 g_print("No such function\n");
849 paramPosition = _get_position_in_parameters(window, arg_label, position);
851 if (paramPosition == -1)
853 g_print("No such parameter Label\n");
857 if (position != -1 && paramPosition != -1)
859 argString = gtk_editable_get_chars (
860 GTK_EDITABLE (listoftests[window][position].parameterInput[paramPosition]),
862 retString = g_strdup(argString);
872 * @the_string: The string to convert
874 * Converts the passed-in string to an integer
876 * Returns: An integer corresponding to @the_string.
879 string_to_int (const char *the_string)
887 ret_val = strtod( the_string, &end_ptr);
888 if (*end_ptr == '\0')
891 printf("\nError: input must be a number\n");
894 int_ret_val = (int) ret_val;
895 return (int_ret_val);
899 * _toggle_selectedcb:
900 * @widget: The ToggleButton widget
901 * @test: user data containing the TestList structure.
903 * Toggle Button Callback, activating the text entry fields
906 _toggle_selectedcb (GtkWidget *widget,
910 TestList *testlist = (TestList *) test;
913 toggled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
919 for (i=0; i < testlist->numParameters; i++)
921 gtk_widget_set_sensitive (GTK_WIDGET (testlist->parameterLabel[i]),
923 gtk_widget_set_sensitive (GTK_WIDGET (testlist->parameterInput[i]),
930 * widget: The Button widget
931 * data: The user data containing a TestCB structure
933 * Callback for when the "Run Tests" button is pressed
936 _testselectioncb (GtkWidget *widget,
939 TestCB* local_testcb = (TestCB *)data;
940 local_testcb->runtest(local_testcb->obj, local_testcb->win_num);
945 * @widget: The GUI widget
946 * @data: User data, not used.
951 _destroy (GtkWidget *widget,