root / trunk / linux / basewnd.cpp

Revision 407, 6.9 kB (checked in by leo, 4 years ago)

Fixed the recent file list.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1//
2// BaseWnd class implementation for Linux
3//
4
5#include <stdlib.h>
6#include <gdk/gdkkeysyms.h>
7#include "basewnd.h"
8#include "dialogs.h"
9#include "main.h"
10
11BaseWnd::BaseWnd (BaseWnd *parent, int menu_count)
12{
13  m_pMenuItems = new BaseMenuItem[menu_count];
14  m_pParent = parent;
15
16  m_pXID = gtk_window_new (GTK_WINDOW_TOPLEVEL);
17  if (parent != NULL)
18    gtk_window_set_transient_for (GTK_WINDOW (m_pXID), GTK_WINDOW (parent->GetXID ()));
19}
20
21BaseWnd::~BaseWnd ()
22{
23  delete [] m_pMenuItems;
24  m_pMenuItems = NULL;
25}
26
27void BaseWnd::BeginWait ()
28{
29  GdkCursor *cursor = gdk_cursor_new (GDK_WATCH);
30  gdk_window_set_cursor (m_pXID->window, cursor);
31  gdk_cursor_destroy (cursor);
32}
33
34void BaseWnd::EndWait ()
35{
36  gdk_window_set_cursor (m_pXID->window, NULL);
37}
38
39int BaseWnd::MessageBox (const char* text, const char* caption, int flags)
40{
41  GtkWidget *window, *w, *vbox, *hbox;
42  GtkAccelGroup *group;
43  int mode = (flags & LC_MB_TYPEMASK), ret, loop = 1;
44  guint tmp_key;
45
46  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
47  gtk_signal_connect (GTK_OBJECT (window), "delete_event",
48                      GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
49  //  gtk_signal_connect (GTK_OBJECT (window), "destroy",
50  //                      GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
51  gtk_window_set_title (GTK_WINDOW (window), caption);
52  gtk_container_border_width (GTK_CONTAINER (window), 10);
53  gtk_object_set_data (GTK_OBJECT (window), "loop", &loop);
54  gtk_object_set_data (GTK_OBJECT (window), "ret", &ret);
55
56  if (m_pXID != NULL)
57    gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (m_pXID));
58  //  gtk_widget_realize (window);
59
60  group = gtk_accel_group_new ();
61  gtk_window_add_accel_group (GTK_WINDOW (window), group);
62
63  vbox = gtk_vbox_new (FALSE, 10);
64  gtk_container_add (GTK_CONTAINER (window), vbox);
65  gtk_widget_show (vbox);
66 
67  w = gtk_label_new (text);
68  gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
69  gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
70  gtk_widget_show (w);
71 
72  w = gtk_hseparator_new ();
73  gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
74  gtk_widget_show (w);
75 
76  hbox = gtk_hbox_new (FALSE, 10);
77  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
78  gtk_widget_show (hbox);
79 
80  if (mode == LC_MB_OK)
81  {
82    w = gtk_button_new_with_label ("Ok");
83    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
84    gtk_signal_connect (GTK_OBJECT (w), "clicked",
85                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_OK));
86    GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
87    gtk_widget_grab_default (w);
88    gtk_widget_show (w);
89    ret = LC_OK;
90  }
91  else if (mode == LC_MB_OKCANCEL)
92  {
93    w = gtk_button_new_with_label ("Ok");
94    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
95    gtk_signal_connect (GTK_OBJECT (w), "clicked",
96                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_OK));
97    GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
98    gtk_widget_grab_default (w);
99    gtk_widget_show (w);
100
101    w = gtk_button_new_with_label ("Cancel");
102    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
103    gtk_signal_connect (GTK_OBJECT (w), "clicked",
104                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_CANCEL));
105    gtk_widget_show (w);
106    ret = LC_CANCEL;
107  }
108  else if (mode == LC_MB_YESNOCANCEL)
109  {
110    w = gtk_button_new_with_label ("");
111    tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (w)->child), "_Yes");
112    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
113    gtk_signal_connect (GTK_OBJECT (w), "clicked",
114                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_YES));
115    gtk_widget_add_accelerator (w, "clicked", group, tmp_key, (GdkModifierType)0, (GtkAccelFlags)0);
116    GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
117    gtk_widget_grab_default (w);
118    gtk_widget_show (w);
119    gtk_window_set_focus (GTK_WINDOW (window), w);
120
121    w = gtk_button_new_with_label ("");
122    tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (w)->child), "_No");
123    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
124    gtk_signal_connect (GTK_OBJECT (w), "clicked",
125                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_NO));
126    gtk_widget_add_accelerator (w, "clicked", group, tmp_key, (GdkModifierType)0, (GtkAccelFlags)0);
127    gtk_widget_show (w);
128
129    w = gtk_button_new_with_label ("");
130    tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (w)->child), "_Cancel");
131    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
132    gtk_signal_connect (GTK_OBJECT (w), "clicked",
133                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_CANCEL));
134    gtk_widget_add_accelerator (w, "clicked", group, tmp_key, (GdkModifierType)0, (GtkAccelFlags)0);
135    gtk_widget_add_accelerator (w, "clicked", group, GDK_Escape, (GdkModifierType)0, (GtkAccelFlags)0);
136    gtk_widget_show (w);
137    ret = LC_CANCEL;
138  }
139  else /* if (mode == LC_MB_YESNO) */
140  {
141    w = gtk_button_new_with_label ("Yes");
142    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
143    gtk_signal_connect (GTK_OBJECT (w), "clicked",
144                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_YES));
145    GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
146    gtk_widget_grab_default (w);
147    gtk_widget_show (w);
148 
149    w = gtk_button_new_with_label ("No");
150    gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
151    gtk_signal_connect (GTK_OBJECT (w), "clicked",
152                        GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (LC_NO));
153    gtk_widget_show (w);
154    ret = LC_NO;
155  }
156
157  gtk_widget_show (window);
158  gtk_grab_add (window);
159
160  while (loop)
161    gtk_main_iteration ();
162
163  gtk_grab_remove (window);
164  gtk_widget_destroy (window);
165
166  return ret;
167}
168
169void BaseWnd::ShowMenuItem (int id, bool show)
170{
171  if (show)
172    gtk_widget_show (m_pMenuItems[id].widget);
173  else
174    gtk_widget_hide (m_pMenuItems[id].widget);
175}
176
177void BaseWnd::EnableMenuItem (int id, bool enable)
178{
179  gtk_widget_set_sensitive (m_pMenuItems[id].widget, enable);
180}
181
182void BaseWnd::CheckMenuItem (int id, bool check)
183{
184  ignore_commands = true;
185  gtk_check_menu_item_set_state (GTK_CHECK_MENU_ITEM (m_pMenuItems[id].widget), check); 
186  ignore_commands = false;
187}
188#include <stdio.h>
189
190void BaseWnd::SetMenuItemText (int id, const char *text)
191{
192  gboolean underscore;
193  gchar *r;
194  const char *p;
195  gchar *pattern;
196  gint length;
197
198  length = strlen (text);
199  pattern = g_new (gchar, length+1);
200 
201  underscore = FALSE;
202 
203  p = text;
204  r = pattern;
205
206  while (*p)
207  {
208    if (underscore)
209    {
210      if (*p == '&')
211        *r++ = *p;
212      else
213      {
214        *r++ = '_';
215    *r++ = *p;
216      }
217
218      underscore = FALSE;
219    }
220    else
221    {
222      if (*p == '&')
223        underscore = TRUE;
224      else
225    *r++ = *p;
226    }
227    p++;
228  }
229  *r = 0;
230
231  gtk_label_set_text_with_mnemonic(GTK_LABEL(GTK_BIN(m_pMenuItems[id].widget)->child), pattern);
232  g_free (pattern);
233}
Note: See TracBrowser for help on using the browser.