Correct backtrace() array size argument
[forms.git] / src / F_Window.C
blob0973ea5272e748150df379b9f76de944c1410760
2  /*
3   *   Copyright (C) 2007, Harbour, All rights reserved.
4   */
6 #include <F_Text_Display.H>
7 #include <F_Window.H>
9 using namespace F;
11 void F_Window::draw_border(F_Border_t brd)
13  if (brd == F_NO_BORDER)
14    brd = border_;
15  F_Text_Symbol lu('x', fg(), bg());
16  F_Text_Symbol ru('x', fg(), bg());
17  F_Text_Symbol ll('x', fg(), bg());
18  F_Text_Symbol rl('x', fg(), bg());
19  F_Text_Symbol hs('x', fg(), bg());
20  F_Text_Symbol vs('x', fg(), bg());
21  if (brd == F_DOUBLE_BORDER) {
22    // TODO: replace by recode()
23    lu.ch_ = 'É';
24    ru.ch_ = '»';
25    ll.ch_ = 'È';
26    rl.ch_ = '¼';
27    hs.ch_ = 'Í';
28    vs.ch_ = 'º';
29  } else if ((brd == F_SINGLE_BORDER) || (brd == F_MOVING_BORDER)) {
30    lu.ch_ = 'Ú';
31    ru.ch_ = '¿';
32    ll.ch_ = 'À';
33    rl.ch_ = 'Ù';
34    hs.ch_ = 'Ä';
35    vs.ch_ = '³';
36  } /* else if (brd == F_MOVING_BORDER) {
37    lu.ch = '.';
38    ru.ch = '.';
39    ll.ch = '.';
40    rl.ch = '.';
41    hs.ch = '.';
42    vs.ch = '.';
43  } */
44  F_Point p(0, 0);
45  draw_buf.set(p, lu);
46  p.move(w() - 1, 0);
47  draw_buf.set(p, ru);
48  p.move(0, h() - 1);
49  draw_buf.set(p, ll);
50  p.move(w() - 1, h() - 1);
51  draw_buf.set(p, rl);
52  F_Region r(1, 0, w() - 2, 1);
53  draw_buf.fill(r, hs);
54  r.move(1, h() - 1);
55  draw_buf.fill(r, hs);
56  r.w(1);
57  r.h(h() - 2);
58  r.move(0, 1);
59  draw_buf.fill(r, vs);
60  r.move(w() - 1, 1);
61  draw_buf.fill(r, vs);
64 void F_Window::draw_label()
66  if (!label_.size() || (label_type_ == F_NO_ALIGN))
67    return;
68  coord_t x = 0, y = 0;
69  if (label_type_ & F_ALIGN_LEFT)
70    x = (border_ == F_NO_BORDER) ? 0 : 1;
71  else if (label_type_ & F_ALIGN_RIGHT)
72    unimplemented("F_ALIGN_RIGHT");
73  if (label_type_ & F_ALIGN_TOP)
74    y = 0;
75  else if (label_type_ & F_ALIGN_BOTTOM)
76    y = h() - 1;
77  F_Point p(x, y);
78  std::string s(" " + label_ + " ");
79  put_string(p, s); //, label_type_);
82 void F_Window::draw()
84  F_Widget::draw();
85  draw_border();
86  draw_label();
87  for (unsigned int i = 0; i < widgets.size(); i++) {
88   if (widgets[i]->visible())
89     widgets[i]->draw();
90  }
91   F_Widget::damage(F_DAMAGE_FLUSH);
94 bool F_Window::handle(F_Event_t &ev)
96  F_Event_Type_t t = ev.type;
97  switch(ev.type) {
98    case F_KEY_PRESS:
99      if (ev.kbd.key == F_Tab) { // send FOCUS to next widget
100        if (ev.kbd.modifiers & F_SHIFT)
101          take_focus(focus_prev());
102        else
103          take_focus(focus_next());
104        ev.type = F_FOCUS;
105     }
106    case F_KEY_RELEASE:
107      if (focus() && focus()->handle(ev))
108        return true;
109      break;
110    case F_FOCUS:
111      debug("F_FOCUS: wid - %d, depth - %d", id(), depth());
112      break;
113    case F_UNFOCUS:
114      debug("F_UNFOCUS: wid - %d, depth - %d", id(), depth());
115      break;
116    case F_ENTER:
117      debug("F_ENTER: wid - %d, depth - %d", id(), depth());
118      break;
119    case F_LEAVE:
120      debug("F_LEAVE: wid - %d, depth - %d", id(), depth());
121      break;
122    case F_POINTER_PRESS:
123 //     debug("F_POINTER_PRESS: wid - %d", id());
124      // check for window moving
125      if (!(ev.mouse.y - y()) && (ev.mouse.x - x()) &&
126          ((ev.mouse.x - x()) < (w() - 1))) {
127 //       F_Widget::draw();
128 //       draw_border();
129        last_mx = ev.mouse.x;
130        last_my = ev.mouse.y;
131        f_text_display->cursor(0);
132        moving(1);
133        return true;
134     }
135      break;
136    case F_POINTER_RELEASE:
137      debug("F_POINTER_RELEASE: wid - %d", id());
138      if (moving()) {
139        draw();
140        moving(0);
141        return true;
142     }
143      break;
144    case F_POINTER_MOVE:
145      debug("F_POINTER_MOVE: wid - %d", id());
146      // ÐÒÏ×ÅÒÑÅÍ widget'Ù É ÐÏÓÙÌÁÅÍ ÉÍ F_ENTER/F_LEAVE
147      for (unsigned int i = 0; i < widgets.size(); i++) {
148        if (widgets[i]->visible()) {
149          if ((widget_belowmouse() == widgets[i]) &&
150              !widgets[i]->inside(F_Point(ev.mouse.x - x(), ev.mouse.y - y()))) {
151                ev.type = F_LEAVE;
152                widget_belowmouse()->handle(ev);
153                ev.type = t;
154                widget_belowmouse(0);
155                continue;
156           }
157            if (widgets[i]->inside(F_Point(ev.mouse.x - x(), ev.mouse.y - y())) &&
158            (widget_belowmouse() != widgets[i])) {
159              if (widget_belowmouse()) {
160                ev.type = F_LEAVE;
161                widget_belowmouse()->handle(ev);
162                ev.type = t;
163             }
164              widget_belowmouse(widgets[i]);
165              ev.type = F_ENTER;
166              return widget_belowmouse()->handle(ev);
167           }
168            // propagate F_POINTER_MOVE event
169            if (widget_belowmouse() == widgets[i])
170              if (widget_belowmouse()->handle(ev))
171                return true;
172       } // if (visible())
173     } // for()
174      goto out;
175    case F_POINTER_DRAG:
176 //     debug("F_POINTER_DRAG: wid - %d", id());
177      if (moving()) {
178        hide();
179        move(x() + (ev.mouse.x - last_mx), y() + (ev.mouse.y - last_my));
180        last_mx = ev.mouse.x;
181        last_my = ev.mouse.y;
182        show();
183        return true;
184     }
185      break;
186    case F_POINTER_DROP:
187      debug("F_POINTER_DROP: wid - %d", id());
188      if (moving()) {
189        draw();
190        moving(0);
191        return true;
192     }
193      break;
194    default:
195      break;
197    for (unsigned int i = 0; i < widgets.size(); i++) {
198      if (widgets[i]->visible()) {
199        if (widget_belowmouse() == widgets[i]) {
200          if (widget_belowmouse()->handle(ev))
201            return true;
202       } else if ((ev.type == F_KEY_PRESS) || (ev.type == F_KEY_RELEASE)) {
203           if (widgets[i]->handle(ev))
204             return true;
205       }
206    } // visible
207  } // for
208 out:
209   return F_Widget::handle(ev);
212 void F_Window::add(F_Widget *w)
214  w->parent(this);
215  w->id(++wid_);
216  widgets.push_back(w, wid_);
217  // add children
218  for (unsigned int i = 0; i < w->children.size(); i++) {
219    w->children[i]->parent(this);
220    w->children[i]->id(++wid_);
221    widgets.push_back(w->children[i], wid_);