26#include <tdetempfile.h>
29#include <KoGenStyles.h>
30#include <KoOasisSettings.h>
31#include <KoOasisStyles.h>
33#include <KoXmlWriter.h>
35#include "kspread_canvas.h"
36#include "kspread_doc.h"
37#include "kspread_genvalidationstyle.h"
38#include "kspread_locale.h"
39#include "kspread_sheet.h"
40#include "kspread_style.h"
41#include "kspread_style_manager.h"
42#include "kspread_view.h"
43#include "KSpreadMapIface.h"
45#include "kspread_map.h"
49bool Map::respectCase =
true;
52 : TQObject( doc, name ),
54 m_initialActiveSheet( 0 ),
55 m_initialMarkerColumn( 0 ),
56 m_initialMarkerRow( 0 ),
57 m_initialXOffset(0.0),
58 m_initialYOffset(0.0),
62 m_lstSheets.setAutoDelete(
true );
75void Map::setProtected( TQCString
const & passwd )
77 m_strPassword = passwd;
82 TQString s( i18n(
"Sheet%1") );
83 s = s.arg( tableId++ );
84 Sheet *t =
new Sheet (
this, s , s.utf8());
85 t->setSheetName( s,
true );
91 m_lstSheets.append( _sheet );
93 m_doc->setModified(
true );
110 int from = m_lstSheets.find( sheetfrom ) ;
111 int to = m_lstSheets.find( sheetto ) ;
115 if ( to > (
int)m_lstSheets.count() )
117 m_lstSheets.append( sheetfrom );
118 m_lstSheets.take( from );
120 else if ( from < to )
122 m_lstSheets.insert( to, sheetfrom );
123 m_lstSheets.take( from );
127 m_lstSheets.take( from );
128 m_lstSheets.insert( to, sheetfrom );
132void Map::loadOasisSettings( KoOasisSettings &settings )
134 KoOasisSettings::Items viewSettings = settings.itemSet(
"view-settings" );
135 KoOasisSettings::IndexedMap viewMap = viewSettings.indexedMap(
"Views" );
136 KoOasisSettings::Items firstView = viewMap.entry( 0 );
138 KoOasisSettings::NamedMap sheetsMap = firstView.namedMap(
"Tables" );
139 kdDebug()<<
" loadOasisSettings( KoOasisSettings &settings ) exist : "<< !sheetsMap.isNull() <<endl;
140 if ( !sheetsMap.isNull() )
142 TQPtrListIterator<Sheet> it( m_lstSheets );
143 for( ; it.current(); ++it )
145 it.current()->loadOasisSettings( sheetsMap );
149 TQString activeSheet = firstView.parseConfigItemString(
"ActiveTable" );
150 kdDebug()<<
" loadOasisSettings( KoOasisSettings &settings ) activeSheet :"<<activeSheet<<endl;
152 if (!activeSheet.isEmpty())
155 m_initialActiveSheet =
findSheet( activeSheet );
160void Map::saveOasisSettings( KoXmlWriter &settingsWriter )
162 settingsWriter.addConfigItem(
"ViewId", TQString::fromLatin1(
"View1" ) );
165 View * view = m_doc->views().isEmpty() ? 0 :
dynamic_cast<View*
>(m_doc->views().getFirst());
171 settingsWriter.addConfigItem(
"ActiveTable", view->activeSheet()->sheetName() );
175 settingsWriter.startElement(
"config:config-item-map-named" );
176 settingsWriter.addAttribute(
"config:name",
"Tables" );
177 TQPtrListIterator<Sheet> it( m_lstSheets );
178 for( ; it.current(); ++it )
180 settingsWriter.startElement(
"config:config-item-map-entry" );
181 settingsWriter.addAttribute(
"config:name", ( *it )->sheetName() );
186 settingsWriter.addConfigItem(
"CursorPositionX", marker.x() );
187 settingsWriter.addConfigItem(
"CursorPositionY", marker.y() );
188 settingsWriter.addConfigItem(
"xOffset", offset.x() );
189 settingsWriter.addConfigItem(
"yOffset", offset.y() );
191 it.current()->saveOasisSettings( settingsWriter );
192 settingsWriter.endElement();
194 settingsWriter.endElement();
198bool Map::saveOasis( KoXmlWriter & xmlWriter, KoGenStyles & mainStyles, KoStore *store, KoXmlWriter* manifestWriter,
int &_indexObj,
int &_partIndexObj )
200 if ( !m_strPassword.isEmpty() )
202 xmlWriter.addAttribute(
"table:structure-protected",
"true" );
203 TQCString str = KCodecs::base64Encode( m_strPassword );
204 xmlWriter.addAttribute(
"table:protection-key", TQString( str.data() ) );
207 GenValidationStyles valStyle;
209 KTempFile bodyTmpFile;
211 if (bodyTmpFile.status() != 0)
213 tqWarning(
"Creation of temporary file to store document body failed.");
217 bodyTmpFile.setAutoDelete(
true );
218 TQFile* tmpFile = bodyTmpFile.file();
219 KoXmlWriter bodyTmpWriter( tmpFile );
222 TQPtrListIterator<Sheet> it( m_lstSheets );
223 for( ; it.current(); ++it )
225 it.current()->saveOasis( bodyTmpWriter, mainStyles, valStyle, store, manifestWriter, _indexObj, _partIndexObj );
228 valStyle.writeStyle( xmlWriter );
232 xmlWriter.addCompleteElement( tmpFile );
238TQDomElement Map::save( TQDomDocument& doc )
240 TQDomElement mymap = doc.createElement(
"map" );
243 View * view =
static_cast<View*
>(m_doc->views().getFirst());
247 mymap.setAttribute(
"activeTable", canvas->
activeSheet()->sheetName() );
248 mymap.setAttribute(
"markerColumn", canvas->
markerColumn() );
249 mymap.setAttribute(
"markerRow", canvas->
markerRow() );
250 mymap.setAttribute(
"xOffset", canvas->
xOffset() );
251 mymap.setAttribute(
"yOffset", canvas->
yOffset() );
254 if ( !m_strPassword.isNull() )
256 if ( m_strPassword.size() > 0 )
258 TQCString str = KCodecs::base64Encode( m_strPassword );
259 mymap.setAttribute(
"protected", TQString( str.data() ) );
262 mymap.setAttribute(
"protected",
"" );
265 TQPtrListIterator<Sheet> it( m_lstSheets );
266 for( ; it.current(); ++it )
268 TQDomElement e = it.current()->saveXML( doc );
271 mymap.appendChild( e );
276bool Map::loadOasis(
const TQDomElement& body, KoOasisLoadingContext& oasisContext )
278 if ( body.hasAttributeNS( KoXmlNS::table,
"structure-protected" ) )
280 TQCString passwd(
"" );
281 if ( body.hasAttributeNS( KoXmlNS::table,
"protection-key" ) )
283 TQString p = body.attributeNS( KoXmlNS::table,
"protection-key", TQString() );
284 TQCString str( p.latin1() );
285 passwd = KCodecs::base64Decode( str );
287 m_strPassword = passwd;
289 TQDomNode sheetNode = KoDom::namedItemNS( body, KoXmlNS::table,
"table" );
292 if ( sheetNode.isNull() )
return false;
294 while ( !sheetNode.isNull() )
296 TQDomElement sheetElement = sheetNode.toElement();
297 if( !sheetElement.isNull() )
301 if( sheetElement.nodeName() ==
"table:table" )
303 if( !sheetElement.attributeNS( KoXmlNS::table,
"name", TQString() ).isEmpty() )
306 sheet->setSheetName( sheetElement.attributeNS( KoXmlNS::table,
"name", TQString() ),
true,
false );
310 sheetNode = sheetNode.nextSibling();
314 TQDict<Style> autoStyles = doc()->styleManager()->loadOasisAutoStyles( oasisContext.oasisStyles() );
317 sheetNode = body.firstChild();
318 while ( !sheetNode.isNull() )
320 TQDomElement sheetElement = sheetNode.toElement();
321 if( !sheetElement.isNull() )
324 if( sheetElement.nodeName() ==
"table:table" )
326 if( !sheetElement.attributeNS( KoXmlNS::table,
"name", TQString() ).isEmpty() )
328 TQString name = sheetElement.attributeNS( KoXmlNS::table,
"name", TQString() );
331 sheet->loadOasis( sheetElement, oasisContext, autoStyles );
335 sheetNode = sheetNode.nextSibling();
339 doc()->styleManager()->releaseUnusedAutoStyles( autoStyles );
345bool Map::loadXML(
const TQDomElement& mymap )
347 TQString activeSheet = mymap.attribute(
"activeTable" );
348 m_initialMarkerColumn = mymap.attribute(
"markerColumn" ).toInt();
349 m_initialMarkerRow = mymap.attribute(
"markerRow" ).toInt();
350 m_initialXOffset = mymap.attribute(
"xOffset" ).toDouble();
351 m_initialYOffset = mymap.attribute(
"yOffset" ).toDouble();
353 TQDomNode n = mymap.firstChild();
357 doc()->setErrorMessage( i18n(
"This document has no sheets (tables).") );
362 TQDomElement e = n.toElement();
363 if ( !e.isNull() && e.tagName() ==
"table" )
366 if ( !t->loadXML( e ) )
372 if ( mymap.hasAttribute(
"protected" ) )
374 TQString passwd = mymap.attribute(
"protected" );
376 if ( passwd.length() > 0 )
378 TQCString str( passwd.latin1() );
379 m_strPassword = KCodecs::base64Decode( str );
382 m_strPassword = TQCString(
"" );
385 if (!activeSheet.isEmpty())
388 m_initialActiveSheet =
findSheet( activeSheet );
396 TQPtrListIterator<Sheet> it( m_lstSheets );
397 for( ; it.current(); ++it )
398 it.current()->recalc();
405 for ( t = m_lstSheets.first(); t != 0L; t = m_lstSheets.next() )
407 if ( _name.lower() == t->sheetName().lower() )
418 if( currentSheet == m_lstSheets.last())
421 for ( t = m_lstSheets.first(); t != 0L; t = m_lstSheets.next() )
423 if ( t == currentSheet )
424 return m_lstSheets.next();
430Sheet * Map::previousSheet( Sheet * currentSheet )
434 if( currentSheet == m_lstSheets.first())
437 for ( t = m_lstSheets.first(); t != 0L; t = m_lstSheets.next() )
439 if ( t == currentSheet )
440 return m_lstSheets.prev();
446bool Map::saveChildren( KoStore * _store )
448 TQPtrListIterator<Sheet> it( m_lstSheets );
449 for( ; it.current(); ++it )
452 if ( !it.current()->saveChildren( _store, it.current()->sheetName() ) )
458bool Map::loadChildren( KoStore * _store )
460 TQPtrListIterator<Sheet> it( m_lstSheets );
461 for( ; it.current(); ++it )
462 if ( !it.current()->loadChildren( _store ) )
471 m_dcop =
new MapIface(
this );
476void Map::takeSheet( Sheet * sheet )
478 int pos = m_lstSheets.findRef( sheet );
479 m_lstSheets.take( pos );
480 m_lstDeletedSheets.append( sheet );
483void Map::insertSheet( Sheet * sheet )
485 int pos = m_lstDeletedSheets.findRef( sheet );
487 m_lstDeletedSheets.take( pos );
488 m_lstSheets.append(sheet);
492TQStringList Map::visibleSheets()
const
496 TQPtrListIterator<Sheet> it( m_lstSheets );
499 Sheet* sheet = it.current();
500 if( !sheet->isHidden() )
501 result.append( sheet->sheetName() );
508TQStringList Map::hiddenSheets()
const
512 TQPtrListIterator<Sheet> it( m_lstSheets );
515 Sheet* sheet = it.current();
516 if( sheet->isHidden() )
517 result.append( sheet->sheetName() );
523#include "kspread_map.moc"
The canvas builds a part of the GUI of KSpread.
int markerRow() const
convenience function.
int markerColumn() const
convenience function.
Sheet * activeSheet() const
This class holds the data that makes up a spreadsheet.
Sheet * findSheet(const TQString &_name)
searches for a sheet named _name
virtual DCOPObject * dcopObject()
Needed for the printing Extension KOffice::Print.
Sheet * addNewSheet()
add a new sheet to the map, returning a pointer to it
void addSheet(Sheet *_sheet)
add sheet to the map, making it active
void sig_addSheet(Sheet *_table)
Emitted if a new table is added to the document.
virtual ~Map()
This deletes all sheets contained in this map.
Map(Doc *doc, const char *name=0)
Created an empty map.
void moveSheet(const TQString &_from, const TQString &_to, bool _before=true)
The sheet named _from is being moved to the sheet _to.
Sheet * nextSheet()
Call firstSheet first.
The View class displays a KSpread document.
KoPoint offsetFromSheet(Sheet *sheet) const
Canvas * canvasWidget() const
Returns the canvas of the view.
TQPoint markerFromSheet(Sheet *sheet) const
void saveCurrentSheetSelection()
Save current sheet selection.