This is xposthelp.c in view mode; [Download] [Up]
/* * /usr/local/devel/postgres-v4r2/src/contrib/xposthelp/RCS/xposthelp.c,v 1.1 1993/07/24 03:03:50 aoki Exp */ #include <stdio.h> #include <stdlib.h> #include <xview/xview.h> #include <xview/panel.h> #include <xview/screen.h> # include <X11/cursorfont.h> #include "xposthelp.h" /* Visual objects */ Display *dpy; Xv_Screen screen; int screen_num; Cursor cursor; static short icon_image[] = { # include "xposthelp.icon" }; mpr_static(icon_pixrect, 64, 64, 1, icon_image); /* Variables */ static Frame frame; static Panel panel; static Panel_item list_dbases, list_tables, list_attrib, message_panel, user_panel, vacuum_button, user_button, show_table_msg, show_table_panel, show_indexed_msg, show_indexed_panel, show_kind_msg, show_kind_panel, show_records_msg, show_records_panel, show_index_msg, show_index_panel, show_keys_msg, show_keys_panel, show_attrib_msg, show_attrib_panel; /* Routines */ static void setup_list (); static void create_frame(); /* Call-backs */ static int exit_proc (); static void dbases_proc (); static void tables_proc (); static void attrib_proc (); static void vacuum_proc (); static void user_proc (); /************************************************************************* * * ************************************************************************/ static void create_frame() { Icon my_icon; int curr_row; my_icon = icon_create(ICON_IMAGE, &icon_pixrect, 0); frame = (Frame) xv_create (NULL, FRAME, FRAME_SHOW_RESIZE_CORNER, FALSE, FRAME_ICON, my_icon, FRAME_LABEL, "xposthelp", NULL); dpy = (Display *) xv_get(frame, XV_DISPLAY); screen = (Xv_Screen) xv_get(frame, XV_SCREEN); screen_num = (int) xv_get(screen, SCREEN_NUMBER); panel = (Panel) xv_create (frame, PANEL, NULL); message_panel = (Panel_item) xv_create (panel, PANEL_MESSAGE, PANEL_LABEL_STRING, NULL_STR, PANEL_LABEL_BOLD, TRUE, XV_X, 10, XV_Y, 10, NULL); user_panel = (Panel_item) xv_create (panel, PANEL_TEXT, PANEL_LABEL_STRING, "User:", PANEL_VALUE_DISPLAY_LENGTH, 20, PANEL_VALUE_STORED_LENGTH, 80, PANEL_NEXT_ROW, 25, PANEL_VALUE, NULL_STR, NULL); list_dbases = (Panel_item) xv_create (panel, PANEL_LIST, PANEL_LABEL_STRING, "Databases:", PANEL_LIST_DISPLAY_ROWS, 17, PANEL_CHOOSE_ONE, TRUE, PANEL_CHOOSE_NONE, TRUE, PANEL_READ_ONLY, TRUE, PANEL_NOTIFY_PROC, dbases_proc, PANEL_LIST_WIDTH, 180, PANEL_LAYOUT, PANEL_VERTICAL, PANEL_NEXT_ROW, -1, NULL); list_tables = (Panel_item) xv_create (panel, PANEL_LIST, PANEL_LABEL_STRING, "Tables:", PANEL_LIST_DISPLAY_ROWS, 20, PANEL_CHOOSE_ONE, TRUE, PANEL_CHOOSE_NONE, TRUE, PANEL_READ_ONLY, TRUE, PANEL_NOTIFY_PROC, tables_proc, PANEL_LIST_WIDTH, 180, PANEL_LAYOUT, PANEL_VERTICAL, NULL); list_attrib = (Panel_item) xv_create (panel, PANEL_LIST, PANEL_LABEL_STRING, "Attributes:", PANEL_LIST_DISPLAY_ROWS, 20, PANEL_CHOOSE_ONE, TRUE, PANEL_CHOOSE_NONE, TRUE, PANEL_READ_ONLY, TRUE, PANEL_NOTIFY_PROC, attrib_proc, PANEL_LIST_WIDTH, 180, PANEL_LAYOUT, PANEL_VERTICAL, NULL); /* Buttons */ (void) xv_create (panel, PANEL_BUTTON, PANEL_LABEL_STRING, "Exit", PANEL_NOTIFY_PROC, exit_proc, XV_X, 560, XV_Y, 30, NULL); vacuum_button = (Panel_item) xv_create (panel, PANEL_BUTTON, PANEL_LABEL_STRING, "Vacuum Database", PANEL_NOTIFY_PROC, vacuum_proc, XV_X, 20, XV_Y, 420, NULL); user_button = (Panel_item) xv_create (panel, PANEL_BUTTON, PANEL_LABEL_STRING, "Apply User", PANEL_NOTIFY_PROC, user_proc, XV_X, 250, XV_Y, 30, NULL); /* Show table name & indexed*/ curr_row = 470; show_table_msg = (Panel_item) xv_create (panel, PANEL_MESSAGE, PANEL_LABEL_STRING, "Table: ", PANEL_LABEL_BOLD, TRUE, XV_X, 10, XV_Y, curr_row, NULL); show_table_panel = (Panel_item) xv_create (panel, PANEL_MESSAGE, XV_X, 100, XV_Y, curr_row, NULL); show_indexed_msg = (Panel_item) xv_create (panel, PANEL_MESSAGE, PANEL_LABEL_STRING, "Indexed: ", PANEL_LABEL_BOLD, TRUE, XV_X, 250, XV_Y, curr_row, NULL); show_indexed_panel = (Panel_item) xv_create (panel, PANEL_MESSAGE, XV_X, 320, XV_Y, curr_row, NULL); show_index_msg = (Panel_item) xv_create (panel, PANEL_MESSAGE, PANEL_LABEL_STRING, "Index On: ", PANEL_LABEL_BOLD, TRUE, XV_X, 410, XV_Y, curr_row, NULL); show_index_panel = (Panel_item) xv_create (panel, PANEL_MESSAGE, XV_X, 500, XV_Y, curr_row, NULL); /* Show records and kind*/ curr_row += 20; show_records_msg = (Panel_item) xv_create (panel, PANEL_MESSAGE, PANEL_LABEL_STRING, "Records: ", PANEL_LABEL_BOLD, TRUE, XV_X, 10, XV_Y, curr_row, NULL); show_records_panel = (Panel_item) xv_create (panel, PANEL_MESSAGE, XV_X, 100, XV_Y, curr_row, NULL); show_kind_msg = (Panel_item) xv_create (panel, PANEL_MESSAGE, PANEL_LABEL_STRING, "Kind: ", PANEL_LABEL_BOLD, TRUE, XV_X, 250, XV_Y, curr_row, NULL); show_kind_panel = (Panel_item) xv_create (panel, PANEL_MESSAGE, XV_X, 320, XV_Y, curr_row, NULL); show_keys_msg = (Panel_item) xv_create (panel, PANEL_MESSAGE, PANEL_LABEL_STRING, "Keys: ", PANEL_LABEL_BOLD, TRUE, XV_X, 410, XV_Y, curr_row, NULL); show_keys_panel = (Panel_item) xv_create (panel, PANEL_MESSAGE, XV_X, 500, XV_Y, curr_row, NULL); /* Show Attribute type */ curr_row += 20; show_attrib_msg = (Panel_item) xv_create (panel, PANEL_MESSAGE, PANEL_LABEL_STRING, "Attribute Type: ", PANEL_LABEL_BOLD, TRUE, XV_X, 10, XV_Y, curr_row, NULL); show_attrib_panel = (Panel_item) xv_create (panel, PANEL_MESSAGE, XV_X, 130, XV_Y, curr_row, NULL); window_fit (panel); window_fit (frame); xv_set(frame, XV_SHOW, TRUE, NULL); } /********************************************** * * * Handle the selection of an attribute entry * * in the scroll list. * * * *********************************************/ static void dbases_proc (item, string, client_data, op, event) Panel_item item; char *string; caddr_t client_data; Panel_list_op op; Event *event; { int i; /************************************************ * * * Make sure the user selected and didn't drag. * * Dragging may cause unwanted changes. * * * ***********************************************/ if (op == SELECT && event_id (event) != LOC_DRAG) { /* Show clock cursor on main window */ cursor = XCreateFontCursor(dpy, XC_watch); XDefineCursor(dpy, (Window)xv_get(panel, XV_XID), cursor); XFlush(dpy); /******************************************************* * Hide the scroll lists while re-computing the lists. * * Saves on re-draw time. * ******************************************************/ xv_set (list_tables, XV_SHOW, FALSE, NULL); /* First delete old entries */ for (i = tbs_num - 1; i >= 0; i--) xv_set (list_tables, PANEL_LIST_DELETE, i, NULL); /* Show vacuum button */ xv_set (vacuum_button, XV_SHOW, TRUE, NULL); /* reset global variable */ strcpy(curr_dbase, string); /* Use postgres to get all tables */ GetTables(curr_dbase); /* Put tables in scrolling list */ for (i=0; i< tbs_num; i++) { xv_set (list_tables, PANEL_LIST_INSERT, i, PANEL_LIST_STRING, i, tbs[i].name, NULL); } xv_set (list_tables, XV_SHOW, TRUE, NULL); /* Change cursor back to normal on main window */ cursor = XCreateFontCursor(dpy, XC_crosshair); XDefineCursor(dpy, (Window)xv_get(panel, XV_XID), cursor); XFlush(dpy); } else { /* Show vacuum button */ xv_set (vacuum_button, XV_SHOW, FALSE, NULL); /* reset global variable */ strcpy(curr_dbase, ""); /* Clean table list */ xv_set (list_tables, XV_SHOW, FALSE, NULL); /* Delete entries */ for (i = tbs_num - 1; i >= 0; i--) xv_set (list_tables, PANEL_LIST_DELETE, i, NULL); tbs_num = 0; xv_set (list_tables, XV_SHOW, TRUE, NULL); /* Clean attributes list */ xv_set (list_attrib, XV_SHOW, FALSE, NULL); /* First delete old entries */ for (i = att_num - 1; i >= 0; i--) xv_set (list_attrib, PANEL_LIST_DELETE, i, NULL); att_num = 0; xv_set (list_attrib, XV_SHOW, TRUE, NULL); /* Hide panel items */ xv_set (show_table_msg, XV_SHOW, FALSE, NULL); xv_set (show_table_panel, XV_SHOW, FALSE, NULL); xv_set (show_indexed_msg, XV_SHOW, FALSE, NULL); xv_set (show_indexed_panel, XV_SHOW, FALSE, NULL); xv_set (show_records_msg, XV_SHOW, FALSE, NULL); xv_set (show_records_panel, XV_SHOW, FALSE, NULL); xv_set (show_kind_msg, XV_SHOW, FALSE, NULL); xv_set (show_kind_panel, XV_SHOW, FALSE, NULL); xv_set (show_index_msg, XV_SHOW, FALSE, NULL); xv_set (show_index_panel, XV_SHOW, FALSE, NULL); xv_set (show_keys_msg, XV_SHOW, FALSE, NULL); xv_set (show_keys_panel, XV_SHOW, FALSE, NULL); xv_set (show_attrib_msg, XV_SHOW, FALSE, NULL); xv_set (show_attrib_panel, XV_SHOW, FALSE, NULL); } } /********************************************** * * * Handle the selection of an attribute entry * * in the scroll list. * * * *********************************************/ static void tables_proc (item, string, client_data, op, event) Panel_item item; char *string; caddr_t client_data; Panel_list_op op; Event *event; { int i, selected; char str[20]; /************************************************ * * * Make sure the user selected and didn't drag. * * Dragging may cause unwanted changes. * * * ***********************************************/ if (op == SELECT && event_id (event) != LOC_DRAG) { /* Show clock cursor on main window */ cursor = XCreateFontCursor(dpy, XC_watch); XDefineCursor(dpy, (Window)xv_get(panel, XV_XID), cursor); XFlush(dpy); /******************************************************* * Hide the scroll lists while re-computing the lists. * * Saves on re-draw time. * ******************************************************/ xv_set (list_attrib, XV_SHOW, FALSE, NULL); /* First delete old entries */ for (i = att_num - 1; i >= 0; i--) xv_set (list_attrib, PANEL_LIST_DELETE, i, NULL); att_num = 0; selected = (int) xv_get(list_tables, PANEL_LIST_FIRST_SELECTED); /* Use postgres to get all attributes */ GetAttributes(tbs[selected].oid); /* Put attributes in scrolling list */ for (i=0; i< att_num; i++) { xv_set (list_attrib, PANEL_LIST_INSERT, i, PANEL_LIST_STRING, i, att[i].name, NULL); } xv_set (list_attrib, XV_SHOW, TRUE, NULL); xv_set (show_table_msg, XV_SHOW, TRUE, NULL); xv_set (show_table_panel, XV_SHOW, TRUE, PANEL_LABEL_STRING, string, NULL); xv_set (show_indexed_msg, XV_SHOW, TRUE, NULL); if (tbs[selected].ind) { char index_name[80]; sprintf(index_name, "yes (%s)", GetIndex(tbs[selected].oid)); xv_set (show_indexed_panel, XV_SHOW, TRUE, PANEL_LABEL_STRING, index_name, NULL); } else xv_set (show_indexed_panel, XV_SHOW, TRUE, PANEL_LABEL_STRING, "no", NULL); xv_set (show_records_msg, XV_SHOW, TRUE, NULL); sprintf(str, "%d", tbs[selected].numrec); xv_set (show_records_panel, XV_SHOW, TRUE, PANEL_LABEL_STRING, str, NULL); xv_set (show_kind_msg, XV_SHOW, TRUE, NULL); xv_set (show_kind_panel, XV_SHOW, TRUE, PANEL_LABEL_STRING, (tbs[selected].kind) ? "relation": "index", NULL); /* Show only if table is an index */ if (!tbs[selected].kind) { char index_on[80], ind_keys[200]; GetIndexInfo(tbs[selected].oid, index_on, ind_keys); xv_set (show_index_msg, XV_SHOW, TRUE, NULL); xv_set (show_index_panel, XV_SHOW, TRUE, PANEL_LABEL_STRING, index_on, NULL); xv_set (show_keys_msg, XV_SHOW, TRUE, NULL); xv_set (show_keys_panel, XV_SHOW, TRUE, PANEL_LABEL_STRING, ind_keys, NULL); } /* Change cursor back to normal on main window */ cursor = XCreateFontCursor(dpy, XC_crosshair); XDefineCursor(dpy, (Window)xv_get(panel, XV_XID), cursor); XFlush(dpy); } else { xv_set (list_attrib, XV_SHOW, FALSE, NULL); /* First delete old entries */ for (i = att_num - 1; i >= 0; i--) xv_set (list_attrib, PANEL_LIST_DELETE, i, NULL); att_num = 0; xv_set (list_attrib, XV_SHOW, TRUE, NULL); xv_set (show_table_msg, XV_SHOW, FALSE, NULL); xv_set (show_table_panel, XV_SHOW, FALSE, NULL); xv_set (show_indexed_msg, XV_SHOW, FALSE, NULL); xv_set (show_indexed_panel, XV_SHOW, FALSE, NULL); xv_set (show_records_msg, XV_SHOW, FALSE, NULL); xv_set (show_records_panel, XV_SHOW, FALSE, NULL); xv_set (show_kind_msg, XV_SHOW, FALSE, NULL); xv_set (show_kind_panel, XV_SHOW, FALSE, NULL); xv_set (show_index_msg, XV_SHOW, FALSE, NULL); xv_set (show_index_panel, XV_SHOW, FALSE, NULL); xv_set (show_keys_msg, XV_SHOW, FALSE, NULL); xv_set (show_keys_panel, XV_SHOW, FALSE, NULL); xv_set (show_attrib_msg, XV_SHOW, FALSE, NULL); xv_set (show_attrib_panel, XV_SHOW, FALSE, NULL); } } /********************************************** * * * Handle the selection of an attribute entry * * in the scroll list. * * * *********************************************/ static void attrib_proc (item, string, client_data, op, event) Panel_item item; char *string; caddr_t client_data; Panel_list_op op; Event *event; { int i; char str[100]; if (op == SELECT && event_id (event) != LOC_DRAG) { xv_set (show_attrib_msg, XV_SHOW, TRUE, NULL); i = (int) xv_get(list_attrib, PANEL_LIST_FIRST_SELECTED); sprintf(str, " %s (%d)", att[i].str_type, att[i].type); xv_set (show_attrib_panel, XV_SHOW, TRUE, PANEL_LABEL_STRING, str, NULL); } else { xv_set (show_attrib_msg, XV_SHOW, FALSE, NULL); xv_set (show_attrib_panel, XV_SHOW, FALSE, NULL); } } /****************************************** * * * Setup initial list for the given user. * * * *****************************************/ static void setup_list () { int i, ret_status; /* Show clock cursor on main window */ cursor = XCreateFontCursor(dpy, XC_watch); XDefineCursor(dpy, (Window)xv_get(panel, XV_XID), cursor); XFlush(dpy); /* Hide items that are supposed to show */ xv_set (vacuum_button, XV_SHOW, FALSE, NULL); xv_set (show_table_msg, XV_SHOW, FALSE, NULL); xv_set (show_table_panel, XV_SHOW, FALSE, NULL); xv_set (show_indexed_msg, XV_SHOW, FALSE, NULL); xv_set (show_indexed_panel, XV_SHOW, FALSE, NULL); xv_set (show_records_msg, XV_SHOW, FALSE, NULL); xv_set (show_records_panel, XV_SHOW, FALSE, NULL); xv_set (show_kind_msg, XV_SHOW, FALSE, NULL); xv_set (show_kind_panel, XV_SHOW, FALSE, NULL); xv_set (show_index_msg, XV_SHOW, FALSE, NULL); xv_set (show_index_panel, XV_SHOW, FALSE, NULL); xv_set (show_keys_msg, XV_SHOW, FALSE, NULL); xv_set (show_keys_panel, XV_SHOW, FALSE, NULL); xv_set (show_attrib_msg, XV_SHOW, FALSE, NULL); xv_set (show_attrib_panel, XV_SHOW, FALSE, NULL); /******************************************************* * Hide the scroll lists while re-computing the lists. * * Saves on re-draw time. * ******************************************************/ xv_set (list_dbases, XV_SHOW, FALSE, NULL); xv_set (list_tables, XV_SHOW, FALSE, NULL); xv_set (list_attrib, XV_SHOW, FALSE, NULL); /* * First delete the old entries */ for (i = dbs_num - 1; i >= 0; i--) xv_set (list_dbases, PANEL_LIST_DELETE, i, NULL); for (i = tbs_num - 1; i >= 0; i--) xv_set (list_tables, PANEL_LIST_DELETE, i, NULL); for (i = att_num - 1; i >= 0; i--) xv_set (list_attrib, PANEL_LIST_DELETE, i, NULL); dbs_num = 0; tbs_num = 0; att_num = 0; /* * Now read the new entries */ if (strcmp (NULL_STR, (char *) xv_get (user_panel, PANEL_VALUE))) { ret_status = GetDBases(xv_get (user_panel, PANEL_VALUE)); if (ret_status == NO_ERROR) { /* Fill up the scrolling list */ for (i=0; i < dbs_num; i++) { xv_set (list_dbases, PANEL_LIST_INSERT, i, PANEL_LIST_STRING, i, dbs[i], NULL); } xv_set (message_panel, PANEL_LABEL_STRING, NULL_STR, NULL); } else ErrorHandle(ret_status); } /* * Done, show the new scroll panels */ xv_set (list_dbases, XV_SHOW, TRUE, NULL); xv_set (list_tables, XV_SHOW, TRUE, NULL); xv_set (list_attrib, XV_SHOW, TRUE, NULL); /* Change cursor back to normal on main window */ cursor = XCreateFontCursor(dpy, XC_crosshair); XDefineCursor(dpy, (Window)xv_get(panel, XV_XID), cursor); XFlush(dpy); } /**************************** * * * Vacuum button call back * * * ***************************/ static void vacuum_proc (item, event) Panel_item item; Event *event; { /* User wants to vacuum a database */ VacuumDBase(curr_dbase); } /************************* * * * User button call back * * * ************************/ static void user_proc (item, event) Panel_item item; Event *event; { /* User wants to take a look at another user */ setup_list(); } /************************************************************************* * * * Exit * * * ************************************************************************/ static int exit_proc (item, event) Panel_item item; Event *event; { xv_set (frame, XV_SHOW, FALSE, NULL); xv_destroy_safe(frame); } /************************************************************************* * * * Main * * * ************************************************************************/ ErrorHandle(error_id) int error_id; { char err_str[200]; switch(error_id) { case 1: /* User does not exist */ sprintf(err_str, "User %s does not exist in this system.", xv_get (user_panel, PANEL_VALUE)); break; case 2: /* Maximum number of databases reached */ sprintf(err_str, "The maximum number of databases (%d) has been reached.", MAX_DBS); break; case 3: /* Maximum number of tables reached */ sprintf(err_str, "The maximum number of tables (%d) has been reached.", MAX_REL); break; } xv_set (message_panel, PANEL_LABEL_STRING, err_str, NULL); } /************************************************************************* * * * Main * * * ************************************************************************/ main(argc, argv) int argc; char *argv[]; { char str[80], *text; /* Initialize server */ xv_init(XV_INIT_ARGS, argc, argv, NULL); /* Show current directory/files combo */ create_frame(); /* Let the USER be the default. */ xv_set (user_panel, PANEL_VALUE, getenv("USER"), NULL); setup_list(); xv_main_loop(frame); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.