Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
krename/krename/profiledlg.cpp

603 рядки
21 KiB

/***************************************************************************
profiledlg.cpp - description
-------------------
begin : Sat Nov 20 2004
copyright : (C) 2004 by Dominik Seichter
email : domseichter@web.de
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include "profiledlg.h"
#include "krenameimpl.h"
#include "kmyhistorycombo.h"
#include "pluginloader.h"
#include "kmylistbox.h"
#include <kapplication.h>
#include <kcombobox.h>
#include <kconfig.h>
#include <kiconloader.h>
#include <kinputdialog.h>
#include <klistbox.h>
#include <klocale.h>
#include <kmessagebox.h>
#include <kpushbutton.h>
#include <kstandarddirs.h>
#include <kurlrequester.h>
#include <tqcheckbox.h>
#include <tqdom.h>
#include <tqfile.h>
#include <tqlayout.h>
#include <tqpainter.h>
#include <tqradiobutton.h>
#include <tqtooltip.h>
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifndef VERSION
#define VERSION "unknown"
#endif
#define PROFILE_WIZARD_INDEX 0
#define PROFILE_TABBED_INDEX 1
#define PROFILE_WIZARD_NAME i18n("KRename: Wizard default profile")
#define PROFILE_TABBED_NAME i18n("KRename: Tabbed default profile")
class ProfileListBoxText : public TQListBoxText {
public:
ProfileListBoxText( const TQString & text = TQString() )
: TQListBoxText( text )
{
m_default = false;
}
inline bool isDefault() const {
return m_default;
}
inline void setDefault( const bool b ) {
m_default = b;
}
protected:
void paint( TQPainter* painter )
{
TQFont f = painter->font();
f.setBold( m_default );
painter->setFont( f );
TQListBoxText::paint( painter );
}
private:
bool m_default;
};
ProfileManager::ProfileManager( KRenameImpl* krename )
: m_krename( krename )
{
}
const TQString ProfileManager::readProfilePath( const TQString & name )
{
TQString path;
KConfig* conf = kapp->config();
conf->setGroup( "Profiles" );
path = conf->readEntry( name, TQString() );
return path;
}
const TQString ProfileManager::getProfilePath( const TQString & name )
{
TQStringList list;
if( name == PROFILE_WIZARD_NAME )
return locate( "data", "krename/krename_system_default_wizard.xml" );
else if( name == PROFILE_TABBED_NAME )
return locate( "data", "krename/krename_system_default_tabbed.xml" );
TQString path = locateLocal( "data", TQString( "krename/%1.xml" ).tqarg( name ) );
KConfig* conf = kapp->config();
conf->setGroup( "ProfilesHeader" );
list = conf->readListEntry( "list" );
if( !list.contains( name ) )
list.append( name );
conf->writeEntry( "list", list );
conf->setGroup( "Profiles" );
conf->writeEntry( name, path );
conf->sync();
return path;
}
void ProfileManager::writeXML( const TQString & name )
{
TQString path = getProfilePath( name );
TQFile file( path );
if( !file.open( IO_WriteOnly ) )
{
qDebug("Cannot write to: %s", path.latin1() );
return;
}
TQDomDocument doc( "KRenameProfile" );
TQDomElement root = doc.createElement( "krename" );
doc.appendChild( root );
TQDomElement v = doc.createElement( "version" );
v.setAttribute( "version", VERSION );
root.appendChild( v );
// General settings of Krename
TQDomElement settings = doc.createElement( "settings" );
settings.setAttribute( "wizard", m_krename->m_wizard );
settings.setAttribute( "fileplugins", m_krename->plugin->filePluginsLoaded() );
root.appendChild( settings );
// Filename settings
TQDomElement filename = doc.createElement( "filename" );
filename.setAttribute( "filename", m_krename->filename->text() );
filename.setAttribute( "extension", m_krename->extemplate->text() );
filename.setAttribute( "extension_enabled", m_krename->checkExtension->isChecked() );
filename.setAttribute( "extension_start", m_krename->comboExtension->currentItem() );
TQDomElement numbering = doc.createElement( "numbering" );
numbering.setAttribute( "start", m_krename->m_index );
numbering.setAttribute( "step", m_krename->m_step );
numbering.setAttribute( "skip", listToString( m_krename->skip ) );
numbering.setAttribute( "reset", m_krename->m_reset );
TQDomElement replace = doc.createElement( "replace" );
for( unsigned int i=0;i<m_krename->rep.count();i++)
{
TQDomElement r = doc.createElement( "item" );
r.setAttribute( "find", m_krename->rep[i].find );
r.setAttribute( "replace", m_krename->rep[i].replace );
r.setAttribute( "reg", m_krename->rep[i].reg );
replace.appendChild( r );
}
// destination settings
TQDomElement dest = doc.createElement( "destination" );
dest.setAttribute( "mode", m_krename->currentRenameMode() );
dest.setAttribute( "overwrite", TQString::number( m_krename->checkOverwrite->isChecked() ) );
dest.setAttribute( "directory", m_krename->dirname->text() );
dest.setAttribute( "undo", TQString::number( m_krename->checkUndoScript->isChecked() ) );
dest.setAttribute( "undoscript", m_krename->undorequester->url() );
// file adding settings
TQDomElement files = doc.createElement( "files" );
files.setAttribute( "sorting", TQString::number( m_krename->comboSort->currentItem() ) );
files.setAttribute( "preview", TQString::number( m_krename->checkPreview->isChecked() ) );
files.setAttribute( "names", TQString::number( m_krename->checkName->isChecked() ) );
filename.appendChild( replace );
filename.appendChild( numbering );
root.appendChild( settings );
root.appendChild( filename );
root.appendChild( dest );
root.appendChild( files );
TQCString xml = doc.toCString();
file.writeBlock( xml, xml.length() );
file.close();
}
bool ProfileManager::loadXML( const TQString & path )
{
TQFile file( path );
if( !file.open( IO_ReadOnly ) )
{
qDebug("Cannot read from: %s", path.latin1() );
return false;
}
TQDomDocument doc( "KRenameProfile" );
if ( !doc.setContent( &file ) )
{
file.close();
return false;
}
TQDomNode n = doc.documentElement().firstChild();
while( !n.isNull() )
{
TQDomElement e = n.toElement(); // try to convert the node to an element.
if( !e.isNull() )
{
if( e.tagName() == "settings" )
{
bool wiz, plug;
wiz = (bool)e.attribute( "wizard",
TQString( "%1" ).tqarg( m_krename->m_wizard ) ).toInt();
m_krename->setWizardMode( wiz );
// if( wiz != m_krename->m_wizard )
{
m_krename->m_wizard = wiz;
m_krename->changeGUIMode();
}
plug = (bool)e.attribute( "fileplugins",
TQString( "%1" ).tqarg( m_krename->plugin->filePluginsLoaded() ) ).toInt();
if( plug && !m_krename->plugin->filePluginsLoaded() )
m_krename->plugin->loadPlugins( true );
}
else if( e.tagName() == "filename" )
{
m_krename->filename->setText( e.attribute("filename", m_krename->filename->text() ) );
m_krename->extemplate->setText( e.attribute("extension", m_krename->extemplate->text() ) );
m_krename->checkExtension->setChecked(
(bool)e.attribute("extension_enabled",
TQString("%1").tqarg(m_krename->checkExtension->isChecked() ) ).toInt() );
m_krename->comboExtension->setCurrentItem(
e.attribute("extension_start",
TQString::number( m_krename->comboExtension->currentItem() ) ).toInt() );
TQDomNode n = e.firstChild();
while( !n.isNull() )
{
TQDomElement e = n.toElement(); // try to convert the node to an element.
if( !e.isNull() )
{
if( e.tagName() == "numbering" )
{
m_krename->m_index = e.attribute( "start", TQString::number( m_krename->m_index ) ).toInt();
m_krename->m_step = e.attribute( "step", TQString::number( m_krename->m_step ) ).toInt();
m_krename->skip = stringToList( e.attribute("skip", listToString( m_krename->skip ) ) );
m_krename->m_reset = (bool)e.attribute( "reset", TQString::number( (int)m_krename->m_reset ) ).toInt();
}
else if( e.tagName() == "replace" )
{
m_krename->rep.clear();
TQDomNode n = e.firstChild();
while( !n.isNull() )
{
TQDomElement e = n.toElement(); // try to convert the node to an element.
if( !e.isNull() && e.tagName() == "item" )
{
replacestrings r;
r.find = e.attribute( "find", TQString() );
r.replace = e.attribute( "replace", TQString() );
r.reg = (bool)e.attribute( "reg", "0" ).toInt();
m_krename->rep.append( r );
}
n = n.nextSibling();
}
}
}
n = n.nextSibling();
}
}
else if( e.tagName() == "destination" )
{
int mode = e.attribute( "mode", TQString::number( m_krename->currentRenameMode() ) ).toInt();
m_krename->optionRename->setChecked( false );
m_krename->optionCopy->setChecked( false );
m_krename->optionMove->setChecked( false );
m_krename->optionLink->setChecked( false );
switch( mode )
{
default:
case RENAME:
m_krename->optionRename->setChecked( true ); break;
case COPY:
m_krename->optionCopy->setChecked( true ); break;
case MOVE:
m_krename->optionMove->setChecked( true ); break;
case LINK:
m_krename->optionLink->setChecked( true ); break;
}
m_krename->checkOverwrite->setChecked( e.attribute( "overwrite",
TQString::number( m_krename->checkOverwrite->isChecked() ) ).toInt() );
m_krename->dirname->setText( e.attribute( "directory", m_krename->dirname->text() ) );
m_krename->checkUndoScript->setChecked( e.attribute( "undo",
TQString::number( m_krename->checkUndoScript->isChecked() ) ).toInt() );
m_krename->undorequester->setURL( e.attribute( "undoscript", m_krename->undorequester->url() ) );
}
else if( e.tagName() == "files" )
{
m_krename->comboSort->setCurrentItem( e.attribute( "sorting",
TQString::number( m_krename->comboSort->currentItem() ) ).toInt() );
m_krename->checkPreview->setChecked( e.attribute( "preview",
TQString::number( m_krename->checkPreview->isChecked() ) ).toInt() );
m_krename->checkName->setChecked( e.attribute( "names",
TQString::number( m_krename->checkName->isChecked() ) ).toInt() );
}
}
n = n.nextSibling();
}
if( m_krename->m_wizard )
m_krename->parseWizardMode();
file.close();
return true;
}
const TQString ProfileManager::listToString( TQValueList<int> & list )
{
TQString data;
for( unsigned int i = 0; i < list.count(); i++ )
data += TQString( "%1;" ).tqarg( list[i] );
return data;
}
const TQValueList<int> ProfileManager::stringToList( const TQString & data )
{
TQValueList<int> list;
int c = data.contains( ";" );
if( c > 0 )
{
for( int i = 0;i<c;i++)
list.append( data.section( ';', i, i ).toInt() );
}
return list;
}
bool ProfileManager::hasDefaultProfile()
{
KConfig* conf = kapp->config();
conf->setGroup( "ProfilesHeader" );
TQString def = conf->readEntry( "defprofile", TQString() );
return (!def.isEmpty());
}
void ProfileManager::loadDefaultProfile( KRenameImpl* krename )
{
KConfig* conf = kapp->config();
conf->setGroup( "ProfilesHeader" );
TQString def = conf->readEntry( "defprofile", TQString() );
if( !def.isEmpty() )
ProfileManager::loadProfile( def, krename );
}
void ProfileManager::loadProfile( const TQString & name, KRenameImpl* krename )
{
ProfileManager manager( krename );
manager.loadXML( manager.getProfilePath( name ) );
}
///////////////////////////////////////////////////////////////////////////////
ProfileDlg::ProfileDlg(KRenameImpl* krename, TQWidget *parent, const char *name)
: KDialogBase( KDialogBase::Plain, i18n("Profiles"),
KDialogBase::Close, KDialogBase::Close, parent, name, true, true ), ProfileManager( krename )
{
int i;
TQHBoxLayout* tqlayout = new TQHBoxLayout( plainPage(), 6, 6 );
TQVBoxLayout* button = new TQVBoxLayout( 0, 6, 6 );
profiles = new KListBox( plainPage() );
profiles->insertItem( new ProfileListBoxText( PROFILE_WIZARD_NAME ), PROFILE_WIZARD_INDEX );
profiles->insertItem( new ProfileListBoxText( PROFILE_TABBED_NAME ), PROFILE_TABBED_INDEX );
createProfile = new KPushButton( i18n("&Save As Profile..."), plainPage() );
loadProfile = new KPushButton( i18n("&Load Profile"), plainPage() );
deleteProfile = new KPushButton( i18n("&Delete Profile"), plainPage() );
checkDefault = new TQCheckBox( i18n("&Use as default profile on startup"), plainPage() );
createProfile->setIconSet( SmallIconSet( "filesaveas") );
loadProfile->setIconSet( SmallIconSet( "fileopen" ) );
deleteProfile->setIconSet( SmallIconSet( "edittrash" ) );
TQSpacerItem* spacer = new TQSpacerItem( 20, 20, TQSizePolicy::Expanding, TQSizePolicy::Expanding );
button->addWidget( createProfile );
button->addWidget( loadProfile );
button->addWidget( deleteProfile );
button->addItem( spacer );
button->addWidget( checkDefault );
tqlayout->addWidget( profiles );
tqlayout->addLayout( button );
tqlayout->setStretchFactor( profiles, 2 );
TQToolTip::add( createProfile, i18n("<qt>Save KRename's current settings as a new profile. "
"The settings are saved and can be restored with Load Profile later.</qt>" ) );
TQToolTip::add( loadProfile, i18n("<qt>Load all settings stored in this profile.</qt>") );
enableControls();
connect( createProfile, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotCreateProfile() ) );
connect( loadProfile, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotLoadProfile() ) );
connect( deleteProfile, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotDeleteProfile() ) );
connect( profiles, TQT_SIGNAL( selectionChanged () ), this, TQT_SLOT( enableControls() ) );
connect( checkDefault, TQT_SIGNAL( clicked() ), this, TQT_SLOT( slotSetDefault() ) );
connect( this, TQT_SIGNAL( hidden() ), this, TQT_SLOT( slotHidden() ) );
KConfig* conf = kapp->config();
conf->setGroup( "ProfilesHeader" );
ProfileListBoxText* item;
TQStringList list = conf->readListEntry( "list" );
TQString def = conf->readEntry( "defprofile", TQString() );
for( i=0;i<(int)list.count();i++ )
profiles->insertItem( new ProfileListBoxText( list[i] ) );
for( i=0;i<(int)profiles->count();i++ )
{
item = static_cast<ProfileListBoxText*>(profiles->item(i));
if( item->text() == def )
{
item->setDefault( true);
break;
}
}
profiles->repaintContents();
}
ProfileDlg::~ProfileDlg()
{
}
void ProfileDlg::enableControls()
{
ProfileListBoxText* item;
loadProfile->setEnabled( profiles->selectedItem() );
// Do not allow to delete the two default profiles
deleteProfile->setEnabled( profiles->selectedItem() &&
profiles->currentItem() != PROFILE_TABBED_INDEX && profiles->currentItem() != PROFILE_WIZARD_INDEX );
checkDefault->setEnabled( profiles->selectedItem() );
item = static_cast<ProfileListBoxText*>(profiles->selectedItem());
checkDefault->setChecked( item && item->isDefault() );
}
void ProfileDlg::slotSetDefault()
{
int i;
ProfileListBoxText* item;
for( i=0;i<(int)profiles->count();i++ )
{
item = static_cast<ProfileListBoxText*>(profiles->item( i ));
item->setDefault( false );
}
item = static_cast<ProfileListBoxText*>(profiles->selectedItem());
if( item )
item->setDefault( checkDefault->isChecked() );
profiles->repaintContents();
}
void ProfileDlg::slotLoadProfile()
{
TQString profile = profiles->currentText();
TQString msg = TQString( i18n("Do you really want to load the profile and overwrite the current settings: %1") ).tqarg( profile );
TQString path = getProfilePath( profile );
if( path.isEmpty() )
{
KMessageBox::error( this, i18n("The profile \"%1\" could not be found.").tqarg( profile ) );
return;
}
if( KMessageBox::questionYesNo( this, msg ) == KMessageBox::Yes )
{
if( loadXML( path ) )
this->close();
enableControls();
m_krename->enableControls();
m_krename->updatePre();
}
}
void ProfileDlg::slotCreateProfile()
{
bool ok = false;
const char* mask = "xXXXXXXXXXXXXXXXXXXX"; // allows for 20 characters
TQString name = KInputDialog::getText( i18n("Profile Name"), i18n("Please enter a name for the new profile:"),
"KRename", &ok, this, 0, 0, mask );
if( !ok )
return;
if( profiles->findItem( name, TQt::ExactMatch ) )
{
KMessageBox::error( this, i18n("This profile does already exist. Please choose another name.") );
slotCreateProfile();
return;
}
profiles->insertItem( new ProfileListBoxText( name ) );
writeXML( name );
enableControls();
}
void ProfileDlg::slotDeleteProfile()
{
if( profiles->currentItem() == PROFILE_WIZARD_INDEX || profiles->currentItem() == PROFILE_TABBED_INDEX )
{
KMessageBox::error( this, i18n("You cannot delete default profiles!") );
return;
}
TQString profile = profiles->currentText();
TQString msg = TQString( i18n("Do you really want to delete the profile: %1") ).tqarg( profile );
if( KMessageBox::questionYesNo( this, msg ) == KMessageBox::Yes )
{
TQString path = readProfilePath( profile );
TQFile::remove( path );
TQListBoxItem* item = profiles->findItem( profile, TQt::ExactMatch );
if( item )
delete item;
KConfig* conf = kapp->config();
conf->setGroup( "ProfilesHeader" );
TQStringList list = conf->readListEntry( "list" );
list.remove( profile );
conf->writeEntry( "list", list );
conf->sync();
enableControls();
}
}
void ProfileDlg::slotHidden()
{
int i;
KConfig* conf = kapp->config();
TQString def = TQString();
ProfileListBoxText* item;
for( i=0;i<(int)profiles->count();i++ )
{
item = static_cast<ProfileListBoxText*>(profiles->item( i ));
if( item->isDefault() )
{
def = profiles->text( i );
break;
}
}
conf->setGroup( "ProfilesHeader" );
conf->writeEntry( "defprofile", def );
conf->sync();
}
#include "profiledlg.moc"