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.
469 lines
16 KiB
469 lines
16 KiB
15 years ago
|
/***************************************************************************
|
||
|
packguibase.cpp
|
||
|
-------------------
|
||
|
copyright : (C) 2000 by Shie Erlich & Rafi Yanai
|
||
|
e-mail : krusader@users.sourceforge.net
|
||
|
web site : http://krusader.sourceforge.net
|
||
|
---------------------------------------------------------------------------
|
||
|
Description
|
||
|
***************************************************************************
|
||
|
|
||
|
A
|
||
|
|
||
|
db dD d8888b. db db .d8888. .d8b. d8888b. d88888b d8888b.
|
||
|
88 ,8P' 88 `8D 88 88 88' YP d8' `8b 88 `8D 88' 88 `8D
|
||
|
88,8P 88oobY' 88 88 `8bo. 88ooo88 88 88 88ooooo 88oobY'
|
||
|
88`8b 88`8b 88 88 `Y8b. 88~~~88 88 88 88~~~~~ 88`8b
|
||
|
88 `88. 88 `88. 88b d88 db 8D 88 88 88 .8D 88. 88 `88.
|
||
|
YP YD 88 YD ~Y8888P' `8888Y' YP YP Y8888D' Y88888P 88 YD
|
||
|
|
||
|
S o u r c e F i l e
|
||
|
|
||
|
***************************************************************************
|
||
|
* *
|
||
|
* 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 "packguibase.h"
|
||
|
|
||
|
#include <qcheckbox.h>
|
||
|
#include <qcombobox.h>
|
||
|
#include <qlabel.h>
|
||
|
#include <qlineedit.h>
|
||
|
#include <qpushbutton.h>
|
||
|
#include <qtoolbutton.h>
|
||
|
#include <qlayout.h>
|
||
|
#include <qvariant.h>
|
||
|
#include <qtooltip.h>
|
||
|
#include <qwhatsthis.h>
|
||
|
#include <qimage.h>
|
||
|
#include <qpixmap.h>
|
||
|
#include <qspinbox.h>
|
||
|
#include <qslider.h>
|
||
|
#include <qhbox.h>
|
||
|
#include <qvbox.h>
|
||
|
#include <kiconloader.h>
|
||
|
#include <kglobalsettings.h>
|
||
|
#include <kcombobox.h>
|
||
|
#include <kmessagebox.h>
|
||
|
#include <kio/global.h>
|
||
|
#include "../krusader.h"
|
||
|
|
||
|
/*
|
||
|
* Constructs a PackGUIBase which is a child of 'parent', with the
|
||
|
* name 'name' and widget flags set to 'f'
|
||
|
*
|
||
|
* The dialog will by default be modeless, unless you set 'modal' to
|
||
|
* TRUE to construct a modal dialog.
|
||
|
*/
|
||
|
PackGUIBase::PackGUIBase( QWidget* parent, const char* name, bool modal, WFlags fl )
|
||
|
: QDialog( parent, name, modal, fl ), expanded( false )
|
||
|
{
|
||
|
if ( !name )
|
||
|
setName( "PackGUIBase" );
|
||
|
resize( 430, 140 );
|
||
|
setCaption( i18n( "Pack" ) );
|
||
|
grid = new QGridLayout( this );
|
||
|
grid->setSpacing( 6 );
|
||
|
grid->setMargin( 11 );
|
||
|
|
||
|
hbox = new QHBoxLayout;
|
||
|
hbox->setSpacing( 6 );
|
||
|
hbox->setMargin( 0 );
|
||
|
|
||
|
TextLabel3 = new QLabel( this, "TextLabel3" );
|
||
|
TextLabel3->setText( i18n( "To archive" ) );
|
||
|
hbox->addWidget( TextLabel3 );
|
||
|
|
||
|
nameData = new QLineEdit( this, "nameData" );
|
||
|
hbox->addWidget( nameData );
|
||
|
|
||
|
typeData = new QComboBox( FALSE, this, "typeData" );
|
||
|
typeData->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0 ) );
|
||
|
connect( typeData, SIGNAL( activated( const QString & ) ), this, SLOT( checkConsistency() ) );
|
||
|
connect( typeData, SIGNAL( highlighted( const QString & ) ), this, SLOT( checkConsistency() ) );
|
||
|
hbox->addWidget( typeData );
|
||
|
|
||
|
grid->addLayout( hbox, 1, 0 );
|
||
|
|
||
|
hbox_2 = new QHBoxLayout;
|
||
|
hbox_2->setSpacing( 6 );
|
||
|
hbox_2->setMargin( 0 );
|
||
|
|
||
|
TextLabel5 = new QLabel( this, "TextLabel5" );
|
||
|
TextLabel5->setText( i18n( "In directory" ) );
|
||
|
hbox_2->addWidget( TextLabel5 );
|
||
|
|
||
|
dirData = new QLineEdit( this, "dirData" );
|
||
|
hbox_2->addWidget( dirData );
|
||
|
|
||
|
browseButton = new QToolButton( this, "browseButton" );
|
||
|
browseButton->setIconSet( SmallIcon( "fileopen" ) );
|
||
|
hbox_2->addWidget( browseButton );
|
||
|
QSpacerItem* spacer = new QSpacerItem( 48, 20, QSizePolicy::Fixed, QSizePolicy::Fixed );
|
||
|
hbox_2->addItem( spacer );
|
||
|
|
||
|
grid->addLayout( hbox_2, 2, 0 );
|
||
|
|
||
|
hbox_3 = new QHBoxLayout;
|
||
|
hbox_3->setSpacing( 6 );
|
||
|
hbox_3->setMargin( 0 );
|
||
|
|
||
|
PixmapLabel1 = new QLabel( this, "PixmapLabel1" );
|
||
|
PixmapLabel1->setPixmap( krLoader->loadIcon("package", KIcon::Desktop, 32) );
|
||
|
PixmapLabel1->setScaledContents( TRUE );
|
||
|
PixmapLabel1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0 ) );
|
||
|
hbox_3->addWidget( PixmapLabel1 );
|
||
|
|
||
|
TextLabel1 = new QLabel( this, "TextLabel1" );
|
||
|
TextLabel1->setText( i18n( "Pack" ) );
|
||
|
hbox_3->addWidget( TextLabel1 );
|
||
|
|
||
|
grid->addLayout( hbox_3, 0, 0 );
|
||
|
|
||
|
|
||
|
hbox_4 = new QHBoxLayout;
|
||
|
hbox_4->setSpacing( 6 );
|
||
|
hbox_4->setMargin( 0 );
|
||
|
|
||
|
QSpacerItem* spacer_3 = new QSpacerItem( 20, 26, QSizePolicy::Fixed, QSizePolicy::Expanding );
|
||
|
hbox_4->addItem( spacer_3 );
|
||
|
grid->addLayout( hbox_4, 3, 0 );
|
||
|
|
||
|
advancedWidget = new QWidget( this, "advancedWidget" );
|
||
|
|
||
|
hbox_5 = new QGridLayout( advancedWidget );
|
||
|
hbox_5->setSpacing( 6 );
|
||
|
hbox_5->setMargin( 0 );
|
||
|
|
||
|
|
||
|
QVBoxLayout *compressLayout = new QVBoxLayout;
|
||
|
compressLayout->setSpacing( 6 );
|
||
|
compressLayout->setMargin( 0 );
|
||
|
|
||
|
multipleVolume = new QCheckBox( i18n( "Multiple volume archive" ), advancedWidget, "multipleVolume" );
|
||
|
connect( multipleVolume, SIGNAL( toggled( bool ) ), this, SLOT( checkConsistency() ) );
|
||
|
compressLayout->addWidget( multipleVolume, 0, 0 );
|
||
|
|
||
|
QHBoxLayout * volumeHbox = new QHBoxLayout;
|
||
|
|
||
|
QSpacerItem* spacer_5 = new QSpacerItem( 20, 26, QSizePolicy::Fixed, QSizePolicy::Fixed );
|
||
|
volumeHbox->addItem( spacer_5 );
|
||
|
|
||
|
TextLabel7 = new QLabel( i18n("Size:" ), advancedWidget, "TextLabel7" );
|
||
|
volumeHbox->addWidget( TextLabel7 );
|
||
|
|
||
|
volumeSpinBox = new QSpinBox( advancedWidget, "volumeSpinBox" );
|
||
|
volumeSpinBox->setMinValue( 1 );
|
||
|
volumeSpinBox->setMaxValue( 9999 );
|
||
|
volumeSpinBox->setValue( 1440 );
|
||
|
volumeHbox->addWidget( volumeSpinBox );
|
||
|
|
||
|
volumeUnitCombo = new QComboBox( FALSE, advancedWidget, "volumeUnitCombo" );
|
||
|
volumeUnitCombo->insertItem( "B" );
|
||
|
volumeUnitCombo->insertItem( "KB" );
|
||
|
volumeUnitCombo->insertItem( "MB" );
|
||
|
volumeUnitCombo->setCurrentItem( 1 );
|
||
|
volumeHbox->addWidget( volumeUnitCombo );
|
||
|
|
||
|
compressLayout->addLayout ( volumeHbox );
|
||
|
|
||
|
setCompressionLevel = new QCheckBox( i18n( "Set compression level" ), advancedWidget, "multipleVolume" );
|
||
|
connect( setCompressionLevel, SIGNAL( toggled( bool ) ), this, SLOT( checkConsistency() ) );
|
||
|
compressLayout->addWidget( setCompressionLevel, 0, 0 );
|
||
|
|
||
|
QHBoxLayout * sliderHbox = new QHBoxLayout;
|
||
|
|
||
|
QSpacerItem* spacer_6 = new QSpacerItem( 20, 26, QSizePolicy::Fixed, QSizePolicy::Fixed );
|
||
|
sliderHbox->addItem( spacer_6 );
|
||
|
|
||
|
QVBox * sliderVBox = new QVBox( advancedWidget );
|
||
|
|
||
|
compressionSlider = new QSlider( 1, 9, 1, 5, Qt::Horizontal, sliderVBox, "compressionSlider" );
|
||
|
compressionSlider->setTickmarks( QSlider::Below );
|
||
|
|
||
|
QHBox * minmaxHBox = new QHBox( sliderVBox );
|
||
|
minLabel = new QLabel( i18n("MIN"), minmaxHBox );
|
||
|
maxLabel = new QLabel( i18n("MAX"), minmaxHBox );
|
||
|
maxLabel->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
|
||
|
|
||
|
sliderHbox->addWidget( sliderVBox );
|
||
|
|
||
|
compressLayout->addLayout( sliderHbox );
|
||
|
|
||
|
compressLayout->addStretch( 0 );
|
||
|
hbox_5->addLayout( compressLayout, 0, 0 );
|
||
|
|
||
|
QFrame *vline = new QFrame( advancedWidget, "vline" );
|
||
|
vline->setFrameStyle( QFrame::VLine | QFrame::Sunken );
|
||
|
vline->setMinimumWidth( 20 );
|
||
|
hbox_5->addWidget( vline, 0, 1 );
|
||
|
|
||
|
|
||
|
QGridLayout * passwordGrid = new QGridLayout;
|
||
|
passwordGrid->setSpacing( 6 );
|
||
|
passwordGrid->setMargin( 0 );
|
||
|
|
||
|
TextLabel4 = new QLabel( advancedWidget, "TextLabel4" );
|
||
|
TextLabel4->setText( i18n( "Password" ) );
|
||
|
passwordGrid->addWidget( TextLabel4, 0, 0 );
|
||
|
|
||
|
password = new QLineEdit( advancedWidget, "password" );
|
||
|
password->setEchoMode( QLineEdit::Password );
|
||
|
connect( password, SIGNAL( textChanged ( const QString & ) ), this, SLOT( checkConsistency() ) );
|
||
|
|
||
|
passwordGrid->addWidget( password, 0, 1 );
|
||
|
|
||
|
TextLabel6 = new QLabel( advancedWidget, "TextLabel6" );
|
||
|
TextLabel6->setText( i18n( "Again" ) );
|
||
|
passwordGrid->addWidget( TextLabel6, 1, 0 );
|
||
|
|
||
|
passwordAgain = new QLineEdit( advancedWidget, "password" );
|
||
|
passwordAgain->setEchoMode( QLineEdit::Password );
|
||
|
connect( passwordAgain, SIGNAL( textChanged ( const QString & ) ), this, SLOT( checkConsistency() ) );
|
||
|
|
||
|
passwordGrid->addWidget( passwordAgain, 1, 1 );
|
||
|
|
||
|
QHBoxLayout *consistencyHbox = new QHBoxLayout;
|
||
|
|
||
|
QSpacerItem* spacer_cons = new QSpacerItem( 48, 20, QSizePolicy::Expanding, QSizePolicy::Fixed );
|
||
|
consistencyHbox->addItem( spacer_cons );
|
||
|
|
||
|
passwordConsistencyLabel = new QLabel( advancedWidget, "passwordConsistencyLabel" );
|
||
|
consistencyHbox->addWidget( passwordConsistencyLabel );
|
||
|
passwordGrid->addMultiCellLayout ( consistencyHbox, 2, 2, 0, 1 );
|
||
|
|
||
|
encryptHeaders = new QCheckBox( i18n( "Encrypt headers" ), advancedWidget, "encryptHeaders" );
|
||
|
passwordGrid->addMultiCellWidget ( encryptHeaders, 3, 3, 0, 1 );
|
||
|
|
||
|
QSpacerItem* spacer_psw = new QSpacerItem( 20, 20, QSizePolicy::Fixed, QSizePolicy::Expanding );
|
||
|
passwordGrid->addItem( spacer_psw, 4, 0 );
|
||
|
|
||
|
hbox_5->addLayout( passwordGrid, 0, 2 );
|
||
|
|
||
|
hbox_7 = new QHBoxLayout;
|
||
|
hbox_7->setSpacing( 6 );
|
||
|
hbox_7->setMargin( 0 );
|
||
|
|
||
|
TextLabel8 = new QLabel( i18n( "Command line switches:" ), advancedWidget, "TextLabel8" );
|
||
|
TextLabel8->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
|
||
|
hbox_7->addWidget( TextLabel8 );
|
||
|
|
||
|
commandLineSwitches = new KHistoryCombo( advancedWidget, "commandLineSwitches" );
|
||
|
commandLineSwitches->setMaxCount(25); // remember 25 items
|
||
|
commandLineSwitches->setDuplicatesEnabled(false);
|
||
|
krConfig->setGroup("Archives");
|
||
|
QStringList list = krConfig->readListEntry("Command Line Switches");
|
||
|
commandLineSwitches->setHistoryItems(list);
|
||
|
|
||
|
hbox_7->addWidget( commandLineSwitches );
|
||
|
|
||
|
hbox_5->addMultiCellLayout( hbox_7, 1, 1, 0, 2 );
|
||
|
|
||
|
|
||
|
advancedWidget->hide();
|
||
|
checkConsistency();
|
||
|
|
||
|
grid->addWidget( advancedWidget, 4, 0 );
|
||
|
|
||
|
hbox_6 = new QHBoxLayout;
|
||
|
hbox_6->setSpacing( 6 );
|
||
|
hbox_6->setMargin( 0 );
|
||
|
|
||
|
advancedButton = new QPushButton( this, "advancedButton" );
|
||
|
advancedButton->setText( i18n( "&Advanced" ) + " >>" );
|
||
|
hbox_6->addWidget( advancedButton );
|
||
|
|
||
|
QSpacerItem* spacer_2 = new QSpacerItem( 140, 20, QSizePolicy::Expanding, QSizePolicy::Fixed );
|
||
|
hbox_6->addItem( spacer_2 );
|
||
|
|
||
|
okButton = new QPushButton( this, "okButton" );
|
||
|
okButton->setText( i18n( "Ok" ) );
|
||
|
okButton->setDefault( true );
|
||
|
hbox_6->addWidget( okButton );
|
||
|
|
||
|
cancelButton = new QPushButton( this, "cancelButton" );
|
||
|
cancelButton->setText( i18n( "Cancel" ) );
|
||
|
hbox_6->addWidget( cancelButton );
|
||
|
|
||
|
grid->addLayout( hbox_6, 6, 0 );
|
||
|
|
||
|
// signals and slots connections
|
||
|
connect( okButton, SIGNAL( clicked() ), this, SLOT( accept() ) );
|
||
|
connect( advancedButton, SIGNAL( clicked() ), this, SLOT( expand() ) );
|
||
|
connect( cancelButton, SIGNAL( clicked() ), this, SLOT( reject() ) );
|
||
|
connect( browseButton, SIGNAL( clicked() ), this, SLOT( browse() ) );
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Destroys the object and frees any allocated resources
|
||
|
*/
|
||
|
PackGUIBase::~PackGUIBase()
|
||
|
{
|
||
|
// no need to delete child widgets, Qt does it all for us
|
||
|
}
|
||
|
|
||
|
void PackGUIBase::browse()
|
||
|
{
|
||
|
qWarning( "PackGUIBase::browse(): Not implemented yet!" );
|
||
|
}
|
||
|
|
||
|
void PackGUIBase::expand() {
|
||
|
expanded = !expanded;
|
||
|
|
||
|
advancedButton->setText( i18n( "&Advanced" ) + ( expanded ? " <<" : " >>" ) );
|
||
|
|
||
|
if( expanded )
|
||
|
advancedWidget->show();
|
||
|
else {
|
||
|
advancedWidget->hide();
|
||
|
layout()->activate();
|
||
|
QSize minSize = minimumSize();
|
||
|
resize( width(), minSize.height() );
|
||
|
}
|
||
|
show();
|
||
|
}
|
||
|
|
||
|
void PackGUIBase::checkConsistency() {
|
||
|
if( password->text().isEmpty() && passwordAgain->text().isEmpty()) {
|
||
|
passwordConsistencyLabel->setPaletteForegroundColor( KGlobalSettings::textColor() );
|
||
|
passwordConsistencyLabel->setText( i18n( "No password specified" ) );
|
||
|
}
|
||
|
else
|
||
|
if( password->text() == passwordAgain->text() ) {
|
||
|
passwordConsistencyLabel->setPaletteForegroundColor( KGlobalSettings::textColor() );
|
||
|
passwordConsistencyLabel->setText( i18n( "The passwords are equal" ) );
|
||
|
}
|
||
|
else {
|
||
|
passwordConsistencyLabel->setPaletteForegroundColor( Qt::red );
|
||
|
passwordConsistencyLabel->setText( i18n( "The passwords are different" ) );
|
||
|
}
|
||
|
|
||
|
QString packer = typeData->currentText();
|
||
|
|
||
|
bool passworded = false;
|
||
|
if( packer == "7z" || packer == "rar" || packer == "zip" || packer == "arj" )
|
||
|
passworded = true;
|
||
|
|
||
|
passwordConsistencyLabel->setEnabled( passworded );
|
||
|
password->setEnabled( passworded );
|
||
|
passwordAgain->setEnabled( passworded );
|
||
|
TextLabel4->setEnabled( passworded );
|
||
|
TextLabel6->setEnabled( passworded );
|
||
|
|
||
|
encryptHeaders->setEnabled( packer == "rar" );
|
||
|
|
||
|
multipleVolume->setEnabled( packer == "rar" || packer == "arj" );
|
||
|
bool volumeEnabled = multipleVolume->isEnabled() && multipleVolume->isChecked();
|
||
|
volumeSpinBox->setEnabled( volumeEnabled );
|
||
|
volumeUnitCombo->setEnabled( volumeEnabled );
|
||
|
TextLabel7->setEnabled( volumeEnabled );
|
||
|
|
||
|
/* TODO */
|
||
|
setCompressionLevel->setEnabled( packer == "rar" || packer == "arj" || packer == "zip" ||
|
||
|
packer == "7z" );
|
||
|
bool sliderEnabled = setCompressionLevel->isEnabled() && setCompressionLevel->isChecked();
|
||
|
compressionSlider->setEnabled( sliderEnabled );
|
||
|
minLabel->setEnabled( sliderEnabled );
|
||
|
maxLabel->setEnabled( sliderEnabled );
|
||
|
}
|
||
|
|
||
|
bool PackGUIBase::extraProperties( QMap<QString,QString> & inMap ) {
|
||
|
inMap.clear();
|
||
|
|
||
|
if( password->isEnabled() && passwordAgain->isEnabled() ) {
|
||
|
if( password->text() != passwordAgain->text() ) {
|
||
|
KMessageBox::error( this, i18n( "Cannot pack! The passwords are different!" ) );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if( !password->text().isEmpty() ) {
|
||
|
inMap[ "Password" ] = password->text();
|
||
|
|
||
|
if( encryptHeaders->isEnabled() && encryptHeaders->isChecked() )
|
||
|
inMap[ "EncryptHeaders" ] = "1";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if( multipleVolume->isEnabled() && multipleVolume->isChecked() ) {
|
||
|
KIO::filesize_t size = volumeSpinBox->value();
|
||
|
|
||
|
switch( volumeUnitCombo->currentItem() ) {
|
||
|
case 2:
|
||
|
size *= 1000;
|
||
|
case 1:
|
||
|
size *= 1000;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if( size < 10000 ) {
|
||
|
KMessageBox::error( this, i18n( "Invalid volume size!" ) );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
QString sbuffer;
|
||
|
sbuffer.sprintf("%llu",size);
|
||
|
|
||
|
inMap[ "VolumeSize" ] = sbuffer;
|
||
|
}
|
||
|
|
||
|
if( setCompressionLevel->isEnabled() && setCompressionLevel->isChecked() ) {
|
||
|
inMap[ "CompressionLevel" ] = QString("%1").arg( compressionSlider->value() );
|
||
|
}
|
||
|
|
||
|
QString cmdArgs = commandLineSwitches->currentText().stripWhiteSpace();
|
||
|
if( !cmdArgs.isEmpty() ) {
|
||
|
bool firstChar = true;
|
||
|
QChar quote = '\0';
|
||
|
|
||
|
for( unsigned i=0; i < cmdArgs.length(); i++ ) {
|
||
|
QChar ch( cmdArgs[ i ] );
|
||
|
if( ch.isSpace() )
|
||
|
continue;
|
||
|
|
||
|
if( ch == quote ) {
|
||
|
quote = '\0';
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if( firstChar && ch != '-' ) {
|
||
|
KMessageBox::error( this, i18n( "Invalid command line switch!\nSwitch must start with '-'!" ) );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
firstChar = false;
|
||
|
|
||
|
if( quote == '"' )
|
||
|
continue;
|
||
|
if( quote == '\0' && ( ch == '\'' || ch == '"' ) )
|
||
|
quote = ch;
|
||
|
if( ch == '\\' ) {
|
||
|
if( i == cmdArgs.length() - 1 ) {
|
||
|
KMessageBox::error( this, i18n( "Invalid command line switch!\nBackslash cannot be the last character" ) );
|
||
|
return false;
|
||
|
}
|
||
|
i++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if( quote != '\0' ) {
|
||
|
KMessageBox::error( this, i18n( "Invalid command line switch!\nUnclosed quotation mark!" ) );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
commandLineSwitches->addToHistory( cmdArgs );
|
||
|
QStringList list = commandLineSwitches->historyItems();
|
||
|
krConfig->setGroup("Archives");
|
||
|
krConfig->writeEntry("Command Line Switches", list);
|
||
|
|
||
|
inMap[ "CommandLineSwitches" ] = cmdArgs;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
#include "packguibase.moc"
|