aseprite/src/ui/textbox.cpp

194 lines
4.1 KiB
C++
Raw Normal View History

// ASEPRITE gui library
2013-01-27 23:13:13 +08:00
// Copyright (C) 2001-2013 David Capello
//
// This source file is distributed under a BSD-like license, please
// read LICENSE.txt for more information.
2007-09-19 07:57:02 +08:00
#ifdef HAVE_CONFIG_H
2009-07-13 04:29:16 +08:00
#include "config.h"
#endif
2009-07-13 04:29:16 +08:00
2012-06-18 09:49:58 +08:00
#include "ui/textbox.h"
2007-09-19 07:57:02 +08:00
#include "gfx/size.h"
2012-06-18 09:49:58 +08:00
#include "ui/intern.h"
#include "ui/message.h"
#include "ui/preferred_size_event.h"
#include "ui/system.h"
#include "ui/theme.h"
#include "ui/view.h"
2007-09-19 07:57:02 +08:00
#include <allegro/keyboard.h>
2007-09-19 07:57:02 +08:00
namespace ui {
TextBox::TextBox(const char* text, int align)
: Widget(kTextBoxWidget)
2007-09-19 07:57:02 +08:00
{
setFocusStop(true);
setAlign(align);
setText(text);
initTheme();
2007-09-19 07:57:02 +08:00
}
bool TextBox::onProcessMessage(Message* msg)
2007-09-19 07:57:02 +08:00
{
switch (msg->type()) {
2007-09-19 07:57:02 +08:00
case kKeyDownMessage:
if (hasFocus()) {
View* view = View::getView(this);
if (view) {
gfx::Rect vp = view->getViewportBounds();
gfx::Point scroll = view->getViewScroll();
int textheight = jwidget_get_text_height(this);
switch (static_cast<KeyMessage*>(msg)->scancode()) {
case kKeyLeft:
scroll.x -= vp.w/2;
view->setViewScroll(scroll);
break;
case kKeyRight:
scroll.x += vp.w/2;
view->setViewScroll(scroll);
break;
case kKeyUp:
scroll.y -= vp.h/2;
view->setViewScroll(scroll);
break;
case kKeyDown:
scroll.y += vp.h/2;
view->setViewScroll(scroll);
break;
case kKeyPageUp:
scroll.y -= (vp.h-textheight);
view->setViewScroll(scroll);
break;
case kKeyPageDown:
scroll.y += (vp.h-textheight);
view->setViewScroll(scroll);
break;
case kKeyHome:
scroll.y = 0;
view->setViewScroll(scroll);
break;
case kKeyEnd:
scroll.y = jrect_h(this->rc) - vp.h;
view->setViewScroll(scroll);
break;
default:
return false;
}
}
return true;
2007-09-19 07:57:02 +08:00
}
break;
case kMouseDownMessage: {
View* view = View::getView(this);
2007-09-19 07:57:02 +08:00
if (view) {
captureMouse();
jmouse_set_cursor(kScrollCursor);
return true;
2007-09-19 07:57:02 +08:00
}
break;
}
case kMouseMoveMessage: {
View* view = View::getView(this);
if (view && hasCapture()) {
gfx::Rect vp = view->getViewportBounds();
gfx::Point scroll = view->getViewScroll();
scroll.x += jmouse_x(1) - jmouse_x(0);
scroll.y += jmouse_y(1) - jmouse_y(0);
2007-09-19 07:57:02 +08:00
view->setViewScroll(scroll);
2007-09-19 07:57:02 +08:00
jmouse_control_infinite_scroll(vp);
2007-09-19 07:57:02 +08:00
}
break;
}
case kMouseUpMessage: {
View* view = View::getView(this);
if (view && hasCapture()) {
releaseMouse();
jmouse_set_cursor(kArrowCursor);
return true;
2007-09-19 07:57:02 +08:00
}
break;
}
case kMouseWheelMessage: {
View* view = View::getView(this);
2007-09-19 07:57:02 +08:00
if (view) {
gfx::Point scroll = view->getViewScroll();
scroll.y += (jmouse_z(1) - jmouse_z(0)) * jwidget_get_text_height(this)*3;
view->setViewScroll(scroll);
2007-09-19 07:57:02 +08:00
}
break;
}
}
return Widget::onProcessMessage(msg);
2007-09-19 07:57:02 +08:00
}
void TextBox::onPaint(PaintEvent& ev)
{
getTheme()->paintTextBox(ev);
}
void TextBox::onPreferredSize(PreferredSizeEvent& ev)
2007-09-19 07:57:02 +08:00
{
int w = 0;
int h = 0;
2007-09-19 07:57:02 +08:00
// TODO is it necessary?
//w = widget->border_width.l + widget->border_width.r;
//h = widget->border_width.t + widget->border_width.b;
2007-09-19 07:57:02 +08:00
2013-03-31 00:38:24 +08:00
drawTextBox(NULL, this, &w, &h, ColorNone, ColorNone);
if (this->getAlign() & JI_WORDWRAP) {
View* view = View::getView(this);
int width, min = w;
2007-09-19 07:57:02 +08:00
if (view) {
width = view->getViewportBounds().w;
2007-09-19 07:57:02 +08:00
}
else {
width = jrect_w(this->rc);
2007-09-19 07:57:02 +08:00
}
w = MAX(min, width);
2013-03-31 00:38:24 +08:00
drawTextBox(NULL, this, &w, &h, ColorNone, ColorNone);
2007-09-19 07:57:02 +08:00
w = min;
2007-09-19 07:57:02 +08:00
}
ev.setPreferredSize(gfx::Size(w, h));
2007-09-19 07:57:02 +08:00
}
void TextBox::onSetText()
{
View* view = View::getView(this);
if (view)
view->updateView();
Widget::onSetText();
}
} // namespace ui