More work on xLinks
authorinsilmaril
Thu, 03 Sep 2009 08:52:00 +0000
changeset 790133e2ed6b9c5
parent 789 d85834ad8c54
child 791 f1006de05c54
More work on xLinks
branchitem.cpp
branchitem.h
branchobj.cpp
branchobj.h
editxlinkdialog.cpp
editxlinkdialog.h
editxlinkdialog.ui
floatimageobj.cpp
floatimageobj.h
floatobj.cpp
floatobj.h
imageitem.cpp
linkablemapobj.cpp
linkablemapobj.h
mainwindow.cpp
mainwindow.h
mapeditor.cpp
mapeditor.h
mapobj.cpp
mapobj.h
ornamentedobj.cpp
ornamentedobj.h
treeitem.cpp
treeitem.h
treemodel.cpp
version.h
vym.pro
vymmodel.cpp
vymmodel.h
xlinkobj.cpp
xlinkobj.h
xml-vym.cpp
     1.1 --- a/branchitem.cpp	Mon Aug 24 14:39:07 2009 +0000
     1.2 +++ b/branchitem.cpp	Thu Sep 03 08:52:00 2009 +0000
     1.3 @@ -1,6 +1,7 @@
     1.4  #include "branchitem.h"
     1.5  #include "branchobj.h"
     1.6  #include "vymmodel.h"
     1.7 +#include "xlinkitem.h"
     1.8  
     1.9  #include <iostream>
    1.10  #include <QDir>
    1.11 @@ -87,15 +88,13 @@
    1.12  	} else
    1.13  		areaAttr="";
    1.14  	
    1.15 -	/*	
    1.16 -	// FIXME-3 Providing an ID for a branch makes export to XHTML easier
    1.17 +	// Provide an ID for a branch makes export to XHTML easier
    1.18  	QString idAttr;
    1.19 -	if (countXLinks()>0)
    1.20 -		idAttr=attribut ("id",model->getSelectString(this)); //TODO directly access model
    1.21 +	if (xlinkCount()>0)
    1.22 +		idAttr=attribut ("id",model->getSelectString(this)); 
    1.23  	else
    1.24  		idAttr="";
    1.25  
    1.26 -	*/
    1.27  	QString elementName;
    1.28  	if (parentItem==rootItem)
    1.29  		elementName="mapcenter";
    1.30 @@ -106,8 +105,8 @@
    1.31  		+getMapAttr()
    1.32  		+getGeneralAttr()
    1.33  		+scrolledAttr 
    1.34 -	//	+areaAttr 
    1.35 -	//	+idAttr 
    1.36 +	//	+areaAttr	// FIXME-2
    1.37 +		+idAttr 
    1.38  		+getIncludeImageAttr() 
    1.39  		);
    1.40      incIndent();
    1.41 @@ -141,13 +140,12 @@
    1.42  		ti=getBranchNum(i);
    1.43  	}	
    1.44  
    1.45 -	/*
    1.46 -	// Save XLinks
    1.47 +	// Save XLinks 
    1.48  	QString ol;	// old link
    1.49  	QString cl;	// current link
    1.50 -	for (int i=0; i<xlink.size(); ++i)
    1.51 +	for (int i=0; i<xlinkCount(); ++i)
    1.52  	{
    1.53 -		cl=xlink.at(i)->saveToDir();
    1.54 +		cl=getXLinkNum(i)->saveToDir();
    1.55  		if (cl!=ol)
    1.56  		{
    1.57  			s+=cl;
    1.58 @@ -157,7 +155,6 @@
    1.59  			qWarning (QString("Ignoring of duplicate xLink in %1").arg(getHeading()));
    1.60  		}
    1.61  	}	
    1.62 -	*/
    1.63  
    1.64      decIndent();
    1.65      s+=endElement   (elementName);
    1.66 @@ -373,7 +370,7 @@
    1.67  	return NULL;
    1.68  }
    1.69  
    1.70 -TreeItem* BranchItem::findID (QString sid)
    1.71 +TreeItem* BranchItem::findID (QString sid)	//FIXME-3 move to TreeItem	//FIXME-4 search images
    1.72  {
    1.73  	// Search branches
    1.74      TreeItem *ti;
    1.75 @@ -388,7 +385,7 @@
    1.76  
    1.77  
    1.78  /*
    1.79 -	// Search float images //FIXME-4
    1.80 +	// Search float images 
    1.81      for (int i=0; i<floatimage.size(); ++i )
    1.82  		if (floatimage.at(i)->inBox(p) && 
    1.83  			(floatimage.at(i) != excludeLMO) && 
    1.84 @@ -417,8 +414,7 @@
    1.85  BranchObj* BranchItem::createMapObj(QGraphicsScene *scene)	// FIXME-4 maybe move this into MapEditor to get rid of scene in VymModel?
    1.86  {
    1.87  	BranchObj *newbo;
    1.88 -	newbo=new BranchObj(scene);
    1.89 -	newbo->setTreeItem (this);
    1.90 +	newbo=new BranchObj(scene,this);
    1.91  	lmo=newbo;
    1.92  
    1.93  	if (parentItem==rootItem)
     2.1 --- a/branchitem.h	Mon Aug 24 14:39:07 2009 +0000
     2.2 +++ b/branchitem.h	Thu Sep 03 08:52:00 2009 +0000
     2.3 @@ -5,8 +5,9 @@
     2.4  
     2.5  
     2.6  class QString;
     2.7 +class QGraphicsScene;
     2.8  class BranchObj;
     2.9 -class QGraphicsScene;
    2.10 +class XLinkItem;
    2.11  
    2.12  class BranchItem:public MapItem
    2.13  {
     3.1 --- a/branchobj.cpp	Mon Aug 24 14:39:07 2009 +0000
     3.2 +++ b/branchobj.cpp	Thu Sep 03 08:52:00 2009 +0000
     3.3 @@ -13,21 +13,16 @@
     3.4  // BranchObj
     3.5  /////////////////////////////////////////////////////////////////
     3.6  
     3.7 -BranchObj::BranchObj () :OrnamentedObj()	// FIXME-3 needed at all?
     3.8 -{
     3.9 -//    cout << "Const BranchObj ()\n";
    3.10 -    setParObj (this);	
    3.11 -    init();
    3.12 -}
    3.13 -
    3.14 -BranchObj::BranchObj (QGraphicsScene* s):OrnamentedObj (s)// FIXME-3 needed at all?
    3.15 +BranchObj::BranchObj (QGraphicsScene* s,TreeItem *ti):OrnamentedObj (s)
    3.16  {
    3.17  //    cout << "Const BranchObj (s)  \n";
    3.18  	parObj=NULL;
    3.19      scene=s;
    3.20 +	treeItem=ti;
    3.21  	init();
    3.22  }
    3.23  
    3.24 +/*
    3.25  BranchObj::BranchObj (QGraphicsScene* s, LinkableMapObj* p):OrnamentedObj (s)// FIXME-3 needed at all?
    3.26  {
    3.27  //    cout << "Const BranchObj (s,p)\n";
    3.28 @@ -41,6 +36,7 @@
    3.29  								(y() - parObj->getChildPos().y() ) ) );
    3.30      init();
    3.31  }
    3.32 +*/
    3.33  
    3.34  BranchObj::~BranchObj ()
    3.35  {
    3.36 @@ -210,8 +206,8 @@
    3.37  		int i;
    3.38  		for (i=0; i<treeItem->imageCount(); ++i)
    3.39  			treeItem->getImageObjNum(i)->setVisibility (v);
    3.40 -		for (i=0; i<xlink.size(); ++i)	
    3.41 -			xlink.at(i)->setVisibility ();	
    3.42 +		for (i=0; i<treeItem->xlinkCount(); ++i)	
    3.43 +			treeItem->getXLinkObjNum(i)->setVisibility ();	
    3.44  
    3.45  		// Only change children, if I am not scrolled
    3.46  		if (! bi->isScrolled() && (bi->depth() < toDepth))
    3.47 @@ -299,9 +295,13 @@
    3.48  	// set the frame
    3.49  	frame->setRect(QRectF(bbox.x(),bbox.y(),bbox.width(),bbox.height() ) );
    3.50  
    3.51 -	// Update links to other branches
    3.52 -	for (int i=0; i<xlink.size(); ++i)
    3.53 -		xlink.at(i)->updateXLink();
    3.54 +	//Update links to other branches
    3.55 +	XLinkObj *xlo;
    3.56 +	for (int i=0; i<treeItem->xlinkCount(); ++i)	
    3.57 +	{
    3.58 +		xlo=treeItem->getXLinkObjNum(i);
    3.59 +		if (xlo) xlo->updateXLink();
    3.60 +	}	
    3.61  }
    3.62  
    3.63  void BranchObj::calcBBoxSize()
    3.64 @@ -472,105 +472,6 @@
    3.65  	updateContentSize();
    3.66  }
    3.67  
    3.68 -
    3.69 -void BranchObj::addXLink (XLinkObj *xlo)
    3.70 -{
    3.71 -	xlink.append (xlo);
    3.72 -	
    3.73 -}
    3.74 -
    3.75 -void BranchObj::removeXLinkRef (XLinkObj *xlo)
    3.76 -{
    3.77 -	xlink.removeAt (xlink.indexOf(xlo));
    3.78 -}
    3.79 -
    3.80 -void BranchObj::deleteXLink(XLinkObj *xlo)
    3.81 -{
    3.82 -	xlo->deactivate();
    3.83 -	if (!xlo->isUsed()) delete (xlo);
    3.84 -}
    3.85 -
    3.86 -void BranchObj::deleteXLinkAt (int i)
    3.87 -{
    3.88 -	XLinkObj *xlo=xlink.at(i);
    3.89 -	xlo->deactivate();
    3.90 -	if (!xlo->isUsed()) delete(xlo);
    3.91 -}
    3.92 -
    3.93 -XLinkObj* BranchObj::XLinkAt (int i)
    3.94 -{
    3.95 -	return xlink.at(i);
    3.96 -}
    3.97 -
    3.98 -BranchObj* BranchObj::XLinkTargetAt (int i)
    3.99 -{
   3.100 -	if (i>=0 && i<xlink.size())
   3.101 -	{
   3.102 -		if (xlink.at(i))
   3.103 -			return xlink.at(i)->otherBranch (this);
   3.104 -	}
   3.105 -	return NULL;
   3.106 -}
   3.107 -
   3.108 - 
   3.109 -// FIXME-3 FloatImageObj* BranchObj::addFloatImage ()
   3.110 -/*
   3.111 -{
   3.112 -	FloatImageObj *newfi=new FloatImageObj (scene,this);
   3.113 -	floatimage.append (newfi);
   3.114 -	if ( ((BranchItem*)treeItem)->hasScrolledParent((BranchItem*)treeItem) )
   3.115 -		newfi->setVisibility (false);
   3.116 -	else	
   3.117 -		newfi->setVisibility(visible);
   3.118 -	//calcBBoxSize();
   3.119 -	//positionBBox();
   3.120 -	requestReposition();
   3.121 -	return newfi;
   3.122 -}
   3.123 -*/
   3.124 -
   3.125 -//FIXME-3 FloatImageObj* BranchObj::addFloatImage (FloatImageObj *fio)
   3.126 -/*
   3.127 -{
   3.128 -	FloatImageObj *newfi=new FloatImageObj (scene,this);
   3.129 -	floatimage.append (newfi);
   3.130 -	newfi->copy (fio);
   3.131 -	if (((BranchItem*)treeItem)->hasScrolledParent((BranchItem*)treeItem) )
   3.132 -		newfi->setVisibility (false);
   3.133 -	else	
   3.134 -		newfi->setVisibility(visible);
   3.135 -	//calcBBoxSize();
   3.136 -	//positionBBox();
   3.137 -	requestReposition();
   3.138 -	return newfi;
   3.139 -}
   3.140 -*/
   3.141 -
   3.142 -/* FIXME-3 FloatImageObj* BranchObj::getFirstFloatImage ()
   3.143 -{
   3.144 -    return floatimage.first();
   3.145 -}
   3.146 -
   3.147 -FloatImageObj* BranchObj::getLastFloatImage ()
   3.148 -{
   3.149 -    return floatimage.last();
   3.150 -}
   3.151 -
   3.152 -FIXME -3 FloatImageObj* BranchObj::getFloatImageNum (const uint &i)
   3.153 -{
   3.154 -    return floatimage.at(i);
   3.155 -}
   3.156 -
   3.157 -void BranchObj::removeFloatImage (FloatImageObj *fio)
   3.158 -{
   3.159 -	int i=floatimage.indexOf (fio);
   3.160 -	if (i>-1) delete (floatimage.takeAt (i));
   3.161 -	calcBBoxSize();
   3.162 -	positionBBox();
   3.163 -	requestReposition();
   3.164 -}
   3.165 -*/
   3.166 -
   3.167  void BranchObj::savePosInAngle ()
   3.168  {
   3.169  	// Save position in angle
     4.1 --- a/branchobj.h	Mon Aug 24 14:39:07 2009 +0000
     4.2 +++ b/branchobj.h	Thu Sep 03 08:52:00 2009 +0000
     4.3 @@ -17,10 +17,7 @@
     4.4  	/*! New branches will get use same color for heading as parent */
     4.5  	enum BranchModification {NewBranch, MovedBranch};
     4.6  
     4.7 -
     4.8 -    BranchObj ();
     4.9 -    BranchObj (QGraphicsScene*);
    4.10 -    BranchObj (QGraphicsScene*, LinkableMapObj* parent);
    4.11 +    BranchObj (QGraphicsScene*,TreeItem *ti=NULL);
    4.12      ~BranchObj ();
    4.13  	bool operator< ( const BranchObj & );
    4.14  	bool operator== ( const BranchObj & );
    4.15 @@ -47,21 +44,6 @@
    4.16      
    4.17      virtual void updateData();	//! Update represantatio of heading, flags, etc.
    4.18  
    4.19 -	virtual void addXLink (XLinkObj*);
    4.20 -	virtual void removeXLinkRef (XLinkObj*);// Remove ref in list
    4.21 -	virtual void deleteXLink (XLinkObj*);	// remove references and delete XLinkObj 
    4.22 -	virtual void deleteXLinkAt (int);		// remove references and delete XLinkObj 
    4.23 -	virtual XLinkObj* XLinkAt (int);		// return reference of XLinkObj 
    4.24 -	virtual BranchObj* XLinkTargetAt (int);
    4.25 -
    4.26 -/* FIXME-3
    4.27 -	virtual FloatImageObj* addFloatImage();
    4.28 -	virtual FloatImageObj* addFloatImage(FloatImageObj*);
    4.29 -	virtual void removeFloatImage(FloatImageObj*);
    4.30 -    virtual FloatImageObj* getFirstFloatImage();
    4.31 -    virtual FloatImageObj* getLastFloatImage();
    4.32 -*/	
    4.33 -//FIXME-3	virtual FloatImageObj* getFloatImageNum(const uint &);
    4.34  protected:	
    4.35  	virtual void savePosInAngle();					// write pos in angle for resorting			
    4.36  public:	
    4.37 @@ -82,7 +64,6 @@
    4.38  	virtual bool animate();
    4.39  
    4.40  protected:
    4.41 -	//FIXME-3 QList<FloatImageObj*> floatimage;// child images
    4.42  	QList<XLinkObj*> xlink;			// xlinks to other branches
    4.43  
    4.44  	AnimPoint anim;
     5.1 --- a/editxlinkdialog.cpp	Mon Aug 24 14:39:07 2009 +0000
     5.2 +++ b/editxlinkdialog.cpp	Thu Sep 03 08:52:00 2009 +0000
     5.3 @@ -3,13 +3,15 @@
     5.4  #include <typeinfo>
     5.5  #include <QColorDialog>
     5.6  
     5.7 +#include "branchitem.h"
     5.8 +
     5.9  EditXLinkDialog::EditXLinkDialog (QWidget *parent):QDialog (parent)
    5.10  {
    5.11  	ui.setupUi (this);
    5.12  
    5.13  	delink=false;
    5.14 -	xlo=false;
    5.15 -	selection=NULL;
    5.16 +	xli=NULL;
    5.17 +	selbi=NULL;
    5.18  
    5.19  	connect ( ui.widthBox, SIGNAL (valueChanged( int)), this, SLOT (widthChanged (int)));
    5.20  	connect ( ui.colorButton, SIGNAL (clicked( )), this, SLOT (colorButtonPressed()));
    5.21 @@ -31,47 +33,43 @@
    5.22  
    5.23  void EditXLinkDialog::widthChanged( int  w)
    5.24  {
    5.25 -	xlo->setWidth(w);
    5.26 +	xli->setWidth(w);
    5.27  }
    5.28  
    5.29 -void EditXLinkDialog::setXLink( XLinkObj * xo)
    5.30 +void EditXLinkDialog::setXLink( XLinkItem * xi)
    5.31  {
    5.32 -	xlo=xo;
    5.33 -	ui.colorButton->setPaletteBackgroundColor (xlo->getColor() );
    5.34 -	ui.widthBox->setValue(xlo->getWidth());
    5.35 +	xli=xi;
    5.36 +	ui.colorButton->setPaletteBackgroundColor (xli->getColor() );
    5.37 +	ui.widthBox->setValue(xli->getWidth());
    5.38  }
    5.39  
    5.40 -void EditXLinkDialog::setSelection(LinkableMapObj *s)
    5.41 +void EditXLinkDialog::setSelection(BranchItem *bi)
    5.42  {
    5.43 -	selection=s;
    5.44 +	selbi=bi;
    5.45  }
    5.46  
    5.47  void EditXLinkDialog::colorButtonPressed()
    5.48  {
    5.49 -	if (xlo)
    5.50 +	if (xli)
    5.51  	{	
    5.52 -		QColor col = QColorDialog::getColor(xlo->getColor(), this );
    5.53 +		QColor col = QColorDialog::getColor(xli->getColor(), this );
    5.54  		if ( !col.isValid() ) return;
    5.55 -		xlo->setColor( col );
    5.56 +		xli->setColor( col );
    5.57  		ui.colorButton->setPaletteBackgroundColor (col);
    5.58  	}
    5.59  }
    5.60  
    5.61 -void EditXLinkDialog::setColorHeadingButtonPressed()	//FIXME-2
    5.62 +void EditXLinkDialog::setColorHeadingButtonPressed()	
    5.63  {
    5.64 -/*
    5.65 -	if (xlo)
    5.66 +	if (xli)
    5.67  	{	
    5.68 -		if (selection && 
    5.69 -			(typid(*selection) == typid(BranchObj) || 
    5.70 -			typid(*selection) == typid(MapCenterObj))  )
    5.71 +		if (selbi)
    5.72  		{
    5.73 -			QColor col=((BranchObj*)(selection))->getColor();
    5.74 -			xlo->setColor(col);
    5.75 +			QColor col=selbi->getHeadingColor();
    5.76 +			xli->setColor(col);
    5.77  			ui.colorButton->setPaletteBackgroundColor (col);
    5.78  		}
    5.79  	}
    5.80 -	*/
    5.81  }
    5.82  
    5.83  bool EditXLinkDialog::useSettingsGlobal ()
     6.1 --- a/editxlinkdialog.h	Mon Aug 24 14:39:07 2009 +0000
     6.2 +++ b/editxlinkdialog.h	Thu Sep 03 08:52:00 2009 +0000
     6.3 @@ -10,13 +10,15 @@
     6.4  where you want to have crossreferences which don't fit on the same visible area
     6.5  */
     6.6  
     6.7 +class BranchItem;
     6.8 +
     6.9  class EditXLinkDialog:public QDialog
    6.10  {
    6.11  	Q_OBJECT
    6.12  public:
    6.13  	EditXLinkDialog (QWidget *parent=0);
    6.14 -	void setXLink (XLinkObj *);
    6.15 -	void setSelection (LinkableMapObj *);
    6.16 +	void setXLink (XLinkItem *);
    6.17 +	void setSelection (BranchItem*);
    6.18  	bool useSettingsGlobal();
    6.19  	bool deleteXLink();
    6.20  
    6.21 @@ -29,8 +31,8 @@
    6.22  private:
    6.23  	Ui::EditXLinkDialog ui;
    6.24  	bool delink;
    6.25 -	XLinkObj *xlo;
    6.26 -	LinkableMapObj *selection;
    6.27 +	XLinkItem *xli;
    6.28 +	BranchItem *selbi;
    6.29  };
    6.30  
    6.31  #endif // EDITXLINKDIALOG_H
     7.1 --- a/editxlinkdialog.ui	Mon Aug 24 14:39:07 2009 +0000
     7.2 +++ b/editxlinkdialog.ui	Thu Sep 03 08:52:00 2009 +0000
     7.3 @@ -1,126 +1,120 @@
     7.4 -<ui version="4.0" >
     7.5 - <author></author>
     7.6 - <comment></comment>
     7.7 - <exportmacro></exportmacro>
     7.8 +<?xml version="1.0" encoding="UTF-8"?>
     7.9 +<ui version="4.0">
    7.10   <class>EditXLinkDialog</class>
    7.11 - <widget class="QDialog" name="EditXLinkDialog" >
    7.12 -  <property name="geometry" >
    7.13 + <widget class="QDialog" name="EditXLinkDialog">
    7.14 +  <property name="geometry">
    7.15     <rect>
    7.16      <x>0</x>
    7.17      <y>0</y>
    7.18 -    <width>393</width>
    7.19 -    <height>206</height>
    7.20 +    <width>383</width>
    7.21 +    <height>167</height>
    7.22     </rect>
    7.23    </property>
    7.24 -  <property name="sizePolicy" >
    7.25 -   <sizepolicy>
    7.26 -    <hsizetype>5</hsizetype>
    7.27 -    <vsizetype>5</vsizetype>
    7.28 +  <property name="sizePolicy">
    7.29 +   <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
    7.30      <horstretch>0</horstretch>
    7.31      <verstretch>0</verstretch>
    7.32     </sizepolicy>
    7.33    </property>
    7.34 -  <property name="windowTitle" >
    7.35 +  <property name="windowTitle">
    7.36     <string>Edit XLink</string>
    7.37    </property>
    7.38 -  <layout class="QVBoxLayout" >
    7.39 -   <property name="margin" >
    7.40 +  <layout class="QVBoxLayout">
    7.41 +   <property name="spacing">
    7.42 +    <number>6</number>
    7.43 +   </property>
    7.44 +   <property name="margin">
    7.45      <number>11</number>
    7.46     </property>
    7.47 -   <property name="spacing" >
    7.48 -    <number>6</number>
    7.49 -   </property>
    7.50     <item>
    7.51 -    <layout class="QGridLayout" >
    7.52 -     <property name="margin" >
    7.53 +    <layout class="QGridLayout">
    7.54 +     <property name="margin">
    7.55        <number>0</number>
    7.56       </property>
    7.57 -     <property name="spacing" >
    7.58 +     <property name="spacing">
    7.59        <number>6</number>
    7.60       </property>
    7.61 -     <item row="0" column="1" >
    7.62 -      <widget class="QSpinBox" name="widthBox" >
    7.63 -       <property name="sizePolicy" >
    7.64 -        <sizepolicy>
    7.65 -         <hsizetype>0</hsizetype>
    7.66 -         <vsizetype>0</vsizetype>
    7.67 +     <item row="0" column="1">
    7.68 +      <widget class="QSpinBox" name="widthBox">
    7.69 +       <property name="sizePolicy">
    7.70 +        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
    7.71           <horstretch>0</horstretch>
    7.72           <verstretch>0</verstretch>
    7.73          </sizepolicy>
    7.74         </property>
    7.75 -       <property name="maximum" >
    7.76 +       <property name="minimum">
    7.77 +        <number>1</number>
    7.78 +       </property>
    7.79 +       <property name="maximum">
    7.80          <number>15</number>
    7.81         </property>
    7.82 -       <property name="minimum" >
    7.83 -        <number>1</number>
    7.84 -       </property>
    7.85        </widget>
    7.86       </item>
    7.87 -     <item row="0" column="0" >
    7.88 -      <widget class="QLabel" name="textLabel1" >
    7.89 -       <property name="text" >
    7.90 +     <item row="0" column="0">
    7.91 +      <widget class="QLabel" name="textLabel1">
    7.92 +       <property name="text">
    7.93          <string>XLink width:</string>
    7.94         </property>
    7.95 -       <property name="alignment" >
    7.96 +       <property name="alignment">
    7.97          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
    7.98         </property>
    7.99        </widget>
   7.100       </item>
   7.101 -     <item row="1" column="4" >
   7.102 -      <widget class="QPushButton" name="setColorHeadingButton" >
   7.103 -       <property name="maximumSize" >
   7.104 +     <item row="1" column="4">
   7.105 +      <widget class="QPushButton" name="setColorHeadingButton">
   7.106 +       <property name="maximumSize">
   7.107          <size>
   7.108           <width>32767</width>
   7.109           <height>20</height>
   7.110          </size>
   7.111         </property>
   7.112 -       <property name="text" >
   7.113 +       <property name="text">
   7.114          <string>Set color of heading</string>
   7.115         </property>
   7.116        </widget>
   7.117       </item>
   7.118 -     <item row="1" column="1" >
   7.119 -      <widget class="QPushButton" name="colorButton" >
   7.120 -       <property name="enabled" >
   7.121 +     <item row="1" column="1">
   7.122 +      <widget class="QPushButton" name="colorButton">
   7.123 +       <property name="enabled">
   7.124          <bool>true</bool>
   7.125         </property>
   7.126 -       <property name="maximumSize" >
   7.127 +       <property name="maximumSize">
   7.128          <size>
   7.129           <width>50</width>
   7.130           <height>20</height>
   7.131          </size>
   7.132         </property>
   7.133 -       <property name="text" >
   7.134 +       <property name="text">
   7.135          <string/>
   7.136         </property>
   7.137        </widget>
   7.138       </item>
   7.139 -     <item row="2" column="1" colspan="2" >
   7.140 -      <widget class="QCheckBox" name="useSettings" >
   7.141 -       <property name="text" >
   7.142 +     <item row="2" column="1" colspan="2">
   7.143 +      <widget class="QCheckBox" name="useSettings">
   7.144 +       <property name="text">
   7.145          <string/>
   7.146         </property>
   7.147        </widget>
   7.148       </item>
   7.149 -     <item row="1" column="0" >
   7.150 -      <widget class="QLabel" name="textLabel2" >
   7.151 -       <property name="text" >
   7.152 +     <item row="1" column="0">
   7.153 +      <widget class="QLabel" name="textLabel2">
   7.154 +       <property name="text">
   7.155          <string>XLink color:</string>
   7.156         </property>
   7.157 -       <property name="alignment" >
   7.158 +       <property name="alignment">
   7.159          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
   7.160         </property>
   7.161        </widget>
   7.162       </item>
   7.163 -     <item row="1" column="2" colspan="2" >
   7.164 +     <item row="1" column="2" colspan="2">
   7.165        <spacer>
   7.166 -       <property name="orientation" >
   7.167 +       <property name="orientation">
   7.168          <enum>Qt::Horizontal</enum>
   7.169         </property>
   7.170 -       <property name="sizeType" >
   7.171 +       <property name="sizeType">
   7.172          <enum>QSizePolicy::Expanding</enum>
   7.173         </property>
   7.174 -       <property name="sizeHint" >
   7.175 +       <property name="sizeHint" stdset="0">
   7.176          <size>
   7.177           <width>285</width>
   7.178           <height>20</height>
   7.179 @@ -128,15 +122,15 @@
   7.180         </property>
   7.181        </spacer>
   7.182       </item>
   7.183 -     <item row="0" column="2" colspan="2" >
   7.184 +     <item row="0" column="2" colspan="2">
   7.185        <spacer>
   7.186 -       <property name="orientation" >
   7.187 +       <property name="orientation">
   7.188          <enum>Qt::Horizontal</enum>
   7.189         </property>
   7.190 -       <property name="sizeType" >
   7.191 +       <property name="sizeType">
   7.192          <enum>QSizePolicy::Expanding</enum>
   7.193         </property>
   7.194 -       <property name="sizeHint" >
   7.195 +       <property name="sizeHint" stdset="0">
   7.196          <size>
   7.197           <width>280</width>
   7.198           <height>20</height>
   7.199 @@ -144,25 +138,25 @@
   7.200         </property>
   7.201        </spacer>
   7.202       </item>
   7.203 -     <item row="2" column="0" >
   7.204 -      <widget class="QLabel" name="textLabel1_2" >
   7.205 -       <property name="text" >
   7.206 +     <item row="2" column="0">
   7.207 +      <widget class="QLabel" name="textLabel1_2">
   7.208 +       <property name="text">
   7.209          <string>Use as default:</string>
   7.210         </property>
   7.211 -       <property name="alignment" >
   7.212 +       <property name="alignment">
   7.213          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
   7.214         </property>
   7.215        </widget>
   7.216       </item>
   7.217 -     <item row="2" column="3" colspan="2" >
   7.218 +     <item row="2" column="3" colspan="2">
   7.219        <spacer>
   7.220 -       <property name="orientation" >
   7.221 +       <property name="orientation">
   7.222          <enum>Qt::Horizontal</enum>
   7.223         </property>
   7.224 -       <property name="sizeType" >
   7.225 +       <property name="sizeType">
   7.226          <enum>QSizePolicy::Expanding</enum>
   7.227         </property>
   7.228 -       <property name="sizeHint" >
   7.229 +       <property name="sizeHint" stdset="0">
   7.230          <size>
   7.231           <width>241</width>
   7.232           <height>20</height>
   7.233 @@ -174,13 +168,13 @@
   7.234     </item>
   7.235     <item>
   7.236      <spacer>
   7.237 -     <property name="orientation" >
   7.238 +     <property name="orientation">
   7.239        <enum>Qt::Vertical</enum>
   7.240       </property>
   7.241 -     <property name="sizeType" >
   7.242 +     <property name="sizeType">
   7.243        <enum>QSizePolicy::Expanding</enum>
   7.244       </property>
   7.245 -     <property name="sizeHint" >
   7.246 +     <property name="sizeHint" stdset="0">
   7.247        <size>
   7.248         <width>20</width>
   7.249         <height>16</height>
   7.250 @@ -189,29 +183,29 @@
   7.251      </spacer>
   7.252     </item>
   7.253     <item>
   7.254 -    <layout class="QHBoxLayout" >
   7.255 -     <property name="margin" >
   7.256 +    <layout class="QHBoxLayout">
   7.257 +     <property name="spacing">
   7.258 +      <number>6</number>
   7.259 +     </property>
   7.260 +     <property name="margin">
   7.261        <number>0</number>
   7.262       </property>
   7.263 -     <property name="spacing" >
   7.264 -      <number>6</number>
   7.265 -     </property>
   7.266       <item>
   7.267 -      <widget class="QPushButton" name="deleteButton" >
   7.268 -       <property name="text" >
   7.269 +      <widget class="QPushButton" name="deleteButton">
   7.270 +       <property name="text">
   7.271          <string>Quit and delete XLink</string>
   7.272         </property>
   7.273        </widget>
   7.274       </item>
   7.275       <item>
   7.276        <spacer>
   7.277 -       <property name="orientation" >
   7.278 +       <property name="orientation">
   7.279          <enum>Qt::Horizontal</enum>
   7.280         </property>
   7.281 -       <property name="sizeType" >
   7.282 +       <property name="sizeType">
   7.283          <enum>QSizePolicy::Expanding</enum>
   7.284         </property>
   7.285 -       <property name="sizeHint" >
   7.286 +       <property name="sizeHint" stdset="0">
   7.287          <size>
   7.288           <width>100</width>
   7.289           <height>20</height>
   7.290 @@ -220,8 +214,8 @@
   7.291        </spacer>
   7.292       </item>
   7.293       <item>
   7.294 -      <widget class="QPushButton" name="okButton" >
   7.295 -       <property name="text" >
   7.296 +      <widget class="QPushButton" name="okButton">
   7.297 +       <property name="text">
   7.298          <string>Ok</string>
   7.299         </property>
   7.300        </widget>
   7.301 @@ -230,11 +224,11 @@
   7.302     </item>
   7.303    </layout>
   7.304   </widget>
   7.305 - <layoutdefault spacing="6" margin="11" />
   7.306 + <layoutdefault spacing="6" margin="11"/>
   7.307   <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
   7.308   <includes>
   7.309 -  <include location="local" >xlinkobj.h</include>
   7.310 -  <include location="local" >linkablemapobj.h</include>
   7.311 +  <include location="local">xlinkitem.h</include>
   7.312 +  <include location="local">linkablemapobj.h</include>
   7.313   </includes>
   7.314   <resources/>
   7.315   <connections>
   7.316 @@ -244,11 +238,11 @@
   7.317     <receiver>EditXLinkDialog</receiver>
   7.318     <slot>accept()</slot>
   7.319     <hints>
   7.320 -    <hint type="sourcelabel" >
   7.321 +    <hint type="sourcelabel">
   7.322       <x>338</x>
   7.323       <y>180</y>
   7.324      </hint>
   7.325 -    <hint type="destinationlabel" >
   7.326 +    <hint type="destinationlabel">
   7.327       <x>196</x>
   7.328       <y>102</y>
   7.329      </hint>
     8.1 --- a/floatimageobj.cpp	Mon Aug 24 14:39:07 2009 +0000
     8.2 +++ b/floatimageobj.cpp	Thu Sep 03 08:52:00 2009 +0000
     8.3 @@ -8,25 +8,29 @@
     8.4  // FloatImageObj
     8.5  /////////////////////////////////////////////////////////////////
     8.6  
     8.7 +/* FIXME-3
     8.8  FloatImageObj::FloatImageObj ():FloatObj()
     8.9  {
    8.10  //    cout << "Const FloatImageObj ()\n";
    8.11      setParObj (this);	
    8.12      init();
    8.13  }
    8.14 +*/
    8.15  
    8.16 -FloatImageObj::FloatImageObj (QGraphicsScene* s):FloatObj(s)
    8.17 +FloatImageObj::FloatImageObj (QGraphicsScene* s,TreeItem *ti):FloatObj(s,ti)
    8.18  {
    8.19 -//   cout << "Const FloatImageObj (s)  called from MapCenterObj (s)\n";
    8.20 +   //cout << "Const FloatImageObj s="<<s<<"  ti="<<ti<<endl;
    8.21      setParObj (this);	
    8.22      init();
    8.23  }
    8.24  
    8.25 +/* FIXME-3 needed
    8.26  FloatImageObj::FloatImageObj (QGraphicsScene *s, OrnamentedObj* p):FloatObj(s,p)
    8.27  {
    8.28   //   cout << "Const FloatImageObj (c,p)\n";
    8.29      init();
    8.30  }
    8.31 +*/
    8.32  
    8.33  FloatImageObj::~FloatImageObj ()
    8.34  {
     9.1 --- a/floatimageobj.h	Mon Aug 24 14:39:07 2009 +0000
     9.2 +++ b/floatimageobj.h	Thu Sep 03 08:52:00 2009 +0000
     9.3 @@ -5,15 +5,16 @@
     9.4  //Added by qt3to4:
     9.5  #include <QPixmap>
     9.6  
     9.7 +class TreeItem;
     9.8  /*! \brief A pixmap which can be positioned freely as FlagObj  on the map.  */
     9.9  
    9.10  
    9.11  /////////////////////////////////////////////////////////////////////////////
    9.12  class FloatImageObj:public FloatObj {
    9.13  public:
    9.14 -    FloatImageObj ();
    9.15 -    FloatImageObj (QGraphicsScene*);
    9.16 -    FloatImageObj (QGraphicsScene*, OrnamentedObj* parent);
    9.17 +    //FIXME-3 FloatImageObj ();
    9.18 +    FloatImageObj (QGraphicsScene*,TreeItem *ti=NULL);
    9.19 +    //FIXME-3 FloatImageObj (QGraphicsScene*, OrnamentedObj* parent);
    9.20      ~FloatImageObj ();
    9.21      virtual void init ();
    9.22      virtual void copy (FloatImageObj*);
    10.1 --- a/floatobj.cpp	Mon Aug 24 14:39:07 2009 +0000
    10.2 +++ b/floatobj.cpp	Thu Sep 03 08:52:00 2009 +0000
    10.3 @@ -1,30 +1,19 @@
    10.4  #include "floatobj.h"
    10.5  
    10.6 +#include <iostream>
    10.7 +using namespace std;
    10.8 +
    10.9  /////////////////////////////////////////////////////////////////
   10.10  // FloatObj
   10.11  /////////////////////////////////////////////////////////////////
   10.12  
   10.13 -FloatObj::FloatObj ():OrnamentedObj() 
   10.14 +FloatObj::FloatObj (QGraphicsScene* s, TreeItem *ti):OrnamentedObj(s,ti)
   10.15  {
   10.16 -//    cout << "Const FloatObj ()\n";
   10.17 +	cout << "Const FloatObj s="<<s<<"  ti="<<ti<<"  treeItem="<<treeItem<<endl;
   10.18      setParObj (this);	
   10.19      init();
   10.20  }
   10.21  
   10.22 -FloatObj::FloatObj (QGraphicsScene* s):OrnamentedObj(s)
   10.23 -{
   10.24 -//	cout << "Const FloatObj (s)  called from MapCenterObj (s)\n";
   10.25 -    setParObj (this);	
   10.26 -    init();
   10.27 -}
   10.28 -
   10.29 -FloatObj::FloatObj (QGraphicsScene* s, LinkableMapObj* p):OrnamentedObj (s)
   10.30 -{
   10.31 -//    cout << "Const FloatObj (s,p)\n";
   10.32 -    setParObj (p);	
   10.33 -    init();
   10.34 -}
   10.35 -
   10.36  FloatObj::~FloatObj ()
   10.37  {
   10.38  //   cout << "Destr FloatObj\n";
    11.1 --- a/floatobj.h	Mon Aug 24 14:39:07 2009 +0000
    11.2 +++ b/floatobj.h	Thu Sep 03 08:52:00 2009 +0000
    11.3 @@ -9,9 +9,7 @@
    11.4  /////////////////////////////////////////////////////////////////////////////
    11.5  class FloatObj:public OrnamentedObj {
    11.6  public:
    11.7 -    FloatObj ();
    11.8 -    FloatObj (QGraphicsScene*);
    11.9 -    FloatObj (QGraphicsScene*, LinkableMapObj* parent);
   11.10 +    FloatObj (QGraphicsScene*,TreeItem *ti=NULL);
   11.11      ~FloatObj ();
   11.12      virtual void init ();
   11.13      virtual void copy (FloatObj*);
    12.1 --- a/imageitem.cpp	Mon Aug 24 14:39:07 2009 +0000
    12.2 +++ b/imageitem.cpp	Thu Sep 03 08:52:00 2009 +0000
    12.3 @@ -52,8 +52,7 @@
    12.4  
    12.5  FloatImageObj* ImageItem::createMapObj(QGraphicsScene *scene)
    12.6  {
    12.7 -	FloatImageObj *fio=new FloatImageObj (scene);
    12.8 -	fio->setTreeItem (this);
    12.9 +	FloatImageObj *fio=new FloatImageObj (scene,this);
   12.10  	lmo=fio;
   12.11  	fio->setParObj ( ((MapItem*)parentItem)->getLMO());
   12.12  	if (((BranchItem*)parentItem)->isScrolled() || !((MapItem*)parentItem)->getLMO()->isVisibleObj() )
   12.13 @@ -61,6 +60,7 @@
   12.14  	initLMO();
   12.15  	fio->setZValue(zValue);
   12.16  	fio->setRelPos (pos);
   12.17 +	cout << "II::createMO   fio="<<fio<<"   tI="<<fio->getTreeItem()<<endl;
   12.18  	return fio;
   12.19  }
   12.20  
    13.1 --- a/linkablemapobj.cpp	Mon Aug 24 14:39:07 2009 +0000
    13.2 +++ b/linkablemapobj.cpp	Thu Sep 03 08:52:00 2009 +0000
    13.3 @@ -11,15 +11,17 @@
    13.4  // LinkableMapObj
    13.5  /////////////////////////////////////////////////////////////////
    13.6  
    13.7 +/* FIXME-3
    13.8  LinkableMapObj::LinkableMapObj():MapObj()
    13.9  {
   13.10    //  cout << "Const LinkableMapObj ()\n";
   13.11      init ();
   13.12  }
   13.13 +*/
   13.14  
   13.15 -LinkableMapObj::LinkableMapObj(QGraphicsScene* s) :MapObj(s)
   13.16 +LinkableMapObj::LinkableMapObj(QGraphicsScene* s, TreeItem *ti) :MapObj(s,ti)
   13.17  {
   13.18 -//    cout << "Const LinkableMapObj (s)\n";
   13.19 +//    cout << "Const LinkableMapObj s="<<s<<"  ti="<<ti<<"  treeItem="<<treeItem<<endl;
   13.20      init ();
   13.21  }
   13.22  
   13.23 @@ -86,9 +88,6 @@
   13.24  	// Rel Positions
   13.25  	relPos=QPointF(0,0);
   13.26  	useRelPos=false;
   13.27 -
   13.28 -	// Crossreference to treemodel
   13.29 -	treeItem=NULL;
   13.30  }
   13.31  
   13.32  void LinkableMapObj::copy (LinkableMapObj* other)
   13.33 @@ -101,16 +100,6 @@
   13.34  	treeItem=other->treeItem;
   13.35  }
   13.36  
   13.37 -void LinkableMapObj::setTreeItem (TreeItem *ti)
   13.38 -{
   13.39 -	treeItem=ti;
   13.40 -}
   13.41 -
   13.42 -TreeItem* LinkableMapObj::getTreeItem () const
   13.43 -{
   13.44 -	return treeItem;
   13.45 -}
   13.46 -
   13.47  void LinkableMapObj::setParObj(LinkableMapObj* o)
   13.48  {
   13.49      parObj=o;
    14.1 --- a/linkablemapobj.h	Mon Aug 24 14:39:07 2009 +0000
    14.2 +++ b/linkablemapobj.h	Thu Sep 03 08:52:00 2009 +0000
    14.3 @@ -5,13 +5,11 @@
    14.4  #include "noteobj.h"
    14.5  #include "headingobj.h"
    14.6  #include "flagrowobj.h"
    14.7 -#include "treeitem.h"
    14.8  
    14.9  #define MAX_DEPTH 999
   14.10  
   14.11  class VymModel;
   14.12 -
   14.13 -
   14.14 +class TreeItem;
   14.15  
   14.16  /*! \brief This class adds links to MapObj 
   14.17  
   14.18 @@ -50,16 +48,13 @@
   14.19  	};
   14.20  
   14.21      LinkableMapObj ();
   14.22 -    LinkableMapObj (QGraphicsScene*);
   14.23 +    LinkableMapObj (QGraphicsScene*, TreeItem *ti=NULL);
   14.24      LinkableMapObj (LinkableMapObj*);
   14.25      ~LinkableMapObj ();
   14.26  	virtual void delLink();
   14.27      virtual void init ();
   14.28      virtual void copy (LinkableMapObj*);
   14.29  
   14.30 -	virtual void setTreeItem(TreeItem *);
   14.31 -	virtual TreeItem* getTreeItem() const;
   14.32 -
   14.33      void setChildObj (LinkableMapObj*);
   14.34      virtual void setParObj (LinkableMapObj*);
   14.35      virtual void setParObjTmp (LinkableMapObj*,QPointF,int);	// Only for moving Obj around
   14.36 @@ -146,6 +141,5 @@
   14.37  	QPointF	 relPos;				// position relative to childPos of parent
   14.38  	bool useRelPos;
   14.39  
   14.40 -	TreeItem *treeItem;				// Crossrefence to treemodel
   14.41  };
   14.42  #endif
    15.1 --- a/mainwindow.cpp	Mon Aug 24 14:39:07 2009 +0000
    15.2 +++ b/mainwindow.cpp	Thu Sep 03 08:52:00 2009 +0000
    15.3 @@ -21,6 +21,7 @@
    15.4  #include "settings.h"
    15.5  #include "texteditor.h"
    15.6  #include "warningdialog.h"
    15.7 +#include "xlinkitem.h"
    15.8  
    15.9  #if defined(Q_OS_WIN32)
   15.10  // Define only this structure as opposed to
   15.11 @@ -3382,26 +3383,21 @@
   15.12  				actionFormatHideLinkUnselected->setEnabled (true);
   15.13  			}
   15.14  
   15.15 -			if (selbi)	// FIXME-4 many properties of former BranchObj are in TreeItem meanwhile...
   15.16 +			if (selbi)	
   15.17  			{
   15.18 -				// Take care of links  // updateActions: FIXME-1
   15.19 -				/*
   15.20 -				if (bo->countXLinks()==0)
   15.21 +				// Take care of xlinks  
   15.22 +				branchXLinksContextMenuEdit->clear();
   15.23 +				branchXLinksContextMenuFollow->clear();
   15.24 +				if (selbi->xlinkCount()>0)
   15.25  				{
   15.26 -					branchXLinksContextMenuEdit->clear();
   15.27 -					branchXLinksContextMenuFollow->clear();
   15.28 -				} else
   15.29 -				{
   15.30 -					BranchObj *bot;
   15.31 +					BranchItem *bi;
   15.32  					QString s;
   15.33 -					branchXLinksContextMenuEdit->clear();
   15.34 -					branchXLinksContextMenuFollow->clear();
   15.35 -					for (int i=0; i<=bo->countXLinks();i++)
   15.36 +					for (int i=0; i<selbi->xlinkCount();++i)
   15.37  					{
   15.38 -						bot=bo->XLinkTargetAt(i);
   15.39 -						if (bot)
   15.40 +						bi=selbi->getXLinkNum(i)->getPartnerBranch();
   15.41 +						if (bi)
   15.42  						{
   15.43 -							s=bot->getHeading();
   15.44 +							s=bi->getHeading();
   15.45  							if (s.length()>xLinkMenuWidth)
   15.46  								s=s.left(xLinkMenuWidth)+"...";
   15.47  							branchXLinksContextMenuFollow->addAction (s);
   15.48 @@ -3409,7 +3405,6 @@
   15.49  						}	
   15.50  					}
   15.51  				}
   15.52 -				*/
   15.53  				//Standard Flags
   15.54  				standardFlagsMaster->updateToolBar (selbi->activeStandardFlagNames() );
   15.55  
    16.1 --- a/mainwindow.h	Mon Aug 24 14:39:07 2009 +0000
    16.2 +++ b/mainwindow.h	Thu Sep 03 08:52:00 2009 +0000
    16.3 @@ -16,6 +16,7 @@
    16.4  #include "texteditor.h"
    16.5  #include "vymview.h"
    16.6  
    16.7 +
    16.8  class Main : public QMainWindow 
    16.9  {
   16.10      Q_OBJECT
    17.1 --- a/mapeditor.cpp	Mon Aug 24 14:39:07 2009 +0000
    17.2 +++ b/mapeditor.cpp	Thu Sep 03 08:52:00 2009 +0000
    17.3 @@ -10,6 +10,7 @@
    17.4  #include "mainwindow.h"
    17.5  #include "misc.h"
    17.6  #include "warningdialog.h"
    17.7 +#include "xlinkitem.h"
    17.8  
    17.9  
   17.10  extern int statusbarTime;
   17.11 @@ -881,6 +882,7 @@
   17.12      LinkableMapObj* lmo=NULL;
   17.13  	if (ti) lmo=((MapItem*)ti)->getLMO();
   17.14  	
   17.15 +	
   17.16  	e->accept();
   17.17  
   17.18  	//Take care of  system flags _or_ modifier modes
   17.19 @@ -923,22 +925,15 @@
   17.20  		} 
   17.21  		if (mainWindow->getModMode()==Main::ModModeXLink)
   17.22  		{	
   17.23 -			BranchObj *bo_begin=NULL;
   17.24 -			if (lmo)
   17.25 -				bo_begin=(BranchObj*)(lmo);
   17.26 -			else	
   17.27 -				bo_begin=model->getSelectedBranchObj();
   17.28 -			if (bo_begin)	
   17.29 +			BranchItem *bi_begin=model->getSelectedBranch();
   17.30 +			if (bi_begin)	
   17.31  			{
   17.32  				drawingLink=true;
   17.33 -				linkingObj_src=bo_begin;
   17.34 -				tmpXLink=new XLinkObj (mapScene);
   17.35 -				tmpXLink->setBegin (bo_begin);
   17.36 -				tmpXLink->setEnd   (p);
   17.37 +				tmpXLink=model->createXLink(bi_begin,true);
   17.38  				tmpXLink->setColor(model->getMapDefXLinkColor());
   17.39  				tmpXLink->setWidth(model->getMapDefXLinkWidth());
   17.40 +				tmpXLink->setEnd   (p);
   17.41  				tmpXLink->updateXLink();
   17.42 -				tmpXLink->setVisibility (true);
   17.43  				return;
   17.44  			} 
   17.45  		}
   17.46 @@ -1192,13 +1187,13 @@
   17.47  		// Check if we are over another branch
   17.48  		if (dsti)
   17.49  		{	
   17.50 -			tmpXLink->setEnd ( ((BranchObj*)(dst)) );
   17.51 +			tmpXLink->setEnd ( ((BranchItem*)dsti) );
   17.52  			tmpXLink->updateXLink();
   17.53 -			tmpXLink->activate(); //FIXME-2 savestate missing
   17.54 -			//model->saveStateComplete(QString("Activate xLink from %1 to %2").arg(model->getObjectName(tmpXLink->getBegin())).arg(model->getObjectName(tmpXLink->getEnd())) );	
   17.55 +			tmpXLink->activate(); 
   17.56 +			//FIXME-0 model->saveStateComplete(QString("Activate xLink from %1 to %2").arg(model->getObjectName(tmpXLink->getBegin())).arg(model->getObjectName(tmpXLink->getEnd())) );	
   17.57  		} else
   17.58  		{
   17.59 -			delete(tmpXLink);
   17.60 +			model->deleteItem(tmpXLink);
   17.61  			tmpXLink=NULL;
   17.62  		}
   17.63  		return;
    18.1 --- a/mapeditor.h	Mon Aug 24 14:39:07 2009 +0000
    18.2 +++ b/mapeditor.h	Thu Sep 03 08:52:00 2009 +0000
    18.3 @@ -10,9 +10,10 @@
    18.4  #include "ornamentedobj.h"
    18.5  #include "settings.h"
    18.6  #include "vymmodel.h"
    18.7 -#include "xlinkobj.h"
    18.8  
    18.9  
   18.10 +class XLinkItem;
   18.11 +
   18.12  /*! \brief Main widget in vym to display and edit a map */
   18.13  
   18.14  
   18.15 @@ -112,10 +113,9 @@
   18.16  	bool pickingColor;
   18.17  	bool drawingLink;			// true while creating a link
   18.18  	bool copyingObj;			// true while creating a link
   18.19 -	XLinkObj* tmpXLink;
   18.20 +	XLinkItem* tmpXLink;
   18.21  
   18.22  	MapObj* movingObj;				// moving a MapObj
   18.23 -	MapObj* linkingObj_src;			// part of a link
   18.24      QPointF movingObj_orgPos;		// org. pos of mouse before move
   18.25      QPointF movingObj_orgRelPos;	// org. relative pos of mouse before move
   18.26      QPointF movingObj_start;		// rel. pos of mouse to absPos 
    19.1 --- a/mapobj.cpp	Mon Aug 24 14:39:07 2009 +0000
    19.2 +++ b/mapobj.cpp	Thu Sep 03 08:52:00 2009 +0000
    19.3 @@ -12,10 +12,11 @@
    19.4      init ();
    19.5  }
    19.6  
    19.7 -MapObj::MapObj (QGraphicsScene *s)
    19.8 +MapObj::MapObj (QGraphicsScene *s, TreeItem *ti)
    19.9  {
   19.10  //  cout << "Const MapObj\n";
   19.11      scene=s;
   19.12 +	treeItem=ti;
   19.13      init ();
   19.14  }
   19.15  
   19.16 @@ -46,6 +47,17 @@
   19.17  	bbox.setSize (QSizeF(other->bbox.width(), other->bbox.height() ) );
   19.18  }
   19.19  
   19.20 +void MapObj::setTreeItem (TreeItem *ti)
   19.21 +{
   19.22 +	treeItem=ti;
   19.23 +}
   19.24 +
   19.25 +TreeItem* MapObj::getTreeItem () const
   19.26 +{
   19.27 +	return treeItem;
   19.28 +}
   19.29 +
   19.30 +
   19.31  QGraphicsScene* MapObj::getScene()
   19.32  {
   19.33  	return scene;
    20.1 --- a/mapobj.h	Mon Aug 24 14:39:07 2009 +0000
    20.2 +++ b/mapobj.h	Thu Sep 03 08:52:00 2009 +0000
    20.3 @@ -16,17 +16,24 @@
    20.4  #define Z_TEXT     100
    20.5  #define Z_LINEEDIT 110
    20.6  
    20.7 +
    20.8 +class TreeItem;
    20.9 +
   20.10  /*! \brief Base class for all objects visible on a map
   20.11  */
   20.12  
   20.13  class MapObj:public XMLObj {
   20.14  public:
   20.15      MapObj ();
   20.16 -    MapObj (QGraphicsScene*);
   20.17 +    MapObj (QGraphicsScene *scene,TreeItem *ti=NULL);
   20.18      MapObj (MapObj*);
   20.19      virtual ~MapObj ();
   20.20      virtual void init ();
   20.21      virtual void copy (MapObj*);
   20.22 +
   20.23 +	virtual void setTreeItem(TreeItem *);
   20.24 +	virtual TreeItem* getTreeItem() const;
   20.25 +
   20.26  	virtual QGraphicsScene* getScene();
   20.27      virtual qreal x();
   20.28      virtual qreal y();
   20.29 @@ -51,6 +58,9 @@
   20.30  	QRectF clickBox;								// area where mouseclicks are found
   20.31      QPointF absPos;							    // Position on canvas
   20.32      bool visible;
   20.33 +
   20.34 +	TreeItem *treeItem;				// Crossrefence to treemodel
   20.35 +
   20.36  };
   20.37  
   20.38  #endif
    21.1 --- a/ornamentedobj.cpp	Mon Aug 24 14:39:07 2009 +0000
    21.2 +++ b/ornamentedobj.cpp	Thu Sep 03 08:52:00 2009 +0000
    21.3 @@ -6,13 +6,8 @@
    21.4  // OrnamentedObj
    21.5  /////////////////////////////////////////////////////////////////
    21.6  
    21.7 -OrnamentedObj::OrnamentedObj():LinkableMapObj()
    21.8 -{
    21.9 -  //  cout << "Const OrnamentedObj ()\n";
   21.10 -    init ();
   21.11 -}
   21.12  
   21.13 -OrnamentedObj::OrnamentedObj(QGraphicsScene* s) :LinkableMapObj(s)
   21.14 +OrnamentedObj::OrnamentedObj(QGraphicsScene* s,TreeItem *ti) :LinkableMapObj(s,ti)
   21.15  {
   21.16  //    cout << "Const OrnamentedObj (s)\n";
   21.17      init ();
    22.1 --- a/ornamentedobj.h	Mon Aug 24 14:39:07 2009 +0000
    22.2 +++ b/ornamentedobj.h	Thu Sep 03 08:52:00 2009 +0000
    22.3 @@ -5,6 +5,8 @@
    22.4  #include "frameobj.h"
    22.5  #include "linkablemapobj.h"
    22.6  
    22.7 +class TreeItem;
    22.8 +
    22.9  /*! \brief Adds various ornaments and data to the class LinkableMapObj
   22.10  
   22.11  The ornaments are:
   22.12 @@ -19,8 +21,7 @@
   22.13  
   22.14  class OrnamentedObj:public LinkableMapObj {
   22.15  public:	
   22.16 -    OrnamentedObj ();
   22.17 -    OrnamentedObj (QGraphicsScene*);
   22.18 +    OrnamentedObj (QGraphicsScene*, TreeItem *ti=NULL);
   22.19      OrnamentedObj (OrnamentedObj*);
   22.20      ~OrnamentedObj ();
   22.21      virtual void init ();
    23.1 --- a/treeitem.cpp	Mon Aug 24 14:39:07 2009 +0000
    23.2 +++ b/treeitem.cpp	Thu Sep 03 08:52:00 2009 +0000
    23.3 @@ -1,11 +1,13 @@
    23.4  #include <iostream>
    23.5  #include <QStringList>
    23.6  
    23.7 -#include "treeitem.h"
    23.8 -
    23.9 +#include "attributeitem.h"
   23.10  #include "branchobj.h"
   23.11  #include "branchitem.h"
   23.12 +#include "treeitem.h"
   23.13  #include "vymmodel.h"
   23.14 +#include "xlinkitem.h"
   23.15 +#include "xlinkobj.h"
   23.16  
   23.17  using namespace std;
   23.18  
   23.19 @@ -53,6 +55,9 @@
   23.20  			case TreeItem::Attribute:
   23.21  				delete (AttributeItem*)ti;
   23.22  				break;
   23.23 +			case TreeItem::XLink:
   23.24 +				delete (XLinkItem*)ti;
   23.25 +				break;
   23.26  			default:
   23.27  				delete ti;
   23.28  				break;
   23.29 @@ -74,6 +79,9 @@
   23.30  	attributeCounter=0;
   23.31  	attributeOffset=0;
   23.32  
   23.33 +	xlinkCounter=0;
   23.34 +	xlinkOffset=0;
   23.35 +
   23.36  	note.setNote(""); 
   23.37  	// note.setFontHint (textEditor->getFontHintDefault() );	//FIXME-3
   23.38  	// isNoteInEditor=false;
   23.39 @@ -114,6 +122,7 @@
   23.40  	switch (item->type)
   23.41  	{
   23.42  		case Attribute: return attributeOffset + attributeCounter;
   23.43 +		case XLink: return xlinkOffset + xlinkCounter;
   23.44  		case Image: return imageOffset + imageCounter;
   23.45  		case MapCenter: return branchOffset + branchCounter;
   23.46  		case Branch: return branchOffset + branchCounter;
   23.47 @@ -132,6 +141,15 @@
   23.48  		// attribute are on top of list
   23.49  		childItems.insert (attributeCounter,item);
   23.50  		attributeCounter++;
   23.51 +		xlinkOffset++;
   23.52 +		imageOffset++;
   23.53 +		branchOffset++;
   23.54 +	}
   23.55 +
   23.56 +	if (item->type == XLink)
   23.57 +	{
   23.58 +		childItems.insert (xlinkCounter+xlinkOffset,item);
   23.59 +		xlinkCounter++;
   23.60  		imageOffset++;
   23.61  		branchOffset++;
   23.62  	}
   23.63 @@ -166,6 +184,13 @@
   23.64  		if (childItems.at(row)->type==Attribute)
   23.65  		{
   23.66  			attributeCounter--;
   23.67 +			xlinkOffset--;
   23.68 +			imageOffset--;
   23.69 +			branchOffset--;
   23.70 +		}	
   23.71 +		if (childItems.at(row)->type==XLink)
   23.72 +		{
   23.73 +			xlinkCounter--;
   23.74  			imageOffset--;
   23.75  			branchOffset--;
   23.76  		}	
   23.77 @@ -226,10 +251,9 @@
   23.78      return imageCounter; 
   23.79  }
   23.80  
   23.81 -int TreeItem::xlinkCount() const // FIXME-2 check if xlinks are stored in a different way (global to model?)
   23.82 +int TreeItem::xlinkCount() const
   23.83  {
   23.84 -	int xlinkCounter=0;
   23.85 -    return xlinkCounter; // FIXME-1 xlinkCounter needs to be calculated...
   23.86 +    return xlinkCounter; 
   23.87  }
   23.88  
   23.89  int TreeItem::attributeCount() const 
   23.90 @@ -283,6 +307,7 @@
   23.91  		case Branch: return parentItem->childItems.indexOf (this) - parentItem->branchOffset;
   23.92  		case Image: return parentItem->childItems.indexOf (this) - parentItem->imageOffset;
   23.93  		case Attribute: return parentItem->childItems.indexOf (this) - parentItem->attributeOffset;
   23.94 +		case XLink: return parentItem->childItems.indexOf (this) - parentItem->xlinkOffset;
   23.95  		default: return -1;
   23.96  	}
   23.97  }
   23.98 @@ -297,6 +322,7 @@
   23.99  		case Branch: return childItems.indexOf (item) - branchOffset;
  23.100  		case Image: return parentItem->childItems.indexOf (item) - imageOffset;
  23.101  		case Attribute: return parentItem->childItems.indexOf (item) - attributeOffset;
  23.102 +		case XLink: return parentItem->childItems.indexOf (item) - xlinkOffset;
  23.103  		default: return -1;
  23.104  	}
  23.105  }
  23.106 @@ -327,6 +353,7 @@
  23.107  		case Branch: return QString ("Branch");
  23.108  		case Image: return QString ("Image");
  23.109  		case Attribute: return QString ("Attribute");
  23.110 +		case XLink: return QString ("XLink");
  23.111  		default: return QString ("TreeItem::getTypeName no typename defined?!");
  23.112  	}
  23.113  }
  23.114 @@ -530,7 +557,6 @@
  23.115  {
  23.116  	switch (type)
  23.117  	{
  23.118 -		case Undefined: return false;
  23.119  		case MapCenter: 
  23.120  		case Branch: 
  23.121  			if (!parentItem) return false;
  23.122 @@ -539,7 +565,6 @@
  23.123  			else
  23.124  				return false;
  23.125  			break;	
  23.126 -		case Image: return false;
  23.127  		default: return false;
  23.128  	}
  23.129  }
  23.130 @@ -623,6 +648,33 @@
  23.131  		return NULL;
  23.132  }
  23.133  
  23.134 +XLinkItem* TreeItem::getXLinkNum (const int &n)	
  23.135 +{
  23.136 +	if (n>=0 && n<xlinkCounter )
  23.137 +		return (XLinkItem*)getChildNum (xlinkOffset +n);
  23.138 +	else
  23.139 +		return NULL;
  23.140 +}
  23.141 +
  23.142 +
  23.143 +XLinkObj* TreeItem::getXLinkObjNum (const int &n)	
  23.144 +{
  23.145 +	if (xlinkCounter>0 )
  23.146 +	{
  23.147 +		XLinkItem *xli=getXLinkNum (n);
  23.148 +		if (!xli) return NULL;
  23.149 +		if (xli->isBegin() )
  23.150 +			return (XLinkObj*)(xli->getLMO());
  23.151 +		else
  23.152 +		{
  23.153 +			xli=xli->getPartnerXLink();
  23.154 +			if (!xli) return NULL;
  23.155 +			return (XLinkObj*)(xli->getLMO());
  23.156 +		}
  23.157 +	}
  23.158 +	return NULL;
  23.159 +}
  23.160 +
  23.161  
  23.162  void TreeItem::setHideTmp (HideTmpMode mode)  //FIXME-2
  23.163  {
    24.1 --- a/treeitem.h	Mon Aug 24 14:39:07 2009 +0000
    24.2 +++ b/treeitem.h	Thu Sep 03 08:52:00 2009 +0000
    24.3 @@ -6,7 +6,6 @@
    24.4  #include <QVariant>
    24.5  
    24.6  #include "flagrow.h"
    24.7 -//#include "mapitem.h"
    24.8  #include "noteobj.h"
    24.9  #include "xmlobj.h"
   24.10  
   24.11 @@ -16,11 +15,13 @@
   24.12  class FloatImageObj;
   24.13  class ImageItem;
   24.14  class VymModel;
   24.15 +class XLinkItem;
   24.16 +class XLinkObj;
   24.17  
   24.18  class TreeItem:public XMLObj
   24.19  {
   24.20  public:
   24.21 -	enum Type {Undefined,MapCenter,Branch,Image,Attribute};	//FIXME-3 MapCenter still needed?
   24.22 +	enum Type {Undefined,MapCenter,Branch,Image,Attribute,XLink};	//FIXME-3 MapCenter still needed?
   24.23  	enum HideTmpMode {HideNone, HideExport};
   24.24  
   24.25      TreeItem();
   24.26 @@ -155,6 +156,9 @@
   24.27  	virtual ImageItem* getImageNum(const int &n);
   24.28  	virtual FloatImageObj* getImageObjNum(const int &n);
   24.29  
   24.30 +	virtual XLinkItem* getXLinkNum(const int &n);
   24.31 +	virtual XLinkObj* getXLinkObjNum(const int &n);
   24.32 +
   24.33  protected:
   24.34  	bool hideExport;							//! Hide this item in export
   24.35  public:
   24.36 @@ -185,6 +189,9 @@
   24.37  	int attributeOffset;
   24.38  	int attributeCounter;
   24.39  
   24.40 +	int xlinkOffset;
   24.41 +	int xlinkCounter;
   24.42 +
   24.43  	bool hidden;	//! Hidden in export if true
   24.44  };
   24.45  
    25.1 --- a/treemodel.cpp	Mon Aug 24 14:39:07 2009 +0000
    25.2 +++ b/treemodel.cpp	Thu Sep 03 08:52:00 2009 +0000
    25.3 @@ -8,12 +8,13 @@
    25.4  #include "imageitem.h"
    25.5  #include "treeitem.h"
    25.6  #include "treemodel.h"
    25.7 +#include "xlinkitem.h"
    25.8  
    25.9  TreeModel::TreeModel(QObject *parent)
   25.10      : QAbstractItemModel(parent)
   25.11  {
   25.12      QList<QVariant> rootData;
   25.13 -    rootData << "Heading" << "Type" <<"Note";
   25.14 +    rootData << "Heading" << "Type";
   25.15      rootItem = new TreeItem(rootData);
   25.16  }
   25.17  
   25.18 @@ -217,13 +218,11 @@
   25.19      TreeItem *pi= getItem (parent);
   25.20  	TreeItem *ti;
   25.21  
   25.22 -/* FIXME-3
   25.23  	cout << "TM::removeRows  row="<<row<<"  count="<<count<<endl;
   25.24 -	cout << "                pi="<<pi<<"  ti="<<ti<<endl;
   25.25 -*/	
   25.26  	for (int i=row; i<=last; i++)
   25.27  	{
   25.28  		ti=pi->getChildNum (row);
   25.29 +		cout << "   pi="<<pi<<"  ti="<<ti<<endl;
   25.30  		pi->removeChild (row);	// does not delete object!
   25.31  		switch (ti->getType()) 
   25.32  		{
   25.33 @@ -239,6 +238,9 @@
   25.34  			case TreeItem::Attribute:
   25.35  				delete (AttributeItem*)ti; 
   25.36  				break;
   25.37 +			case TreeItem::XLink:
   25.38 +				delete (XLinkItem*)ti; 
   25.39 +				break;
   25.40  			default:
   25.41  				delete ti;
   25.42  				break;
    26.1 --- a/version.h	Mon Aug 24 14:39:07 2009 +0000
    26.2 +++ b/version.h	Thu Sep 03 08:52:00 2009 +0000
    26.3 @@ -7,7 +7,7 @@
    26.4  #define __VYM_VERSION "1.13.0"
    26.5  //#define __VYM_CODENAME "Codename: RC-1"
    26.6  #define __VYM_CODENAME "Codename: development version, not for production!"
    26.7 -#define __VYM_BUILD_DATE "2009-08-24"
    26.8 +#define __VYM_BUILD_DATE "2009-09-01"
    26.9  
   26.10  
   26.11  bool checkVersion(const QString &);
    27.1 --- a/vym.pro	Mon Aug 24 14:39:07 2009 +0000
    27.2 +++ b/vym.pro	Thu Sep 03 08:52:00 2009 +0000
    27.3 @@ -81,6 +81,7 @@
    27.4  	treeeditor.h \
    27.5  	version.h \
    27.6  	vymmodel.h \
    27.7 +	xlinkitem.h \
    27.8  	xlinkobj.h \
    27.9  	xml-base.h \
   27.10  	xml-vym.h \
   27.11 @@ -147,6 +148,7 @@
   27.12  	treemodel.cpp \
   27.13  	version.cpp \
   27.14  	vymmodel.cpp \
   27.15 +	xlinkitem.cpp \
   27.16  	xlinkobj.cpp \
   27.17  	xml-base.cpp \
   27.18  	xml-vym.cpp \
    28.1 --- a/vymmodel.cpp	Mon Aug 24 14:39:07 2009 +0000
    28.2 +++ b/vymmodel.cpp	Thu Sep 03 08:52:00 2009 +0000
    28.3 @@ -16,6 +16,7 @@
    28.4  #include "parser.h"
    28.5  
    28.6  #include "warningdialog.h"
    28.7 +#include "xlinkitem.h"
    28.8  #include "xml-freemind.h"
    28.9  #include "xmlobj.h"
   28.10  #include "xml-vym.h"
   28.11 @@ -238,7 +239,7 @@
   28.12  	s+=xml.beginElement("vymmap",mapAttr);
   28.13  	xml.incIndent();
   28.14  
   28.15 -	// Find the used flags while traversing the tree	// FIXME-2 this can be done local to vymmodel maybe...
   28.16 +	// Find the used flags while traversing the tree	// FIXME-3 this can be done local to vymmodel maybe...
   28.17  	standardFlagsMaster->resetUsedCounter();
   28.18  	
   28.19  	// Build xml recursivly
   28.20 @@ -261,7 +262,8 @@
   28.21  				// Save Image
   28.22  				s+=((ImageItem*)saveSel)->saveToDir(tmpdir,prefix);
   28.23  				break;
   28.24 -			default://FIXME-4 other types shouldn't be safed...
   28.25 +			default: 
   28.26 +				// other types shouldn't be safed directly...
   28.27  				break;
   28.28  		}
   28.29  	}
   28.30 @@ -1444,12 +1446,14 @@
   28.31  
   28.32  TreeItem* VymModel::findID (const QString &s)
   28.33  {
   28.34 -	TreeItem *ti;
   28.35 -	for (int i=0; i<rootItem->branchCount(); i++)
   28.36 +	BranchItem *cur=NULL;
   28.37 +	BranchItem *prev=NULL;
   28.38 +	next(cur,prev);
   28.39 +	while (cur) 
   28.40  	{
   28.41 -		ti=rootItem->getBranchNum(i)->findID (s);
   28.42 -		if (ti) return ti;
   28.43 -	}	
   28.44 +		if (s==cur->getID() ) return cur;
   28.45 +		next(cur,prev);
   28.46 +	}
   28.47  	return NULL;
   28.48  }
   28.49  
   28.50 @@ -1984,7 +1988,7 @@
   28.51  		int n;
   28.52  
   28.53  		QList<QVariant> cData;
   28.54 -		cData << "new" << "undef"<<"undef";
   28.55 +		cData << "new" << "undef";
   28.56  
   28.57  		ImageItem *newii=new ImageItem(cData) ;	
   28.58  		//newii->setHeading (QApplication::translate("Heading of new image in map", "new image"));
   28.59 @@ -2008,13 +2012,48 @@
   28.60  	return NULL;
   28.61  }
   28.62  
   28.63 +XLinkItem* VymModel::createXLink(BranchItem *bi,bool createMO)
   28.64 +{
   28.65 +	if (bi)
   28.66 +	{
   28.67 +		QModelIndex parix;
   28.68 +		int n;
   28.69 +
   28.70 +		QList<QVariant> cData;
   28.71 +		cData << "new xLink"<<"undef";
   28.72 +
   28.73 +		XLinkItem *newxli=new XLinkItem(cData) ;	
   28.74 +
   28.75 +		emit (layoutAboutToBeChanged() );
   28.76 +
   28.77 +			parix=index(bi);
   28.78 +			n=bi->getRowNumAppend(newxli);
   28.79 +			beginInsertRows (parix,n,n+1);
   28.80 +			bi->appendChild (newxli);	
   28.81 +			endInsertRows ();
   28.82 +
   28.83 +		emit (layoutChanged() );
   28.84 +
   28.85 +		// save scroll state. If scrolled, automatically select
   28.86 +		// new branch in order to tmp unscroll parent...
   28.87 +		newxli->setBegin (bi);
   28.88 +		if (createMO) 
   28.89 +		{
   28.90 +			newxli->createMapObj(mapScene);
   28.91 +			reposition();
   28.92 +		}
   28.93 +		return newxli;
   28.94 +	} 
   28.95 +	return NULL;
   28.96 +}
   28.97 +
   28.98  AttributeItem* VymModel::addAttribute()	// FIXME-2 savestate missing
   28.99  {
  28.100  	BranchItem *selbi=getSelectedBranch();
  28.101  	if (selbi)
  28.102  	{
  28.103  		QList<QVariant> cData;
  28.104 -		cData << "new attribute" << "undef"<<"undef";
  28.105 +		cData << "new attribute" << "undef";
  28.106  		AttributeItem *a=new AttributeItem (cData);
  28.107  
  28.108  		emit (layoutAboutToBeChanged() );
  28.109 @@ -2061,7 +2100,7 @@
  28.110  	beginInsertRows (parix,n,n+1);
  28.111  
  28.112  	QList<QVariant> cData;
  28.113 -	cData << "VM:addMapCenter" << "undef"<<"undef";
  28.114 +	cData << "VM:addMapCenter" << "undef";
  28.115  	BranchItem *newbi=new BranchItem (cData,rootItem);
  28.116  	newbi->setHeading (QApplication::translate("Heading of mapcenter in new map", "New map"));
  28.117  	rootItem->appendChild (newbi);
  28.118 @@ -2086,7 +2125,7 @@
  28.119  
  28.120  	// Create TreeItem
  28.121  	QList<QVariant> cData;
  28.122 -	cData << "new" << "undef"<<"undef";
  28.123 +	cData << "new" << "undef";
  28.124  
  28.125  	BranchItem *parbi;
  28.126  	QModelIndex parix;
  28.127 @@ -2298,15 +2337,20 @@
  28.128  		return;
  28.129  	}
  28.130  	TreeItem *ti=getSelectedItem();
  28.131 -	if (ti->getType()==TreeItem::Image || ti->getType()==TreeItem::Attribute)
  28.132 +	if (ti)
  28.133  	{
  28.134  		TreeItem *pi=ti->parent();
  28.135 -		saveStateChangingPart(
  28.136 -			pi, 
  28.137 -			ti,
  28.138 -			"delete ()",
  28.139 -			QString("Delete %1").arg(getObjectName(ti))
  28.140 -		);
  28.141 +		if (!pi) return;
  28.142 +		if (ti->getType()==TreeItem::Image || ti->getType()==TreeItem::Attribute)
  28.143 +		{
  28.144 +			saveStateChangingPart(
  28.145 +				pi, 
  28.146 +				ti,
  28.147 +				"delete ()",
  28.148 +				QString("Delete %1").arg(getObjectName(ti))
  28.149 +			);
  28.150 +		}
  28.151 +		// FIXME-0 savestate missing for deletion of other times
  28.152  		unselect();
  28.153  		deleteItem (ti);
  28.154  		emitDataHasChanged (pi);
  28.155 @@ -2393,6 +2437,7 @@
  28.156  
  28.157  TreeItem* VymModel::deleteItem (TreeItem *ti)
  28.158  {
  28.159 +	cout << "VM::deleteItem "<<ti<<endl;
  28.160  	if (ti)
  28.161  	{
  28.162  		TreeItem *pi=ti->parent();
  28.163 @@ -2764,49 +2809,40 @@
  28.164  }
  28.165  
  28.166  
  28.167 -void VymModel::followXLink(int i)	// FIXME-2
  28.168 +void VymModel::followXLink(int i)	
  28.169  {
  28.170  	i=0;
  28.171 -	/*
  28.172 -	BranchObj *bo=getSelectedBranch();
  28.173 -	if (bo)
  28.174 +	BranchItem *selbi=getSelectedBranch();
  28.175 +	if (selbi)
  28.176  	{
  28.177 -		bo=bo->XLinkTargetAt(i);
  28.178 -		if (bo) 
  28.179 -		{
  28.180 -			selection.select(bo);
  28.181 -			emitShowSelection();
  28.182 -		}
  28.183 +		selbi=selbi->getXLinkNum(i)->getPartnerBranch();
  28.184 +		if (selbi) select (selbi);
  28.185  	}
  28.186 -	*/
  28.187  }
  28.188  
  28.189 -void VymModel::editXLink(int i)	// FIXME-2 VM missing saveState
  28.190 +void VymModel::editXLink(int i)	
  28.191  {
  28.192  	i=0;
  28.193 -	/*
  28.194 -	BranchObj *bo=getSelectedBranch();
  28.195 -	if (bo)
  28.196 +	BranchItem *selbi=getSelectedBranch();
  28.197 +	if (selbi)
  28.198  	{
  28.199 -		XLinkObj *xlo=bo->XLinkAt(i);
  28.200 -		if (xlo) 
  28.201 +		XLinkItem *xli=selbi->getXLinkNum(i);
  28.202 +		if (xli) 
  28.203  		{
  28.204  			EditXLinkDialog dia;
  28.205 -			dia.setXLink (xlo);
  28.206 -			dia.setSelection(bo);
  28.207 +			dia.setXLink (xli);
  28.208 +			dia.setSelection(selbi);
  28.209  			if (dia.exec() == QDialog::Accepted)
  28.210  			{
  28.211  				if (dia.useSettingsGlobal() )
  28.212  				{
  28.213 -					setMapDefXLinkColor (xlo->getColor() );
  28.214 -					setMapDefXLinkWidth (xlo->getWidth() );
  28.215 +					setMapDefXLinkColor (xli->getColor() );
  28.216 +					setMapDefXLinkWidth (xli->getWidth() );
  28.217  				}
  28.218 -				if (dia.deleteXLink())
  28.219 -					bo->deleteXLinkAt(i);
  28.220 +				if (dia.deleteXLink()) deleteItem (xli);
  28.221  			}
  28.222  		}	
  28.223  	}
  28.224 -*/	
  28.225  }
  28.226  
  28.227  
    29.1 --- a/vymmodel.h	Mon Aug 24 14:39:07 2009 +0000
    29.2 +++ b/vymmodel.h	Thu Sep 03 08:52:00 2009 +0000
    29.3 @@ -18,6 +18,7 @@
    29.4  class AttributeItem;
    29.5  class BranchItem;
    29.6  class MapEditor;
    29.7 +class XLinkItem;
    29.8  
    29.9  class VymModel :  public TreeModel {		
   29.10  	Q_OBJECT
   29.11 @@ -291,6 +292,7 @@
   29.12  	BranchItem* createMapCenter();				//!< Create MapCenter 
   29.13  	BranchItem* createBranch(BranchItem *dst);	//!< Create Branch
   29.14  	ImageItem* createImage(BranchItem *dst);	//!< Create image
   29.15 +	XLinkItem* createXLink(BranchItem *dst,bool createMO=false);	//!< Create XLink starting at dst
   29.16  
   29.17  	AttributeItem* addAttribute();
   29.18  
   29.19 @@ -338,7 +340,6 @@
   29.20  	void deleteKeepChildren();			//!< remove branch, but keep children
   29.21  	void deleteChildren();				//!< keep branch, but remove children
   29.22  
   29.23 -private:	
   29.24  	TreeItem* deleteItem(TreeItem*);	//!< Delete item and return parent (if parent!= rootItem)
   29.25  	bool scrollBranch(BranchItem *);
   29.26  	bool unscrollBranch(BranchItem *);
    30.1 --- a/xlinkobj.cpp	Mon Aug 24 14:39:07 2009 +0000
    30.2 +++ b/xlinkobj.cpp	Thu Sep 03 08:52:00 2009 +0000
    30.3 @@ -1,31 +1,28 @@
    30.4  #include "xlinkobj.h"
    30.5 +
    30.6  #include "branchobj.h"
    30.7 +#include "branchitem.h"
    30.8 +#include "xlinkitem.h"
    30.9  
   30.10 +#include <iostream>
   30.11 +using namespace std;
   30.12  
   30.13  /////////////////////////////////////////////////////////////////
   30.14  // XLinkObj
   30.15  /////////////////////////////////////////////////////////////////
   30.16  
   30.17 -int XLinkObj::arrowSize=10;						// make instances 
   30.18 +int XLinkObj::arrowSize=10;					// make instances
   30.19  
   30.20 -XLinkObj::XLinkObj ():MapObj() 
   30.21 +XLinkObj::XLinkObj (QGraphicsScene* scene, TreeItem* ti):MapObj(scene,ti)
   30.22  {
   30.23 -	//	cout << "Const XLinkObj ()\n";
   30.24 +	//cout << "Const XLinkObj (s)\n";
   30.25  	init();
   30.26  }
   30.27  
   30.28 -XLinkObj::XLinkObj (QGraphicsScene* s):MapObj(s)
   30.29 -{
   30.30 -	//	cout << "Const XLinkObj (s)  called from MapCenterObj (s)\n";
   30.31 -	init();
   30.32 -}
   30.33 -
   30.34  
   30.35  XLinkObj::~XLinkObj ()
   30.36  {
   30.37 -//	cout << "Destr XLinkObj\n";
   30.38 -	if (xLinkState!=undefinedXLink)
   30.39 -		deactivate();
   30.40 +	//cout << "Destr XLinkObj\n";
   30.41  	delete (line);
   30.42  	delete (poly);
   30.43  }
   30.44 @@ -33,87 +30,17 @@
   30.45  
   30.46  void XLinkObj::init () 
   30.47  {
   30.48 -	beginBranch=NULL;
   30.49 -	endBranch=NULL;
   30.50 +	XLinkItem *xli=(XLinkItem*)treeItem;
   30.51  	visBranch=NULL;
   30.52 -	xLinkState=undefinedXLink;
   30.53  
   30.54 -	color=QColor (180,180,180);
   30.55 -	width=1;
   30.56 -	pen.setColor (color);
   30.57 -	pen.setWidth (width);
   30.58 +	pen.setColor ( xli->getColor() );
   30.59 +	pen.setWidth ( xli->getWidth() );
   30.60  	pen.setCapStyle (  Qt::RoundCap );
   30.61  	line=scene->addLine(QLineF(1,1,1,1),pen);
   30.62      line->setZValue (Z_XLINK);
   30.63 -	poly=scene->addPolygon(QPolygonF(),pen,color);
   30.64 +	poly=scene->addPolygon(QPolygonF(),pen, xli->getColor());
   30.65      poly->setZValue (Z_XLINK);
   30.66 -	setVisibility (false);
   30.67 -}
   30.68 -
   30.69 -void XLinkObj::copy (XLinkObj* other)
   30.70 -{
   30.71 -	// TODO copy not used yet
   30.72 -	MapObj::copy (other);
   30.73 -	setVisibility (other->visible);
   30.74 -	beginBranch=other->beginBranch;
   30.75 -	endBranch=other->endBranch;
   30.76 -	width=other->width;
   30.77 -
   30.78 -}
   30.79 -
   30.80 -void XLinkObj::setBegin (BranchObj *bo)
   30.81 -{
   30.82 -	if (bo) 
   30.83 -	{
   30.84 -		xLinkState=initXLink;
   30.85 -		beginBranch=bo;
   30.86 -		beginPos=beginBranch->getChildPos();
   30.87 -	}	
   30.88 -}
   30.89 -
   30.90 -BranchObj* XLinkObj::getBegin ()
   30.91 -{
   30.92 -	return beginBranch;
   30.93 -}
   30.94 -
   30.95 -void XLinkObj::setEnd (BranchObj *bo)
   30.96 -{
   30.97 -	if (bo) 
   30.98 -	{
   30.99 -		xLinkState=initXLink;
  30.100 -		endBranch=bo;
  30.101 -		endPos=endBranch->getChildPos();
  30.102 -	}		
  30.103 -}
  30.104 -
  30.105 -BranchObj* XLinkObj::getEnd()
  30.106 -{
  30.107 -	return endBranch;
  30.108 -}
  30.109 -
  30.110 -void XLinkObj::setWidth (int w)
  30.111 -{
  30.112 -	width=w;
  30.113 -	pen.setWidth (w);
  30.114 -	setColor (color);
  30.115 -}
  30.116 -
  30.117 -int XLinkObj::getWidth()
  30.118 -{
  30.119 -	return pen.width();
  30.120 -}
  30.121 -
  30.122 -void XLinkObj::setColor(QColor c)
  30.123 -{
  30.124 -	color=c;
  30.125 -	pen.setColor (c);
  30.126 -	line->setPen (pen);
  30.127 -	poly->setBrush( color );
  30.128 -}
  30.129 -
  30.130 -QColor XLinkObj::getColor()
  30.131 -{
  30.132 -	return pen.color();
  30.133 +	setVisibility (true);
  30.134  }
  30.135  
  30.136  void XLinkObj::setEnd (QPointF p)
  30.137 @@ -121,41 +48,6 @@
  30.138  	endPos=p;
  30.139  }
  30.140  
  30.141 -bool XLinkObj::activate ()
  30.142 -{
  30.143 -	if (beginBranch && endBranch)
  30.144 -	{
  30.145 -		if (beginBranch==endBranch) return false;
  30.146 -		xLinkState=activeXLink;
  30.147 -		beginBranch->addXLink (this);
  30.148 -		endBranch->addXLink (this);
  30.149 -		setVisibility ();
  30.150 -		return true;
  30.151 -	} else
  30.152 -		return false;
  30.153 -}
  30.154 -
  30.155 -void XLinkObj::deactivate ()
  30.156 -{
  30.157 -	if (beginBranch)
  30.158 -		beginBranch->removeXLinkRef (this);
  30.159 -	beginBranch=NULL;	
  30.160 -	if (endBranch)
  30.161 -		endBranch->removeXLinkRef (this);
  30.162 -	endBranch=NULL;	
  30.163 -	visBranch=NULL;
  30.164 -	xLinkState=undefinedXLink;
  30.165 -
  30.166 -	line->hide();
  30.167 -}
  30.168 -
  30.169 -bool XLinkObj::isUsed()
  30.170 -{
  30.171 -	if (beginBranch || endBranch || xLinkState!=undefinedXLink)
  30.172 -		return true;
  30.173 -	else
  30.174 -		return false;
  30.175 -}
  30.176  
  30.177  void XLinkObj::updateXLink()
  30.178  {
  30.179 @@ -164,8 +56,11 @@
  30.180  	if (visBranch)
  30.181  	{
  30.182  		// Only one of the linked branches is visible
  30.183 -		a=b=visBranch->getChildPos();
  30.184 -		if (visBranch->getOrientation()==LinkableMapObj::RightOfCenter)
  30.185 +		BranchObj *bo=(BranchObj*)(visBranch->getLMO());
  30.186 +		if (!bo) return;
  30.187 +
  30.188 +		a=b=bo->getChildPos();
  30.189 +		if (bo->getOrientation()==LinkableMapObj::RightOfCenter)
  30.190  		{
  30.191  			b.setX (b.x()+25);
  30.192  			
  30.193 @@ -186,43 +81,43 @@
  30.194  	} else
  30.195  	{
  30.196  		// Both linked branches are visible
  30.197 -		if (beginBranch)
  30.198 +		BranchItem *bi=((XLinkItem*)treeItem)->getBegin();
  30.199 +		if ( bi)
  30.200 +		{
  30.201  			// If a link is just drawn in the editor,
  30.202  			// we have already a beginBranch
  30.203 -			a=beginBranch->getChildPos();
  30.204 +			BranchObj *bo=(BranchObj*)(bi->getLMO());
  30.205 +			if (bo)	
  30.206 +				a=bo->getChildPos();
  30.207 +			else 
  30.208 +				return;	
  30.209 +		}	
  30.210  		else
  30.211  			// This shouldn't be reached normally...
  30.212  			a=beginPos;
  30.213 -		if (xLinkState==activeXLink && endBranch)
  30.214 -			b=endBranch->getChildPos();
  30.215 +
  30.216 +		// FIXME-3 try to get rid of xLinkstate if (xLinkState==activeXLink && endBranch)
  30.217 +		bi=((XLinkItem*)treeItem)->getEnd();
  30.218 +		if (bi)
  30.219 +		{
  30.220 +			BranchObj *bo=(BranchObj*)(bi->getLMO());
  30.221 +			if (bo)	
  30.222 +				b=bo->getChildPos();
  30.223 +			else 
  30.224 +				return;	
  30.225 +		}
  30.226  		else
  30.227  			b=endPos;
  30.228  	}
  30.229  
  30.230 -
  30.231 -	if (line->line().p1()==a && line->line().p2()==b && !visBranch)
  30.232 -	{
  30.233 -		// update is called from both branches, so only
  30.234 -		// update if something has changed
  30.235 -		return;
  30.236 -	}	
  30.237 -	else
  30.238 -	{
  30.239 -		beginPos=a;
  30.240 -		endPos=b;
  30.241 -		line->setPen (pen);
  30.242 -		line->setLine(a.x(), a.y(), b.x(), b.y());
  30.243 -	}
  30.244 -}
  30.245 -
  30.246 -BranchObj* XLinkObj::otherBranch(BranchObj* thisBranch)
  30.247 -{
  30.248 -	if (!beginBranch && !endBranch)
  30.249 -		return NULL;
  30.250 -	if (thisBranch==beginBranch)
  30.251 -		return endBranch;
  30.252 -	else	
  30.253 -		return beginBranch;
  30.254 +	beginPos=a;
  30.255 +	endPos=b;
  30.256 +	XLinkItem *xli=(XLinkItem*)treeItem;
  30.257 +	pen.setColor ( xli->getColor() );
  30.258 +	pen.setWidth ( xli->getWidth() );
  30.259 +	poly->setBrush (xli->getColor() );
  30.260 +	line->setPen (pen);
  30.261 +	line->setLine(a.x(), a.y(), b.x(), b.y());
  30.262  }
  30.263  
  30.264  void XLinkObj::positionBBox()
  30.265 @@ -253,49 +148,36 @@
  30.266  
  30.267  void XLinkObj::setVisibility ()
  30.268  {
  30.269 -	if (beginBranch && endBranch)
  30.270 +	BranchItem* beginBI=((XLinkItem*)treeItem)->getBegin();
  30.271 +	BranchObj* beginBO=NULL;
  30.272 +	if (beginBI) beginBO=(BranchObj*)(beginBI->getLMO());
  30.273 +
  30.274 +	BranchObj* endBO=NULL;
  30.275 +	BranchItem* endBI=((XLinkItem*)treeItem)->getEnd();
  30.276 +	if (endBI) endBO=(BranchObj*)(endBI->getLMO());
  30.277 +	if (beginBO && endBO)
  30.278  	{
  30.279 -		if(beginBranch->isVisibleObj() && endBranch->isVisibleObj())
  30.280 +		if(beginBO->isVisibleObj() && endBO->isVisibleObj())
  30.281  		{	// Both ends are visible
  30.282  			visBranch=NULL;
  30.283  			setVisibility (true);
  30.284  		} else
  30.285  		{
  30.286 -			if(!beginBranch->isVisibleObj() && !endBranch->isVisibleObj())
  30.287 +			if(!beginBO->isVisibleObj() && !endBO->isVisibleObj())
  30.288  			{	//None of the ends is visible
  30.289  				visBranch=NULL;
  30.290  				setVisibility (false);
  30.291  			} else
  30.292  			{	// Just one end is visible, draw a symbol that shows
  30.293  				// that there is a link to a scrolled branch
  30.294 -				if (beginBranch->isVisibleObj())
  30.295 -					visBranch=beginBranch;
  30.296 +				if (beginBO->isVisibleObj())
  30.297 +					visBranch=beginBI;
  30.298  				else
  30.299 -					visBranch=endBranch;
  30.300 +					visBranch=endBI;
  30.301  				setVisibility (true);
  30.302  			}
  30.303  		}
  30.304  	}
  30.305  }
  30.306  
  30.307 -QString XLinkObj::saveToDir ()
  30.308 -{
  30.309 -	QString s="";
  30.310 -	if (beginBranch && endBranch &&xLinkState==activeXLink)
  30.311 -	{
  30.312 -		if (beginBranch==endBranch && xLinkState)
  30.313 -			s="";
  30.314 -		else
  30.315 -		{
  30.316 -			QString colAttr=attribut ("color",color.name());
  30.317 -			QString widAttr=attribut ("width",QString().setNum(width,10));
  30.318 -			QString begSelAttr=attribut ("beginID",beginBranch->getSelectString());
  30.319 -			QString endSelAttr=attribut ("endID",  endBranch->getSelectString());
  30.320 -			s=beginElement ("xlink", colAttr +widAttr +begSelAttr +endSelAttr);
  30.321  
  30.322 -			s+=endElement ("xlink");
  30.323 -		}
  30.324 -	}
  30.325 -	return s;
  30.326 -}
  30.327 -
    31.1 --- a/xlinkobj.h	Mon Aug 24 14:39:07 2009 +0000
    31.2 +++ b/xlinkobj.h	Thu Sep 03 08:52:00 2009 +0000
    31.3 @@ -1,55 +1,35 @@
    31.4  #ifndef XLINKOBJ_H
    31.5  #define XLINKOBJ_H
    31.6  
    31.7 -#include "linkablemapobj.h"
    31.8 +#include "mapobj.h"
    31.9  
   31.10  class BranchObj;
   31.11 -
   31.12 -enum XLinkState {undefinedXLink,initXLink,activeXLink,deleteXLink};
   31.13 +class BranchItem;
   31.14  
   31.15  /*! \brief xlinks are used to draw arbitrary connections between branches (BranchObj) in the map. */
   31.16  
   31.17  /////////////////////////////////////////////////////////////////////////////
   31.18  class XLinkObj:public MapObj {
   31.19  public:
   31.20 -    XLinkObj ();
   31.21 -    XLinkObj (QGraphicsScene*);
   31.22 +    XLinkObj (QGraphicsScene* scene, TreeItem* ti);
   31.23      ~XLinkObj ();
   31.24      virtual void init ();
   31.25 -    virtual void copy (XLinkObj*);
   31.26 -	void setBegin (BranchObj*);
   31.27 -	BranchObj* getBegin();
   31.28 -	void setEnd   (BranchObj*);
   31.29 -	void setEnd   (QPointF);
   31.30 -	BranchObj* getEnd();
   31.31 -	void setColor(QColor);
   31.32 -	QColor getColor();
   31.33 -	void setWidth (int);
   31.34 -	int getWidth ();
   31.35 -	bool activate ();			// Sets pointers in branchObjects
   31.36 -	void deactivate();			// removes those pointers
   31.37 -	bool isUsed();				// true, if at least on branch uses it
   31.38 +	virtual void setEnd (QPointF);
   31.39  	void updateXLink();
   31.40 -	BranchObj* otherBranch (BranchObj*);
   31.41  	void positionBBox();
   31.42  	void calcBBoxSize();
   31.43  	void setVisibility (bool);
   31.44  	void setVisibility ();
   31.45 -	QString saveToDir ();
   31.46  
   31.47  private:
   31.48  	static int arrowSize;
   31.49  	QPen pen;
   31.50 -	QColor color;
   31.51 -	int width;
   31.52  	QGraphicsLineItem *line;
   31.53  	QGraphicsPolygonItem *poly;
   31.54 -	BranchObj *beginBranch;
   31.55 -	BranchObj *endBranch;
   31.56 -	BranchObj *visBranch;	// the "visible" part of a partially scrolled link
   31.57 -	XLinkState xLinkState;	// init during drawing or active
   31.58  	QPointF beginPos;
   31.59  	QPointF   endPos;
   31.60 +
   31.61 +	BranchItem *visBranch;	// the "visible" part of a partially scrolled li
   31.62  };
   31.63  
   31.64  #endif
    32.1 --- a/xml-vym.cpp	Mon Aug 24 14:39:07 2009 +0000
    32.2 +++ b/xml-vym.cpp	Thu Sep 03 08:52:00 2009 +0000
    32.3 @@ -12,6 +12,7 @@
    32.4  #include "linkablemapobj.h"
    32.5  #include "mainwindow.h"
    32.6  #include "version.h"
    32.7 +#include "xlinkitem.h"
    32.8  
    32.9  static ImageItem *lastImageItem;
   32.10  static MapItem *lastMI;
   32.11 @@ -450,8 +451,8 @@
   32.12  					return false;   // Couldn't read absPos
   32.13  			}           
   32.14  		}           
   32.15 -		//if (!a.value( "id").isEmpty() ) 
   32.16 -		//	lastMI->setID (a.value ("id"));		// FIXME-3
   32.17 +		if (!a.value( "id").isEmpty() ) 
   32.18 +			lastMI->setID (a.value ("id"));		
   32.19  			
   32.20  		if (!a.value( "url").isEmpty() ) 
   32.21  			lastMI->setURL (a.value ("url"));
   32.22 @@ -550,67 +551,39 @@
   32.23  	return true;
   32.24  }
   32.25  
   32.26 -bool parseVYMHandler::readXLinkAttr (const QXmlAttributes& a)
   32.27 +bool parseVYMHandler::readXLinkAttr (const QXmlAttributes& a)	
   32.28  {
   32.29 -	QColor col;
   32.30 -	bool okx;
   32.31 -	bool success=false;
   32.32 -	XLinkObj *xlo=new XLinkObj (model->getScene());
   32.33 -	if (!a.value( "color").isEmpty() ) 
   32.34 -	{
   32.35 -		col.setNamedColor(a.value("color"));
   32.36 -		xlo->setColor (col);
   32.37 -	}
   32.38 -
   32.39 -	if (!a.value( "width").isEmpty() ) 
   32.40 -	{
   32.41 -		xlo->setWidth(a.value ("width").toInt (&okx, 10));
   32.42 -	}
   32.43 -
   32.44 -	// Connecting by select string for compatibility with version < 1.8.76
   32.45 -	if (!a.value( "beginBranch").isEmpty() ) 
   32.46 -	{ 
   32.47 -		if (!a.value( "endBranch").isEmpty() ) 
   32.48 -		{
   32.49 -			TreeItem *ti=model->findBySelectString (a.value( "beginBranch"));
   32.50 -			if (ti && ti->isBranchLikeType())
   32.51 -			{
   32.52 -			/* FIXME-2 xLinks
   32.53 -				xlo->setBegin ((BranchObj*)lmo);
   32.54 -				lmo=model->findBySelectString (a.value( "endBranch"));
   32.55 -				if (lmo && typid (*lmo)==typid (BranchObj))
   32.56 -				{
   32.57 -					xlo->setEnd ((BranchObj*)(lmo));
   32.58 -					xlo->activate();
   32.59 -					success=true;
   32.60 -				}
   32.61 -			*/
   32.62 -			}
   32.63 -		}           
   32.64 -	}	
   32.65 -
   32.66  	// object ID is used starting in version 1.8.76
   32.67 -	/* FIXME-2 xLinks
   32.68 +	// (before there was beginBranch and endBranch)
   32.69  	if (!a.value( "beginID").isEmpty() ) 
   32.70  	{ 
   32.71  		if (!a.value( "endID").isEmpty() ) 
   32.72  		{
   32.73 -			LinkableMapObj *lmo=model->findID (a.value( "beginID"));
   32.74 -			if (lmo && typid (*lmo)==typid (BranchObj))
   32.75 +			TreeItem *beginBI=model->findID (a.value( "beginID"));
   32.76 +			TreeItem   *endBI=model->findID (a.value( "endID"));
   32.77 +			if (beginBI && endBI && beginBI->isBranchLikeType() && endBI->isBranchLikeType() )
   32.78  			{
   32.79 -				xlo->setBegin ((BranchObj*)lmo);
   32.80 -				lmo=model->findID (a.value( "endID"));
   32.81 -				if (lmo && typid (*lmo)==typid (BranchObj))
   32.82 +				XLinkItem *xli=model->createXLink (lastBranch,true);
   32.83 +				xli->setBegin ( (BranchItem*)beginBI );
   32.84 +				xli->setEnd ( (BranchItem*)endBI);
   32.85 +				xli->activate();
   32.86 +
   32.87 +				if (!a.value( "color").isEmpty() ) 
   32.88  				{
   32.89 -					xlo->setEnd ((BranchObj*)(lmo));
   32.90 -					xlo->activate();
   32.91 -					success=true;
   32.92 +					QColor col;
   32.93 +					col.setNamedColor(a.value("color"));
   32.94 +					xli->setColor (col);
   32.95  				}
   32.96 +
   32.97 +				if (!a.value( "width").isEmpty() ) 
   32.98 +				{
   32.99 +					bool okx;
  32.100 +					xli->setWidth(a.value ("width").toInt (&okx, 10));
  32.101 +				}
  32.102 +				xli->updateXLink();
  32.103  			}
  32.104  		}           
  32.105  	}	
  32.106 -	*/
  32.107 -	if (!success) delete (xlo);
  32.108  	return true;	// xLinks can only be established at the "end branch", return true
  32.109  }
  32.110