diff options
Diffstat (limited to 'src/widgets/qmultilineedit.cpp')
-rw-r--r-- | src/widgets/qmultilineedit.cpp | 541 |
1 files changed, 541 insertions, 0 deletions
diff --git a/src/widgets/qmultilineedit.cpp b/src/widgets/qmultilineedit.cpp new file mode 100644 index 000000000..be5a7aac3 --- /dev/null +++ b/src/widgets/qmultilineedit.cpp @@ -0,0 +1,541 @@ +/********************************************************************** +** +** Implementation of TQMultiLineEdit widget class +** +** Created : 961005 +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of the widgets module of the TQt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing retquirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.TQPL +** included in the packaging of this file. Licensees holding valid TQt +** Commercial licenses may use this file in accordance with the TQt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#include "qmultilineedit.h" +#ifndef QT_NO_MULTILINEEDIT +#include "qpainter.h" +#include "qscrollbar.h" +#include "qcursor.h" +#include "qclipboard.h" +#include "qpixmap.h" +#include "qregexp.h" +#include "qapplication.h" +#include "qdragobject.h" +#include "qpopupmenu.h" +#include "qtimer.h" +#include "qdict.h" +#include "../kernel/qrichtext_p.h" + + +/*! + \class TQMultiLineEdit qmultilineedit.h + \obsolete + + \brief The TQMultiLineEdit widget is a simple editor for inputting text. + + \ingroup advanced + + The TQMultiLineEdit was a simple editor widget in former TQt versions. TQt + 3.0 includes a new richtext engine which obsoletes TQMultiLineEdit. It is + still included for compatibility reasons. It is now a subclass of + \l TQTextEdit, and provides enough of the old TQMultiLineEdit API to keep old + applications working. + + If you implement something new with TQMultiLineEdit, we suggest using + \l TQTextEdit instead and call TQTextEdit::setTextFormat(TQt::PlainText). + + Although most of the old TQMultiLineEdit API is still available, there is + a few difference. The old TQMultiLineEdit operated on lines, not on + paragraphs. As lines change all the time during wordwrap, the new + richtext engine uses paragraphs as basic elements in the data structure. + All functions (numLines(), textLine(), etc.) that operated on lines, now + operate on paragraphs. Further, getString() has been removed completely. + It revealed too much of the internal data structure. + + Applications which made normal and reasonable use of TQMultiLineEdit + should still work without problems. Some odd usage will retquire some + porting. In these cases, it may be better to use \l TQTextEdit now. + + <img src=qmlined-m.png> <img src=qmlined-w.png> + + \sa TQTextEdit +*/ + +/*! + \fn bool TQMultiLineEdit::autoUpdate() const + \obsolete +*/ + +/*! + \fn virtual void TQMultiLineEdit::setAutoUpdate( bool ) + \obsolete +*/ + +/*! + \fn int TQMultiLineEdit::totalWidth() const + \obsolete +*/ + +/*! + \fn int TQMultiLineEdit::totalHeight() const + \obsolete +*/ + +/*! + \fn int TQMultiLineEdit::maxLines() const + \obsolete +*/ + +/*! + \fn void TQMultiLineEdit::setMaxLines( int ) + \obsolete +*/ + +/*! + \fn void TQMultiLineEdit::deselect() + \obsolete +*/ + + +class TQMultiLineEditData +{ +}; + + +/*! + Constructs a new, empty, TQMultiLineEdit with parent \a parent called + \a name. +*/ + +TQMultiLineEdit::TQMultiLineEdit( TQWidget *parent , const char *name ) + : TQTextEdit( parent, name ) +{ + d = new TQMultiLineEditData; + setTextFormat( TQt::PlainText ); +} + +/*! \property TQMultiLineEdit::numLines + \brief the number of paragraphs in the editor + + The count includes any empty paragraph at top and bottom, so for an + empty editor this method returns 1. +*/ + +int TQMultiLineEdit::numLines() const +{ + return document()->lastParagraph()->paragId() + 1; +} + +/*! \property TQMultiLineEdit::atEnd + \brief whether the cursor is placed at the end of the text + + \sa atBeginning +*/ + +bool TQMultiLineEdit::atEnd() const +{ + return textCursor()->paragraph() == document()->lastParagraph() && textCursor()->atParagEnd(); +} + + +/*! \property TQMultiLineEdit::atBeginning + \brief whether the cursor is placed at the beginning of the text + + \sa atEnd +*/ + +bool TQMultiLineEdit::atBeginning() const +{ + return textCursor()->paragraph() == document()->firstParagraph() && textCursor()->atParagStart(); +} + +/*! Returns the number of characters at paragraph number \a row. If + \a row is out of range, -1 is returned. +*/ + +int TQMultiLineEdit::lineLength( int row ) const +{ + if ( row < 0 || row > numLines() ) + return -1; + return document()->paragAt( row )->length() - 1; +} + + +/*! \reimp */ + +TQMultiLineEdit::~TQMultiLineEdit() +{ + delete d; +} + +/*! + If there is selected text, sets \a line1, \a col1, \a line2 and \a col2 + to the start and end of the selected region and returns TRUE. Returns + FALSE if there is no selected text. + */ +bool TQMultiLineEdit::getMarkedRegion( int *line1, int *col1, + int *line2, int *col2 ) const +{ + int p1,c1, p2, c2; + getSelection( &p1, &c1, &p2, &c2 ); + if ( p1 == -1 && c1 == -1 && p2 == -1 && c2 == -1 ) + return FALSE; + if ( line1 ) + *line1 = p1; + if ( col1 ) + *col1 = c1; + if ( line2 ) + *line2 = p2; + if ( col2 ) + *col2 = c2; + return TRUE; +} + + +/*! + Returns TRUE if there is selected text. +*/ + +bool TQMultiLineEdit::hasMarkedText() const +{ + return hasSelectedText(); +} + + +/*! + Returns a copy of the selected text. +*/ + +TQString TQMultiLineEdit::markedText() const +{ + return selectedText(); +} + +/*! + Moves the cursor one page down. If \a mark is TRUE, the text + is selected. +*/ + +void TQMultiLineEdit::pageDown( bool mark ) +{ + moveCursor( MoveDown, mark ); +} + + +/*! + Moves the cursor one page up. If \a mark is TRUE, the text + is selected. +*/ + +void TQMultiLineEdit::pageUp( bool mark ) +{ + moveCursor( MovePgUp, mark ); +} + + +/*! Inserts \a txt at paragraph number \a line. If \a line is less + than zero, or larger than the number of paragraphs, the new text is + put at the end. If \a txt contains newline characters, several + paragraphs are inserted. + + The cursor position is not changed. +*/ + +void TQMultiLineEdit::insertLine( const TQString &txt, int line ) +{ + insertParagraph( txt, line ); +} + +/*! Deletes the paragraph at paragraph number \a paragraph. If \a + paragraph is less than zero or larger than the number of paragraphs, + nothing is deleted. +*/ + +void TQMultiLineEdit::removeLine( int paragraph ) +{ + removeParagraph( paragraph ); +} + +/*! Inserts \a str at the current cursor position and selects the + text if \a mark is TRUE. +*/ + +void TQMultiLineEdit::insertAndMark( const TQString& str, bool mark ) +{ + insert( str ); + if ( mark ) + document()->setSelectionEnd( TQTextDocument::Standard, *textCursor() ); +} + +/*! Splits the paragraph at the current cursor position. +*/ + +void TQMultiLineEdit::newLine() +{ + insert( "\n" ); +} + + +/*! Deletes the character on the left side of the text cursor and + moves the cursor one position to the left. If a text has been selected + by the user (e.g. by clicking and dragging) the cursor is put at the + beginning of the selected text and the selected text is removed. \sa + del() +*/ + +void TQMultiLineEdit::backspace() +{ + if ( document()->hasSelection( TQTextDocument::Standard ) ) { + removeSelectedText(); + return; + } + + if ( !textCursor()->paragraph()->prev() && + textCursor()->atParagStart() ) + return; + + doKeyboardAction( ActionBackspace ); +} + + +/*! Moves the text cursor to the left end of the line. If \a mark is + TRUE, text is selected toward the first position. If it is FALSE and the + cursor is moved, all selected text is unselected. + + \sa end() +*/ + +void TQMultiLineEdit::home( bool mark ) +{ + moveCursor( MoveLineStart, mark ); +} + +/*! Moves the text cursor to the right end of the line. If \a mark is + TRUE, text is selected toward the last position. If it is FALSE and the + cursor is moved, all selected text is unselected. + + \sa home() +*/ + +void TQMultiLineEdit::end( bool mark ) +{ + moveCursor( MoveLineEnd, mark ); +} + + +/*! + \fn void TQMultiLineEdit::setCursorPosition( int line, int col ) + \reimp +*/ + +/*! Sets the cursor position to character number \a col in paragraph + number \a line. The parameters are adjusted to lie within the legal + range. + + If \a mark is FALSE, the selection is cleared. otherwise it is extended. + +*/ + +void TQMultiLineEdit::setCursorPosition( int line, int col, bool mark ) +{ + if ( !mark ) + selectAll( FALSE ); + TQTextEdit::setCursorPosition( line, col ); + if ( mark ) + document()->setSelectionEnd( TQTextDocument::Standard, *textCursor() ); +} + +/*! Returns the top center point where the cursor is drawn. +*/ + +TQPoint TQMultiLineEdit::cursorPoint() const +{ + return TQPoint( textCursor()->x(), textCursor()->y() + textCursor()->paragraph()->rect().y() ); +} + +/*! \property TQMultiLineEdit::alignment + \brief The editor's paragraph alignment + + Sets the alignment to flag, which must be \c AlignLeft, \c + AlignHCenter or \c AlignRight. + + If flag is an illegal flag nothing happens. + + \sa TQt::AlignmentFlags +*/ +void TQMultiLineEdit::setAlignment( int flag ) +{ + if ( flag == AlignCenter ) + flag = AlignHCenter; + if ( flag != AlignLeft && flag != AlignRight && flag != AlignHCenter ) + return; + TQTextParagraph *p = document()->firstParagraph(); + while ( p ) { + p->setAlignment( flag ); + p = p->next(); + } +} + +int TQMultiLineEdit::alignment() const +{ + return document()->firstParagraph()->alignment(); +} + + +void TQMultiLineEdit::setEdited( bool e ) +{ + setModified( e ); +} + +/*! \property TQMultiLineEdit::edited + \brief whether the document has been edited by the user + + This is the same as TQTextEdit's "modifed" property. + + \sa TQTextEdit::modified +*/ +bool TQMultiLineEdit::edited() const +{ + return isModified(); +} + +/*! Moves the cursor one word to the right. If \a mark is TRUE, the text + is selected. + + \sa cursorWordBackward() +*/ +void TQMultiLineEdit::cursorWordForward( bool mark ) +{ + moveCursor( MoveWordForward, mark ); +} + +/*! Moves the cursor one word to the left. If \a mark is TRUE, the + text is selected. + + \sa cursorWordForward() +*/ +void TQMultiLineEdit::cursorWordBackward( bool mark ) +{ + moveCursor( MoveWordBackward, mark ); +} + +/*! + \fn TQMultiLineEdit::insertAt( const TQString &s, int line, int col ) + \reimp +*/ + +/*! Inserts string \a s at paragraph number \a line, after character + number \a col in the paragraph. If \a s contains newline + characters, new lines are inserted. + If \a mark is TRUE the inserted string will be selected. + + The cursor position is adjusted. + */ + +void TQMultiLineEdit::insertAt( const TQString &s, int line, int col, bool mark ) +{ + TQTextEdit::insertAt( s, line, col ); + if ( mark ) + setSelection( line, col, line, col + s.length() ); +} + +// ### reggie - is this documentation correct? + +/*! Deletes text from the current cursor position to the end of the + line. (Note that this function still operates on lines, not paragraphs.) +*/ + +void TQMultiLineEdit::killLine() +{ + doKeyboardAction( ActionKill ); +} + +/*! Moves the cursor one character to the left. If \a mark is TRUE, + the text is selected. + The \a wrap parameter is currently ignored. + + \sa cursorRight() cursorUp() cursorDown() +*/ + +void TQMultiLineEdit::cursorLeft( bool mark, bool ) +{ + moveCursor( MoveBackward, mark ); +} + +/*! Moves the cursor one character to the right. If \a mark is TRUE, + the text is selected. + The \a wrap parameter is currently ignored. + + \sa cursorLeft() cursorUp() cursorDown() +*/ + +void TQMultiLineEdit::cursorRight( bool mark, bool ) +{ + moveCursor( MoveForward, mark ); +} + +/*! Moves the cursor up one line. If \a mark is TRUE, the text is + selected. + + \sa cursorDown() cursorLeft() cursorRight() +*/ + +void TQMultiLineEdit::cursorUp( bool mark ) +{ + moveCursor( MoveUp, mark ); +} + +/*! + Moves the cursor one line down. If \a mark is TRUE, the text + is selected. + \sa cursorUp() cursorLeft() cursorRight() +*/ + +void TQMultiLineEdit::cursorDown( bool mark ) +{ + moveCursor( MoveDown, mark ); +} + + +/*! Returns the text at line number \a line (possibly the empty + string), or a \link TQString::operator!() null string\endlink if \a + line is invalid. +*/ + +TQString TQMultiLineEdit::textLine( int line ) const +{ + if ( line < 0 || line >= numLines() ) + return TQString::null; + TQString str = document()->paragAt( line )->string()->toString(); + str.truncate( str.length() - 1 ); + return str; +} + +#endif |