00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef _KATE_VIEW_INTERNAL_
00027 #define _KATE_VIEW_INTERNAL_
00028
00029 #include <ktexteditor/attribute.h>
00030 #include <ktexteditor/rangefeedback.h>
00031
00032 #include "katesmartcursor.h"
00033 #include "katelinelayout.h"
00034 #include "katetextline.h"
00035 #include "katedocument.h"
00036 #include "kateview.h"
00037
00038 #include <QtCore/QPoint>
00039 #include <QtCore/QTimer>
00040 #include <QtGui/QDrag>
00041 #include <QtGui/QWidget>
00042 #include <QtCore/QSet>
00043 #include <QtCore/QPointer>
00044
00045 class KateIconBorder;
00046 class KateScrollBar;
00047 class KateSmartRange;
00048 class KateTextLayout;
00049
00050 class KateViInputModeManager;
00051
00052 class QScrollBar;
00053
00054 class KateViewInternal : public QWidget, private KTextEditor::SmartRangeWatcher
00055 {
00056 Q_OBJECT
00057
00058 friend class KateView;
00059 friend class KateIconBorder;
00060 friend class KateScrollBar;
00061 friend class CalculatingCursor;
00062 friend class BoundedCursor;
00063 friend class WrappingCursor;
00064 friend class KateViModeBase;
00065
00066 public:
00067 enum Bias
00068 {
00069 left = -1,
00070 none = 0,
00071 right = 1
00072 };
00073
00074 public:
00075 KateViewInternal ( KateView *view, KateDocument *doc );
00076 ~KateViewInternal ();
00077
00078
00079 public:
00080 void editStart ();
00081 void editEnd (int editTagLineStart, int editTagLineEnd, bool tagFrom);
00082
00083 void editSetCursor (const KTextEditor::Cursor &cursor);
00084
00085 private:
00086 uint editSessionNumber;
00087 bool editIsRunning;
00088 KTextEditor::Cursor editOldCursor;
00089
00090
00091
00092 public:
00093 bool tagLine (const KTextEditor::Cursor& virtualCursor);
00094
00095 bool tagLines (int start, int end, bool realLines = false);
00096
00097 bool tagLines (KTextEditor::Cursor start, KTextEditor::Cursor end, bool realCursors = false);
00098
00099 bool tagRange(const KTextEditor::Range& range, bool realCursors);
00100
00101 void tagAll ();
00102
00103 void relayoutRange(const KTextEditor::Range& range, bool realCursors = true);
00104
00105 void updateDirty();
00106
00107 void clear ();
00108
00109 Q_SIGNALS:
00110
00111
00112 void requestViewUpdateIfSmartDirty();
00113
00114
00115 private Q_SLOTS:
00116
00117 void updateView (bool changed = false, int viewLinesScrolled = 0);
00118
00119 void updateViewIfSmartDirty();
00120
00121 private:
00122
00123 void doUpdateView(bool changed = false, int viewLinesScrolled = 0);
00124 void makeVisible (const KTextEditor::Cursor& c, int endCol, bool force = false, bool center = false, bool calledExternally = false);
00125
00126 public:
00127
00128 inline const KTextEditor::Cursor& startPos() const { return m_startPos; }
00129 inline int startLine () const { return m_startPos.line(); }
00130 inline int startX () const { return m_startX; }
00131
00132 KTextEditor::Cursor endPos () const;
00133 int endLine () const;
00134
00135 KateTextLayout yToKateTextLayout(int y) const;
00136
00137 void prepareForDynWrapChange();
00138 void dynWrapChanged();
00139
00140 KateView *view () { return m_view; }
00141
00142 public Q_SLOTS:
00143 void slotIncFontSizes();
00144 void slotDecFontSizes();
00145
00146 private Q_SLOTS:
00147 void scrollLines(int line);
00148 void scrollViewLines(int offset);
00149 void scrollAction(int action);
00150 void scrollNextPage();
00151 void scrollPrevPage();
00152 void scrollPrevLine();
00153 void scrollNextLine();
00154 void scrollColumns (int x);
00155 void viewSelectionChanged ();
00156
00157 public:
00158 void doReturn();
00159 void doSmartNewline();
00160 void doDelete();
00161 void doBackspace();
00162 void doTranspose();
00163 void doDeleteWordLeft();
00164 void doDeleteWordRight();
00165
00166 void cursorLeft(bool sel=false);
00167 void cursorRight(bool sel=false);
00168 void wordLeft(bool sel=false);
00169 void wordRight(bool sel=false);
00170 void home(bool sel=false);
00171 void end(bool sel=false);
00172 void cursorUp(bool sel=false);
00173 void cursorDown(bool sel=false);
00174 void cursorToMatchingBracket(bool sel=false);
00175 void scrollUp();
00176 void scrollDown();
00177 void topOfView(bool sel=false);
00178 void bottomOfView(bool sel=false);
00179 void pageUp(bool sel=false);
00180 void pageDown(bool sel=false);
00181 void top(bool sel=false);
00182 void bottom(bool sel=false);
00183 void top_home(bool sel=false);
00184 void bottom_end(bool sel=false);
00185
00186 KTextEditor::Cursor getCursor() const;
00187 QPoint cursorToCoordinate(const KTextEditor::Cursor& cursor, bool realCursor = true, bool includeBorder = true) const;
00188
00189 KTextEditor::Cursor coordinatesToCursor(const QPoint& coord) const;
00190 QPoint cursorCoordinates(bool includeBorder = true) const;
00191 KTextEditor::Cursor findMatchingBracket();
00192
00193
00194 private:
00195 void fixDropEvent(QDropEvent *event);
00196 protected:
00197 virtual void hideEvent(QHideEvent* e);
00198 virtual void paintEvent(QPaintEvent *e);
00199 virtual bool eventFilter( QObject *obj, QEvent *e );
00200 virtual void keyPressEvent( QKeyEvent* );
00201 virtual void keyReleaseEvent( QKeyEvent* );
00202 virtual void resizeEvent( QResizeEvent* );
00203 virtual void mousePressEvent( QMouseEvent* );
00204 virtual void mouseDoubleClickEvent( QMouseEvent* );
00205 virtual void mouseReleaseEvent( QMouseEvent* );
00206 virtual void mouseMoveEvent( QMouseEvent* );
00207 virtual void leaveEvent( QEvent* );
00208 virtual void dragEnterEvent( QDragEnterEvent* );
00209 virtual void dragMoveEvent( QDragMoveEvent* );
00210 virtual void dropEvent( QDropEvent* );
00211 virtual void showEvent ( QShowEvent *);
00212 virtual void wheelEvent(QWheelEvent* e);
00213 virtual void focusInEvent (QFocusEvent *);
00214 virtual void focusOutEvent (QFocusEvent *);
00215 virtual void inputMethodEvent(QInputMethodEvent* e);
00216
00217 void contextMenuEvent ( QContextMenuEvent * e );
00218
00219 private Q_SLOTS:
00220 void tripleClickTimeout();
00221
00222 Q_SIGNALS:
00223
00224 void dropEventPass(QDropEvent*);
00225
00226 private Q_SLOTS:
00227 void slotRegionVisibilityChangedAt(unsigned int,bool clear_cache);
00228 void slotRegionBeginEndAddedRemoved(unsigned int);
00229 void slotCodeFoldingChanged();
00230
00231 private:
00232 void moveChar( Bias bias, bool sel );
00233 void moveEdge( Bias bias, bool sel );
00234 KTextEditor::Cursor maxStartPos(bool changed = false);
00235 void scrollPos(KTextEditor::Cursor& c, bool force = false, bool calledExternally = false);
00236 void scrollLines( int lines, bool sel );
00237
00238 int linesDisplayed() const;
00239
00240 int lineToY(int viewLine) const;
00241
00242 void updateSelection( const KTextEditor::Cursor&, bool keepSel );
00243
00244 void updateCursor( const KTextEditor::Cursor& newCursor, bool force = false, bool center = false, bool calledExternally = false );
00245 void updateBracketMarks();
00246
00247 void paintCursor();
00248
00249 void placeCursor( const QPoint& p, bool keepSelection = false, bool updateSelection = true );
00250 bool isTargetSelected( const QPoint& p );
00251
00252 bool rangeAffectsView(const KTextEditor::Range& range) const;
00253
00254 void doDrag();
00255
00256 inline KateView* view() const { return m_view; }
00257 KateRenderer* renderer() const;
00258
00259 KateView *m_view;
00260 KateDocument* m_doc;
00261 class KateIconBorder *m_leftBorder;
00262
00263 int m_mouseX;
00264 int m_mouseY;
00265 int m_scrollX;
00266 int m_scrollY;
00267
00268 Qt::CursorShape m_mouseCursor;
00269
00270 KateSmartCursor m_cursor;
00271 KTextEditor::Cursor m_mouse;
00272 KTextEditor::Cursor m_displayCursor;
00273
00274 bool m_possibleTripleClick;
00275
00276
00277 bool m_completionItemExpanded;
00278 QTime m_altDownTime;
00279
00280
00281 KateSmartRange *m_bm, *m_bmStart, *m_bmEnd;
00282 bool m_bmHighlighted;
00283 void updateBracketMarkAttributes();
00284
00285 enum DragState { diNone, diPending, diDragging };
00286
00287 struct _dragInfo {
00288 DragState state;
00289 QPoint start;
00290 QDrag* dragObject;
00291 } m_dragInfo;
00292
00293 uint m_iconBorderHeight;
00294
00295
00296
00297
00298 KateScrollBar *m_lineScroll;
00299 QWidget* m_dummy;
00300
00301
00302
00303 KateSmartCursor m_startPos;
00304
00305
00306 uint m_visibleLineCount;
00307
00308
00309
00310 bool m_madeVisible;
00311 bool m_shiftKeyPressed;
00312
00313
00314 void setAutoCenterLines(int viewLines, bool updateView = true);
00315 int m_autoCenterLines;
00316 int m_minLinesVisible;
00317
00318
00319
00320
00321 QScrollBar *m_columnScroll;
00322 int m_startX;
00323
00324
00325 bool m_selChangedByUser;
00326 KTextEditor::Cursor m_selectAnchor;
00327
00328 enum SelectionMode { Default=0, Mouse, Word, Line };
00329 uint m_selectionMode;
00330
00331
00332
00333 KTextEditor::Range m_selectionCached;
00334
00335
00336 int maxLen(int startLine);
00337
00338
00339 bool columnScrollingPossible ();
00340
00341
00342 int lineMaxCursorX(const KateTextLayout& line);
00343 int lineMaxCol(const KateTextLayout& line);
00344
00345 class KateLayoutCache* cache() const;
00346 KateLayoutCache* m_layoutCache;
00347
00348
00349 KateTextLayout currentLayout() const;
00350 KateTextLayout previousLayout() const;
00351 KateTextLayout nextLayout() const;
00352
00353
00354
00355
00356 KTextEditor::Cursor viewLineOffset(const KTextEditor::Cursor& virtualCursor, int offset, bool keepX = false);
00357
00358 KTextEditor::Cursor toRealCursor(const KTextEditor::Cursor& virtualCursor) const;
00359 KTextEditor::Cursor toVirtualCursor(const KTextEditor::Cursor& realCursor) const;
00360
00361
00362 bool m_preserveX;
00363 int m_preservedX;
00364
00365 bool m_updatingView;
00366 int m_wrapChangeViewLine;
00367 KTextEditor::Cursor m_cachedMaxStartPos;
00368
00369 private Q_SLOTS:
00370 void doDragScroll();
00371 void startDragScroll();
00372 void stopDragScroll();
00373
00374 private:
00375
00376 QTimer m_dragScrollTimer;
00377 QTimer m_scrollTimer;
00378 QTimer m_cursorTimer;
00379 QTimer m_textHintTimer;
00380
00381 static const int s_scrollTime = 30;
00382 static const int s_scrollMargin = 16;
00383
00384 private Q_SLOTS:
00385 void scrollTimeout ();
00386 void cursorTimeout ();
00387 void textHintTimeout ();
00388
00389
00390 public:
00391 void enableTextHints(int timeout);
00392 void disableTextHints();
00393
00394 private:
00395 bool m_textHintEnabled;
00396 int m_textHintTimeout;
00397 int m_textHintMouseX;
00398 int m_textHintMouseY;
00399
00403 public:
00404 virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
00405
00406 private:
00407 KTextEditor::SmartRange* m_imPreedit;
00408
00409
00410 public:
00411 void addHighlightRange(KTextEditor::SmartRange* range);
00412 void removeHighlightRange(KTextEditor::SmartRange* range);
00413
00414 private:
00415
00416 struct DynamicRangeHL {
00417 DynamicRangeHL(KateSmartRange* top);
00418 ~DynamicRangeHL();
00419
00420 KateSmartRange* top;
00421 bool isView;
00422 KateSmartRange* caretOver;
00423 KateSmartRange* mouseOver;
00424 QHash<KateSmartRange*, QPointer<class KateDynamicAnimation> > caretAnimations;
00425 QHash<KateSmartRange*, QPointer<KateDynamicAnimation> > mouseAnimations;
00426 };
00427
00428 void mouseMoved();
00429 void cursorMoved();
00430 void dynamicMoved(bool mouse);
00431 void startDynamic(DynamicRangeHL* hl, KateSmartRange* range, KTextEditor::Attribute::ActivationType type);
00432 void endDynamic(DynamicRangeHL* hl, KateSmartRange* range, KTextEditor::Attribute::ActivationType type);
00433
00434 private:
00435
00436 void rangePositionChanged(KTextEditor::SmartRange* range);
00437 void rangeDeleted(KTextEditor::SmartRange* range);
00438 void childRangeInserted(KTextEditor::SmartRange* range, KTextEditor::SmartRange* child);
00439 void childRangeRemoved(KTextEditor::SmartRange* range, KTextEditor::SmartRange* child);
00440 void rangeAttributeChanged(KTextEditor::SmartRange* range, KTextEditor::Attribute::Ptr currentAttribute, KTextEditor::Attribute::Ptr previousAttribute);
00441
00442 public Q_SLOTS:
00443 void dynamicHighlightAdded(KateSmartRange* range);
00444 void dynamicHighlightRemoved(KateSmartRange* range);
00445 void rangeDeleted(KateSmartRange* range);
00446
00447 void updateRange(KateSmartRange* range);
00448
00449 private:
00450 QHash<KateSmartRange*, DynamicRangeHL*> m_dynamicHighlights;
00451 bool m_smartDirty;
00452
00453 void removeWatcher(KTextEditor::SmartRange* range, KTextEditor::SmartRangeWatcher* watcher);
00454 void addWatcher(KTextEditor::SmartRange* range, KTextEditor::SmartRangeWatcher* watcher);
00455 int m_watcherCount1, m_watcherCount3;
00456
00457
00458 private:
00459 bool m_viInputMode;
00460 bool m_viInputModeStealKeys;
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00475 ViMode getCurrentViMode();
00476
00481 KateViInputModeManager* m_viInputModeManager;
00482
00486 KateViInputModeManager* getViInputModeManager();
00487 };
00488
00489 #endif
00490
00491