#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "elementtype.h" #include "kformulacommand.h" #include "kformulacontainer.h" #include "kformuladocument.h" #include "kformulawidget.h" #include "scrollview.h" using namespace KFormula; class TestWidget : public KFormulaWidget { public: TestWidget(Container* doc, TQWidget* parent=0, const char* name=0, WFlags f=0) : KFormulaWidget(doc, parent, name, f) {} protected: virtual void keyPressEvent(TQKeyEvent* event); private: }; void save( const TQString &filename, const TQDomDocument& doc ) { TQFile f( filename ); if(!f.open(IO_Truncate | IO_ReadWrite)) { kdWarning( DEBUGID ) << "Error opening file " << filename.latin1() << endl; return; } TQTextStream stream(&f); stream.setEncoding(TQTextStream::UnicodeUTF8); doc.save(stream, 2); f.close(); } void load( KFormula::Document* document, const TQString &filename ) { TQFile f(filename); if (!f.open(IO_ReadOnly)) { kdWarning( DEBUGID ) << "Error opening file " << filename.latin1() << endl; return; } TQTextStream stream(&f); stream.setEncoding(TQTextStream::UnicodeUTF8); TQString content = stream.read(); f.close(); //kdDebug( DEBUGID ) << content << endl; TQDomDocument doc; if ( !doc.setContent( content ) ) { return; } if ( !document->loadXML( doc ) ) { kdWarning( DEBUGID ) << "Failed." << endl; } } void saveMathML( KFormula::Container* formula, const TQString &filename, bool oasisFormat ) { TQFile f( filename ); if ( !f.open( IO_Truncate | IO_ReadWrite ) ) { kdWarning( DEBUGID ) << "Error opening file " << filename.latin1() << endl; return; } TQTextStream stream( &f ); stream.setEncoding( TQTextStream::UnicodeUTF8 ); formula->saveMathML( stream, oasisFormat ); f.close(); } void loadMathML( KFormula::Container* formula, const TQString &filename ) { TQFile f( filename ); if ( !f.open( IO_ReadOnly ) ) { kdWarning( DEBUGID ) << "Error opening file " << filename.latin1() << endl; return; } TQTextStream stream( &f ); stream.setEncoding( TQTextStream::UnicodeUTF8 ); TQString content = stream.read(); TQDomDocument doc; TQString errorMsg; int errorLine; int errorColumn; if ( !doc.setContent( content, true, &errorMsg, &errorLine, &errorColumn ) ) { kdWarning( DEBUGID ) << "MathML built error: " << errorMsg << " at line " << errorLine << " and column " << errorColumn << endl; f.close(); return; } /*kdDebug( DEBUGID ) << "Container::loadMathML\n" << doc.toCString() << endl;*/ if ( !formula->loadMathML( doc ) ) { kdWarning( DEBUGID ) << "Failed." << endl; } f.close(); } void TestWidget::keyPressEvent(TQKeyEvent* event) { Container* document = getDocument(); //int action = event->key(); int state = event->state(); //MoveFlag flag = movementFlag(state); if ( ( state & TQt::ShiftButton ) && ( state & TQt::ControlButton ) ) { switch (event->key()) { case TQt::Key_B: document->document()->wrapper()->appendColumn(); return; case TQt::Key_I: document->document()->wrapper()->insertColumn(); return; case TQt::Key_R: document->document()->wrapper()->removeColumn(); return; case TQt::Key_Z: document->document()->wrapper()->redo(); return; case TQt::Key_F: saveMathML( document, "test.mml", true/*save to oasis format*/ ); return; case TQt::Key_M: saveMathML( document, "test.mml", false ); return; case TQt::Key_O: { TQString file = KFileDialog::getOpenFileName(); kdDebug( DEBUGID ) << file << endl; if( !file.isEmpty() ) { TQFileInfo fi( file ); if ( fi.extension() == "mml" ) { loadMathML( document, file ); } else if ( fi.extension() == "xml" ) { load( document->document(), file ); } } return; } } } else if (state & TQt::ControlButton) { switch (event->key()) { case TQt::Key_1: document->document()->wrapper()->addSum(); return; case TQt::Key_2: document->document()->wrapper()->addProduct(); return; case TQt::Key_3: document->document()->wrapper()->addIntegral(); return; case TQt::Key_4: document->document()->wrapper()->addRoot(); return; case TQt::Key_5: document->document()->wrapper()->addFraction(); return; case TQt::Key_6: document->document()->wrapper()->addMatrix(); return; case TQt::Key_7: document->document()->wrapper()->addOneByTwoMatrix(); return; case TQt::Key_8: document->document()->wrapper()->addOverline(); return; case TQt::Key_9: document->document()->wrapper()->addUnderline(); return; case TQt::Key_A: slotSelectAll(); return; case TQt::Key_B: document->document()->wrapper()->appendRow(); return; case TQt::Key_C: document->document()->wrapper()->copy(); return; case TQt::Key_D: document->document()->wrapper()->removeEnclosing(); return; case TQt::Key_G: document->document()->wrapper()->makeGreek(); return; case TQt::Key_I: document->document()->wrapper()->insertRow(); return; case TQt::Key_R: document->document()->wrapper()->removeRow(); return; case TQt::Key_K: document->document()->wrapper()->addMultiline(); return; case TQt::Key_L: document->document()->wrapper()->addGenericLowerIndex(); return; case TQt::Key_M: loadMathML( document, "test.mml" ); return; case TQt::Key_O: load( document->document(), "test.xml" ); return; case TQt::Key_Q: kapp->quit(); return; case TQt::Key_S: save( "test.xml", document->document()->saveXML() ); return; case TQt::Key_T: std::cout << document->texString().latin1() << std::endl; return; case TQt::Key_U: document->document()->wrapper()->addGenericUpperIndex(); return; case TQt::Key_V: document->document()->wrapper()->paste(); return; case TQt::Key_X: document->document()->wrapper()->cut(); return; case TQt::Key_Z: document->document()->wrapper()->undo(); return; default: //std::cerr << "Key: " << event->key() << std::endl; break; } } KFormulaWidget::keyPressEvent(event); } ScrollView::ScrollView() : TQScrollView(), child(0) { } void ScrollView::addChild(KFormulaWidget* c, int x, int y) { TQScrollView::addChild(c, x, y); child = c; connect(child, TQT_SIGNAL(cursorChanged(bool, bool)), this, TQT_SLOT(cursorChanged(bool, bool))); } void ScrollView::focusInEvent(TQFocusEvent*) { if (child != 0) child->setFocus(); } void ScrollView::cursorChanged(bool visible, bool /*selecting*/) { if (visible) { int x = child->getCursorPoint().x(); int y = child->getCursorPoint().y(); ensureVisible(x, y); } } static const KCmdLineOptions options[]= { { "+file", "File to open", 0 }, KCmdLineLastOption }; int main(int argc, char** argv) { KAboutData aboutData("math test", "KFormula test", "0.01", "test", KAboutData::License_GPL, "(c) 2003, Ulrich Kuettler"); aboutData.addAuthor("Ulrich Kuettler",0, "ulrich.kuettler@gmx.de"); TDECmdLineArgs::init(argc, argv, &aboutData); TDECmdLineArgs::addCmdLineOptions(options); KApplication app; app.connect(&app, TQT_SIGNAL(lastWindowClosed()), &app, TQT_SLOT(quit())); DocumentWrapper* wrapper = new DocumentWrapper( kapp->config(), 0 ); Document* document = new Document; wrapper->document( document ); Container* container1 = document->createFormula(); ScrollView* scrollview1a = new ScrollView; KFormulaWidget* mw1a = new TestWidget(container1, scrollview1a, "test1a"); scrollview1a->addChild(mw1a); scrollview1a->setCaption("Test1a of the formula engine"); scrollview1a->show(); TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs(); for ( int i = 0; i < args->count(); ++i ) { TQFileInfo fi( args->url( i ).path() ); if ( fi.extension() == "mml" ) loadMathML( container1, args->url( i ).path() ); else if ( fi.extension() == "xml" ) load( container1->document(), args->url( i ).path() ); } int result = app.exec(); delete container1; delete wrapper; // Make sure there are no elements in the clipboard. // Okey for a debug app. TQApplication::clipboard()->clear(); int destruct = BasicElement::getEvilDestructionCount(); if (destruct != 0) { std::cerr << "BasicElement::EvilDestructionCount: " << destruct << std::endl; } destruct = PlainCommand::getEvilDestructionCount(); if (destruct != 0) { std::cerr << "PlainCommand::EvilDestructionCount: " << destruct << std::endl; } destruct = ElementType::getEvilDestructionCount(); if (destruct != 0) { std::cerr << "ElementType::EvilDestructionCount: " << destruct << std::endl; } return result; } #include "scrollview.moc"