/*
 *  This file is part of the KDE libraries
 *  Copyright (c) 2001-2002 Michael Goffioul 
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Library General Public
 *  License version 2 as published by the Free Software Foundation.
 *
 *  This library 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
 *  Library General Public License for more details.
 *
 *  You should have received a copy of the GNU Library General Public License
 *  along with this library; see the file COPYING.LIB.  If not, write to
 *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 *  Boston, MA 02110-1301, USA.
 **/
#include "kpposterpage.h"
#include "posterpreview.h"
#include "kprinter.h"
#include "kmfactory.h"
#include "util.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
KPPosterPage::KPPosterPage( TQWidget *parent, const char *name )
	: KPrintDialogPage( parent, name )
{
        //WhatsThis strings.... (added by pfeifle@kde.org)
	TQString whatsThis5_PosterPage = i18n( "  "
			" 5. "
			" " );
	TQString whatsThisEnablePosterPage = i18n( "  "
                        " Print Poster (enabled or disabled). "
			" If you enable this option, you can print posters of different sizes "
			" The printout will happen in the form 'tiles' printed on smaller "
			" paper sizes, which you can stitch together later. If you enable this "
			" option here, the 'Poster Printing' filter will be auto-loaded in "
			" the 'Filters' tab of this dialog. 
"
			" This tab is only visible if the external 'poster' utility is "
			" discovered by TDEPrint on your system. ['poster' is a commandline "
			" utility that enables you to convert PostScript files into tiled printouts "
			" which allow for oversized appearance of the stitched-together tiles.] 
"
			" Note: The standard version of 'poster' will not work. Your system "
			" must use a patched version of 'poster'. Ask your operating system vendor to "
			" provide a patched version of 'poster' if he does not already. 
"
			" " );
	TQString whatsThisTileSelectionPosterPage = i18n( "  "
                        " Tile Selection widget "
			" This GUI element is not only for viewing your selections: it also "
			" lets you interactively select the tile(s) you want to print. "
			" 
"
			" Hints "
			" 
 "
			" - Click any tile to select it for printing."
			"
- To select multiple tiles to be printed "
			" at once, 'shift-click' on the tiles ('shift-click' means: hold down the "
			" [SHIFT]-key on your keyboard and click with the mouse while [SHIFT]-key is held.)  "
			" Be aware that the order "
			" of your clicking is also significant to the order of printing the different tiles. "
			"
"
			" Note 1: The order of your selection (and the order for printout of the tiles) "
			" is indicated by the contents of the text field below, "
			" labelled as 'Tile pages (to be printed):'"
			" Note 2: By default no tile is selected. Before you can print (a part "
			" of) your poster, you must select at least one tile. 
 "
			" " );
	TQString whatsThisPostersizePosterPage = i18n( "  "
                        " Poster Size "
			" Select the poster size you want from the dropdown list. 
 "
			" Available sizes are all standard paper sizes up to "
			" 'A0'. [A0 is the same size as 16 sheets of A4, or '84cm x 118.2cm'.] 
 "
			" Notice, how the little preview window below changes with your change of poster "
			" size. It indicates to you how many tiles need to be printed to make the poster, "
			" given the selected paper size.
  "
			" Hint: The little preview window below is not just a passive icon. You can click "
			" on its individual tiles to select them for printing. To select multiple tiles to be printed "
			" at once, you need to 'shift-click' on the tiles ('shift-click' means: hold down the "
			" [SHIFT]-key on your keyboard and click with the mouse while [SHIFT]-key is held.) The order "
			" of your clicking is significant to the order of printing the different tiles. The order of "
			" your selection (and for the printed tiles) is indicated by the contents of the text field "
			" labelled as 'Tile pages (to be printed):'
"
			" Note: By default no tile is selected. Before you can print (a part "
			" of) your poster, you must select at least one tile. 
 "
			" " );
	TQString whatsThisPrintsizePosterPage = i18n( "  "
                        " Paper Size "
			" This field indicates the paper size the poster tiles will be printed on. "
			" To select a different paper size for your poster tiles, go to the 'General' tab "
			" of this dialog and select one from the dropdown list. 
 "
			" Available sizes are most standard paper sizes supported by your printer. Your printer's "
			" supported paper sizes are read from the printer driver info (as laid down in the 'PPD', "
			" the printer description file). Be aware that the 'Paper Size' selected may not be supported "
			" by 'poster' (example: 'HalfLetter') while it may well be supported by your printer.  If "
			" you hit that obstacle, simply use another, supported Paper Size, like 'A4' or 'Letter'. "
			" Notice, how the little preview window below changes with your change of paper "
			" size. It indicates how many tiles need to be printed to make up the poster, "
			" given the selected paper and poster size.
  "
			" Hint: The little preview window below is not just a passive icon. You can click "
			" on its individual tiles to select them for printing. To select multiple tiles to be printed "
			" at once, you need to 'shift-click' on the tiles ('shift-click' means: hold down the "
			" [SHIFT]-key on your keyboard and click with the mouse while [SHIFT]-key is held.) The order "
			" of your clicking is significant to the order of printing the different tiles. The order of "
			" your selection (and for the printed tiles) is indicated by the contents of the text field "
			" labelled as 'Tile pages (to be printed):'
"
			" Note: By default no tile is selected. Before you can print (a part "
			" of) your poster, you must select at least one tile. 
 "
			" " );
	TQString whatsThisCutmarginPosterPage = i18n( "  "
                        " Cut Margin selection "
			" Slider and spinbox let you determine a 'cut margin' which will be printed onto "
			" each tile of your poster to help you cut the pieces as needed. 
"
			" Notice, how the little preview window above changes with your change of cut "
			" margins. It indicates to you how much space the cut margins will take away from each tile. "
			" 
Be aware, that your cut margins need to be equal to or greater than the margins your "
			" printer uses. The printer's capabilities are described in the 'ImageableArea' "
			" keywords of its driver PPD file. 
 "
			" " );
	TQString whatsThisTileOrderSelectionPosterPage = i18n( "  "
                        " Order and number of tile pages to be printed "
			" This field displays and sets the individual tiles to be printed, as well as the order "
			" for their printout. 
 "
			" You can file the field with 2 different methods: "
			"  "
			" - Either use the interactive thumbnail preview above and '[SHIFT]-click' on the tiles. "
			"
- Or edit this text field accordingly. "
			"
"
			"When editing the field, you can use a '3-7' syntax instead of a '3,4,5,6,7' one. 
 "
			" Examples:
 "
			"  "
			"   \"2,3,7,9,3\" "
			" 
 "
			"   \"1-3,6,8-11\" "
			" 
" );
	setTitle( i18n( "Poster" ) );
	m_postercheck = new TQCheckBox( i18n( "&Print poster" ), this );
          TQWhatsThis::add(m_postercheck, whatsThisEnablePosterPage);
	TQWidget *dummy = new TQWidget( this );
	m_preview = new PosterPreview( dummy );
          TQWhatsThis::add(m_preview, whatsThisTileSelectionPosterPage);
	m_postersize = new TQComboBox( dummy );
          TQWhatsThis::add(m_postersize, whatsThisPostersizePosterPage);
	m_printsize = new TQComboBox( dummy );
          TQWhatsThis::add(m_printsize, whatsThisPrintsizePosterPage);
	m_lockbtn = new KPushButton( dummy );
          //TQWhatsThis::add(m_lockbtn, whatsThis5_PosterPage);           //FIXME ASK_MICHAEL: which pushbutton would that be?
	m_mediasize = new TQLabel( dummy );
          TQWhatsThis::add(m_mediasize, whatsThisPrintsizePosterPage);
	m_mediasize->setFrameStyle( TQFrame::Panel|TQFrame::Sunken );
	TQLabel *posterlab = new TQLabel( i18n( "Poste&r size:" ), dummy );
          TQWhatsThis::add(posterlab, whatsThisPostersizePosterPage);
	TQLabel *medialab = new TQLabel( i18n( "Media size:" ), dummy );
          TQWhatsThis::add(medialab, whatsThisPrintsizePosterPage);
	TQLabel *printlab = new TQLabel( i18n( "Pri&nt size:" ), dummy );
          TQWhatsThis::add(printlab, whatsThisPrintsizePosterPage);
	posterlab->setBuddy( m_postersize );
	printlab->setBuddy( m_printsize );
	m_cutmargin = new KIntNumInput( 5, dummy );
          TQWhatsThis::add(m_cutmargin, whatsThisCutmarginPosterPage);
	// xgettext:no-c-format
	m_cutmargin->setLabel( i18n( "C&ut margin (% of media):" ) );
	m_cutmargin->setRange( 0, 100, 2, true );                     // step width was too big, changed from 10 to 2 (-kp-)
	m_selection = new TQLineEdit( dummy );
          TQWhatsThis::add(m_selection, whatsThisTileOrderSelectionPosterPage);
	TQLabel *selectionlab = new TQLabel( i18n( "&Tile pages (to be printed):" ), dummy );
          TQWhatsThis::add(selectionlab, whatsThisTileOrderSelectionPosterPage);
	selectionlab->setBuddy( m_selection );
	m_lockbtn->setToggleButton( true );
	m_lockbtn->setPixmap( SmallIcon( "encrypted" ) );
	m_lockbtn->setOn( true );
	m_lockbtn->setFixedSize( m_lockbtn->sizeHint() );
	TQToolTip::add( m_lockbtn, i18n( "Link/unlink poster and print size" ) );
	for ( int i=0; iinsertItem( page_sizes[ i ].text );
		m_printsize->insertItem( page_sizes[ i ].text );
	}
	m_postersize->setCurrentItem( findIndex( KPrinter::A3 ) );
	slotPosterSizeChanged( m_postersize->currentItem() );
	connect( m_postercheck, TQT_SIGNAL( toggled( bool ) ), dummy, TQT_SLOT( setEnabled( bool ) ) );
	dummy->setEnabled( false );
	connect( m_postersize, TQT_SIGNAL( activated( int ) ), TQT_SLOT( slotPosterSizeChanged( int ) ) );
	connect( m_cutmargin, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotMarginChanged( int ) ) );
	connect( m_lockbtn, TQT_SIGNAL( toggled( bool ) ), m_printsize, TQT_SLOT( setDisabled( bool ) ) );
	m_printsize->setEnabled( false );
	connect( m_lockbtn, TQT_SIGNAL( toggled( bool ) ), TQT_SLOT( slotLockToggled( bool ) ) );
	connect( m_selection, TQT_SIGNAL( textChanged( const TQString& ) ), m_preview, TQT_SLOT( setSelectedPages( const TQString& ) ) );
	connect( m_preview, TQT_SIGNAL( selectionChanged( const TQString& ) ), m_selection, TQT_SLOT( setText( const TQString& ) ) );
	if ( KMFactory::self()->settings()->application != KPrinter::Dialog 
			&& KMFactory::self()->settings()->application >= 0 )
	{
		m_printsize->hide();
		m_lockbtn->hide();
		printlab->hide();
	}
	TQVBoxLayout *l0 = new TQVBoxLayout( this, 0, 10 );
	l0->addWidget( m_postercheck );
	l0->addWidget( dummy, 1 );
	TQGridLayout *l1 = new TQGridLayout( dummy, 8, 3, 0, 5 );
	l1->addWidget( posterlab, 0, 0 );
	l1->addWidget( m_postersize, 0, 1 );
	l1->addWidget( printlab, 1, 0 );
	l1->addWidget( m_printsize, 1, 1 );
	l1->addWidget( medialab, 2, 0 );
	l1->addWidget( m_mediasize, 2, 1 );
	l1->addMultiCellWidget( m_preview, 4, 4, 0, 2 );
	l1->addMultiCellWidget( m_cutmargin, 6, 6, 0, 2 );
	l1->addMultiCellWidget( m_lockbtn, 0, 1, 2, 2 );
	TQHBoxLayout *l2 = new TQHBoxLayout( 0, 0, 5 );
	l1->addMultiCellLayout( l2, 7, 7, 0, 2 );
	l2->addWidget( selectionlab );
	l2->addWidget( m_selection );
	l1->setColStretch( 1, 1 );
	l1->setRowStretch( 4, 1 );
	l1->addRowSpacing( 3, 10 );
	l1->addRowSpacing( 5, 10 );
}
KPPosterPage::~KPPosterPage()
{
}
void KPPosterPage::setOptions( const TQMap& opts )
{
	TQString ps = opts[ "PageSize" ];
	if ( ps.isEmpty() && !opts[ "kde-pagesize" ].isEmpty() )
	{
		ps = pageSizeToPageName( ( KPrinter::PageSize )opts[ "kde-pagesize" ].toInt() );
		if ( ps.isEmpty() )
			ps = opts[ "_kde-poster-media" ];
	}
	if ( ps.isEmpty() )
		m_mediasize->setText( i18n( "Unknown" ) );
	else
		m_mediasize->setText( ps );
	m_preview->setMediaSize( ps );
	if ( opts[ "_kde-filters" ].find( "poster" ) != -1 )
	{
		m_postercheck->setChecked( true );
		ps = opts[ "_kde-poster-size" ];
		TQString prtsize = opts[ "kde-printsize" ];
		if ( !ps.isEmpty() )
		{
			m_postersize->setCurrentItem( findIndex( pageNameToPageSize( ps ) ) );
			m_lockbtn->setOn( !prtsize.isEmpty() && 
					page_sizes[ m_postersize->currentItem() ].ID == prtsize.toInt() );
			if ( !m_lockbtn->isOn() )
				m_printsize->setCurrentItem( findIndex( prtsize.toInt() ) );
			slotPosterSizeChanged( m_postersize->currentItem() );
		}
		if ( !opts[ "_kde-poster-cut" ].isEmpty() )
			m_cutmargin->setValue( opts[ "_kde-poster-cut" ].toInt() );
		m_selection->setText( opts[ "_kde-poster-select" ] );
	}
	else
		m_postercheck->setChecked( false );
}
void KPPosterPage::getOptions( TQMap& opts, bool )
{
	TQStringList o = TQStringList::split( ",", opts[ "_kde-filters" ], false );
	if ( !m_postercheck->isChecked() )
	{
		o.remove( "poster" );
		opts[ "_kde-filters" ] = o.join( "," );
		opts.remove( "_kde-poster-media" );
		opts.remove( "_kde-poster-size" );
		opts.remove( "_kde-poster-cut" );
		opts.remove( "kde-printsize" );
		opts.remove( "_kde-poster-select" );
	}
	else
	{
		if ( !o.contains( "poster" ) )
			o.append( "poster" );
		opts[ "_kde-filters" ] = o.join( "," );
		opts[ "_kde-poster-media" ] = m_mediasize->text();
		opts[ "_kde-poster-size" ] = pageSizeToPageName( ( KPrinter::PageSize )page_sizes[ m_postersize->currentItem() ].ID );
		opts[ "kde-printsize" ] = TQString::number( page_sizes[ m_printsize->currentItem() ].ID );
		opts[ "_kde-poster-cut" ] = TQString::number( m_cutmargin->value() );
		opts[ "_kde-poster-select" ] = m_selection->text().stripWhiteSpace();
	}
}
bool KPPosterPage::isValid()
{
	return true;
}
void KPPosterPage::slotPosterSizeChanged( int value )
{
	int ID = page_sizes[ m_postersize->currentItem() ].ID;
	m_preview->setPosterSize( ID );
	if ( m_lockbtn->isOn() )
		m_printsize->setCurrentItem( value );
}
void KPPosterPage::slotMarginChanged( int value )
{
	m_preview->setCutMargin( value );
}
void KPPosterPage::slotLockToggled( bool on )
{
	m_lockbtn->setPixmap( SmallIcon( on ? "encrypted" : "decrypted" ) );
	if ( on )
		m_printsize->setCurrentItem( m_postersize->currentItem() );
}
#include "kpposterpage.moc"