keypress_draw = 1;
last_keypress = 0;
separators = 0;
+ xscroll = 0;
yscroll = 0;
dirty = 1;
return 0;
}
}
-int BC_TextBox::get_enabled()
-{
- return enabled;
-}
+int BC_TextBox::get_enabled() { return enabled; }
+int BC_TextBox::get_text_x() { return text_x; }
+int BC_TextBox::get_text_y() { return text_y; }
+void BC_TextBox::set_text_x(int v) { text_x = v; }
+void BC_TextBox::set_text_y(int v) { text_y = v; }
int BC_TextBox::pixels_to_rows(BC_WindowBase *window, int font, int pixels)
{
this->y = y;
this->w = w;
this->rows = rows;
+ xscroll = 0; yscroll = 0;
this->default_text = default_text;
this->default_wtext = 0;
this->default_size = default_size;
this->y = y;
this->w = w;
this->rows = rows;
+ xscroll = 0; yscroll = 0;
this->default_text = 0;
this->default_wtext = default_wtext;
this->default_size = default_size;
BC_ScrollTextBox::~BC_ScrollTextBox()
{
+ delete xscroll;
delete yscroll;
if(text) {
text->gui = 0;
parent_window->add_subwindow(text = default_wtext ?
new BC_ScrollTextBoxText(this, default_wtext) :
new BC_ScrollTextBoxText(this, default_text));
- parent_window->add_subwindow(yscroll = new BC_ScrollTextBoxYScroll(this));
- text->yscroll = yscroll;
- yscroll->bound_to = text;
set_text_row(0);
}
void BC_ScrollTextBox::set_text(char *text, int isz)
{
this->text->set_text(text, isz);
- yscroll->update_length(this->text->get_text_rows(),
- this->text->get_text_row(),
- yscroll->get_handlelength(),
- 1);
+ update_scrollbars();
}
int BC_ScrollTextBox::set_text_row(int n)
{
text->set_text_row(n);
- yscroll->update_value(n);
+ update_scrollbars();
return 1;
}
void BC_ScrollTextBox::update(const char *text)
{
this->text->update(text);
- yscroll->update_length(this->text->get_text_rows(),
- this->text->get_text_row(),
- yscroll->get_handlelength(),
- 1);
+ update_scrollbars();
}
void BC_ScrollTextBox::update(const wchar_t *wtext)
{
this->text->update(wtext);
- yscroll->update_length(this->text->get_text_rows(),
- this->text->get_text_row(),
- yscroll->get_handlelength(),
- 1);
+ update_scrollbars();
}
void BC_ScrollTextBox::reposition_window(int x, int y, int w, int rows)
this->y = y;
this->w = w;
this->rows = rows;
-
- text->reposition_window(x,
- y,
- w - yscroll->get_span(),
- rows);
- yscroll->reposition_window(x + w - yscroll->get_span(),
- y,
- BC_TextBox::calculate_row_h(rows,
- parent_window));
- yscroll->update_length(text->get_text_rows(),
- text->get_text_row(),
- rows,
- 0);
+ update_scrollbars();
}
int BC_ScrollTextBox::button_press_event()
{
return text->get_ibeam_letter();
}
+int BC_ScrollTextBox::get_x_pos()
+{
+ return text->left_margin - text->get_text_x();
+}
+void BC_ScrollTextBox::set_x_pos(int x)
+{
+ text->set_text_x(text->left_margin - x);
+ text->draw(1);
+}
BC_ScrollTextBoxText::BC_ScrollTextBoxText(BC_ScrollTextBox *gui, const char *text)
: BC_TextBox(gui->x, gui->y,
}
}
+void BC_ScrollTextBox::update_scrollbars()
+{
+ int view_w = w, view_rows = rows;
+ int view_h = BC_TextBox::calculate_row_h(view_rows, parent_window);
+ int text_rows = text->get_text_rows();
+ int text_width = parent_window->get_text_width(text->font, text->get_wtext());
+ BC_Resources *resources = parent_window->get_resources();
+ int need_xscroll = 0, need_yscroll = 0;
+
+// Create scrollbars as needed
+ int resize = 1;
+ while( resize ) {
+ resize = 0;
+ if( !need_xscroll && (text->get_text_x() != text->left_margin ||
+ text_width >= view_w - text->left_margin - text->right_margin) ) {
+ resize = need_xscroll = 1;
+ view_h -= resources->hscroll_data[SCROLL_HANDLE_UP]->get_h();
+ view_rows = BC_TextBox::pixels_to_rows(parent_window, text->font, view_h);
+ }
+ if( !need_yscroll && (text->get_text_y() != text->top_margin ||
+ text_rows > view_rows) ) {
+ resize = need_yscroll = 1;
+ view_w -= resources->vscroll_data[SCROLL_HANDLE_UP]->get_w();
+ }
+ }
+
+ if( !need_xscroll && xscroll ) {
+ text->yscroll = 0;
+ delete xscroll; xscroll = 0;
+ }
+ if( !need_yscroll && yscroll ) {
+ text->yscroll = 0;
+ delete yscroll; yscroll = 0;
+ }
+
+ if( view_rows != text->get_rows() || view_w != text->get_w() ) {
+ text->reposition_window(x, y, view_w, view_rows);
+ }
+ if( need_xscroll && !xscroll ) {
+ xscroll = new BC_ScrollTextBoxXScroll(this);
+ parent_window->add_subwindow(xscroll);
+ text->xscroll = xscroll;
+ xscroll->bound_to = text;
+ xscroll->show_window();
+ }
+ if( need_yscroll && !yscroll ) {
+ yscroll = new BC_ScrollTextBoxYScroll(this);
+ parent_window->add_subwindow(yscroll);
+ text->yscroll = yscroll;
+ yscroll->bound_to = text;
+ yscroll->show_window();
+ }
+ if( xscroll ) {
+ xscroll->reposition_window(x, y + text->get_h(), view_w);
+ int xpos = get_x_pos();
+ if( xpos != xscroll->get_value() )
+ xscroll->update_value(xpos);
+ int xlength = text_width + view_w/4;
+ if( xlength != xscroll->get_length() ||
+ view_w != xscroll->get_handlelength() )
+ xscroll->update_length(xlength, xpos, view_w, 0);
+ }
+ if( yscroll ) {
+ yscroll->reposition_window(x + w - yscroll->get_span(), y, text->get_h());
+ int text_row = text->get_text_row();
+ if( text_row != yscroll->get_value() )
+ yscroll->update_value(text_row);
+ if( text_rows != yscroll->get_length() ||
+ view_rows != yscroll->get_handlelength() )
+ yscroll->update_length(text_rows, text_row, view_rows, 0);
+ }
+}
+
int BC_ScrollTextBoxText::handle_event()
{
- gui->yscroll->update_length(get_text_rows(),
- get_text_row(),
- gui->yscroll->get_handlelength(),
- 1);
+ gui->update_scrollbars();
return gui->handle_event();
}
int BC_ScrollTextBoxText::motion_event()
{
- gui->yscroll->update_length(get_text_rows(),
- get_text_row(),
- gui->yscroll->get_handlelength(),
- 1);
+ gui->update_scrollbars();
+ return 1;
+}
+
+BC_ScrollTextBoxXScroll::BC_ScrollTextBoxXScroll(BC_ScrollTextBox *gui)
+ : BC_ScrollBar(gui->x, gui->y + gui->text->get_h(), SCROLL_HORIZ, gui->text->get_w(),
+ gui->text->get_text_width(MEDIUMFONT, gui->get_wtext()), 0, gui->w)
+{
+ this->gui = gui;
+}
+
+BC_ScrollTextBoxXScroll::~BC_ScrollTextBoxXScroll()
+{
+}
+
+int BC_ScrollTextBoxXScroll::handle_event()
+{
+ gui->set_x_pos(get_position());
return 1;
}
BC_ScrollTextBoxYScroll::BC_ScrollTextBoxYScroll(BC_ScrollTextBox *gui)
- : BC_ScrollBar(gui->x +
- gui->w -
- get_resources()->vscroll_data[SCROLL_HANDLE_UP]->get_w(),
- gui->y,
- SCROLL_VERT,
- BC_TextBox::calculate_row_h(gui->rows,
- gui->parent_window),
- gui->text->get_text_rows(),
- 0,
- gui->rows)
+ : BC_ScrollBar(gui->x + gui->text->get_w(), gui->y, SCROLL_VERT, gui->text->get_h(),
+ gui->text->get_text_rows(), 0, gui->rows)
{
this->gui = gui;
}
class BC_TextBoxSuggestions;
+
+class BC_ScrollTextBoxXScroll;
class BC_ScrollTextBoxYScroll;
+class BC_ScrollTextBoxText;
class BC_TextBox : public BC_SubWindow
friend class BC_TextBoxSuggestions;
+ friend class BC_ScrollTextBox;
// Whenever the contents of the text change
// Set top left of text view
void set_text_row(int row);
int get_text_row();
+ int get_text_x();
+ int get_text_y();
+ void set_text_x(int v);
+ void set_text_y(int v);
int reposition_window(int x, int y, int w = -1, int rows = -1);
int uses_text();
// column - starting column to replace
void no_suggestions();
void set_suggestions(ArrayList<char*> *suggestions, int column);
- BC_ScrollTextBoxYScroll *yscroll;
+ BC_ScrollTextBoxXScroll *xscroll;
+ BC_ScrollTextBoxYScroll *yscroll;
private:
int reset_parameters(int rows, int has_border, int font, int size);
void draw(int flush);
};
-
-class BC_ScrollTextBoxText;
-class BC_ScrollTextBoxYScroll;
-
-
class BC_ScrollTextBox
{
BC_ScrollTextBoxText *text;
+ BC_ScrollTextBoxXScroll *xscroll;
BC_ScrollTextBoxYScroll *yscroll;
BC_WindowBase *parent_window;
const char *default_text;
int x, y, w, rows;
friend class BC_ScrollTextBoxText;
+ friend class BC_ScrollTextBoxXScroll;
friend class BC_ScrollTextBoxYScroll;
public:
BC_ScrollTextBox(BC_WindowBase *parent_window,
void update(const char *text);
void update(const wchar_t *wtext);
void reposition_window(int x, int y, int w, int rows);
+ void update_scrollbars();
// accessors
int get_x() { return x; }
int get_y() { return y; }
int get_w() { return w; }
// Visible rows for resizing
int get_rows() { return rows; }
-
+ int get_x_pos();
+ void set_x_pos(int x);
// forward functions
int get_h();
const char *get_text();
int button_release_event() { return gui->button_release_event(); }
};
+class BC_ScrollTextBoxXScroll : public BC_ScrollBar
+{
+public:
+ BC_ScrollTextBoxXScroll(BC_ScrollTextBox *gui);
+ virtual ~BC_ScrollTextBoxXScroll();
+ int handle_event();
+ BC_ScrollTextBox *gui;
+};
+
class BC_ScrollTextBoxYScroll : public BC_ScrollBar
{
public: