]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiWorkArea.h
Fix the tab ordering of PanelStack and PrefsUi.
[lyx.git] / src / frontends / qt4 / GuiWorkArea.h
index 5a096d55743ce1cc30c50ee0696cac858c5a320a..173d3e298749823787cae5a800b3642ed735c482 100644 (file)
 
 #include "frontends/WorkArea.h"
 
+#include "DocIterator.h"
 #include "FuncRequest.h"
-#include "frontends/Timeout.h"
+#include "qt_helpers.h"
+#include "support/docstring.h"
+#include "support/Timeout.h"
 
 #include <QAbstractScrollArea>
 #include <QMouseEvent>
-#include <QResizeEvent>
-#include <QKeyEvent>
-#include <QTimer>
 #include <QPixmap>
+#include <QTabBar>
+#include <QTabWidget>
+#include <QTimer>
 
-#include <queue>
-
-class QWidget;
+class QContextMenuEvent;
 class QDragEnterEvent;
 class QDropEvent;
-class QWheelEvent;
+class QKeyEvent;
 class QPaintEvent;
+class QResizeEvent;
+class QToolButton;
+class QWheelEvent;
+class QWidget;
+
+#ifdef CursorShape
+#undef CursorShape
+#endif
 
 namespace lyx {
+
+class Buffer;
+
 namespace frontend {
 
+class GuiCompleter;
 class GuiView;
-class QLPainter;
+class GuiWorkArea;
 
 /// for emulating triple click
-class double_click {
+class DoubleClick {
+public:
+       ///
+       DoubleClick() : state(Qt::NoButton), active(false) {}
+       ///
+       DoubleClick(QMouseEvent * e) : state(e->button()), active(true) {}
+       ///
+       bool operator==(QMouseEvent const & e) { return state == e.button(); }
+       ///
 public:
+       ///
        Qt::MouseButton state;
+       ///
        bool active;
-
-       bool operator==(QMouseEvent const & e) {
-               return state == e.button();
-       }
-
-       double_click()
-               : state(Qt::NoButton), active(false) {}
-
-       double_click(QMouseEvent * e)
-               : state(e->button()), active(true) {}
 };
 
 /** Qt only emits mouse events when the mouse is being moved, but
@@ -72,54 +85,115 @@ public:
        FuncRequest cmd;
        Timeout timeout;
        bool restart_timeout;
-       int x_old;
-       int y_old;
-       double scrollbar_value_old;
 };
 
+
 /**
- * Qt-specific implementation of the work area
- * (buffer view GUI)
+ * Implementation of the work area (buffer view GUI)
 */
-       class CursorWidget;
+class CursorWidget;
+
 class GuiWorkArea : public QAbstractScrollArea, public WorkArea
 {
        Q_OBJECT
 
 public:
        ///
-       GuiWorkArea(int width, int height, int id, LyXView & lyx_view);
+       GuiWorkArea(QWidget *);
+       ///
+       GuiWorkArea(Buffer & buffer, GuiView & gv);
+       ///
+       ~GuiWorkArea();
 
        ///
-       bool hasFocus() const { return QAbstractScrollArea::hasFocus(); }
+       void init();
+       ///
+       void setBuffer(Buffer &);
+       ///
+       void setGuiView(GuiView &);
+       ///
+       void setFullScreen(bool full_screen);
+       /// is GuiView in fullscreen mode?
+       bool isFullScreen();
+       ///
+       void scheduleRedraw() { schedule_redraw_ = true; }
+       ///
+       BufferView & bufferView();
+       ///
+       BufferView const & bufferView() const;
+       ///
+       void redraw(bool update_metrics);
+       ///
+       void stopBlinkingCursor();
+       ///
+       void startBlinkingCursor();
+       /// Process Key pressed event.
+       /// This needs to be public because it is accessed externally by GuiView.
+       void processKeySym(KeySymbol const & key, KeyModifier mod);
+       ///
+       void resizeBufferView();
+
+       bool inDialogMode() const { return dialog_mode_; }
+       void setDialogMode(bool mode) { dialog_mode_ = mode; }
 
-       /// return the width of the content pane
-       virtual int width() const { return viewport()->width(); }
-       /// return the height of the content pane
-       virtual int height() const { return viewport()->height(); }
        ///
-       virtual void setScrollbarParams(int height, int pos, int line_height);
+       GuiCompleter & completer() { return *completer_; }
+
+       Qt::CursorShape cursorShape() const;
+       void setCursorShape(Qt::CursorShape shape);
+
+       /// Change the cursor when the mouse hovers over a clickable inset
+       void updateCursorShape();
+
+       /// Return the GuiView this workArea belongs to
+       GuiView const & view() const { return *lyx_view_; }
+       GuiView & view() { return *lyx_view_; }
+
+Q_SIGNALS:
        ///
-       virtual void scheduleRedraw() { schedule_redraw_ = true; }
+       void titleChanged(GuiWorkArea *);
+
+private Q_SLOTS:
+       /// Scroll the BufferView.
+       /**
+         * This is a slot for the valueChanged() signal of the vertical scrollbar.
+         * \p value value of the scrollbar.
+       */
+       void scrollTo(int value);
+       /// timer to limit triple clicks
+       void doubleClickTimeout();
+       /// toggle the cursor's visibility
+       void toggleCursor();
+       /// close this work area.
+       /// Slot for Buffer::closing signal.
+       void close();
+       /// Slot to restore proper scrollbar behaviour.
+       void fixVerticalScrollBar();
+
+private:
+       friend class GuiCompleter;
 
        /// update the passed area.
        void update(int x, int y, int w, int h);
-
-       /// copies specified area of pixmap to screen
-       virtual void expose(int x, int y, int exp_width, int exp_height);
+       ///
+       void updateScreen();
 
        /// paint the cursor and store the background
-       virtual void showCursor(int x, int y, int h, CursorShape shape);
+       virtual void showCursor(int x, int y, int h,
+               bool l_shape, bool rtl, bool completable);
 
        /// hide the cursor
        virtual void removeCursor();
 
-private:
-       void doGreyOut(QLPainter & pain);
+       /// This function should be called to update the buffer readonly status.
+       void setReadOnly(bool);
+
+       /// Update window titles of all users.
+       void updateWindowTitle();
        ///
-       void dragEnterEvent(QDragEnterEvent * ev);
+       bool event(QEvent *);
        ///
-       void dropEvent(QDropEvent * ev);
+       void contextMenuEvent(QContextMenuEvent *);
        ///
        void focusInEvent(QFocusEvent *);
        ///
@@ -145,31 +219,36 @@ private:
        /// IM query
        QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
 
-public Q_SLOTS:
-       /// Adjust the LyX buffer view with the position of the scrollbar.
-       /**
-       * The action argument is not used in the the code, it is there
-       * only for the connection to the vertical srollbar signal which
-       * emits an 'int' action.
-       */
-       void adjustViewWithScrollBar(int action = 0);
-       /// timer to limit triple clicks
-       void doubleClickTimeout();
-
-private:
        /// The slot connected to SyntheticMouseEvent::timeout.
        void generateSyntheticMouseEvent();
+       ///
+       void dispatch(FuncRequest const & cmd0, KeyModifier = NoModifier);
+       /// hide the visible cursor, if it is visible
+       void hideCursor();
+       /// show the cursor if it is not visible
+       void showCursor();
+       ///
+       void updateScrollbar();
 
+       ///
+       BufferView * buffer_view_;
+       /// Read only Buffer status cache.
+       bool read_only_;
+       ///
+       GuiView * lyx_view_;
+       /// is the cursor currently displayed
+       bool cursor_visible_;
+
+       ///
+       QTimer cursor_timeout_;
        ///
        SyntheticMouseEvent synthetic_mouse_event_;
        ///
-       double_click dc_event_;
+       DoubleClick dc_event_;
 
        ///
        CursorWidget * cursor_;
        ///
-       void updateScreen();
-       ///
        QPixmap screen_;
        ///
        bool need_resize_;
@@ -177,6 +256,132 @@ private:
        bool schedule_redraw_;
        ///
        int preedit_lines_;
+
+       ///
+       GuiCompleter * completer_;
+
+       /// Special mode in which Esc and Enter (with or without Shift)
+       /// are ignored
+       bool dialog_mode_;
+       /// store the name of the context menu when the mouse is
+       /// pressed. This is used to get the correct context menu 
+       /// when the menu is actually shown (after releasing on Windows)
+       /// and after the DEPM has done its job.
+       docstring context_menu_name_;
+}; // GuiWorkArea
+
+
+class EmbeddedWorkArea : public GuiWorkArea
+{
+       Q_OBJECT
+public:
+       ///
+       EmbeddedWorkArea(QWidget *);
+       ~EmbeddedWorkArea();
+
+       /// Dummy methods for Designer.
+       void setWidgetResizable(bool) {}
+       void setWidget(QWidget *) {}
+
+       QSize sizeHint () const;
+       ///
+       void disable();
+
+protected:
+       ///
+       void closeEvent(QCloseEvent * ev);
+       ///
+       void hideEvent(QHideEvent *ev);
+
+private:
+       /// Embedded Buffer.
+       Buffer * buffer_;
+}; // EmbeddedWorkArea
+
+
+/// A tabbed set of GuiWorkAreas.
+class TabWorkArea : public QTabWidget
+{
+       Q_OBJECT
+public:
+       TabWorkArea(QWidget * parent = 0);
+
+       ///
+       void setFullScreen(bool full_screen);
+       void showBar(bool show);
+       void closeAll();
+       bool setCurrentWorkArea(GuiWorkArea *);
+       GuiWorkArea * addWorkArea(Buffer & buffer, GuiView & view);
+       bool removeWorkArea(GuiWorkArea *);
+       GuiWorkArea * currentWorkArea();
+       GuiWorkArea * workArea(Buffer & buffer);
+       GuiWorkArea * workArea(int index);
+
+Q_SIGNALS:
+       ///
+       void currentWorkAreaChanged(GuiWorkArea *);
+       ///
+       void lastWorkAreaRemoved();
+
+public Q_SLOTS:
+       /// close current buffer, or the one given by \c clicked_tab_
+       void closeCurrentBuffer();
+       /// hide current tab, or the one given by \c clicked_tab_
+       void hideCurrentTab();
+       /// close the tab given by \c index
+       void closeTab(int index);
+       ///
+       void updateTabTexts();
+       
+private Q_SLOTS:
+       ///
+       void on_currentTabChanged(int index);
+       ///
+       void showContextMenu(const QPoint & pos);
+       ///
+       void moveTab(int fromIndex, int toIndex);
+       ///
+       void mouseDoubleClickEvent(QMouseEvent * event);
+
+private:
+       ///
+       int clicked_tab_;
+       ///
+       QToolButton * closeBufferButton;
+}; // TabWorkArea
+
+
+class DragTabBar : public QTabBar
+{
+       Q_OBJECT
+public:
+       ///
+       DragTabBar(QWidget * parent = 0);
+
+#if QT_VERSION < 0x040300
+       ///
+       int tabAt(QPoint const & position) const;
+#endif
+
+protected:
+       ///
+       void mousePressEvent(QMouseEvent * event);
+       ///
+       void mouseMoveEvent(QMouseEvent * event);
+       ///
+       void dragEnterEvent(QDragEnterEvent * event);
+       ///
+       void dropEvent(QDropEvent * event);
+
+private:
+       ///
+       QPoint dragStartPos_;
+       ///
+       int dragCurrentIndex_;
+
+Q_SIGNALS:
+       ///
+       void tabMoveRequested(int fromIndex, int toIndex);
 };
 
 } // namespace frontend