diff options
Diffstat (limited to 'src/dialogs/pagesetupdialog.cpp')
-rw-r--r-- | src/dialogs/pagesetupdialog.cpp | 310 |
1 files changed, 310 insertions, 0 deletions
diff --git a/src/dialogs/pagesetupdialog.cpp b/src/dialogs/pagesetupdialog.cpp new file mode 100644 index 0000000..08e3fda --- /dev/null +++ b/src/dialogs/pagesetupdialog.cpp @@ -0,0 +1,310 @@ +/*************************************************************************** +* Copyright (C) 2003-2005 by Jason Kivlighn * +* ([email protected]) * +* * +* 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 "pagesetupdialog.h" + +#include <tqdir.h> +#include <tqlayout.h> +#include <tqhbox.h> +#include <tqfileinfo.h> +#include <tqpushbutton.h> +#include <tqpopupmenu.h> +#include <tqtooltip.h> +#include <tqtabwidget.h> +#include <tqlabel.h> + +#include <tdehtmlview.h> +#include <tdeapplication.h> +#include <kdebug.h> +#include <tdefiledialog.h> +#include <tdelocale.h> +#include <kiconloader.h> +#include <tdemessagebox.h> +#include <kstandarddirs.h> +#include <tdeaction.h> +#include <tdeconfig.h> +#include <kstdaction.h> +#include <tdetoolbar.h> +#include <tdepopupmenu.h> + +#include "setupdisplay.h" + +PageSetupDialog::PageSetupDialog( TQWidget *parent, const Recipe &sample, const TQString &configEntry ) : KDialog( parent, 0, true ), m_configEntry(configEntry) +{ + TDEIconLoader il; + + TQVBoxLayout * layout = new TQVBoxLayout( this ); + + TDEToolBar *toolbar = new TDEToolBar( this ); + TDEActionCollection *actionCollection = new TDEActionCollection( this ); + + TDEAction *std_open = KStdAction::open( 0, 0, 0 ); //use this to create a custom open action + TDEToolBarPopupAction *custom_open = new TDEToolBarPopupAction( std_open->text(), std_open->icon(), std_open->shortcut(), this, TQ_SLOT( loadFile() ), actionCollection, "open_popup" ); + + TDEPopupMenu *open_popup = custom_open->popupMenu(); + + open_popup->insertTitle( i18n( "Styles" ) ); + TQDir included_layouts( getIncludedLayoutDir(), "*.klo", TQDir::Name | TQDir::IgnoreCase, TQDir::Files ); + for ( unsigned int i = 0; i < included_layouts.count(); i++ ) { + int id = open_popup->insertItem( included_layouts[ i ].left(included_layouts[ i ].find(".")), this, TQ_SLOT( loadLayout( int ) ) ); + included_layouts_map.insert( id, included_layouts[ i ] ); + } + + open_popup->insertTitle( i18n( "Templates" ) ); + TQDir included_templates( getIncludedLayoutDir(), "*.template", TQDir::Name | TQDir::IgnoreCase, TQDir::Files ); + for ( unsigned int i = 0; i < included_templates.count(); i++ ) { + int id = open_popup->insertItem( included_templates[ i ].left(included_templates[ i ].find(".")).replace("_"," "), this, TQ_SLOT( loadTemplate( int ) ) ); + included_layouts_map.insert( id, included_templates[ i ] ); + } + + custom_open->plug( toolbar ); + + KStdAction::save( this, TQ_SLOT( saveLayout() ), actionCollection ) ->plug( toolbar ); + KStdAction::saveAs( this, TQ_SLOT( saveAsLayout() ), actionCollection ) ->plug( toolbar ); + KStdAction::redisplay( this, TQ_SLOT( reloadLayout() ), actionCollection ) ->plug( toolbar ); + + TDEToolBarPopupAction *shown_items = new TDEToolBarPopupAction( i18n( "Items Shown" ), "frame_edit" ); + shown_items->setDelayed( false ); + shown_items_popup = shown_items->popupMenu(); + shown_items_popup->insertTitle( i18n( "Show Items" ) ); + shown_items->plug( toolbar ); + layout->addWidget( toolbar ); + + TQLabel *help = new TQLabel(i18n("<i>Usage: Right-click any element to edit the look of that element.</i>"),this); + layout->addWidget( help ); + + m_htmlPart = new SetupDisplay(sample, this); + layout->addWidget( m_htmlPart->view() ); + + TQHBox *buttonsBox = new TQHBox( this ); + TQPushButton *okButton = new TQPushButton( il.loadIconSet( "ok", TDEIcon::Small ), i18n( "Save and Close" ), buttonsBox ); + TQPushButton *cancelButton = new TQPushButton( il.loadIconSet( "cancel", TDEIcon::Small ), i18n( "&Cancel" ), buttonsBox ); + layout->addWidget( buttonsBox ); + + connect( m_htmlPart, TQ_SIGNAL(itemVisibilityChanged(KreDisplayItem*,bool)), this, TQ_SLOT(updateItemVisibility(KreDisplayItem*,bool)) ); + connect( okButton, TQ_SIGNAL( clicked() ), TQ_SLOT( accept() ) ); + connect( cancelButton, TQ_SIGNAL( clicked() ), TQ_SLOT( reject() ) ); + + TDEConfig *config = TDEGlobal::config(); + config->setGroup( "Page Setup" ); + TQSize defaultSize(300,400); + resize(config->readSizeEntry( "WindowSize", &defaultSize )); + + //let's do everything we can to be sure at least some layout is loaded + TQString layoutFile = config->readEntry( m_configEntry+"Layout", locate( "appdata", "layouts/Default.klo" ) ); + if ( layoutFile.isEmpty() || !TQFile::exists( layoutFile ) ) + layoutFile = locate( "appdata", "layouts/Default.klo" ); + + TQString tmpl = config->readEntry( m_configEntry+"Template", locate( "appdata", "layouts/Default.template" ) ); + if ( tmpl.isEmpty() || !TQFile::exists( tmpl ) ) + tmpl = locate( "appdata", "layouts/Default.template" ); + kdDebug()<<"tmpl: "<<tmpl<<endl; + active_template = tmpl; + loadLayout( layoutFile ); + + initShownItems(); +} + +void PageSetupDialog::accept() +{ + if ( m_htmlPart->hasChanges() ) + saveLayout(); + + if ( !active_filename.isEmpty() ) { + TDEConfig * config = kapp->config(); + config->setGroup( "Page Setup" ); + config->writeEntry( m_configEntry+"Layout", active_filename ); + } + + if ( !active_template.isEmpty() ) { + TDEConfig * config = kapp->config(); + config->setGroup( "Page Setup" ); + config->writeEntry( m_configEntry+"Template", active_template ); + } + + TDEConfig *config = kapp->config(); + config->setGroup( "Page Setup" ); + config->writeEntry( "WindowSize", size() ); + + TQDialog::accept(); +} + +void PageSetupDialog::reject() +{ + if ( m_htmlPart->hasChanges() ) { + switch ( KMessageBox::questionYesNoCancel( this, i18n( "The recipe view layout has been modified.\nDo you want to save it?" ), i18n( "Save Layout?" ) ) ) { + case KMessageBox::Yes: + saveLayout(); + break; + case KMessageBox::No: + break; + default: + return ; + } + } + + TQDialog::reject(); +} + +void PageSetupDialog::updateItemVisibility( KreDisplayItem *item, bool visible ) +{ + shown_items_popup->setItemChecked( widget_popup_map[ item ], visible ); +} + +void PageSetupDialog::initShownItems() +{ + shown_items_popup->clear(); + + PropertiesMap properties = m_htmlPart->properties(); + + TQValueList<TQString> nameList; + TQMap<TQString,KreDisplayItem*> nameMap; + + for ( PropertiesMap::const_iterator it = properties.begin(); it != properties.end(); ++it ) { + nameList << it.key()->name; + nameMap.insert( it.key()->name, it.key() ); + } + qHeapSort( nameList ); + + for ( TQValueList<TQString>::const_iterator it = nameList.begin(); it != nameList.end(); ++it ) { + KreDisplayItem *item = nameMap[*it]; + if ( properties[item] & SetupDisplay::Visibility ) { + int new_id = shown_items_popup->insertItem ( *it ); + shown_items_popup->setItemChecked( new_id, item->show ); + shown_items_popup->connectItem( new_id, this, TQ_SLOT( setItemShown( int ) ) ); + + popup_widget_map.insert( new_id, item ); + widget_popup_map.insert( item, new_id ); + } + } +} + +void PageSetupDialog::setItemShown( int id ) +{ + shown_items_popup->setItemChecked( id, !shown_items_popup->isItemChecked( id ) ); + m_htmlPart->setItemShown( popup_widget_map[ id ], shown_items_popup->isItemChecked( id ) ); +} + +void PageSetupDialog::loadFile() +{ + TQString file = KFileDialog::getOpenFileName( locateLocal( "appdata", "layouts/" ), TQString("*.klo *.template|%1").arg(i18n("Krecipes style or template file")), this, i18n( "Select Layout" ) ); + + if ( file.endsWith(".klo") ) + loadLayout( file ); + else { + active_template = file; + m_htmlPart->loadTemplate( file ); + } +} + +void PageSetupDialog::loadTemplate( int popup_param ) +{ + active_template = getIncludedLayoutDir() + "/" + included_layouts_map[ popup_param ]; + m_htmlPart->loadTemplate( active_template ); +} + +void PageSetupDialog::loadLayout( int popup_param ) +{ + loadLayout( getIncludedLayoutDir() + "/" + included_layouts_map[ popup_param ] ); +} + +void PageSetupDialog::loadLayout( const TQString &filename ) +{ + if ( m_htmlPart->hasChanges() ) { + switch ( KMessageBox::questionYesNoCancel( this, i18n( "This layout has been modified.\nDo you want to save it?" ), i18n( "Save Layout?" ) ) ) { + case KMessageBox::Yes: + saveLayout(); + break; + case KMessageBox::No: + break; + default: + return ; + } + } + + if ( !filename.isEmpty() ) { + m_htmlPart->loadLayout( filename ); + setActiveFile( filename ); + } +} + +void PageSetupDialog::reloadLayout() +{ + m_htmlPart->reload(); +} + +void PageSetupDialog::saveLayout() +{ + if ( m_htmlPart->hasChanges() ) { + if ( have_write_perm ) + m_htmlPart->saveLayout( active_filename ); + else { + switch ( KMessageBox::warningYesNo( this, i18n( "Unable to save the layout because you do not have sufficient permissions to modify this file.\nWould you like to instead save the current layout to a new file?" ) ) ) { + case KMessageBox::Yes: + saveAsLayout(); + break; + default: + break; + } + } + } +} + +void PageSetupDialog::saveAsLayout() +{ + TQString filename = KFileDialog::getSaveFileName( TDEGlobal::instance() ->dirs() ->saveLocation( "appdata", "layouts/" ), "*.klo|Krecipes Layout (*.klo)", this, TQString::null ); + + if ( !filename.isEmpty() ) { + if ( haveWritePerm( filename ) ) { + m_htmlPart->saveLayout( filename ); + setActiveFile(filename); + } + else { + switch ( KMessageBox::warningYesNo( this, i18n( "You have selected a file that you do not have the permissions to write to.\nWould you like to select another file?" ) ) ) { + case KMessageBox::Yes: + saveAsLayout(); + break; + default: + break; + } + } + } +} + +TQString PageSetupDialog::getIncludedLayoutDir() const +{ + TQFileInfo file_info( locate( "appdata", "layouts/Default.klo" ) ); + return file_info.dirPath( true ); +} + +void PageSetupDialog::setActiveFile( const TQString &filename ) +{ + active_filename = filename; + have_write_perm = haveWritePerm( filename ); +} + +bool PageSetupDialog::haveWritePerm( const TQString &filename ) +{ + TQFileInfo info( filename ); + + if ( info.exists() ) //check that we can write to this particular file + { + TQFileInfo info( filename ); + return info.isWritable(); + } + else //check that we can write to the directory since the file doesn't exist + { + TQFileInfo dir_info( info.dirPath( true ) ); + return dir_info.isWritable(); + } +} + + +#include "pagesetupdialog.moc" |