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;
44 /// for emulating triple click
47 Qt::MouseButton state;
50 bool operator==(QMouseEvent const & e) {
51 return state == e.button();
55 : state(Qt::NoButton), active(false) {}
57 double_click(QMouseEvent * e)
58 : state(e->button()), active(true) {}
61 /** Qt only emits mouse events when the mouse is being moved, but
62 * we want to generate 'pseudo' mouse events when the mouse button is
63 * pressed and the mouse cursor is below the bottom, or above the top
64 * of the work area. In this way, we'll be able to continue scrolling
65 * (and selecting) the text.
67 * This class stores all the parameters needed to make this happen.
69 class SyntheticMouseEvent
72 SyntheticMouseEvent();
79 double scrollbar_value_old;
83 * Qt-specific implementation of the work area
87 class GuiWorkArea : public QAbstractScrollArea, public WorkArea
93 GuiWorkArea(Buffer & buffer, LyXView & lv);
96 bool hasFocus() const { return QAbstractScrollArea::hasFocus(); }
97 bool isVisible() const { return QAbstractScrollArea::isVisible(); }
99 /// return the width of the content pane
100 virtual int width() const { return viewport()->width(); }
101 /// return the height of the content pane
102 virtual int height() const { return viewport()->height(); }
104 virtual void setScrollbarParams(int height, int pos, int line_height);
106 virtual void scheduleRedraw() { schedule_redraw_ = true; }
108 /// update the passed area.
109 void update(int x, int y, int w, int h);
111 /// copies specified area of pixmap to screen
112 virtual void expose(int x, int y, int exp_width, int exp_height);
114 /// paint the cursor and store the background
115 virtual void showCursor(int x, int y, int h, CursorShape shape);
118 virtual void removeCursor();
120 void setWindowTitle(docstring const & t, docstring const & it);
124 void titleChanged(GuiWorkArea *);
128 void focusInEvent(QFocusEvent *);
130 void focusOutEvent(QFocusEvent *);
131 /// repaint part of the widget
132 void paintEvent(QPaintEvent * ev);
133 /// widget has been resized
134 void resizeEvent(QResizeEvent * ev);
135 /// mouse button press
136 void mousePressEvent(QMouseEvent * ev);
137 /// mouse button release
138 void mouseReleaseEvent(QMouseEvent * ev);
139 /// mouse double click of button
140 void mouseDoubleClickEvent(QMouseEvent * ev);
142 void mouseMoveEvent(QMouseEvent * ev);
144 void wheelEvent(QWheelEvent * ev);
146 void keyPressEvent(QKeyEvent * ev);
148 void inputMethodEvent(QInputMethodEvent * ev);
150 QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
153 /// Adjust the LyX buffer view with the position of the scrollbar.
155 * The action argument is not used in the the code, it is there
156 * only for the connection to the vertical srollbar signal which
157 * emits an 'int' action.
159 void adjustViewWithScrollBar(int action = 0);
160 /// timer to limit triple clicks
161 void doubleClickTimeout();
164 /// The slot connected to SyntheticMouseEvent::timeout.
165 void generateSyntheticMouseEvent();
168 SyntheticMouseEvent synthetic_mouse_event_;
170 double_click dc_event_;
173 CursorWidget * cursor_;
181 bool schedule_redraw_;
186 /// A tabbed set of GuiWorkAreas.
187 class TabWorkArea : public QTabWidget
191 TabWorkArea(QWidget * parent = 0);
193 void showBar(bool show);
195 bool setCurrentWorkArea(GuiWorkArea *);
196 bool removeWorkArea(GuiWorkArea *);
197 GuiWorkArea * currentWorkArea();
198 GuiWorkArea * workArea(Buffer & buffer);
202 void currentWorkAreaChanged(GuiWorkArea *);
206 void on_currentTabChanged(int index);
208 void closeCurrentTab();
210 void updateTabText(GuiWorkArea *);
213 } // namespace frontend