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 / ArgField.C < prev    next >
C/C++ Source or Header  |  1998-08-24  |  5KB  |  177 lines

  1. // $Id: ArgField.C,v 1.23 1998/08/24 10:27:57 zeller Exp $
  2. // Argument field Implementation
  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 ArgField_rcsid[] =
  30.     "$Id: ArgField.C,v 1.23 1998/08/24 10:27:57 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. //-----------------------------------------------------------------------------
  37. #include "ArgField.h"
  38. #include <ctype.h>
  39.  
  40. #include <Xm/TextF.h>
  41. #include <Xm/PushB.h>
  42.  
  43. #include "verify.h"
  44. #include "charsets.h"
  45. #include "AppData.h"
  46. #include "buttons.h"
  47. #include "string-fun.h"        // strip_space()
  48. #include "tabs.h"        // tabify()
  49. #include "ComboBox.h"
  50.  
  51.  
  52. // Constructor
  53. ArgField::ArgField (Widget parent, const char* name)
  54.     : arg_text_field(0), handlers(ArgField_NTypes), is_empty(true)
  55. {
  56.     Arg args[10];
  57.     Cardinal arg = 0;
  58.  
  59.     if (!app_data.button_captions)
  60.     {
  61.     // Make argument field a little less high
  62.     XtSetArg(args[arg], XmNmarginHeight, 2); arg++;
  63.     }
  64.  
  65.     arg_text_field = CreateComboBox(parent, (char *)name, args, arg);
  66.  
  67.     XtAddCallback(arg_text_field, XmNvalueChangedCallback,
  68.           valueChangedCB, this);
  69.     XtAddCallback(arg_text_field, XmNlosePrimaryCallback,
  70.           losePrimaryCB, this);
  71. }
  72.  
  73. string ArgField::get_string () const
  74. {
  75.     String arg = XmTextFieldGetString (arg_text_field);
  76.     string str(arg);
  77.     XtFree (arg);
  78.     strip_space(str);
  79.     return str;
  80. }
  81.  
  82. void ArgField::set_string(string s)
  83. {
  84.     // Strip blanks
  85.     strip_space(s);
  86.  
  87.     // XmTextField cannot display tabs
  88.     untabify(s);
  89.  
  90.     // Don't use newlines
  91.     s.gsub('\n', ' ');
  92.  
  93.     // Set it
  94.     String old_s = XmTextFieldGetString(arg_text_field);
  95.     if (s != old_s)
  96.     {
  97.     XmTextFieldSetString(arg_text_field, (String)s);
  98.  
  99.     if (XtIsRealized(arg_text_field)) // LessTif 0.1 crashes otherwise
  100.     {
  101.         XmTextPosition last_pos = 
  102.         XmTextFieldGetLastPosition(arg_text_field);
  103.         XmTextFieldSetInsertionPosition(arg_text_field, last_pos);
  104.         XmTextFieldShowPosition(arg_text_field, 0);
  105.         XmTextFieldShowPosition(arg_text_field, last_pos);
  106.     }
  107.     }
  108.     XtFree(old_s);
  109. }
  110.  
  111. void ArgField::valueChangedCB(Widget,
  112.                   XtPointer client_data,
  113.                   XtPointer)
  114. {
  115.     ArgField *arg_field = (ArgField *)client_data;
  116.     arg_field->handlers.call(Changed, arg_field);
  117.  
  118.     string s = arg_field->get_string();
  119.  
  120.     if (s == "")
  121.     {
  122.     if (!arg_field->is_empty)
  123.     {
  124.         arg_field->is_empty = true;
  125.         arg_field->handlers.call(Empty, arg_field, (void *)true);
  126.     }
  127.     }
  128.     else if (arg_field->is_empty)
  129.     {
  130.     arg_field->is_empty = false;
  131.     arg_field->handlers.call(Empty, arg_field, (void *)false);
  132.     }
  133. }
  134.  
  135. void ArgField::losePrimaryCB(Widget,
  136.                  XtPointer client_data,
  137.                  XtPointer)
  138. {
  139.     ArgField *arg_field = (ArgField *)client_data;
  140.     arg_field->handlers.call(LosePrimary, arg_field, 0);
  141. }
  142.  
  143. void ArgField::addHandler (unsigned    type,
  144.                HandlerProc proc,
  145.                void*       client_data)
  146. {
  147.     handlers.add(type, proc, client_data);
  148. }
  149.  
  150. void ArgField::removeHandler (unsigned    type,
  151.                   HandlerProc proc,
  152.                   void        *client_data)
  153. {
  154.     handlers.remove(type, proc, client_data);
  155. }
  156.  
  157. void ArgField::callHandlers ()
  158. {
  159.     handlers.call(Empty, this, (void*)is_empty);
  160. }
  161.  
  162. Widget ArgField::top() const { return ComboBoxTop(text()); };
  163.  
  164.  
  165. // Clear the text field given in Widget(CLIENT_DATA)
  166. void ClearTextFieldCB(Widget, XtPointer client_data, XtPointer)
  167. {
  168.     Widget arg_field = Widget(client_data);
  169.     XmTextFieldSetString(arg_field, "");
  170. }
  171.  
  172. // Create a `():' label named "arg_label" for ARG_FIELD
  173. Widget create_arg_label(Widget parent)
  174. {
  175.     return create_flat_button(parent, "arg_label");
  176. }
  177.