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>
22 #include <QMouseEvent>
24 #include <QResizeEvent>
28 class QContextMenuEvent;
29 class QDragEnterEvent;
48 /// types of cursor in work area
52 /// L-shape for locked insets of a different language
54 /// reverse L-shape for RTL text
58 /// for emulating triple click
62 DoubleClick() : state(Qt::NoButton), active(false) {}
64 DoubleClick(QMouseEvent * e) : state(e->button()), active(true) {}
66 bool operator==(QMouseEvent const & e) { return state == e.button(); }
70 Qt::MouseButton state;
75 /** Qt only emits mouse events when the mouse is being moved, but
76 * we want to generate 'pseudo' mouse events when the mouse button is
77 * pressed and the mouse cursor is below the bottom, or above the top
78 * of the work area. In this way, we'll be able to continue scrolling
79 * (and selecting) the text.
81 * This class stores all the parameters needed to make this happen.
83 class SyntheticMouseEvent
86 SyntheticMouseEvent();
93 double scrollbar_value_old;
98 * Implementation of the work area (buffer view GUI)
102 class GuiWorkArea : public QAbstractScrollArea, public WorkArea
108 GuiWorkArea(Buffer & buffer, GuiView & lv);
113 void scheduleRedraw() { schedule_redraw_ = true; }
115 BufferView & bufferView();
117 BufferView const & bufferView() const;
121 void stopBlinkingCursor();
123 void startBlinkingCursor();
125 void startGeneralTimer() { general_timer_.start(); }
127 void stopGeneralTimer() { general_timer_.stop(); }
128 /// Process Key pressed event.
129 /// This needs to be public because it is accessed externally by GuiView.
130 void processKeySym(KeySymbol const & key, KeyModifier mod);
132 void resizeBufferView();
136 void titleChanged(GuiWorkArea *);
139 /// Scroll the BufferView.
141 * This is a slot for the valueChanged() signal of the vertical scrollbar.
142 * \p value value of the scrollbar.
144 void scrollTo(int value);
145 /// timer to limit triple clicks
146 void doubleClickTimeout();
147 /// toggle the cursor's visibility
149 /// events to be triggered by general_timer_ should go here
150 void handleRegularEvents();
151 /// close this work area.
152 /// Slot for Buffer::closing signal.
156 /// update the passed area.
157 void update(int x, int y, int w, int h);
161 /// paint the cursor and store the background
162 virtual void showCursor(int x, int y, int h, CursorShape shape);
165 virtual void removeCursor();
167 /// This function is called when the buffer readonly status change.
168 void setReadOnly(bool);
170 /// Update window titles of all users.
171 void updateWindowTitle();
173 bool event(QEvent *);
175 void contextMenuEvent(QContextMenuEvent *);
177 void focusInEvent(QFocusEvent *);
179 void focusOutEvent(QFocusEvent *);
180 /// repaint part of the widget
181 void paintEvent(QPaintEvent * ev);
182 /// widget has been resized
183 void resizeEvent(QResizeEvent * ev);
184 /// mouse button press
185 void mousePressEvent(QMouseEvent * ev);
186 /// mouse button release
187 void mouseReleaseEvent(QMouseEvent * ev);
188 /// mouse double click of button
189 void mouseDoubleClickEvent(QMouseEvent * ev);
191 void mouseMoveEvent(QMouseEvent * ev);
193 void wheelEvent(QWheelEvent * ev);
195 void keyPressEvent(QKeyEvent * ev);
197 void inputMethodEvent(QInputMethodEvent * ev);
199 QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
201 /// The slot connected to SyntheticMouseEvent::timeout.
202 void generateSyntheticMouseEvent();
204 void dispatch(FuncRequest const & cmd0, KeyModifier = NoModifier);
205 /// hide the visible cursor, if it is visible
207 /// show the cursor if it is not visible
210 void updateScrollbar();
213 BufferView * buffer_view_;
216 /// is the cursor currently displayed
217 bool cursor_visible_;
220 QTimer cursor_timeout_;
221 /// this timer is used for any regular events one wants to
222 /// perform. at present it is used to check if forked processes
224 QTimer general_timer_;
226 SyntheticMouseEvent synthetic_mouse_event_;
228 DoubleClick dc_event_;
231 CursorWidget * cursor_;
237 bool schedule_redraw_;
243 /// A tabbed set of GuiWorkAreas.
244 class TabWorkArea : public QTabWidget
248 TabWorkArea(QWidget * parent = 0);
250 void showBar(bool show);
252 bool setCurrentWorkArea(GuiWorkArea *);
253 GuiWorkArea * addWorkArea(Buffer & buffer, GuiView & view);
254 bool removeWorkArea(GuiWorkArea *);
255 GuiWorkArea * currentWorkArea();
256 GuiWorkArea * workArea(Buffer & buffer);
260 void currentWorkAreaChanged(GuiWorkArea *);
264 void on_currentTabChanged(int index);
266 void closeCurrentTab();
268 void updateTabText(GuiWorkArea *);
271 } // namespace frontend