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 / select.C < prev    next >
C/C++ Source or Header  |  1998-09-19  |  5KB  |  191 lines

  1. // $Id: select.C,v 1.10 1998/09/19 21:42:24 zeller Exp $ -*- C++ -*-
  2. // Select from a list of choices presented by GDB
  3.  
  4. // Copyright (C) 1997 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@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 select_rcsid[] = 
  30.     "$Id: select.C,v 1.10 1998/09/19 21:42:24 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. #include "select.h"
  37.  
  38. #include "Delay.h"
  39. #include "GDBAgent.h"
  40. #include "HelpCB.h"
  41. #include "Command.h"
  42. #include "ddd.h"
  43. #include "editing.h"
  44. #include "mydialogs.h"
  45. #include "status.h"
  46. #include "string-fun.h"
  47. #include "verify.h"
  48. #include "wm.h"
  49.  
  50. #include <Xm/List.h>
  51. #include <Xm/SelectioB.h>
  52. #include <Xm/Text.h>
  53.  
  54. Widget gdb_selection_dialog = 0;
  55. static Widget gdb_selection_list_w = 0;
  56.  
  57. static void SelectCB(Widget, XtPointer client_data, XtPointer)
  58. {
  59.     string& reply = *((string *)client_data);
  60.  
  61.     IntArray numbers;
  62.     getItemNumbers(gdb_selection_list_w, numbers);
  63.     if (numbers.size() > 0)
  64.     reply = itostring(numbers[0]) + "\n";
  65. }
  66.  
  67. static void CancelCB(Widget, XtPointer client_data, XtPointer)
  68. {
  69.     string& reply = *((string *)client_data);
  70.     reply = "\003";
  71. }
  72.  
  73.  
  74. // Answer GDB question
  75. static void select_from_gdb(string& question, string& reply)
  76. {
  77.     int count       = question.freq('\n') + 1;
  78.     string *choices = new string[count];
  79.     bool *selected  = new bool[count];
  80.  
  81.     split(question, choices, count, '\n');
  82.  
  83.     // Highlight choice #1 by default
  84.     for (int i = 0; i < count; i++)
  85.     {
  86.     if (!has_nr(choices[i]))
  87.     {
  88.         // Choice has no number (prompt) - remove it
  89.         for (int j = i; j < count - 1; j++)
  90.         choices[j] = choices[j + 1];
  91.         count--;
  92.         i--;
  93.     }
  94.     else
  95.     {
  96.         selected[i] = (get_positive_nr(choices[i]) == 1);
  97.     }
  98.     }
  99.  
  100.     if (count < 2)
  101.     {
  102.     // Nothing to choose from
  103.     if (count == 1)
  104.     {
  105.         // Take the first choice.
  106.         reply = itostring(atoi(choices[0])) + "\n";
  107.     }
  108.     
  109.     delete[] choices;
  110.     delete[] selected;
  111.     return;
  112.     }
  113.  
  114.     // Popup selection dialog
  115.     static string selection_reply;
  116.  
  117.     if (gdb_selection_dialog == 0)
  118.     {
  119.     Arg args[10];
  120.     Cardinal arg = 0;
  121.     XtSetArg(args[arg], XmNautoUnmanage, False); arg++;
  122.  
  123.     gdb_selection_dialog = 
  124.         verify(XmCreateSelectionDialog(find_shell(gdb_w),
  125.                        "gdb_selection_dialog", args, arg));
  126.     Delay::register_shell(gdb_selection_dialog);
  127.  
  128.     XtUnmanageChild(XmSelectionBoxGetChild(gdb_selection_dialog,
  129.                            XmDIALOG_TEXT));
  130.     XtUnmanageChild(XmSelectionBoxGetChild(gdb_selection_dialog, 
  131.                            XmDIALOG_SELECTION_LABEL));
  132.     XtUnmanageChild(XmSelectionBoxGetChild(gdb_selection_dialog, 
  133.                            XmDIALOG_APPLY_BUTTON));
  134.  
  135.     gdb_selection_list_w = XmSelectionBoxGetChild(gdb_selection_dialog, 
  136.                               XmDIALOG_LIST);
  137.     XtVaSetValues(gdb_selection_list_w,
  138.               XmNselectionPolicy, XmSINGLE_SELECT,
  139.               NULL);
  140.     XtAddCallback(gdb_selection_dialog,
  141.               XmNokCallback, SelectCB, &selection_reply);
  142.     XtAddCallback(gdb_selection_dialog,
  143.               XmNcancelCallback, CancelCB, &selection_reply);
  144.     XtAddCallback(gdb_selection_dialog,
  145.               XmNhelpCallback, ImmediateHelpCB, 0);
  146.     }
  147.  
  148.     setLabelList(gdb_selection_list_w, choices, selected, count, false, false);
  149.  
  150.     delete[] choices;
  151.     delete[] selected;
  152.  
  153.     manage_and_raise(gdb_selection_dialog);
  154.  
  155.     selection_reply = "";
  156.     while (selection_reply == "" 
  157.        && gdb->running() && !gdb->isReadyWithPrompt())
  158.     XtAppProcessEvent(XtWidgetToApplicationContext(gdb_w), XtIMAll);
  159.  
  160.     // Found a reply - return
  161.     reply = selection_reply;
  162. }
  163.  
  164. void gdb_selectHP(Agent *, void *, void *call_data)
  165. {
  166.     ReplyRequiredInfo *info = (ReplyRequiredInfo *)call_data;
  167.  
  168. #if 0
  169.     if (gdb_keyboard_command)
  170.     {
  171.     // Use the GDB console to answer this query
  172.     info->reply = "";
  173.     return;
  174.     }
  175. #endif
  176.  
  177.     // Fetch previous output lines, in case this is a multi-line message.
  178.     String s = XmTextGetString(gdb_w);
  179.     string prompt(s);
  180.     XtFree(s);
  181.     prompt = prompt.from(int(messagePosition)) + info->question;
  182.  
  183.     // Issue prompt right now
  184.     _gdb_out(info->question);
  185.     info->question = "";
  186.  
  187.     // Set and issue reply
  188.     select_from_gdb(prompt, info->reply);
  189.     _gdb_out(info->reply);
  190. }
  191.