You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/kformula/kformula_doc.cc

248 lines
6.7 KiB

/* This file is part of the KDE project
Copyright (C) 2001 Andrea Rizzi <rizzi@kde.org>
Ulrich Kuettler <ulrich.kuettler@mailbox.tu-dresden.de>
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.
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 "kformula_doc.h"
#include "kformula_view.h"
#include "kformula_factory.h"
#include <tqbitmap.h>
#include <tqcolor.h>
#include <tqdom.h>
#include <tqpainter.h>
#include <tqpopupmenu.h>
#include <tqprinter.h>
#include <tqstring.h>
#include <tqwmatrix.h>
#include <tqfile.h>
#include <config.h>
#include <unistd.h>
#include <tdeaboutdialog.h>
#include <tdeaction.h>
#include <tdeapplication.h>
#include <kdebug.h>
#include <KoGlobal.h>
#include <kiconloader.h>
#include <tdelocale.h>
#include <kstdaction.h>
#include <kstandarddirs.h>
#include <kurl.h>
#include <KoXmlWriter.h>
#include <KoStoreDevice.h>
#include <tdetempfile.h>
#include <KoMainWindow.h>
#include <kformulacontainer.h>
#include <kformuladocument.h>
KFormulaDoc::KFormulaDoc(TQWidget *parentWidget, const char *widgetName, TQObject* parent, const char* name, bool singleViewMode)
: KoDocument(parentWidget, widgetName, parent, name, singleViewMode)
{
setInstance(KFormulaFactory::global(), false);
//kdDebug(39001) << "General Settings" << endl;
history = new KoCommandHistory( actionCollection() );
wrapper = new KFormula::DocumentWrapper( kapp->config(),
actionCollection(),
history );
document = new KFormula::Document;
wrapper->document( document );
formula = document->createFormula();
document->setEnabled( true );
// the modify flag
connect(history, TQT_SIGNAL(commandExecuted()), this, TQT_SLOT(commandExecuted()));
connect(history, TQT_SIGNAL(documentRestored()), this, TQT_SLOT(documentRestored()));
dcopObject();
}
KFormulaDoc::~KFormulaDoc()
{
delete history;
delete wrapper;
}
bool KFormulaDoc::saveOasis( KoStore* store, KoXmlWriter* manifestWriter )
{
if ( !store->open( "content.xml" ) )
return false;
KoStoreDevice dev( store );
KoXmlWriter* contentWriter = createOasisXmlWriter( &dev, "math:math" );
KTempFile contentTmpFile;
contentTmpFile.setAutoDelete( true );
TQFile* tmpFile = contentTmpFile.file();
//todo save content
TQTextStream stream(tmpFile);
stream.setEncoding( TQTextStream::UnicodeUTF8 );
formula->saveMathML( stream, true );
tmpFile->close();
contentWriter->addCompleteElement( TQT_TQIODEVICE(tmpFile) );
contentTmpFile.close();
contentWriter->endElement();
delete contentWriter;
if(!store->close())
return false;
manifestWriter->addManifestEntry("content.xml", "text/xml");
setModified( false );
return true;
}
TQDomDocument KFormulaDoc::saveXML()
{
TQDomDocument doc = document->saveXML();
history->documentSaved();
return doc;
}
bool KFormulaDoc::loadOasis( const TQDomDocument& doc, KoOasisStyles&, const TQDomDocument&, KoStore* )
{
// we don't have style into this format
// we don't have settings into kformula (for the moment)
// necessary to adapt kformula code to load MathML format with Oasis Extension.
if ( document->loadOasis( doc ) ) {
history->clear();
history->documentSaved();
return true;
}
return false;
}
bool KFormulaDoc::loadXML(TQIODevice *, const TQDomDocument& doc)
{
if ( doc.doctype().name().lower() == "math"
|| doc.documentElement().tagName().lower() == "math" )
if ( document->loadOasis( doc ) ) {
history->clear();
history->documentSaved();
return true;
}
if ( document->loadXML( doc ) ) {
history->clear();
history->documentSaved();
return true;
}
return false;
}
/**
* Saves the document in native format, to a given file.
* It is reimplemented to handle the special case of MathML, since it is
* a native format but not compressed.
*/
bool KFormulaDoc::saveNativeFormat( const TQString & file )
{
TQCString mimeType = outputMimeType();
bool mathml = !mimeType.isEmpty() && mimeType.contains( "mathml", false );
if ( mathml ) {
TQFile f( file );
if ( f.open( IO_WriteOnly | IO_Translate ) )
{
TQTextStream stream( &f );
stream.setEncoding( TQTextStream::UnicodeUTF8 );
formula->saveMathML( stream, false );
f.close();
return true;
}
else
return false;
}
// If it's not MathML, let the parent handle it
return KoDocument::saveNativeFormat( file );
}
KoView* KFormulaDoc::createViewInstance(TQWidget* _parent, const char *name)
{
return new KFormulaPartView(this, _parent, name);
}
void KFormulaDoc::commandExecuted()
{
if (formula->isEmpty()) {
setEmpty();
}
setModified(true);
}
void KFormulaDoc::documentRestored()
{
setModified(false);
}
bool KFormulaDoc::initDoc(InitDocFlags /*flags*/, TQWidget* /*parentWidget*/)
{
// If nothing is loaded, do initialize here
return TRUE;
}
void KFormulaDoc::showStartUpWidget(KoMainWindow* parent, bool /*alwaysShow*/)
{
parent->setRootDocument( this );
}
bool KFormulaDoc::showEmbedInitDialog(TQWidget* /*parent*/)
{
return true;
}
void KFormulaDoc::paintContent(TQPainter& painter, const TQRect& rect, bool transparent, double zoomX, double zoomY)
{
// ####### handle transparency and zoom
// Need to draw only the document rectangle described in the parameter rect.
bool forPrint = painter.device() && painter.device()->devType() == TQInternal::Printer;
document->setZoomAndResolution( 100, zoomX, zoomY, true, forPrint );
if ( !transparent ) {
painter.fillRect( rect, TQt::white );
}
formula->draw( painter, rect );
}
TQString KFormulaDoc::configFile() const
{
// return readConfigFile( locate( "data", "kformula/kformula.rc",
// KFormulaFactory::global() ) );
// return readConfigFile( "kformula.rc" );
return TQString();
}
#include "kformula_doc.moc"