You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeutils/kregexpeditor/userdefinedregexps.cpp

267 lines
7.8 KiB

/*
* 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 TQT_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 <tqheader.h>
#include <tqpopupmenu.h>
#include <tqdir.h>
#include "widgetfactory.h"
#include "compoundregexp.h"
#include <tqlayout.h>
#include <tqlabel.h>
UserDefinedRegExps::UserDefinedRegExps( TQWidget *parent, const char *name )
: TQDockWindow( TQDockWindow::InDock, parent, name)
{
TQWidget* top = new TQWidget( this );
TQVBoxLayout* lay = new TQVBoxLayout( top, 6 );
lay->setAutoAdd( true );
TQLabel* label = new TQLabel( 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 TQListView( top, "UserDefinedRegExps::_userDefined" );
_userDefined->addColumn( TQString() );
_userDefined->header()->hide();
// _userDefined->setRootIsDecorated( true );
setWidget( top );
slotPopulateUserRegexps();
connect( _userDefined, TQT_SIGNAL(clicked(TQListViewItem*)), this, TQT_SLOT(slotLoad(TQListViewItem*)) );
connect( _userDefined, TQT_SIGNAL(rightButtonPressed(TQListViewItem*,const TQPoint&, int )),
this, TQT_SLOT( slotEdit( TQListViewItem*, const TQPoint& ) ) );
}
void UserDefinedRegExps::slotPopulateUserRegexps()
{
_userDefined->clear();
_regExps.clear();
createItems( i18n("User Defined"), WidgetWinItem::path(), true );
#ifdef TQT_ONLY
TQStringList dirs;
dirs << TQString::fromLatin1( "predefined" );
#else
TQStringList dirs = KGlobal::dirs()->findDirs( "data", TQString::fromLocal8Bit("kregexpeditor/predefined/") );
#endif
for ( TQStringList::iterator it1 = dirs.begin(); it1 != dirs.end(); ++it1 ) {
TQDir dir( *it1, TQString(), TQDir::Name, TQDir::Dirs );
TQStringList subdirs = dir.entryList();
for ( TQStringList::iterator it2 = subdirs.begin(); it2 != subdirs.end(); ++it2 ) {
if ( *it2 == TQString::fromLocal8Bit(".") || *it2 == TQString::fromLocal8Bit("..") )
continue;
createItems( *it2, *it1 + TQString::fromLocal8Bit("/") + *it2, false );
}
}
}
void UserDefinedRegExps::createItems( const TQString& _title, const TQString& dir, bool usersRegExp )
{
TQString title = _title;
if (_title == TQString::fromLatin1("general"))
title = i18n("General");
TQListViewItem* lvItem = new TQListViewItem( _userDefined, title );
lvItem->setOpen( true );
TQDir directory( dir );
TQStringList files = directory.entryList( TQString::fromLocal8Bit("*.regexp") );
for ( TQStringList::Iterator it = files.begin(); it != files.end(); ++it ) {
TQString fileName = dir + TQString::fromLocal8Bit("/") + *it;
TQFile file( fileName );
if ( ! file.open(IO_ReadOnly) ) {
KMessageBox::sorry( this, i18n("Could not open file for reading: %1").arg(fileName) );
continue;
}
TQTextStream stream( &file );
TQString 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 TQPtrList<CompoundRegExp> UserDefinedRegExps::regExps() const
{
return _regExps;
}
void UserDefinedRegExps::slotUnSelect()
{
_userDefined->clearSelection();
}
void UserDefinedRegExps::slotLoad(TQListViewItem* 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( TQListViewItem* item, const TQPoint& pos )
{
TQPopupMenu* menu = new TQPopupMenu( 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 );
TQFile 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 );
TQString oldFile = winItem->fileName();
TQString oldName = winItem->name();
TQString txt;
#ifdef TQT_ONLY
txt = TQInputDialog::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 ) {
TQString fileName = WidgetWinItem::path() + TQString::fromLocal8Bit("/") + txt + TQString::fromLocal8Bit(".regexp");
TQFileInfo finfo( fileName );
if ( finfo.exists() ) {
int answer = KMessageBox::warningYesNo( this, i18n("<p>Overwrite named regular expression <b>%1</b>?</p>").arg(txt), TQString(), i18n("Overwrite"), i18n("Do Not Overwrite") );
if ( answer != KMessageBox::Yes )
return;
// An item with this name already exists.
delete winItem;
}
else
winItem->setName( txt );
TQDir dir;
dir.rename( oldFile, fileName );
}
}
delete menu;
}
void UserDefinedRegExps::slotSelectNewAction()
{
slotUnSelect();
}
WidgetWinItem::WidgetWinItem( TQString fileName, RegExp* regexp, bool usersRegExp, TQListViewItem* parent )
:TQListViewItem( parent ), _regexp( regexp ), _usersRegExp ( usersRegExp )
{
int index = fileName.findRev(TQString::fromLocal8Bit(".regexp"));
_name = fileName.left(index);
setText( 0, _name );
}
TQString WidgetWinItem::fileName() const
{
return path() + TQString::fromLocal8Bit("/") +_name + TQString::fromLocal8Bit(".regexp");
}
RegExp* WidgetWinItem::regExp() const
{
return _regexp;
}
TQString WidgetWinItem::name() const
{
return _name;
}
void WidgetWinItem::setName( const TQString& nm )
{
_name = nm;
setText( 0, nm );
}
TQString WidgetWinItem::path()
{
#ifdef TQT_ONLY
return TQString::fromLatin1( "predefined" );
#else
return locateLocal("data", TQString::fromLocal8Bit("KRegExpEditor/"));
#endif
}