author | Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> |
Mon, 04 Oct 2010 01:19:32 +0300 | |
changeset 37 | 758a864f9613 |
parent 33 | 3e2da88830cd |
permissions | -rw-r--r-- |
0 | 1 |
/**************************************************************************** |
2 |
** |
|
18
2f34d5167611
Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
3
diff
changeset
|
3 |
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). |
0 | 4 |
** All rights reserved. |
5 |
** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 |
** |
|
7 |
** This file is part of the QtGui module of the Qt Toolkit. |
|
8 |
** |
|
9 |
** $QT_BEGIN_LICENSE:LGPL$ |
|
10 |
** No Commercial Usage |
|
11 |
** This file contains pre-release code and may not be distributed. |
|
12 |
** You may use this file in accordance with the terms and conditions |
|
13 |
** contained in the Technology Preview License Agreement accompanying |
|
14 |
** this package. |
|
15 |
** |
|
16 |
** GNU Lesser General Public License Usage |
|
17 |
** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 |
** General Public License version 2.1 as published by the Free Software |
|
19 |
** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 |
** packaging of this file. Please review the following information to |
|
21 |
** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 |
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 |
** |
|
24 |
** In addition, as a special exception, Nokia gives you certain additional |
|
25 |
** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 |
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 |
** |
|
28 |
** If you have questions regarding the use of this file, please contact |
|
29 |
** Nokia at qt-info@nokia.com. |
|
30 |
** |
|
31 |
** |
|
32 |
** |
|
33 |
** |
|
34 |
** |
|
35 |
** |
|
36 |
** |
|
37 |
** |
|
38 |
** $QT_END_LICENSE$ |
|
39 |
** |
|
40 |
****************************************************************************/ |
|
41 |
||
42 |
#ifndef QLINECONTROL_P_H |
|
43 |
#define QLINECONTROL_P_H |
|
44 |
||
45 |
// |
|
46 |
// W A R N I N G |
|
47 |
// ------------- |
|
48 |
// |
|
49 |
// This file is not part of the Qt API. It exists purely as an |
|
50 |
// implementation detail. This header file may change from version to |
|
51 |
// version without notice, or even be removed. |
|
52 |
// |
|
53 |
// We mean it. |
|
54 |
// |
|
55 |
||
56 |
#include "QtCore/qglobal.h" |
|
57 |
||
58 |
#ifndef QT_NO_LINEEDIT |
|
59 |
#include "private/qwidget_p.h" |
|
60 |
#include "QtGui/qlineedit.h" |
|
61 |
#include "QtGui/qtextlayout.h" |
|
62 |
#include "QtGui/qstyleoption.h" |
|
63 |
#include "QtCore/qpointer.h" |
|
64 |
#include "QtGui/qlineedit.h" |
|
65 |
#include "QtGui/qclipboard.h" |
|
66 |
#include "QtCore/qpoint.h" |
|
67 |
#include "QtGui/qcompleter.h" |
|
68 |
||
69 |
QT_BEGIN_HEADER |
|
70 |
||
71 |
QT_BEGIN_NAMESPACE |
|
72 |
||
73 |
QT_MODULE(Gui) |
|
74 |
||
75 |
class Q_GUI_EXPORT QLineControl : public QObject |
|
76 |
{ |
|
77 |
Q_OBJECT |
|
78 |
||
79 |
public: |
|
80 |
QLineControl(const QString &txt = QString()) |
|
33
3e2da88830cd
Revision: 201031
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
30
diff
changeset
|
81 |
: m_cursor(0), m_preeditCursor(0), m_cursorWidth(0), m_layoutDirection(Qt::LayoutDirectionAuto), |
0 | 82 |
m_hideCursor(false), m_separator(0), m_readOnly(0), |
83 |
m_dragEnabled(0), m_echoMode(0), m_textDirty(0), m_selDirty(0), |
|
84 |
m_validInput(1), m_blinkStatus(0), m_blinkPeriod(0), m_blinkTimer(0), m_deleteAllTimer(0), |
|
85 |
m_ascent(0), m_maxLength(32767), m_lastCursorPos(-1), |
|
86 |
m_tripleClickTimer(0), m_maskData(0), m_modifiedState(0), m_undoState(0), |
|
87 |
m_selstart(0), m_selend(0), m_passwordEchoEditing(false) |
|
88 |
{ |
|
89 |
init(txt); |
|
90 |
} |
|
91 |
||
92 |
~QLineControl() |
|
93 |
{ |
|
94 |
delete [] m_maskData; |
|
95 |
} |
|
96 |
||
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
97 |
int nextMaskBlank(int pos) |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
98 |
{ |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
99 |
int c = findInMask(pos, true, false); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
100 |
m_separator |= (c != pos); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
101 |
return (c != -1 ? c : m_maxLength); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
102 |
} |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
103 |
|
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
104 |
int prevMaskBlank(int pos) |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
105 |
{ |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
106 |
int c = findInMask(pos, false, false); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
107 |
m_separator |= (c != pos); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
108 |
return (c != -1 ? c : 0); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
109 |
} |
0 | 110 |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
111 |
bool isUndoAvailable() const { return !m_readOnly && m_undoState; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
112 |
bool isRedoAvailable() const { return !m_readOnly && m_undoState < (int)m_history.size(); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
113 |
void clearUndo() { m_history.clear(); m_modifiedState = m_undoState = 0; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
114 |
|
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
115 |
bool isModified() const { return m_modifiedState != m_undoState; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
116 |
void setModified(bool modified) { m_modifiedState = modified ? -1 : m_undoState; } |
0 | 117 |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
118 |
bool allSelected() const { return !m_text.isEmpty() && m_selstart == 0 && m_selend == (int)m_text.length(); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
119 |
bool hasSelectedText() const { return !m_text.isEmpty() && m_selend > m_selstart; } |
0 | 120 |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
121 |
int width() const { return qRound(m_textLayout.lineAt(0).width()) + 1; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
122 |
int height() const { return qRound(m_textLayout.lineAt(0).height()) + 1; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
123 |
int ascent() const { return m_ascent; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
124 |
qreal naturalTextWidth() const { return m_textLayout.lineAt(0).naturalTextWidth(); } |
0 | 125 |
|
126 |
void setSelection(int start, int length); |
|
127 |
||
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
128 |
inline QString selectedText() const { return hasSelectedText() ? m_text.mid(m_selstart, m_selend - m_selstart) : QString(); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
129 |
QString textBeforeSelection() const { return hasSelectedText() ? m_text.left(m_selstart) : QString(); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
130 |
QString textAfterSelection() const { return hasSelectedText() ? m_text.mid(m_selend) : QString(); } |
0 | 131 |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
132 |
int selectionStart() const { return hasSelectedText() ? m_selstart : -1; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
133 |
int selectionEnd() const { return hasSelectedText() ? m_selend : -1; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
134 |
bool inSelection(int x) const |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
135 |
{ |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
136 |
if (m_selstart >= m_selend) |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
137 |
return false; |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
138 |
int pos = xToPos(x, QTextLine::CursorOnCharacter); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
139 |
return pos >= m_selstart && pos < m_selend; |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
140 |
} |
0 | 141 |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
142 |
void removeSelection() |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
143 |
{ |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
144 |
int priorState = m_undoState; |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
145 |
removeSelectedText(); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
146 |
finishChange(priorState); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
147 |
} |
0 | 148 |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
149 |
int start() const { return 0; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
150 |
int end() const { return m_text.length(); } |
0 | 151 |
|
152 |
#ifndef QT_NO_CLIPBOARD |
|
153 |
void copy(QClipboard::Mode mode = QClipboard::Clipboard) const; |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
154 |
void paste(QClipboard::Mode mode = QClipboard::Clipboard); |
0 | 155 |
#endif |
156 |
||
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
157 |
int cursor() const{ return m_cursor; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
158 |
int preeditCursor() const { return m_preeditCursor; } |
0 | 159 |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
160 |
int cursorWidth() const { return m_cursorWidth; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
161 |
void setCursorWidth(int value) { m_cursorWidth = value; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
162 |
|
0 | 163 |
|
164 |
void moveCursor(int pos, bool mark = false); |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
165 |
void cursorForward(bool mark, int steps) |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
166 |
{ |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
167 |
int c = m_cursor; |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
168 |
if (steps > 0) { |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
169 |
while (steps--) |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
170 |
c = m_textLayout.nextCursorPosition(c); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
171 |
} else if (steps < 0) { |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
172 |
while (steps++) |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
173 |
c = m_textLayout.previousCursorPosition(c); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
174 |
} |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
175 |
moveCursor(c, mark); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
176 |
} |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
177 |
|
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
178 |
void cursorWordForward(bool mark) { moveCursor(m_textLayout.nextCursorPosition(m_cursor, QTextLayout::SkipWords), mark); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
179 |
void cursorWordBackward(bool mark) { moveCursor(m_textLayout.previousCursorPosition(m_cursor, QTextLayout::SkipWords), mark); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
180 |
|
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
181 |
void home(bool mark) { moveCursor(0, mark); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
182 |
void end(bool mark) { moveCursor(text().length(), mark); } |
0 | 183 |
|
184 |
int xToPos(int x, QTextLine::CursorPosition = QTextLine::CursorBetweenCharacters) const; |
|
185 |
QRect cursorRect() const; |
|
186 |
||
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
187 |
qreal cursorToX(int cursor) const { return m_textLayout.lineAt(0).cursorToX(cursor); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
188 |
qreal cursorToX() const |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
189 |
{ |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
190 |
int cursor = m_cursor; |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
191 |
if (m_preeditCursor != -1) |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
192 |
cursor += m_preeditCursor; |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
193 |
return cursorToX(cursor); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
194 |
} |
0 | 195 |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
196 |
bool isReadOnly() const { return m_readOnly; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
197 |
void setReadOnly(bool enable) { m_readOnly = enable; } |
0 | 198 |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
199 |
QString text() const |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
200 |
{ |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
201 |
QString res = m_maskData ? stripString(m_text) : m_text; |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
202 |
return (res.isNull() ? QString::fromLatin1("") : res); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
203 |
} |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
204 |
void setText(const QString &txt) { internalSetText(txt, -1, false); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
205 |
QString displayText() const { return m_textLayout.text(); } |
0 | 206 |
|
207 |
void backspace(); |
|
208 |
void del(); |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
209 |
void deselect() { internalDeselect(); finishChange(); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
210 |
void selectAll() { m_selstart = m_selend = m_cursor = 0; moveCursor(m_text.length(), true); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
211 |
|
0 | 212 |
void insert(const QString &); |
213 |
void clear(); |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
214 |
void undo() { internalUndo(); finishChange(-1, true); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
215 |
void redo() { internalRedo(); finishChange(); } |
0 | 216 |
void selectWordAtPos(int); |
217 |
||
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
218 |
uint echoMode() const { return m_echoMode; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
219 |
void setEchoMode(uint mode) |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
220 |
{ |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
221 |
m_echoMode = mode; |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
222 |
m_passwordEchoEditing = false; |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
223 |
updateDisplayText(); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
224 |
} |
0 | 225 |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
226 |
int maxLength() const { return m_maxLength; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
227 |
void setMaxLength(int maxLength) |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
228 |
{ |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
229 |
if (m_maskData) |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
230 |
return; |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
231 |
m_maxLength = maxLength; |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
232 |
setText(m_text); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
233 |
} |
0 | 234 |
|
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
235 |
#ifndef QT_NO_VALIDATOR |
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
236 |
const QValidator *validator() const { return m_validator; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
237 |
void setValidator(const QValidator *v) { m_validator = const_cast<QValidator*>(v); } |
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
238 |
#endif |
0 | 239 |
|
240 |
#ifndef QT_NO_COMPLETER |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
241 |
QCompleter *completer() const { return m_completer; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
242 |
/* Note that you must set the widget for the completer seperately */ |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
243 |
void setCompleter(const QCompleter *c) { m_completer = const_cast<QCompleter*>(c); } |
0 | 244 |
void complete(int key); |
245 |
#endif |
|
246 |
||
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
247 |
int cursorPosition() const { return m_cursor; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
248 |
void setCursorPosition(int pos) { if (pos <= m_text.length()) moveCursor(qMax(0, pos)); } |
0 | 249 |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
250 |
bool hasAcceptableInput() const { return hasAcceptableInput(m_text); } |
0 | 251 |
bool fixup(); |
252 |
||
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
253 |
QString inputMask() const { return m_maskData ? m_inputMask + QLatin1Char(';') + m_blank : QString(); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
254 |
void setInputMask(const QString &mask) |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
255 |
{ |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
256 |
parseInputMask(mask); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
257 |
if (m_maskData) |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
258 |
moveCursor(nextMaskBlank(0)); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
259 |
} |
0 | 260 |
|
261 |
// input methods |
|
262 |
#ifndef QT_NO_IM |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
263 |
bool composeMode() const { return !m_textLayout.preeditAreaText().isEmpty(); } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
264 |
void setPreeditArea(int cursor, const QString &text) { m_textLayout.setPreeditArea(cursor, text); } |
0 | 265 |
#endif |
266 |
||
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
267 |
QString preeditAreaText() const { return m_textLayout.preeditAreaText(); } |
0 | 268 |
|
269 |
void updatePasswordEchoEditing(bool editing); |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
270 |
bool passwordEchoEditing() const { return m_passwordEchoEditing; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
271 |
|
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
272 |
QChar passwordCharacter() const { return m_passwordCharacter; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
273 |
void setPasswordCharacter(const QChar &character) { m_passwordCharacter = character; updateDisplayText(); } |
0 | 274 |
|
33
3e2da88830cd
Revision: 201031
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
30
diff
changeset
|
275 |
Qt::LayoutDirection layoutDirection() const { |
3e2da88830cd
Revision: 201031
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
30
diff
changeset
|
276 |
if (m_layoutDirection == Qt::LayoutDirectionAuto) { |
3e2da88830cd
Revision: 201031
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
30
diff
changeset
|
277 |
if (m_text.isEmpty()) |
3e2da88830cd
Revision: 201031
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
30
diff
changeset
|
278 |
return QApplication::keyboardInputDirection(); |
3e2da88830cd
Revision: 201031
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
30
diff
changeset
|
279 |
return m_text.isRightToLeft() ? Qt::RightToLeft : Qt::LeftToRight; |
3e2da88830cd
Revision: 201031
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
30
diff
changeset
|
280 |
} |
3e2da88830cd
Revision: 201031
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
30
diff
changeset
|
281 |
return m_layoutDirection; |
3e2da88830cd
Revision: 201031
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
30
diff
changeset
|
282 |
} |
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
283 |
void setLayoutDirection(Qt::LayoutDirection direction) |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
284 |
{ |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
285 |
if (direction != m_layoutDirection) { |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
286 |
m_layoutDirection = direction; |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
287 |
updateDisplayText(); |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
288 |
} |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
289 |
} |
0 | 290 |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
291 |
void setFont(const QFont &font) { m_textLayout.setFont(font); updateDisplayText(); } |
0 | 292 |
|
293 |
void processInputMethodEvent(QInputMethodEvent *event); |
|
294 |
void processMouseEvent(QMouseEvent* ev); |
|
295 |
void processKeyEvent(QKeyEvent* ev); |
|
296 |
||
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
297 |
int cursorBlinkPeriod() const { return m_blinkPeriod; } |
0 | 298 |
void setCursorBlinkPeriod(int msec); |
299 |
||
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
300 |
QString cancelText() const { return m_cancelText; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
301 |
void setCancelText(const QString &text) { m_cancelText = text; } |
0 | 302 |
|
30
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
303 |
const QPalette &palette() const { return m_palette; } |
5dc02b23752f
Revision: 201025
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
19
diff
changeset
|
304 |
void setPalette(const QPalette &p) { m_palette = p; } |
0 | 305 |
|
306 |
enum DrawFlags { |
|
307 |
DrawText = 0x01, |
|
308 |
DrawSelections = 0x02, |
|
309 |
DrawCursor = 0x04, |
|
310 |
DrawAll = DrawText | DrawSelections | DrawCursor |
|
311 |
}; |
|
312 |
void draw(QPainter *, const QPoint &, const QRect &, int flags = DrawAll); |
|
313 |
||
314 |
bool processEvent(QEvent *ev); |
|
315 |
||
316 |
private: |
|
317 |
void init(const QString &txt); |
|
318 |
void removeSelectedText(); |
|
319 |
void internalSetText(const QString &txt, int pos = -1, bool edited = true); |
|
19
fcece45ef507
Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
18
diff
changeset
|
320 |
void updateDisplayText(bool forceUpdate = false); |
0 | 321 |
|
322 |
void internalInsert(const QString &s); |
|
323 |
void internalDelete(bool wasBackspace = false); |
|
324 |
void internalRemove(int pos); |
|
325 |
||
326 |
inline void internalDeselect() |
|
327 |
{ |
|
328 |
m_selDirty |= (m_selend > m_selstart); |
|
329 |
m_selstart = m_selend = 0; |
|
330 |
} |
|
331 |
||
332 |
void internalUndo(int until = -1); |
|
333 |
void internalRedo(); |
|
334 |
||
335 |
QString m_text; |
|
336 |
QPalette m_palette; |
|
337 |
int m_cursor; |
|
338 |
int m_preeditCursor; |
|
339 |
int m_cursorWidth; |
|
340 |
Qt::LayoutDirection m_layoutDirection; |
|
341 |
uint m_hideCursor : 1; // used to hide the m_cursor inside preedit areas |
|
342 |
uint m_separator : 1; |
|
343 |
uint m_readOnly : 1; |
|
344 |
uint m_dragEnabled : 1; |
|
345 |
uint m_echoMode : 2; |
|
346 |
uint m_textDirty : 1; |
|
347 |
uint m_selDirty : 1; |
|
348 |
uint m_validInput : 1; |
|
349 |
uint m_blinkStatus : 1; |
|
350 |
int m_blinkPeriod; // 0 for non-blinking cursor |
|
351 |
int m_blinkTimer; |
|
352 |
int m_deleteAllTimer; |
|
353 |
int m_ascent; |
|
354 |
int m_maxLength; |
|
355 |
int m_lastCursorPos; |
|
356 |
QList<int> m_transactions; |
|
357 |
QPoint m_tripleClick; |
|
358 |
int m_tripleClickTimer; |
|
359 |
QString m_cancelText; |
|
360 |
||
361 |
void emitCursorPositionChanged(); |
|
362 |
||
363 |
bool finishChange(int validateFromState = -1, bool update = false, bool edited = true); |
|
364 |
||
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
365 |
#ifndef QT_NO_VALIDATOR |
0 | 366 |
QPointer<QValidator> m_validator; |
3
41300fa6a67c
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
367 |
#endif |
0 | 368 |
QPointer<QCompleter> m_completer; |
369 |
#ifndef QT_NO_COMPLETER |
|
370 |
bool advanceToEnabledItem(int dir); |
|
371 |
#endif |
|
372 |
||
373 |
struct MaskInputData { |
|
374 |
enum Casemode { NoCaseMode, Upper, Lower }; |
|
375 |
QChar maskChar; // either the separator char or the inputmask |
|
376 |
bool separator; |
|
377 |
Casemode caseMode; |
|
378 |
}; |
|
379 |
QString m_inputMask; |
|
380 |
QChar m_blank; |
|
381 |
MaskInputData *m_maskData; |
|
382 |
||
383 |
// undo/redo handling |
|
384 |
enum CommandType { Separator, Insert, Remove, Delete, RemoveSelection, DeleteSelection, SetSelection }; |
|
385 |
struct Command { |
|
386 |
inline Command() {} |
|
387 |
inline Command(CommandType t, int p, QChar c, int ss, int se) : type(t),uc(c),pos(p),selStart(ss),selEnd(se) {} |
|
388 |
uint type : 4; |
|
389 |
QChar uc; |
|
390 |
int pos, selStart, selEnd; |
|
391 |
}; |
|
392 |
int m_modifiedState; |
|
393 |
int m_undoState; |
|
394 |
QVector<Command> m_history; |
|
395 |
void addCommand(const Command& cmd); |
|
396 |
||
397 |
inline void separate() { m_separator = true; } |
|
398 |
||
399 |
// selection |
|
400 |
int m_selstart; |
|
401 |
int m_selend; |
|
402 |
||
403 |
// masking |
|
404 |
void parseInputMask(const QString &maskFields); |
|
405 |
bool isValidInput(QChar key, QChar mask) const; |
|
406 |
bool hasAcceptableInput(const QString &text) const; |
|
407 |
QString maskString(uint pos, const QString &str, bool clear = false) const; |
|
408 |
QString clearString(uint pos, uint len) const; |
|
409 |
QString stripString(const QString &str) const; |
|
410 |
int findInMask(int pos, bool forward, bool findSeparator, QChar searchChar = QChar()) const; |
|
411 |
||
412 |
// complex text layout |
|
413 |
QTextLayout m_textLayout; |
|
414 |
||
415 |
bool m_passwordEchoEditing; |
|
416 |
QChar m_passwordCharacter; |
|
417 |
||
418 |
Q_SIGNALS: |
|
419 |
void cursorPositionChanged(int, int); |
|
420 |
void selectionChanged(); |
|
421 |
||
422 |
void displayTextChanged(const QString &); |
|
423 |
void textChanged(const QString &); |
|
424 |
void textEdited(const QString &); |
|
425 |
||
426 |
void resetInputContext(); |
|
427 |
||
428 |
void accepted(); |
|
429 |
void editingFinished(); |
|
430 |
void updateNeeded(const QRect &); |
|
431 |
||
432 |
#ifdef QT_KEYPAD_NAVIGATION |
|
433 |
void editFocusChange(bool); |
|
434 |
#endif |
|
435 |
protected: |
|
436 |
virtual void timerEvent(QTimerEvent *event); |
|
437 |
||
438 |
private Q_SLOTS: |
|
439 |
void _q_clipboardChanged(); |
|
440 |
void _q_deleteSelected(); |
|
441 |
||
442 |
}; |
|
443 |
||
444 |
QT_END_NAMESPACE |
|
445 |
||
446 |
QT_END_HEADER |
|
447 |
||
448 |
#endif // QT_NO_LINEEDIT |
|
449 |
||
450 |
#endif // QLINECONTROL_P_H |