Add copyright notice
[forms.git] / F / F_Window.H
blob6912db2528ca33e6dc9c78176855354206118f7d
2  /*
3   *   Copyright (C) 2007, Harbour, All rights reserved.
4   */
6 #ifndef _F_WINDOW_H_
7 #define _F_WINDOW_H_
9 #include <F_Types.H>
10 #include <F_Widget.H>
12 namespace F {
14 // ÏËÎÁ ÒÉÓÕÀÔÓÑ ×ÎÕÔÒÉ F_Text_Display
16 class F_Window : public F_Widget {
18   F_Group <F_Widget *> widgets;
19   F_Widget *widget_belowmouse_;
20   F_Border_t border_;
21   F_Window_Type_t type;
22   unsigned int wid_; // ÐÏÓÌÅÄÎÉÊ ÕÎÉËÁÌØÎÙÊ widget_id
23   bool moving_;
24   coord_t last_mx, last_my; // last mouse move coords
25   unsigned int depth_;
26   
27   void draw_label();
28   void draw_border(F_Border_t b = F_NO_BORDER);
29   void draw();
30   void moving(bool m) { moving_ = m; }
31   // ÇÌÕÂÉÎÁ ÏËÎÁ ÎÁ ÜËÒÁÎÅ - ÞÅÍ ÂÏÌØÛÅ ÔÅÍ ÇÌÕÂÖÅ - i.e. 0 => top window
32   void depth(unsigned int d) { depth_ = d; }
33   void widget_belowmouse(F_Widget *w) { widget_belowmouse_ = w; }
34       
35  public:
36   void modal(bool m) { type = (m ? F_MODAL_WINDOW : F_NORMAL_WINDOW); }
37   bool modal() { return (type == F_MODAL_WINDOW ? true : false); }
38   F_Window(coord_t x, coord_t y, dim_t w, dim_t h, const char *label = 0) : F_Widget(x, y, w, h, label) {
39     parent_ = 0; // ÔÉÐÁ ÎÅÔÕ ÅÇÏ ÉÂÏ parent ÅÓÔØ display
40     depth_ = 0;
41     border(F_DOUBLE_BORDER);
42     visible_ = false; // ÏËÎÏ, × ÏÔÌÉÞÉÅ ÏÔ ×ÉÄÖÅÔÁ, by default ÓËÒÙÔÏ
43     moving_ = false;
44     id(f_text_display->new_window(*this));
45     wid_ = 0;
46  }
47   ~F_Window() { f_text_display->delete_window(*this); }
48   F_Widget *widget_belowmouse() { return widget_belowmouse_; }
49   void take_focus(F_Widget *w) {
50     F_Event_t ev;
51     if (focus()) {
52       ev.type = F_UNFOCUS;
53       focus()->handle(ev);
54    }
55     widgets.take_focus(w);
56     ev.type = F_FOCUS;
57     w->handle(ev);
58   }
59   F_Widget *focus() { return widgets.focus(); }
60   F_Widget *focus_prev() { return widgets.focus_prev(); }
61   F_Widget *focus_next() { return widgets.focus_next(); }
62   unsigned int depth() { return depth_; }
63   void show() { if (visible()) return; draw(); F_Widget::show(); f_text_display->show_window(*this); }
64   void hide() { if (!visible()) return; F_Widget::hide(); f_text_display->hide_window(*this); }
65   void border(F_Border_t brd) { if (brd == border_) return; lock(); border_ = brd; damage_ |= F_DAMAGE_BORDER; unlock(); }
66   bool moving() { return moving_; }
67   // ÍÏÖÎÏ ÐÏÔÏÍ ÐÅÒÅÄÅÌÁÔØ ÎÁ F_Group
68   void add(F_Widget *);
69   bool handle(F_Event_t &ev);
70   // ÐÒÏÈÏÄÉÍ ÐÏ widget'ÁÍ
71   void flush() {
72 //    debug("flushing id %d", id());
73     for (unsigned int i = 0; i < widgets.size(); i++)
74       widgets[i]->flush();
75     F_Widget::damage(F_DAMAGE_NONE);
76  }
77   F_Damage_t damage() {
78     F_Damage_t dm = F_Widget::damage();
79     for (unsigned int i = 0; i < widgets.size(); i++)
80       dm |= widgets[i]->damage();
81     return dm;
82   }
84   friend class F_Text_Display;
85  };
88 #endif