diff options
Diffstat (limited to 'kregexpeditor/charselector.cpp')
-rw-r--r-- | kregexpeditor/charselector.cpp | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/kregexpeditor/charselector.cpp b/kregexpeditor/charselector.cpp new file mode 100644 index 0000000..27fd23d --- /dev/null +++ b/kregexpeditor/charselector.cpp @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2002-2003 Jesper K. Pedersen <blackie@kde.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License version 2 as published by the Free Software Foundation. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + **/ + +#ifdef QT_ONLY +#include "compat.h" +#else +#include <klocale.h> +#include "charselector.moc" +#endif + +#include "charselector.h" +#include "limitedcharlineedit.h" +#include "regexpconverter.h" +#include <qlayout.h> +#include <qwidgetstack.h> +#include <qcombobox.h> + +/** + In the class CharSelector, three LimitedCharLineEdit are used. + These widgets are all used in a QWidgetStack. The LimitedCharLineEdit + class is basically a QLineEdit, which is limited to a certain + number of characters. This conflicts with the QWidgetStack, as this + class expects the widgets on the stack to take up all space. + StackContainer fills in this gab. +*/ +class StackContainer :public QWidget +{ +public: + StackContainer( QWidget* child, QWidget* parent ) : QWidget( parent ) + { + QHBoxLayout* layout = new QHBoxLayout( this ); + child->reparent( this, QPoint(0,0), false ); + layout->addWidget( child ); + layout->addStretch( 1 ); + } +}; + +CharSelector::CharSelector( QWidget* parent, const char* name ) + :QWidget( parent, name ), _oldIndex(0) +{ + QStringList items; + QHBoxLayout* layout = new QHBoxLayout( this, 0, 6 ); + + _type = new QComboBox( this, "_type" ); + items << i18n("Normal Character") + << i18n("Unicode Char in Hex.") + << i18n("Unicode Char in Oct.") + << QString::fromLatin1("----") + << i18n("The Bell Character (\\a)") + << i18n("The Form Feed Character (\\f)") + << i18n("The Line Feed Character (\\n)") + << i18n("The Carriage Return Character (\\r)") + << i18n("The Horizontal Tab Character (\\t)") + << i18n("The Vertical Tab Character (\\v)"); + _type->insertStringList( items ); + layout->addWidget( _type ); + + _stack = new QWidgetStack( this, "_stack" ); + layout->addWidget( _stack ); + + _normal = new LimitedCharLineEdit( LimitedCharLineEdit::NORMAL, 0, "_normal" ); + _stack->addWidget( new StackContainer( _normal, _stack ), 0 ); + + _hex = new LimitedCharLineEdit( LimitedCharLineEdit::HEX, _stack, "_hex" ); + _stack->addWidget( new StackContainer( _hex, _stack ), 1 ); + + _oct = new LimitedCharLineEdit( LimitedCharLineEdit::OCT, _stack, "_oct" ); + _stack->addWidget( new StackContainer( _oct, _stack ), 2 ); + + _stack->raiseWidget( 0 ); + + connect( _type, SIGNAL( activated( int ) ), this, SLOT(slotNewItem( int ) ) ); +} + +void CharSelector::slotNewItem( int which ) +{ + _type->setCurrentItem( which ); + if ( which <= 2 ) { + _stack->raiseWidget( which ); + _normal->setEnabled( true ); + _hex->setEnabled( true ); + _oct->setEnabled( true ); + } + else if ( which == 3 ) { + _type->setCurrentItem( _oldIndex ); + slotNewItem(_oldIndex); + return; + } + else { + _normal->setEnabled( false ); + _hex->setEnabled( false ); + _oct->setEnabled( false ); + } + + _oldIndex = which; +} + +void CharSelector::setText( QString text ) +{ + // This is the best I can do about missing character range features, unless all of + // textrangeregexp is to be reworked. The problem is that textrangeregexp only allows to + // get the characters, which would be something like \a, but \a does not work with say Emacs + // style regexps -- ko28 Sep. 2003 10:55 -- Jesper K. Pedersen + bool enabled = ( RegExpConverter::current()->features() & RegExpConverter::ExtRange ); + _type->setEnabled( enabled ); + + if ( text.at(0) == QChar('\\') ) { + if ( text.at(1) == QChar('x') ) { + _hex->setText(text.mid(2)); + slotNewItem( 1 ); + } + else if ( text.at(1) == QChar('0') ) { + _oct->setText(text.mid(2)); + slotNewItem( 2 ); + } + else if ( text.at(1) == QChar('a') ) + slotNewItem(4); + else if ( text.at(1) == QChar('f') ) + slotNewItem(5); + else if ( text.at(1) == QChar('n') ) + slotNewItem(6); + else if ( text.at(1) == QChar('r') ) + slotNewItem(7); + else if ( text.at(1) == QChar('t') ) + slotNewItem(8); + else if ( text.at(1) == QChar('v') ) + slotNewItem(9); + else { + qWarning("Warning %s:%d Unknown escape %s", __FILE__, __LINE__, text.latin1() ); + } + } + else { + slotNewItem(0); + _normal->setText(text); + } +} + +bool CharSelector::isEmpty() const +{ + return ( _type->currentItem() == 0 && _normal->text().isEmpty() ) || + ( _type->currentItem() == 1 && _hex->text().isEmpty() ) || + ( _type->currentItem() == 2 && _oct->text().isEmpty() ); +} + +QString CharSelector::text() const +{ + switch ( _type->currentItem() ) { + case 0: // Normal Character + return _normal->text(); + case 1: // Hex + return QString::fromLocal8Bit("\\x") + _hex->text(); + case 2: // Oct + return QString::fromLocal8Bit("\\0") + _oct->text(); + case 3: // The seperator + break; + case 4: + return QString::fromLatin1("\\a"); + case 5: + return QString::fromLatin1("\\f"); + case 6: + return QString::fromLatin1("\\n"); + case 7: + return QString::fromLatin1("\\r"); + case 8: + return QString::fromLatin1("\\t"); + case 9: + return QString::fromLatin1("\\v"); + } + return QString::null; +} |