4 * This file is part of LyX, the document processor.
5 * Licence details can be found in the file COPYING.
8 * \author Abdelrazak Younes
10 * Full author contact details are available in file CREDITS.
16 #include "frontends/WorkArea.h"
18 #include "FuncRequest.h"
19 #include "support/Timeout.h"
21 #include <QAbstractScrollArea>
23 #include <QMouseEvent>
25 #include <QResizeEvent>
32 class QDragEnterEvent;
40 /// for emulating triple click
43 Qt::MouseButton state;
46 bool operator==(QMouseEvent const & e) {
47 return state == e.button();
51 : state(Qt::NoButton), active(false) {}
53 double_click(QMouseEvent * e)
54 : state(e->button()), active(true) {}
57 /** Qt only emits mouse events when the mouse is being moved, but
58 * we want to generate 'pseudo' mouse events when the mouse button is
59 * pressed and the mouse cursor is below the bottom, or above the top
60 * of the work area. In this way, we'll be able to continue scrolling
61 * (and selecting) the text.
63 * This class stores all the parameters needed to make this happen.
65 class SyntheticMouseEvent
68 SyntheticMouseEvent();
75 double scrollbar_value_old;
79 * Qt-specific implementation of the work area
83 class GuiWorkArea : public QAbstractScrollArea, public WorkArea
89 GuiWorkArea(Buffer & buffer, LyXView & lv);
92 bool hasFocus() const { return QAbstractScrollArea::hasFocus(); }
93 bool isVisible() const { return QAbstractScrollArea::isVisible(); }
95 /// return the width of the content pane
96 virtual int width() const { return viewport()->width(); }
97 /// return the height of the content pane
98 virtual int height() const { return viewport()->height(); }
100 virtual void setScrollbarParams(int height, int pos, int line_height);
102 virtual void scheduleRedraw() { schedule_redraw_ = true; }
104 /// update the passed area.
105 void update(int x, int y, int w, int h);
107 /// copies specified area of pixmap to screen
108 virtual void expose(int x, int y, int exp_width, int exp_height);
110 /// paint the cursor and store the background
111 virtual void showCursor(int x, int y, int h, CursorShape shape);
114 virtual void removeCursor();
118 void focusInEvent(QFocusEvent *);
120 void focusOutEvent(QFocusEvent *);
121 /// repaint part of the widget
122 void paintEvent(QPaintEvent * ev);
123 /// widget has been resized
124 void resizeEvent(QResizeEvent * ev);
125 /// mouse button press
126 void mousePressEvent(QMouseEvent * ev);
127 /// mouse button release
128 void mouseReleaseEvent(QMouseEvent * ev);
129 /// mouse double click of button
130 void mouseDoubleClickEvent(QMouseEvent * ev);
132 void mouseMoveEvent(QMouseEvent * ev);
134 void wheelEvent(QWheelEvent * ev);
136 void keyPressEvent(QKeyEvent * ev);
138 void inputMethodEvent(QInputMethodEvent * ev);
140 QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
143 /// Adjust the LyX buffer view with the position of the scrollbar.
145 * The action argument is not used in the the code, it is there
146 * only for the connection to the vertical srollbar signal which
147 * emits an 'int' action.
149 void adjustViewWithScrollBar(int action = 0);
150 /// timer to limit triple clicks
151 void doubleClickTimeout();
154 /// The slot connected to SyntheticMouseEvent::timeout.
155 void generateSyntheticMouseEvent();
158 SyntheticMouseEvent synthetic_mouse_event_;
160 double_click dc_event_;
163 CursorWidget * cursor_;
171 bool schedule_redraw_;
176 /// A tabbed set of GuiWorkAreas.
177 class TabWorkArea : public QTabWidget
181 TabWorkArea(QWidget * parent = 0);
182 void showBar(bool show);
183 bool setCurrentWorkArea(GuiWorkArea *);
184 bool removeWorkArea(GuiWorkArea *);
188 void currentWorkAreaChanged(GuiWorkArea *);
192 void on_currentTabChanged(int index);
194 void closeCurrentTab();
197 } // namespace frontend