diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 2bda8f7717adf28da4af0d34fb82f63d2868c31d (patch) | |
tree | 8d927b7b47a90c4adb646482a52613f58acd6f8c /khexedit/stringdialog.cc | |
download | tdeutils-2bda8f7717adf28da4af0d34fb82f63d2868c31d.tar.gz tdeutils-2bda8f7717adf28da4af0d34fb82f63d2868c31d.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdeutils@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'khexedit/stringdialog.cc')
-rw-r--r-- | khexedit/stringdialog.cc | 412 |
1 files changed, 412 insertions, 0 deletions
diff --git a/khexedit/stringdialog.cc b/khexedit/stringdialog.cc new file mode 100644 index 0000000..dff774c --- /dev/null +++ b/khexedit/stringdialog.cc @@ -0,0 +1,412 @@ +/* + * khexedit - Versatile hex editor + * Copyright (C) 1999-2000 Espen Sand, espensa@online.no + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include <qcheckbox.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qlineedit.h> +#include <qspinbox.h> + +#include <kconfig.h> +#include <kglobalsettings.h> +#include <klocale.h> +#include <kmessagebox.h> + +#include "listview.h" +#include "stringdialog.h" +#include <qpushbutton.h> + + +CStringDialog::CStringDialog( QWidget *parent, const char *name, bool modal ) + : KDialogBase( Plain, i18n("Extract Strings"), Help|User1|Cancel, User1, + parent, name, modal, true, i18n("&Update") ), + mMaxLength(0), mBusy(false), mDirty(false) +{ + setHelp( "khexedit/khexedit.html", QString::null ); + + QString text; + QVBoxLayout *topLayout = new QVBoxLayout( plainPage(), 0, spacingHint() ); + + QGridLayout *glay = new QGridLayout( 3, 3, spacingHint() ); + topLayout->addLayout( glay ); + glay->setColStretch( 1, 10 ); + + mLengthSpin = new QSpinBox( plainPage() ); + mLengthSpin->setMinimumWidth( fontMetrics().maxWidth()*17 ); + mLengthSpin->setRange( 1, 1000000 ); + mLengthSpin->setValue( 4 ); + glay->addMultiCellWidget( mLengthSpin, 0, 0, 1, 2 ); + + text = i18n("&Minimum length:"); + QLabel *label = new QLabel( mLengthSpin, text, plainPage() ); + glay->addWidget( label, 0, 0, AlignRight ); + + mFilter = new QLineEdit( plainPage() ); + mFilter->setMinimumWidth( fontMetrics().maxWidth()*17 ); + mFilter->setText("*"); + glay->addWidget( mFilter, 1, 1 ); + + text = i18n("&Filter:"); + label = new QLabel( mFilter, text, plainPage() ); + glay->addWidget( label, 1, 0, AlignRight ); + + QPushButton *useButton = new QPushButton( plainPage(), "use" ); + useButton->setText( i18n("&Use") ); + useButton->setAutoDefault( false ); + connect( useButton, SIGNAL(clicked()),this,SLOT(slotUser1()) ); + glay->addWidget( useButton, 1, 2 ); + + QWidget *helper = new QWidget( plainPage() ); + glay->addMultiCellWidget( helper, 2, 2, 1, 2 ); + QHBoxLayout *hlay = new QHBoxLayout( helper, 0, spacingHint() ); + + text = i18n("&Ignore case"); + mIgnoreCaseCheck = new QCheckBox( text, helper ); + hlay->addWidget( mIgnoreCaseCheck ); + + text = i18n("Show offset as &decimal"); + mOffsetDecimalCheck = new QCheckBox( text, helper ); + hlay->addWidget( mOffsetDecimalCheck ); + + hlay->addStretch(10); + + // + // Using listview as suggested by Dima Rogozin <dima@mercury.co.il> + // + mStringList = new CListView( plainPage(), "stringList" ); + mStringList->setFont( KGlobalSettings::fixedFont() ); + mStringList->addColumn( i18n("Offset") ); + mStringList->addColumn( i18n("String") ); + mStringList->setAllColumnsShowFocus( true ); + mStringList->setFrameStyle( QFrame::WinPanel + QFrame::Sunken ); + + connect( mStringList, SIGNAL(selectionChanged()), + SLOT(selectionChanged())); + topLayout->addWidget( mStringList, 10 ); + + hlay = new QHBoxLayout( topLayout ); + + text = i18n("Number of strings:"); + label = new QLabel( text, plainPage() ); + hlay->addWidget( label, AlignLeft ); + + mListSizeLabel = new QLabel( QString(), plainPage() ); + mListSizeLabel->setFixedWidth( fontMetrics().maxWidth()*10 ); + hlay->addWidget( mListSizeLabel, AlignLeft|AlignHCenter ); + + text = i18n("Displayed:"); + label = new QLabel( text, plainPage() ); + hlay->addWidget( label, AlignLeft ); + + mDisplaySizeLabel = new QLabel( QString(""), plainPage() ); + mDisplaySizeLabel->setFixedWidth( fontMetrics().maxWidth()*10 ); + hlay->addWidget( mDisplaySizeLabel, AlignLeft|AlignHCenter); + + hlay->addStretch( 10 ); + + mDirtyLabel = new QLabel( plainPage() ); + topLayout->addWidget( mDirtyLabel ); + + readConfiguration(); + + // + // The initial width of the columns are set in updateListInfo() + // + updateListInfo(); + mStringList->setVisibleItem( 15 ); + startTimer(100); +} + + +CStringDialog::~CStringDialog( void ) +{ + writeConfiguration(); +} + + +void CStringDialog::showEvent( QShowEvent *e ) +{ + KDialogBase::showEvent(e); + mLengthSpin->setFocus(); +} + + +void CStringDialog::readConfiguration( void ) +{ + KConfig &config = *kapp->config(); + config.setGroup( "String Dialog" ); + + mLengthSpin->setValue( config.readNumEntry("MinimumLength", 4) ); + mFilter->setText( config.readEntry("FilterText", "*") ); + mIgnoreCaseCheck->setChecked( config.readBoolEntry("IgnoreCase", false) ); + mOffsetDecimalCheck->setChecked( + config.readBoolEntry("OffsetAsDecimal", false ) ); +} + + +void CStringDialog::writeConfiguration( void ) +{ + KConfig &config = *kapp->config(); + config.setGroup( "String Dialog" ); + + config.writeEntry( "MinimumLength", mLengthSpin->value() ); + config.writeEntry( "FilterText", mFilter->text() ); + config.writeEntry( "IgnoreCase", mIgnoreCaseCheck->isChecked() ); + config.writeEntry( "OffsetAsDecimal", mOffsetDecimalCheck->isChecked() ); + config.sync(); +} + + +void CStringDialog::slotUser1( void ) // Start +{ + if( mBusy == true ) + { + return; + } + + mRegExp.setCaseSensitive( mIgnoreCaseCheck->isChecked() == false ); + mRegExp.setWildcard( true ); + if( mFilter->text().isEmpty() == true ) + { + mRegExp.setPattern("*"); + } + else + { + mRegExp.setPattern(mFilter->text()); + } + + if( mRegExp.isValid() == false ) + { + QString msg = i18n("" + "The filter expression you have specified is illegal. " + "You must specify a valid regular expression.\n" + "Continue without filter?"); + int reply = KMessageBox::warningContinueCancel( this, msg, i18n("Extract Strings")); + if( reply != KMessageBox::Continue ) + { + return; + } + mRegExp.setPattern( "*"); + } + + + mStringData.minLength = mLengthSpin->value(); + mStringData.decimalOffset = mOffsetDecimalCheck->isChecked(); + + removeList(); + + mBusy = true; + emit collect(); + mBusy = false; +} + + +void CStringDialog::startGoto( QListViewItem *item ) +{ + QString str_offset = item->text(0); + QString string = item->text(1); + + uint offset; + if( stringData().decimalOffset == true ) + { + // sscanf( str_offset.ascii(), "%u", &offset ); + offset = str_offset.toInt(); + } + else + { + uint val1,val2; + // #### Rewrite it do it doesn't need the .ascii() call + sscanf( str_offset.ascii(), "%X:%X", &val1, &val2 ); + offset = (val1<<16) + val2; + } + + uint size = string.length(); + + emit markText( offset, size, true ); +} + + +void CStringDialog::setDirty( void ) +{ + if( mDirty == true ) + { + return; + } + + mDirtyLabel->setText( + i18n("Warning: Document has been modified since last update")); + mDirty = true; +} + + +void CStringDialog::setClean( void ) +{ + if( mDirty == false ) + { + return; + } + + mDirtyLabel->setText(""); + mDirty = false; +} + + +void CStringDialog::selectionChanged() +{ + killTimers(); + startTimer( 200 ); +} + + +void CStringDialog::timerEvent( QTimerEvent * ) +{ + killTimers(); + + QListViewItem *item = mStringList->currentItem(); + if( item == 0 ) + { + slotUser1(); + return; + } + startGoto( item ); +} + + +void CStringDialog::resizeEvent( QResizeEvent * ) +{ + setColumnWidth(); +} + + + +int CStringDialog::updateList( CProgress &p ) +{ + clearList(); + enableList( false ); + + int offsetLen = stringData().offsetLen(); + + QPtrList<QString> &list = stringData().list(); + for( const QString *str = list.first(); str != 0; str = list.next() ) + { + appendListItem( *str, offsetLen ); + mMaxLength = QMAX( mMaxLength, str->length() ); + + if( p.expired() == true ) + { + int errCode = p.step( (float)list.at()/(float)list.count() ); + if( errCode == Err_Stop ) + { + p.finish(); + return( Err_Success ); + } + } + } + + p.finish(); + updateListInfo(); + enableList( true ); + + return( Err_Success ); +} + + + + +void CStringDialog::clearList( void ) +{ + if( mStringList->childCount() > 0 ) + { + mStringList->clear(); + mStringList->update(); + } + mMaxLength = 0; + + updateListInfo(); + setClean(); +} + + +void CStringDialog::removeList( void ) +{ + mStringData.clear(); + clearList(); +} + + +void CStringDialog::enableList( bool state ) +{ + mStringList->setEnabled( state ); + if( state == true ) + { + mStringList->update(); + } +} + + +void CStringDialog::appendListItem( const QString &str, uint offsetLen ) +{ + if( mRegExp.search ( str, offsetLen ) != -1 ) + { + new QListViewItem( mStringList, str.left(offsetLen), str.mid(offsetLen) ); + } +} + + +void CStringDialog::updateListInfo( void ) +{ + mListSizeLabel->setText( QString("%1").arg(mStringData.count()) ); + mDisplaySizeLabel->setText( QString("%1").arg(mStringList->childCount()) ); + setColumnWidth(); +} + + + +void CStringDialog::setColumnWidth( void ) +{ + const QFontMetrics &fm = mStringList->fontMetrics(); + + if( mStringData.count() == 0 ) + { + int w1 = fm.maxWidth() * (stringData().offsetLen() + 2); + int w2 = mStringList->viewport()->width() - w1; + mStringList->setColumnWidth( 0, w1 ); + mStringList->setColumnWidth( 1, w2 ); + } + else + { + int w1 = fm.maxWidth() * (stringData().offsetLen() + 2); + int w2 = fm.maxWidth() * mMaxLength - w1; + if( w2 < 0 ) + { + w2 = mStringList->viewport()->width() - w1; + } + + mStringList->setColumnWidth( 0, w1 ); + mStringList->setColumnWidth( 1, w2 ); + } +} + + + + + + +#include "stringdialog.moc" |