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 void moveCursorToSelectionEdge();
00244
00245 void updateCursor( const KTextEditor::Cursor& newCursor, bool force = false, bool center = false, bool calledExternally = false );
00246 void updateBracketMarks();
00247
00248 void paintCursor();
00249
00250 void placeCursor( const QPoint& p, bool keepSelection = false, bool updateSelection = true );
00251 bool isTargetSelected( const QPoint& p );
00252
00253 bool rangeAffectsView(const KTextEditor::Range& range) const;
00254
00255 void doDrag();
00256
00257 inline KateView* view() const { return m_view; }
00258 KateRenderer* renderer() const;
00259
00260 KateView *m_view;
00261 KateDocument* m_doc;
00262 class KateIconBorder *m_leftBorder;
00263
00264 int m_mouseX;
00265 int m_mouseY;
00266 int m_scrollX;
00267 int m_scrollY;
00268
00269 Qt::CursorShape m_mouseCursor;
00270
00271 KateSmartCursor m_cursor;
00272 KTextEditor::Cursor m_mouse;
00273 KTextEditor::Cursor m_displayCursor;
00274
00275 bool m_possibleTripleClick;
00276
00277
00278 bool m_completionItemExpanded;
00279 QTime m_altDownTime;
00280
00281
00282 KateSmartRange *m_bm, *m_bmStart, *m_bmEnd;
00283 bool m_bmHighlighted;
00284 void updateBracketMarkAttributes();
00285
00286 enum DragState { diNone, diPending, diDragging };
00287
00288 struct _dragInfo {
00289 DragState state;
00290 QPoint start;
00291 QDrag* dragObject;
00292 } m_dragInfo;
00293
00294 uint m_iconBorderHeight;
00295
00296
00297
00298
00299 KateScrollBar *m_lineScroll;
00300 QWidget* m_dummy;
00301
00302
00303
00304 KateSmartCursor m_startPos;
00305
00306
00307 uint m_visibleLineCount;
00308
00309
00310
00311 bool m_madeVisible;
00312 bool m_shiftKeyPressed;
00313
00314
00315 void setAutoCenterLines(int viewLines, bool updateView = true);
00316 int m_autoCenterLines;
00317 int m_minLinesVisible;
00318
00319
00320
00321
00322 QScrollBar *m_columnScroll;
00323 int m_startX;
00324
00325
00326 bool m_selChangedByUser;
00327 KTextEditor::Cursor m_selectAnchor;
00328
00329 enum SelectionMode { Default=0, Mouse, Word, Line };
00330 uint m_selectionMode;
00331
00332
00333
00334 KTextEditor::Range m_selectionCached;
00335
00336
00337 int maxLen(int startLine);
00338
00339
00340 bool columnScrollingPossible ();
00341
00342
00343 int lineMaxCursorX(const KateTextLayout& line);
00344 int lineMaxCol(const KateTextLayout& line);
00345
00346 class KateLayoutCache* cache() const;
00347 KateLayoutCache* m_layoutCache;
00348
00349
00350 KateTextLayout currentLayout() const;
00351 KateTextLayout previousLayout() const;
00352 KateTextLayout nextLayout() const;
00353
00354
00355
00356
00357 KTextEditor::Cursor viewLineOffset(const KTextEditor::Cursor& virtualCursor, int offset, bool keepX = false);
00358
00359 KTextEditor::Cursor toRealCursor(const KTextEditor::Cursor& virtualCursor) const;
00360 KTextEditor::Cursor toVirtualCursor(const KTextEditor::Cursor& realCursor) const;
00361
00362
00363 bool m_preserveX;
00364 int m_preservedX;
00365
00366 bool m_updatingView;
00367 int m_wrapChangeViewLine;
00368 KTextEditor::Cursor m_cachedMaxStartPos;
00369
00370 private Q_SLOTS:
00371 void doDragScroll();
00372 void startDragScroll();
00373 void stopDragScroll();
00374
00375 private:
00376
00377 QTimer m_dragScrollTimer;
00378 QTimer m_scrollTimer;
00379 QTimer m_cursorTimer;
00380 QTimer m_textHintTimer;
00381
00382 static const int s_scrollTime = 30;
00383 static const int s_scrollMargin = 16;
00384
00385 private Q_SLOTS:
00386 void scrollTimeout ();
00387 void cursorTimeout ();
00388 void textHintTimeout ();
00389
00390
00391 public:
00392 void enableTextHints(int timeout);
00393 void disableTextHints();
00394
00395 private:
00396 bool m_textHintEnabled;
00397 int m_textHintTimeout;
00398 int m_textHintMouseX;
00399 int m_textHintMouseY;
00400
00404 public:
00405 virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
00406
00407 private:
00408 KTextEditor::SmartRange* m_imPreedit;
00409
00410
00411 public:
00412 void addHighlightRange(KTextEditor::SmartRange* range);
00413 void removeHighlightRange(KTextEditor::SmartRange* range);
00414
00415 private:
00416
00417 struct DynamicRangeHL {
00418 DynamicRangeHL(KateSmartRange* top);
00419 ~DynamicRangeHL();
00420
00421 KateSmartRange* top;
00422 bool isView;
00423 KateSmartRange* caretOver;
00424 KateSmartRange* mouseOver;
00425 QHash<KateSmartRange*, QPointer<class KateDynamicAnimation> > caretAnimations;
00426 QHash<KateSmartRange*, QPointer<KateDynamicAnimation> > mouseAnimations;
00427 };
00428
00429 void mouseMoved();
00430 void cursorMoved();
00431 void dynamicMoved(bool mouse);
00432 void startDynamic(DynamicRangeHL* hl, KateSmartRange* range, KTextEditor::Attribute::ActivationType type);
00433 void endDynamic(DynamicRangeHL* hl, KateSmartRange* range, KTextEditor::Attribute::ActivationType type);
00434
00435 private:
00436
00437 void rangePositionChanged(KTextEditor::SmartRange* range);
00438 void rangeDeleted(KTextEditor::SmartRange* range);
00439 void childRangeInserted(KTextEditor::SmartRange* range, KTextEditor::SmartRange* child);
00440 void childRangeRemoved(KTextEditor::SmartRange* range, KTextEditor::SmartRange* child);
00441 void rangeAttributeChanged(KTextEditor::SmartRange* range, KTextEditor::Attribute::Ptr currentAttribute, KTextEditor::Attribute::Ptr previousAttribute);
00442
00443 public Q_SLOTS:
00444 void dynamicHighlightAdded(KateSmartRange* range);
00445 void dynamicHighlightRemoved(KateSmartRange* range);
00446 void rangeDeleted(KateSmartRange* range);
00447
00448 void updateRange(KateSmartRange* range);
00449
00450 private:
00451 QHash<KateSmartRange*, DynamicRangeHL*> m_dynamicHighlights;
00452 bool m_smartDirty;
00453
00454 void removeWatcher(KTextEditor::SmartRange* range, KTextEditor::SmartRangeWatcher* watcher);
00455 void addWatcher(KTextEditor::SmartRange* range, KTextEditor::SmartRangeWatcher* watcher);
00456 int m_watcherCount1, m_watcherCount3;
00457
00458
00459 private:
00460 bool m_viInputMode;
00461 bool m_viInputModeStealKeys;
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00476 ViMode getCurrentViMode();
00477
00482 KateViInputModeManager* m_viInputModeManager;
00483
00487 KateViInputModeManager* getViInputModeManager();
00488 };
00489
00490 #endif
00491
00492