summaryrefslogtreecommitdiffstats
path: root/src/widgets/qmultilineedit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/qmultilineedit.cpp')
-rw-r--r--src/widgets/qmultilineedit.cpp541
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