summaryrefslogtreecommitdiffstats
path: root/kregexpeditor/userdefinedregexps.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kregexpeditor/userdefinedregexps.cpp')
-rw-r--r--kregexpeditor/userdefinedregexps.cpp266
1 files changed, 266 insertions, 0 deletions
diff --git a/kregexpeditor/userdefinedregexps.cpp b/kregexpeditor/userdefinedregexps.cpp
new file mode 100644
index 0000000..de2f675
--- /dev/null
+++ b/kregexpeditor/userdefinedregexps.cpp
@@ -0,0 +1,266 @@
+/*
+ * 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 <klineeditdlg.h>
+ #include <klocale.h>
+ #include <kmessagebox.h>
+ #include <kstandarddirs.h>
+ #include <kdebug.h>
+ #include "userdefinedregexps.moc"
+#endif
+
+#include "userdefinedregexps.h"
+#include <qheader.h>
+#include <qpopupmenu.h>
+#include <qdir.h>
+#include "widgetfactory.h"
+#include "compoundregexp.h"
+#include <qlayout.h>
+#include <qlabel.h>
+
+UserDefinedRegExps::UserDefinedRegExps( QWidget *parent, const char *name )
+ : QDockWindow( QDockWindow::InDock, parent, name)
+{
+ QWidget* top = new QWidget( this );
+ QVBoxLayout* lay = new QVBoxLayout( top, 6 );
+ lay->setAutoAdd( true );
+
+ QLabel* label = new QLabel( i18n("Compound regular expressions:"), top );
+
+ // This is to avoid that the label set the minimum width for the window.
+ label->setMinimumSize(1,0);
+
+ _userDefined = new QListView( top, "UserDefinedRegExps::_userDefined" );
+ _userDefined->addColumn( QString::null );
+ _userDefined->header()->hide();
+ // _userDefined->setRootIsDecorated( true );
+ setWidget( top );
+ slotPopulateUserRegexps();
+
+ connect( _userDefined, SIGNAL(clicked(QListViewItem*)), this, SLOT(slotLoad(QListViewItem*)) );
+ connect( _userDefined, SIGNAL(rightButtonPressed(QListViewItem*,const QPoint&, int )),
+ this, SLOT( slotEdit( QListViewItem*, const QPoint& ) ) );
+}
+
+void UserDefinedRegExps::slotPopulateUserRegexps()
+{
+ _userDefined->clear();
+ _regExps.clear();
+
+ createItems( i18n("User Defined"), WidgetWinItem::path(), true );
+
+#ifdef QT_ONLY
+ QStringList dirs;
+ dirs << QString::fromLatin1( "predefined" );
+#else
+ QStringList dirs = KGlobal::dirs()->findDirs( "data", QString::fromLocal8Bit("kregexpeditor/predefined/") );
+#endif
+
+ for ( QStringList::iterator it1 = dirs.begin(); it1 != dirs.end(); ++it1 ) {
+ QDir dir( *it1, QString::null, QDir::Name, QDir::Dirs );
+ QStringList subdirs = dir.entryList();
+ for ( QStringList::iterator it2 = subdirs.begin(); it2 != subdirs.end(); ++it2 ) {
+ if ( *it2 == QString::fromLocal8Bit(".") || *it2 == QString::fromLocal8Bit("..") )
+ continue;
+ createItems( *it2, *it1 + QString::fromLocal8Bit("/") + *it2, false );
+ }
+ }
+
+}
+
+void UserDefinedRegExps::createItems( const QString& _title, const QString& dir, bool usersRegExp )
+{
+ QString title = _title;
+ if (_title == QString::fromLatin1("general"))
+ title = i18n("General");
+
+ QListViewItem* lvItem = new QListViewItem( _userDefined, title );
+ lvItem->setOpen( true );
+
+ QDir directory( dir );
+ QStringList files = directory.entryList( QString::fromLocal8Bit("*.regexp") );
+ for ( QStringList::Iterator it = files.begin(); it != files.end(); ++it ) {
+ QString fileName = dir + QString::fromLocal8Bit("/") + *it;
+
+ QFile file( fileName );
+ if ( ! file.open(IO_ReadOnly) ) {
+ KMessageBox::sorry( this, i18n("Could not open file for reading: %1").arg(fileName) );
+ continue;
+ }
+
+ QTextStream stream( &file );
+ QString data = stream.read();
+ file.close();
+
+ RegExp* regexp = WidgetFactory::createRegExp( data );
+ if ( ! regexp ) {
+ KMessageBox::sorry( this, i18n("File %1 containing user defined regular expression contained an error").arg( fileName ) );
+ continue;
+ }
+
+ new WidgetWinItem( *it, regexp, usersRegExp, lvItem );
+
+ // Insert the regexp into the list of compound regexps
+ if ( regexp->type() == RegExp::COMPOUND ) {
+ CompoundRegExp* cregexp = dynamic_cast<CompoundRegExp*>( regexp );
+ if ( cregexp && cregexp->allowReplace() )
+ _regExps.append( cregexp );
+ }
+ }
+}
+
+const QPtrList<CompoundRegExp> UserDefinedRegExps::regExps() const
+{
+ return _regExps;
+}
+
+
+void UserDefinedRegExps::slotUnSelect()
+{
+ _userDefined->clearSelection();
+}
+
+void UserDefinedRegExps::slotLoad(QListViewItem* item)
+{
+ if ( !item || ! dynamic_cast<WidgetWinItem*>(item) ) {
+ // Mouse pressed outside a widget.
+ return;
+ }
+
+ WidgetWinItem* wwi = dynamic_cast<WidgetWinItem*>(item);
+ if (wwi) {
+ emit load( wwi->regExp() );
+ }
+}
+
+void UserDefinedRegExps::slotEdit( QListViewItem* item, const QPoint& pos )
+{
+ QPopupMenu* menu = new QPopupMenu( this );
+ menu->insertItem(i18n("Delete"), 1 );
+ menu->insertItem(i18n("Rename..."), 2 );
+ if ( !item || ! dynamic_cast<WidgetWinItem*>( item ) ) {
+ // menu not selected on an item
+ menu->setItemEnabled( 1, false );
+ menu->setItemEnabled( 2, false );
+ }
+ else {
+ // Only allow rename and delete of users own regexps.
+ WidgetWinItem* winItem = dynamic_cast<WidgetWinItem*>( item );
+ if ( winItem && ! winItem->isUsersRegExp() ) {
+ menu->setItemEnabled( 1, false );
+ menu->setItemEnabled( 2, false );
+ }
+ }
+
+ int which = menu->exec( pos );
+
+ if ( which == 1 ) { // Delete
+ WidgetWinItem* winItem = dynamic_cast<WidgetWinItem*>( item );
+ Q_ASSERT( winItem );
+ QFile file( winItem->fileName() );
+ Q_ASSERT( file.exists() );
+ file.remove();
+ delete item;
+ }
+ else if ( which == 2 ) { // Rename
+ WidgetWinItem* winItem = dynamic_cast<WidgetWinItem*>( item );
+ Q_ASSERT( winItem );
+
+ QString oldFile = winItem->fileName();
+ QString oldName = winItem->name();
+
+ QString txt;
+#ifdef QT_ONLY
+ txt = QInputDialog::getText( tr("Rename Regular Expression"), tr("New name:") );
+#else
+ KLineEditDlg dlg(i18n("New name:"), oldName, this);
+ dlg.setCaption(i18n("Rename Item"));
+ bool ok = dlg.exec();
+ if ( ok )
+ txt = dlg.text();
+#endif
+ if ( !txt.isNull() && oldName != txt ) {
+ QString fileName = WidgetWinItem::path() + QString::fromLocal8Bit("/") + txt + QString::fromLocal8Bit(".regexp");
+ QFileInfo finfo( fileName );
+ if ( finfo.exists() ) {
+ int answer = KMessageBox::warningYesNo( this, i18n("<p>Overwrite named regular expression <b>%1</b>?</p>").arg(txt), QString::null, i18n("Overwrite"), i18n("Do Not Overwrite") );
+ if ( answer != KMessageBox::Yes )
+ return;
+
+ // An item with this name already exists.
+ delete winItem;
+ }
+ else
+ winItem->setName( txt );
+ QDir dir;
+ dir.rename( oldFile, fileName );
+ }
+ }
+
+
+ delete menu;
+}
+
+void UserDefinedRegExps::slotSelectNewAction()
+{
+ slotUnSelect();
+}
+
+WidgetWinItem::WidgetWinItem( QString fileName, RegExp* regexp, bool usersRegExp, QListViewItem* parent )
+ :QListViewItem( parent ), _regexp( regexp ), _usersRegExp ( usersRegExp )
+{
+ int index = fileName.findRev(QString::fromLocal8Bit(".regexp"));
+ _name = fileName.left(index);
+
+ setText( 0, _name );
+}
+
+QString WidgetWinItem::fileName() const
+{
+ return path() + QString::fromLocal8Bit("/") +_name + QString::fromLocal8Bit(".regexp");
+}
+
+RegExp* WidgetWinItem::regExp() const
+{
+ return _regexp;
+}
+
+QString WidgetWinItem::name() const
+{
+ return _name;
+}
+
+void WidgetWinItem::setName( const QString& nm )
+{
+ _name = nm;
+ setText( 0, nm );
+}
+
+QString WidgetWinItem::path()
+{
+#ifdef QT_ONLY
+ return QString::fromLatin1( "predefined" );
+#else
+ return locateLocal("data", QString::fromLocal8Bit("KRegExpEditor/"));
+#endif
+}
+
+
+