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.
326 lines
9.7 KiB
326 lines
9.7 KiB
/***************************************************************************
|
|
* *
|
|
* Copyright (C) 2005, 2006 by Kevin Gilbert *
|
|
* kev.gilbert@cdu.edu.au *
|
|
* *
|
|
* 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., *
|
|
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#include <ntqlabel.h>
|
|
#include <ntqlayout.h>
|
|
#include <ntqlineedit.h>
|
|
#include <ntqlistbox.h>
|
|
#include <ntqmap.h>
|
|
#include <ntqpopupmenu.h>
|
|
|
|
#include <tdeapplication.h>
|
|
#include <tdeconfig.h>
|
|
#include <kdebug.h>
|
|
#include <kinputdialog.h>
|
|
#include <tdelocale.h>
|
|
#include <tdemessagebox.h>
|
|
|
|
#include "profiledialog.h"
|
|
|
|
// constructor
|
|
// ===========
|
|
|
|
ProfileDialog::ProfileDialog( Action action,
|
|
const TQString& currentProfile,
|
|
TQWidget* parent,
|
|
const char* name )
|
|
: KDialogBase( Plain, "", Ok | Cancel, Ok, parent, name ),
|
|
m_action( action )
|
|
{ switch( m_action )
|
|
{ case Copy: setCaption( "Copy profile" ); break;
|
|
case Delete: setCaption( "Delete profile" ); break;
|
|
case Load: setCaption( "Load profile" ); break;
|
|
case Rename: setCaption( "Rename profile" ); break;
|
|
case SaveAs: setCaption( "Save profile as" ); break;
|
|
}
|
|
|
|
createlayout( );
|
|
setInitialValues( currentProfile );
|
|
|
|
connect( m_profileListBox, SIGNAL( contextMenuRequested( TQListBoxItem*, const TQPoint& )), SLOT( slotProfileListContextMenu( TQListBoxItem*, const TQPoint& )));
|
|
connect( m_profileListBox, SIGNAL( doubleClicked( TQListBoxItem* )), SLOT( slotOk( )));
|
|
connect( m_profileListBox, SIGNAL( selectionChanged( )), SLOT( slotProfileListBoxChanged( )));
|
|
}
|
|
|
|
// checkForDuplicateName
|
|
// =====================
|
|
|
|
bool ProfileDialog::checkForDuplicateName( const TQString& profileName )
|
|
{ if( !kapp->config( )->hasGroup( PROFILE_PREFIX + profileName ))
|
|
return true;
|
|
|
|
KMessageBox::sorry( this, TQString( i18n( "Profile \"%1\" already exists, please choose another name or press 'Cancel'" )).arg( profileName ), i18n( "Duplicate profile name" ));
|
|
return false;
|
|
}
|
|
|
|
// constructNewProfileName
|
|
// =======================
|
|
|
|
TQString ProfileDialog::constructNewProfileName( const TQString& initialProfileName ) const
|
|
{ TQString profileName = PROFILE_PREFIX + initialProfileName + "_copy";
|
|
|
|
while( kapp->config( )->hasGroup( profileName ))
|
|
profileName += "_copy";
|
|
|
|
return stripPrefix( profileName );
|
|
}
|
|
|
|
// copy
|
|
// ====
|
|
|
|
void ProfileDialog::copy( const TQString& fromProfileName, const TQString& toProfileName )
|
|
{ TQMap<TQString, TQString> map = kapp->config( )->entryMap( PROFILE_PREFIX + fromProfileName );
|
|
kapp->config( )->setGroup( PROFILE_PREFIX + toProfileName );
|
|
|
|
for( TQMap<TQString, TQString>::Iterator it = map.begin( ); it != map.end( ); ++it )
|
|
kapp->config( )->writeEntry( it.key( ), it.data( ));
|
|
|
|
m_profileListBox->insertItem( toProfileName );
|
|
m_profileListBox->sort( );
|
|
}
|
|
|
|
// createlayout
|
|
// ============
|
|
|
|
void ProfileDialog::createlayout( )
|
|
{ TQGridLayout* layout = new TQGridLayout( plainPage( ));
|
|
m_profileListBox = new TQListBox( plainPage( ), "profiles list box" );
|
|
m_profileLineEdit = new TQLineEdit( plainPage( ), "profiles line edit" );
|
|
|
|
layout->addWidget( new TQLabel( "Profile name: ", plainPage( ), "name label" ), 1, 1, TQt::AlignRight );
|
|
layout->addWidget( m_profileLineEdit, 1, 2 );
|
|
layout->addWidget( new TQLabel( "Known profiles: ", plainPage( ), "name label" ), 3, 1, TQt::AlignRight | TQt::AlignTop );
|
|
layout->addWidget( m_profileListBox, 3, 2 );
|
|
|
|
layout->setColStretch( 0, 1 );
|
|
layout->setColStretch( 2, 20 );
|
|
layout->setColStretch( 3, 1 );
|
|
|
|
layout->setRowStretch( 0, 2 );
|
|
layout->setRowStretch( 2, 1 );
|
|
layout->setRowStretch( 3, 10 );
|
|
layout->setRowStretch( 4, 2 );
|
|
|
|
switch( m_action )
|
|
{ case Delete:
|
|
case Load:
|
|
m_profileLineEdit->setReadOnly( true );
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
// deelete
|
|
// =======
|
|
|
|
void ProfileDialog::deelete( const TQString& profileName, const bool ask )
|
|
{ if( !kapp->config( )->hasGroup( PROFILE_PREFIX + profileName ))
|
|
{ ASSERT( false );
|
|
return ;
|
|
}
|
|
|
|
TQListBoxItem* item = m_profileListBox->findItem( profileName, TQt::ExactMatch );
|
|
ASSERT( item != NULL );
|
|
|
|
if( item != NULL )
|
|
deelete( item, ask );
|
|
}
|
|
|
|
// deelete
|
|
// =======
|
|
|
|
void ProfileDialog::deelete( TQListBoxItem* item, const bool ask )
|
|
{ if( ask && KMessageBox::Yes != KMessageBox::questionYesNo( this,
|
|
TQString( i18n( "Delete profile \"%1\"?" )).arg( item->text( )),
|
|
i18n( "Confirm profile deletion" )))
|
|
return;
|
|
|
|
kapp->config( )->deleteGroup( PROFILE_PREFIX + item->text( ));
|
|
m_profileListBox->takeItem( item );
|
|
delete item;
|
|
}
|
|
|
|
// getNewProfileName
|
|
// =================
|
|
|
|
bool ProfileDialog::getNewProfileName( TQString& profileName )
|
|
{ while( true )
|
|
{ bool ok;
|
|
profileName = KInputDialog::getText( i18n( "Profile name" ), i18n( "New profile name" ), profileName, &ok, this, "profile name" );
|
|
|
|
if( !ok )
|
|
return false;
|
|
|
|
if( checkForDuplicateName( profileName ))
|
|
break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// setInitialValues
|
|
// ================
|
|
|
|
void ProfileDialog::setInitialValues( const TQString& currentProfile )
|
|
{ ushort currentItem = ushort( -1 );
|
|
TQStringList profileList = kapp->config( )->groupList( );
|
|
ushort i;
|
|
TQStringList::Iterator it;
|
|
|
|
for( i = 0, it = profileList.begin( ); it != profileList.end( ); ++it )
|
|
if( (*it).startsWith( PROFILE_PREFIX ))
|
|
{ m_profileListBox->insertItem( stripPrefix( *it ), i );
|
|
|
|
if( *it == currentProfile )
|
|
currentItem = i;
|
|
|
|
i++;
|
|
}
|
|
|
|
if( currentItem != ushort( -1 ))
|
|
{ m_profileListBox->setSelected( currentItem, true );
|
|
|
|
if( m_action == Copy )
|
|
m_profileLineEdit->setText( constructNewProfileName( m_profileListBox->currentText( )));
|
|
else
|
|
m_profileLineEdit->setText( m_profileListBox->currentText( ));
|
|
}
|
|
|
|
m_profileListBox->sort( );
|
|
}
|
|
|
|
// slotCopy
|
|
// ========
|
|
|
|
void ProfileDialog::slotCopy( )
|
|
{ TQString fromProfileName = m_contextItem->text( );
|
|
TQString toProfileName = constructNewProfileName( fromProfileName );
|
|
|
|
if( getNewProfileName( toProfileName ))
|
|
copy( fromProfileName, toProfileName );
|
|
}
|
|
|
|
// slotDelete
|
|
// ==========
|
|
|
|
void ProfileDialog::slotDelete( )
|
|
{ deelete( m_contextItem, true );
|
|
}
|
|
|
|
// slotOk
|
|
// ======
|
|
|
|
void ProfileDialog::slotOk( )
|
|
{ TQString fromProfileName;
|
|
TQListBoxItem* item;
|
|
TQString toProfileName;
|
|
|
|
switch( m_action )
|
|
{ case Copy:
|
|
fromProfileName = m_profileListBox->currentText( );
|
|
toProfileName = m_profileLineEdit->text( );
|
|
|
|
if( !checkForDuplicateName( toProfileName ))
|
|
return;
|
|
|
|
copy( fromProfileName, toProfileName );
|
|
break;
|
|
|
|
case Delete:
|
|
deelete( m_profileLineEdit->text( ), true );
|
|
break;
|
|
|
|
case Load:
|
|
m_profileName = PROFILE_PREFIX + m_profileLineEdit->text( );
|
|
break;
|
|
|
|
case Rename:
|
|
fromProfileName = m_profileListBox->currentText( );
|
|
toProfileName = m_profileLineEdit->text( );
|
|
|
|
if( !checkForDuplicateName( toProfileName ))
|
|
return;
|
|
|
|
copy( fromProfileName, toProfileName );
|
|
deelete( fromProfileName, false );
|
|
break;
|
|
|
|
case SaveAs:
|
|
m_profileName = m_profileLineEdit->text( );
|
|
item = m_profileListBox->findItem( m_profileName, TQt::ExactMatch );
|
|
|
|
if( item != NULL )
|
|
if( KMessageBox::Yes != KMessageBox::questionYesNo( this, TQString( i18n( "Profile \"%1\" already exists - overwrite it?" )).arg( m_profileName ), i18n( "Profile exists" )))
|
|
return;
|
|
|
|
m_profileName = PROFILE_PREFIX + m_profileName;
|
|
break;
|
|
}
|
|
|
|
KDialogBase::slotOk( );
|
|
}
|
|
|
|
// slotProfileListBoxChanged
|
|
// =========================
|
|
|
|
void ProfileDialog::slotProfileListBoxChanged( )
|
|
{ if( m_action == Copy )
|
|
m_profileLineEdit->setText( constructNewProfileName( m_profileListBox->currentText( )));
|
|
else
|
|
m_profileLineEdit->setText( m_profileListBox->currentText( ));
|
|
}
|
|
|
|
// slotProfileListContextMenu
|
|
// ==========================
|
|
|
|
void ProfileDialog::slotProfileListContextMenu( TQListBoxItem* item, const TQPoint& pos )
|
|
{ m_contextItem = item;
|
|
TQPopupMenu* contextMenu = new TQPopupMenu( this, "context menu" );
|
|
|
|
contextMenu->insertItem( i18n( "&Copy" ), this, SLOT( slotCopy( )));
|
|
contextMenu->insertItem( i18n( "&Delete" ), this, SLOT( slotDelete( )));
|
|
contextMenu->insertItem( i18n( "&Rename" ), this, SLOT( slotRename( )));
|
|
|
|
contextMenu->exec( pos );
|
|
}
|
|
|
|
// slotRename
|
|
// ==========
|
|
|
|
void ProfileDialog::slotRename( )
|
|
{ TQString profileName = m_contextItem->text( );
|
|
|
|
if( getNewProfileName( profileName ))
|
|
{ copy( m_contextItem->text( ), profileName );
|
|
deelete( m_contextItem, false );
|
|
}
|
|
}
|
|
|
|
// stripPrefix
|
|
// ===========
|
|
|
|
TQString ProfileDialog::stripPrefix( const TQString& profileName ) const
|
|
{ return profileName.right( profileName.length( ) - strlen( PROFILE_PREFIX ));
|
|
}
|