/* This file is part of the KDE project Copyright (C) 2002-2003 Norbert Andres (C) 2002 Ariya Hidayat (C) 2002 John Dailey (C) 2001-2002 Philipp Mueller (C) 2000-2002 Laurent Montel (C) 2000 Werner Trobin (C) 1998-2000 Torben Weis This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 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 #include #include #include #include #include #include #include #include #include "kspread_dlg_format.h" #include "kspread_doc.h" #include "kspread_locale.h" #include "kspread_sheet.h" #include "kspread_style.h" #include "kspread_style_manager.h" #include "kspread_undo.h" #include "kspread_view.h" #include "selection.h" using namespace KSpread; FormatDialog::FormatDialog( View* view, const char* name ) : KDialogBase( view, name, TRUE,i18n("Sheet Style"),Ok|Cancel ) { for( int i = 0; i < 16; ++i ) m_cells[ i ] = 0; m_view = view; TQWidget *page = new TQWidget( this ); setMainWidget(page); TQVBoxLayout *vbox = new TQVBoxLayout( page, 0, spacingHint() ); TQLabel *toplabel = new TQLabel( i18n("Select the sheet style to apply:"), page ); m_combo = new TQComboBox( page ); m_label = new TQLabel( page ); vbox->addWidget( toplabel ); vbox->addWidget( m_combo ); vbox->addWidget( m_label ); TQStringList lst = Factory::global()->dirs()->findAllResources( "sheet-styles", "*.ksts", TRUE ); TQStringList::Iterator it = lst.begin(); for( ; it != lst.end(); ++it ) { KSimpleConfig cfg( *it, TRUE ); cfg.setGroup( "Sheet-Style" ); Entry e; e.config = *it; e.xml = cfg.readEntry( "XML" ); e.image = cfg.readEntry( "Image" ); e.name = cfg.readEntry( "Name" ); m_entries.append( e ); m_combo->insertItem( e.name ); } slotActivated( 0 ); connect( this, TQ_SIGNAL( okClicked() ), this, TQ_SLOT( slotOk() ) ); connect( m_combo, TQ_SIGNAL( activated( int ) ), this, TQ_SLOT( slotActivated( int ) ) ); } FormatDialog::~FormatDialog() { for( int i = 0; i < 16; ++i ) delete m_cells[ i ]; } void FormatDialog::slotActivated( int index ) { enableButtonOK(true); TQString img = Factory::global()->dirs()->findResource( "sheet-styles", m_entries[ index ].image ); if ( img.isEmpty() ) { TQString str( i18n( "Could not find image %1." ) ); str = str.arg( m_entries[ index ].image ); KMessageBox::error( this, str ); enableButtonOK(false); return; } TQPixmap pix( img ); if ( pix.isNull() ) { TQString str( i18n( "Could not load image %1." ) ); str = str.arg( img ); KMessageBox::error( this,str ); enableButtonOK(false); return; } m_label->setPixmap( pix ); } void FormatDialog::slotOk() { m_view->doc()->emitBeginOperation( false ); TQString xml = Factory::global()->dirs()->findResource( "sheet-styles", m_entries[ m_combo->currentItem() ].xml ); if ( xml.isEmpty() ) { TQString str( i18n( "Could not find sheet-style XML file '%1'." ) ); str = str.arg( m_entries[ m_combo->currentItem() ].xml ); KMessageBox::error( this, str ); return; } TQFile file( xml ); file.open( IO_ReadOnly ); TQDomDocument doc; doc.setContent( &file ); file.close(); if ( !parseXML( doc ) ) { TQString str( i18n( "Parsing error in sheet-style XML file %1." ) ); str = str.arg( m_entries[ m_combo->currentItem() ].xml ); KMessageBox::error( this, str ); return; } TQRect r = m_view->selectionInfo()->selection(); if ( !m_view->doc()->undoLocked() ) { TQString title=i18n("Change Format"); UndoCellFormat *undo = new UndoCellFormat( m_view->doc(), m_view->activeSheet(), r, title); m_view->doc()->addCommand( undo ); } // // Set colors, borders etc. // // Top left corner Cell* cell = m_view->activeSheet()->nonDefaultCell( r.left(), r.top() ); cell->format()->copy( *m_cells[0] ); // Top column int x, y; for( x = r.left() + 1; x <= r.right(); ++x ) { int pos = 1 + ( ( x - r.left() - 1 ) % 2 ); Cell* cell = m_view->activeSheet()->nonDefaultCell( x, r.top() ); if(!cell->isPartOfMerged()) { cell->format()->copy( *m_cells[ pos ] ); Format* c; if ( x == r.right() ) c = m_cells[2]; else c = m_cells[1]; if ( c ) cell->setTopBorderPen( c->topBorderPen( 0, 0 ) ); if ( x == r.left() + 1 ) c = m_cells[1]; else c = m_cells[2]; if ( c ) cell->setLeftBorderPen( c->leftBorderPen( 0, 0 ) ); } } cell = m_view->activeSheet()->nonDefaultCell( r.right(), r.top() ); if ( m_cells[3] ) cell->setRightBorderPen( m_cells[3]->leftBorderPen( 0, 0 ) ); // Left row for( y = r.top() + 1; y <= r.bottom(); ++y ) { int pos = 4 + ( ( y - r.top() - 1 ) % 2 ) * 4; Cell* cell = m_view->activeSheet()->nonDefaultCell( r.left(), y ); if(!cell->isPartOfMerged()) { cell->format()->copy( *m_cells[ pos ] ); Format* c; if ( y == r.bottom() ) c = m_cells[8]; else c = m_cells[4]; if ( c ) cell->setLeftBorderPen( c->leftBorderPen( 0, 0 ) ); if ( y == r.top() + 1 ) c = m_cells[4]; else c = m_cells[8]; if ( c ) cell->setTopBorderPen( c->topBorderPen( 0, 0 ) ); } } // Body for( x = r.left() + 1; x <= r.right(); ++x ) for( y = r.top() + 1; y <= r.bottom(); ++y ) { int pos = 5 + ( ( y - r.top() - 1 ) % 2 ) * 4 + ( ( x - r.left() - 1 ) % 2 ); Cell* cell = m_view->activeSheet()->nonDefaultCell( x, y ); if(!cell->isPartOfMerged()) { cell->format()->copy( *m_cells[ pos ] ); Format* c; if ( x == r.left() + 1 ) c = m_cells[ 5 + ( ( y - r.top() - 1 ) % 2 ) * 4 ]; else c = m_cells[ 6 + ( ( y - r.top() - 1 ) % 2 ) * 4 ]; if ( c ) cell->setLeftBorderPen( c->leftBorderPen( 0, 0 ) ); if ( y == r.top() + 1 ) c = m_cells[ 5 + ( ( x - r.left() - 1 ) % 2 ) ]; else c = m_cells[ 9 + ( ( x - r.left() - 1 ) % 2 ) ]; if ( c ) cell->setTopBorderPen( c->topBorderPen( 0, 0 ) ); } } // Outer right border for( y = r.top(); y <= r.bottom(); ++y ) { Cell* cell = m_view->activeSheet()->nonDefaultCell( r.right(), y ); if(!cell->isPartOfMerged()) { if ( y == r.top() ) { if ( m_cells[3] ) cell->setRightBorderPen( m_cells[3]->leftBorderPen( 0, 0 ) ); } else if ( y == r.right() ) { if ( m_cells[11] ) cell->setRightBorderPen( m_cells[11]->leftBorderPen( 0, 0 ) ); } else { if ( m_cells[7] ) cell->setRightBorderPen( m_cells[7]->leftBorderPen( 0, 0 ) ); } } } // Outer bottom border for( x = r.left(); x <= r.right(); ++x ) { Cell* cell = m_view->activeSheet()->nonDefaultCell( x, r.bottom() ); if(!cell->isPartOfMerged()) { if ( x == r.left() ) { if ( m_cells[12] ) cell->setBottomBorderPen( m_cells[12]->topBorderPen( 0, 0 ) ); } else if ( x == r.right() ) { if ( m_cells[14] ) cell->setBottomBorderPen( m_cells[14]->topBorderPen( 0, 0 ) ); } else { if ( m_cells[13] ) cell->setBottomBorderPen( m_cells[13]->topBorderPen( 0, 0 ) ); } } } m_view->selectionInfo()->initialize(r);//, m_view->activeSheet() ); m_view->doc()->setModified( true ); m_view->slotUpdateView( m_view->activeSheet() ); accept(); } bool FormatDialog::parseXML( const TQDomDocument& doc ) { for( int i = 0; i < 16; ++i ) { delete m_cells[ i ]; m_cells[ i ] = 0; } TQDomElement e = doc.documentElement().firstChild().toElement(); for( ; !e.isNull(); e = e.nextSibling().toElement() ) { if ( e.tagName() == "cell" ) { Sheet* sheet = m_view->activeSheet(); Format* cell = new Format( sheet, sheet->doc()->styleManager()->defaultStyle() ); if ( !cell->load( e.namedItem("format").toElement(), Paste::Normal ) ) return false; int row = e.attribute("row").toInt(); int column = e.attribute("column").toInt(); int i = (row-1)*4 + (column-1); if ( i < 0 || i >= 16 ) return false; m_cells[ i ] = cell; } } return TRUE; } #include "kspread_dlg_format.moc"