# HG changeset patch # User insilmaril # Date 1216205174 0 # Node ID 12958f987bcf8ed9595994c5354643224757694e # Parent 192e1392ba6ada56dd1fac2b0eabb93e9ab42f17 Started to restructure for later use of Model/View diff -r 192e1392ba6a -r 12958f987bcf aboutdialog.cpp --- a/aboutdialog.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/aboutdialog.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -54,10 +54,7 @@ " <ul>" " <li>Spanish: <a href=\"http://ieee.udistrital.edu.co/aclibre\">" " ACLibre (Academia y Conocimiento Libre)</a> </li>" - " <li>French: Philippe Caillaud and Claude </li>" - " <li>Italian: Seyed Puria Nafisi Azizi </li>" - " <li>Brasilian: Amadeu Júnior</li>" - " <li>Russion: Anton Olenev</li>" + " <li>French: Philippe Caillaud, Claude ?</li>" " </ul>" "</li>" "<li> Patches" diff -r 192e1392ba6a -r 12958f987bcf animpoint.cpp --- a/animpoint.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/animpoint.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -88,7 +88,7 @@ uint AnimPoint::getTicks() { - return animTicks; + return (uint) animTicks; } void AnimPoint::setAnimated(bool b) @@ -110,15 +110,13 @@ { vector=QPointF(0,0); animated=false; + setX (destPos.x() ); + setY (destPos.y() ); return animated; } - setX (startPos.x() + vector.x()*sqrt(n/animTicks) ); setY (startPos.y() + vector.y()*sqrt(n/animTicks) ); - /* - setX (startPos.x() + vector.x()*(n/animTicks) ); - setY (startPos.y() + vector.y()*(n/animTicks) ); - */ + return animated; } diff -r 192e1392ba6a -r 12958f987bcf branchobj.cpp --- a/branchobj.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/branchobj.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -21,7 +21,7 @@ BranchObj* BranchObj::itFirst=NULL; -BranchObj::BranchObj () :OrnamentedObj() +BranchObj::BranchObj () :OrnamentedObj() // FIXME needed at all? { // cout << "Const BranchObj ()\n"; setParObj (this); @@ -103,7 +103,7 @@ branch.clear(); for (int i=0; i<other->branch.size(); ++i) // Make deep copy of b - // Because addBranch again calls copy for the childs, + // Because addBranch again calls copy for the children, // Those will get a deep copy, too addBranch(other->branch.at(i) ); @@ -214,7 +214,7 @@ if (off==0) { // new parent is just a branch, link to it - QRectF t=o->getBBoxSizeWithChilds(); + QRectF t=o->getBBoxSizeWithChildren(); if (o->getLastBranch()) y=t.y() + t.height() ; else @@ -343,10 +343,10 @@ standardFlags->setVisibility(v); LinkableMapObj::setVisibility (v); - // Only change childs, if I am not scrolled + // Only change children, if I am not scrolled if (!scrolled && (depth < toDepth)) { - // Now go recursivly through all childs + // Now go recursivly through all children int i; for (i=0; i<branch.size(); ++i) branch.at(i)->setVisibility (v,toDepth); @@ -370,9 +370,9 @@ // Overloaded from LinkableMapObj // BranchObj can use color of heading - if (mapEditor) + if (model) { - if (mapEditor->getMapLinkColorHint()==HeadingColor) + if (model->getMapLinkColorHint()==HeadingColor) LinkableMapObj::setLinkColor (heading->getColor() ); else LinkableMapObj::setLinkColor (); @@ -409,13 +409,13 @@ // no itLast, we are just beginning if (bo) { - // we have childs, return first one + // we have children, return first one itLast=this; return bo; } else { - // No childs, so there is no next + // No children, so there is no next itLast=this; return NULL; } @@ -426,12 +426,12 @@ { // We come from parent if (bo) { - // there are childs, go there + // there are children, go there itLast=this; return bo; } else - { // no childs, try to go up again + { // no children, try to go up again if (po) { // go back to parent and try to find next there @@ -450,17 +450,17 @@ } } - // We don't come from parent, but from brother or childs + // We don't come from parent, but from brother or children - // Try to find last child, where we came from, in my own childs + // Try to find last child, where we came from, in my own children bool searching=true; int i=0; while (i<branch.size()) { - // Try to find itLast in my own childs + // Try to find itLast in my own children if (itLast==branch.at(i)) { - // ok, we come from my own childs + // ok, we come from my own children if (i<branch.size()-1) bo=branch.at(i+1); else @@ -471,7 +471,7 @@ ++i; } if (!searching) - { // found itLast in my childs + { // found itLast in my children if (bo) { // found a brother of lastLMO @@ -756,7 +756,7 @@ hidden=false; } - // And take care of my childs + // And take care of my children for (int i=0; i<branch.size(); ++i) branch.at(i)->setHideTmp (mode); } @@ -1114,7 +1114,7 @@ void BranchObj::removeBranchHere(BranchObj* borem) { // This removes the branch bo from list, but - // inserts its childs at the place of bo + // inserts its children at the place of bo BranchObj *bo; bo=borem->getLastBranch(); int pos=borem->getNum(); @@ -1126,7 +1126,7 @@ removeBranch (borem); } -void BranchObj::removeChilds() +void BranchObj::removeChildren() { clear(); } @@ -1302,7 +1302,7 @@ } } -void BranchObj::alignRelativeTo (QPointF ref) +void BranchObj::alignRelativeTo (QPointF ref,bool alignSelf) { qreal th = bboxTotal.height(); // TODO testing @@ -1313,9 +1313,11 @@ " ref="<<ref<< // " bbox.topLeft="<<bboxTotal.topLeft()<< " absPos="<<absPos<< - " relPos="<<relPos<< - " parPos="<<pp<< +// " relPos="<<relPos<< +// " parPos="<<pp<< + " width="<<bbox.width()<< " orient="<<orientation<< + " alignSelf="<<alignSelf<< // " pad="<<topPad<<","<<botPad<<","<<leftPad<<","<<rightPad<< // " hidden="<<hidden<< // " th="<<th<< @@ -1351,24 +1353,26 @@ { LinkableMapObj::Orientation o; o=parObj->getOrientation(); - switch (orientation) - { - case LinkableMapObj::LeftOfCenter: - move (ref.x() - bbox.width(), ref.y() + (th-bbox.height())/2 ); - break; - case LinkableMapObj::RightOfCenter: - move (ref.x() , ref.y() + (th-bbox.height())/2 ); - break; - default: - qWarning ("LMO::alignRelativeTo: oops, no orientation given..."); - break; - } + if (alignSelf) + switch (orientation) + { + case LinkableMapObj::LeftOfCenter: + move (ref.x() - bbox.width(), ref.y() + (th-bbox.height())/2 ); + //move (ref.x() , ref.y() + (th-bbox.height())/2 ); + break; + case LinkableMapObj::RightOfCenter: + move (ref.x() , ref.y() + (th-bbox.height())/2 ); + break; + default: + qWarning ("LMO::alignRelativeTo: oops, no orientation given..."); + break; + } } } if (scrolled) return; - // Set reference point for alignment of childs + // Set reference point for alignment of children QPointF ref2; if (orientation==LinkableMapObj::LeftOfCenter) ref2.setX(bbox.topLeft().x() - linkwidth); @@ -1380,13 +1384,15 @@ else ref2.setY(ref.y() ); - // Align the childs depending on reference point + // Align the children depending on reference point for (int i=0; i<branch.size(); ++i) { if (!branch.at(i)->isHidden()) { - branch.at(i)->alignRelativeTo (ref2); - ref2.setY(ref2.y() + branch.at(i)->getBBoxSizeWithChilds().height() ); + branch.at(i)->alignRelativeTo (ref2,true); + + // append next branch below current one + ref2.setY(ref2.y() + branch.at(i)->getBBoxSizeWithChildren().height() ); } } } @@ -1408,7 +1414,7 @@ // only calculate the sizes once. If the deepest LMO // changes its height, // all upper LMOs have to change, too. - calcBBoxSizeWithChilds(); + calcBBoxSizeWithChildren(); updateLink(); // This update is needed if the scene is resized // due to excessive moving of a FIO @@ -1472,12 +1478,12 @@ return r; } -QRectF BranchObj::getBBoxSizeWithChilds() +QRectF BranchObj::getBBoxSizeWithChildren() { return bboxTotal; } -void BranchObj::calcBBoxSizeWithChilds() +void BranchObj::calcBBoxSizeWithChildren() { // This is initially called only from reposition and // and only for mapcenter. So it won't be @@ -1485,11 +1491,11 @@ // action - // Calculate size of LMO including all childs (to align them later) + // Calculate size of LMO including all children (to align them later) bboxTotal.setX(bbox.x() ); bboxTotal.setY(bbox.y() ); - // if branch is scrolled, ignore childs, but still consider floatimages + // if branch is scrolled, ignore children, but still consider floatimages if (scrolled) { bboxTotal.setWidth (bbox.width()); @@ -1523,8 +1529,8 @@ { if (!branch.at(i)->isHidden()) { - branch.at(i)->calcBBoxSizeWithChilds(); - br=branch.at(i)->getBBoxSizeWithChilds(); + branch.at(i)->calcBBoxSizeWithChildren(); + br=branch.at(i)->getBBoxSizeWithChildren(); r.setWidth( max (br.width(), r.width() )); r.setHeight(br.height() + r.height() ); if (br.y()<bboxTotal.y()) bboxTotal.setY(br.y()); @@ -1573,14 +1579,14 @@ updateFlagsToolbar(); // Update actions - mapEditor->updateActions(); + model->updateActions(); } void BranchObj::unselect() { LinkableMapObj::unselect(); // Delete any messages like vymLink in StatusBar - mainWindow->statusMessage (""); + mainWindow->statusMessage (""); //FIXME this causes segfault, when MainWindow is already gone in global destructor on quitting vym // Save current note if (isNoteInEditor) getNoteFromTextEditor(); @@ -1609,7 +1615,11 @@ bool BranchObj::animate() { anim.animate (); - setRelPos (anim); - return anim.isAnimated(); + if ( anim.isAnimated() ) + { + setRelPos (anim); + return true; + } + return false; } diff -r 192e1392ba6a -r 12958f987bcf branchobj.h --- a/branchobj.h Wed Jul 16 10:44:44 2008 +0000 +++ b/branchobj.h Wed Jul 16 10:46:14 2008 +0000 @@ -11,7 +11,7 @@ /*! \brief A branch visible in the map */ -/*! If HideExport is used, this branch and its childs will be hidden in export */ +/*! If HideExport is used, this branch and its children will be hidden in export */ enum HideTmpMode {HideNone, HideExport}; @@ -102,7 +102,7 @@ virtual BranchObj* insertBranch(BranchObj*,int); virtual BranchObj* insertBranchPtr (BranchObj*,int); virtual void removeBranchHere(BranchObj*); - virtual void removeChilds(); + virtual void removeChildren(); virtual void removeBranch(BranchObj*); virtual void removeBranchPtr (BranchObj*); virtual void setLastSelectedBranch(BranchObj*); @@ -116,14 +116,14 @@ virtual BranchObj* moveBranchDown(BranchObj*); virtual void sortChildren(); virtual BranchObj* linkTo (BranchObj*, int); - virtual void alignRelativeTo(const QPointF ); + virtual void alignRelativeTo(const QPointF, bool alignSelf=false ); virtual void reposition(); virtual void unsetAllRepositionRequests(); virtual QPolygonF shape(); //!< Returns arbitrary bounding polygon - virtual QRectF getTotalBBox(); // return BBox including childs - virtual QRectF getBBoxSizeWithChilds(); // return size of BBox including childs - virtual void calcBBoxSizeWithChilds(); // calc size of BBox including childs recursivly + virtual QRectF getTotalBBox(); // return BBox including children + virtual QRectF getBBoxSizeWithChildren(); // return size of BBox including children + virtual void calcBBoxSizeWithChildren(); // calc size of BBox including children recursivly virtual void select(); virtual void unselect(); @@ -144,7 +144,7 @@ float angle; // used in mainbranch to reorder mainbranches protected: int lastSelectedBranch; // for going deeper into tree - bool scrolled; // true if all childs are scrolled and thus invisible + bool scrolled; // true if all children are scrolled and thus invisible bool tmpUnscrolled; // can only be true (temporary) for a scrolled subtree bool includeImagesVer; // include floatimages in bbox vertically bool includeImagesHor; // include floatimages in bbox horizontally diff -r 192e1392ba6a -r 12958f987bcf branchpropwindow.cpp --- a/branchpropwindow.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/branchpropwindow.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -16,7 +16,7 @@ setCaption(vymName +" - " +tr ("Property Editor","Window caption")); branch=NULL; - mapEditor=NULL; + model=NULL; ui.tabWidget->setEnabled(false); @@ -125,7 +125,8 @@ // Attributes attributeModel->removeRows(0, attributeModel->rowCount(), QModelIndex()); - // FIXME some samples for testing +/* + // FIXME some samples for attribute testing QStringList attrTypes=mapEditor->attributeTable()->getTypes(); for (int i=0; i<attrTypes.count()-1;i++) { @@ -141,7 +142,7 @@ // Initialize Delegate delegate.setAttributeTable (mapEditor->attributeTable()); ui.attributeTableView->setItemDelegate (&delegate); - +*/ // Finally activate signals connectSignals(); @@ -151,11 +152,11 @@ } } -void BranchPropertyWindow::setMapEditor (MapEditor *me) +void BranchPropertyWindow::setModel (VymModel *m) { - mapEditor=me; - if (mapEditor) - setBranch (mapEditor->getSelectedBranch() ); + model=m; + if (model) + setBranch (model->getSelectedBranch() ); else ui.tabWidget->setEnabled (false); @@ -163,17 +164,17 @@ void BranchPropertyWindow::frameTypeChanged (int i) { - if (mapEditor) + if (model) { switch (i) { - case 0: mapEditor->setFrameType (FrameObj::NoFrame); break; + case 0: model->setFrameType (FrameObj::NoFrame); break; case 1: - mapEditor->setFrameType (FrameObj::Rectangle); + model->setFrameType (FrameObj::Rectangle); break; case 2: - mapEditor->setFrameType (FrameObj::Ellipse); - mapEditor->setFramePadding (5); + model->setFrameType (FrameObj::Ellipse); + model->setFramePadding (5); break; } setBranch (branch); @@ -182,54 +183,54 @@ void BranchPropertyWindow::framePenColorClicked() { - if (mapEditor) + if (model) { QColor col = QColorDialog::getColor( penColor, this ); if ( col.isValid() ) { penColor=col; - mapEditor->setFramePenColor (penColor); + model->setFramePenColor (penColor); } } } void BranchPropertyWindow::frameBrushColorClicked() { - if (mapEditor) + if (model) { QColor col = QColorDialog::getColor( brushColor, this ); if ( col.isValid() ) { brushColor=col; - mapEditor->setFrameBrushColor (brushColor); + model->setFrameBrushColor (brushColor); } } } void BranchPropertyWindow::framePaddingChanged(int i) { - if (mapEditor) mapEditor->setFramePadding (i); + if (model) model->setFramePadding (i); } void BranchPropertyWindow::frameBorderWidthChanged(int i) { - if (mapEditor) mapEditor->setFrameBorderWidth(i); + if (model) model->setFrameBorderWidth(i); } void BranchPropertyWindow::linkHideUnselectedChanged (int i) { if (!branch) return; - mapEditor->setHideLinkUnselected(i); + model->setHideLinkUnselected(i); } void BranchPropertyWindow::incImgVerChanged (int i) { - if (mapEditor) mapEditor->setIncludeImagesVer (i); + if (model) model->setIncludeImagesVer (i); } void BranchPropertyWindow::incImgHorChanged (int i) { - if (mapEditor) mapEditor->setIncludeImagesHor (i); + if (model) model->setIncludeImagesHor (i); } void BranchPropertyWindow::closeEvent( QCloseEvent* ce ) @@ -262,7 +263,7 @@ void BranchPropertyWindow::deleteAttributeClicked() { - cout << "BPW::delete\n"; + //FIXME cout << "BPW::delete\n"; } void BranchPropertyWindow::connectSignals() diff -r 192e1392ba6a -r 12958f987bcf branchpropwindow.h --- a/branchpropwindow.h Wed Jul 16 10:44:44 2008 +0000 +++ b/branchpropwindow.h Wed Jul 16 10:46:14 2008 +0000 @@ -10,8 +10,7 @@ #include "attributedelegate.h" #include "branchobj.h" -#include "mapeditor.h" - +#include "vymmodel.h" class QAbstractItemModel; @@ -22,7 +21,7 @@ BranchPropertyWindow (QWidget *parent=0); ~BranchPropertyWindow (); void setBranch (BranchObj *); - void setMapEditor (MapEditor *); + void setModel (VymModel *); private slots: void frameTypeChanged (int); @@ -49,7 +48,7 @@ Ui::BranchPropertyWindow ui; BranchObj *branch; - MapEditor *mapEditor; + VymModel *model; QColor penColor; QColor brushColor; diff -r 192e1392ba6a -r 12958f987bcf demos/math.vym Binary file demos/math.vym has changed diff -r 192e1392ba6a -r 12958f987bcf demos/vym-projectplan.vym Binary file demos/vym-projectplan.vym has changed diff -r 192e1392ba6a -r 12958f987bcf editxlinkdialog.cpp --- a/editxlinkdialog.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/editxlinkdialog.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -62,8 +62,8 @@ if (xlo) { if (selection && - ((typeid(*selection) == typeid(BranchObj)) || - (typeid(*selection) == typeid(MapCenterObj))) ) + (typeid(*selection) == typeid(BranchObj)) || + (typeid(*selection) == typeid(MapCenterObj)) ) { QColor col=((BranchObj*)(selection))->getColor(); xlo->setColor(col); diff -r 192e1392ba6a -r 12958f987bcf exports.cpp --- a/exports.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/exports.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -251,92 +251,77 @@ //////////////////////////////////////////////////////////////////////// void ExportKDEBookmarks::doExport() { - MapEditor *me=model->getMapEditor(); - if (me) + WarningDialog dia; + dia.showCancelButton (true); + dia.setText(QObject::tr("Exporting the %1 bookmarks will overwrite\nyour existing bookmarks file.").arg("KDE")); + dia.setCaption(QObject::tr("Warning: Overwriting %1 bookmarks").arg("KDE")); + dia.setShowAgainName("/exports/KDE/overwriteKDEBookmarks"); + if (dia.exec()==QDialog::Accepted) { - WarningDialog dia; - dia.showCancelButton (true); - dia.setText(QObject::tr("Exporting the %1 bookmarks will overwrite\nyour existing bookmarks file.").arg("KDE")); - dia.setCaption(QObject::tr("Warning: Overwriting %1 bookmarks").arg("KDE")); - dia.setShowAgainName("/exports/KDE/overwriteKDEBookmarks"); - if (dia.exec()==QDialog::Accepted) + model->exportXML(tmpDir.path(),false); + + XSLTProc p; + p.setInputFile (tmpDir.path()+"/"+model->getMapName()+".xml"); + p.setOutputFile (tmpDir.home().path()+"/.kde/share/apps/konqueror/bookmarks.xml"); + p.setXSLFile (vymBaseDir.path()+"/styles/vym2kdebookmarks.xsl"); + p.process(); + + QString ub=vymBaseDir.path()+"/scripts/update-bookmarks"; + QProcess *proc= new QProcess ; + proc->start( ub); + if (!proc->waitForStarted()) { - me->exportXML(tmpDir.path(),false); - - XSLTProc p; - p.setInputFile (tmpDir.path()+"/"+me->getMapName()+".xml"); - p.setOutputFile (tmpDir.home().path()+"/.kde/share/apps/konqueror/bookmarks.xml"); - p.setXSLFile (vymBaseDir.path()+"/styles/vym2kdebookmarks.xsl"); - p.process(); - - QString ub=vymBaseDir.path()+"/scripts/update-bookmarks"; - QProcess *proc= new QProcess ; - proc->start( ub); - if (!proc->waitForStarted()) - { - QMessageBox::warning(0, - QObject::tr("Warning"), - QObject::tr("Couldn't find script %1\nto notifiy Browsers of changed bookmarks.").arg(ub)); - } - } + QMessageBox::warning(0, + QObject::tr("Warning"), + QObject::tr("Couldn't find script %1\nto notifiy Browsers of changed bookmarks.").arg(ub)); + } } - } //////////////////////////////////////////////////////////////////////// void ExportFirefoxBookmarks::doExport() { - MapEditor *me=model->getMapEditor(); - if (me) + WarningDialog dia; + dia.showCancelButton (true); + dia.setText(QObject::tr("Exporting the %1 bookmarks will overwrite\nyour existing bookmarks file.").arg("Firefox")); + dia.setCaption(QObject::tr("Warning: Overwriting %1 bookmarks").arg("Firefox")); + dia.setShowAgainName("/vym/warnings/overwriteImportBookmarks"); + if (dia.exec()==QDialog::Accepted) { - WarningDialog dia; - dia.showCancelButton (true); - dia.setText(QObject::tr("Exporting the %1 bookmarks will overwrite\nyour existing bookmarks file.").arg("Firefox")); - dia.setCaption(QObject::tr("Warning: Overwriting %1 bookmarks").arg("Firefox")); - dia.setShowAgainName("/vym/warnings/overwriteImportBookmarks"); - if (dia.exec()==QDialog::Accepted) - { - me->exportXML(tmpDir.path(),false); + model->exportXML(tmpDir.path(),false); /* - XSLTProc p; - p.setInputFile (tmpDir.path()+"/"+me->getMapName()+".xml"); - p.setOutputFile (tmpDir.home().path()+"/.kde/share/apps/konqueror/bookmarks.xml"); - p.setXSLFile (vymBaseDir.path()+"/styles/vym2kdebookmarks.xsl"); - p.process(); + XSLTProc p; + p.setInputFile (tmpDir.path()+"/"+me->getMapName()+".xml"); + p.setOutputFile (tmpDir.home().path()+"/.kde/share/apps/konqueror/bookmarks.xml"); + p.setXSLFile (vymBaseDir.path()+"/styles/vym2kdebookmarks.xsl"); + p.process(); - QString ub=vymBaseDir.path()+"/scripts/update-bookmarks"; - QProcess *proc = new QProcess( ); - proc->addArgument(ub); + QString ub=vymBaseDir.path()+"/scripts/update-bookmarks"; + QProcess *proc = new QProcess( ); + proc->addArgument(ub); - if ( !proc->start() ) - { - QMessageBox::warning(0, - QObject::tr("Warning"), - QObject::tr("Couldn't find script %1\nto notifiy Browsers of changed bookmarks.").arg(ub)); - } + if ( !proc->start() ) + { + QMessageBox::warning(0, + QObject::tr("Warning"), + QObject::tr("Couldn't find script %1\nto notifiy Browsers of changed bookmarks.").arg(ub)); + } */ - - } } } //////////////////////////////////////////////////////////////////////// void ExportTaskjuggler::doExport() { - MapEditor *me=model->getMapEditor(); - if (me) - { - me->exportXML(tmpDir.path(),false); + model->exportXML(tmpDir.path(),false); - XSLTProc p; - p.setInputFile (tmpDir.path()+"/"+me->getMapName()+".xml"); - p.setOutputFile (outputFile); - p.setXSLFile (vymBaseDir.path()+"/styles/vym2taskjuggler.xsl"); - p.process(); - } - + XSLTProc p; + p.setInputFile (tmpDir.path()+"/"+model->getMapName()+".xml"); + p.setOutputFile (outputFile); + p.setXSLFile (vymBaseDir.path()+"/styles/vym2taskjuggler.xsl"); + p.process(); } //////////////////////////////////////////////////////////////////////// diff -r 192e1392ba6a -r 12958f987bcf file.cpp --- a/file.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/file.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -354,8 +354,6 @@ // Set up members of the STARTUPINFO structure. ::ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) ); siStartInfo.cb = sizeof(STARTUPINFO); - siStartInfo.dwFlags = STARTF_USESHOWWINDOW; - siStartInfo.wShowWindow = SW_MINIMIZE; // Create command line. QString argv("unzip -o "); @@ -364,32 +362,26 @@ argv.append(QDir::convertSeparators(zipDir.path())); // Create the child process. - if (!::CreateProcess(NULL, - (LPWSTR) argv.unicode(), // command line - NULL, // process security attributes - NULL, // primary thread security attributes - TRUE, // handles are inherited - 0, // creation flags - NULL, // use parent's environment - NULL, // use parent's current directory - &siStartInfo, // STARTUPINFO pointer - &piProcInfo) ) // receives PROCESS_INFORMATION + if( !::CreateProcess(NULL, + (LPWSTR)argv.unicode(), // command line + NULL, // process security attributes + NULL, // primary thread security attributes + TRUE, // handles are inherited + 0, // creation flags + NULL, // use parent's environment + NULL, // use parent's current directory + &siStartInfo, // STARTUPINFO pointer + &piProcInfo) ) // receives PROCESS_INFORMATION { - QMessageBox::critical( 0, QObject::tr( "Critical Error" ), - QObject::tr("Couldn't start unzip to decompress data.")); err = aborted; } else { // Wait for it to finish. - ::WaitForSingleObject( piProcInfo.hProcess, INFINITE ); - - // Clean up handles. - CloseHandle(piProcInfo.hThread); - CloseHandle(piProcInfo.hProcess); + ::WaitForSingleObject( piProcInfo.hProcess, 10000 ); } #endif - return err; + return err; } bool loadStringFromDisk (const QString &fname, QString &s) @@ -503,3 +495,5 @@ if (imageFilters.at(i)==filter) return imageTypes.at(i); return QString(); } + + diff -r 192e1392ba6a -r 12958f987bcf floatimageobj.cpp --- a/floatimageobj.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/floatimageobj.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -214,13 +214,13 @@ return bbox; } -QRectF FloatImageObj::getBBoxSizeWithChilds() +QRectF FloatImageObj::getBBoxSizeWithChildren() { //TODO abstract in linkablemapobj.h, not calculated return bboxTotal; } -void FloatImageObj::calcBBoxSizeWithChilds() +void FloatImageObj::calcBBoxSizeWithChildren() { //TODO abstract in linkablemapobj.h } diff -r 192e1392ba6a -r 12958f987bcf floatimageobj.h --- a/floatimageobj.h Wed Jul 16 10:44:44 2008 +0000 +++ b/floatimageobj.h Wed Jul 16 10:46:14 2008 +0000 @@ -30,9 +30,9 @@ virtual void move (QPointF); virtual void positionBBox(); virtual void calcBBoxSize(); - virtual QRectF getTotalBBox(); // return BBox including childs - virtual QRectF getBBoxSizeWithChilds(); // return size of BBox including childs - virtual void calcBBoxSizeWithChilds(); // calc size of BBox including childs recursivly + virtual QRectF getTotalBBox(); // return BBox including children + virtual QRectF getBBoxSizeWithChildren(); // return size of BBox including children + virtual void calcBBoxSizeWithChildren(); // calc size of BBox including children recursivly virtual QString saveToDir(const QString &,const QString&); virtual void resetSaveCounter(); diff -r 192e1392ba6a -r 12958f987bcf floatobj.cpp --- a/floatobj.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/floatobj.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -97,7 +97,7 @@ return bbox; } -QRectF FloatObj::getBBoxSizeWithChilds() +QRectF FloatObj::getBBoxSizeWithChildren() { return bboxTotal; } diff -r 192e1392ba6a -r 12958f987bcf floatobj.h --- a/floatobj.h Wed Jul 16 10:44:44 2008 +0000 +++ b/floatobj.h Wed Jul 16 10:46:14 2008 +0000 @@ -26,8 +26,8 @@ virtual void setDockPos(); virtual void reposition(); - virtual QRectF getTotalBBox(); // return BBox including childs - virtual QRectF getBBoxSizeWithChilds(); // return size of BBox including childs + virtual QRectF getTotalBBox(); // return BBox including children + virtual QRectF getBBoxSizeWithChildren(); // return size of BBox including children virtual void resetSaveCounter()=0; diff -r 192e1392ba6a -r 12958f987bcf lang/vym_de.ts --- a/lang/vym_de.ts Wed Jul 16 10:44:44 2008 +0000 +++ b/lang/vym_de.ts Wed Jul 16 10:46:14 2008 +0000 @@ -1838,7 +1838,7 @@ <source>This map does not exist: %1 Do you want to create a new one?</source> - <translation>Diese Map gibt es nicht: + <translation>Diese Map gibt es nich: %1 Wollen Sie eine neue anlegen?</translation> </message> diff -r 192e1392ba6a -r 12958f987bcf lang/vym_it.ts --- a/lang/vym_it.ts Wed Jul 16 10:44:44 2008 +0000 +++ b/lang/vym_it.ts Wed Jul 16 10:46:14 2008 +0000 @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS><TS version="1.1" language="it"> -<defaultcodec></defaultcodec> <context> <name>AboutDialog</name> <message> @@ -59,17 +58,17 @@ <message> <location filename="../attributedialog.cpp" line="48"/> <source>Attributes</source> - <translation>Attributi</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../attributedialog.cpp" line="49"/> <source>Add key</source> - <translation>Aggiungi chiave</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../attributedialog.cpp" line="50"/> <source>Close</source> - <translation>Chiudi</translation> + <translation type="unfinished">Chiudi</translation> </message> </context> <context> @@ -77,7 +76,7 @@ <message> <location filename="../attributewidget.ui" line="13"/> <source>Form</source> - <translation>Form</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -86,55 +85,55 @@ <location filename="../branchpropwindow.cpp" line="16"/> <source>Property Editor</source> <comment>Window caption</comment> - <translation>Editor di proprietà</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.cpp" line="32"/> <source>Name</source> <comment>Branchprop window: Attribute name</comment> - <translation>Nome</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.cpp" line="33"/> <source>Value</source> <comment>Branchprop window: Attribute value</comment> - <translation>Valore</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.cpp" line="34"/> <source>Type</source> <comment>Branchprop window: Attribute type</comment> - <translation>Tipo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="19"/> <source>Branch Property Editor</source> - <translation>Editor di proprietà del Ramo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="29"/> <source>Frame</source> - <translation>Frame</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="50"/> <source>Geometry</source> - <translation>Geometria</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="63"/> <source>No Frame</source> - <translation>Senza Frame</translation> + <translation type="unfinished">Senza Frame</translation> </message> <message> <location filename="../branchpropwindow.ui" line="68"/> <source>Rectangle</source> - <translation>Rettangolo</translation> + <translation type="unfinished">Rettangolo</translation> </message> <message> <location filename="../branchpropwindow.ui" line="73"/> <source>Ellipse</source> - <translation>Ellisse</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="94"/> @@ -144,67 +143,67 @@ <message> <location filename="../branchpropwindow.ui" line="101"/> <source>Borderline width</source> - <translation>Spessore contorno</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="151"/> <source>Colors</source> - <translation>Colori</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="194"/> <source>Borderline color</source> - <translation>Colore Contorno</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="217"/> <source>Background color</source> - <translation>Colore di sfondo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="246"/> <source>Layout</source> - <translation>Layout</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="254"/> <source>Include images horizontally</source> - <translation>Includi immagini orizzontalmente</translation> + <translation type="unfinished">Includi immagini orizzontalmente</translation> </message> <message> <location filename="../branchpropwindow.ui" line="261"/> <source>Include images vertically</source> - <translation>Includi immagini verticalmente</translation> + <translation type="unfinished">Includi immagini verticalmente</translation> </message> <message> <location filename="../branchpropwindow.ui" line="284"/> <source>Link</source> - <translation>Puntatore</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="290"/> <source>Hide link if unselected</source> - <translation>Nascondi puntatori se non seleionati</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="311"/> <source>Attributes</source> - <translation>Attributi</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="337"/> <source>+</source> - <translation>+</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="344"/> <source>-</source> - <translation>-</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../branchpropwindow.ui" line="413"/> <source>Close</source> - <translation>Chiudi</translation> + <translation type="unfinished">Chiudi</translation> </message> </context> <context> @@ -529,7 +528,7 @@ <message> <location filename="../exportxhtmldialog.ui" line="165"/> <source>show warnings of xslt processor</source> - <translation>mostra avvertimenti del processore xslt</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -603,7 +602,7 @@ <message> <location filename="../vymmodel.cpp" line="105"/> <source>New map</source> - <translation>Nuova Mappa</translation> + <translation type="unfinished">Nuova Mappa</translation> </message> </context> <context> @@ -1132,7 +1131,7 @@ <message> <location filename="../mainwindow.cpp" line="974"/> <source>Set &Link Color</source> - <translation>Specifica Co&lore dei Collegamenti</translation> + <translation type="unfinished">Specifica Co&lore dei Collegamenti</translation> </message> <message> <location filename="../mainwindow.cpp" line="987"/> @@ -2773,149 +2772,149 @@ <location filename="../mainwindow.cpp" line="301"/> <source>&New map</source> <comment>File menu</comment> - <translation>&Nuova mappa</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="308"/> <source>&Copy to new map</source> <comment>File menu</comment> - <translation>&Copia in una nuova mappa</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="309"/> <source>Copy selection to mapcenter of a new map</source> <comment>Status tip File menu</comment> - <translation>Copia la selezione nel centro di una nuova mappa</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="532"/> <source>Add mapcenter</source> <comment>Canvas context menu</comment> - <translation>Aggiungi centro mappa</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="631"/> <source>Sort children</source> <comment>Edit menu</comment> - <translation>Ordina i figli</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="661"/> <source>Unscroll childs</source> <comment>Edit menu</comment> - <translation>Mostra i figli</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="662"/> <source>Unscroll all scrolled branches in selected subtree</source> - <translation>Mostra tutti i rami in sottorami selezionati</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="707"/> <source>Edit local URL...</source> <comment>Edit menu</comment> - <translation>Modifical URL locale...</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="708"/> <source>Edit local URL</source> - <translation>Modifica URL locale</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="723"/> <source>Create URL to Novell Bugzilla</source> <comment>Edit menu</comment> - <translation>Crea un URL al Novell Bugzilla</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="724"/> <source>Create URL to Novell Bugzilla</source> - <translation>Crea un URL al Novell Bugzilla</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="730"/> <source>Create URL to Novell FATE</source> <comment>Edit menu</comment> - <translation>Crea un URL al Novell FATE</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="731"/> <source>Create URL to Novell FATE</source> - <translation>Crea un URL al Novell FATE</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="874"/> <source>Property window</source> <comment>Dialog to edit properties of selection</comment> - <translation>Finestra di proprietà</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="875"/> <source>Set properties for selection</source> - <translation>Imposta le proprietà per la selezione</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="939"/> <source>Linkstyle Curve</source> - <translation>Collegamenti Curvilinei</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="951"/> <source>Linkstyle Thick Curve</source> - <translation>Collegamenti Curvilinei Spessi</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="980"/> <source>Set &Selection Color</source> - <translation>Scegli Colore di &Selezione</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="981"/> <source>Set Selection Color</source> - <translation>Scegli Colore di Selezione</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="992"/> <source>Set &Background image</source> - <translation>Scegli immagine di S&fondo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="993"/> <source>Set Background image</source> - <translation>Scegli immagine di Sfondo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1029"/> <source>Show selection</source> <comment>View action</comment> - <translation>Mostra selezione</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1030"/> <source>Show selection</source> - <translation>Mostra selezione</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1047"/> <source>History Window</source> <comment>View action</comment> - <translation>Finestra di Cronologia</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1048"/> <source>Show History Window</source> - <translation>Mostra la finestra di Cronologia</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1060"/> <source>Antialiasing</source> <comment>View action</comment> - <translation>Antialiasing</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1061"/> <source>Antialiasing</source> - <translation>Antialiasing</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1068"/> @@ -2927,127 +2926,127 @@ <location filename="../mainwindow.cpp" line="1076"/> <source>Next Map</source> <comment>View action</comment> - <translation>Mappa successiva</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1082"/> <source>Previous Map</source> <comment>View action</comment> - <translation>Mappa precedente</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1136"/> <source>Note</source> <comment>SystemFlag</comment> - <translation>Note</translation> + <translation type="unfinished">Note</translation> </message> <message> <location filename="../mainwindow.cpp" line="1139"/> <source>URL to Document </source> <comment>SystemFlag</comment> - <translation>URL al Documento </translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1142"/> <source>Link to another vym map</source> <comment>SystemFlag</comment> - <translation>Collega ad un'altra mappa vym</translation> + <translation type="unfinished">Collega ad un'altra mappa vym</translation> </message> <message> <location filename="../mainwindow.cpp" line="1145"/> <source>subtree is scrolled</source> <comment>SystemFlag</comment> - <translation>sottoalbero è espanso</translation> + <translation type="unfinished">sottoalbero è espanso</translation> </message> <message> <location filename="../mainwindow.cpp" line="1148"/> <source>subtree is temporary scrolled</source> <comment>SystemFlag</comment> - <translation>sottoalbero è temporaneamente espanso</translation> + <translation type="unfinished">sottoalbero è temporaneamente espanso</translation> </message> <message> <location filename="../mainwindow.cpp" line="1151"/> <source>Hide object in exported maps</source> <comment>SystemFlag</comment> - <translation>Nascondi oggetto nelle mappe esportate</translation> + <translation type="unfinished">Nascondi oggetto nelle mappe esportate</translation> </message> <message> <location filename="../mainwindow.cpp" line="1235"/> <source>I just love...</source> <comment>Standardflag</comment> - <translation> Lo amo... </translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1256"/> <source>Important</source> <comment>Freemind-Flag</comment> - <translation>Importante</translation> + <translation type="unfinished">Importante</translation> </message> <message> <location filename="../mainwindow.cpp" line="1261"/> <source>Priority</source> <comment>Freemind-Flag</comment> - <translation>Priorità</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1265"/> <source>Back</source> <comment>Freemind-Flag</comment> - <translation>Indietro</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1268"/> <source>Forward</source> <comment>Freemind-Flag</comment> - <translation>Avanti</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1271"/> <source>Look here</source> <comment>Freemind-Flag</comment> - <translation>Guardami</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1274"/> <source>Dangerous</source> <comment>Freemind-Flag</comment> - <translation>Pericoloso</translation> + <translation type="unfinished">Pericoloso</translation> </message> <message> <location filename="../mainwindow.cpp" line="1277"/> <source>Don't forget</source> <comment>Freemind-Flag</comment> - <translation>Non Trascurare</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1280"/> <source>Flag</source> <comment>Freemind-Flag</comment> - <translation>Flag</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1284"/> <source>Home</source> <comment>Freemind-Flag</comment> - <translation>Principio</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1288"/> <source>Telephone</source> <comment>Freemind-Flag</comment> - <translation>Telefono</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1291"/> <source>Music</source> <comment>Freemind-Flag</comment> - <translation>Musica</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1294"/> <source>Mailbox</source> <comment>Freemind-Flag</comment> - <translation>Casella di Posta</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1297"/> @@ -3059,208 +3058,206 @@ <location filename="../mainwindow.cpp" line="1300"/> <source>Password</source> <comment>Freemind-Flag</comment> - <translation>Password</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1303"/> <source>To be improved</source> <comment>Freemind-Flag</comment> - <translation>Da migliorare</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1306"/> <source>Stop</source> <comment>Freemind-Flag</comment> - <translation>Stop</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1309"/> <source>Magic</source> <comment>Freemind-Flag</comment> - <translation>Magico</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1312"/> <source>To be discussed</source> <comment>Freemind-Flag</comment> - <translation>Da discutere</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1315"/> <source>Reminder</source> <comment>Freemind-Flag</comment> - <translation>Appunto</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1318"/> <source>Excellent</source> <comment>Freemind-Flag</comment> - <translation>Eccellente</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1321"/> <source>Linux</source> <comment>Freemind-Flag</comment> - <translation>Linux</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1324"/> <source>Sweet</source> <comment>Freemind-Flag</comment> - <translation>Dolce</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1390"/> <source>Set path for macros</source> <comment>Settings action</comment> - <translation>Seleziona percorso per le macro</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1391"/> <source>Set path for macros</source> - <translation>Seleziona percorso per le macro</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1395"/> <source>Set number of undo levels</source> <comment>Settings action</comment> - <translation>Imposta numero di livelli Annulla</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1396"/> <source>Set number of undo levels</source> - <translation>Imposta numero di livelli Annulla</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1402"/> <source>Autosave</source> <comment>Settings action</comment> - <translation>Salva Automatico</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1403"/> <source>Autosave</source> - <translation>Salva Automatico</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1410"/> <source>Autosave time</source> <comment>Settings action</comment> - <translation>Tempo per salva automativo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1411"/> <source>Autosave time</source> - <translation>Tempo per salva automativo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1416"/> <source>Write backup file on save</source> <comment>Settings action</comment> - <translation>Scrivi un file di backup al Salvataggio</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1417"/> <source>Write backup file on save</source> - <translation>Scrivi un file di backup al Salvataggio</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1469"/> <source>Animation</source> <comment>Settings action</comment> - <translation>Animazione</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1470"/> <source>Animation</source> - <translation>Animazione</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1514"/> <source>Open VYM example maps </source> <comment>Help action</comment> - <translation>Apri mappe VYM di esempio</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1515"/> <source>Open VYM example maps </source> - <translation>Apri mappe VYM di esempio </translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1569"/> <source>References (URLs, vymLinks, ...)</source> <comment>Context menu name</comment> - <translation>Referenze (URL, LinkVYM, ...)</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="1645"/> <source>&%1 %2</source> - <translation>&%1 %2</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="2108"/> <source>Load Freemind map</source> - <translation>Carica mappa Freemind</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="2202"/> <source>Export as CSV</source> - <translation>Esporta in CSV</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="3268"/> <source>Directory with vym macros:</source> - <translation>Cartella con macro vym:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="3300"/> <source>QInputDialog::getInteger()</source> - <translation>QInputDialog::getInteger()</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="3281"/> <source>Number of undo/redo levels:</source> - <translation>Numero di livelli annulla/rifai:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="3286"/> <source>Settings have been changed. The next map opened will have "%1" undo/redo levels</source> - <translation>Le impostazione sono state salvate. La prossima mappa avra "%1" livelli di annulla/rifai</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="3301"/> <source>Number of seconds before autosave:</source> - <translation>Numero di secondi prima del salvataggio automatico:</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="3411"/> <source>History for %1</source> <comment>Window Caption</comment> - <translation>Cronologia per %1</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="3735"/> <source>Couldn't find the documentation %1 in: %2</source> - <translation>Non è possibile trovare la documentazione %1 in: -%2</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="3771"/> <source>Load vym example map</source> - <translation>Carica mappa di esempio vym</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="3820"/> <source>Couldn't find a macro at %1. </source> - <translation>Non è possibile trovare la macro in %1. -</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mainwindow.cpp" line="3821"/> <source>Set directory for vym macros</source> - <translation>Imposta la cartella con le macro vym</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3612,20 +3609,19 @@ <message> <location filename="../mapeditor.cpp" line="1795"/> <source>Critical Load Error</source> - <translation>Errore Critico di Caricamento</translation> + <translation type="unfinished">Errore Critico di Caricamento</translation> </message> <message> <location filename="../mapeditor.cpp" line="1602"/> <source>Couldn't create temporary directory before load </source> - <translation>Non è possibile creare una cartella temporanea prima di caricare -</translation> + <translation type="unfinished">Non è possibile creare una cartella temporanea prima di caricare</translation> </message> <message> <location filename="../mapeditor.cpp" line="1645"/> <source>Couldn't find a map (*.xml) in .vym archive. </source> - <translation>Non è possibile trovare una mappa (*.xml) nell'archivio .vym. + <translation type="unfinished">Non è possibile trovare una mappa (*.xml) nell'archivio .vym. </translation> </message> <message> @@ -3636,7 +3632,7 @@ and flags and thus may overwrite files in the given directory Do you want to write the map</source> - <translation>La mappa %1 + <translation type="unfinished">La mappa %1 non usa il formato di compressione vym. Salvandolo in modo non compresso, salva anche le immagini e le flag e quindi potrebbe sovvrascrivere dei file in questa cartella @@ -3645,94 +3641,92 @@ <message> <location filename="../mapeditor.cpp" line="1746"/> <source>compressed (vym default)</source> - <translation>compresso (predefinito in vym)</translation> + <translation type="unfinished">compresso (predefinito in vym)</translation> </message> <message> <location filename="../mapeditor.cpp" line="1747"/> <source>uncompressed</source> - <translation>non compresso</translation> + <translation type="unfinished">non compresso</translation> </message> <message> <location filename="../mapeditor.cpp" line="1782"/> <source>Save Error</source> - <translation>Errore di Salvataggio</translation> + <translation type="unfinished">Errore di Salvataggio</translation> </message> <message> <location filename="../mapeditor.cpp" line="1778"/> <source>%1 could not be removed before saving</source> - <translation>%1 -non può essere rimosso prima del salvataggio</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mapeditor.cpp" line="1783"/> <source>%1 could not be renamed before saving</source> - <translation>%1 -non può essere rinominato prima del salvataggio</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mapeditor.cpp" line="1796"/> <source>Couldn't create temporary directory before save </source> - <translation>Non è possibile creare una cartella temporanea prima di salvare + <translation type="unfinished">Non è possibile creare una cartella temporanea prima di salvare </translation> </message> <message> <location filename="../mapeditor.cpp" line="2033"/> <source>Export map as image</source> - <translation>Esporta mappa come immagine</translation> + <translation type="unfinished">Esporta mappa come immagine</translation> </message> <message> <location filename="../mapeditor.cpp" line="2110"/> <source>Export XML to directory</source> - <translation>Esporta XML in una cartella</translation> + <translation type="unfinished">Esporta XML in una cartella</translation> </message> <message> <location filename="../mapeditor.cpp" line="2260"/> <source>Autosave disabled during undo.</source> - <translation>Salvataggio automatico disabilitato durante annullamento.</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mapeditor.cpp" line="3268"/> <source>Load background image</source> - <translation>Carica immagine di sfondo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mapeditor.cpp" line="3489"/> <source>Text</source> <comment>Filedialog</comment> - <translation>Testo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mapeditor.cpp" line="3490"/> <source>Spreadsheet</source> <comment>Filedialog</comment> - <translation>Foglio di calcolo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mapeditor.cpp" line="3491"/> <source>Textdocument</source> <comment>Filedialog</comment> - <translation>Documento di testo</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mapeditor.cpp" line="3492"/> <source>Images</source> <comment>Filedialog</comment> - <translation>Immagini</translation> + <translation type="unfinished">Immagini</translation> </message> <message> <location filename="../mapeditor.cpp" line="3495"/> <source>Set URL to a local file</source> - <translation>Imposta URL come file locale</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mapeditor.cpp" line="3727"/> <source>%1 items on map </source> <comment>Info about map</comment> - <translation>%1 oggetti nella mappa</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mapeditor.cpp" line="5291"/> @@ -3746,12 +3740,12 @@ <message> <location filename="../mapeditor.cpp" line="5297"/> <source>Reload</source> - <translation>Ricarica</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../mapeditor.cpp" line="5298"/> <source>Ignore</source> - <translation>Ignora</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3885,27 +3879,26 @@ <message> <location filename="../exports.cpp" line="131"/> <source>Export as ASCII</source> - <translation>Esporta in ASCII</translation> + <translation type="unfinished">Esporta in ASCII</translation> </message> <message> <location filename="../exports.cpp" line="131"/> <source>(still experimental)</source> - <translation>(in via di sperimentazione)</translation> + <translation type="unfinished">(in via di sperimentazione)</translation> </message> <message> <location filename="../file.cpp" line="99"/> <source>The directory %1 is not empty. Do you risk to overwrite its contents?</source> <comment>write directory</comment> - <translation>La cartella %1 non è vuota. + <translation type="unfinished">La cartella %1 non è vuota. Si rischia di sovvrascrivere i contenuti?</translation> </message> <message> <location filename="../main.cpp" line="193"/> <source>Couldn't open %1. </source> - <translation>Non è possibile aprire %1. -</translation> + <translation type="unfinished"></translation> </message> </context> <context> @@ -3931,7 +3924,7 @@ <message> <location filename="../simplescripteditor.cpp" line="61"/> <source>Save script</source> - <translation>Salva script</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../simplescripteditor.cpp" line="73"/> @@ -3939,81 +3932,80 @@ exists already. Do you want to overwrite it?</source> <comment>dialog 'save as'</comment> - <translation>Il file %1 + <translation type="unfinished">Il file %1 esiste già. Vuoi sovvrascriverlo?</translation> </message> <message> <location filename="../simplescripteditor.cpp" line="78"/> <source>Overwrite</source> - <translation>Sovvrascrivi</translation> + <translation type="unfinished">Sovvrascrivi</translation> </message> <message> <location filename="../simplescripteditor.cpp" line="79"/> <source>Cancel</source> - <translation>Cancella</translation> + <translation type="unfinished">Cancella</translation> </message> <message> <location filename="../simplescripteditor.cpp" line="105"/> <source>Load script</source> - <translation>Carica script</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../simplescripteditor.cpp" line="116"/> <source>Error</source> - <translation>Errore</translation> + <translation type="unfinished">Errore</translation> </message> <message> <location filename="../simplescripteditor.cpp" line="117"/> <source>Couldn't open %1. </source> - <translation>Non è possibile aprire %1. -</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../simplescripteditor.ui" line="13"/> <source>Simple Script Editor</source> - <translation>Editor semplice di script</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../simplescripteditor.ui" line="38"/> <source>Save as</source> - <translation>Salva come</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../simplescripteditor.ui" line="48"/> <source>Save</source> - <translation>Salva</translation> + <translation type="unfinished">Salva</translation> </message> <message> <location filename="../simplescripteditor.ui" line="51"/> <source>Qt::CTRL + Qt::Key_S</source> - <translation>Qt::CTRL + Qt::Key_S</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../simplescripteditor.ui" line="58"/> <source>Open</source> - <translation>Apri</translation> + <translation type="unfinished">Apri</translation> </message> <message> <location filename="../simplescripteditor.ui" line="61"/> <source>Qt::CTRL +Qt::Key_O</source> - <translation>Qt::CTRL + Qt::Key_O</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../simplescripteditor.ui" line="68"/> <source>Run</source> - <translation>Avvia</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../simplescripteditor.ui" line="71"/> <source>Qt::CTRL + Qt::Key_R</source> - <translation>Qt::CTRL + Qt::Key_R</translation> + <translation type="unfinished"></translation> </message> <message> <location filename="../simplescripteditor.ui" line="78"/> <source>Close</source> - <translation>Chiudi</translation> + <translation type="unfinished">Chiudi</translation> </message> </context> <context> @@ -4495,7 +4487,7 @@ <message> <location filename="../warningdialog.cpp" line="15"/> <source>Show this message again</source> - <translation>Mostra ancora questo messaggio</translation> + <translation type="unfinished"></translation> </message> </context> </TS> diff -r 192e1392ba6a -r 12958f987bcf linkablemapobj.cpp --- a/linkablemapobj.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/linkablemapobj.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -1,8 +1,12 @@ +#include <iostream> #include <math.h> #include "linkablemapobj.h" #include "branchobj.h" -#include "mapeditor.h" +#include "mapeditor.h" // FIXME needed? +#include "vymmodel.h" + +using namespace std; ///////////////////////////////////////////////////////////////// // LinkableMapObj @@ -54,6 +58,8 @@ void LinkableMapObj::init () { + model=NULL; + depth=-1; mapEditor=NULL; childObj=NULL; @@ -99,6 +105,7 @@ void LinkableMapObj::copy (LinkableMapObj* other) { MapObj::copy(other); + model=other->model; bboxTotal=other->bboxTotal; setLinkStyle(other->style); setLinkColor (other->linkcolor); @@ -107,6 +114,16 @@ objID=other->objID; } +void LinkableMapObj::setModel (VymModel *vm) +{ + model=vm; +} + +VymModel* LinkableMapObj::getModel() +{ + return model; +} + void LinkableMapObj::setChildObj(LinkableMapObj* o) { childObj=o; @@ -116,13 +133,14 @@ { parObj=o; mapEditor=parObj->getMapEditor(); + model=parObj->getModel(); // FIXME makes painting slow, but that's obvious because there are no links to paint, hmmm.... } -void LinkableMapObj::setParObjTmp(LinkableMapObj*,QPointF,int) +void LinkableMapObj::setParObjTmp(LinkableMapObj*,QPointF,int) // FIXME make pure virtual { } -void LinkableMapObj::unsetParObjTmp() +void LinkableMapObj::unsetParObjTmp() // FIXME make pure virtual { } @@ -180,8 +198,12 @@ LinkableMapObj::Style LinkableMapObj::getDefLinkStyle () { - if (!mapEditor) return UndefinedStyle; - Style ls=mapEditor->getMapLinkStyle(); + if (!model) + { + qWarning ("LMO::getDefLinkStyle model=NULL"); + return UndefinedStyle; + } + Style ls=model->getMapLinkStyle(); switch (ls) { case Line: @@ -309,10 +331,10 @@ void LinkableMapObj::setLinkColor() { - // Overloaded in BranchObj and childs + // Overloaded in BranchObj and children // here only set default color - if (mapEditor) - setLinkColor (mapEditor->getMapDefLinkColor()); + if (model) + setLinkColor (model->getMapDefLinkColor()); } void LinkableMapObj::setLinkColor(QColor col) @@ -606,6 +628,7 @@ void LinkableMapObj::setMapEditor (MapEditor *me) { mapEditor=me; + model=mapEditor->getModel(); } MapEditor* LinkableMapObj::getMapEditor () @@ -646,7 +669,7 @@ // we want to block expensive repositioning, but just do it once at // the end, thus check first: - if (mapEditor->isRepositionBlocked()) return; + if (mapEditor->getModel()->isRepositionBlocked()) return; // FIXME better go to model directly, maybe via a signal // Pass on the request to parental objects, if this hasn't been done yet diff -r 192e1392ba6a -r 12958f987bcf linkablemapobj.h --- a/linkablemapobj.h Wed Jul 16 10:44:44 2008 +0000 +++ b/linkablemapobj.h Wed Jul 16 10:46:14 2008 +0000 @@ -9,6 +9,7 @@ #define MAX_DEPTH 999 class MapEditor; +class VymModel; @@ -55,6 +56,10 @@ virtual void delLink(); virtual void init (); virtual void copy (LinkableMapObj*); + + virtual void setModel (VymModel *vm); + virtual VymModel* getModel (); + void setChildObj (LinkableMapObj*); virtual void setParObj (LinkableMapObj*); virtual void setParObjTmp (LinkableMapObj*,QPointF,int); // Only for moving Obj around @@ -94,12 +99,12 @@ LinkableMapObj* getParObj(); // returns pointer to toObj virtual LinkableMapObj* findObjBySelect(QString s); // find obj by selectstring virtual void setDockPos()=0; // sets childPos and parPos - QPointF getChildPos(); // returns pos where childs dock + QPointF getChildPos(); // returns pos where children dock QPointF getParPos(); // returns pos where parents dock Orientation getOrientation(); // get orientation virtual int getDepth(); // return depth - virtual void setMapEditor(MapEditor*); // set MapEditor (needed in LMO::updateNoteFlag) - virtual MapEditor* getMapEditor(); // get MapEditor (usually from parent); + virtual void setMapEditor(MapEditor*); // set MapEditor (needed in LMO::updateNoteFlag) FIXME not needed + virtual MapEditor* getMapEditor(); // get MapEditor (usually from parent); FIXME not needed virtual QPointF getRandPos(); // make randomised position virtual void reposition(); @@ -108,7 +113,7 @@ // of mapeditor e.g. in noteeditor virtual bool repositionRequested(); - virtual void calcBBoxSizeWithChilds()=0;// calc size of BBox including childs recursivly + virtual void calcBBoxSizeWithChildren()=0;// calc size of BBox including children recursivly virtual void select(); virtual void unselect(); @@ -120,13 +125,15 @@ QPointF childPos; QPointF parPos; bool link2ParPos; // While moving around, sometimes link to parent - MapEditor* mapEditor; // for and toggleScroll(), get default styles + MapEditor* mapEditor; // for and toggleScroll(), get default styles FIXME should not be needed with model available // and mapEditor->updateActions() // and mapEditor->updateSelection() + + VymModel* model; Orientation orientation; qreal linkwidth; // width of a link int depth; // depth: undef=-1 mapCenter=0 branch=1..n - QRectF bboxTotal; // bounding box including childs + QRectF bboxTotal; // bounding box including children LinkableMapObj* childObj; LinkableMapObj* parObj; diff -r 192e1392ba6a -r 12958f987bcf main.cpp --- a/main.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/main.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -1,5 +1,8 @@ #include <QApplication> +#include <iostream> +using namespace std; + #include "flagrowobj.h" #include "mainwindow.h" #include "options.h" diff -r 192e1392ba6a -r 12958f987bcf mainwindow.cpp --- a/mainwindow.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/mainwindow.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -79,8 +79,6 @@ { mainWindow=this; - setObjectName ("MainWindow"); - setCaption ("VYM - View Your Mind"); // Load window settings @@ -496,6 +494,7 @@ editMenu->addAction (a); actionEditPaste=a; +/* // Shortcuts to modify heading: a = new QAction(tr( "Edit heading","Edit menu" ),this); a->setStatusTip ( tr( "edit Heading" )); @@ -513,6 +512,8 @@ actionListBranches.append(a); editMenu->addAction (a); actionEditHeading=a; + +*/ a = new QAction( tr( "Edit heading","Edit menu" ), this); a->setStatusTip (tr( "edit Heading" )); //a->setShortcut ( Qt::Key_F2 ); //Edit heading @@ -660,10 +661,10 @@ addAction (alt); actionListBranches.append(actionEditToggleScroll); - a = new QAction( tr( "Unscroll childs","Edit menu" ), this); + a = new QAction( tr( "Unscroll children","Edit menu" ), this); a->setStatusTip (tr( "Unscroll all scrolled branches in selected subtree" )); editMenu->addAction (a); - connect( a, SIGNAL( triggered() ), this, SLOT( editUnscrollChilds() ) ); + connect( a, SIGNAL( triggered() ), this, SLOT( editUnscrollChildren() ) ); editMenu->addSeparator(); @@ -803,24 +804,24 @@ actionListBranches.append(a); actionEditSaveBranch=a; - // Only remove branch, not its childs + // Only remove branch, not its children a = new QAction(tr( "Remove only branch ","Edit menu" ), this); - a->setStatusTip ( tr( "Remove only branch and keep its childs" )); + a->setStatusTip ( tr( "Remove only branch and keep its children" )); a->setShortcut (Qt::ALT + Qt::Key_Delete ); - connect( a, SIGNAL( triggered() ), this, SLOT( editDeleteKeepChilds() ) ); + connect( a, SIGNAL( triggered() ), this, SLOT( editDeleteKeepChildren() ) ); a->setEnabled (false); addAction (a); actionListBranches.append(a); - actionEditDeleteKeepChilds=a; - - // Only remove childs of a branch - a = new QAction( tr( "Remove childs","Edit menu" ), this); - a->setStatusTip (tr( "Remove childs of branch" )); + actionEditDeleteKeepChildren=a; + + // Only remove children of a branch + a = new QAction( tr( "Remove children","Edit menu" ), this); + a->setStatusTip (tr( "Remove children of branch" )); a->setShortcut (Qt::SHIFT + Qt::Key_Delete ); - connect( a, SIGNAL( triggered() ), this, SLOT( editDeleteChilds() ) ); + connect( a, SIGNAL( triggered() ), this, SLOT( editDeleteChildren() ) ); a->setEnabled (false); actionListBranches.append(a); - actionEditDeleteChilds=a; + actionEditDeleteChildren=a; // Shortcuts for navigating with cursor: a = new QAction(tr( "Select upper branch","Edit menu" ), this); @@ -1554,8 +1555,8 @@ branchRemoveContextMenu =branchContextMenu->addMenu (tr ("Remove","Context menu name")); branchRemoveContextMenu->addAction (actionEditCut); branchRemoveContextMenu->addAction ( actionEditDelete ); - branchRemoveContextMenu->addAction ( actionEditDeleteKeepChilds ); - branchRemoveContextMenu->addAction ( actionEditDeleteChilds ); + branchRemoveContextMenu->addAction ( actionEditDeleteKeepChildren ); + branchRemoveContextMenu->addAction ( actionEditDeleteChildren ); actionEditSaveBranch->addTo( branchContextMenu ); @@ -1690,12 +1691,24 @@ MapEditor* Main::currentMapEditor() const { + // FIXME currentMapEditor should return the latest used editor for a model, or NULL if no editor is open if ( tabWidget->currentPage() && tabWidget->currentPage()->inherits( "MapEditor" ) ) return (MapEditor*)tabWidget->currentPage(); return NULL; } +VymModel* Main::currentModel() const +{ + // FIXME better get currentModel from a maintained list, + // just in case we allow other views in tabs later + MapEditor *me=currentMapEditor(); + if (me) + return me->getModel(); + else + return NULL; +} + void Main::editorChanged(QWidget *) { @@ -1704,11 +1717,11 @@ MapEditor *me; for (int i=0;i<=tabWidget->count() -1;i++) { + me=(MapEditor*)tabWidget->page(i); - me->unselect(); + me->getModel()->unselect(); } - me=currentMapEditor(); - if (me) me->reselect(); + currentModel()->reselect(); // Update actions to in menus and toolbars according to editor updateActions(); @@ -1716,8 +1729,10 @@ void Main::fileNew() { + VymModel *m=new VymModel; + models.append (m); + MapEditor* me = new MapEditor (m); QString fn="unnamed"; - MapEditor* me = new MapEditor ( NULL); tabWidget->addTab (me,fn); tabWidget->showPage(me); me->viewport()->setFocus(); @@ -1725,7 +1740,7 @@ me->setSmoothPixmap(actionViewToggleSmoothPixmapTransform->isOn()); // For the very first map we do not have flagrows yet... - me->select("mc:"); + currentModel()->select("mc:"); } void Main::fileNewCopy() @@ -1734,8 +1749,10 @@ MapEditor* oldME =currentMapEditor(); if (oldME) { - oldME->copy(); - MapEditor* newME = new MapEditor ( NULL); + oldME->getModel()->copy(); + VymModel *m=new VymModel; + models.append (m); + MapEditor* newME = new MapEditor ( m); if (newME) { tabWidget->addTab (newME,fn); @@ -1744,8 +1761,8 @@ newME->setAntiAlias (actionViewToggleAntiAlias->isOn()); newME->setSmoothPixmap(actionViewToggleSmoothPixmapTransform->isOn()); // For the very first map we do not have flagrows yet... - newME->select("mc:"); - newME->load (clipboardDir+"/"+clipboardFile,ImportReplace, VymMap); + m->select("mc:"); + m->load (clipboardDir+"/"+clipboardFile,ImportReplace, VymMap); } } @@ -1770,7 +1787,7 @@ while (i<=tabWidget->count() -1) { me=(MapEditor*)tabWidget->page(i); - if (me->getFilePath() == fn) + if (me->getModel()->getFilePath() == fn) { // Already there, ask for confirmation QMessageBox mb( vymName, @@ -1809,9 +1826,11 @@ // Check first, if mapeditor exists // If it is not default AND we want a new map, // create a new mapeditor in a new tab - if ( lmode==NewMap && (!me || !me->isDefault() ) ) + if ( lmode==NewMap && (!me || !me->getModel()->isDefault() ) ) { - me= new MapEditor ( NULL); + VymModel *m=new VymModel; + models.append (m); + me= new MapEditor ( m); tabWidget->addTab (me,fn); tabIndex=tabWidget->indexOf (me); tabWidget->setCurrentPage (tabIndex); @@ -1821,8 +1840,6 @@ // Check, if file exists (important for creating new files // from command line - /* - */ if (!QFile(fn).exists() ) { QMessageBox mb( vymName, @@ -1838,9 +1855,9 @@ { case QMessageBox::Yes: // Create new map - currentMapEditor()->setFilePath(fn); + currentMapEditor()->getModel()->setFilePath(fn); tabWidget->setTabLabel (currentMapEditor(), - currentMapEditor()->getFileName() ); + currentMapEditor()->getModel()->getFileName() ); statusBar()->message( "Created " + fn , statusbarTime ); return success; @@ -1852,6 +1869,7 @@ } } + //tabWidget->currentPage() won't be NULL here, because of above... tabWidget->showPage(me); me->viewport()->setFocus(); @@ -1859,15 +1877,15 @@ if (err!=aborted) { // Save existing filename in case we import - QString fn_org=me->getFilePath(); + QString fn_org=me->getModel()->getFilePath(); // Finally load map into mapEditor - me->setFilePath (fn); - err=me->load(fn,lmode,ftype); + me->getModel()->setFilePath (fn); + err=me->getModel()->load(fn,lmode,ftype); // Restore old (maybe empty) filepath, if this is an import if (lmode!=NewMap) - me->setFilePath (fn_org); + me->getModel()->setFilePath (fn_org); } // Finally check for errors and go home @@ -1879,13 +1897,13 @@ { if (lmode==NewMap) { - me->setFilePath (fn); - tabWidget->changeTab(tabWidget->page(tabIndex), me->getFileName()); + me->getModel()->setFilePath (fn); + tabWidget->changeTab(tabWidget->page(tabIndex), me->getModel()->getFileName()); if (!isInTmpDir (fn)) { // Only append to lastMaps if not loaded from a tmpDir // e.g. imported bookmarks are in a tmpDir - addRecentMap(me->getFilePath() ); + addRecentMap(me->getModel()->getFilePath() ); } actionFilePrint->setEnabled (true); } @@ -1960,40 +1978,40 @@ setupRecentMapsMenu(); } -void Main::fileSave(MapEditor *me, const SaveMode &savemode) +void Main::fileSave(VymModel *m, const SaveMode &savemode) { - if (!me) return; - - if ( me->getFilePath().isEmpty() ) + if (!m) return; + + if ( m->getFilePath().isEmpty() ) { // We have no filepath yet, // call fileSaveAs() now, this will call fileSave() // again. // First switch to editor - tabWidget->setCurrentWidget (me); + tabWidget->setCurrentWidget (m->getMapEditor()); fileSaveAs(savemode); } - if (me->save (savemode)==success) + if (m->save (savemode)==success) { statusBar()->message( - tr("Saved %1").arg(me->getFilePath()), + tr("Saved %1").arg(m->getFilePath()), statusbarTime ); - addRecentMap (me->getFilePath() ); + addRecentMap (m->getFilePath() ); } else statusBar()->message( - tr("Couldn't save ").arg(me->getFilePath()), + tr("Couldn't save ").arg(m->getFilePath()), statusbarTime ); } void Main::fileSave() { - fileSave (currentMapEditor(), CompleteMap); + fileSave (currentModel(), CompleteMap); } -void Main::fileSave(MapEditor *me) +void Main::fileSave(VymModel *m) { - fileSave (me,CompleteMap); + fileSave (m,CompleteMap); } void Main::fileSaveAs(const SaveMode& savemode) @@ -2048,13 +2066,13 @@ // Save now - currentMapEditor()->setFilePath(fn); - fileSave(currentMapEditor(), savemode); + currentModel()->setFilePath(fn); + fileSave(currentModel(), savemode); // Set name of tab if (savemode==CompleteMap) tabWidget->setTabLabel (currentMapEditor(), - currentMapEditor()->getFileName() ); + currentModel()->getFileName() ); return; } } @@ -2070,7 +2088,7 @@ ImportKDEBookmarks im; im.transform(); if (success==fileLoad (im.getTransformedFile(),NewMap) && currentMapEditor() ) - currentMapEditor()->setFilePath (""); + currentMapEditor()->getModel()->setFilePath (""); } void Main::fileImportFirefoxBookmarks() @@ -2093,7 +2111,7 @@ if (im.transform() && success==fileLoad (im.getTransformedFile(),NewMap,FreemindMap) && currentMapEditor() ) - currentMapEditor()->setFilePath (""); + currentMapEditor()->getModel()->setFilePath (""); ++it; } } @@ -2122,7 +2140,7 @@ fn = *it; if ( fileLoad (fn,NewMap, FreemindMap) ) { - currentMapEditor()->setFilePath (""); + currentMapEditor()->getModel()->setFilePath (""); } ++it; } @@ -2153,80 +2171,78 @@ if (im.transform() && success==fileLoad (im.getTransformedFile(),NewMap) && currentMapEditor() ) - currentMapEditor()->setFilePath (""); - + currentMapEditor()->getModel()->setFilePath (""); ++it; } } delete (fd); - } void Main::fileImportDir() { - if (currentMapEditor()) - currentMapEditor()->importDir(); + VymModel *m=currentModel(); + if (m) m->importDir(); } void Main::fileExportXML() { - MapEditor *me=currentMapEditor(); - if (me) me->exportXML(); + VymModel *m=currentModel(); + if (m) m->exportXML(); } void Main::fileExportXHTML() { - MapEditor *me=currentMapEditor(); - if (me) me->exportXHTML(); + VymModel *m=currentModel(); + if (m) m->exportXHTML(); } void Main::fileExportImage() { - MapEditor *me=currentMapEditor(); - if (me) me->exportImage(); + VymModel *m=currentModel(); + if (m) m->exportImage(); } void Main::fileExportASCII() { - MapEditor *me=currentMapEditor(); - if (me) me->exportASCII(); + VymModel *m=currentModel(); + if (m) m->exportASCII(); } void Main::fileExportCSV() //FIXME not scriptable yet { - MapEditor *me=currentMapEditor(); - if (me) + VymModel *m=currentModel(); + if (m) { ExportCSV ex; - ex.setModel (me->getModel()); + ex.setModel (m); ex.addFilter ("CSV (*.csv)"); ex.setDir(lastImageDir); ex.setCaption(vymName+ " -" +tr("Export as CSV")+" "+tr("(still experimental)")); if (ex.execDialog() ) { - me->setExportMode(true); + m->setExportMode(true); ex.doExport(); - me->setExportMode(false); + m->setExportMode(false); } } } void Main::fileExportLaTeX() //FIXME not scriptable yet { - MapEditor *me=currentMapEditor(); - if (me) + VymModel *m=currentModel(); + if (m) { ExportLaTeX ex; - ex.setModel (me->getModel()); + ex.setModel (m); ex.addFilter ("Tex (*.tex)"); ex.setDir(lastImageDir); ex.setCaption(vymName+ " -" +tr("Export as LaTeX")+" "+tr("(still experimental)")); if (ex.execDialog() ) { - me->setExportMode(true); + m->setExportMode(true); ex.doExport(); - me->setExportMode(false); + m->setExportMode(false); } } } @@ -2234,10 +2250,10 @@ void Main::fileExportKDEBookmarks() //FIXME not scriptable yet { ExportKDEBookmarks ex; - MapEditor *me=currentMapEditor(); - if (me) + VymModel *m=currentModel(); + if (m) { - ex.setModel (me->getModel()); + ex.setModel (m); ex.doExport(); } } @@ -2245,18 +2261,18 @@ void Main::fileExportTaskjuggler() //FIXME not scriptable yet { ExportTaskjuggler ex; - MapEditor *me=currentMapEditor(); - if (me) + VymModel *m=currentModel(); + if (m) { - ex.setModel (me->getModel()); + ex.setModel (m); ex.setCaption ( vymName+" - "+tr("Export to")+" Taskjuggler"+tr("(still experimental)")); ex.setDir(lastImageDir); ex.addFilter ("Taskjuggler (*.tjp)"); if (ex.execDialog() ) { - me->setExportMode(true); + m->setExportMode(true); ex.doExport(); - me->setExportMode(false); + m->setExportMode(false); } } } @@ -2282,8 +2298,8 @@ fn +=".odp"; //lastImageDir=fn.left(fn.findRev ("/")); - if (currentMapEditor()) - currentMapEditor()->exportOOPresentation(fn,fd->selectedConfig()); + VymModel *m=currentModel(); + if (m) m->exportOOPresentation(fn,fd->selectedConfig()); } } else { @@ -2296,12 +2312,13 @@ void Main::fileCloseMap() { MapEditor *me = currentMapEditor(); - if (me) + VymModel *m=currentModel(); + if (m) { - if (me->hasChanged()) + if (m->hasChanged()) { QMessageBox mb( vymName, - tr("The map %1 has been modified but not saved yet. Do you want to").arg(me->getFileName()), + tr("The map %1 has been modified but not saved yet. Do you want to").arg(me->getModel()->getFileName()), QMessageBox::Warning, QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, @@ -2312,7 +2329,7 @@ { case QMessageBox::Yes: // save and close - fileSave(me, CompleteMap); + fileSave(m, CompleteMap); break; case QMessageBox::No: // close without saving @@ -2322,13 +2339,12 @@ return; } } - //me->closeMap(); - tabWidget->removePage(me); + //me->closeMap(); FIXME should not be necessary any longer + me->close(); + tabWidget->removePage(m->getMapEditor()); if (tabWidget->count()==0) actionFilePrint->setEnabled (false); - - //delete me; - me->clear(); + delete me; } } @@ -2349,7 +2365,7 @@ me=(MapEditor*)tabWidget->page(i); // If something changed, ask what to do - if (me->hasChanged()) + if (me->getModel()->hasChanged()) { tabWidget->setCurrentPage(i); QMessageBox mb( vymName, @@ -2366,7 +2382,7 @@ switch( mb.exec() ) { case QMessageBox::Yes: // save (the changed editors) and exit - fileSave(currentMapEditor(), CompleteMap); + fileSave(currentModel(), CompleteMap); break; case QMessageBox::No: // exit without saving @@ -2382,38 +2398,38 @@ void Main::editUndo() { - if (currentMapEditor()) - currentMapEditor()->undo(); + VymModel *m=currentModel(); + if (m) m->undo(); } void Main::editRedo() { - if (currentMapEditor()) - currentMapEditor()->redo(); + VymModel *m=currentModel(); + if (m) m->redo(); } void Main::gotoHistoryStep (int i) { - if (currentMapEditor()) - currentMapEditor()->gotoHistoryStep (i); + VymModel *m=currentModel(); + if (m) m->gotoHistoryStep(i); } void Main::editCopy() { - if (currentMapEditor()) - currentMapEditor()->copy(); + VymModel *m=currentModel(); + if (m) m->copy(); } void Main::editPaste() { - if (currentMapEditor()) - currentMapEditor()->paste(); + VymModel *m=currentModel(); + if (m) m->paste(); } void Main::editCut() { - if (currentMapEditor()) - currentMapEditor()->cut(); + VymModel *m=currentModel(); + if (m) m->cut(); } void Main::editOpenFindWindow() @@ -2425,21 +2441,26 @@ void Main::editFind(QString s) { - bool cs=false; - BranchObj *bo=currentMapEditor()->findText(s, cs); - if (bo) - { - statusBar()->message( "Found: " + bo->getHeading(), statusbarTime ); - } else + VymModel *m=currentModel(); + if (m) { - QMessageBox::information( findWindow, tr( "VYM -Information:" ), - tr("No matches found for \"%1\"").arg(s)); - } + bool cs=false; + BranchObj *bo=m->findText(s, cs); + if (bo) + { + statusBar()->message( "Found: " + bo->getHeading(), statusbarTime ); + } else + { + QMessageBox::information( findWindow, tr( "VYM -Information:" ), + tr("No matches found for \"%1\"").arg(s)); + } + } } void Main::editFindChanged() { // Notify editor, to abort the current find process - currentMapEditor()->findReset(); + VymModel *m=currentModel(); + if (m) m->findReset(); } void Main::openTabs(QStringList urls) @@ -2527,9 +2548,10 @@ void Main::editOpenURL() { // Open new browser - if (currentMapEditor()) + VymModel *m=currentModel(); + if (m) { - QString url=currentMapEditor()->getURL(); + QString url=m->getURL(); QStringList args; if (url=="") return; QString browser=settings.value("/mainwindow/readerURL" ).toString(); @@ -2549,19 +2571,21 @@ } void Main::editOpenURLTab() { - if (currentMapEditor()) + VymModel *m=currentModel(); + if (m) { QStringList urls; - urls.append(currentMapEditor()->getURL()); + urls.append(m->getURL()); openTabs (urls); } } void Main::editOpenMultipleURLTabs() { - if (currentMapEditor()) + VymModel *m=currentModel(); + if (m) { QStringList urls; - urls=currentMapEditor()->getURLs(); + urls=m->getURLs(); openTabs (urls); } } @@ -2569,49 +2593,58 @@ void Main::editURL() { - if (currentMapEditor()) - currentMapEditor()->editURL(); + VymModel *m=currentModel(); + if (m) m->editURL(); } void Main::editLocalURL() { - if (currentMapEditor()) - currentMapEditor()->editLocalURL(); + VymModel *m=currentModel(); + if (m) m->editLocalURL(); } void Main::editHeading2URL() { - if (currentMapEditor()) - currentMapEditor()->editHeading2URL(); + VymModel *m=currentModel(); + if (m) m->editHeading2URL(); } void Main::editBugzilla2URL() { - if (currentMapEditor()) - currentMapEditor()->editBugzilla2URL(); + VymModel *m=currentModel(); + if (m) m->editBugzilla2URL(); } void Main::editFATE2URL() { - if (currentMapEditor()) - currentMapEditor()->editFATE2URL(); + VymModel *m=currentModel(); + if (m) m->editFATE2URL(); } -void Main::editHeadingFinished() +void Main::editHeadingFinished(VymModel *m) { + if (m) + { + if (!actionSettingsAutoSelectNewBranch->isOn() && + !prevSelection.isEmpty()) + m->select(prevSelection); + prevSelection=""; + } + +/* FIXME old code, remove now // only called from editHeading(), so there is a currentME - MapEditor *me=currentMapEditor(); - if (me) + VymModel *m=currentModel(); + if (m) { - me->setStateEditHeading (false); + m->setSelectionBlocked (false); QPoint p; //Not used here, only to find out pos of branch bool ok; - QString s=me->getHeading(ok,p); + QString s=m->getHeading(ok,p); #if defined(Q_OS_MACX) || defined(Q_OS_WIN32) #else if (ok && s!=lineedit->text()) - me->setHeading(lineedit->text()); + m->setHeading(lineedit->text()); lineedit->releaseKeyboard(); lineedit->hide(); @@ -2619,17 +2652,20 @@ #endif if (!actionSettingsAutoSelectNewBranch->isOn() && !prevSelection.isEmpty()) - me->select(prevSelection); + m->select(prevSelection); prevSelection=""; } +*/ } +/* void Main::editHeading() { - if (currentMapEditor()) + MapEditor *me=currentMapEditor(); + VymModel *m=currentModel(); + if (me && m) { - MapEditor *me=currentMapEditor(); - QString oldSel=me->getSelectString(); + QString oldSel=m->getSelectString(); if (lineedit->isVisible()) editHeadingFinished(); @@ -2637,11 +2673,11 @@ { bool ok; QPoint p; - QString s=me->getHeading(ok,p); + QString s=m->getHeading(ok,p); if (ok) { - me->setStateEditHeading (true); + m->setSelectionBlocked(true); #if defined(Q_OS_MACX) || defined(Q_OS_WIN32) p=me->mapToGlobal (p); QDialog *d =new QDialog(NULL); @@ -2654,7 +2690,7 @@ connect (le, SIGNAL (returnPressed()), d, SLOT (accept())); d->activateWindow(); d->exec(); - me->setHeading (le->text()); + m->setHeading (le->text()); delete (le); delete (d); editHeadingFinished(); @@ -2670,8 +2706,9 @@ #endif } } - } // currentMapEditor() + } } +*/ void Main::editAttributeFinished() { @@ -2707,10 +2744,11 @@ #include "attributedialog.h" void Main::editAttribute() { +/* MapEditor *me=currentMapEditor(); if (me) { - BranchObj *bo=me->getSelectedBranch(); + BranchObj *bo=me->getModel()->getSelectedBranch(); if (bo) { AttributeDialog dia(this); @@ -2721,6 +2759,7 @@ dia.exec(); } } + */ /* if (currentMapEditor()) { @@ -2782,7 +2821,7 @@ for (i=0;i<=tabWidget->count() -1;i++) { me=(MapEditor*)tabWidget->page(i); - if (vl.at(j)==me->getFilePath() ) + if (vl.at(j)==me->getModel()->getFilePath() ) { index=i; break; @@ -2807,10 +2846,11 @@ void Main::editOpenVymLink() { - if (currentMapEditor()) + VymModel *m=currentModel(); + if (m) { QStringList vl; - vl.append(currentMapEditor()->getVymLink()); + vl.append(m->getVymLink()); openVymLinks (vl); } } @@ -2818,168 +2858,204 @@ void Main::editOpenMultipleVymLinks() { QString currentVymLink; - if (currentMapEditor()) + VymModel *m=currentModel(); + if (m) { - QStringList vl=currentMapEditor()->getVymLinks(); + QStringList vl=m->getVymLinks(); openVymLinks (vl); } } void Main::editVymLink() { - if (currentMapEditor()) - currentMapEditor()->editVymLink(); + VymModel *m=currentModel(); + if (m) + m->editVymLink(); } void Main::editDeleteVymLink() { - if (currentMapEditor()) - currentMapEditor()->deleteVymLink(); + VymModel *m=currentModel(); + if (m) m->deleteVymLink(); } void Main::editToggleHideExport() { - if (currentMapEditor()) - currentMapEditor()->toggleHideExport(); + VymModel *m=currentModel(); + if (m) m->toggleHideExport(); } void Main::editMapInfo() { - if (currentMapEditor()) - currentMapEditor()->editMapInfo(); + VymModel *m=currentModel(); + + ExtraInfoDialog dia; + dia.setMapName (m->getFileName() ); + dia.setAuthor (m->getAuthor() ); + dia.setComment(m->getComment() ); + +/* FIXME no stats at the moment (view dependent...) + // Calc some stats + QString stats; + stats+=tr("%1 items on map\n","Info about map").arg (mapScene->items().size(),6); + + uint b=0; + uint f=0; + uint n=0; + uint xl=0; + BranchObj *bo; + bo=m->first(); + while (bo) + { + if (!bo->getNote().isEmpty() ) n++; + f+= bo->countFloatImages(); + b++; + xl+=bo->countXLinks(); + bo=m->next(bo); + } + stats+=QString ("%1 branches\n").arg (b-1,6); + stats+=QString ("%1 xLinks \n").arg (xl,6); + stats+=QString ("%1 notes\n").arg (n,6); + stats+=QString ("%1 images\n").arg (f,6); + dia.setStats (stats); + +*/ + // Finally show dialog + if (dia.exec() == QDialog::Accepted) + { + m->setAuthor (dia.getAuthor() ); + m->setComment (dia.getComment() ); + } } void Main::editMoveUp() { - if (currentMapEditor()) - currentMapEditor()->moveBranchUp(); + VymModel *m=currentModel(); + if (m) m->moveBranchUp(); } void Main::editMoveDown() { - if (currentMapEditor()) - currentMapEditor()->moveBranchDown(); + VymModel *m=currentModel(); + if (m) m->moveBranchDown(); } void Main::editSortChildren() { - if (currentMapEditor()) - currentMapEditor()->sortChildren(); + VymModel *m=currentModel(); + if (m) m->sortChildren(); } void Main::editToggleScroll() { - if (currentMapEditor()) + VymModel *m=currentModel(); + if (m) m->toggleScroll(); +} + +void Main::editUnscrollChildren() +{ + VymModel *m=currentModel(); + if (m) m->unscrollChildren(); +} + +void Main::editAddMapCenter() +{ + VymModel *m=currentModel(); + if (!lineedit->isVisible() && m) { - currentMapEditor()->toggleScroll(); + m->addMapCenter (); } } -void Main::editUnscrollChilds() -{ - if (currentMapEditor()) - currentMapEditor()->unscrollChilds(); -} - -void Main::editAddMapCenter() -{ - MapEditor *me=currentMapEditor(); - if (!lineedit->isVisible() && me) - { - me->addMapCenter (); - } -} - void Main::editNewBranch() { - MapEditor *me=currentMapEditor(); - if (!lineedit->isVisible() && me) + VymModel *m=currentModel(); + if (!lineedit->isVisible() && m) { - BranchObj *bo=(BranchObj*)me->getSelection(); - BranchObj *newbo=me->addNewBranch(0); - - prevSelection=me->getModel()->getSelectString(bo); + BranchObj *bo=(BranchObj*)m->getSelection(); + BranchObj *newbo=m->addNewBranch(0); + + prevSelection=m->getSelectString(bo); if (newbo) - me->select (newbo); + m->select (newbo); else return; if (actionSettingsAutoEditNewBranch->isOn()) { - editHeading(); + currentMapEditor()->editHeading(); return; } if (!prevSelection.isEmpty()) { - me->select(prevSelection); + m->select(prevSelection); prevSelection=""; } - } } void Main::editNewBranchBefore() { - MapEditor *me=currentMapEditor(); - if (!lineedit->isVisible() && me) + VymModel *m=currentModel(); + if (!lineedit->isVisible() && m) { - BranchObj *bo=(BranchObj*)me->getSelection(); - BranchObj *newbo=me->addNewBranchBefore(); + BranchObj *bo=(BranchObj*)m->getSelection(); + BranchObj *newbo=m->addNewBranchBefore(); if (newbo) - me->select (newbo); + m->select (newbo); else return; if (actionSettingsAutoEditNewBranch->isOn()) { if (!actionSettingsAutoSelectNewBranch->isOn()) - prevSelection=me->getModel()->getSelectString(bo); //TODO access directly - editHeading(); + prevSelection=m->getSelectString(bo); + currentMapEditor()->editHeading(); } } } void Main::editNewBranchAbove() { - MapEditor *me=currentMapEditor(); - if (!lineedit->isVisible() && me) + VymModel *m=currentModel(); + if (!lineedit->isVisible() && m) { - BranchObj *bo=(BranchObj*)me->getSelection(); - BranchObj *newbo=me->addNewBranch (-1); + BranchObj *bo=(BranchObj*)m->getSelection(); + BranchObj *newbo=m->addNewBranch (-1); if (newbo) - me->select (newbo); + m->select (newbo); else return; if (actionSettingsAutoEditNewBranch->isOn()) { if (!actionSettingsAutoSelectNewBranch->isOn()) - prevSelection=me->getModel()->getSelectString (bo); // TODO access directly - editHeading(); + prevSelection=m->getSelectString (bo); + currentMapEditor()->editHeading(); } } } void Main::editNewBranchBelow() { - MapEditor *me=currentMapEditor(); - if (!lineedit->isVisible() && me) + VymModel *m=currentModel(); + if (!lineedit->isVisible() && m) { - BranchObj *bo=(BranchObj*)me->getSelection(); - BranchObj *newbo=me->addNewBranch (1); + BranchObj *bo=(BranchObj*)m->getSelection(); + BranchObj *newbo=m->addNewBranch (1); if (newbo) - me->select (newbo); + m->select (newbo); else return; if (actionSettingsAutoEditNewBranch->isOn()) { if (!actionSettingsAutoSelectNewBranch->isOn()) - prevSelection=me->getModel()->getSelectString(bo); //TODO access directly - editHeading(); + prevSelection=m->getSelectString(bo); + currentMapEditor()->editHeading(); } } } @@ -2999,99 +3075,100 @@ fileSaveAs (PartOfMap); } -void Main::editDeleteKeepChilds() +void Main::editDeleteKeepChildren() { - if (currentMapEditor()) - currentMapEditor()->deleteKeepChilds(); + VymModel *m=currentModel(); + if (m) m->deleteKeepChildren(); } -void Main::editDeleteChilds() +void Main::editDeleteChildren() { - if (currentMapEditor()) - currentMapEditor()->deleteChilds(); + VymModel *m=currentModel(); + if (m) m->deleteChildren(); } void Main::editDeleteSelection() { - if (currentMapEditor() && actionSettingsUseDelKey->isOn()) - currentMapEditor()->deleteSelection(); + VymModel *m=currentModel(); + if (m && actionSettingsUseDelKey->isOn()) + m->deleteSelection(); } void Main::editUpperBranch() { - if (currentMapEditor()) - currentMapEditor()->selectUpperBranch(); + VymModel *m=currentModel(); + if (m) m->selectUpperBranch(); } void Main::editLowerBranch() { - if (currentMapEditor()) - currentMapEditor()->selectLowerBranch(); + VymModel *m=currentModel(); + if (m) m->selectLowerBranch(); } void Main::editLeftBranch() { - if (currentMapEditor()) - currentMapEditor()->selectLeftBranch(); + VymModel *m=currentModel(); + if (m) m->selectLeftBranch(); } void Main::editRightBranch() { - if (currentMapEditor()) - currentMapEditor()->selectRightBranch(); + VymModel *m=currentModel(); + if (m) m->selectRightBranch(); } void Main::editFirstBranch() { - if (currentMapEditor()) - currentMapEditor()->selectFirstBranch(); + VymModel *m=currentModel(); + if (m) m->selectFirstBranch(); } void Main::editLastBranch() { - if (currentMapEditor()) - currentMapEditor()->selectLastBranch(); + VymModel *m=currentModel(); + if (m) m->selectLastBranch(); } void Main::editLoadImage() { - if (currentMapEditor()) - currentMapEditor()->loadFloatImage(); + VymModel *m=currentModel(); + if (m) m->loadFloatImage(); } void Main::editSaveImage() { - if (currentMapEditor()) - currentMapEditor()->saveFloatImage(); + VymModel *m=currentModel(); + if (m) m->saveFloatImage(); } void Main::editFollowXLink(QAction *a) { - if (currentMapEditor()) - currentMapEditor()->followXLink(branchXLinksContextMenuFollow->actions().indexOf(a)); + VymModel *m=currentModel(); + if (m) + m->followXLink(branchXLinksContextMenuFollow->actions().indexOf(a)); } void Main::editEditXLink(QAction *a) { - if (currentMapEditor()) - currentMapEditor()->editXLink(branchXLinksContextMenuEdit->actions().indexOf(a)); + VymModel *m=currentModel(); + if (m) + m->editXLink(branchXLinksContextMenuEdit->actions().indexOf(a)); } void Main::formatSelectColor() { - if (currentMapEditor()) - { - QColor col = QColorDialog::getColor((currentColor ), this ); - if ( !col.isValid() ) return; - colorChanged( col ); - } + QColor col = QColorDialog::getColor((currentColor ), this ); + if ( !col.isValid() ) return; + colorChanged( col ); } void Main::formatPickColor() { - if (currentMapEditor()) - colorChanged( currentMapEditor()->getCurrentHeadingColor() ); + VymModel *m=currentModel(); + if (m) + colorChanged( m->getCurrentHeadingColor() ); } void Main::colorChanged(QColor c) @@ -3104,86 +3181,102 @@ void Main::formatColorBranch() { - if (currentMapEditor()) - currentMapEditor()->colorBranch(currentColor); + VymModel *m=currentModel(); + if (m) m->colorBranch(currentColor); } void Main::formatColorSubtree() { - if (currentMapEditor()) - currentMapEditor()->colorSubtree (currentColor); + VymModel *m=currentModel(); + if (m) m->colorSubtree (currentColor); } void Main::formatLinkStyleLine() { - if (currentMapEditor()) + VymModel *m=currentModel(); + if (m) { - currentMapEditor()->setMapLinkStyle("StyleLine"); + m->setMapLinkStyle("StyleLine"); actionFormatLinkStyleLine->setOn(true); } } void Main::formatLinkStyleParabel() { - if (currentMapEditor()) + VymModel *m=currentModel(); + if (m) { - currentMapEditor()->setMapLinkStyle("StyleParabel"); + m->setMapLinkStyle("StyleParabel"); actionFormatLinkStyleParabel->setOn(true); } } void Main::formatLinkStylePolyLine() { - if (currentMapEditor()) + VymModel *m=currentModel(); + if (m) { - currentMapEditor()->setMapLinkStyle("StylePolyLine"); + m->setMapLinkStyle("StylePolyLine"); actionFormatLinkStylePolyLine->setOn(true); } } void Main::formatLinkStylePolyParabel() { - if (currentMapEditor()) + VymModel *m=currentModel(); + if (m) { - currentMapEditor()->setMapLinkStyle("StylePolyParabel"); + m->setMapLinkStyle("StylePolyParabel"); actionFormatLinkStylePolyParabel->setOn(true); } } void Main::formatSelectBackColor() { - if (currentMapEditor()) - currentMapEditor()->selectMapBackgroundColor(); + VymModel *m=currentModel(); + if (m) m->selectMapBackgroundColor(); } void Main::formatSelectBackImage() { - if (currentMapEditor()) - currentMapEditor()->selectMapBackgroundImage(); + VymModel *m=currentModel(); + if (m) + m->selectMapBackgroundImage(); } void Main::formatSelectLinkColor() { - if (currentMapEditor()) - currentMapEditor()->selectMapLinkColor(); + VymModel *m=currentModel(); + if (m) + { + QColor col = QColorDialog::getColor( m->getMapDefLinkColor(), this ); + m->setMapDefLinkColor( col ); + } } void Main::formatSelectSelectionColor() { - if (currentMapEditor()) - currentMapEditor()->selectMapSelectionColor(); + VymModel *m=currentModel(); + if (m) + { + QColor col = QColorDialog::getColor( m->getMapDefLinkColor(), this ); + m->setSelectionColor (col); + } + } void Main::formatToggleLinkColorHint() { - currentMapEditor()->toggleMapLinkColorHint(); + VymModel *m=currentModel(); + if (m) m->toggleMapLinkColorHint(); } void Main::formatHideLinkUnselected() //FIXME get rid of this with imagepropertydialog { - if (currentMapEditor()) - currentMapEditor()->setHideLinkUnselected(actionFormatHideLinkUnselected->isOn()); + VymModel *m=currentModel(); + if (m) + m->setHideLinkUnselected(actionFormatHideLinkUnselected->isOn()); } void Main::viewZoomReset() @@ -3218,23 +3311,20 @@ void Main::viewCenter() { - MapEditor *me=currentMapEditor(); - if (me) - { - me->ensureSelectionVisible(); - } + VymModel *m=currentModel(); + if (m) m->ensureSelectionVisible(); } void Main::networkStartServer() { - MapEditor *me=currentMapEditor(); - if (me) me->newServer(); + VymModel *m=currentModel(); + if (m) m->newServer(); } void Main::networkConnect() { - MapEditor *me=currentMapEditor(); - if (me) me->connectToServer(); + VymModel *m=currentModel(); + if (m) m->connectToServer(); } bool Main::settingsPDF() @@ -3352,19 +3442,7 @@ branchPropertyWindow->hide(); else branchPropertyWindow->show(); - - if(currentMapEditor()) - { - BranchObj *bo=currentMapEditor()->getSelectedBranch(); - if (bo) - { - branchPropertyWindow->setMapEditor(currentMapEditor()); - branchPropertyWindow->setBranch(bo); - return; - } - - } - branchPropertyWindow->setBranch(NULL); + branchPropertyWindow->setModel (currentModel() ); } void Main::windowToggleAntiAlias() @@ -3373,7 +3451,6 @@ MapEditor *me; for (int i=0;i<tabWidget->count();i++) { - me=(MapEditor*)tabWidget->page(i); me->setAntiAlias(b); } @@ -3399,33 +3476,35 @@ void Main::updateNoteFlag() { - if (currentMapEditor()) - currentMapEditor()->updateNoteFlag(); + // this slot is connected to TextEditor::textHasChanged() + + VymModel *m=currentModel(); + if (m) m->updateNoteFlag(); } void Main::updateSatellites(MapEditor *me) { - branchPropertyWindow->setMapEditor (me); + branchPropertyWindow->setModel (me->getModel() ); } void Main::updateActions() { - MapEditor *me=currentMapEditor(); - if (!me) return; - - historyWindow->setCaption (vymName + " - " +tr("History for %1","Window Caption").arg(currentMapEditor()->getFileName())); + VymModel *m =currentModel(); + if (!m) return; + + historyWindow->setCaption (vymName + " - " +tr("History for %1","Window Caption").arg(m->getFileName())); // updateActions is also called when NoteEditor is closed actionViewToggleNoteEditor->setOn (textEditor->isVisible()); actionViewToggleHistoryWindow->setOn (historyWindow->isVisible()); actionViewTogglePropertyWindow->setOn (branchPropertyWindow->isVisible()); - if (me->getMapLinkColorHint()==LinkableMapObj::HeadingColor) + if (m->getMapLinkColorHint()==LinkableMapObj::HeadingColor) actionFormatLinkColorHint->setOn(true); else actionFormatLinkColorHint->setOn(false); - switch (me->getMapLinkStyle()) + switch (m->getMapLinkStyle()) { case LinkableMapObj::Line: actionFormatLinkStyleLine->setOn(true); @@ -3445,26 +3524,26 @@ // Update colors QPixmap pix( 16, 16 ); - pix.fill( me->getMapBackgroundColor() ); + pix.fill( m->getMapBackgroundColor() ); actionFormatBackColor->setIconSet( pix ); - pix.fill( me->getSelectionColor() ); + pix.fill( m->getSelectionColor() ); actionFormatSelectionColor->setIconSet( pix ); - pix.fill( me->getMapDefLinkColor() ); + pix.fill( m->getMapDefLinkColor() ); actionFormatLinkColor->setIconSet( pix ); - actionFileSave->setEnabled( me->hasChanged() ); - if (me->isUndoAvailable()) + actionFileSave->setEnabled( m->hasChanged() ); + if (m->isUndoAvailable()) actionEditUndo->setEnabled( true); else actionEditUndo->setEnabled( false); - if (me->isRedoAvailable()) + if (m->isRedoAvailable()) actionEditRedo->setEnabled( true); else actionEditRedo->setEnabled( false); - LinkableMapObj *selection=me->getSelection(); + LinkableMapObj *selection=m->getSelection(); if (selection) { if ( (typeid(*selection) == typeid(BranchObj)) || @@ -3636,8 +3715,8 @@ void Main::runScript (const QString &script) { - if (currentMapEditor()) - currentMapEditor()->runScript (script); + VymModel *m=currentModel(); + if (m) m->runScript (script); } void Main::runScriptEverywhere (const QString &script) @@ -3646,7 +3725,7 @@ for (int i=0;i<=tabWidget->count() -1;i++) { me=(MapEditor*)tabWidget->page(i); - if (me) me->runScript (script); + if (me) me->getModel()->runScript (script); } } @@ -3828,41 +3907,13 @@ } QTextStream ts( &f ); - QString m= ts.read(); - - if (! m.isEmpty()) + QString macro= ts.read(); + + if (! macro.isEmpty()) { - //cout <<"Main::callMacro m="<<qPrintable (m)<<endl; - currentMapEditor()->runScript (m); + VymModel *m=currentModel(); + if (m) m->runScript(macro); } } } - - -////////////////////////////////// -/* -@@ -2544,18 +2576,27 @@ - // Try to open new tab in existing konqueror started previously by vym - p=new QProcess (this); - args.clear(); -- args<< QString("konqueror-%1").arg(procBrowser->pid())<< -- "konqueror-mainwindow#1"<< -- "newTab" << -+#if defined(Q_OS_WIN32) -+ // In Win32, pid is not a longlong, but a pointer to a _PROCESS_INFORMATION structure. -+ // Redundant change in Win32, as there's no konqueror, but I wanted to follow the original logic. -+ args<< QString("konqueror-%1").arg(procBrowser->pid()->dwProcessId)<< -+ "konqueror-mainwindow#1"<< -+ "newTab" << - urls.at(i); -+#else -+ args<< QString("konqueror-%1").arg(procBrowser->pid())<< -+ "konqueror-mainwindow#1"<< -+ "newTab" << -+ urls.at(i); -+#endif - p->start ("dcop",args); - if ( !p->waitForStarted() ) success=false; - } -*/ diff -r 192e1392ba6a -r 12958f987bcf mainwindow.h --- a/mainwindow.h Wed Jul 16 10:44:44 2008 +0000 +++ b/mainwindow.h Wed Jul 16 10:46:14 2008 +0000 @@ -4,6 +4,7 @@ #include <QMainWindow> #include "branchpropwindow.h" +#include "extrainfodialog.h" #include "file.h" #include "findwindow.h" #include "historywindow.h" @@ -56,6 +57,7 @@ void hideEvent (QHideEvent * ); void showEvent (QShowEvent * ); MapEditor* currentMapEditor() const; + VymModel* currentModel() const; private slots: void editorChanged(QWidget*); @@ -65,10 +67,10 @@ void fileLoad(); void fileLoadRecent(); void addRecentMap (const QString &); - void fileSave(MapEditor*, const SaveMode & ); + void fileSave(VymModel*, const SaveMode & ); void fileSave(); public slots: - void fileSave(MapEditor *); // autosave from MapEditor + void fileSave(VymModel*); // autosave from MapEditor private slots: void fileSaveAs(const SaveMode &); void fileSaveAs(); @@ -116,10 +118,10 @@ void openVymLinks(const QStringList &); void editVymLink(); void editOpenMultipleVymLinks(); - void editHeadingFinished(); void editAttributeFinished(); public slots: - void editHeading(); + void editHeadingFinished(VymModel *m); +// void editHeading(); void editAttribute(); void editOpenVymLink(); private slots: @@ -130,7 +132,7 @@ void editMoveDown(); void editSortChildren(); void editToggleScroll(); - void editUnscrollChilds(); + void editUnscrollChildren(); void editAddMapCenter(); void editNewBranch(); void editNewBranchBefore(); @@ -139,8 +141,8 @@ void editImportAdd(); void editImportReplace(); void editSaveBranch(); - void editDeleteKeepChilds(); - void editDeleteChilds(); + void editDeleteKeepChildren(); + void editDeleteChildren(); void editDeleteSelection(); void editUpperBranch(); void editLowerBranch(); @@ -230,6 +232,8 @@ QStringList imageTypes; + QList <VymModel*> models; + QLineEdit *lineedit; // to enter headings of branches QString prevSelection; @@ -284,8 +288,8 @@ QAction *actionEditAddBranchBefore; QAction *actionEditAddBranchAbove; QAction *actionEditAddBranchBelow; - QAction *actionEditDeleteKeepChilds; - QAction *actionEditDeleteChilds; + QAction *actionEditDeleteKeepChildren; + QAction *actionEditDeleteChildren; QAction *actionEditImportAdd; QAction *actionEditImportReplace; QAction *actionEditSaveBranch; diff -r 192e1392ba6a -r 12958f987bcf mapcenterobj.cpp --- a/mapcenterobj.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/mapcenterobj.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -73,7 +73,7 @@ void MapCenterObj::moveAllBy (double dx, double dy) { - // Move myself and childs + // Move myself and children BranchObj::moveBy(dx,dy); } diff -r 192e1392ba6a -r 12958f987bcf noteobj.cpp --- a/noteobj.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/noteobj.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -51,6 +51,7 @@ QString NoteObj::getNoteASCII(const QString &indent, const int &width) { + // FIXME make use of width QString r=note; // Remove all <style...> ...</style> @@ -167,12 +168,13 @@ { QString n=note; - // Remove the doctype, which will confuse parsing + // Remove the doctype, which will confuse parsing // with XmlReader in Qt >= 4.4 QRegExp rx("<!DOCTYPE.*>"); rx.setMinimal(true); n.replace (rx,""); - + + // QTextEdit may generate fontnames with unquoted &, like // in "Lucida B&H". This is invalid in XML and thus would crash // the XML parser @@ -183,6 +185,7 @@ bool inbracket=false; int begin_bracket=0; bool inquot=false; + while (pos<n.length()) { if (n.mid(pos,1)=="<") @@ -197,7 +200,7 @@ int sl=s.length(); if (s.count("style=\"")>1) { - rx.setPattern("style=\\s*\"(.*)\"\\s*style=\\s*\"(.*)\""); + rx.setPattern ("style=\\s*\"(.*)\"\\s*style=\\s*\"(.*)\""); s.replace(rx,"style=\"\\1 \\2\""); n.replace (begin_bracket,sl,s); pos=pos-(sl-s.length()); @@ -218,8 +221,6 @@ } pos++; } - - return beginElement ("htmlnote",attribut("fonthint",fonthint)) + "\n"+ n+ "\n" +endElement ("htmlnote"); } diff -r 192e1392ba6a -r 12958f987bcf ornamentedobj.cpp --- a/ornamentedobj.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/ornamentedobj.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -93,10 +93,10 @@ void OrnamentedObj::setLinkColor() { - if (mapEditor->getMapLinkColorHint()==HeadingColor) + if (model->getMapLinkColorHint()==HeadingColor) LinkableMapObj::setLinkColor (heading->getColor()); else - LinkableMapObj::setLinkColor (mapEditor->getMapDefLinkColor()); + LinkableMapObj::setLinkColor (model->getMapDefLinkColor()); } void OrnamentedObj::setColor (QColor col) @@ -321,7 +321,7 @@ QDir d(s); if (!d.path().startsWith ("/")) { - QString p=mapEditor->getDestPath(); + QString p=model->getDestPath(); int i=p.findRev("/",-1); d.setPath(p.left(i)+"/"+s); d.convertToAbs(); @@ -432,7 +432,7 @@ if (!systemFlags->isActive ("note")) return; systemFlags->deactivate("note"); } - mapEditor->setChanged(); + model->setChanged(); calcBBoxSize(); positionBBox(); move (absPos.x(), absPos.y() ); @@ -498,7 +498,7 @@ QString vymLinkAttr; if (!vymLink.isEmpty()) - vymLinkAttr=attribut ("vymLink",convertToRel(mapEditor->getDestPath(),vymLink) ); + vymLinkAttr=attribut ("vymLink",convertToRel(model->getDestPath(),vymLink) ); QString hideExpAttr; if (hideExport) diff -r 192e1392ba6a -r 12958f987bcf ornamentedobj.h --- a/ornamentedobj.h Wed Jul 16 10:44:44 2008 +0000 +++ b/ornamentedobj.h Wed Jul 16 10:46:14 2008 +0000 @@ -79,7 +79,7 @@ virtual void updateNoteFlag(); virtual void getNoteFromTextEditor (); virtual void updateFlagsToolbar(); - virtual void setHideInExport(bool); // set export of object (and childs) + virtual void setHideInExport(bool); // set export of object (and children) virtual bool hideInExport(); virtual bool isHidden (); virtual QString getOrnXMLAttr(); // get attributes for saveToDir diff -r 192e1392ba6a -r 12958f987bcf selection.cpp --- a/selection.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/selection.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -13,6 +13,7 @@ Selection::Selection() { color= QColor(255,255,0); + blocked=false; } Selection::~Selection() @@ -37,7 +38,7 @@ lastSelectList.clear(); } -void Selection::update() +void Selection::update() // FIXME this needs to be adapted to several views { QRectF bbox; int w=0; @@ -120,6 +121,21 @@ } } +bool Selection::isBlocked() +{ + return blocked; +} + +void Selection::block() +{ + blocked=true; +} + +void Selection::unblock() +{ + blocked=false; +} + bool Selection::isEmpty() { return selectList.isEmpty(); diff -r 192e1392ba6a -r 12958f987bcf selection.h --- a/selection.h Wed Jul 16 10:44:44 2008 +0000 +++ b/selection.h Wed Jul 16 10:46:14 2008 +0000 @@ -29,6 +29,9 @@ bool select (const QString &); bool reselect (); void unselect (); + bool isBlocked (); + void block(); + void unblock(); bool isEmpty(); uint count(); Type type(); @@ -48,6 +51,8 @@ QGraphicsScene *scene; QColor color; + bool blocked; //!< if true, no new selection possible }; + #endif diff -r 192e1392ba6a -r 12958f987bcf version.h --- a/version.h Wed Jul 16 10:44:44 2008 +0000 +++ b/version.h Wed Jul 16 10:46:14 2008 +0000 @@ -4,10 +4,10 @@ #include <QString> #define __VYM_NAME "VYM" -#define __VYM_VERSION "1.12.1" -#define __VYM_CODENAME "Maintenance Update" -//#define __VYM_CODENAME "Codename: development version" -#define __VYM_BUILD_DATE "2008-07-14" +#define __VYM_VERSION "1.13.0" +//#define __VYM_CODENAME "Codename: RC-1" +#define __VYM_CODENAME "Codename: development version" +#define __VYM_BUILD_DATE "2008-07-02" bool checkVersion(const QString &); diff -r 192e1392ba6a -r 12958f987bcf vym.pro --- a/vym.pro Wed Jul 16 10:44:44 2008 +0000 +++ b/vym.pro Wed Jul 16 10:46:14 2008 +0000 @@ -7,11 +7,10 @@ TRANSLATIONS += lang/vym_de.ts TRANSLATIONS += lang/vym_en.ts TRANSLATIONS += lang/vym_es.ts +TRANSLATIONS += lang/vym_it.ts TRANSLATIONS += lang/vym_fr.ts -TRANSLATIONS += lang/vym_it.ts +TRANSLATIONS += lang/vym_zh_CN.ts TRANSLATIONS += lang/vym_pt_BR.ts -TRANSLATIONS += lang/vym_ru.ts -TRANSLATIONS += lang/vym_zh_CN.ts # Manifest embedding was suggested by Qt docs somewhere... win32: CONFIG += embed_manifest_exe diff -r 192e1392ba6a -r 12958f987bcf vymmodel.cpp --- a/vymmodel.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/vymmodel.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -1,32 +1,122 @@ #include <QApplication> #include <typeinfo> +#include "vymmodel.h" + +#include "editxlinkdialog.h" +#include "exports.h" +#include "exportxhtmldialog.h" +#include "file.h" #include "geometry.h" // for addBBox -#include "vymmodel.h" - - +#include "mainwindow.h" +#include "mapcenterobj.h" +#include "misc.h" +#include "parser.h" +#include "selection.h" + + +#include "warningdialog.h" +#include "xml-freemind.h" +#include "xml-vym.h" + + +extern bool debug; +extern Main *mainWindow; extern Settings settings; +extern QString tmpVymDir; + +extern TextEditor *textEditor; + + +extern QString clipboardDir; +extern QString clipboardFile; +extern bool clipboardEmpty; + +extern ImageIO imageIO; + +extern QString vymName; +extern QString vymVersion; +extern QDir vymBaseDir; + +extern QDir lastImageDir; +extern QDir lastFileDir; + +extern FlagRowObj *standardFlagsDefault; + +extern Settings settings; + + + +int VymModel::mapNum=0; // make instance VymModel::VymModel() { // cout << "Const VymModel\n"; + init(); } VymModel::~VymModel() { // cout << "Destr VymModel\n"; + autosaveTimer->stop(); + fileChangedTimer->stop(); + clear(); } void VymModel::clear() { + selection.clear(); + while (!mapCenters.isEmpty()) delete mapCenters.takeFirst(); } void VymModel::init () { - addMapCenter(); + // We should have at least one map center to start with + // addMapCenter(); FIXME create this in MapEditor as long as model is part of that + + // History + mapNum++; + mapChanged=false; + mapDefault=true; + mapUnsaved=false; + + curStep=0; + redosAvail=0; + undosAvail=0; + + stepsTotal=settings.readNumEntry("/history/stepsTotal",100); + undoSet.setEntry ("/history/stepsTotal",QString::number(stepsTotal)); + mainWindow->updateHistory (undoSet); + + // Create tmp dirs + makeTmpDirectories(); + + // Files + zipped=true; + filePath=""; + fileName=tr("unnamed"); + mapName=""; + blockReposition=false; + blockSaveState=false; + + autosaveTimer=new QTimer (this); + connect(autosaveTimer, SIGNAL(timeout()), this, SLOT(autosave())); + + fileChangedTimer=new QTimer (this); + fileChangedTimer->start(3000); + connect(fileChangedTimer, SIGNAL(timeout()), this, SLOT(fileChanged())); + + + // selections + selection.setModel (this); + selection.unselect(); + + // find routine + itFind=NULL; + EOFind=false; // animations animationUse=settings.readBoolEntry("/animation/use",false); @@ -36,8 +126,36 @@ animationTimer=new QTimer (this); connect(animationTimer, SIGNAL(timeout()), this, SLOT(animate())); + // View - map + defLinkColor=QColor (0,0,255); + defXLinkColor=QColor (180,180,180); + linkcolorhint=LinkableMapObj::DefaultColor; + linkstyle=LinkableMapObj::PolyParabel; + defXLinkWidth=1; + defXLinkColor=QColor (230,230,230); + + hidemode=HideNone; + + + + // Network + netstate=Offline; + + // Create MapCenter + // addMapCenter(); FIXME create this in MapEditor until BO and MCO are independent of scene + } +void VymModel::makeTmpDirectories() +{ + // Create unique temporary directories + tmpMapDir = tmpVymDir+QString("/model-%1").arg(mapNum); + histPath = tmpMapDir+"/history"; + QDir d; + d.mkdir (tmpMapDir); +} + + void VymModel::setMapEditor(MapEditor *me) { mapEditor=me; @@ -50,76 +168,1183 @@ return mapEditor; } -void VymModel::setVersion (const QString &s) +bool VymModel::isRepositionBlocked() { - version=s; + return blockReposition; } -void VymModel::setAuthor (const QString &s) +void VymModel::updateActions() // FIXME maybe don't update if blockReposition is set { - author=s; + // Tell mainwindow to update states of actions + mainWindow->updateActions(); } -QString VymModel::getAuthor() + + +QString VymModel::saveToDir(const QString &tmpdir, const QString &prefix, bool writeflags, const QPointF &offset, LinkableMapObj *saveSel) { - return author; + // tmpdir temporary directory to which data will be written + // prefix mapname, which will be appended to images etc. + // writeflags Only write flags for "real" save of map, not undo + // offset offset of bbox of whole map in scene. + // Needed for XML export + + // Save Header + QString ls; + switch (linkstyle) + { + case LinkableMapObj::Line: + ls="StyleLine"; + break; + case LinkableMapObj::Parabel: + ls="StyleParabel"; + break; + case LinkableMapObj::PolyLine: + ls="StylePolyLine"; + break; + default: + ls="StylePolyParabel"; + break; + } + + QString s="<?xml version=\"1.0\" encoding=\"utf-8\"?><!DOCTYPE vymmap>\n"; + QString colhint=""; + if (linkcolorhint==LinkableMapObj::HeadingColor) + colhint=attribut("linkColorHint","HeadingColor"); + + QString mapAttr=attribut("version",vymVersion); + if (!saveSel) + mapAttr+= attribut("author",author) + + attribut("comment",comment) + + attribut("date",getDate()) + + attribut("backgroundColor", mapScene->backgroundBrush().color().name() ) + + attribut("selectionColor", selection.getColor().name() ) + + attribut("linkStyle", ls ) + + attribut("linkColor", defLinkColor.name() ) + + attribut("defXLinkColor", defXLinkColor.name() ) + + attribut("defXLinkWidth", QString().setNum(defXLinkWidth,10) ) + + colhint; + s+=beginElement("vymmap",mapAttr); + incIndent(); + + // Find the used flags while traversing the tree + standardFlagsDefault->resetUsedCounter(); + + // Reset the counters before saving + // TODO constr. of FIO creates lots of objects, better do this in some other way... + FloatImageObj (mapScene).resetSaveCounter(); + + // Build xml recursivly + if (!saveSel || typeid (*saveSel) == typeid (MapCenterObj)) + // Save complete map, if saveSel not set + s+=saveToDir(tmpdir,prefix,writeflags,offset); + else + { + if ( typeid(*saveSel) == typeid(BranchObj) ) + // Save Subtree + s+=((BranchObj*)(saveSel))->saveToDir(tmpdir,prefix,offset); + else if ( typeid(*saveSel) == typeid(FloatImageObj) ) + // Save image + s+=((FloatImageObj*)(saveSel))->saveToDir(tmpdir,prefix); + } + + // Save local settings + s+=settings.getDataXML (destPath); + + // Save selection + if (!selection.isEmpty() && !saveSel ) + s+=valueElement("select",selection.getSelectString()); + + decIndent(); + s+=endElement("vymmap"); + + if (writeflags) + standardFlagsDefault->saveToDir (tmpdir+"/flags/","",writeflags); + return s; } -void VymModel::setComment (const QString &s) +void VymModel::setFilePath(QString fpath, QString destname) { - comment=s; + if (fpath.isEmpty() || fpath=="") + { + filePath=""; + fileName=""; + destPath=""; + } else + { + filePath=fpath; // becomes absolute path + fileName=fpath; // gets stripped of path + destPath=destname; // needed for vymlinks and during load to reset fileChangedTime + + // If fpath is not an absolute path, complete it + filePath=QDir(fpath).absPath(); + fileDir=filePath.left (1+filePath.findRev ("/")); + + // Set short name, too. Search from behind: + int i=fileName.findRev("/"); + if (i>=0) fileName=fileName.remove (0,i+1); + + // Forget the .vym (or .xml) for name of map + mapName=fileName.left(fileName.findRev(".",-1,true) ); + } } -QString VymModel::getComment () +void VymModel::setFilePath(QString fpath) { - return comment; + setFilePath (fpath,fpath); } -QString VymModel::getDate () +QString VymModel::getFilePath() { - return QDate::currentDate().toString ("yyyy-MM-dd"); + return filePath; } -void VymModel::setScene (QGraphicsScene *s) +QString VymModel::getFileName() { - mapScene=s; - init(); // Here we have a mapScene set, - // which is (still) needed to create MapCenters + return fileName; } +QString VymModel::getMapName() +{ + return mapName; +} + +QString VymModel::getDestPath() +{ + return destPath; +} + +ErrorCode VymModel::load (QString fname, const LoadMode &lmode, const FileType &ftype) +{ + ErrorCode err=success; + + parseBaseHandler *handler; + fileType=ftype; + switch (fileType) + { + case VymMap: handler=new parseVYMHandler; break; + case FreemindMap : handler=new parseFreemindHandler; break; + default: + QMessageBox::critical( 0, tr( "Critical Parse Error" ), + "Unknown FileType in VymModel::load()"); + return aborted; + } + if (lmode==NewMap) + { + selection.clear(); + // FIXME not needed??? model->setMapEditor(this); + // (map state is set later at end of load...) + } else + { + BranchObj *bo=selection.getBranch(); + if (!bo) return aborted; + if (lmode==ImportAdd) + saveStateChangingPart( + bo, + bo, + QString("addMapInsert (%1)").arg(fname), + QString("Add map %1 to %2").arg(fname).arg(getObjectName(bo))); + else + saveStateChangingPart( + bo, + bo, + QString("addMapReplace(%1)").arg(fname), + QString("Add map %1 to %2").arg(fname).arg(getObjectName(bo))); + } + + + // Create temporary directory for packing + bool ok; + QString tmpZipDir=makeTmpDir (ok,"vym-pack"); + if (!ok) + { + QMessageBox::critical( 0, tr( "Critical Load Error" ), + tr("Couldn't create temporary directory before load\n")); + return aborted; + } + + // Try to unzip file + err=unzipDir (tmpZipDir,fname); + QString xmlfile; + if (err==nozip) + { + xmlfile=fname; + zipped=false; + } else + { + zipped=true; + + // Look for mapname.xml + xmlfile= fname.left(fname.findRev(".",-1,true)); + xmlfile=xmlfile.section( '/', -1 ); + QFile mfile( tmpZipDir + "/" + xmlfile + ".xml"); + if (!mfile.exists() ) + { + // mapname.xml does not exist, well, + // maybe someone renamed the mapname.vym file... + // Try to find any .xml in the toplevel + // directory of the .vym file + QStringList flist=QDir (tmpZipDir).entryList("*.xml"); + if (flist.count()==1) + { + // Only one entry, take this one + xmlfile=tmpZipDir + "/"+flist.first(); + } else + { + for ( QStringList::Iterator it = flist.begin(); it != flist.end(); ++it ) + *it=tmpZipDir + "/" + *it; + // TODO Multiple entries, load all (but only the first one into this ME) + //mainWindow->fileLoadFromTmp (flist); + //returnCode=1; // Silently forget this attempt to load + qWarning ("MainWindow::load (fn) multimap found..."); + } + + if (flist.isEmpty() ) + { + QMessageBox::critical( 0, tr( "Critical Load Error" ), + tr("Couldn't find a map (*.xml) in .vym archive.\n")); + err=aborted; + } + } //file doesn't exist + else + xmlfile=mfile.name(); + } + + QFile file( xmlfile); + + // I am paranoid: file should exist anyway + // according to check in mainwindow. + if (!file.exists() ) + { + QMessageBox::critical( 0, tr( "Critical Parse Error" ), + tr(QString("Couldn't open map %1").arg(file.name()))); + err=aborted; + } else + { + bool blockSaveStateOrg=blockSaveState; + blockReposition=true; + blockSaveState=true; + QXmlInputSource source( file); + QXmlSimpleReader reader; + reader.setContentHandler( handler ); + reader.setErrorHandler( handler ); + handler->setModel ( this); + + + // We need to set the tmpDir in order to load files with rel. path + QString tmpdir; + if (zipped) + tmpdir=tmpZipDir; + else + tmpdir=fname.left(fname.findRev("/",-1)); + handler->setTmpDir (tmpdir); + handler->setInputFile (file.name()); + handler->setLoadMode (lmode); + bool ok = reader.parse( source ); + blockReposition=false; + blockSaveState=blockSaveStateOrg; + file.close(); + if ( ok ) + { + reposition(); // FIXME reposition the view instead... + selection.update(); + if (lmode==NewMap) + { + mapDefault=false; + mapChanged=false; + mapUnsaved=false; + autosaveTimer->stop(); + } + + // Reset timestamp to check for later updates of file + fileChangedTime=QFileInfo (destPath).lastModified(); + } else + { + QMessageBox::critical( 0, tr( "Critical Parse Error" ), + tr( handler->errorProtocol() ) ); + // returnCode=1; + // Still return "success": the map maybe at least + // partially read by the parser + } + } + + // Delete tmpZipDir + removeDir (QDir(tmpZipDir)); + + updateActions(); + + return err; +} + +ErrorCode VymModel::save (const SaveMode &savemode) +{ + QString tmpZipDir; + QString mapFileName; + QString safeFilePath; + + ErrorCode err=success; + + if (zipped) + // save as .xml + mapFileName=mapName+".xml"; + else + // use name given by user, even if he chooses .doc + mapFileName=fileName; + + // Look, if we should zip the data: + if (!zipped) + { + QMessageBox mb( vymName, + tr("The map %1\ndid not use the compressed " + "vym file format.\nWriting it uncompressed will also write images \n" + "and flags and thus may overwrite files in the " + "given directory\n\nDo you want to write the map").arg(filePath), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::No , + QMessageBox::Cancel | QMessageBox::Escape); + mb.setButtonText( QMessageBox::Yes, tr("compressed (vym default)") ); + mb.setButtonText( QMessageBox::No, tr("uncompressed") ); + mb.setButtonText( QMessageBox::Cancel, tr("Cancel")); + switch( mb.exec() ) + { + case QMessageBox::Yes: + // save compressed (default file format) + zipped=true; + break; + case QMessageBox::No: + // save uncompressed + zipped=false; + break; + case QMessageBox::Cancel: + // do nothing + return aborted; + break; + } + } + + // First backup existing file, we + // don't want to add to old zip archives + QFile f(destPath); + if (f.exists()) + { + if ( settings.value ("/mapeditor/writeBackupFile").toBool()) + { + QString backupFileName(destPath + "~"); + QFile backupFile(backupFileName); + if (backupFile.exists() && !backupFile.remove()) + { + QMessageBox::warning(0, tr("Save Error"), + tr("%1\ncould not be removed before saving").arg(backupFileName)); + } + else if (!f.rename(backupFileName)) + { + QMessageBox::warning(0, tr("Save Error"), + tr("%1\ncould not be renamed before saving").arg(destPath)); + } + } + } + + if (zipped) + { + // Create temporary directory for packing + bool ok; + tmpZipDir=makeTmpDir (ok,"vym-zip"); + if (!ok) + { + QMessageBox::critical( 0, tr( "Critical Load Error" ), + tr("Couldn't create temporary directory before save\n")); + return aborted; + } + + safeFilePath=filePath; + setFilePath (tmpZipDir+"/"+ mapName+ ".xml", safeFilePath); + } // zipped + + // Create mapName and fileDir + makeSubDirs (fileDir); + + QString saveFile; + if (savemode==CompleteMap || selection.isEmpty()) + { + // Save complete map + saveFile=saveToDir (fileDir,mapName+"-",true,QPointF(),NULL); + mapChanged=false; + mapUnsaved=false; + autosaveTimer->stop(); + } + else + { + // Save part of map + if (selection.type()==Selection::FloatImage) + saveFloatImage(); + else + saveFile=saveToDir (fileDir,mapName+"-",true,QPointF(),selection.getBranch()); + // TODO take care of multiselections + } + + if (!saveStringToDisk(fileDir+mapFileName,saveFile)) + { + err=aborted; + qWarning ("ME::saveStringToDisk failed!"); + } + + if (zipped) + { + // zip + if (err==success) err=zipDir (tmpZipDir,destPath); + + // Delete tmpDir + removeDir (QDir(tmpZipDir)); + + // Restore original filepath outside of tmp zip dir + setFilePath (safeFilePath); + } + + updateActions(); + fileChangedTime=QFileInfo (destPath).lastModified(); + return err; +} + +void VymModel::addMapReplaceInt(const QString &undoSel, const QString &path) +{ + QString pathDir=path.left(path.findRev("/")); + QDir d(pathDir); + QFile file (path); + + if (d.exists() ) + { + // We need to parse saved XML data + parseVYMHandler handler; + QXmlInputSource source( file); + QXmlSimpleReader reader; + reader.setContentHandler( &handler ); + reader.setErrorHandler( &handler ); + handler.setModel ( this); + handler.setTmpDir ( pathDir ); // needed to load files with rel. path + if (undoSel.isEmpty()) + { + unselect(); + clear(); + handler.setLoadMode (NewMap); + } else + { + select (undoSel); + handler.setLoadMode (ImportReplace); + } + blockReposition=true; + bool ok = reader.parse( source ); + blockReposition=false; + if (! ok ) + { + // This should never ever happen + QMessageBox::critical( 0, tr( "Critical Parse Error while reading %1").arg(path), + handler.errorProtocol()); + } + } else + QMessageBox::critical( 0, tr( "Critical Error" ), tr("Could not read %1").arg(path)); +} + +void VymModel::addMapInsertInt (const QString &path, int pos) +{ + BranchObj *sel=selection.getBranch(); + if (sel) + { + QString pathDir=path.left(path.findRev("/")); + QDir d(pathDir); + QFile file (path); + + if (d.exists() ) + { + // We need to parse saved XML data + parseVYMHandler handler; + QXmlInputSource source( file); + QXmlSimpleReader reader; + reader.setContentHandler( &handler ); + reader.setErrorHandler( &handler ); + handler.setModel (this); + handler.setTmpDir ( pathDir ); // needed to load files with rel. path + handler.setLoadMode (ImportAdd); + blockReposition=true; + bool ok = reader.parse( source ); + blockReposition=false; + if (! ok ) + { + // This should never ever happen + QMessageBox::critical( 0, tr( "Critical Parse Error while reading %1").arg(path), + handler.errorProtocol()); + } + if (sel->getDepth()>0) + sel->getLastBranch()->linkTo (sel,pos); + } else + QMessageBox::critical( 0, tr( "Critical Error" ), tr("Could not read %1").arg(path)); + } +} + +FloatImageObj* VymModel::loadFloatImageInt (QString fn) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + FloatImageObj *fio; + bo->addFloatImage(); + fio=bo->getLastFloatImage(); + fio->load(fn); + reposition(); + // FIXME needed? scene()->update(); + return fio; + } + return NULL; +} + +void VymModel::loadFloatImage () +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + + Q3FileDialog *fd=new Q3FileDialog( NULL); + fd->setMode (Q3FileDialog::ExistingFiles); + fd->addFilter (QString (tr("Images") + " (*.png *.bmp *.xbm *.jpg *.png *.xpm *.gif *.pnm)")); + ImagePreview *p =new ImagePreview (fd); + fd->setContentsPreviewEnabled( TRUE ); + fd->setContentsPreview( p, p ); + fd->setPreviewMode( Q3FileDialog::Contents ); + fd->setCaption(vymName+" - " +tr("Load image")); + fd->setDir (lastImageDir); + fd->show(); + + if ( fd->exec() == QDialog::Accepted ) + { + // TODO loadFIO in QT4 use: lastImageDir=fd->directory(); + lastImageDir=QDir (fd->dirPath()); + QString s; + FloatImageObj *fio; + for (int j=0; j<fd->selectedFiles().count(); j++) + { + s=fd->selectedFiles().at(j); + fio=loadFloatImageInt (s); + if (fio) + saveState( + (LinkableMapObj*)fio, + "delete ()", + bo, + QString ("loadImage (%1)").arg(s ), + QString("Add image %1 to %2").arg(s).arg(getObjectName(bo)) + ); + else + // TODO loadFIO error handling + qWarning ("Failed to load "+s); + } + } + delete (p); + delete (fd); + } +} + +void VymModel::saveFloatImageInt (FloatImageObj *fio, const QString &type, const QString &fn) +{ + fio->save (fn,type); +} + +void VymModel::saveFloatImage () +{ + FloatImageObj *fio=selection.getFloatImage(); + if (fio) + { + QFileDialog *fd=new QFileDialog( NULL); + fd->setFilters (imageIO.getFilters()); + fd->setCaption(vymName+" - " +tr("Save image")); + fd->setFileMode( QFileDialog::AnyFile ); + fd->setDirectory (lastImageDir); +// fd->setSelection (fio->getOriginalFilename()); + fd->show(); + + QString fn; + if ( fd->exec() == QDialog::Accepted && fd->selectedFiles().count()==1) + { + fn=fd->selectedFiles().at(0); + if (QFile (fn).exists() ) + { + QMessageBox mb( vymName, + tr("The file %1 exists already.\n" + "Do you want to overwrite it?").arg(fn), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::Cancel | QMessageBox::Escape, + QMessageBox::NoButton ); + + mb.setButtonText( QMessageBox::Yes, tr("Overwrite") ); + mb.setButtonText( QMessageBox::No, tr("Cancel")); + switch( mb.exec() ) + { + case QMessageBox::Yes: + // save + break; + case QMessageBox::Cancel: + // do nothing + delete (fd); + return; + break; + } + } + saveFloatImageInt (fio,fd->selectedFilter(),fn ); + } + delete (fd); + } +} + + +void VymModel::importDirInt(BranchObj *dst, QDir d) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + // Traverse directories + d.setFilter( QDir::Dirs| QDir::Hidden | QDir::NoSymLinks ); + QFileInfoList list = d.entryInfoList(); + QFileInfo fi; + + for (int i = 0; i < list.size(); ++i) + { + fi=list.at(i); + if (fi.fileName() != "." && fi.fileName() != ".." ) + { + dst->addBranch(); + bo=dst->getLastBranch(); + bo->setHeading (fi.fileName() ); + bo->setColor (QColor("blue")); + bo->toggleScroll(); + if ( !d.cd(fi.fileName()) ) + QMessageBox::critical (0,tr("Critical Import Error"),tr("Cannot find the directory %1").arg(fi.fileName())); + else + { + // Recursively add subdirs + importDirInt (bo,d); + d.cdUp(); + } + } + } + // Traverse files + d.setFilter( QDir::Files| QDir::Hidden | QDir::NoSymLinks ); + list = d.entryInfoList(); + + for (int i = 0; i < list.size(); ++i) + { + fi=list.at(i); + dst->addBranch(); + bo=dst->getLastBranch(); + bo->setHeading (fi.fileName() ); + bo->setColor (QColor("black")); + if (fi.fileName().right(4) == ".vym" ) + bo->setVymLink (fi.filePath()); + } + } +} + +void VymModel::importDirInt (const QString &s) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + saveStateChangingPart (bo,bo,QString ("importDir (\"%1\")").arg(s),QString("Import directory structure from %1").arg(s)); + + QDir d(s); + importDirInt (bo,d); + } +} + +void VymModel::importDir() +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + QStringList filters; + filters <<"VYM map (*.vym)"; + QFileDialog *fd=new QFileDialog( NULL,vymName+ " - " +tr("Choose directory structure to import")); + fd->setMode (QFileDialog::DirectoryOnly); + fd->setFilters (filters); + fd->setCaption(vymName+" - " +tr("Choose directory structure to import")); + fd->show(); + + QString fn; + if ( fd->exec() == QDialog::Accepted ) + { + importDirInt (fd->selectedFile() ); + reposition(); + //FIXME needed? scene()->update(); + } + } +} + + +void VymModel::autosave() +{ + QDateTime now=QDateTime().currentDateTime(); + + // Disable autosave, while we have gone back in history + int redosAvail=undoSet.readNumEntry (QString("/history/redosAvail")); + if (redosAvail>0) return; + + // Also disable autosave for new map without filename + if (filePath.isEmpty()) return; + + + if (mapUnsaved &&mapChanged && settings.value ("/autosave/use",true).toBool() ) + { + if (QFileInfo(filePath).lastModified()<=fileChangedTime) + mainWindow->fileSave (this); + else + if (debug) + cout <<" ME::autosave rejected, file on disk is newer than last save.\n"; + + } +} + +void VymModel::fileChanged() +{ + // Check if file on disk has changed meanwhile + if (!filePath.isEmpty()) + { + QDateTime tmod=QFileInfo (filePath).lastModified(); + if (tmod>fileChangedTime) + { + // FIXME switch to current mapeditor and finish lineedits... + QMessageBox mb( vymName, + tr("The file of the map on disk has changed:\n\n" + " %1\n\nDo you want to reload that map with the new file?").arg(filePath), + QMessageBox::Question, + QMessageBox::Yes , + QMessageBox::Cancel | QMessageBox::Default, + QMessageBox::NoButton ); + + mb.setButtonText( QMessageBox::Yes, tr("Reload")); + mb.setButtonText( QMessageBox::No, tr("Ignore")); + switch( mb.exec() ) + { + case QMessageBox::Yes: + // Reload map + load (filePath,NewMap,fileType); + case QMessageBox::Cancel: + fileChangedTime=tmod; // allow autosave to overwrite newer file! + } + } + } +} + +bool VymModel::isDefault() +{ + return mapDefault; +} + +void VymModel::makeDefault() +{ + mapChanged=false; + mapDefault=true; +} + +bool VymModel::hasChanged() +{ + return mapChanged; +} + +void VymModel::setChanged() +{ + if (!mapChanged) + autosaveTimer->start(settings.value("/autosave/ms/",300000).toInt()); + mapChanged=true; + mapDefault=false; + mapUnsaved=true; + findReset(); +} + + +QString VymModel::getObjectName (const LinkableMapObj *lmo) +{ + QString s; + if (!lmo) return QString("Error: NULL has no name!"); + + if ((typeid(*lmo) == typeid(BranchObj) || + typeid(*lmo) == typeid(MapCenterObj))) + { + + s=(((BranchObj*)lmo)->getHeading()); + if (s=="") s="unnamed"; + return QString("branch (%1)").arg(s); + } + if ((typeid(*lmo) == typeid(FloatImageObj) )) + return QString ("floatimage [%1]").arg(((FloatImageObj*)lmo)->getOriginalFilename()); + return QString("Unknown type has no name!"); +} + +void VymModel::redo() +{ + // Can we undo at all? + if (redosAvail<1) return; + + bool blockSaveStateOrg=blockSaveState; + blockSaveState=true; + + redosAvail--; + + if (undosAvail<stepsTotal) undosAvail++; + curStep++; + if (curStep>stepsTotal) curStep=1; + QString undoCommand= undoSet.readEntry (QString("/history/step-%1/undoCommand").arg(curStep)); + QString undoSelection=undoSet.readEntry (QString("/history/step-%1/undoSelection").arg(curStep)); + QString redoCommand= undoSet.readEntry (QString("/history/step-%1/redoCommand").arg(curStep)); + QString redoSelection=undoSet.readEntry (QString("/history/step-%1/redoSelection").arg(curStep)); + QString comment=undoSet.readEntry (QString("/history/step-%1/comment").arg(curStep)); + QString version=undoSet.readEntry ("/history/version"); + + /* TODO Maybe check for version, if we save the history + if (!checkVersion(version)) + QMessageBox::warning(0,tr("Warning"), + tr("Version %1 of saved undo/redo data\ndoes not match current vym version %2.").arg(version).arg(vymVersion)); + */ + + // Find out current undo directory + QString bakMapDir(QString(tmpMapDir+"/undo-%1").arg(curStep)); + + if (debug) + { + cout << "VymModel::redo() begin\n"; + cout << " undosAvail="<<undosAvail<<endl; + cout << " redosAvail="<<redosAvail<<endl; + cout << " curStep="<<curStep<<endl; + cout << " ---------------------------"<<endl; + cout << " comment="<<comment.toStdString()<<endl; + cout << " undoCom="<<undoCommand.toStdString()<<endl; + cout << " undoSel="<<undoSelection.toStdString()<<endl; + cout << " redoCom="<<redoCommand.toStdString()<<endl; + cout << " redoSel="<<redoSelection.toStdString()<<endl; + cout << " ---------------------------"<<endl<<endl; + } + + // select object before redo + if (!redoSelection.isEmpty()) + select (redoSelection); + + + parseAtom (redoCommand); + reposition(); + + blockSaveState=blockSaveStateOrg; + + undoSet.setEntry ("/history/undosAvail",QString::number(undosAvail)); + undoSet.setEntry ("/history/redosAvail",QString::number(redosAvail)); + undoSet.setEntry ("/history/curStep",QString::number(curStep)); + undoSet.writeSettings(histPath); + + mainWindow->updateHistory (undoSet); + updateActions(); + + /* TODO remove testing + cout << "ME::redo() end\n"; + cout << " undosAvail="<<undosAvail<<endl; + cout << " redosAvail="<<redosAvail<<endl; + cout << " curStep="<<curStep<<endl; + cout << " ---------------------------"<<endl<<endl; + */ + + +} + +bool VymModel::isRedoAvailable() +{ + if (undoSet.readNumEntry("/history/redosAvail",0)>0) + return true; + else + return false; +} + +void VymModel::undo() +{ + // Can we undo at all? + if (undosAvail<1) return; + + mainWindow->statusMessage (tr("Autosave disabled during undo.")); + + bool blockSaveStateOrg=blockSaveState; + blockSaveState=true; + + QString undoCommand= undoSet.readEntry (QString("/history/step-%1/undoCommand").arg(curStep)); + QString undoSelection=undoSet.readEntry (QString("/history/step-%1/undoSelection").arg(curStep)); + QString redoCommand= undoSet.readEntry (QString("/history/step-%1/redoCommand").arg(curStep)); + QString redoSelection=undoSet.readEntry (QString("/history/step-%1/redoSelection").arg(curStep)); + QString comment=undoSet.readEntry (QString("/history/step-%1/comment").arg(curStep)); + QString version=undoSet.readEntry ("/history/version"); + + /* TODO Maybe check for version, if we save the history + if (!checkVersion(version)) + QMessageBox::warning(0,tr("Warning"), + tr("Version %1 of saved undo/redo data\ndoes not match current vym version %2.").arg(version).arg(vymVersion)); + */ + + // Find out current undo directory + QString bakMapDir(QString(tmpMapDir+"/undo-%1").arg(curStep)); + + // select object before undo + if (!undoSelection.isEmpty()) + select (undoSelection); + + if (debug) + { + cout << "VymModel::undo() begin\n"; + cout << " undosAvail="<<undosAvail<<endl; + cout << " redosAvail="<<redosAvail<<endl; + cout << " curStep="<<curStep<<endl; + cout << " ---------------------------"<<endl; + cout << " comment="<<comment.toStdString()<<endl; + cout << " undoCom="<<undoCommand.toStdString()<<endl; + cout << " undoSel="<<undoSelection.toStdString()<<endl; + cout << " redoCom="<<redoCommand.toStdString()<<endl; + cout << " redoSel="<<redoSelection.toStdString()<<endl; + cout << " ---------------------------"<<endl<<endl; + } + parseAtom (undoCommand); + reposition(); + + undosAvail--; + curStep--; + if (curStep<1) curStep=stepsTotal; + + redosAvail++; + + blockSaveState=blockSaveStateOrg; +/* TODO remove testing + cout << "VymModel::undo() end\n"; + cout << " undosAvail="<<undosAvail<<endl; + cout << " redosAvail="<<redosAvail<<endl; + cout << " curStep="<<curStep<<endl; + cout << " ---------------------------"<<endl<<endl; +*/ + + undoSet.setEntry ("/history/undosAvail",QString::number(undosAvail)); + undoSet.setEntry ("/history/redosAvail",QString::number(redosAvail)); + undoSet.setEntry ("/history/curStep",QString::number(curStep)); + undoSet.writeSettings(histPath); + + mainWindow->updateHistory (undoSet); + updateActions(); + selection.update(); + ensureSelectionVisible(); +} + +bool VymModel::isUndoAvailable() +{ + if (undoSet.readNumEntry("/history/undosAvail",0)>0) + return true; + else + return false; +} + +void VymModel::gotoHistoryStep (int i) +{ + // Restore variables + int undosAvail=undoSet.readNumEntry (QString("/history/undosAvail")); + int redosAvail=undoSet.readNumEntry (QString("/history/redosAvail")); + + if (i<0) i=undosAvail+redosAvail; + + // Clicking above current step makes us undo things + if (i<undosAvail) + { + for (int j=0; j<undosAvail-i; j++) undo(); + return; + } + // Clicking below current step makes us redo things + if (i>undosAvail) + for (int j=undosAvail; j<i; j++) + { + if (debug) cout << "VymModel::gotoHistoryStep redo "<<j<<"/"<<undosAvail<<" i="<<i<<endl; + redo(); + } + + // And ignore clicking the current row ;-) +} + + +QString VymModel::getHistoryPath() +{ + QString histName(QString("history-%1").arg(curStep)); + return (tmpMapDir+"/"+histName); +} + +void VymModel::saveState(const SaveMode &savemode, const QString &undoSelection, const QString &undoCom, const QString &redoSelection, const QString &redoCom, const QString &comment, LinkableMapObj *saveSel) +{ + sendData(redoCom); //FIXME testing + + // Main saveState + + + if (blockSaveState) return; + + if (debug) cout << "ME::saveState() for "<<qPrintable (mapName)<<endl; + + // Find out current undo directory + if (undosAvail<stepsTotal) undosAvail++; + curStep++; + if (curStep>stepsTotal) curStep=1; + + QString backupXML=""; + QString histDir=getHistoryPath(); + QString bakMapPath=histDir+"/map.xml"; + + // Create histDir if not available + QDir d(histDir); + if (!d.exists()) + makeSubDirs (histDir); + + // Save depending on how much needs to be saved + if (saveSel) + backupXML=saveToDir (histDir,mapName+"-",false, QPointF (),saveSel); + + QString undoCommand=""; + if (savemode==UndoCommand) + { + undoCommand=undoCom; + } + else if (savemode==PartOfMap ) + { + undoCommand=undoCom; + undoCommand.replace ("PATH",bakMapPath); + } + + if (!backupXML.isEmpty()) + // Write XML Data to disk + saveStringToDisk (bakMapPath,backupXML); + + // We would have to save all actions in a tree, to keep track of + // possible redos after a action. Possible, but we are too lazy: forget about redos. + redosAvail=0; + + // Write the current state to disk + undoSet.setEntry ("/history/undosAvail",QString::number(undosAvail)); + undoSet.setEntry ("/history/redosAvail",QString::number(redosAvail)); + undoSet.setEntry ("/history/curStep",QString::number(curStep)); + undoSet.setEntry (QString("/history/step-%1/undoCommand").arg(curStep),undoCommand); + undoSet.setEntry (QString("/history/step-%1/undoSelection").arg(curStep),undoSelection); + undoSet.setEntry (QString("/history/step-%1/redoCommand").arg(curStep),redoCom); + undoSet.setEntry (QString("/history/step-%1/redoSelection").arg(curStep),redoSelection); + undoSet.setEntry (QString("/history/step-%1/comment").arg(curStep),comment); + undoSet.setEntry (QString("/history/version"),vymVersion); + undoSet.writeSettings(histPath); + + if (debug) + { + // TODO remove after testing + //cout << " into="<< histPath.toStdString()<<endl; + cout << " stepsTotal="<<stepsTotal<< + ", undosAvail="<<undosAvail<< + ", redosAvail="<<redosAvail<< + ", curStep="<<curStep<<endl; + cout << " ---------------------------"<<endl; + cout << " comment="<<comment.toStdString()<<endl; + cout << " undoCom="<<undoCommand.toStdString()<<endl; + cout << " undoSel="<<undoSelection.toStdString()<<endl; + cout << " redoCom="<<redoCom.toStdString()<<endl; + cout << " redoSel="<<redoSelection.toStdString()<<endl; + if (saveSel) cout << " saveSel="<<qPrintable (getSelectString(saveSel))<<endl; + cout << " ---------------------------"<<endl; + } + + mainWindow->updateHistory (undoSet); + setChanged(); + updateActions(); +} + + +void VymModel::saveStateChangingPart(LinkableMapObj *undoSel, LinkableMapObj* redoSel, const QString &rc, const QString &comment) +{ + // save the selected part of the map, Undo will replace part of map + QString undoSelection=""; + if (undoSel) + undoSelection=getSelectString(undoSel); + else + qWarning ("VymModel::saveStateChangingPart no undoSel given!"); + QString redoSelection=""; + if (redoSel) + redoSelection=getSelectString(undoSel); + else + qWarning ("VymModel::saveStateChangingPart no redoSel given!"); + + + saveState (PartOfMap, + undoSelection, "addMapReplace (\"PATH\")", + redoSelection, rc, + comment, + undoSel); +} + +void VymModel::saveStateRemovingPart(LinkableMapObj *redoSel, const QString &comment) +{ + if (!redoSel) + { + qWarning ("VymModel::saveStateRemovingPart no redoSel given!"); + return; + } + QString undoSelection=getSelectString (redoSel->getParObj()); + QString redoSelection=getSelectString(redoSel); + if (typeid(*redoSel) == typeid(BranchObj) ) + { + // save the selected branch of the map, Undo will insert part of map + saveState (PartOfMap, + undoSelection, QString("addMapInsert (\"PATH\",%1)").arg(((BranchObj*)redoSel)->getNum()), + redoSelection, "delete ()", + comment, + redoSel); + } +} + + +void VymModel::saveState(LinkableMapObj *undoSel, const QString &uc, LinkableMapObj *redoSel, const QString &rc, const QString &comment) +{ + // "Normal" savestate: save commands, selections and comment + // so just save commands for undo and redo + // and use current selection + + QString redoSelection=""; + if (redoSel) redoSelection=getSelectString(redoSel); + QString undoSelection=""; + if (undoSel) undoSelection=getSelectString(undoSel); + + saveState (UndoCommand, + undoSelection, uc, + redoSelection, rc, + comment, + NULL); +} + +void VymModel::saveState(const QString &undoSel, const QString &uc, const QString &redoSel, const QString &rc, const QString &comment) +{ + // "Normal" savestate: save commands, selections and comment + // so just save commands for undo and redo + // and use current selection + saveState (UndoCommand, + undoSel, uc, + redoSel, rc, + comment, + NULL); +} + +void VymModel::saveState(const QString &uc, const QString &rc, const QString &comment) +{ + // "Normal" savestate applied to model (no selection needed): + // save commands and comment + saveState (UndoCommand, + NULL, uc, + NULL, rc, + comment, + NULL); +} + + QGraphicsScene* VymModel::getScene () { return mapScene; } -MapCenterObj* VymModel::addMapCenter() -{ - return addMapCenter (QPointF(0,0)); -} - -MapCenterObj* VymModel::addMapCenter(QPointF absPos) -{ - MapCenterObj *mapCenter = new MapCenterObj(mapScene); - mapCenter->move (absPos); - mapCenter->setVisibility (true); - mapCenter->setHeading (QApplication::translate("Heading of mapcenter in new map", "New map")); - mapCenter->setMapEditor(mapEditor); //FIXME needed to get defLinkStyle, mapLinkColorHint ... for later added objects - mapCenters.append(mapCenter); - return mapCenter; -} - -MapCenterObj *VymModel::removeMapCenter(MapCenterObj* mco) -{ - int i=mapCenters.indexOf (mco); - if (i>=0) - { - mapCenters.removeAt (i); - delete (mco); - if (i>0) return mapCenters.at(i-1); // Return previous MCO - } - return NULL; -} - BranchObj* VymModel::first() { if (mapCenters.count()>0) @@ -196,6 +1421,10 @@ return NULL; } +void VymModel::removeSelection() +{ +} + QString VymModel::saveToDir (const QString &tmpdir,const QString &prefix, int verbose, const QPointF &offset) { QString s; @@ -205,11 +1434,2264 @@ return s; } +////////////////////////////////////////////// +// Interface +////////////////////////////////////////////// +void VymModel::setVersion (const QString &s) +{ + version=s; +} + +void VymModel::setAuthor (const QString &s) +{ + saveState ( + QString ("setMapAuthor (\"%1\")").arg(author), + QString ("setMapAuthor (\"%1\")").arg(s), + QString ("Set author of map to \"%1\"").arg(s) + ); + + author=s; +} + +QString VymModel::getAuthor() +{ + return author; +} + +void VymModel::setComment (const QString &s) +{ + saveState ( + QString ("setMapComment (\"%1\")").arg(comment), + QString ("setMapComment (\"%1\")").arg(s), + QString ("Set comment of map") + ); + + comment=s; +} + +QString VymModel::getComment () +{ + return comment; +} + +QString VymModel::getDate () +{ + return QDate::currentDate().toString ("yyyy-MM-dd"); +} + +void VymModel::setHeading(const QString &s) +{ + BranchObj *sel=selection.getBranch(); + if (sel) + { + saveState( + sel, + "setHeading (\""+sel->getHeading()+"\")", + sel, + "setHeading (\""+s+"\")", + QString("Set heading of %1 to \"%2\"").arg(getObjectName(sel)).arg(s) ); + sel->setHeading(s ); + reposition(); + selection.update(); + ensureSelectionVisible(); + } +} + +QString VymModel::getHeading(bool &ok, QPoint &p) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + ok=true; + //p=scene->mapFromScene(bo->getAbsPos()); // FIXME this is view-dependant!!! + return bo->getHeading(); + } + ok=false; + return QString(); +} + + +void VymModel::setHeadingInt(const QString &s) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + bo->setHeading(s); + reposition(); + selection.update(); + ensureSelectionVisible(); + } +} + +BranchObj* VymModel::findText (QString s, bool cs) +{ + QTextDocument::FindFlags flags=0; + if (cs) flags=QTextDocument::FindCaseSensitively; + + if (!itFind) + { // Nothing found or new find process + if (EOFind) + // nothing found, start again + EOFind=false; + itFind=first(); + } + bool searching=true; + bool foundNote=false; + while (searching && !EOFind) + { + if (itFind) + { + // Searching in Note + if (itFind->getNote().contains(s,cs)) + { + if (selection.single()!=itFind) + { + selection.select(itFind); + ensureSelectionVisible(); + } + if (textEditor->findText(s,flags)) + { + searching=false; + foundNote=true; + } + } + // Searching in Heading + if (searching && itFind->getHeading().contains (s,cs) ) + { + selection.select(itFind); + ensureSelectionVisible(); + searching=false; + } + } + if (!foundNote) + { + itFind=next(itFind); + if (!itFind) EOFind=true; + } + //cout <<"still searching... "<<qPrintable( itFind->getHeading())<<endl; + } + if (!searching) + return selection.getBranch(); + else + return NULL; +} + +void VymModel::findReset() +{ // Necessary if text to find changes during a find process + itFind=NULL; + EOFind=false; +} + + + +void VymModel::setScene (QGraphicsScene *s) +{ + mapScene=s; + init(); // Here we have a mapScene set, + // which is (still) needed to create MapCenters +} + +void VymModel::setURL(const QString &url) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + QString oldurl=bo->getURL(); + bo->setURL (url); + saveState ( + bo, + QString ("setURL (\"%1\")").arg(oldurl), + bo, + QString ("setURL (\"%1\")").arg(url), + QString ("set URL of %1 to %2").arg(getObjectName(bo)).arg(url) + ); + updateActions(); + reposition(); + selection.update(); + ensureSelectionVisible(); + } +} + +QString VymModel::getURL() +{ + BranchObj *bo=selection.getBranch(); + if (bo) + return bo->getURL(); + else + return ""; +} + +QStringList VymModel::getURLs() +{ + QStringList urls; + BranchObj *bo=selection.getBranch(); + if (bo) + { + bo=bo->first(); + while (bo) + { + if (!bo->getURL().isEmpty()) urls.append( bo->getURL()); + bo=bo->next(); + } + } + return urls; +} + +void VymModel::linkFloatImageTo(const QString &dstString) +{ + FloatImageObj *fio=selection.getFloatImage(); + if (fio) + { + BranchObj *dst=(BranchObj*)findObjBySelect(dstString); + if (dst && (typeid(*dst)==typeid (BranchObj) || + typeid(*dst)==typeid (MapCenterObj))) + { + LinkableMapObj *dstPar=dst->getParObj(); + QString parString=getSelectString(dstPar); + QString fioPreSelectString=getSelectString(fio); + QString fioPreParentSelectString=getSelectString (fio->getParObj()); + ((BranchObj*)dst)->addFloatImage (fio); + selection.unselect(); + ((BranchObj*)(fio->getParObj()))->removeFloatImage (fio); + fio=((BranchObj*)dst)->getLastFloatImage(); + fio->setRelPos(); + fio->reposition(); + selection.select(fio); + saveState( + getSelectString(fio), + QString("linkTo (\"%1\")").arg(fioPreParentSelectString), + fioPreSelectString, + QString ("linkTo (\"%1\")").arg(dstString), + QString ("Link floatimage to %1").arg(getObjectName(dst))); + } + } +} + + +void VymModel::setFrameType(const FrameObj::FrameType &t) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + QString s=bo->getFrameTypeName(); + bo->setFrameType (t); + saveState (bo, QString("setFrameType (\"%1\")").arg(s), + bo, QString ("setFrameType (\"%1\")").arg(bo->getFrameTypeName()),QString ("set type of frame to %1").arg(s)); + reposition(); + bo->updateLink(); + } +} + +void VymModel::setFrameType(const QString &s) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + saveState (bo, QString("setFrameType (\"%1\")").arg(bo->getFrameTypeName()), + bo, QString ("setFrameType (\"%1\")").arg(s),QString ("set type of frame to %1").arg(s)); + bo->setFrameType (s); + reposition(); + bo->updateLink(); + } +} + +void VymModel::setFramePenColor(const QColor &c) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + saveState (bo, QString("setFramePenColor (\"%1\")").arg(bo->getFramePenColor().name() ), + bo, QString ("setFramePenColor (\"%1\")").arg(c.name() ),QString ("set pen color of frame to %1").arg(c.name() )); + bo->setFramePenColor (c); + } +} + +void VymModel::setFrameBrushColor(const QColor &c) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + saveState (bo, QString("setFrameBrushColor (\"%1\")").arg(bo->getFrameBrushColor().name() ), + bo, QString ("setFrameBrushColor (\"%1\")").arg(c.name() ),QString ("set brush color of frame to %1").arg(c.name() )); + bo->setFrameBrushColor (c); + } +} + +void VymModel::setFramePadding (const int &i) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + saveState (bo, QString("setFramePadding (\"%1\")").arg(bo->getFramePadding() ), + bo, QString ("setFramePadding (\"%1\")").arg(i),QString ("set brush color of frame to %1").arg(i)); + bo->setFramePadding (i); + reposition(); + bo->updateLink(); + } +} + +void VymModel::setFrameBorderWidth(const int &i) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + saveState (bo, QString("setFrameBorderWidth (\"%1\")").arg(bo->getFrameBorderWidth() ), + bo, QString ("setFrameBorderWidth (\"%1\")").arg(i),QString ("set border width of frame to %1").arg(i)); + bo->setFrameBorderWidth (i); + reposition(); + bo->updateLink(); + } +} + +void VymModel::setIncludeImagesVer(bool b) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + QString u= b ? "false" : "true"; + QString r=!b ? "false" : "true"; + + saveState( + bo, + QString("setIncludeImagesVertically (%1)").arg(u), + bo, + QString("setIncludeImagesVertically (%1)").arg(r), + QString("Include images vertically in %1").arg(getObjectName(bo)) + ); + bo->setIncludeImagesVer(b); + reposition(); + } +} + +void VymModel::setIncludeImagesHor(bool b) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + QString u= b ? "false" : "true"; + QString r=!b ? "false" : "true"; + + saveState( + bo, + QString("setIncludeImagesHorizontally (%1)").arg(u), + bo, + QString("setIncludeImagesHorizontally (%1)").arg(r), + QString("Include images horizontally in %1").arg(getObjectName(bo)) + ); + bo->setIncludeImagesHor(b); + reposition(); + } +} + +void VymModel::setHideLinkUnselected (bool b) +{ + LinkableMapObj *sel=selection.single(); + if (sel && + (selection.type() == Selection::Branch || + selection.type() == Selection::MapCenter || + selection.type() == Selection::FloatImage )) + { + QString u= b ? "false" : "true"; + QString r=!b ? "false" : "true"; + + saveState( + sel, + QString("setHideLinkUnselected (%1)").arg(u), + sel, + QString("setHideLinkUnselected (%1)").arg(r), + QString("Hide link of %1 if unselected").arg(getObjectName(sel)) + ); + sel->setHideLinkUnselected(b); + } +} + +void VymModel::setHideExport(bool b) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + bo->setHideInExport (b); + QString u= b ? "false" : "true"; + QString r=!b ? "false" : "true"; + + saveState( + bo, + QString ("setHideExport (%1)").arg(u), + bo, + QString ("setHideExport (%1)").arg(r), + QString ("Set HideExport flag of %1 to %2").arg(getObjectName(bo)).arg (r) + ); + updateActions(); + reposition(); + selection.update(); + // FIXME needed? scene()->update(); + } +} + +void VymModel::toggleHideExport() +{ + BranchObj *bo=selection.getBranch(); + if (bo) + setHideExport ( !bo->hideInExport() ); +} + + +void VymModel::copy() +{ + LinkableMapObj *sel=selection.single(); + if (sel) + { + if (redosAvail == 0) + { + // Copy to history + QString s=getSelectString(sel); + saveState (PartOfMap, s, "nop ()", s, "copy ()","Copy selection to clipboard",sel ); + curClipboard=curStep; + } + + // Copy also to global clipboard, because we are at last step in history + QString bakMapName(QString("history-%1").arg(curStep)); + QString bakMapDir(tmpMapDir +"/"+bakMapName); + copyDir (bakMapDir,clipboardDir ); + + clipboardEmpty=false; + updateActions(); + } +} + + +void VymModel::pasteNoSave(const int &n) +{ + bool old=blockSaveState; + blockSaveState=true; + bool zippedOrg=zipped; + if (redosAvail > 0 || n!=0) + { + // Use the "historical" buffer + QString bakMapName(QString("history-%1").arg(n)); + QString bakMapDir(tmpMapDir +"/"+bakMapName); + load (bakMapDir+"/"+clipboardFile,ImportAdd, VymMap); + } else + // Use the global buffer + load (clipboardDir+"/"+clipboardFile,ImportAdd, VymMap); + zipped=zippedOrg; + blockSaveState=old; +} + +void VymModel::paste() +{ + BranchObj *sel=selection.getBranch(); + if (sel) + { + saveStateChangingPart( + sel, + sel, + QString ("paste (%1)").arg(curClipboard), + QString("Paste to %1").arg( getObjectName(sel)) + ); + pasteNoSave(0); + reposition(); + } +} + +void VymModel::cut() +{ + LinkableMapObj *sel=selection.single(); + if ( sel && (selection.type() == Selection::Branch || + selection.type()==Selection::MapCenter || + selection.type()==Selection::FloatImage)) + { + /* No savestate! savestate is called in cutNoSave + saveStateChangingPart( + sel->getParObj(), + sel, + "cut ()", + QString("Cut %1").arg(getObjectName(sel )) + ); + */ + copy(); + deleteSelection(); + reposition(); + } +} + +void VymModel::moveBranchUp() +{ + BranchObj* bo=selection.getBranch(); + BranchObj* par; + if (bo) + { + if (!bo->canMoveBranchUp()) return; + par=(BranchObj*)(bo->getParObj()); + BranchObj *obo=par->moveBranchUp (bo); // bo will be the one below selection + saveState (getSelectString(bo),"moveBranchDown ()",getSelectString(obo),"moveBranchUp ()",QString("Move up %1").arg(getObjectName(bo))); + reposition(); + //FIXME needed? scene()->update(); + selection.update(); + ensureSelectionVisible(); + } +} + +void VymModel::moveBranchDown() +{ + BranchObj* bo=selection.getBranch(); + BranchObj* par; + if (bo) + { + if (!bo->canMoveBranchDown()) return; + par=(BranchObj*)(bo->getParObj()); + BranchObj *obo=par->moveBranchDown(bo); // bo will be the one above selection + saveState(getSelectString(bo),"moveBranchUp ()",getSelectString(obo),"moveBranchDown ()",QString("Move down %1").arg(getObjectName(bo))); + reposition(); + //FIXME needed? scene()->update(); + selection.update(); + ensureSelectionVisible(); + } +} + +void VymModel::sortChildren() +{ + BranchObj* bo=selection.getBranch(); + if (bo) + { + if(bo->countBranches()>1) + { + saveStateChangingPart(bo,bo, "sortChildren ()",QString("Sort children of %1").arg(getObjectName(bo))); + bo->sortChildren(); + reposition(); + ensureSelectionVisible(); + } + } +} + +MapCenterObj* VymModel::addMapCenter () +{ + MapCenterObj *mco=addMapCenter (QPointF(0,0)); + selection.select (mco); + updateActions(); + ensureSelectionVisible(); + saveState ( + mco, + "delete()", + NULL, + // FIXME how to position LineEdit without contextMenuPos ? + // QString ("addMapCenter (%1,%2)").arg (contextMenuPos.x()).arg(contextMenuPos.y()), + // QString ("Adding MapCenter to (%1,%2").arg (contextMenuPos.x()).arg(contextMenuPos.y()) + QString ("addMapCenter (%1,%2)").arg (0).arg(0), + QString ("Adding MapCenter to (%1,%2").arg (0).arg(0) + ); + return mco; +} + +MapCenterObj* VymModel::addMapCenter(QPointF absPos) +{ + MapCenterObj *mapCenter = new MapCenterObj(mapScene); + mapCenter->move (absPos); + mapCenter->setVisibility (true); + mapCenter->setHeading (QApplication::translate("Heading of mapcenter in new map", "New map")); + mapCenter->setMapEditor(mapEditor); //FIXME needed to get defLinkStyle, mapLinkColorHint ... for later added objects + mapCenters.append(mapCenter); + return mapCenter; +} + +MapCenterObj *VymModel::removeMapCenter(MapCenterObj* mco) +{ + int i=mapCenters.indexOf (mco); + if (i>=0) + { + mapCenters.removeAt (i); + delete (mco); + if (i>0) return mapCenters.at(i-1); // Return previous MCO + } + return NULL; +} + + +BranchObj* VymModel::addNewBranchInt(int num) +{ + // Depending on pos: + // -3 insert in children of parent above selection + // -2 add branch to selection + // -1 insert in children of parent below selection + // 0..n insert in children of parent at pos + BranchObj *newbo=NULL; + BranchObj *bo=selection.getBranch(); + if (bo) + { + if (num==-2) + { + // save scroll state. If scrolled, automatically select + // new branch in order to tmp unscroll parent... + newbo=bo->addBranch(); + + }else if (num==-1) + { + num=bo->getNum()+1; + bo=(BranchObj*)bo->getParObj(); + if (bo) newbo=bo->insertBranch(num); + }else if (num==-3) + { + num=bo->getNum(); + bo=(BranchObj*)bo->getParObj(); + if (bo) newbo=bo->insertBranch(num); + } + if (!newbo) return NULL; + } + return newbo; +} + +BranchObj* VymModel::addNewBranch(int pos) +{ + // Different meaning than num in addNewBranchInt! + // -1 add above + // 0 add as child + // +1 add below + BranchObj *bo = selection.getBranch(); + BranchObj *newbo=NULL; + + if (bo) + { + // FIXME do we still need this in model? setCursor (Qt::ArrowCursor); + + newbo=addNewBranchInt (pos-2); + + if (newbo) + { + saveState( + newbo, + "delete ()", + bo, + QString ("addBranch (%1)").arg(pos), + QString ("Add new branch to %1").arg(getObjectName(bo))); + + reposition(); + selection.update(); + latestSelectionString=getSelectString(newbo); + // In Network mode, the client needs to know where the new branch is, + // so we have to pass on this information via saveState. + // TODO: Get rid of this positioning workaround + QString ps=qpointfToString (newbo->getAbsPos()); + sendData ("selectLatestAdded ()"); + sendData (QString("move %1").arg(ps)); + sendSelection(); + } + } + return newbo; +} + + +BranchObj* VymModel::addNewBranchBefore() +{ + BranchObj *newbo=NULL; + BranchObj *bo = selection.getBranch(); + if (bo && selection.type()==Selection::Branch) + // We accept no MapCenterObj here, so we _have_ a parent + { + QPointF p=bo->getRelPos(); + + + BranchObj *parbo=(BranchObj*)(bo->getParObj()); + + // add below selection + newbo=parbo->insertBranch(bo->getNum()+1); + if (newbo) + { + newbo->move2RelPos (p); + + // Move selection to new branch + bo->linkTo (newbo,-1); + + saveState (newbo, "deleteKeepChildren ()", newbo, "addBranchBefore ()", + QString ("Add branch before %1").arg(getObjectName(bo))); + + reposition(); + selection.update(); + } + } + latestSelectionString=selection.getSelectString(); + return newbo; +} + +void VymModel::deleteSelection() +{ + BranchObj *bo = selection.getBranch(); + if (bo && selection.type()==Selection::MapCenter) + { + // BranchObj* par=(BranchObj*)(bo->getParObj()); + selection.unselect(); + /* FIXME Note: does saveStateRemovingPart work for MCO? (No parent!) + saveStateRemovingPart (bo, QString ("Delete %1").arg(getObjectName(bo))); + */ + bo=removeMapCenter ((MapCenterObj*)bo); + if (bo) + { + selection.select (bo); + ensureSelectionVisible(); + selection.update(); + } + reposition(); + return; + } + if (bo && selection.type()==Selection::Branch) + { + BranchObj* par=(BranchObj*)bo->getParObj(); + selection.unselect(); + saveStateRemovingPart (bo, QString ("Delete %1").arg(getObjectName(bo))); + par->removeBranch(bo); + selection.select (par); + ensureSelectionVisible(); + reposition(); + selection.update(); + return; + } + FloatImageObj *fio=selection.getFloatImage(); + if (fio) + { + BranchObj* par=(BranchObj*)fio->getParObj(); + saveStateChangingPart( + par, + fio, + "delete ()", + QString("Delete %1").arg(getObjectName(fio)) + ); + selection.unselect(); + par->removeFloatImage(fio); + selection.select (par); + reposition(); + selection.update(); + ensureSelectionVisible(); + return; + } +} + +void VymModel::deleteKeepChildren() +{ + BranchObj *bo=selection.getBranch(); + BranchObj *par; + if (bo) + { + par=(BranchObj*)(bo->getParObj()); + QPointF p=bo->getRelPos(); + saveStateChangingPart( + bo->getParObj(), + bo, + "deleteKeepChildren ()", + QString("Remove %1 and keep its children").arg(getObjectName(bo)) + ); + + QString sel=getSelectString(bo); + unselect(); + par->removeBranchHere(bo); + reposition(); + select (sel); + selection.getBranch()->move2RelPos (p); + reposition(); + } +} + +void VymModel::deleteChildren() +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + saveStateChangingPart( + bo, + bo, + "deleteChildren ()", + QString( "Remove children of branch %1").arg(getObjectName(bo)) + ); + bo->removeChildren(); + reposition(); + } +} + + +bool VymModel::scrollBranch(BranchObj *bo) +{ + if (bo) + { + if (bo->isScrolled()) return false; + if (bo->countBranches()==0) return false; + if (bo->getDepth()==0) return false; + QString u,r; + r="scroll"; + u="unscroll"; + saveState( + bo, + QString ("%1 ()").arg(u), + bo, + QString ("%1 ()").arg(r), + QString ("%1 %2").arg(r).arg(getObjectName(bo)) + ); + bo->toggleScroll(); + selection.update(); + // FIXME needed? scene()->update(); + return true; + } + return false; +} + +bool VymModel::unscrollBranch(BranchObj *bo) +{ + if (bo) + { + if (!bo->isScrolled()) return false; + if (bo->countBranches()==0) return false; + if (bo->getDepth()==0) return false; + QString u,r; + u="scroll"; + r="unscroll"; + saveState( + bo, + QString ("%1 ()").arg(u), + bo, + QString ("%1 ()").arg(r), + QString ("%1 %2").arg(r).arg(getObjectName(bo)) + ); + bo->toggleScroll(); + selection.update(); + // FIXME needed? scene()->update(); + return true; + } + return false; +} + +void VymModel::toggleScroll() +{ + BranchObj *bo=selection.getBranch(); + if (selection.type()==Selection::Branch ) + { + if (bo->isScrolled()) + unscrollBranch (bo); + else + scrollBranch (bo); + } +} + +void VymModel::unscrollChildren() +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + bo->first(); + while (bo) + { + if (bo->isScrolled()) unscrollBranch (bo); + bo=bo->next(); + } + } +} +void VymModel::addFloatImage (const QPixmap &img) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + FloatImageObj *fio=bo->addFloatImage(); + fio->load(img); + fio->setOriginalFilename("No original filename (image added by dropevent)"); + QString s=getSelectString(bo); + saveState (PartOfMap, s, "nop ()", s, "copy ()","Copy dropped image to clipboard",fio ); + saveState (fio,"delete ()", bo,QString("paste(%1)").arg(curStep),"Pasting dropped image"); + reposition(); + // FIXME needed? scene()->update(); + } +} + + +void VymModel::colorBranch (QColor c) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + saveState( + bo, + QString ("colorBranch (\"%1\")").arg(bo->getColor().name()), + bo, + QString ("colorBranch (\"%1\")").arg(c.name()), + QString("Set color of %1 to %2").arg(getObjectName(bo)).arg(c.name()) + ); + bo->setColor(c); // color branch + } +} + +void VymModel::colorSubtree (QColor c) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + saveStateChangingPart( + bo, + bo, + QString ("colorSubtree (\"%1\")").arg(c.name()), + QString ("Set color of %1 and children to %2").arg(getObjectName(bo)).arg(c.name()) + ); + bo->setColorSubtree (c); // color links, color children + } +} + +QColor VymModel::getCurrentHeadingColor() +{ + BranchObj *bo=selection.getBranch(); + if (bo) return bo->getColor(); + + QMessageBox::warning(0,"Warning","Can't get color of heading,\nthere's no branch selected"); + return Qt::black; +} + + + +void VymModel::editURL() +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + bool ok; + QString text = QInputDialog::getText( + "VYM", tr("Enter URL:"), QLineEdit::Normal, + bo->getURL(), &ok, NULL); + if ( ok) + // user entered something and pressed OK + setURL(text); + } +} + +void VymModel::editLocalURL() +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + QStringList filters; + filters <<"All files (*)"; + filters << tr("Text","Filedialog") + " (*.txt)"; + filters << tr("Spreadsheet","Filedialog") + " (*.odp,*.sxc)"; + filters << tr("Textdocument","Filedialog") +" (*.odw,*.sxw)"; + filters << tr("Images","Filedialog") + " (*.png *.bmp *.xbm *.jpg *.png *.xpm *.gif *.pnm)"; + QFileDialog *fd=new QFileDialog( NULL,vymName+" - " +tr("Set URL to a local file")); + fd->setFilters (filters); + fd->setCaption(vymName+" - " +tr("Set URL to a local file")); + fd->setDirectory (lastFileDir); + if (! bo->getVymLink().isEmpty() ) + fd->selectFile( bo->getURL() ); + fd->show(); + + if ( fd->exec() == QDialog::Accepted ) + { + lastFileDir=QDir (fd->directory().path()); + setURL (fd->selectedFile() ); + } + } +} + + +void VymModel::editHeading2URL() +{ + BranchObj *bo=selection.getBranch(); + if (bo) + setURL (bo->getHeading()); +} + +void VymModel::editBugzilla2URL() +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + QString url= "https://bugzilla.novell.com/show_bug.cgi?id="+bo->getHeading(); + setURL (url); + } +} + +void VymModel::editFATE2URL() +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + QString url= "http://keeper.suse.de:8080/webfate/match/id?value=ID"+bo->getHeading(); + saveState( + bo, + "setURL (\""+bo->getURL()+"\")", + bo, + "setURL (\""+url+"\")", + QString("Use heading of %1 as link to FATE").arg(getObjectName(bo)) + ); + bo->setURL (url); + updateActions(); + } +} + +void VymModel::editVymLink() +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + QStringList filters; + filters <<"VYM map (*.vym)"; + QFileDialog *fd=new QFileDialog( NULL,vymName+" - " +tr("Link to another map")); + fd->setFilters (filters); + fd->setCaption(vymName+" - " +tr("Link to another map")); + fd->setDirectory (lastFileDir); + if (! bo->getVymLink().isEmpty() ) + fd->selectFile( bo->getVymLink() ); + fd->show(); + + QString fn; + if ( fd->exec() == QDialog::Accepted ) + { + lastFileDir=QDir (fd->directory().path()); + saveState( + bo, + "setVymLink (\""+bo->getVymLink()+"\")", + bo, + "setVymLink (\""+fd->selectedFile()+"\")", + QString("Set vymlink of %1 to %2").arg(getObjectName(bo)).arg(fd->selectedFile()) + ); + setVymLink (fd->selectedFile() ); // FIXME ok? + } + } +} + +void VymModel::setVymLink (const QString &s) +{ + // Internal function, no saveState needed + BranchObj *bo=selection.getBranch(); + if (bo) + { + bo->setVymLink(s); + reposition(); + updateActions(); + selection.update(); + ensureSelectionVisible(); + } +} + +void VymModel::deleteVymLink() +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + saveState( + bo, + "setVymLink (\""+bo->getVymLink()+"\")", + bo, + "setVymLink (\"\")", + QString("Unset vymlink of %1").arg(getObjectName(bo)) + ); + bo->setVymLink ("" ); + updateActions(); + reposition(); + // FIXME needed? scene()->update(); + } +} + +QString VymModel::getVymLink() +{ + BranchObj *bo=selection.getBranch(); + if (bo) + return bo->getVymLink(); + else + return ""; + +} + +QStringList VymModel::getVymLinks() +{ + QStringList links; + BranchObj *bo=selection.getBranch(); + if (bo) + { + bo=bo->first(); + while (bo) + { + if (!bo->getVymLink().isEmpty()) links.append( bo->getVymLink()); + bo=bo->next(); + } + } + return links; +} + + +void VymModel::followXLink(int i) +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + bo=bo->XLinkTargetAt(i); + if (bo) + { + selection.select(bo); + ensureSelectionVisible(); + } + } +} + +void VymModel::editXLink(int i) // FIXME missing saveState +{ + BranchObj *bo=selection.getBranch(); + if (bo) + { + XLinkObj *xlo=bo->XLinkAt(i); + if (xlo) + { + EditXLinkDialog dia; + dia.setXLink (xlo); + dia.setSelection(bo); + if (dia.exec() == QDialog::Accepted) + { + if (dia.useSettingsGlobal() ) + { + setMapDefXLinkColor (xlo->getColor() ); + setMapDefXLinkWidth (xlo->getWidth() ); + } + if (dia.deleteXLink()) + bo->deleteXLinkAt(i); + } + } + } +} + + + + + +////////////////////////////////////////////// +// Scripting +////////////////////////////////////////////// + +void VymModel::parseAtom(const QString &atom) +{ + BranchObj *selb=selection.getBranch(); + QString s,t; + double x,y; + int n; + bool b,ok; + + // Split string s into command and parameters + parser.parseAtom (atom); + QString com=parser.getCommand(); + + // External commands + ///////////////////////////////////////////////////////////////////// + if (com=="addBranch") + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else + { + QList <int> pl; + pl << 0 <<1; + if (parser.checkParCount(pl)) + { + if (parser.parCount()==0) + addNewBranch (0); + else + { + n=parser.parInt (ok,0); + if (ok ) addNewBranch (n); + } + } + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="addBranchBefore") + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else + { + if (parser.parCount()==0) + { + addNewBranchBefore (); + } + } + ///////////////////////////////////////////////////////////////////// + } else if (com==QString("addMapCenter")) + { + if (parser.checkParCount(2)) + { + x=parser.parDouble (ok,0); + if (ok) + { + y=parser.parDouble (ok,1); + if (ok) addMapCenter (QPointF(x,y)); + } + } + ///////////////////////////////////////////////////////////////////// + } else if (com==QString("addMapReplace")) + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + //s=parser.parString (ok,0); // selection + t=parser.parString (ok,0); // path to map + if (QDir::isRelativePath(t)) t=(tmpMapDir + "/"+t); + addMapReplaceInt(getSelectString(selb),t); + } + ///////////////////////////////////////////////////////////////////// + } else if (com==QString("addMapInsert")) + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else + { + if (parser.checkParCount(2)) + { + t=parser.parString (ok,0); // path to map + n=parser.parInt(ok,1); // position + if (QDir::isRelativePath(t)) t=(tmpMapDir + "/"+t); + addMapInsertInt(t,n); + } + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="clearFlags") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(0)) + { + selb->clearStandardFlags(); + selb->updateFlagsToolbar(); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="colorBranch") + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + QColor c=parser.parColor (ok,0); + if (ok) colorBranch (c); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="colorSubtree") + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + QColor c=parser.parColor (ok,0); + if (ok) colorSubtree (c); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="copy") + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(0)) + { + //FIXME missing action for copy + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="cut") + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } else if ( selection.type()!=Selection::Branch && + selection.type()!=Selection::MapCenter && + selection.type()!=Selection::FloatImage ) + { + parser.setError (Aborted,"Type of selection is not a branch or floatimage"); + } else if (parser.checkParCount(0)) + { + cut(); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="delete") + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } + /*else if (selection.type() != Selection::Branch && selection.type() != Selection::FloatImage ) + { + parser.setError (Aborted,"Type of selection is wrong."); + } + */ + else if (parser.checkParCount(0)) + { + deleteSelection(); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="deleteKeepChildren") + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(0)) + { + deleteKeepChildren(); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="deleteChildren") + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(0)) + { + deleteChildren(); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="exportASCII") + { + QString fname=""; + ok=true; + if (parser.parCount()>=1) + // Hey, we even have a filename + fname=parser.parString(ok,0); + if (!ok) + { + parser.setError (Aborted,"Could not read filename"); + } else + { + exportASCII (fname,false); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="exportImage") + { + QString fname=""; + ok=true; + if (parser.parCount()>=2) + // Hey, we even have a filename + fname=parser.parString(ok,0); + if (!ok) + { + parser.setError (Aborted,"Could not read filename"); + } else + { + QString format="PNG"; + if (parser.parCount()>=2) + { + format=parser.parString(ok,1); + } + exportImage (fname,false,format); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="exportXHTML") + { + QString fname=""; + ok=true; + if (parser.parCount()>=2) + // Hey, we even have a filename + fname=parser.parString(ok,1); + if (!ok) + { + parser.setError (Aborted,"Could not read filename"); + } else + { + exportXHTML (fname,false); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="exportXML") + { + QString fname=""; + ok=true; + if (parser.parCount()>=2) + // Hey, we even have a filename + fname=parser.parString(ok,1); + if (!ok) + { + parser.setError (Aborted,"Could not read filename"); + } else + { + exportXML (fname,false); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="importDir") + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + s=parser.parString(ok,0); + if (ok) importDirInt(s); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="linkTo") + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } else if ( selb) + { + if (parser.checkParCount(4)) + { + // 0 selectstring of parent + // 1 num in parent (for branches) + // 2,3 x,y of mainbranch or mapcenter + s=parser.parString(ok,0); + LinkableMapObj *dst=findObjBySelect (s); + if (dst) + { + if (typeid(*dst) == typeid(BranchObj) ) + { + // Get number in parent + n=parser.parInt (ok,1); + if (ok) + { + selb->linkTo ((BranchObj*)(dst),n); + selection.update(); + } + } else if (typeid(*dst) == typeid(MapCenterObj) ) + { + selb->linkTo ((BranchObj*)(dst),-1); + // Get coordinates of mainbranch + x=parser.parDouble(ok,2); + if (ok) + { + y=parser.parDouble(ok,3); + if (ok) + { + selb->move (x,y); + selection.update(); + } + } + } + } + } + } else if ( selection.type() == Selection::FloatImage) + { + if (parser.checkParCount(1)) + { + // 0 selectstring of parent + s=parser.parString(ok,0); + LinkableMapObj *dst=findObjBySelect (s); + if (dst) + { + if (typeid(*dst) == typeid(BranchObj) || + typeid(*dst) == typeid(MapCenterObj)) + linkFloatImageTo (getSelectString(dst)); + } else + parser.setError (Aborted,"Destination is not a branch"); + } + } else + parser.setError (Aborted,"Type of selection is not a floatimage or branch"); + ///////////////////////////////////////////////////////////////////// + } else if (com=="loadImage") + { + if (selection.isEmpty()) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + s=parser.parString(ok,0); + if (ok) loadFloatImageInt (s); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="moveBranchUp") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(0)) + { + moveBranchUp(); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="moveBranchDown") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(0)) + { + moveBranchDown(); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="move") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if ( selection.type()!=Selection::Branch && + selection.type()!=Selection::MapCenter && + selection.type()!=Selection::FloatImage ) + { + parser.setError (Aborted,"Type of selection is not a branch or floatimage"); + } else if (parser.checkParCount(2)) + { + x=parser.parDouble (ok,0); + if (ok) + { + y=parser.parDouble (ok,1); + if (ok) move (x,y); + } + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="moveRel") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if ( selection.type()!=Selection::Branch && + selection.type()!=Selection::MapCenter && + selection.type()!=Selection::FloatImage ) + { + parser.setError (Aborted,"Type of selection is not a branch or floatimage"); + } else if (parser.checkParCount(2)) + { + x=parser.parDouble (ok,0); + if (ok) + { + y=parser.parDouble (ok,1); + if (ok) moveRel (x,y); + } + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="nop") + { + ///////////////////////////////////////////////////////////////////// + } else if (com=="paste") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + n=parser.parInt (ok,0); + if (ok) pasteNoSave(n); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="qa") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(4)) + { + QString c,u; + c=parser.parString (ok,0); + if (!ok) + { + parser.setError (Aborted,"No comment given"); + } else + { + s=parser.parString (ok,1); + if (!ok) + { + parser.setError (Aborted,"First parameter is not a string"); + } else + { + t=parser.parString (ok,2); + if (!ok) + { + parser.setError (Aborted,"Condition is not a string"); + } else + { + u=parser.parString (ok,3); + if (!ok) + { + parser.setError (Aborted,"Third parameter is not a string"); + } else + { + if (s!="heading") + { + parser.setError (Aborted,"Unknown type: "+s); + } else + { + if (! (t=="eq") ) + { + parser.setError (Aborted,"Unknown operator: "+t); + } else + { + if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else + { + if (selb->getHeading() == u) + { + cout << "PASSED: " << qPrintable (c) << endl; + } else + { + cout << "FAILED: " << qPrintable (c) << endl; + } + } + } + } + } + } + } + } + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="saveImage") + { + FloatImageObj *fio=selection.getFloatImage(); + if (!fio) + { + parser.setError (Aborted,"Type of selection is not an image"); + } else if (parser.checkParCount(2)) + { + s=parser.parString(ok,0); + if (ok) + { + t=parser.parString(ok,1); + if (ok) saveFloatImageInt (fio,t,s); + } + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="scroll") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(0)) + { + if (!scrollBranch (selb)) + parser.setError (Aborted,"Could not scroll branch"); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="select") + { + if (parser.checkParCount(1)) + { + s=parser.parString(ok,0); + if (ok) select (s); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="selectLastBranch") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(0)) + { + BranchObj *bo=selb->getLastBranch(); + if (!bo) + parser.setError (Aborted,"Could not select last branch"); + selectInt (bo); + + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="selectLastImage") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(0)) + { + FloatImageObj *fio=selb->getLastFloatImage(); + if (!fio) + parser.setError (Aborted,"Could not select last image"); + selectInt (fio); + + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="selectLatestAdded") + { + if (latestSelectionString.isEmpty() ) + { + parser.setError (Aborted,"No latest added object"); + } else + { + if (!select (latestSelectionString)) + parser.setError (Aborted,"Could not select latest added object "+latestSelectionString); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setFrameType") + { + if ( selection.type()!=Selection::Branch && selection.type()!= Selection::MapCenter && selection.type()!=Selection::FloatImage) + { + parser.setError (Aborted,"Type of selection does not allow setting frame type"); + } + else if (parser.checkParCount(1)) + { + s=parser.parString(ok,0); + if (ok) setFrameType (s); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setFramePenColor") + { + if ( selection.type()!=Selection::Branch && selection.type()!= Selection::MapCenter && selection.type()!=Selection::FloatImage) + { + parser.setError (Aborted,"Type of selection does not allow setting of pen color"); + } + else if (parser.checkParCount(1)) + { + QColor c=parser.parColor(ok,0); + if (ok) setFramePenColor (c); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setFrameBrushColor") + { + if ( selection.type()!=Selection::Branch && selection.type()!= Selection::MapCenter && selection.type()!=Selection::FloatImage) + { + parser.setError (Aborted,"Type of selection does not allow setting brush color"); + } + else if (parser.checkParCount(1)) + { + QColor c=parser.parColor(ok,0); + if (ok) setFrameBrushColor (c); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setFramePadding") + { + if ( selection.type()!=Selection::Branch && selection.type()!= Selection::MapCenter && selection.type()!=Selection::FloatImage) + { + parser.setError (Aborted,"Type of selection does not allow setting frame padding"); + } + else if (parser.checkParCount(1)) + { + n=parser.parInt(ok,0); + if (ok) setFramePadding(n); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setFrameBorderWidth") + { + if ( selection.type()!=Selection::Branch && selection.type()!= Selection::MapCenter && selection.type()!=Selection::FloatImage) + { + parser.setError (Aborted,"Type of selection does not allow setting frame border width"); + } + else if (parser.checkParCount(1)) + { + n=parser.parInt(ok,0); + if (ok) setFrameBorderWidth (n); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setMapAuthor") + { + if (parser.checkParCount(1)) + { + s=parser.parString(ok,0); + if (ok) setAuthor (s); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setMapComment") + { + if (parser.checkParCount(1)) + { + s=parser.parString(ok,0); + if (ok) setComment(s); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setMapBackgroundColor") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selection.getBranch() ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + QColor c=parser.parColor (ok,0); + if (ok) setMapBackgroundColor (c); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setMapDefLinkColor") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + QColor c=parser.parColor (ok,0); + if (ok) setMapDefLinkColor (c); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setMapLinkStyle") + { + if (parser.checkParCount(1)) + { + s=parser.parString (ok,0); + if (ok) setMapLinkStyle(s); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setHeading") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + s=parser.parString (ok,0); + if (ok) + setHeading (s); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setHideExport") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (selection.type()!=Selection::Branch && selection.type() != Selection::MapCenter &&selection.type()!=Selection::FloatImage) + { + parser.setError (Aborted,"Type of selection is not a branch or floatimage"); + } else if (parser.checkParCount(1)) + { + b=parser.parBool(ok,0); + if (ok) setHideExport (b); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setIncludeImagesHorizontally") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + b=parser.parBool(ok,0); + if (ok) setIncludeImagesHor(b); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setIncludeImagesVertically") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + b=parser.parBool(ok,0); + if (ok) setIncludeImagesVer(b); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setHideLinkUnselected") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if ( selection.type()!=Selection::Branch && selection.type()!= Selection::MapCenter && selection.type()!=Selection::FloatImage) + { + parser.setError (Aborted,"Type of selection does not allow hiding the link"); + } else if (parser.checkParCount(1)) + { + b=parser.parBool(ok,0); + if (ok) setHideLinkUnselected(b); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setSelectionColor") + { + if (parser.checkParCount(1)) + { + QColor c=parser.parColor (ok,0); + if (ok) setSelectionColorInt (c); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setURL") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + s=parser.parString (ok,0); + if (ok) setURL(s); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setVymLink") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + s=parser.parString (ok,0); + if (ok) setVymLink(s); + } + } + ///////////////////////////////////////////////////////////////////// + else if (com=="setFlag") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + s=parser.parString(ok,0); + if (ok) + { + selb->activateStandardFlag(s); + selb->updateFlagsToolbar(); + } + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="setFrameType") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + s=parser.parString(ok,0); + if (ok) + setFrameType (s); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="sortChildren") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(0)) + { + sortChildren(); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="toggleFlag") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + s=parser.parString(ok,0); + if (ok) + { + selb->toggleStandardFlag(s); + selb->updateFlagsToolbar(); + } + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="unscroll") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(0)) + { + if (!unscrollBranch (selb)) + parser.setError (Aborted,"Could not unscroll branch"); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="unscrollChildren") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(0)) + { + unscrollChildren (); + } + ///////////////////////////////////////////////////////////////////// + } else if (com=="unsetFlag") + { + if (selection.isEmpty() ) + { + parser.setError (Aborted,"Nothing selected"); + } else if (! selb ) + { + parser.setError (Aborted,"Type of selection is not a branch"); + } else if (parser.checkParCount(1)) + { + s=parser.parString(ok,0); + if (ok) + { + selb->deactivateStandardFlag(s); + selb->updateFlagsToolbar(); + } + } + } else + parser.setError (Aborted,"Unknown command"); + + // Any errors? + if (parser.errorLevel()==NoError) + { + // setChanged(); FIXME should not be called e.g. for export?! + reposition(); + } + else + { + // TODO Error handling + qWarning("VymModel::parseAtom: Error!"); + qWarning(parser.errorMessage()); + } +} + +void VymModel::runScript (QString script) +{ + parser.setScript (script); + parser.runScript(); + while (parser.next() ) + parseAtom(parser.getAtom()); +} + +void VymModel::setExportMode (bool b) +{ + // should be called before and after exports + // depending on the settings + if (b && settings.value("/export/useHideExport","true")=="true") + setHideTmpMode (HideExport); + else + setHideTmpMode (HideNone); +} + +void VymModel::exportImage(QString fname, bool askName, QString format) +{ + if (fname=="") + { + fname=getMapName()+".png"; + format="PNG"; + } + + if (askName) + { + QStringList fl; + QFileDialog *fd=new QFileDialog (NULL); + fd->setCaption (tr("Export map as image")); + fd->setDirectory (lastImageDir); + fd->setFileMode(QFileDialog::AnyFile); + fd->setFilters (imageIO.getFilters() ); + if (fd->exec()) + { + fl=fd->selectedFiles(); + fname=fl.first(); + format=imageIO.getType(fd->selectedFilter()); + } + } + + setExportMode (true); + QPixmap pix (getPixmap()); + pix.save(fname, format); + setExportMode (false); +} + + +void VymModel::exportXML(QString dir, bool askForName) +{ + if (askForName) + { + dir=browseDirectory(NULL,tr("Export XML to directory")); + if (dir =="" && !reallyWriteDirectory(dir) ) + return; + } + + // Hide stuff during export, if settings want this + setExportMode (true); + + // Create subdirectories + makeSubDirs (dir); + + // write to directory + QString saveFile=saveToDir (dir,mapName+"-",true,getTotalBBox().topLeft() ,NULL); + QFile file; + + file.setName ( dir + "/"+mapName+".xml"); + if ( !file.open( QIODevice::WriteOnly ) ) + { + // This should neverever happen + QMessageBox::critical (0,tr("Critical Export Error"),tr("VymModel::exportXML couldn't open %1").arg(file.name())); + return; + } + + // Write it finally, and write in UTF8, no matter what + QTextStream ts( &file ); + ts.setEncoding (QTextStream::UnicodeUTF8); + ts << saveFile; + file.close(); + + // Now write image, too + exportImage (dir+"/images/"+mapName+".png",false,"PNG"); + + setExportMode (false); +} + +void VymModel::exportASCII(QString fname,bool askName) +{ + ExportASCII ex; + ex.setModel (this); + if (fname=="") + ex.setFile (mapName+".txt"); + else + ex.setFile (fname); + + if (askName) + { + //ex.addFilter ("TXT (*.txt)"); + ex.setDir(lastImageDir); + //ex.setCaption(vymName+ " -" +tr("Export as ASCII")+" "+tr("(still experimental)")); + ex.execDialog() ; + } + if (!ex.canceled()) + { + setExportMode(true); + ex.doExport(); + setExportMode(false); + } +} + +void VymModel::exportXHTML (const QString &dir, bool askForName) +{ + ExportXHTMLDialog dia(NULL); + dia.setFilePath (filePath ); + dia.setMapName (mapName ); + dia.readSettings(); + if (dir!="") dia.setDir (dir); + + bool ok=true; + + if (askForName) + { + if (dia.exec()!=QDialog::Accepted) + ok=false; + else + { + QDir d (dia.getDir()); + // Check, if warnings should be used before overwriting + // the output directory + if (d.exists() && d.count()>0) + { + WarningDialog warn; + warn.showCancelButton (true); + warn.setText(QString( + "The directory %1 is not empty.\n" + "Do you risk to overwrite some of its contents?").arg(d.path() )); + warn.setCaption("Warning: Directory not empty"); + warn.setShowAgainName("mainwindow/overwrite-dir-xhtml"); + + if (warn.exec()!=QDialog::Accepted) ok=false; + } + } + } + + if (ok) + { + exportXML (dia.getDir(),false ); + dia.doExport(mapName ); + //if (dia.hasChanged()) setChanged(); + } +} + +void VymModel::exportOOPresentation(const QString &fn, const QString &cf) +{ + ExportOO ex; + ex.setFile (fn); + ex.setModel (this); + if (ex.setConfigFile(cf)) + { + setExportMode (true); + ex.exportPresentation(); + setExportMode (false); + } +} + + + ////////////////////////////////////////////// // View related ////////////////////////////////////////////// +void VymModel::registerEditor(QWidget *) +{ +} + +void VymModel::unregisterEditor(QWidget *) +{ +} + +void VymModel::updateNoteFlag() +{ + setChanged(); + BranchObj *bo=selection.getBranch(); + if (bo) + { + bo->updateNoteFlag(); + mainWindow->updateActions(); + } +} + void VymModel::updateRelPositions() { for (int i=0; i<mapCenters.count(); i++) @@ -284,6 +3766,261 @@ } } +QPixmap VymModel::getPixmap() +{ + QRectF mapRect=getTotalBBox(); + QPixmap pix((int)mapRect.width()+2,(int)mapRect.height()+1); + QPainter pp (&pix); + + pp.setRenderHints(mapEditor->renderHints()); + + // Don't print the visualisation of selection + selection.unselect(); + + mapScene->render ( &pp, + QRectF(0,0,mapRect.width()+2,mapRect.height()+2), + QRectF(mapRect.x(),mapRect.y(),mapRect.width(),mapRect.height() )); + + // Restore selection + selection.reselect(); + + return pix; +} + + +void VymModel::setMapLinkStyle (const QString & s) +{ + QString snow; + if (linkstyle==LinkableMapObj::Line) + snow="StyleLine"; + else if (linkstyle==LinkableMapObj::Parabel) + snow="StyleParabel"; + else if (linkstyle==LinkableMapObj::PolyLine) + snow="StylePolyLine"; + else if (linkstyle==LinkableMapObj::PolyParabel) + snow="StyleParabel"; + + saveState ( + QString("setMapLinkStyle (\"%1\")").arg(s), + QString("setMapLinkStyle (\"%1\")").arg(snow), + QString("Set map link style (\"%1\")").arg(s) + ); + + if (s=="StyleLine") + linkstyle=LinkableMapObj::Line; + else if (s=="StyleParabel") + linkstyle=LinkableMapObj::Parabel; + else if (s=="StylePolyLine") + linkstyle=LinkableMapObj::PolyLine; + else + linkstyle=LinkableMapObj::PolyParabel; + + BranchObj *bo; + bo=first(); + bo=next(bo); + while (bo) + { + bo->setLinkStyle(bo->getDefLinkStyle()); + bo=next(bo); + } + reposition(); +} + +LinkableMapObj::Style VymModel::getMapLinkStyle () +{ + return linkstyle; +} + +void VymModel::setMapDefLinkColor(QColor col) +{ + if ( !col.isValid() ) return; + saveState ( + QString("setMapDefLinkColor (\"%1\")").arg(getMapDefLinkColor().name()), + QString("setMapDefLinkColor (\"%1\")").arg(col.name()), + QString("Set map link color to %1").arg(col.name()) + ); + + defLinkColor=col; + BranchObj *bo; + bo=first(); + while (bo) + { + bo->setLinkColor(); + bo=next(bo); + } + updateActions(); +} + +void VymModel::setMapLinkColorHintInt() +{ + // called from setMapLinkColorHint(lch) or at end of parse + BranchObj *bo; + bo=first(); + while (bo) + { + bo->setLinkColor(); + bo=next(bo); + } +} + +void VymModel::setMapLinkColorHint(LinkableMapObj::ColorHint lch) +{ + linkcolorhint=lch; + setMapLinkColorHintInt(); +} + +void VymModel::toggleMapLinkColorHint() +{ + if (linkcolorhint==LinkableMapObj::HeadingColor) + linkcolorhint=LinkableMapObj::DefaultColor; + else + linkcolorhint=LinkableMapObj::HeadingColor; + BranchObj *bo; + bo=first(); + while (bo) + { + bo->setLinkColor(); + bo=next(bo); + } +} + +void VymModel::selectMapBackgroundImage () +{ + Q3FileDialog *fd=new Q3FileDialog( NULL); + fd->setMode (Q3FileDialog::ExistingFile); + fd->addFilter (QString (tr("Images") + " (*.png *.bmp *.xbm *.jpg *.png *.xpm *.gif *.pnm)")); + ImagePreview *p =new ImagePreview (fd); + fd->setContentsPreviewEnabled( TRUE ); + fd->setContentsPreview( p, p ); + fd->setPreviewMode( Q3FileDialog::Contents ); + fd->setCaption(vymName+" - " +tr("Load background image")); + fd->setDir (lastImageDir); + fd->show(); + + if ( fd->exec() == QDialog::Accepted ) + { + // TODO selectMapBackgroundImg in QT4 use: lastImageDir=fd->directory(); + lastImageDir=QDir (fd->dirPath()); + setMapBackgroundImage (fd->selectedFile()); + } +} + +void VymModel::setMapBackgroundImage (const QString &fn) //FIXME missing savestate +{ + QColor oldcol=mapScene->backgroundBrush().color(); + /* + saveState( + selection, + QString ("setMapBackgroundImage (%1)").arg(oldcol.name()), + selection, + QString ("setMapBackgroundImage (%1)").arg(col.name()), + QString("Set background color of map to %1").arg(col.name())); + */ + QBrush brush; + brush.setTextureImage (QPixmap (fn)); + mapScene->setBackgroundBrush(brush); +} + +void VymModel::selectMapBackgroundColor() +{ + QColor col = QColorDialog::getColor( mapScene->backgroundBrush().color(), NULL); + if ( !col.isValid() ) return; + setMapBackgroundColor( col ); +} + + +void VymModel::setMapBackgroundColor(QColor col) +{ + QColor oldcol=mapScene->backgroundBrush().color(); + saveState( + QString ("setMapBackgroundColor (\"%1\")").arg(oldcol.name()), + QString ("setMapBackgroundColor (\"%1\")").arg(col.name()), + QString("Set background color of map to %1").arg(col.name())); + mapScene->setBackgroundBrush(col); +} + +QColor VymModel::getMapBackgroundColor() +{ + return mapScene->backgroundBrush().color(); +} + + +LinkableMapObj::ColorHint VymModel::getMapLinkColorHint() +{ + return linkcolorhint; +} + +QColor VymModel::getMapDefLinkColor() +{ + return defLinkColor; +} + +void VymModel::setMapDefXLinkColor(QColor col) +{ + defXLinkColor=col; +} + +QColor VymModel::getMapDefXLinkColor() +{ + return defXLinkColor; +} + +void VymModel::setMapDefXLinkWidth (int w) +{ + defXLinkWidth=w; +} + +int VymModel::getMapDefXLinkWidth() +{ + return defXLinkWidth; +} + +void VymModel::move(const double &x, const double &y) +{ + LinkableMapObj *sel=selection.single(); + if (sel) + { + QPointF ap(sel->getAbsPos()); + QPointF to(x, y); + if (ap != to) + { + QString ps=qpointfToString(ap); + QString s=selection.getSelectString(); + saveState( + s, "move "+ps, + s, "move "+qpointfToString(to), + QString("Move %1 to %2").arg(getObjectName(sel)).arg(ps)); + sel->move(x,y); + reposition(); + selection.update(); + } + } +} + +void VymModel::moveRel (const double &x, const double &y) +{ + LinkableMapObj *sel=selection.single(); + if (sel) + { + QPointF rp(sel->getRelPos()); + QPointF to(x, y); + if (rp != to) + { + QString ps=qpointfToString (sel->getRelPos()); + QString s=getSelectString(sel); + saveState( + s, "moveRel "+ps, + s, "moveRel "+qpointfToString(to), + QString("Move %1 to relative position %2").arg(getObjectName(sel)).arg(ps)); + ((OrnamentedObj*)sel)->move2RelPos (x,y); + reposition(); + sel->updateLink(); + selection.update(); + } + } +} + + void VymModel::animate() { animationTimer->stop(); @@ -294,7 +4031,11 @@ bo=(BranchObj*)animObjList.at(i); if (!bo->animate()) { - if (i>=0) animObjList.removeAt(i); + if (i>=0) + { + animObjList.removeAt(i); + i--; + } } bo->reposition(); i++; @@ -322,26 +4063,640 @@ } } +void VymModel::sendSelection() +{ + if (netstate!=Server) return; + sendData (QString("select (\"%1\")").arg(selection.getSelectString()) ); +} + +void VymModel::newServer() +{ + port=54321; + sendCounter=0; + tcpServer = new QTcpServer(this); + if (!tcpServer->listen(QHostAddress::Any,port)) { + QMessageBox::critical(NULL, "vym server", + QString("Unable to start the server: %1.").arg(tcpServer->errorString())); + //FIXME needed? we are no widget any longer... close(); + return; + } + connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newClient())); + netstate=Server; + cout<<"Server is running on port "<<tcpServer->serverPort()<<endl; +} + +void VymModel::connectToServer() +{ + port=54321; + server="salam.suse.de"; + server="localhost"; + clientSocket = new QTcpSocket (this); + clientSocket->abort(); + clientSocket->connectToHost(server ,port); + connect(clientSocket, SIGNAL(readyRead()), this, SLOT(readData())); + connect(clientSocket, SIGNAL(error(QAbstractSocket::SocketError)), + this, SLOT(displayNetworkError(QAbstractSocket::SocketError))); + netstate=Client; + cout<<"connected to "<<qPrintable (server)<<" port "<<port<<endl; + + +} + +void VymModel::newClient() +{ + QTcpSocket *newClient = tcpServer->nextPendingConnection(); + connect(newClient, SIGNAL(disconnected()), + newClient, SLOT(deleteLater())); + + cout <<"ME::newClient at "<<qPrintable( newClient->peerAddress().toString() )<<endl; + + clientList.append (newClient); +} + + +void VymModel::sendData(const QString &s) +{ + if (clientList.size()==0) return; + + // Create bytearray to send + QByteArray block; + QDataStream out(&block, QIODevice::WriteOnly); + out.setVersion(QDataStream::Qt_4_0); + + // Reserve some space for blocksize + out << (quint16)0; + + // Write sendCounter + out << sendCounter++; + + // Write data + out << s; + + // Go back and write blocksize so far + out.device()->seek(0); + quint16 bs=(quint16)(block.size() - 2*sizeof(quint16)); + out << bs; + + if (debug) + cout << "ME::sendData bs="<<bs<<" counter="<<sendCounter<<" s="<<qPrintable(s)<<endl; + + for (int i=0; i<clientList.size(); ++i) + { + //cout << "Sending \""<<qPrintable (s)<<"\" to "<<qPrintable (clientList.at(i)->peerAddress().toString())<<endl; + clientList.at(i)->write (block); + } +} + +void VymModel::readData () +{ + while (clientSocket->bytesAvailable() >=(int)sizeof(quint16) ) + { + if (debug) + cout <<"readData bytesAvail="<<clientSocket->bytesAvailable(); + quint16 recCounter; + quint16 blockSize; + + QDataStream in(clientSocket); + in.setVersion(QDataStream::Qt_4_0); + + in >> blockSize; + in >> recCounter; + + QString t; + in >>t; + if (debug) + cout << " t="<<qPrintable (t)<<endl; + parseAtom (t); + } + return; +} + +void VymModel::displayNetworkError(QAbstractSocket::SocketError socketError) +{ + switch (socketError) { + case QAbstractSocket::RemoteHostClosedError: + break; + case QAbstractSocket::HostNotFoundError: + QMessageBox::information(NULL, vymName +" Network client", + "The host was not found. Please check the " + "host name and port settings."); + break; + case QAbstractSocket::ConnectionRefusedError: + QMessageBox::information(NULL, vymName + " Network client", + "The connection was refused by the peer. " + "Make sure the fortune server is running, " + "and check that the host name and port " + "settings are correct."); + break; + default: + QMessageBox::information(NULL, vymName + " Network client", + QString("The following error occurred: %1.") + .arg(clientSocket->errorString())); + } +} + + + + +void VymModel::selectMapSelectionColor() +{ + QColor col = QColorDialog::getColor( defLinkColor, NULL); + setSelectionColor (col); +} + +void VymModel::setSelectionColorInt (QColor col) +{ + if ( !col.isValid() ) return; + saveState ( + QString("setSelectionColor (%1)").arg(selection.getColor().name()), + QString("setSelectionColor (%1)").arg(col.name()), + QString("Set color of selection box to %1").arg(col.name()) + ); + + selection.setColor (col); +} + +void VymModel::updateSelection() +{ + selection.update(); +} + +void VymModel::setSelectionColor(QColor col) +{ + if ( !col.isValid() ) return; + saveState ( + QString("setSelectionColor (%1)").arg(selection.getColor().name()), + QString("setSelectionColor (%1)").arg(col.name()), + QString("Set color of selection box to %1").arg(col.name()) + ); + setSelectionColorInt (col); +} + +QColor VymModel::getSelectionColor() +{ + return selection.getColor(); +} + +void VymModel::setHideTmpMode (HideTmpMode mode) +{ + hidemode=mode; + for (int i=0;i<mapCenters.count(); i++) + mapCenters.at(i)->setHideTmp (mode); + reposition(); + // FIXME needed? scene()->update(); +} + + +QRectF VymModel::getTotalBBox() +{ + QRectF r; + for (int i=0;i<mapCenters.count(); i++) + r=addBBox (mapCenters.at(i)->getTotalBBox(), r); + return r; +} ////////////////////////////////////////////// // Selection related ////////////////////////////////////////////// - -// Only as long as we dont have Model/View yet +void VymModel::setSelectionBlocked (bool b) +{ + if (b) + selection.block(); + else + selection.unblock(); +} + +bool VymModel::isSelectionBlocked() +{ + return selection.isBlocked(); +} + +bool VymModel::select (const QString &s) +{ + if (selection.select(s)) + { + selection.update(); + ensureSelectionVisible(); + sendSelection (); + return true; + } + return false; + +} + +bool VymModel::select (LinkableMapObj *lmo) +{ + if (selection.select(lmo)) + { + selection.update(); + ensureSelectionVisible(); + sendSelection (); + return true; + } + return false; +} + +void VymModel::unselect() +{ + selection.unselect(); +} + +void VymModel::reselect() +{ + selection.reselect(); +} + +void VymModel::ensureSelectionVisible() +{ + LinkableMapObj *lmo=selection.single(); + if (lmo &&mapEditor) mapEditor->ensureVisible (lmo->getBBox() ); + +} + +void VymModel::selectInt (LinkableMapObj *lmo) +{ + if (selection.select(lmo)) + { + selection.update(); + sendSelection (); + } +} + + +void VymModel::selectNextBranchInt() +{ + // Increase number of branch + LinkableMapObj *sel=selection.single(); + if (sel) + { + QString s=selection.getSelectString(); + QString part; + QString typ; + QString num; + + // Where am I? + part=s.section(",",-1); + typ=part.left (3); + num=part.right(part.length() - 3); + + s=s.left (s.length() -num.length()); + + // Go to next lmo + num=QString ("%1").arg(num.toUInt()+1); + + s=s+num; + + // Try to select this one + if (select (s)) return; + + // We have no direct successor, + // try to increase the parental number in order to + // find a successor with same depth + + int d=selection.single()->getDepth(); + int oldDepth=d; + int i; + bool found=false; + bool b; + while (!found && d>0) + { + s=s.section (",",0,d-1); + // replace substring of current depth in s with "1" + part=s.section(",",-1); + typ=part.left (3); + num=part.right(part.length() - 3); + + if (d>1) + { + // increase number of parent + num=QString ("%1").arg(num.toUInt()+1); + s=s.section (",",0,d-2) + ","+ typ+num; + } else + { + // Special case, look at orientation + if (selection.single()->getOrientation()==LinkableMapObj::RightOfCenter) + num=QString ("%1").arg(num.toUInt()+1); + else + num=QString ("%1").arg(num.toUInt()-1); + s=typ+num; + } + + if (select (s)) + // pad to oldDepth, select the first branch for each depth + for (i=d;i<oldDepth;i++) + { + b=select (s); + if (b) + { + if ( selection.getBranch()->countBranches()>0) + s+=",bo:0"; + else + break; + } else + break; + } + + // try to select the freshly built string + found=select(s); + d--; + } + return; + } +} + +void VymModel::selectPrevBranchInt() +{ + // Decrease number of branch + BranchObj *bo=selection.getBranch(); + if (bo) + { + QString s=selection.getSelectString(); + QString part; + QString typ; + QString num; + + // Where am I? + part=s.section(",",-1); + typ=part.left (3); + num=part.right(part.length() - 3); + + s=s.left (s.length() -num.length()); + + int n=num.toInt()-1; + + // Go to next lmo + num=QString ("%1").arg(n); + s=s+num; + + // Try to select this one + if (n>=0 && select (s)) return; + + // We have no direct precessor, + // try to decrease the parental number in order to + // find a precessor with same depth + + int d=selection.single()->getDepth(); + int oldDepth=d; + int i; + bool found=false; + bool b; + while (!found && d>0) + { + s=s.section (",",0,d-1); + // replace substring of current depth in s with "1" + part=s.section(",",-1); + typ=part.left (3); + num=part.right(part.length() - 3); + + if (d>1) + { + // decrease number of parent + num=QString ("%1").arg(num.toInt()-1); + s=s.section (",",0,d-2) + ","+ typ+num; + } else + { + // Special case, look at orientation + if (selection.single()->getOrientation()==LinkableMapObj::RightOfCenter) + num=QString ("%1").arg(num.toInt()-1); + else + num=QString ("%1").arg(num.toInt()+1); + s=typ+num; + } + + if (select(s)) + // pad to oldDepth, select the last branch for each depth + for (i=d;i<oldDepth;i++) + { + b=select (s); + if (b) + if ( selection.getBranch()->countBranches()>0) + s+=",bo:"+ QString ("%1").arg( selection.getBranch()->countBranches()-1 ); + else + break; + else + break; + } + + // try to select the freshly built string + found=select(s); + d--; + } + return; + } +} + +void VymModel::selectUpperBranch() +{ + if (selection.isBlocked() ) return; + + BranchObj *bo=selection.getBranch(); + if (bo && selection.type()==Selection::Branch) + { + if (bo->getOrientation()==LinkableMapObj::RightOfCenter) + selectPrevBranchInt(); + else + if (bo->getDepth()==1) + selectNextBranchInt(); + else + selectPrevBranchInt(); + } +} + +void VymModel::selectLowerBranch() +{ + if (selection.isBlocked() ) return; + + BranchObj *bo=selection.getBranch(); + if (bo && selection.type()==Selection::Branch) + { + if (bo->getOrientation()==LinkableMapObj::RightOfCenter) + selectNextBranchInt(); + else + if (bo->getDepth()==1) + selectPrevBranchInt(); + else + selectNextBranchInt(); + } +} + + +void VymModel::selectLeftBranch() +{ + if (selection.isBlocked() ) return; + + BranchObj* bo; + BranchObj* par; + LinkableMapObj *sel=selection.single(); + if (sel) + { + if (selection.type()== Selection::MapCenter) + { + par=selection.getBranch(); + bo=par->getLastSelectedBranch(); + if (bo) + { + // Workaround for reselecting on left and right side + if (bo->getOrientation()==LinkableMapObj::RightOfCenter) + bo=par->getLastBranch(); + if (bo) + { + bo=par->getLastBranch(); + selection.select(bo); + selection.update(); + ensureSelectionVisible(); + sendSelection(); + } + } + } else + { + par=(BranchObj*)(sel->getParObj()); + if (sel->getOrientation()==LinkableMapObj::RightOfCenter) + { + if (selection.type() == Selection::Branch || + selection.type() == Selection::FloatImage) + { + selection.select(par); + selection.update(); + ensureSelectionVisible(); + sendSelection(); + } + } else + { + if (selection.type() == Selection::Branch ) + { + bo=selection.getBranch()->getLastSelectedBranch(); + if (bo) + { + selection.select(bo); + selection.update(); + ensureSelectionVisible(); + sendSelection(); + } + } + } + } + } +} + +void VymModel::selectRightBranch() +{ + if (selection.isBlocked() ) return; + + BranchObj* bo; + BranchObj* par; + LinkableMapObj *sel=selection.single(); + if (sel) + { + if (selection.type()==Selection::MapCenter) + { + par=selection.getBranch(); + bo=par->getLastSelectedBranch(); + if (bo) + { + // Workaround for reselecting on left and right side + if (bo->getOrientation()==LinkableMapObj::LeftOfCenter) + bo=par->getFirstBranch(); + if (bo) + { + selection.select(bo); + selection.update(); + ensureSelectionVisible(); + sendSelection(); + } + } + } else + { + par=(BranchObj*)(selection.single()->getParObj()); + if (selection.single()->getOrientation()==LinkableMapObj::LeftOfCenter) + { + if (selection.type() == Selection::Branch || + selection.type() == Selection::FloatImage) + { + selection.select(par); + selection.update(); + ensureSelectionVisible(); + sendSelection(); + } + } else + { + if (selection.type() == Selection::Branch) + { + bo=selection.getBranch()->getLastSelectedBranch(); + if (bo) + { + selection.select(bo); + selection.update(); + ensureSelectionVisible(); + sendSelection(); + } + } + } + } + } +} + +void VymModel::selectFirstBranch() +{ + BranchObj *bo1=selection.getBranch(); + BranchObj *bo2; + BranchObj* par; + if (bo1) + { + par=(BranchObj*)(bo1->getParObj()); + if (!par) return; + bo2=par->getFirstBranch(); + if (bo2) { + selection.select(bo2); + selection.update(); + ensureSelectionVisible(); + sendSelection(); + } + } +} + +void VymModel::selectLastBranch() +{ + BranchObj *bo1=selection.getBranch(); + BranchObj *bo2; + BranchObj* par; + if (bo1) + { + par=(BranchObj*)(bo1->getParObj()); + if (!par) return; + bo2=par->getLastBranch(); + if (bo2) + { + selection.select(bo2); + selection.update(); + ensureSelectionVisible(); + sendSelection(); + } + } +} + +Selection::Type VymModel::selectionType() +{ + return selection.type(); +} + LinkableMapObj* VymModel::getSelection() { - return mapEditor->getSelection(); + return selection.single(); } BranchObj* VymModel::getSelectedBranch() { - return mapEditor->getSelectedBranch(); + return selection.getBranch(); } - -bool VymModel::select (const QString &s) +FloatImageObj* VymModel::getSelectedFloatImage() { - return mapEditor->select (s); + return selection.getFloatImage(); +} + +QString VymModel::getSelectString () +{ + return selection.getSelectString(); } QString VymModel::getSelectString (LinkableMapObj *lmo) @@ -368,21 +4723,5 @@ } } return s; - } - -void VymModel::setHideTmp (HideTmpMode mode) -{ - for (int i=0;i<mapCenters.count(); i++) - mapCenters.at(i)->setHideTmp (mode); -} - -QRectF VymModel::getTotalBBox() -{ - QRectF r; - for (int i=0;i<mapCenters.count(); i++) - r=addBBox (mapCenters.at(i)->getTotalBBox(), r); - return r; -} - diff -r 192e1392ba6a -r 12958f987bcf vymmodel.h --- a/vymmodel.h Wed Jul 16 10:44:44 2008 +0000 +++ b/vymmodel.h Wed Jul 16 10:46:14 2008 +0000 @@ -2,60 +2,456 @@ #define VYMMODEL_H #include <QGraphicsScene> +#include <QtNetwork> +#include "file.h" #include "mapcenterobj.h" #include "mapeditor.h" +#include "parser.h" +#include "selection.h" +#include "xmlobj.h" /*! \brief This will later be divided into Model/View */ -class VymModel : public QObject{ +class VymModel : public QObject, public XMLObj { Q_OBJECT +//////////////////////////////////////////// +// General housekeeping +//////////////////////////////////////////// +private: + QGraphicsScene *mapScene; + QList <MapCenterObj*> mapCenters; + QString version; //!< version string saved in vym file + QString author; + QString comment; + QDate date; + public: VymModel(); ~VymModel (); void clear(); void init(); + void makeTmpDirectories(); //!< create temporary directories e.g. for history + void setMapEditor(MapEditor *me); // FIXME should not be necessary in Model/View - MapEditor* getMapEditor(); + MapEditor* getMapEditor(); // FIXME not necessary + + bool isRepositionBlocked(); //!< While load or undo there is no need to update graphicsview + + void updateActions(); //!< Update buttons in mainwindow + + +//////////////////////////////////////////// +// Load/save +//////////////////////////////////////////// +private: + + bool zipped; // should map be zipped + static int mapNum; // unique number for model used in save/undo + FileType fileType; // type of file, e.g. vym, freemind... + QString fileName; // short name of file (for tab) + QString filePath; // path to file which will be saved + QString fileDir; // dir where file is saved + QString destPath; // path to .vym file (needed for vymlinks) + QString mapName; // fileName without ".vym" + + QString tmpMapDir; // tmp directory with undo history + + QTimer *autosaveTimer; + QTimer *fileChangedTimer; + QDateTime fileChangedTime; + +public: + /*! This function saves all information of the map to disc. + saveToDir also calls the functions for all BranchObj and other objects in the map. + The structure of the map itself is returned as QString and passed back to Main, + where saveToDir is called initially + */ + QString saveToDir (const QString &tmpdir, const QString &prefix, bool writeflags, const QPointF &offset, LinkableMapObj *saveSel); + + /*! \brief Sets filepath, filename and mapname + + If the filepath is "/home/tux/map.xml", then the filename will be set + to map.xml. The destname is needed for vymLinks, pointing to another map. + The destname holds the real name of the file, after it has been compressed, e.g. "map.vym" + */ + + + /*! \brief Set File path + + The destname is needed to construct the references between maps + */ + void setFilePath (QString filepath,QString destname); + void setFilePath (QString); //!< Overloaded for convenience + QString getFilePath (); //!< Full path e.g. "/home/tux/map.xml" + QString getFileName (); //!< e.g. "map.xml" + QString getMapName (); //!< e.g. "map" + QString getDestPath (); //!< e.g. "/home/tux/map.vym" + + /*! \brief Load map + + The data is read from file. Depending on LoadMode the current + selection gets replaced by data or the data is appended. + */ + ErrorCode load (QString, const LoadMode &, const FileType& ); // newmap, import/replace selection + +public: + /*! \brief Save the map to file */ + ErrorCode save(const SaveMode &); + +private: + void addMapReplaceInt(const QString & undoSel, const QString & path); + void addMapInsertInt (const QString & path, int pos); + + FloatImageObj* loadFloatImageInt (QString); + void saveFloatImageInt (FloatImageObj*, const QString &, const QString &); +public: + void loadFloatImage (); + void saveFloatImage (); + +private: + void importDirInt(BranchObj *,QDir); + void importDirInt(const QString&); +public: + void importDir(); + +private slots: + void autosave (); + void fileChanged(); + +//////////////////////////////////////////// +// history (undo/redo) +//////////////////////////////////////////// +private: + bool mapDefault; //!< Flag if map is untouched + bool mapChanged; //!< Flag if undo is possible + bool mapUnsaved; //!< Flag if map should be saved + + QString histPath; //!< Path to history file + SimpleSettings undoSet; //!< undo/redo commands, saved in histPath + int stepsTotal; //!< total number of steps (undos+redos) + int curStep; //!< Current step in history (ring buffer) + int curClipboard; //!< number of history step, which is the current clipboard + int redosAvail; //!< Available number of redo steps + int undosAvail; //!< Available number of undo steps + bool blockReposition; //!< block while load or undo + bool blockSaveState; //!< block while load or undo +public: + bool isDefault(); //!< true, if map is still the empty default map + void makeDefault(); //!< Reset changelog, declare this as default map + bool hasChanged() ; //!< true, if something has changed and is not saved yet + void setChanged(); //!< called from TextEditor via LinkableMapObj + + /*! \brief Get name of object + + Returns heading of a branch or name of an object for use in comment + of undo/redo history + */ + QString getObjectName(const LinkableMapObj*); + + void redo(); //!< Redo last action + bool isRedoAvailable(); //!< True, if redo is available + void undo(); //!< Undo last action + bool isUndoAvailable(); //!< True, if undo is available + void gotoHistoryStep (int); //!< Goto a specifig step in history + + + QString getHistoryPath(); //!< Path to directory containing the history + + /*! \brief Save the current changes in map + + Two commands and selections are saved: + + - undocommand and undoselection to undo the change + - redocommand and redoselection to redo the action after an undo + + Additionally a comment is logged. + + */ + void saveState( + const SaveMode& savemode, + const QString &undoSelection, + const QString &undoCommand, + const QString &redoSelection, + const QString &redoCommand, + const QString &comment, + LinkableMapObj *saveSelection); + /*! Overloaded for convenience */ + void saveStateChangingPart( + LinkableMapObj *undoSelection, + LinkableMapObj* redoSelection, + const QString &redoCommand, + const QString &comment); + /*! Overloaded for convenience */ + void saveStateRemovingPart( + LinkableMapObj *redoSelection, + const QString &comment); + /*! Overloaded for convenience */ + void saveState( + LinkableMapObj *undoSelection, + const QString &undoCommand, + LinkableMapObj *redoSelection, + const QString &redoCommand, + const QString &comment); + /*! Overloaded for convenience */ + void saveState( + const QString &undoSelection, + const QString &undoCommand, + const QString &redoSelection, + const QString &redoCommand, + const QString &comment) ; + void saveState( + const QString &undoCommand, + const QString &redoCommand, + const QString &comment) ; + + +//////////////////////////////////////////// +// unsorted so far +//////////////////////////////////////////// +public: + void setScene(QGraphicsScene *s); + QGraphicsScene *getScene(); + + BranchObj* first(); + BranchObj* next(BranchObj *bo); + + LinkableMapObj* findMapObj(QPointF,LinkableMapObj*); // find MapObj + LinkableMapObj* findObjBySelect (const QString &s); // find MapObj by select string + LinkableMapObj* findID (const QString &s); // find MapObj by previously set ID + + void removeSelection (); // remove selected object + + QString saveToDir (const QString&,const QString&,int, const QPointF&);// Save data recursivly to tempdir + + +//////////////////////////////////////////// +// Interface +//////////////////////////////////////////// +public: void setVersion(const QString &); void setAuthor (const QString &); QString getAuthor (); void setComment (const QString &); QString getComment (); QString getDate(); - void setScene(QGraphicsScene *s); - QGraphicsScene *getScene(); + +public: + void setHeading(const QString &); //!< Set heading of branch + QString getHeading (bool &ok,QPoint &p); //!< Get heading, ok if selection is branch +private: + void setHeadingInt(const QString &); + +private: + BranchObj* itFind; // next object in find process + bool EOFind; // true, if search failed +public: + BranchObj* findText(QString,bool); // Find object + void findReset(); // Reset Search + + void setURL(const QString &url); + QString getURL(); // returns URL of selection or "" + QStringList getURLs(); // returns URLs of subtree + + void linkFloatImageTo(const QString &); + + void setFrameType(const FrameObj::FrameType &); + void setFrameType(const QString &); + void setFramePenColor (const QColor &); + void setFrameBrushColor (const QColor &); + void setFramePadding (const int &); + void setFrameBorderWidth (const int &); + void setIncludeImagesVer(bool); + void setIncludeImagesHor(bool); + void setHideLinkUnselected (bool); + + /*! Should object be hidden in exports (clouded)? */ + void setHideExport(bool); + + /*! Should object be hidden in exports (clouded)? */ + void toggleHideExport(); + + void copy(); //!< Copy to clipboard +private: + void pasteNoSave(const int &n); //!< paste clipboard to branch +public: + void paste(); //!< Paste clipboard to branch and backup + void cut(); //!< Cut to clipboard (and copy) + + void moveBranchUp(); //!< Move branch up + void moveBranchDown(); //!< Move branch down + void sortChildren(); //!< Sort children lexically + + /*! \brief Add new mapcenter + + Disclaimer: Still experimental, not fully supported yet. + */ MapCenterObj* addMapCenter(); +private: MapCenterObj* addMapCenter(QPointF absPos); +public: MapCenterObj* removeMapCenter(MapCenterObj *mco); - BranchObj* first(); // FIXME replaced by ModelIndex later - BranchObj* next(BranchObj *bo); // FIXME replaced by ModelIndex later + /*! \brief Add new branch - LinkableMapObj* findMapObj(QPointF,LinkableMapObj*); // find MapObj - LinkableMapObj* findObjBySelect (const QString &s); // find MapObj by select string - LinkableMapObj* findID (const QString &s); // find MapObj by previously set ID - QString saveToDir (const QString&,const QString&,int, const QPointF&);// Save data recursivly to tempdir + Depending on num the new branch is created + -3 above selection as child of selections parent + -2 as child of selection + -1 below selection as child of selections parent + 0..n insert at a specific position in selections parent + (needed for free relinking) + */ +private: + BranchObj* addNewBranchInt(int); // pos allows to add above/below selection +public: + /*! \Add new branch + + Depending on num the new branch is created + -1 above selection + 0 as child of selection + 1 below selection + */ + BranchObj* addNewBranch(int pos); + BranchObj* addNewBranchBefore(); //!< Insert branch between selection and its parent + void deleteSelection(); //!< Delete selection + void deleteKeepChildren(); //!< remove branch, but keep children + void deleteChildren(); //!< keep branch, but remove children -////////////////////////////////////////// View related - // void updateLink(); FIXME needed? +private: + bool scrollBranch(BranchObj*); + bool unscrollBranch(BranchObj*); +public: + void toggleScroll(); + void unscrollChildren(); + + void addFloatImage(const QPixmap &img); + + void colorBranch(QColor); + void colorSubtree(QColor); + QColor getCurrentHeadingColor(); + + + void editURL(); // edit URL + void editLocalURL(); // edit URL to local file + void editHeading2URL(); // copy heading to URL + void editBugzilla2URL(); // create URL to Bugzilla + void editFATE2URL(); // create URL to FATE + void editVymLink(); // edit link to another map + void setVymLink (const QString &); // Set vymLink for selection + void deleteVymLink(); // delete link to another map + QString getVymLink(); // return path to map + QStringList getVymLinks(); // return paths in subtree + void followXLink (int); + void editXLink (int); + + + + +//////////////////////////////////////////// +// Scripting +//////////////////////////////////////////// +public: + + /* \brief Process one command and its parameters */ + void parseAtom (const QString &atom); + + /* \brief Runs the script */ + void runScript (QString script); + +private: + Parser parser; + +//////////////////////////////////////////// +// Exports +//////////////////////////////////////////// +private: + HideTmpMode hidemode; // true while exporting to hide some stuff + +public: + /*! Set or unset temporary hiding of objects during export */ + void setExportMode (bool); + + /*! Save as image */ + void exportImage (QString fname="",bool askForName=true,QString format="PNG"); + + + /*! Export as XTML to directory */ + void exportXML(QString dir="", bool askForName=true); + + /*! Export as ASCII text to file */ + void exportASCII (QString fname="",bool askForName=true); + + /*! Export as XHTML to directory */ + void exportXHTML(const QString& dir="", bool askForName=true); + + /*! Export as OpenOfficeOrg presentation */ + void exportOOPresentation(const QString &,const QString &); + + +//////////////////////////////////////////// +// View related +//////////////////////////////////////////// +public: + void registerEditor (QWidget *); + void unregisterEditor (QWidget *); + void updateNoteFlag(); //!< Signal origination in TextEditor void updateRelPositions(); QRectF getTotalBBox(); void reposition(); //!< Call reposition for all MCOs - void setHideTmp (HideTmpMode mode); + void setHideTmpMode (HideTmpMode mode); + QPolygonF shape(BranchObj *bo); //!< Returns arbitrary shape of subtree void moveAway (LinkableMapObj *lmo);//!< Autolayout: Move all out of the way - // Animation **experimental** -private slots: - void animate(); //!< Called by timer to animate stuff + //void ensureSelectionVisible(); //!< Show selection in all views + +private: + MapEditor *mapEditor; + + QColor defLinkColor; // default color for links + QColor defXLinkColor; // default color for xlinks + int defXLinkWidth; // default width for xlinks + LinkableMapObj::ColorHint linkcolorhint;// use heading color or own color + LinkableMapObj::Style linkstyle; // default style for links + +private: + QPixmap getPixmap(); + public: - void startAnimation(const QPointF &start, const QPointF &dest); + void setMapLinkStyle (const QString &); // Set style of link + LinkableMapObj::Style getMapLinkStyle (); // requested in LMO + void setMapDefLinkColor(QColor); // default color of links + void setMapLinkColorHintInt(); // color of links + void setMapLinkColorHint(LinkableMapObj::ColorHint);// color of links + void toggleMapLinkColorHint(); // after changing linkStyles + void selectMapBackgroundImage(); + void setMapBackgroundImage(const QString &); + void selectMapBackgroundColor(); + void setMapBackgroundColor(QColor); + QColor getMapBackgroundColor(); + + + LinkableMapObj::ColorHint getMapLinkColorHint(); + QColor getMapDefLinkColor(); + void setMapDefXLinkColor(QColor); + QColor getMapDefXLinkColor(); + void setMapDefXLinkWidth (int); + int getMapDefXLinkWidth(); + + /*! Move absolutly to (x,y). */ + void move (const double &x, const double &y); + + /*! Move relativly to (x,y). */ + void moveRel (const double &x, const double &y); + +//////////////////////////////////////////// +// Animation **experimental** +//////////////////////////////////////////// private: QTimer *animationTimer; bool animationUse; @@ -64,22 +460,102 @@ int timerId; // animation timer QList <MapObj*> animObjList;// list with animated objects -////////////////////////////////////////// Selection related +private slots: + void animate(); //!< Called by timer to animate stuff public: + void startAnimation(const QPointF &start, const QPointF &dest); +//////////////////////////////////////////// +// Network related +//////////////////////////////////////////// +public: + /*! \brief Networking states + + In Network modus we want to switch of saveState, autosave, ... + */ + enum NetState { + Offline, //!< Offline + Client, //!< I am the client and connected to server + Server //!< I am the server + }; + +private: + // Network connections **Experimental** + NetState netstate; // offline, client, server + QTcpServer *tcpServer; // Act as server in conference mode (experimental) + QList <QTcpSocket*> clientList; // List of connected clients + quint16 sendCounter; // Increased with every sent command + + QTcpSocket *clientSocket; // socket of this client + QString server; // server address of this client + int port; // server port of this client + + + +protected: + void sendSelection(); + +public: + void newServer(); + void connectToServer(); + +private slots: + void newClient(); + void sendData(const QString &s); + void readData(); + void displayNetworkError (QAbstractSocket::SocketError); + +private: + void displayClientError(QAbstractSocket::SocketError socketError); + + +//////////////////////////////////////////// +// Selection related +//////////////////////////////////////////// +private: + Selection selection; + QString latestSelectionString; // select string of latest added object + +public: + void setSelectionBlocked(bool); + bool isSelectionBlocked(); + + bool select(const QString &); // Select by string + bool select(LinkableMapObj *lmo); // Select by pointer + void unselect(); + void reselect(); + + void ensureSelectionVisible(); //!< Show selection in all views + + void selectInt(LinkableMapObj*); + +private: + void selectNextBranchInt(); // Increment number of branch + void selectPrevBranchInt(); // Decrement number of branch +public: + void selectUpperBranch(); + void selectLowerBranch(); + void selectLeftBranch(); + void selectRightBranch(); + void selectFirstBranch(); + void selectLastBranch(); + +public: + Selection::Type selectionType(); LinkableMapObj* getSelection(); BranchObj* getSelectedBranch(); - bool select (const QString &s); + FloatImageObj* getSelectedFloatImage(); + QString getSelectString (); QString getSelectString (LinkableMapObj *lmo); + + void updateSelection(); + void selectMapLinkColor(); + void selectMapSelectionColor(); +private: + void setSelectionColorInt(QColor); +public: + void setSelectionColor(QColor); + QColor getSelectionColor(); -private: - QGraphicsScene *mapScene; - MapEditor *mapEditor; - QList <MapCenterObj*> mapCenters; - QString version; //!< version string saved in vym file - QString author; - QString comment; - QDate date; }; - #endif diff -r 192e1392ba6a -r 12958f987bcf xml-vym.cpp --- a/xml-vym.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/xml-vym.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -105,29 +105,29 @@ if (!atts.value( "selectionColor").isEmpty() ) { col.setNamedColor(atts.value("selectionColor")); - model->getMapEditor()->setSelectionColor(col); + model->setSelectionColor(col); } if (!atts.value( "linkColorHint").isEmpty() ) { if (atts.value("linkColorHint")=="HeadingColor") - model->getMapEditor()->setMapLinkColorHint(LinkableMapObj::HeadingColor); + model->setMapLinkColorHint(LinkableMapObj::HeadingColor); else - model->getMapEditor()->setMapLinkColorHint(LinkableMapObj::DefaultColor); + model->setMapLinkColorHint(LinkableMapObj::DefaultColor); } if (!atts.value( "linkStyle").isEmpty() ) - model->getMapEditor()->setMapLinkStyle(atts.value("linkStyle")); + model->setMapLinkStyle(atts.value("linkStyle")); if (!atts.value( "linkColor").isEmpty() ) { col.setNamedColor(atts.value("linkColor")); - model->getMapEditor()->setMapDefLinkColor(col); + model->setMapDefLinkColor(col); } if (!atts.value( "defXLinkColor").isEmpty() ) { col.setNamedColor(atts.value("defXLinkColor")); - model->getMapEditor()->setMapDefXLinkColor(col); + model->setMapDefXLinkColor(col); } if (!atts.value( "defXLinkWidth").isEmpty() ) - model->getMapEditor()->setMapDefXLinkWidth(atts.value("defXLinkWidth").toInt ()); + model->setMapDefXLinkWidth(atts.value("defXLinkWidth").toInt ()); } } else if ( eName == "select" && state == StateMap ) { @@ -150,8 +150,8 @@ // Treat the found mapcenter as a branch // in an existing map LinkableMapObj* lmo=model->getSelection(); - if (lmo && ((typeid(*lmo) == typeid(BranchObj) ) - || typeid(*lmo) == typeid(MapCenterObj) ) ) + if (lmo && (typeid(*lmo) == typeid(BranchObj) ) + || (typeid(*lmo) == typeid(MapCenterObj) ) ) { lastBranch=(BranchObj*)lmo; if (loadMode==ImportAdd) @@ -205,10 +205,10 @@ // selection==lmo==NULL // Treat it like ImportAdd then... loadMode=ImportAdd; - lmo=model->first(); // FIXME this used to be lmo=mc before + lmo=model->first(); } - if (lmo && ((typeid(*lmo) == typeid(BranchObj) ) - || typeid(*lmo) == typeid(MapCenterObj) ) ) + if (lmo && (typeid(*lmo) == typeid(BranchObj) ) + || (typeid(*lmo) == typeid(MapCenterObj) ) ) { lastBranch=(BranchObj*)(lmo); if (eName=="branch") @@ -626,7 +626,7 @@ if (!a.value( "key").isEmpty() ) { if (!a.value( "value").isEmpty() ) - settings.setLocalEntry (model->getMapEditor()->getDestPath(), a.value ("key"), a.value ("value")); + settings.setLocalEntry (model->getDestPath(), a.value ("key"), a.value ("value")); else return false; diff -r 192e1392ba6a -r 12958f987bcf xmlobj.cpp --- a/xmlobj.cpp Wed Jul 16 10:44:44 2008 +0000 +++ b/xmlobj.cpp Wed Jul 16 10:46:14 2008 +0000 @@ -1,6 +1,7 @@ #include "xmlobj.h" #include <QRegExp> +#include <QString> // returns masked "<" ">" "&" diff -r 192e1392ba6a -r 12958f987bcf xmlobj.h --- a/xmlobj.h Wed Jul 16 10:44:44 2008 +0000 +++ b/xmlobj.h Wed Jul 16 10:46:14 2008 +0000 @@ -1,7 +1,7 @@ #ifndef XMLOBJ_H #define XMLOBJ_H -#include <QString> +class QString; QString quotemeta(const QString&);