Add copyright notice
[forms.git] / F / F_Widget.H
blob4e5a1eaa73ae25925e1c3d6afbbbd7418ed02822
2  /*
3   *   Copyright (C) 2007, Harbour, All rights reserved.
4   */
6 #ifndef _F_WIDGET_H_
7 #define _F_WIDGET_H_
9 #include <F_Text_Symbol_Region.H>
10 #include <F_Group.H>
11 #include <F_Text_Display.H>
13 namespace F {
15 typedef void (F_Callback)(F_Widget *, void *);
17 class F_Widget : public F_Text_Symbol_Region {
19   F_Window *parent_; // ÜÔÏ ÔÁËÖÅ ÉÎÆÁ Ï ÔÏÍ ÇÄÅ ×ÉÄÖÅÔ ÒÉÓÕÅÔÓÑ (ÍÅÎÀ for ex.)
20   F_Widget *parent_wdg_;
21   F_Group <F_Widget *> children;
22   std::string label_;
23   F_Align_Type_t label_type_;
24   F_Color label_color_;
25   // border & background symbol (ÍÏÖÎÏ ÉÈ ÐÏÔÏÍ ÒÁÚÄÅÌÉÔØ)
26   F_Text_Symbol bgs_;
27   // ÔÅËÕÝÉÊ Ã×ÅÔ ÔÅËÓÔÁ
28   F_Color text_color_;
29   F_Damage_t damage_;
30   // ÕÎÉËÁÌØÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ widget'Ï× × ÏËÎÁÈ É ÏËÏΠנÐÒÉÌÏÖÅÎÉÉ
31   unsigned int id_;
32   bool visible_;
33   bool can_be_focused_;
34   void *user_data_; // ÃÅÎÎÁÑ ÆÉÇÎÑ
35   F_Callback *callback_;
36   int when_;
37 //  F_ColorScheme scheme_;
38 //  F_UIStyle style_;
40   void parent(F_Window *w) { parent_ = w; }
41 //  void parent_wdg(F_Widget *w) { parent_wdg_ = w; }
42   void id(unsigned int i) { id_ = i; }
44  public:
46   void when(int wh) { when_ = wh; }
47   int when(void) { return when_; }
48   F_Window *parent() { return parent_; }
49   F_Widget *parent_wdg() { return parent_wdg_; }
50   // child widget'Ù ÄÏÌÖÎÙ ÂÙÔØ ÄÏÂÁ×ÌÅÎÙ ÄÏ ÔÏÇÏ ËÁË ÂÕÄÅÔ ÄÏÂÁ×ÌÅΠÓÁÍ
51   // ÒÏÄÉÔÅÌØÓËÉÊ widget ?! ...
52   void add_child(F_Widget *wdg) {
53     children.push_back(wdg, 0);
54     wdg->parent_wdg_ = this;
55   }
56   F_Callback *callback() const { return callback_; }
57   void callback(F_Callback *c, void *p) { callback_ = c; user_data_ = p; }
58   void callback(F_Callback *c) { callback_=c; }
59 //  void callback(F_Callback0*c) {callback_=(Fl_Callback*)c;}
60 //  void callback(F_Callback1*c, long p=0) {callback_=(Fl_Callback*)c; user_data_=(void*)p;}
61   static void default_callback(F_Widget *, void *);
62   void do_callback() { callback_(this, user_data_); /* if (callback_ != default_callback) clear_changed(); */}
63   void do_callback(F_Widget *o, void *arg = 0) { callback_(o, arg); }
64   void do_callback(F_Widget *o, long arg) { callback_(o, (void*)arg); }
66   // ×Ù×ÏÄÉÔ ÓÔÒÏËÕ × ×ÉÄÖÅÔÅ
67   // ÄÏÌÖÎÁ ÉÓÐÏÌØÚÏ×ÁÔØ text_color ÐÏ ÉÄÅÅ ÉÌÉ ÄÏÂÁ×ÉÔØ ÐÁÒÁÍÅÔÒ
68   void put_string(F_Point &p, std::string &str, unsigned int offset = 0);
69 //    F_Align_Type_t wrap = F_ALIGN_WRAP);
70   F_Widget(coord_t x, coord_t y, dim_t w, dim_t h, const char *l = 0) :
71     F_Text_Symbol_Region(x, y, w, h), bgs_(' ', F_DEFAULT_FG, F_DEFAULT_BG) {
72       label(l);
73       user_data_ = 0;
74       id_ = 0;
75       parent_ = f_text_display->current_window;
76       visible_ = true;
77       when_ = F_WHEN_CHANGED;
78       can_be_focused_ = false;
79       label_type_ = F_ALIGN_LEFT;
80       text_color_.bg_ = F_DEFAULT_BG;
81       text_color_.fg_ = F_DEFAULT_FG;
82       callback_ = default_callback;
83       damage_ = F_DAMAGE_ALL;
84   }
86   virtual ~F_Widget() { }
87   unsigned int id() { return id_; }
88   void can_be_focused(bool c) { can_be_focused_ = c; }
89   bool can_be_focused() { return can_be_focused_; }
90   std::string& label() { return label_; }
91   void label(const char *l) { lock(); if (l) label_ = l; unlock(); }
92   void label(std::string &l) { lock(); label_ = l; unlock(); }
93   void label_type(F_Align_Type_t t) { label_type_ = t; }
94   F_Align_Type_t label_type() { return label_type_; }
96   void user_data(void *data) { user_data_ = data; }
97   void *user_data() { return user_data_; }
98   virtual void draw_children() {
99     for (unsigned int i = 0; i < children.size(); i++)
100       if (children[i]->visible())
101         children[i]->draw();
102   }
103   // default draw
104   virtual void draw() {
105     F_Region r(w(), h());
106     draw_buf.fill(r, bgs_);
107     damage_ = F_DAMAGE_FLUSH;
108     // children
109     draw_children();
110   }
112   // damage() ÓÏÏÂÝÁÅÔ ÕÓÔÒÏÊÓÔ×Õ ÏÔÏÂÒÁÖÅÎÉÑ ÞÔÏ ÎÕÖÎÏ ÏÂÎÏ×ÉÔØ
113   // ÂÕÆÅÒ ÜËÒÁÎÁ ÓÏÄÅÒÖÉÍÙÍ ÄÁÎÎÏÇÏ ÏËÎÁ, ÉÌÉ ÏËÎÏ ÓÏÄÅÒÖÉÍÙÍ ÄÁÎÎÏÇÏ ×ÉÄÖÅÔÁ
114   virtual F_Damage_t damage() {
115     if (!visible())
116       return F_DAMAGE_NONE;
117     return damage_;
118   }
119   // × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ "ÕÝÅÒÂÁ" ÐÒÏÉÚ×ÏÄÉÔ ÒÁÚÎÙÅ ÏÐÅÒÁÃÉÉ, for ex.
120   // F_DAMAGE_FLUSH - ÕËÁÚÁÎÉÅ ÏÂÎÏ×ÉÔØ draw_buf ×ÙÛÅ ÐÏ ÉÅÒÁÒÈÉÉ
121   virtual void damage(F_Damage_t dm) { lock(); damage_ = dm; unlock(); }
123   void redraw() { damage(F_DAMAGE_ALL); }
124   void flush();
125   bool visible() { return visible_; }
127   void bg(F_Color_t bg_) { bgs_.bg(bg_); redraw(); }
128   void bgch(F_Char_t ch_) { bgs_.ch(ch_); redraw(); }
129   void fg(F_Color_t fg_) { bgs_.fg(fg_); redraw(); }
130   void color(F_Color c) { bgs_.color(c); redraw(); }
131   void color(F_Color_t bg_, F_Color_t fg_) { bg(bg_); fg(fg_); }
132   F_Color_t bg() { return bgs_.bg(); }
133   F_Color_t fg() { return bgs_.fg(); }
134   F_Color color() { return bgs_.color(); }
136   virtual void show(F_Damage_t d = F_DAMAGE_NONE);
137 //   { lock(); visible_ = true; parent_->damage_ |= F_DAMAGE_FLUSH; unlock(); }
138   virtual void hide();
139 //   { lock(); visible_ = false; parent_->damage_ |= F_DAMAGE_FLUSH; unlock(); }
140   virtual bool handle(F_Event_t &ev) { return false; }
142   friend class F_Window;  
143  };
146 #endif