diff options
Diffstat (limited to 'kspread/dialogs/kspread_dlg_format.cpp')
-rw-r--r-- | kspread/dialogs/kspread_dlg_format.cpp | 352 |
1 files changed, 352 insertions, 0 deletions
diff --git a/kspread/dialogs/kspread_dlg_format.cpp b/kspread/dialogs/kspread_dlg_format.cpp new file mode 100644 index 00000000..501d8bf3 --- /dev/null +++ b/kspread/dialogs/kspread_dlg_format.cpp @@ -0,0 +1,352 @@ +/* This file is part of the KDE project + Copyright (C) 2002-2003 Norbert Andres <[email protected]> + (C) 2002 Ariya Hidayat <[email protected]> + (C) 2002 John Dailey <[email protected]> + (C) 2001-2002 Philipp Mueller <[email protected]> + (C) 2000-2002 Laurent Montel <[email protected]> + (C) 2000 Werner Trobin <[email protected]> + (C) 1998-2000 Torben Weis <[email protected]> + + 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 <tqcombobox.h> +#include <tqfile.h> +#include <tqlayout.h> +#include <tqlabel.h> +#include <tqpushbutton.h> + +#include <kbuttonbox.h> +#include <tdemessagebox.h> +#include <kstandarddirs.h> +#include <ksimpleconfig.h> + +#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, TQT_SIGNAL( okClicked() ), this, TQT_SLOT( slotOk() ) ); + connect( m_combo, TQT_SIGNAL( activated( int ) ), this, TQT_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" |