/*
This is part of TeXworks, an environment for working with TeX documents
Copyright (C) 2007-08 Jonathan Kew
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
For links to further information, or to contact the author,
see .
*/
#ifndef COMPLETING_EDIT_H
#define COMPLETING_EDIT_H
#include
#include
#include
#include
class QCompleter;
class QStandardItemModel;
class QTextCodec;
class CompletingEdit : public QTextEdit
{
Q_OBJECT
public:
CompletingEdit(QWidget *parent = 0);
~CompletingEdit();
void setSpellChecker(Hunhandle *h, QTextCodec *codec);
bool selectWord(QTextCursor& cursor);
void setLineNumberDisplay(bool displayNumbers);
void lineNumberAreaPaintEvent(QPaintEvent *event);
int lineNumberAreaWidth();
static QStringList autoIndentModes();
static QStringList smartQuotesModes();
static void setHighlightCurrentLine(bool highlight);
public slots:
void setAutoIndentMode(int index);
void setSmartQuotesMode(int index);
void updateLineNumberAreaWidth(int newBlockCount);
signals:
void syncClick(int);
void rehighlight();
void updateRequest(const QRect& rect, int dy);
protected:
virtual void keyPressEvent(QKeyEvent *e);
virtual void focusInEvent(QFocusEvent *e);
virtual void mousePressEvent(QMouseEvent *e);
virtual void mouseReleaseEvent(QMouseEvent *e);
virtual void mouseMoveEvent(QMouseEvent *e);
virtual void mouseDoubleClickEvent(QMouseEvent *e);
virtual void contextMenuEvent(QContextMenuEvent *e);
virtual void dragEnterEvent(QDragEnterEvent *e);
virtual void dropEvent(QDropEvent *e);
virtual void timerEvent(QTimerEvent *e);
virtual bool canInsertFromMimeData(const QMimeData *source) const;
virtual void insertFromMimeData(const QMimeData *source);
virtual void resizeEvent(QResizeEvent *event);
virtual bool event(QEvent *event);
virtual void scrollContentsBy(int dx, int dy);
private slots:
void cursorPositionChangedSlot();
void correction(const QString& suggestion);
void addToDictionary();
void ignoreWord();
void resetExtraSelections();
void jumpToPdf();
void updateLineNumberArea(const QRect&, int);
private:
void setCompleter(QCompleter *c);
void showCompletion(const QString& completion, int insOffset = -1);
void showCurrentCompletion();
void loadCompletionsFromFile(QStandardItemModel *model, const QString& filename);
void loadCompletionFiles(QCompleter *theCompleter);
void handleCompletionShortcut(QKeyEvent *e);
void handleReturn(QKeyEvent *e);
void handleBackspace(QKeyEvent *e);
void handleOtherKey(QKeyEvent *e);
void maybeSmartenQuote(int offset);
void setSelectionClipboard(const QTextCursor& curs);
QTextCursor wordSelectionForPos(const QPoint& pos);
QTextCursor blockSelectionForPos(const QPoint& pos);
enum MouseMode {
none,
ignoring,
synctexClick,
normalSelection,
extendingSelection,
dragSelecting
};
MouseMode mouseMode;
QTextCursor dragStartCursor;
int droppedOffset, droppedLength;
QBasicTimer clickTimer;
QPoint clickPos;
int clickCount;
static void loadIndentModes();
struct IndentMode {
QString name;
QRegExp regex;
};
static QList *indentModes;
int autoIndentMode;
int prefixLength;
static void loadSmartQuotesModes();
typedef QPair QuotePair;
typedef QHash QuoteMapping;
struct QuotesMode {
QString name;
QuoteMapping mappings;
};
static QList *quotesModes;
int smartQuotesMode;
QCompleter *c;
QTextCursor cmpCursor;
QString prevCompletion; // used with multiple entries for the same key (e.g., "--")
int itemIndex;
int prevRow;
QTextCursor currentWord;
Hunhandle *pHunspell;
QTextCodec *spellingCodec;
QTextCursor currentCompletionRange;
QWidget *lineNumberArea;
static QTextCharFormat *currentCompletionFormat;
static QTextCharFormat *braceMatchingFormat;
static QTextCharFormat *currentLineFormat;
static QCompleter *sharedCompleter;
static bool highlightCurrentLine;
};
class LineNumberArea : public QWidget
{
public:
LineNumberArea(CompletingEdit *e)
: QWidget(e)
{
editor = e;
}
QSize sizeHint() const {
return QSize(editor->lineNumberAreaWidth(), 0);
}
protected:
void paintEvent(QPaintEvent *event) {
editor->lineNumberAreaPaintEvent(event);
}
private:
CompletingEdit *editor;
};
#endif // COMPLETING_EDIT_H