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.
k3b/src/projects/k3bdataimagesettingswidget.cpp

401 lines
13 KiB

/*
*
* $Id: k3bdataimagesettingswidget.cpp 691413 2007-07-23 16:01:13Z trueg $
* Copyright (C) 2003 Sebastian Trueg <trueg@k3b.org>
*
* This file is part of the K3b project.
* Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org>
*
* 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.
* See the file "COPYING" for the exact licensing terms.
*/
#include "k3bdataimagesettingswidget.h"
#include "k3bdataadvancedimagesettingswidget.h"
#include "k3bdatavolumedescwidget.h"
#include "k3bisooptions.h"
#include <tqcheckbox.h>
#include <tqradiobutton.h>
#include <tqbuttongroup.h>
#include <tqlineedit.h>
#include <tqcombobox.h>
#include <tqpushbutton.h>
#include <tqwhatsthis.h>
#include <tqlayout.h>
#include <tdemessagebox.h>
#include <tdelocale.h>
#include <kdialogbase.h>
#include <kdebug.h>
// indices for the filesystems combobox
static const int FS_LINUX_ONLY = 0;
static const int FS_LINUX_AND_WIN = 1;
static const int FS_UDF = 2;
static const int FS_DOS_COMP = 3;
static const int FS_CUSTOM = 4;
static const int FS_MAX = 5;
static const char* s_fsPresetNames[] = {
I18N_NOOP("Linux/Unix only"),
I18N_NOOP("Linux/Unix + Windows"),
I18N_NOOP("Very large files (UDF)"),
I18N_NOOP("DOS Compatibility"),
I18N_NOOP("Custom")
};
static bool s_fsPresetsInitialized = false;
static K3bIsoOptions s_fsPresets[FS_CUSTOM];
// indices for the whitespace treatment combobox
static const int WS_NO_CHANGE = 0;
static const int WS_STRIP = 1;
static const int WS_EXTENDED_STRIP = 2;
static const int WS_REPLACE = 3;
// indices for the symlink handling combobox
static const int SYM_NO_CHANGE = 0;
static const int SYM_DISCARD_BROKEN = 1;
static const int SYM_DISCARD_ALL = 2;
static const int SYM_FOLLOW = 3;
//
// returns true if the part of the options that is presented in the advanced custom
// settings dialog is equal. used to determine if some preset is used.
//
static bool compareAdvancedOptions( const K3bIsoOptions& o1, const K3bIsoOptions& o2 )
{
return ( o1.forceInputCharset() == o2.forceInputCharset() &&
( !o1.forceInputCharset() || o1.inputCharset() == o2.inputCharset() ) &&
o1.createRockRidge() == o2.createRockRidge() &&
o1.createJoliet() == o2.createJoliet() &&
o1.createUdf() == o2.createUdf() &&
o1.ISOallowLowercase() == o2.ISOallowLowercase() &&
o1.ISOallowPeriodAtBegin() == o2.ISOallowPeriodAtBegin() &&
o1.ISOallow31charFilenames() == o2.ISOallow31charFilenames() &&
o1.ISOomitVersionNumbers() == o2.ISOomitVersionNumbers() &&
o1.ISOomitTrailingPeriod() == o2.ISOomitTrailingPeriod() &&
o1.ISOmaxFilenameLength() == o2.ISOmaxFilenameLength() &&
o1.ISOrelaxedFilenames() == o2.ISOrelaxedFilenames() &&
o1.ISOnoIsoTranslate() == o2.ISOnoIsoTranslate() &&
o1.ISOallowMultiDot() == o2.ISOallowMultiDot() &&
o1.ISOuntranslatedFilenames() == o2.ISOuntranslatedFilenames() &&
o1.createTRANS_TBL() == o2.createTRANS_TBL() &&
o1.hideTRANS_TBL() == o2.hideTRANS_TBL() &&
o1.jolietLong() == o2.jolietLong() &&
o1.ISOLevel() == o2.ISOLevel() &&
o1.preserveFilePermissions() == o2.preserveFilePermissions() &&
o1.doNotCacheInodes() == o2.doNotCacheInodes() );
}
static void initializePresets()
{
// Linux-only
s_fsPresets[FS_LINUX_ONLY].setCreateJoliet( false );
s_fsPresets[FS_LINUX_ONLY].setISOallow31charFilenames( true );
// Linux + Windows
s_fsPresets[FS_LINUX_AND_WIN].setCreateJoliet( true );
s_fsPresets[FS_LINUX_AND_WIN].setJolietLong( true );
s_fsPresets[FS_LINUX_AND_WIN].setISOallow31charFilenames( true );
// UDF
s_fsPresets[FS_UDF].setCreateJoliet( false );
s_fsPresets[FS_UDF].setCreateUdf( true );
s_fsPresets[FS_UDF].setISOallow31charFilenames( true );
// DOS comp
s_fsPresets[FS_DOS_COMP].setCreateJoliet( false );
s_fsPresets[FS_DOS_COMP].setCreateRockRidge( false );
s_fsPresets[FS_DOS_COMP].setISOallow31charFilenames( false );
s_fsPresets[FS_DOS_COMP].setISOLevel( 1 );
s_fsPresetsInitialized = true;
}
class K3bDataImageSettingsWidget::CustomFilesystemsDialog : public KDialogBase
{
public:
CustomFilesystemsDialog( TQWidget* parent )
: KDialogBase( parent,
"custom_filesystems_dialog",
true,
i18n("Custom Data Project Filesystems"),
Ok|Cancel,
Ok,
true ) {
w = new K3bDataAdvancedImageSettingsWidget( this );
setMainWidget( w );
}
K3bDataAdvancedImageSettingsWidget* w;
};
class K3bDataImageSettingsWidget::VolumeDescDialog : public KDialogBase
{
public:
VolumeDescDialog( TQWidget* parent )
: KDialogBase( parent,
"voldesc_dialog",
true,
i18n("Volume Descriptor"),
Ok|Cancel,
Ok,
true ) {
w = new K3bDataVolumeDescWidget( this );
setMainWidget( w );
// give ourselves a reasonable size
TQSize s = sizeHint();
s.setWidth( TQMAX(s.width(), 300) );
resize( s );
}
K3bDataVolumeDescWidget* w;
};
K3bDataImageSettingsWidget::K3bDataImageSettingsWidget( TQWidget* parent, const char* name )
: base_K3bDataImageSettings( parent, name ),
m_fileSystemOptionsShown(true)
{
layout()->setMargin( KDialog::marginHint() );
m_customFsDlg = new CustomFilesystemsDialog( this );
m_volDescDlg = new VolumeDescDialog( this );
connect( m_buttonCustomFilesystems, TQT_SIGNAL(clicked()),
this, TQT_SLOT(slotCustomFilesystems()) );
connect( m_buttonMoreVolDescFields, TQT_SIGNAL(clicked()),
this, TQT_SLOT(slotMoreVolDescFields()) );
connect( m_comboSpaceHandling, TQT_SIGNAL(activated(int)),
this, TQT_SLOT(slotSpaceHandlingChanged(int)) );
for( int i = 0; i < FS_MAX; ++i )
m_comboFilesystems->insertItem( i18n( s_fsPresetNames[i] ) );
if( !s_fsPresetsInitialized )
initializePresets();
TQWhatsThis::add( m_comboFilesystems,
i18n("<p><b>File System Presets</b>"
"<p>K3b provides the following file system Presets which allow for a quick selection "
"of the most frequently used settings.")
+ "<p><b>" + i18n(s_fsPresetNames[0]) + "</b><br>"
+ i18n("The file system is optimized for usage on Linux/Unix systems. This mainly means that "
"it uses the Rock Ridge extensions to provide long filenames, symbolic links, and POSIX "
"compatible file permissions.")
+ "<p><b>" + i18n(s_fsPresetNames[1]) + "</b><br>"
+ i18n("In addition to the settings for Linux/Unix the file system contains a Joliet tree which "
"allows for long file names on Windows which does not support the Rock Ridget extensions. "
"Be aware that the file name length is restricted to 103 characters.")
+ "<p><b>" + i18n(s_fsPresetNames[2]) + "</b><br>"
+ i18n("The file system has additional UDF entries attached to it. This raises the maximal file "
"size to 4 GB. Be aware that the UDF support in K3b is limited.")
+ "<p><b>" + i18n(s_fsPresetNames[3]) + "</b><br>"
+ i18n("The file system is optimized for compatibility with old systems. That means file names "
"are restricted to 8.3 characters and no symbolic links or file permissions are supported.") );
}
K3bDataImageSettingsWidget::~K3bDataImageSettingsWidget()
{
}
void K3bDataImageSettingsWidget::showFileSystemOptions( bool b )
{
m_groupFileSystem->setShown(b);
m_groupSymlinks->setShown(b);
m_groupWhitespace->setShown(b);
m_fileSystemOptionsShown = b;
}
void K3bDataImageSettingsWidget::slotSpaceHandlingChanged( int i )
{
m_editReplace->setEnabled( i == WS_REPLACE );
}
void K3bDataImageSettingsWidget::slotCustomFilesystems()
{
// load settings in custom window
if( m_comboFilesystems->currentItem() != FS_CUSTOM ) {
m_customFsDlg->w->load( s_fsPresets[m_comboFilesystems->currentItem()] );
}
// store the current settings in case the user cancels the changes
K3bIsoOptions o;
m_customFsDlg->w->save( o );
if( m_customFsDlg->exec() == TQDialog::Accepted ) {
slotFilesystemsChanged();
}
else {
// reload the old settings discarding any changes
m_customFsDlg->w->load( o );
}
}
void K3bDataImageSettingsWidget::slotFilesystemsChanged()
{
if( !m_fileSystemOptionsShown )
return;
// new custom entry
TQStringList s;
if( m_customFsDlg->w->m_checkRockRidge->isChecked() )
s += i18n("Rock Ridge");
if( m_customFsDlg->w->m_checkJoliet->isChecked() )
s += i18n("Joliet");
if( m_customFsDlg->w->m_checkUdf->isChecked() )
s += i18n("UDF");
if( s.isEmpty() )
m_comboFilesystems->changeItem( i18n("Custom (ISO9660 only)"), FS_CUSTOM );
else
m_comboFilesystems->changeItem( i18n("Custom (%1)").arg( s.join(", ") ), FS_CUSTOM );
// see if any of the presets is loaded
m_comboFilesystems->setCurrentItem( FS_CUSTOM );
K3bIsoOptions o;
m_customFsDlg->w->save( o );
for( int i = 0; i < FS_CUSTOM; ++i ) {
if( compareAdvancedOptions( o, s_fsPresets[i] ) ) {
kdDebug() << "(K3bDataImageSettingsWidget) found preset settings: " << s_fsPresetNames[i] << endl;
m_comboFilesystems->setCurrentItem( i );
break;
}
}
if( m_comboFilesystems->currentItem() == FS_CUSTOM ) {
if( !m_customFsDlg->w->m_checkRockRidge->isChecked() ) {
KMessageBox::information( this,
i18n("<p>Be aware that it is not recommended to disable the Rock Ridge "
"Extensions. There is no disadvantage in enabling Rock Ridge (except "
"for a very small space overhead) but a lot of advantages."
"<p>Without Rock Ridge Extensions symbolic links are not supported "
"and will always be followed as if the \"Follow Symbolic Links\" option "
"was enabled."),
i18n("Rock Ridge Extensions Disabled"),
"warning_about_rock_ridge" );
}
if( !m_customFsDlg->w->m_checkJoliet->isChecked() )
KMessageBox::information( this,
i18n("<p>Be aware that without the Joliet extensions Windows "
"systems will not be able to display long filenames. You "
"will only see the ISO9660 filenames."
"<p>If you do not intend to use the CD/DVD on a Windows "
"system it is safe to disable Joliet."),
i18n("Joliet Extensions Disabled"),
"warning_about_joliet" );
}
}
void K3bDataImageSettingsWidget::slotMoreVolDescFields()
{
// update dlg to current state
m_volDescDlg->w->m_editVolumeName->setText( m_editVolumeName->text() );
// remember old settings
K3bIsoOptions o;
m_volDescDlg->w->save( o );
// exec dlg
if( m_volDescDlg->exec() == TQDialog::Accepted ) {
// accept new entries
m_volDescDlg->w->save( o );
m_editVolumeName->setText( o.volumeID() );
}
else {
// restore old settings
m_volDescDlg->w->load( o );
}
}
void K3bDataImageSettingsWidget::load( const K3bIsoOptions& o )
{
m_customFsDlg->w->load( o );
m_volDescDlg->w->load( o );
slotFilesystemsChanged();
if( o.discardBrokenSymlinks() )
m_comboSymlinkHandling->setCurrentItem( SYM_DISCARD_BROKEN );
else if( o.discardSymlinks() )
m_comboSymlinkHandling->setCurrentItem( SYM_DISCARD_ALL );
else if( o.followSymbolicLinks() )
m_comboSymlinkHandling->setCurrentItem( SYM_FOLLOW );
else
m_comboSymlinkHandling->setCurrentItem( SYM_NO_CHANGE );
switch( o.whiteSpaceTreatment() ) {
case K3bIsoOptions::strip:
m_comboSpaceHandling->setCurrentItem( WS_STRIP );
break;
case K3bIsoOptions::extended:
m_comboSpaceHandling->setCurrentItem( WS_EXTENDED_STRIP );
break;
case K3bIsoOptions::replace:
m_comboSpaceHandling->setCurrentItem( WS_REPLACE );
break;
default:
m_comboSpaceHandling->setCurrentItem( WS_NO_CHANGE );
}
slotSpaceHandlingChanged( m_comboSpaceHandling->currentItem() );
m_editReplace->setText( o.whiteSpaceTreatmentReplaceString() );
m_editVolumeName->setText( o.volumeID() );
}
void K3bDataImageSettingsWidget::save( K3bIsoOptions& o )
{
if( m_comboFilesystems->currentItem() != FS_CUSTOM )
m_customFsDlg->w->load( s_fsPresets[m_comboFilesystems->currentItem()] );
m_customFsDlg->w->save( o );
m_volDescDlg->w->save( o );
o.setDiscardSymlinks( m_comboSymlinkHandling->currentItem() == SYM_DISCARD_ALL );
o.setDiscardBrokenSymlinks( m_comboSymlinkHandling->currentItem() == SYM_DISCARD_BROKEN );
o.setFollowSymbolicLinks( m_comboSymlinkHandling->currentItem() == SYM_FOLLOW );
switch( m_comboSpaceHandling->currentItem() ) {
case WS_STRIP:
o.setWhiteSpaceTreatment( K3bIsoOptions::strip );
break;
case WS_EXTENDED_STRIP:
o.setWhiteSpaceTreatment( K3bIsoOptions::extended );
break;
case WS_REPLACE:
o.setWhiteSpaceTreatment( K3bIsoOptions::replace );
break;
default:
o.setWhiteSpaceTreatment( K3bIsoOptions::noChange );
}
o.setWhiteSpaceTreatmentReplaceString( m_editReplace->text() );
o.setVolumeID( m_editVolumeName->text() );
}
#include "k3bdataimagesettingswidget.moc"