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 "DocIterator.h"
19 #include "FuncRequest.h"
20 #include "qt_helpers.h"
21 #include "support/docstring.h"
22 #include "support/Timeout.h"
24 #include <QAbstractScrollArea>
25 #include <QMouseEvent>
27 #include <QResizeEvent>
32 class QContextMenuEvent;
33 class QDragEnterEvent;
54 /// for emulating triple click
58 DoubleClick() : state(Qt::NoButton), active(false) {}
60 DoubleClick(QMouseEvent * e) : state(e->button()), active(true) {}
62 bool operator==(QMouseEvent const & e) { return state == e.button(); }
66 Qt::MouseButton state;
71 /** Qt only emits mouse events when the mouse is being moved, but
72 * we want to generate 'pseudo' mouse events when the mouse button is
73 * pressed and the mouse cursor is below the bottom, or above the top
74 * of the work area. In this way, we'll be able to continue scrolling
75 * (and selecting) the text.
77 * This class stores all the parameters needed to make this happen.
79 class SyntheticMouseEvent
82 SyntheticMouseEvent();
89 double scrollbar_value_old;
94 * Implementation of the work area (buffer view GUI)
98 class GuiWorkArea : public QAbstractScrollArea, public WorkArea
104 GuiWorkArea(Buffer & buffer, GuiView & lv);
109 void setFullScreen(bool full_screen);
110 /// is LyXView in fullscreen mode?
113 void scheduleRedraw() { schedule_redraw_ = true; }
115 BufferView & bufferView();
117 BufferView const & bufferView() const;
121 void stopBlinkingCursor();
123 void startBlinkingCursor();
124 /// Process Key pressed event.
125 /// This needs to be public because it is accessed externally by GuiView.
126 void processKeySym(KeySymbol const & key, KeyModifier mod);
128 void resizeBufferView();
131 GuiCompleter & completer() { return *completer_; }
135 void titleChanged(GuiWorkArea *);
138 /// Scroll the BufferView.
140 * This is a slot for the valueChanged() signal of the vertical scrollbar.
141 * \p value value of the scrollbar.
143 void scrollTo(int value);
144 /// timer to limit triple clicks
145 void doubleClickTimeout();
146 /// toggle the cursor's visibility
148 /// close this work area.
149 /// Slot for Buffer::closing signal.
151 /// Slot to restore proper scrollbar behaviour.
152 void fixVerticalScrollBar();
155 friend class GuiCompleter;
157 /// update the passed area.
158 void update(int x, int y, int w, int h);
162 /// paint the cursor and store the background
163 virtual void showCursor(int x, int y, int h,
164 bool l_shape, bool rtl, bool completable);
167 virtual void removeCursor();
169 /// This function is called when the buffer readonly status change.
170 void setReadOnly(bool);
172 /// Update window titles of all users.
173 void updateWindowTitle();
175 bool event(QEvent *);
177 void contextMenuEvent(QContextMenuEvent *);
179 void focusInEvent(QFocusEvent *);
181 void focusOutEvent(QFocusEvent *);
182 /// repaint part of the widget
183 void paintEvent(QPaintEvent * ev);
184 /// widget has been resized
185 void resizeEvent(QResizeEvent * ev);
186 /// mouse button press
187 void mousePressEvent(QMouseEvent * ev);
188 /// mouse button release
189 void mouseReleaseEvent(QMouseEvent * ev);
190 /// mouse double click of button
191 void mouseDoubleClickEvent(QMouseEvent * ev);
193 void mouseMoveEvent(QMouseEvent * ev);
195 void wheelEvent(QWheelEvent * ev);
197 void keyPressEvent(QKeyEvent * ev);
199 void inputMethodEvent(QInputMethodEvent * ev);
201 QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
203 /// The slot connected to SyntheticMouseEvent::timeout.
204 void generateSyntheticMouseEvent();
206 void dispatch(FuncRequest const & cmd0, KeyModifier = NoModifier);
207 /// hide the visible cursor, if it is visible
209 /// show the cursor if it is not visible
212 void updateScrollbar();
215 BufferView * buffer_view_;
218 /// is the cursor currently displayed
219 bool cursor_visible_;
222 QTimer cursor_timeout_;
224 SyntheticMouseEvent synthetic_mouse_event_;
226 DoubleClick dc_event_;
229 CursorWidget * cursor_;
235 bool schedule_redraw_;
240 GuiCompleter * completer_;
244 /// A tabbed set of GuiWorkAreas.
245 class TabWorkArea : public QTabWidget
249 TabWorkArea(QWidget * parent = 0);
252 void setFullScreen(bool full_screen);
253 void showBar(bool show);
255 bool setCurrentWorkArea(GuiWorkArea *);
256 GuiWorkArea * addWorkArea(Buffer & buffer, GuiView & view);
257 bool removeWorkArea(GuiWorkArea *);
258 GuiWorkArea * currentWorkArea();
259 GuiWorkArea * workArea(Buffer & buffer);
263 void currentWorkAreaChanged(GuiWorkArea *);
265 void lastWorkAreaRemoved();
268 /// close current buffer, or the one given by \c clicked_tab_
269 void closeCurrentBuffer();
270 /// close current tab, or the one given by \c clicked_tab_
271 void closeCurrentTab();
273 void updateTabTexts();
277 void on_currentTabChanged(int index);
279 void showContextMenu(const QPoint & pos);
281 void moveTab(int fromIndex, int toIndex);
288 class DragTabBar : public QTabBar
293 DragTabBar(QWidget * parent = 0);
295 #if QT_VERSION < 0x040300
297 int tabAt(QPoint const & position) const;
302 void mousePressEvent(QMouseEvent * event);
304 void mouseMoveEvent(QMouseEvent * event);
306 void dragEnterEvent(QDragEnterEvent * event);
308 void dropEvent(QDropEvent * event);
312 QPoint dragStartPos_;
314 int dragCurrentIndex_;
318 void tabMoveRequested(int fromIndex, int toIndex);
321 } // namespace frontend