]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiWorkArea.C
enable Font cache only for MacOSX and inline width() for other platform.
[lyx.git] / src / frontends / qt4 / GuiWorkArea.C
index d17d6aefd6e4b7506dd893597f1f56a6eb824215..dfbf30fbca6fe50b2bd944cbd47cb096678461b9 100644 (file)
 
 #include <config.h>
 
-#include <boost/current_function.hpp>
-
-// This include must be declared before everything else because
-// of boost/Qt/LyX clash...
-#include "GuiView.h"
-
 #include "GuiWorkArea.h"
+
+#include "GuiApplication.h"
 #include "QLPainter.h"
 #include "QLyXKeySym.h"
-
-#include "ColorCache.h"
 #include "qt_helpers.h"
-#include "Application.h"
+
+#include "LyXView.h"
+
 #include "BufferView.h"
 #include "debug.h"
 #include "funcrequest.h"
 #include "LColor.h"
+
 #include "support/os.h"
 
 #include <QLayout>
@@ -40,6 +37,7 @@
 #include <QScrollBar>
 
 #include <boost/bind.hpp>
+#include <boost/current_function.hpp>
 
 // Abdel (26/06/2006):
 // On windows-XP the UserGuide PageDown scroll test is faster without event pruning (16 s)
@@ -58,7 +56,7 @@ namespace os = lyx::support::os;
 namespace {
 
 /// return the LyX key state from Qt's
-key_modifier::state q_key_state(Qt::ButtonState state)
+key_modifier::state q_key_state(Qt::KeyboardModifiers state)
 {
        key_modifier::state k = key_modifier::none;
        if (state & Qt::ControlModifier)
@@ -72,7 +70,7 @@ key_modifier::state q_key_state(Qt::ButtonState state)
 
 
 /// return the LyX mouse button state from Qt's
-mouse_button::state q_button_state(Qt::ButtonState button)
+mouse_button::state q_button_state(Qt::MouseButton button)
 {
        mouse_button::state b = mouse_button::none;
        switch (button) {
@@ -93,7 +91,7 @@ mouse_button::state q_button_state(Qt::ButtonState button)
 
 
 /// return the LyX mouse button state from Qt's
-mouse_button::state q_motion_state(Qt::ButtonState state)
+mouse_button::state q_motion_state(Qt::MouseButton state)
 {
        mouse_button::state b = mouse_button::none;
        if (state & Qt::LeftButton)
@@ -118,8 +116,8 @@ SyntheticMouseEvent::SyntheticMouseEvent()
 {}
 
 
-GuiWorkArea::GuiWorkArea(int w, int h, QWidget * parent, BufferView * buffer_view)
-: QAbstractScrollArea(parent), WorkArea(buffer_view), painter_(this)
+GuiWorkArea::GuiWorkArea(int w, int h, LyXView & lyx_view)
+: WorkArea(lyx_view), painter_(this)
 {
        setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
        setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
@@ -130,17 +128,11 @@ GuiWorkArea::GuiWorkArea(int w, int h, QWidget * parent, BufferView * buffer_vie
 
        viewport()->setAutoFillBackground(false);
        viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
-
-       viewport()->setFocusPolicy(Qt::WheelFocus);
-       viewport()->setFocus();
        setFocusPolicy(Qt::WheelFocus);
 
        viewport()->setCursor(Qt::IBeamCursor);
 
        resize(w, h);
-       show();
-       workWidth_ = w;
-       workHeight_ = h;
 
        synthetic_mouse_event_.timeout.timeout.connect(
                boost::bind(&GuiWorkArea::generateSyntheticMouseEvent,
@@ -151,7 +143,7 @@ GuiWorkArea::GuiWorkArea(int w, int h, QWidget * parent, BufferView * buffer_vie
                this, SLOT(adjustViewWithScrollBar(int)));
 
        // PageStep only depends on the viewport height.
-       verticalScrollBar()->setPageStep(workHeight_);
+       verticalScrollBar()->setPageStep(viewport()->height());
 
        lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION
                << "\n Area width\t" << width()
@@ -170,7 +162,8 @@ GuiWorkArea::GuiWorkArea(int w, int h, QWidget * parent, BufferView * buffer_vie
                        lyxerr[Debug::GUI] << "ERROR: keyeventTimeout cannot connect!" << endl;
 
                // Start the timer, one-shot.
-               step_timer_.start(50, true);
+               step_timer_.setSingleShot(true);
+               step_timer_.start(50);
        }
 
        // Enables input methods for asian languages.
@@ -178,6 +171,7 @@ GuiWorkArea::GuiWorkArea(int w, int h, QWidget * parent, BufferView * buffer_vie
        setAttribute(Qt::WA_InputMethodEnabled, true);
 }
 
+
 GuiWorkArea::~GuiWorkArea()
 {
 }
@@ -185,29 +179,23 @@ GuiWorkArea::~GuiWorkArea()
 
 void GuiWorkArea::setScrollbarParams(int h, int scroll_pos, int scroll_line_step)
 {
+       verticalScrollBar()->setTracking(false);
+
        // do what cursor movement does (some grey)
        h += height() / 4;
        int scroll_max_ = std::max(0, h - height());
 
        verticalScrollBar()->setRange(0, scroll_max_);
        verticalScrollBar()->setSliderPosition(scroll_pos);
-       verticalScrollBar()->setLineStep(scroll_line_step);
+       verticalScrollBar()->setSingleStep(scroll_line_step);
+
+       verticalScrollBar()->setTracking(true);
 }
 
 
 void GuiWorkArea::adjustViewWithScrollBar(int)
 {
-       /*
-       lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION
-               << " verticalScrollBar val=" << verticalScrollBar()->value()
-               << " verticalScrollBar pos=" << verticalScrollBar()->sliderPosition()
-               << " min=" << verticalScrollBar()->minimum()
-               << " max=" << verticalScrollBar()->maximum()
-               << " pagestep=" << verticalScrollBar()->pageStep()
-               << " linestep=" << verticalScrollBar()->lineStep()
-               << endl;
-       */
-       buffer_view_->scrollDocView(verticalScrollBar()->sliderPosition());
+       scrollBufferView(verticalScrollBar()->sliderPosition());
 }
 
 
@@ -229,9 +217,9 @@ void GuiWorkArea::dropEvent(QDropEvent* event)
 
        lyxerr[Debug::GUI] << "GuiWorkArea::dropEvent: got URIs!" << endl;
        for (int i = 0; i!=files.size(); ++i) {
-               string const file = os::internal_path(fromqstr(files.at(i).toString()));
+               string const file = os::internal_path(fromqstr(files.at(i).toLocalFile()));
                if (!file.empty())
-                       buffer_view_->workAreaDispatch(FuncRequest(LFUN_FILE_OPEN, file));
+                       dispatch(FuncRequest(LFUN_FILE_OPEN, file));
        }
 }
 
@@ -243,13 +231,13 @@ void GuiWorkArea::mousePressEvent(QMouseEvent * e)
                FuncRequest cmd(LFUN_MOUSE_TRIPLE,
                        dc_event_.x, dc_event_.y,
                        q_button_state(dc_event_.state));
-               buffer_view_->workAreaDispatch(cmd);
+               dispatch(cmd);
                return;
        }
 
        FuncRequest const cmd(LFUN_MOUSE_PRESS, e->x(), e->y(),
                              q_button_state(e->button()));
-       buffer_view_->workAreaDispatch(cmd);
+       dispatch(cmd);
 }
 
 
@@ -260,14 +248,14 @@ void GuiWorkArea::mouseReleaseEvent(QMouseEvent * e)
 
        FuncRequest const cmd(LFUN_MOUSE_RELEASE, e->x(), e->y(),
                              q_button_state(e->button()));
-       buffer_view_->workAreaDispatch(cmd);
+       dispatch(cmd);
 }
 
 
 void GuiWorkArea::mouseMoveEvent(QMouseEvent * e)
 {
        FuncRequest cmd(LFUN_MOUSE_MOTION, e->x(), e->y(),
-                             q_motion_state(e->state()));
+                             q_motion_state(e->button()));
 
        // If we're above or below the work area...
        if (e->y() <= 20 || e->y() >= viewport()->height() - 20) {
@@ -320,7 +308,7 @@ void GuiWorkArea::mouseMoveEvent(QMouseEvent * e)
                synthetic_mouse_event_.scrollbar_value_old = scrollbar_value;
 
                // ... and dispatch the event to the LyX core.
-               buffer_view_->workAreaDispatch(cmd);
+               dispatch(cmd);
        }
 }
 
@@ -331,14 +319,14 @@ void GuiWorkArea::wheelEvent(QWheelEvent * e)
        // documentation of QWheelEvent)
        int const lines = qApp->wheelScrollLines() * e->delta() / 120;
        verticalScrollBar()->setValue(verticalScrollBar()->value() -
-                       lines *  verticalScrollBar()->lineStep());
+                       lines *  verticalScrollBar()->singleStep());
        adjustViewWithScrollBar();
 }
 
 
 void GuiWorkArea::generateSyntheticMouseEvent()
 {
-       // Set things off to generate the _next_ 'pseudo' event.
+// Set things off to generate the _next_ 'pseudo' event.
        if (synthetic_mouse_event_.restart_timeout)
                synthetic_mouse_event_.timeout.start();
 
@@ -350,7 +338,7 @@ void GuiWorkArea::generateSyntheticMouseEvent()
                synthetic_mouse_event_.scrollbar_value_old = scrollbar_value;
 
                // ... and dispatch the event to the LyX core.
-               buffer_view_->workAreaDispatch(synthetic_mouse_event_.cmd);
+               dispatch(synthetic_mouse_event_.cmd);
        }
 }
 
@@ -359,7 +347,7 @@ void GuiWorkArea::keyPressEvent(QKeyEvent * e)
 {
        lyxerr[Debug::KEY] << BOOST_CURRENT_FUNCTION
                << " count=" << e->count()
-               << " text=" << (const char *) e->text()
+               << " text=" << fromqstr(e->text())
                << " isAutoRepeat=" << e->isAutoRepeat()
                << " key=" << e->key()
                << endl;
@@ -370,7 +358,7 @@ void GuiWorkArea::keyPressEvent(QKeyEvent * e)
        else {
                boost::shared_ptr<QLyXKeySym> sym(new QLyXKeySym);
                sym->set(e);
-               processKeySym(sym, q_key_state(e->state()));
+               processKeySym(sym, q_key_state(e->modifiers()));
        }
 }
 
@@ -395,19 +383,20 @@ void GuiWorkArea::keyeventTimeout()
 
                lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION
                                   << " count=" << ev->count()
-                                  << " text=" << (const char *) ev->text()
+                                  << " text=" <<  fromqstr(ev->text())
                                   << " isAutoRepeat=" << ev->isAutoRepeat()
                                   << " key=" << ev->key()
                                   << endl;
 
-               processKeySym(sym, q_key_state(ev->state()));
+               processKeySym(sym, q_key_state(ev->modifiers()));
                keyeventQueue_.pop();
 
                handle_autos = false;
        }
 
        // Restart the timer.
-       step_timer_.start(25, true);
+       step_timer_.setSingleShot(true);
+       step_timer_.start(25);
 }
 
 
@@ -423,42 +412,20 @@ void GuiWorkArea::mouseDoubleClickEvent(QMouseEvent * e)
        FuncRequest cmd(LFUN_MOUSE_DOUBLE,
                dc_event_.x, dc_event_.y,
                q_button_state(dc_event_.state));
-       buffer_view_->workAreaDispatch(cmd);
+       dispatch(cmd);
 }
 
 
 void GuiWorkArea::resizeEvent(QResizeEvent *)
 {
-       workWidth_ = viewport()->width();
-       workHeight_ = viewport()->height();
-
        verticalScrollBar()->setPageStep(viewport()->height());
-
-//     screen_device_ = QPixmap(viewport()->width(), viewport()->height());
-//     paint_device_ = QImage(viewport()->width(), viewport()->height(), QImage::Format_RGB32);
        paint_device_ = QPixmap(viewport()->width(), viewport()->height());
-
-       buffer_view_->workAreaResize(viewport()->width(), viewport()->height());
-
-       /*
-       lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION
-               << "\n QWidget width\t" << this->QWidget::width()
-               << "\n QWidget height\t" << this->QWidget::height()
-               << "\n viewport width\t" << viewport()->width()
-               << "\n viewport height\t" << viewport()->height()
-               << "\n QResizeEvent rect left\t" << rect().left()
-               << "\n QResizeEvent rect right\t" << rect().right()
-               << endl;
-               */
+       resizeBufferView();
 }
 
 
 void GuiWorkArea::update(int x, int y, int w, int h)
 {
-       //screen_device_.fromImage(paint_device_);
-       //QPainter q(&screen_device_);
-       //q.drawImage(x, y, paint_device_.copy(x, y, w, h));
-
        viewport()->update(x, y, w, h);
 }
 
@@ -479,6 +446,7 @@ void GuiWorkArea::paintEvent(QPaintEvent * e)
                << "\n QPaintEvent h\t" << e->rect().height()
                << endl;
        */
+
        QPainter q(viewport());
        q.drawPixmap(e->rect(), paint_device_, e->rect());
 
@@ -487,15 +455,6 @@ void GuiWorkArea::paintEvent(QPaintEvent * e)
 
        if (show_hcursor_)
                q.drawPixmap(cursor_x_, cursor_y_ + cursor_h_ - 1, hcursor_);
-
-       buffer_view_->updateScrollbar();
-
-       ScrollbarParameters const & scroll_ = buffer_view_->scrollbarParameters();
-
-       verticalScrollBar()->setTracking(false);
-       setScrollbarParams(scroll_.height, scroll_.position,
-               scroll_.lineScrollHeight);
-       verticalScrollBar()->setTracking(true);
 }
 
 
@@ -533,7 +492,7 @@ void GuiWorkArea::showCursor(int x, int y, int h, CursorShape shape)
 
        show_vcursor_ = true;
 
-       QColor const & required_color = lcolorcache.get(LColor::cursor);
+       QColor const & required_color = guiApp->colorCache().get(LColor::cursor);
 
        if (x==cursor_x_ && y==cursor_y_ && h==cursor_h_
                && cursor_color_ == required_color
@@ -601,8 +560,8 @@ void GuiWorkArea::inputMethodEvent(QInputMethodEvent * e)
        if (!text.isEmpty()) {
 
                lyxerr[Debug::KEY] << BOOST_CURRENT_FUNCTION
-                       << " preeditString =" << (const char *) e->preeditString()
-                       << " commitString  =" << (const char *) e->commitString()
+                       << " preeditString =" << fromqstr(e->preeditString())
+                       << " commitString  =" << fromqstr(e->commitString())
                        << endl;
 
                int key = 0;
@@ -610,13 +569,29 @@ void GuiWorkArea::inputMethodEvent(QInputMethodEvent * e)
                // ideally, such special coding should not be necessary
                if (text == "^")
                        key = Qt::Key_AsciiCircum;
-               QKeyEvent ev(QEvent::KeyPress, key, *text.ascii(), 0, text);
+               // FIXME: Needs for investigation, this key is not really used,
+               // the ctor below just check if key is different from 0.
+               QKeyEvent ev(QEvent::KeyPress, key,
+                       Qt::NoModifier, text);
                keyPressEvent(&ev);
        }
        e->accept();
 }
 
 
+void GuiWorkArea::focusInEvent(QFocusEvent * ev)
+{
+       QAbstractScrollArea::focusInEvent(ev);
+       lyx_view_.updateToolbars();
+}
+
+
+void GuiWorkArea::focusOutEvent(QFocusEvent * ev)
+{
+       QAbstractScrollArea::focusOutEvent(ev);
+       lyx_view_.updateToolbars();
+}
+
 } // namespace frontend
 } // namespace lyx