home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / mydialogs.C < prev    next >
C/C++ Source or Header  |  1998-09-19  |  8KB  |  308 lines

  1. // $Id: mydialogs.C,v 1.26 1998/09/19 21:42:23 zeller Exp $
  2. // Create dialogs to select display expressions
  3.  
  4. // Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
  5. // Written by Dorothea Luetkehaus <luetke@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char mydialogs_rcsid[] =
  30.     "$Id: mydialogs.C,v 1.26 1998/09/19 21:42:23 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. //-----------------------------------------------------------------------------
  37. // Create dialogs to select display expressions
  38. //-----------------------------------------------------------------------------
  39.  
  40. #include "mydialogs.h"
  41.  
  42. // System includes
  43. #include <stdlib.h>
  44.  
  45. // Motif includes
  46. #include <Xm/Xm.h>
  47. #include <Xm/SelectioB.h>
  48. #include <Xm/List.h>
  49. #include <Xm/MwmUtil.h>
  50. #include <X11/Shell.h>
  51.  
  52. // Misc includes
  53. #include "assert.h"
  54. #include "verify.h"
  55. #include "DestroyCB.h"
  56. #include "HelpCB.h"
  57. #include "MString.h"
  58. #include "AppData.h"
  59.  
  60. // Own includes
  61. #include "string-fun.h"
  62.  
  63.  
  64. // Local functions
  65. static XmStringTable makeXmStringTable (string label_list[], int list_length,
  66.                     bool highlight_title);
  67. static void freeXmStringTable (XmStringTable xmlabel_list, int list_length);
  68.  
  69. // Create a selection box with a top-level shell
  70. Widget createTopLevelSelectionDialog(Widget parent, String name,
  71.                      ArgList args, Cardinal num_args)
  72. {
  73.     if (app_data.transient_dialogs)
  74.     return XmCreateSelectionDialog(parent, name, args, num_args);
  75.  
  76.     ArgList new_args = new Arg[num_args + 10];
  77.     Cardinal arg = 0;
  78.  
  79.     // Give'em every decoration except `maximize'.
  80.     int decorations = 
  81.     MWM_DECOR_BORDER | MWM_DECOR_RESIZEH | 
  82.     MWM_DECOR_TITLE | MWM_DECOR_MENU | 
  83.     MWM_DECOR_MINIMIZE;
  84.     int functions = 
  85.     MWM_FUNC_RESIZE | MWM_FUNC_MOVE | MWM_FUNC_MINIMIZE | MWM_FUNC_CLOSE;
  86.  
  87.     XtSetArg(new_args[arg], XmNdialogType,       XmDIALOG_SELECTION); arg++;
  88.     XtSetArg(new_args[arg], XmNallowShellResize, True);               arg++;
  89.     XtSetArg(new_args[arg], XmNdeleteResponse,   XmUNMAP);            arg++;
  90.     XtSetArg(new_args[arg], XmNmwmDecorations,   decorations);        arg++;
  91.     XtSetArg(new_args[arg], XmNmwmFunctions,     functions);          arg++;
  92.  
  93.     for (Cardinal i = 0; i < num_args; i++)
  94.     {
  95.     XtSetArg(new_args[arg], args[i].name, args[i].value); arg++;
  96.     }
  97.  
  98.     string shell_name = string(name) + "_popup";
  99.     Widget shell = verify(XtCreateWidget(shell_name.chars(), 
  100.                      topLevelShellWidgetClass,
  101.                      parent, new_args, arg));
  102.     Widget box = XmCreateSelectionBox(shell, name, new_args, arg);
  103.  
  104.     delete[] new_args;
  105.  
  106.     // Set a reasonable icon name
  107.     String title    = 0;
  108.     String iconName = 0;
  109.     XtVaGetValues(shell, XmNtitle, &title, XmNiconName, &iconName, NULL);
  110.     if (title != 0 && (iconName == 0 || string(iconName) == XtName(shell)))
  111.     XtVaSetValues(shell, XmNiconName, title, NULL);
  112.  
  113.     return box;
  114. }
  115.  
  116.  
  117.  
  118. // Set the elements of the display selection list
  119. // LABEL_LIST:      Labels, using the format disp_nr ": " disp_name.
  120. // SELECTED:        Whether labels are to be selected
  121. // LIST_LENGTH:     Length of label_list[] and selected[]
  122. // HIGHLIGHT_TITLE: Whether the first line should be highlighted
  123. // NOTIFY:          Whether callbacks should be invoked
  124. //
  125. void setLabelList (Widget  selectionList,
  126.            string  label_list[],
  127.            bool    selected[],
  128.            int     list_length,
  129.            bool    highlight_title,
  130.            bool    notify)
  131. {
  132.     if (selectionList == 0)
  133.     return;
  134.  
  135.     XmStringTable xmlabel_list = 
  136.     makeXmStringTable(label_list, list_length, highlight_title);
  137.  
  138.     assert(XmIsList(selectionList));
  139.  
  140.     XtVaSetValues (selectionList,
  141.            XmNitems,     xmlabel_list,
  142.            XmNitemCount, list_length,
  143.            NULL);
  144.  
  145.     XmListDeselectAllItems (selectionList);
  146.     XtVaSetValues (selectionList,
  147.            XmNselectionPolicy, XmMULTIPLE_SELECT,
  148.            NULL);
  149.  
  150.     for (int i = 0; i < list_length; i++) 
  151.     if (selected != 0 && selected[i] == true) 
  152.         XmListSelectPos(selectionList, i + 1, Boolean(notify));
  153.  
  154.     XtVaSetValues (selectionList,
  155.            XmNselectionPolicy, XmEXTENDED_SELECT,
  156.            NULL);
  157.  
  158.     freeXmStringTable(xmlabel_list, list_length);
  159. }
  160.  
  161. // Replace all elements in SELECTIONLIST with the corresponding
  162. // entries in LABEL_LIST (i.e. with the same leading number).
  163. void updateLabelList (Widget  selectionList,
  164.               string  label_list[],
  165.               int     list_length)
  166. {
  167.     if (selectionList == 0)
  168.     return;
  169.  
  170.     XmStringTable items;
  171.     int items_count = 0;
  172.  
  173.     assert(XmIsList(selectionList));
  174.  
  175.     XtVaGetValues(selectionList,
  176.           XmNitemCount, &items_count,
  177.           XmNitems,     &items,
  178.           NULL);
  179.  
  180.     for (int i = 0; i < items_count; i++)
  181.     {
  182.     String _item;
  183.     XmStringGetLtoR(items[i], LIST_CHARSET, &_item);
  184.     string item(_item);
  185.     XtFree(_item);
  186.  
  187.     if (!has_nr(item))
  188.         continue;
  189.  
  190.     int nr_i = get_nr(item);
  191.     
  192.     for (int j = 0; j < list_length; j++)
  193.     {
  194.         if (!has_nr(label_list[j]))
  195.         continue;
  196.         int nr_j = get_nr(label_list[j]);
  197.  
  198.         if (nr_i != nr_j)
  199.         continue;
  200.  
  201.         MString mlabel(label_list[j], LIST_CHARSET);
  202.         XmString xmlabel = mlabel.xmstring();
  203.         int pos = (i == items_count - 1 ? 0 : i + 1);
  204.         XmListReplaceItemsPos(selectionList, &xmlabel, 1, pos);
  205.         break;
  206.     }
  207.     }
  208. }
  209.  
  210.  
  211. // Fill the item numbers in DISP_NRS
  212. void getItemNumbers(Widget selectionList, IntArray& numbers)
  213. {
  214.     static IntArray empty;
  215.     numbers = empty;
  216.  
  217.     if (selectionList == 0)
  218.     return;
  219.  
  220.     XmStringTable selected_items;
  221.     int selected_items_count = 0;
  222.  
  223.     assert(XmIsList(selectionList));
  224.  
  225.     XtVaGetValues(selectionList,
  226.           XmNselectedItemCount, &selected_items_count,
  227.           XmNselectedItems, &selected_items,
  228.           NULL);
  229.  
  230.     for (int i = 0; i < selected_items_count; i++)
  231.     {
  232.     String _item;
  233.     XmStringGetLtoR(selected_items[i], LIST_CHARSET, &_item);
  234.     string item(_item);
  235.     XtFree(_item);
  236.  
  237.     if (has_nr(item))
  238.         numbers += get_nr(item);
  239.     }
  240. }
  241.  
  242. // Create an array of XmStrings from the list LABEL_LIST of length
  243. // LIST_LENGTH.  If HIGHLIGHT_TITLE is set, let the first line be bold.
  244. static XmStringTable makeXmStringTable (string label_list[],
  245.                     int list_length, bool highlight_title)
  246. {
  247.     XmStringTable xmlist = 
  248.     XmStringTable(XtMalloc(list_length * sizeof(XmString)));
  249.  
  250.     int i = 0;
  251.     if (highlight_title && i < list_length)
  252.     {
  253.     xmlist[i] = XmStringCreateLtoR(label_list[i], LIST_TITLE_CHARSET);
  254.     i++;
  255.     }
  256.     
  257.     while (i < list_length)
  258.     {
  259.     xmlist[i] = XmStringCreateLtoR(label_list[i], LIST_CHARSET);
  260.     i++;
  261.     }
  262.  
  263.     return xmlist;
  264. }
  265.  
  266. // Free the XmString table XMLIST of length LIST_LENGTH
  267. static void freeXmStringTable (XmStringTable xmlist, int list_length)
  268. {
  269.     for (int i = 0; i < list_length; i++)
  270.     {
  271.     XmStringFree (*xmlist);
  272.     xmlist++;
  273.     }
  274.  
  275.     // It seems XMLIST is already owned
  276.     // XtFree((char *)xmlist);
  277. }
  278.  
  279.  
  280. // Select POS in LIST and make it visible
  281. void ListSetAndSelectPos(Widget list, int pos)
  282. {
  283.     if (list == 0)
  284.     return;
  285.  
  286.     assert(XmIsList(list));
  287.  
  288.     int top_item      = 0;
  289.     int visible_items = 0;
  290.     int items         = 0;
  291.     XtVaGetValues(list,
  292.           XmNtopItemPosition, &top_item,
  293.           XmNvisibleItemCount, &visible_items,
  294.           XmNitemCount, &items,
  295.           NULL);
  296.  
  297.     XmListSelectPos(list, pos, False);
  298.  
  299.     if (pos == 1)
  300.     XmListSetPos(list, pos);
  301.     else if (pos == 0 || pos >= items)
  302.     XmListSetBottomPos(list, 0);
  303.     else if (pos - 1 < top_item)
  304.     XmListSetPos(list, pos - 1);
  305.     else if (pos + 1 >= top_item + visible_items)
  306.     XmListSetBottomPos(list, pos + 1);
  307. }
  308.