]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiWorkArea.h
Make a string translatable
[lyx.git] / src / frontends / qt4 / GuiWorkArea.h
index 173d3e298749823787cae5a800b3642ed735c482..b22d2a5662924b1127bfce769c6c695bd9bb0f36 100644 (file)
 #ifndef WORKAREA_H
 #define WORKAREA_H
 
-#include "frontends/WorkArea.h"
+#include "ui_WorkAreaUi.h"
 
-#include "DocIterator.h"
-#include "FuncRequest.h"
-#include "qt_helpers.h"
-#include "support/docstring.h"
-#include "support/Timeout.h"
+#include "frontends/WorkArea.h"
 
 #include <QAbstractScrollArea>
-#include <QMouseEvent>
-#include <QPixmap>
 #include <QTabBar>
 #include <QTabWidget>
-#include <QTimer>
 
-class QContextMenuEvent;
 class QDragEnterEvent;
 class QDropEvent;
-class QKeyEvent;
-class QPaintEvent;
-class QResizeEvent;
 class QToolButton;
-class QWheelEvent;
 class QWidget;
 
 #ifdef CursorShape
@@ -45,53 +33,12 @@ class QWidget;
 namespace lyx {
 
 class Buffer;
+class FuncRequest;
 
 namespace frontend {
 
 class GuiCompleter;
 class GuiView;
-class GuiWorkArea;
-
-/// for emulating triple 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;
-};
-
-/** Qt only emits mouse events when the mouse is being moved, but
- *  we want to generate 'pseudo' mouse events when the mouse button is
- *  pressed and the mouse cursor is below the bottom, or above the top
- *  of the work area. In this way, we'll be able to continue scrolling
- *  (and selecting) the text.
- *
- *  This class stores all the parameters needed to make this happen.
- */
-class SyntheticMouseEvent
-{
-public:
-       SyntheticMouseEvent();
-
-       FuncRequest cmd;
-       Timeout timeout;
-       bool restart_timeout;
-};
-
-
-/**
- * Implementation of the work area (buffer view GUI)
-*/
-class CursorWidget;
 
 class GuiWorkArea : public QAbstractScrollArea, public WorkArea
 {
@@ -114,44 +61,50 @@ public:
        ///
        void setFullScreen(bool full_screen);
        /// is GuiView in fullscreen mode?
-       bool isFullScreen();
+       bool isFullScreen() const;
        ///
-       void scheduleRedraw() { schedule_redraw_ = true; }
+       void scheduleRedraw();
        ///
        BufferView & bufferView();
        ///
        BufferView const & bufferView() const;
        ///
        void redraw(bool update_metrics);
-       ///
-       void stopBlinkingCursor();
-       ///
-       void startBlinkingCursor();
+
+       /// return true if the key is part of a shortcut
+       bool queryKeySym(KeySymbol const & key, KeyModifier mod) const;
        /// 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; }
+       bool inDialogMode() const;
+       void setDialogMode(bool mode);
 
        ///
-       GuiCompleter & completer() { return *completer_; }
+       GuiCompleter & 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_; }
+       GuiView const & view() const;
+       GuiView & view();
+
+       /// Current ratio between physical pixels and device-independent pixels
+       double pixelRatio() const;
+
+public Q_SLOTS:
+       ///
+       void stopBlinkingCursor();
+       ///
+       void startBlinkingCursor();
 
 Q_SIGNALS:
        ///
        void titleChanged(GuiWorkArea *);
+       ///
+       void busy(bool);
+       ///
+       void bufferViewChanged();
 
 private Q_SLOTS:
        /// Scroll the BufferView.
@@ -171,23 +124,6 @@ private Q_SLOTS:
        void fixVerticalScrollBar();
 
 private:
-       friend class GuiCompleter;
-
-       /// update the passed area.
-       void update(int x, int y, int w, int h);
-       ///
-       void updateScreen();
-
-       /// paint the cursor and store the background
-       virtual void showCursor(int x, int y, int h,
-               bool l_shape, bool rtl, bool completable);
-
-       /// hide the cursor
-       virtual void removeCursor();
-
-       /// This function should be called to update the buffer readonly status.
-       void setReadOnly(bool);
-
        /// Update window titles of all users.
        void updateWindowTitle();
        ///
@@ -212,7 +148,8 @@ private:
        void mouseMoveEvent(QMouseEvent * ev);
        /// wheel event
        void wheelEvent(QWheelEvent * ev);
-       /// key press
+       /// key press event. It also knows how to handle ShortcutOverride events to
+       /// avoid code duplication.
        void keyPressEvent(QKeyEvent * ev);
        /// IM events
        void inputMethodEvent(QInputMethodEvent * ev);
@@ -221,53 +158,10 @@ 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_;
-       ///
-       DoubleClick dc_event_;
 
-       ///
-       CursorWidget * cursor_;
-       ///
-       QPixmap screen_;
-       ///
-       bool need_resize_;
-       ///
-       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_;
+       friend class GuiCompleter;
+       struct Private;
+       Private * const d;
 }; // GuiWorkArea
 
 
@@ -299,6 +193,8 @@ private:
 }; // EmbeddedWorkArea
 
 
+class GuiWorkAreaContainer;
+
 /// A tabbed set of GuiWorkAreas.
 class TabWorkArea : public QTabWidget
 {
@@ -306,6 +202,10 @@ class TabWorkArea : public QTabWidget
 public:
        TabWorkArea(QWidget * parent = 0);
 
+       /// hide QTabWidget methods
+       GuiWorkAreaContainer * currentWidget() const;
+       GuiWorkAreaContainer * widget(int index) const;
+
        ///
        void setFullScreen(bool full_screen);
        void showBar(bool show);
@@ -313,9 +213,10 @@ public:
        bool setCurrentWorkArea(GuiWorkArea *);
        GuiWorkArea * addWorkArea(Buffer & buffer, GuiView & view);
        bool removeWorkArea(GuiWorkArea *);
-       GuiWorkArea * currentWorkArea();
-       GuiWorkArea * workArea(Buffer & buffer);
-       GuiWorkArea * workArea(int index);
+       GuiWorkArea * currentWorkArea() const;
+       GuiWorkArea * workArea(Buffer & buffer) const;
+       GuiWorkArea * workArea(int index) const;
+       void paintEvent(QPaintEvent *);
 
 Q_SIGNALS:
        ///
@@ -331,22 +232,34 @@ public Q_SLOTS:
        /// close the tab given by \c index
        void closeTab(int index);
        ///
+       void moveTab(int fromIndex, int toIndex);
+       ///
        void updateTabTexts();
-       
+
 private Q_SLOTS:
        ///
        void on_currentTabChanged(int index);
        ///
        void showContextMenu(const QPoint & pos);
-       ///
-       void moveTab(int fromIndex, int toIndex);
+       /// enable closing tab on middle-click
+       void mousePressEvent(QMouseEvent * me);
+       void mouseReleaseEvent(QMouseEvent * me);
        ///
        void mouseDoubleClickEvent(QMouseEvent * event);
+       ///
+       int indexOfWorkArea(GuiWorkArea * w) const;
 
 private:
-       ///
+       using QTabWidget::addTab;
+       using QTabWidget::insertTab;
+
+       /// true if position is a tab (rather than the blank space in tab bar)
+       bool posIsTab(QPoint position);
+
        int clicked_tab_;
        ///
+       int midpressed_tab_;
+       ///
        QToolButton * closeBufferButton;
 }; // TabWorkArea
 
@@ -358,11 +271,6 @@ public:
        ///
        DragTabBar(QWidget * parent = 0);
 
-#if QT_VERSION < 0x040300
-       ///
-       int tabAt(QPoint const & position) const;
-#endif
-
 protected:
        ///
        void mousePressEvent(QMouseEvent * event);
@@ -376,14 +284,37 @@ protected:
 private:
        ///
        QPoint dragStartPos_;
-       ///
-       int dragCurrentIndex_;
 
 Q_SIGNALS:
        ///
        void tabMoveRequested(int fromIndex, int toIndex);
 };
 
+
+class GuiWorkAreaContainer : public QWidget, public Ui::WorkAreaUi
+{
+       Q_OBJECT
+       // non-null
+       GuiWorkArea * const wa_;
+       void dispatch(FuncRequest f) const;
+
+private Q_SLOTS:
+       void updateDisplay();
+       void reload() const;
+       void ignore() const;
+
+protected:
+       void mouseDoubleClickEvent(QMouseEvent * event); //override
+
+public:
+       /// wa != 0
+       GuiWorkAreaContainer(GuiWorkArea * wa, QWidget * parent = 0);
+       /// non-null
+       GuiWorkArea * workArea() const { return wa_; }
+};
+
+
+
 } // namespace frontend
 } // namespace lyx