summaryrefslogtreecommitdiffstats
path: root/kregexpeditor/characterswidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kregexpeditor/characterswidget.cpp')
-rw-r--r--kregexpeditor/characterswidget.cpp447
1 files changed, 447 insertions, 0 deletions
diff --git a/kregexpeditor/characterswidget.cpp b/kregexpeditor/characterswidget.cpp
new file mode 100644
index 0000000..b219ed6
--- /dev/null
+++ b/kregexpeditor/characterswidget.cpp
@@ -0,0 +1,447 @@
+/*
+ * 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 <kdialogbase.h>
+ #include "characterswidget.moc"
+#endif
+
+#include "characterswidget.h"
+#include "textrangeregexp.h"
+#include "regexp.h"
+#include "charselector.h"
+#include "myfontmetrics.h"
+#include "regexpconverter.h"
+
+#include <qpainter.h>
+#include <qgrid.h>
+#include <iostream>
+#include <qhgroupbox.h>
+#include <qcursor.h>
+#include <qcheckbox.h>
+
+CharacterEdits* CharactersWidget::_configWindow = 0;
+
+CharactersWidget::CharactersWidget(RegExpEditorWindow* editorWindow, QWidget *parent,
+ const char *name)
+ : RegExpWidget(editorWindow, parent, name)
+{
+ _regexp = new TextRangeRegExp( false /* not used */);
+}
+
+CharactersWidget::CharactersWidget( TextRangeRegExp* regexp, RegExpEditorWindow* editorWindow,
+ QWidget* parent, const char* name )
+ : RegExpWidget( editorWindow, parent, name )
+{
+ _regexp = dynamic_cast<TextRangeRegExp*>( regexp->clone() );
+ Q_ASSERT( _regexp );
+}
+
+CharactersWidget::~CharactersWidget()
+{
+ delete _regexp;
+}
+
+
+QSize CharactersWidget::sizeHint() const
+{
+ QFontMetrics metrics = fontMetrics();
+ _textSize = HackCalculateFontSize(metrics, title());
+ // _textSize = metrics.size(0, title());
+
+ QSize headerSize = QSize(_textSize.width() + 4 * bdSize,
+ _textSize.height());
+
+ _contentSize = HackCalculateFontSize(metrics,text());
+ // _contentSize = metrics.size(0, text());
+
+ return QSize(QMAX(headerSize.width(), bdSize + _contentSize.width() + bdSize+ 2*pw),
+ headerSize.height() + bdSize + _contentSize.height() + bdSize + 2*pw);
+}
+
+void CharactersWidget::paintEvent(QPaintEvent *e)
+{
+ QSize mySize = sizeHint();
+
+ QPainter painter(this);
+ drawPossibleSelection( painter, mySize );
+
+ int center = _textSize.height()/2;
+ int offset = 0;
+
+ // draw the horizontal line and the label
+ painter.drawLine(pw,center, bdSize,center);
+ offset += pw + 2*bdSize;
+
+ painter.drawText(offset, 0, _textSize.width(), _textSize.height(), 0, title());
+ offset += _textSize.width() + bdSize;
+
+ painter.drawLine(offset, center, mySize.width(), center);
+
+ // Draw the rest of the lines
+ int y = mySize.width() - pw;
+ int x = mySize.height() -pw;
+ painter.drawLine(0,center,0,mySize.height());
+ painter.drawLine(y,center,y,mySize.height());
+ painter.drawLine(0,x,y,x);
+
+ // Draw the text
+ painter.drawText(bdSize, bdSize+_textSize.height(), _contentSize.width(),
+ _contentSize.height(), 0, text());
+
+ RegExpWidget::paintEvent(e);
+}
+
+RegExp* CharactersWidget::regExp() const
+{
+ RegExp* r = _regexp->clone();
+ r->setSelected( isSelected() );
+ return r;
+}
+
+QString CharactersWidget::text() const
+{
+ QString res = QString::fromLatin1("");
+
+ if (_regexp->wordChar())
+ res += i18n("- A word character\n");
+
+ if (_regexp->nonWordChar())
+ res += i18n("- A non-word character\n");
+
+ if (_regexp->digit())
+ res += i18n("- A digit character\n");
+
+ if (_regexp->nonDigit())
+ res += i18n("- A non-digit character\n");
+
+ if ( _regexp->space() )
+ res += i18n("- A space character\n");
+
+ if ( _regexp->nonSpace() )
+ res += i18n("- A non-space character\n");
+
+ // Single characters
+ QStringList chars = _regexp->chars();
+ if ( !chars.isEmpty() ) {
+ QString str = chars.join( QString::fromLocal8Bit(", ") );
+ res += QString::fromLocal8Bit("- ") + str + QString::fromLocal8Bit("\n");
+ }
+
+ // Ranges characters
+ QPtrList<StringPair> range = _regexp->range();
+ for ( QPtrListIterator<StringPair> it( range ); *it; ++it ) {
+ StringPair* elm = static_cast<StringPair*>(*it);
+ if (elm) {
+ QString fromText = elm->first();
+ QString toText = elm->second();
+
+ res += QString::fromLocal8Bit("- ") + i18n("from ") + fromText + i18n(" to ") + toText + QString::fromLocal8Bit("\n");
+ }
+ }
+ return res.left(res.length()-1);
+}
+
+
+QString CharactersWidget::title() const
+{
+ if (_regexp->negate())
+ return i18n("Any Character Except");
+ else
+ return i18n("One of Following Characters");
+}
+
+
+RegExpWidget* CharactersWidget::findWidgetToEdit( QPoint globalPos )
+{
+ if ( QRect(mapToGlobal(QPoint(0,0)), size()).contains( globalPos ) )
+ return this;
+ else
+ return 0;
+}
+
+int CharactersWidget::edit()
+{
+ if ( _configWindow == 0 ) {
+ QApplication::setOverrideCursor( WaitCursor );
+ // No parent here, as this window should continue to exists.
+ _configWindow = new CharacterEdits( 0, "CharactersWidget::_configWindow" );
+ QApplication::restoreOverrideCursor();
+ }
+
+ _configWindow->move(QCursor::pos() - QPoint(_configWindow->sizeHint().width()/2,
+ _configWindow->sizeHint().height()/2));
+ int ret = _configWindow->exec(_regexp );
+ if ( ret == QDialog::Accepted ) {
+ _editorWindow->updateContent( 0 );
+ update();
+ }
+ return ret;
+}
+
+void CharacterEdits::addCharacter( QString txt )
+{
+ KMultiFormListBoxEntryList list = _single->elements();
+ for ( QPtrListIterator<KMultiFormListBoxEntry> it(list); *it; ++it ) {
+ SingleEntry* entry = dynamic_cast<SingleEntry*>( *it );
+ if ( entry && entry->isEmpty() ) {
+ entry->setText( txt );
+ return;
+ }
+ }
+
+ SingleEntry* entry = new SingleEntry( _single );
+ entry->setText( txt );
+ _single->append( entry );
+}
+
+void CharacterEdits::addRange( QString from, QString to )
+{
+ KMultiFormListBoxEntryList list = _range->elements();
+ for ( QPtrListIterator<KMultiFormListBoxEntry> it(list); *it; ++it ) {
+ RangeEntry* entry = dynamic_cast<RangeEntry*>( *it );
+ if ( entry && entry->isEmpty() ) {
+ entry->setFrom( from );
+ entry->setTo( to );
+ return;
+ }
+ }
+
+ RangeEntry* entry = new RangeEntry( _range );
+ entry->setFrom( from );
+ entry->setTo( to );
+ _range->append( entry );
+}
+
+int CharacterEdits::exec( TextRangeRegExp* regexp )
+{
+ _regexp = regexp;
+ negate->setChecked( regexp->negate() );
+ digit->setChecked( regexp->digit() );
+ _nonDigit->setChecked( regexp->nonDigit() );
+ space->setChecked( regexp->space() );
+ _nonSpace->setChecked( regexp->nonSpace() );
+ wordChar->setChecked( regexp->wordChar() );
+ _nonWordChar->setChecked( regexp->nonWordChar() );
+
+ bool enabled = (RegExpConverter::current()->features() & RegExpConverter::CharacterRangeNonItems);
+ _nonWordChar->setEnabled( enabled );
+ _nonDigit->setEnabled( enabled );
+ _nonSpace->setEnabled( enabled );
+
+ // Characters
+
+ KMultiFormListBoxEntryList list1 = _single->elements();
+ for ( QPtrListIterator<KMultiFormListBoxEntry> it(list1); *it; ++it ) {
+ SingleEntry* entry = dynamic_cast<SingleEntry*>( *it );
+ if (entry)
+ entry->setText( QString::fromLocal8Bit("") );
+ }
+ QStringList list2 = regexp->chars();
+ for ( QStringList::Iterator it2( list2.begin() ); ! (*it2).isNull(); ++it2 ) {
+ addCharacter( *it2 );
+ }
+
+ // Ranges
+ KMultiFormListBoxEntryList list3 = _range->elements();
+ for ( QPtrListIterator<KMultiFormListBoxEntry> it3(list3); *it3; ++it3 ) {
+ RangeEntry* entry = dynamic_cast<RangeEntry*>( *it3 );
+ if (entry) {
+ entry->setFrom( QString::fromLocal8Bit("") );
+ entry->setTo( QString::fromLocal8Bit("") );
+ }
+ }
+
+ QPtrList<StringPair> ranges = regexp->range();
+ for ( QPtrListIterator<StringPair> it4(ranges); *it4; ++it4 ) {
+ QString from = (*it4)->first();
+ QString to = (*it4)->second();
+ addRange(from,to);
+ }
+
+ int res = KDialogBase::exec();
+ _regexp = 0;
+ return res;
+}
+
+
+CharacterEdits::CharacterEdits( QWidget *parent, const char *name)
+ : KDialogBase( parent, name == 0 ? "CharacterEdits" : name, true,
+ i18n("Specify Characters"),
+ KDialogBase::Ok | KDialogBase::Cancel)
+{
+ QWidget* top = new QWidget( this );
+ QVBoxLayout *topLayout = new QVBoxLayout(top, 6);
+ setMainWidget( top );
+
+ negate = new QCheckBox(i18n("Do not match the characters specified here"),
+ top);
+ topLayout->addWidget( negate );
+
+
+ // The predefined box
+ QHGroupBox* predefined = new QHGroupBox(i18n("Predefined Character Ranges"),top);
+ topLayout->addWidget(predefined);
+ QGrid* grid = new QGrid(3, predefined );
+
+ wordChar = new QCheckBox(i18n("A word character"),grid);
+ digit = new QCheckBox(i18n("A digit character"),grid);
+ space = new QCheckBox(i18n("A space character"), grid);
+
+ _nonWordChar = new QCheckBox(i18n("A non-word character"),grid);
+ _nonDigit = new QCheckBox(i18n("A non-digit character"),grid);
+ _nonSpace = new QCheckBox(i18n("A non-space character"), grid);
+
+ // Single characters
+ QVGroupBox* singleBox = new QVGroupBox(i18n("Single Characters"), top );
+ topLayout->addWidget( singleBox );
+ _single = new KMultiFormListBox(new SingleFactory(), KMultiFormListBox::MultiVisible,
+ singleBox);
+ _single->addElement(); _single->addElement(); _single->addElement();
+
+ QWidget* moreW = new QWidget( singleBox );
+ QHBoxLayout* moreLay = new QHBoxLayout( moreW );
+ QPushButton* more = new QPushButton( i18n("More Entries"), moreW );
+ moreLay->addWidget( more );
+ moreLay->addStretch( 1 );
+
+ connect(more,SIGNAL(clicked()), _single, SLOT(addElement()));
+
+ // Ranges
+ QVGroupBox* rangeBox = new QVGroupBox(i18n("Character Ranges"), top );
+ topLayout->addWidget( rangeBox );
+
+ _range = new KMultiFormListBox(new RangeFactory(), KMultiFormListBox::MultiVisible,
+ rangeBox);
+ _range->addElement(); _range->addElement(); _range->addElement();
+
+ moreW = new QWidget( rangeBox );
+ moreLay = new QHBoxLayout( moreW );
+ more = new QPushButton( i18n("More Entries"), moreW );
+ moreLay->addWidget( more );
+ moreLay->addStretch( 1 );
+ connect(more,SIGNAL(clicked()), _range, SLOT(addElement()));
+ // Buttons
+ connect(this, SIGNAL(okClicked()), this, SLOT(slotOK()));
+}
+
+void CharacterEdits::slotOK()
+{
+ _regexp->setNegate( negate->isChecked() );
+
+ _regexp->setWordChar( wordChar->isChecked() );
+ _regexp->setNonWordChar( _nonWordChar->isChecked() );
+
+ _regexp->setDigit( digit->isChecked() );
+ _regexp->setNonDigit( _nonDigit->isChecked() );
+
+ _regexp->setSpace( space->isChecked() );
+ _regexp->setNonSpace( _nonSpace->isChecked() );
+
+ // single characters
+ _regexp->clearChars();
+ KMultiFormListBoxEntryList list = _single->elements();
+ for ( QPtrListIterator<KMultiFormListBoxEntry> it( list ); *it; ++it ) {
+ SingleEntry* entry = dynamic_cast<SingleEntry*>(*it);
+ if ( entry && !entry->isEmpty() ) {
+ _regexp->addCharacter( entry->text() );
+ }
+ }
+
+ // Ranges
+ _regexp->clearRange();
+ list = _range->elements();
+ for ( QPtrListIterator<KMultiFormListBoxEntry> it2( list ); *it2; ++it2 ) {
+ RangeEntry* entry = dynamic_cast<RangeEntry*>(*it2);
+ if ( entry && !entry->isEmpty() ) {
+ _regexp->addRange( entry->fromText(), entry->toText() );
+ }
+ }
+}
+
+
+SingleEntry::SingleEntry(QWidget* parent, const char* name )
+ :KMultiFormListBoxEntry( parent, name )
+{
+ QHBoxLayout* layout = new QHBoxLayout( this, 3, 6 );
+ _selector = new CharSelector( this );
+ layout->addWidget( _selector );
+ layout->addStretch(1);
+}
+
+QString SingleEntry::text() const
+{
+ return _selector->text();
+}
+
+void SingleEntry::setText( QString text )
+{
+ _selector->setText( text );
+}
+
+bool SingleEntry::isEmpty() const
+{
+ return _selector->isEmpty();
+}
+
+
+RangeEntry::RangeEntry(QWidget* parent, const char* name )
+ :KMultiFormListBoxEntry( parent, name )
+{
+ QHBoxLayout* layout = new QHBoxLayout( this, 3, 6 );
+
+ QLabel* label = new QLabel(i18n("From:"), this );
+ _from = new CharSelector( this );
+ layout->addWidget( label );
+ layout->addWidget( _from );
+
+ layout->addStretch(1);
+
+ label = new QLabel(i18n("end of range","To:"), this );
+ _to = new CharSelector( this );
+ layout->addWidget( label );
+ layout->addWidget( _to );
+}
+
+QString RangeEntry::fromText() const
+{
+ return _from->text();
+}
+
+QString RangeEntry::toText() const
+{
+ return _to->text();
+}
+
+void RangeEntry::setFrom( QString text )
+{
+ _from->setText( text );
+}
+
+void RangeEntry::setTo( QString text )
+{
+ _to->setText( text );
+}
+
+bool RangeEntry::isEmpty() const
+{
+ return _from->isEmpty() || _to->isEmpty();
+}
+