Add copyright notice
[forms.git] / src / F_Text_Output.C
blob33adb49d4bd59c8dc7e6de992cc365c8a8374932
2  /*
3   *   Copyright (C) 2007, Harbour, All rights reserved.
4   */
6 #include <F_Text_Output.H>
8 using namespace F;
10 void F_Text_Output::draw()
12  F_Widget::draw();
13  F_Text_Symbol smb;
14  smb.ch_ = f_text_display->recode(' ');
15  smb.color(parent()->fg(), parent()->bg());
16  F_Point p(0, 0);
17  for (int x = 0; x < w(); x++) {
18    p.move(x, 0);
19    draw_buf.set(p, smb);
20    p.move(x, h() - 1);
21    draw_buf.set(p, smb);
22  }
23  p.move((w() - label().size())/2, 0);
24  put_string(p, label());
25  max_line_size_ = 0;
26  for (unsigned int i = 0; (int)i < (h() - 2); i++) {
27    p.move(0, i + 1);
28    if (lines.size() && ((i + topline_) < lines.size())) {
29      put_string(p, lines[i + topline_], start_col_);
30      if (lines[i + topline_].size() > max_line_size_)
31        max_line_size_ = lines[i + topline_].size();
32      if ((lines[i + topline_].size() - start_col_) < w()) { // clear by spaces
33        std::string spaces(w(), ' ');
34        p.move(lines[i + topline_].size() - start_col_, i + 1);
35        put_string(p, spaces);
36    }
37   } else {
38       std::string spaces(w(), ' ');
39       put_string(p, spaces);
40   }
41  }
42  // set vertical scrollbar
43  if ((int)lines.size() > (h() - 1)) {
44    vs->bounds(lines.size() - (h() - 1));
45    vs->show();
46  } else
47        vs->hide();
48  if (int(max_line_size_) > (w() - 1)) {
49    if (vs->visible())
50      hs->w(w() - 1);
51    else
52      hs->w(w());
53    hs->bounds(max_line_size_ - (w() - 1));
54    hs->show();
55  } else if (!start_col_)
56        hs->hide();
57  F_Widget::draw_children();
58  damage(F_DAMAGE_FLUSH);
61 void F_Text_Output::add_line(const char *str)
63  if (!str)
64   return;
65  std::string s(str);
66  std::string::size_type pos = 0, prev_pos = 0;
67  std::string a_;
68  while ((pos = s.find_first_of("\n", pos)) != std::string::npos) {
69    a_ = s.substr(prev_pos, pos - prev_pos);
70    if (a_.size())
71      lines.push_back(a_);
72    prev_pos = ++pos;
73  }
74   a_ = s.substr(prev_pos, pos - prev_pos);
75   if (a_.size())
76     lines.push_back(a_);
77   draw(); // may be not very effective 
80 bool F_Text_Output::handle(F_Event_t &ev)
82  switch(ev.type) {
83    case F_POINTER_PRESS:
84      debug("F_POINTER_PRESS: toid - %d", id());
85      draw();
86      break;
87    case F_POINTER_RELEASE:
88    case F_POINTER_DROP:
89 //     debug("F_POINTER_RELEASE: toid - %d", id());
90      do_callback();
91      draw();
92      break;
93    default:
94      debug("toid - %d, evtype - %d", id(), ev.type);
95      break;
96  }
97  // try pass events to scrollbars
98  if ((vs->visible() && vs->handle(ev)) || (hs->visible() && hs->handle(ev)))
99    return true;
100  return false;