ItemRelation: new template for making up relations between ResourceItems
The new generic ItemRelation template class replaces ResourceTreeItem's, resulting in cleaner and better organized code. In the future other kind of items can be linked hierarchically using the ItemRelation template.
This commit is contained in:
@@ -113,7 +113,7 @@ void LocalResourceProvider::removeDirectory( const QString & _path )
|
||||
|
||||
void LocalResourceProvider::reloadDirectory( const QString & _path )
|
||||
{
|
||||
ResourceTreeItem * dirTreeItem = NULL;
|
||||
ResourceItem::Relation * dirRelation = NULL;
|
||||
QString p = _path;
|
||||
if( !p.endsWith( QDir::separator() ) )
|
||||
{
|
||||
@@ -125,18 +125,18 @@ void LocalResourceProvider::reloadDirectory( const QString & _path )
|
||||
if( it->type() == ResourceItem::TypeDirectory &&
|
||||
it->fullName() == p )
|
||||
{
|
||||
dirTreeItem = it->treeItem();
|
||||
dirRelation = it->relation();
|
||||
}
|
||||
}
|
||||
|
||||
if( dirTreeItem )
|
||||
if( dirRelation )
|
||||
{
|
||||
ResourceItem * dirItem = dirTreeItem->item();
|
||||
ResourceItem * dirItem = dirRelation->item();
|
||||
if( dirItem )
|
||||
{
|
||||
m_scannedFolders.clear();
|
||||
readDir( dirItem->fullRelativeName(),
|
||||
dirTreeItem->parent() );
|
||||
dirRelation->parent() );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,7 +147,7 @@ void LocalResourceProvider::reloadDirectory( const QString & _path )
|
||||
|
||||
|
||||
void LocalResourceProvider::readDir( const QString & _dir,
|
||||
ResourceTreeItem * _parent )
|
||||
ResourceItem::Relation * _parent )
|
||||
{
|
||||
#ifdef LMMS_BUILD_LINUX
|
||||
if( _dir.startsWith( "/dev" ) ||
|
||||
@@ -162,14 +162,14 @@ void LocalResourceProvider::readDir( const QString & _dir,
|
||||
m_scannedFolders << d.canonicalPath();
|
||||
|
||||
ResourceItem * parentItem;
|
||||
ResourceTreeItem * curParent = _parent->findChild( d.dirName() +
|
||||
ResourceItem::Relation * curParent = _parent->findChild( d.dirName() +
|
||||
QDir::separator(),
|
||||
m_baseDir );
|
||||
printf("read dir: %s\n", d.canonicalPath().toUtf8().constData() );
|
||||
if( curParent )
|
||||
{
|
||||
parentItem = curParent->item();
|
||||
foreachResourceTreeItem( curParent->children() )
|
||||
foreachResourceItemRelation( curParent->children() )
|
||||
{
|
||||
(*it)->setTemporaryMarker( false );
|
||||
}
|
||||
@@ -188,7 +188,7 @@ printf("read dir: %s\n", d.canonicalPath().toUtf8().constData() );
|
||||
parentItem->setLastMod( QFileInfo(
|
||||
d.canonicalPath() ).lastModified() );
|
||||
database()->addItem( parentItem );
|
||||
curParent = new ResourceTreeItem( _parent, parentItem );
|
||||
curParent = new ResourceItem::Relation( _parent, parentItem );
|
||||
curParent->setTemporaryMarker( true );
|
||||
m_watcher.addPath( parentItem->fullName() );
|
||||
}
|
||||
@@ -210,7 +210,7 @@ printf("read dir: %s\n", d.canonicalPath().toUtf8().constData() );
|
||||
{
|
||||
fname += QDir::separator();
|
||||
}
|
||||
ResourceTreeItem * curChild =
|
||||
ResourceItem::Relation * curChild =
|
||||
curParent->findChild( fname, m_baseDir );
|
||||
if( curChild )
|
||||
{
|
||||
@@ -252,20 +252,21 @@ printf("read dir: %s\n", d.canonicalPath().toUtf8().constData() );
|
||||
);
|
||||
newItem->setLastMod( f.lastModified() );
|
||||
database()->addItem( newItem );
|
||||
ResourceTreeItem * rti =
|
||||
new ResourceTreeItem( curParent,
|
||||
ResourceItem::Relation * relation =
|
||||
new ResourceItem::Relation( curParent,
|
||||
newItem );
|
||||
rti->setTemporaryMarker( true );
|
||||
relation->setTemporaryMarker( true );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for( ResourceTreeItemList::Iterator it = curParent->children().begin();
|
||||
it != curParent->children().end(); )
|
||||
for( ResourceItem::Relation::List::Iterator it =
|
||||
curParent->children().begin();
|
||||
it != curParent->children().end(); )
|
||||
{
|
||||
if( (*it)->temporaryMarker() == false )
|
||||
{
|
||||
ResourceTreeItem * item = *it;
|
||||
ResourceItem::Relation * item = *it;
|
||||
it = curParent->children().erase( it );
|
||||
database()->recursiveRemoveItems( item );
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ void ResourceDB::load( const QString & _file )
|
||||
|
||||
multimediaProject m( _file );
|
||||
|
||||
loadTreeItem( &m_topLevelNode, m.content() );
|
||||
loadRelation( &m_topLevelNode, m.content() );
|
||||
}
|
||||
|
||||
|
||||
@@ -114,7 +114,7 @@ void ResourceDB::save( const QString & _file )
|
||||
|
||||
if( m_topLevelNode.getChild( 0 ) )
|
||||
{
|
||||
saveTreeItem( m_topLevelNode.getChild( 0 ), m, m.content() );
|
||||
saveRelation( m_topLevelNode.getChild( 0 ), m, m.content() );
|
||||
}
|
||||
|
||||
m.writeFile( _file );
|
||||
@@ -123,14 +123,14 @@ void ResourceDB::save( const QString & _file )
|
||||
|
||||
|
||||
|
||||
void ResourceDB::saveTreeItem( const ResourceTreeItem * _i,
|
||||
QDomDocument & _doc,
|
||||
QDomElement & _de )
|
||||
void ResourceDB::saveRelation( const ResourceItem::Relation * _i,
|
||||
QDomDocument & _doc,
|
||||
QDomElement & _de )
|
||||
{
|
||||
QDomElement e = _i->item() ? _doc.createElement( "item" ) : _de;
|
||||
foreachConstResourceTreeItem( _i->children() )
|
||||
foreachConstResourceItemRelation( _i->children() )
|
||||
{
|
||||
saveTreeItem( *it, _doc, e );
|
||||
saveRelation( *it, _doc, e );
|
||||
}
|
||||
if( _i->item() )
|
||||
{
|
||||
@@ -152,7 +152,7 @@ void ResourceDB::saveTreeItem( const ResourceTreeItem * _i,
|
||||
|
||||
|
||||
|
||||
void ResourceDB::loadTreeItem( ResourceTreeItem * _i, QDomElement & _de )
|
||||
void ResourceDB::loadRelation( ResourceItem::Relation * _i, QDomElement & _de )
|
||||
{
|
||||
QDomNode node = _de.firstChild();
|
||||
while( !node.isNull() )
|
||||
@@ -177,12 +177,13 @@ void ResourceDB::loadTreeItem( ResourceTreeItem * _i, QDomElement & _de )
|
||||
Qt::ISODate )
|
||||
);
|
||||
addItem( item );
|
||||
ResourceTreeItem * treeItem = new ResourceTreeItem( _i, item );
|
||||
ResourceItem::Relation * relation =
|
||||
new ResourceItem::Relation( _i, item );
|
||||
if( item->type() == ResourceItem::TypeDirectory )
|
||||
{
|
||||
emit directoryItemAdded( item->fullName() );
|
||||
}
|
||||
loadTreeItem( treeItem, e );
|
||||
loadRelation( relation, e );
|
||||
}
|
||||
}
|
||||
node = node.nextSibling();
|
||||
@@ -279,11 +280,11 @@ void ResourceDB::addItem( ResourceItem * newItem )
|
||||
ResourceItem * oldItem = m_items[hash];
|
||||
if( oldItem )
|
||||
{
|
||||
ResourceTreeItem * oldTreeItem = oldItem->treeItem();
|
||||
if( oldTreeItem )
|
||||
ResourceItem::Relation * oldRelation = oldItem->relation();
|
||||
if( oldRelation )
|
||||
{
|
||||
recursiveRemoveItems( oldTreeItem, false );
|
||||
delete oldTreeItem;
|
||||
recursiveRemoveItems( oldRelation, false );
|
||||
delete oldRelation;
|
||||
}
|
||||
if( oldItem->type() == ResourceItem::TypeDirectory )
|
||||
{
|
||||
@@ -298,8 +299,8 @@ void ResourceDB::addItem( ResourceItem * newItem )
|
||||
|
||||
|
||||
|
||||
void ResourceDB::recursiveRemoveItems( ResourceTreeItem * parent,
|
||||
bool removeTopLevelParent )
|
||||
void ResourceDB::recursiveRemoveItems( ResourceItem::Relation * parent,
|
||||
bool removeTopLevelParent )
|
||||
{
|
||||
if( !parent )
|
||||
{
|
||||
|
||||
@@ -55,7 +55,7 @@ ResourceItem::ResourceItem( ResourceProvider * _provider,
|
||||
m_size( _size ),
|
||||
m_lastMod( _last_mod ),
|
||||
m_tags( _tags ),
|
||||
m_treeItem( NULL )
|
||||
m_relation( NULL )
|
||||
{
|
||||
init();
|
||||
}
|
||||
@@ -76,7 +76,7 @@ ResourceItem::ResourceItem( const ResourceItem & _item ) :
|
||||
m_size( _item.m_size ),
|
||||
m_lastMod( _item.m_lastMod ),
|
||||
m_tags( _item.m_tags ),
|
||||
m_treeItem( NULL )
|
||||
m_relation( NULL )
|
||||
{
|
||||
init();
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ ResourceModel::ResourceModel( ResourceDB * _db, QObject * _parent ) :
|
||||
{
|
||||
setSupportedDragActions( Qt::CopyAction );
|
||||
|
||||
connect( m_db, SIGNAL( itemsChanged() ),
|
||||
connect( db(), SIGNAL( itemsChanged() ),
|
||||
this, SIGNAL( itemsChanged() ) );
|
||||
}
|
||||
|
||||
@@ -49,11 +49,11 @@ QVariant ResourceModel::data( const QModelIndex & _idx, int _role ) const
|
||||
|
||||
if( _idx.isValid() )
|
||||
{
|
||||
ResourceTreeItem * treeItem = this->treeItem( _idx );
|
||||
ResourceItem * item = treeItem->item();
|
||||
ResourceItem::Relation * relation = this->relation( _idx );
|
||||
ResourceItem * item = relation->item();
|
||||
if( _role == Qt::DisplayRole )
|
||||
{
|
||||
if( treeItem->parent() == m_db->topLevelNode() )
|
||||
if( relation->parent() == db()->topLevelNode() )
|
||||
{
|
||||
switch( item->baseDir() )
|
||||
{
|
||||
@@ -71,7 +71,7 @@ QVariant ResourceModel::data( const QModelIndex & _idx, int _role ) const
|
||||
}
|
||||
else if( _role == Qt::DecorationRole )
|
||||
{
|
||||
if( treeItem->parent() == m_db->topLevelNode() )
|
||||
if( relation->parent() == db()->topLevelNode() )
|
||||
{
|
||||
switch( item->baseDir() )
|
||||
{
|
||||
@@ -216,7 +216,7 @@ QMimeData * ResourceModel::mimeData( const QModelIndexList & _list ) const
|
||||
|
||||
int ResourceModel::totalItems() const
|
||||
{
|
||||
const ResourceDB::ItemHashMap & items = m_db->items();
|
||||
const ResourceDB::ItemHashMap & items = db()->items();
|
||||
int num = 0;
|
||||
foreach( const ResourceItem * i, items )
|
||||
{
|
||||
@@ -233,7 +233,7 @@ int ResourceModel::totalItems() const
|
||||
|
||||
int ResourceModel::shownItems() const
|
||||
{
|
||||
const ResourceDB::ItemHashMap & items = m_db->items();
|
||||
const ResourceDB::ItemHashMap & items = db()->items();
|
||||
int num = 0;
|
||||
foreach( const ResourceItem * i, items )
|
||||
{
|
||||
|
||||
@@ -1,156 +0,0 @@
|
||||
/*
|
||||
* ResourceTreeItem.cpp - implementation of ResourceTreeItem
|
||||
*
|
||||
* Copyright (c) 2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
||||
*
|
||||
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this program (see COPYING); if not, write to the
|
||||
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <QtCore/QHash>
|
||||
|
||||
#include "ResourceTreeItem.h"
|
||||
|
||||
|
||||
ResourceTreeItem::ResourceTreeItem( ResourceTreeItem * _parent,
|
||||
ResourceItem * _item ) :
|
||||
m_parent( _parent ),
|
||||
m_temporaryMarker( false ),
|
||||
m_item( _item )
|
||||
{
|
||||
if( m_parent )
|
||||
{
|
||||
m_parent->addChild( this );
|
||||
}
|
||||
if( m_item )
|
||||
{
|
||||
m_item->setTreeItem( this );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
ResourceTreeItem::~ResourceTreeItem()
|
||||
{
|
||||
foreachResourceTreeItem( m_children )
|
||||
{
|
||||
delete *it;
|
||||
}
|
||||
if( m_item )
|
||||
{
|
||||
m_item->setTreeItem( NULL );
|
||||
}
|
||||
if( m_parent )
|
||||
{
|
||||
m_parent->removeChild( this );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int ResourceTreeItem::rowCount( const ResourceModel * _model ) const
|
||||
{
|
||||
int rc = 0;
|
||||
foreachConstResourceTreeItem( m_children )
|
||||
{
|
||||
if( !(*it)->item()->isHidden( _model ) )
|
||||
{
|
||||
++rc;
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
ResourceTreeItem * ResourceTreeItem::getChild( int _row,
|
||||
const ResourceModel * _model )
|
||||
{
|
||||
int rc = 0;
|
||||
foreachResourceTreeItem( m_children )
|
||||
{
|
||||
if( !(*it)->item()->isHidden( _model ) )
|
||||
{
|
||||
if( rc == _row )
|
||||
{
|
||||
return *it;
|
||||
}
|
||||
++rc;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int ResourceTreeItem::row( const ResourceModel * _model ) const
|
||||
{
|
||||
if( !m_parent )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int row = 0;
|
||||
foreachConstResourceTreeItem( m_parent->m_children )
|
||||
{
|
||||
if( !(*it)->item()->isHidden( _model ) )
|
||||
{
|
||||
if( *it == this )
|
||||
{
|
||||
return row;
|
||||
}
|
||||
++row;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
ResourceTreeItem * ResourceTreeItem::findChild(
|
||||
const QString & _name,
|
||||
ResourceItem::BaseDirectory _base_dir )
|
||||
{
|
||||
if( _name.isNull() || _name.isEmpty() )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const int hash = qHash( _name );
|
||||
|
||||
foreachResourceTreeItem( m_children )
|
||||
{
|
||||
ResourceTreeItem * rti = *it;
|
||||
if( rti->item() &&
|
||||
rti->item()->nameHash() == hash &&
|
||||
rti->item()->name() == _name &&
|
||||
rti->item()->baseDir() == _base_dir )
|
||||
{
|
||||
return rti;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ int ResourceTreeModel::rowCount( const QModelIndex & _parent ) const
|
||||
{
|
||||
return db()->topLevelNode()->rowCount( this );
|
||||
}
|
||||
return treeItem( _parent )->rowCount( this );
|
||||
return relation( _parent )->rowCount( this );
|
||||
}
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ QModelIndex ResourceTreeModel::index( int _row, int _col,
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
ResourceTreeItem * parentItem;
|
||||
ResourceItem::Relation * parentItem;
|
||||
|
||||
if( !_parent.isValid() )
|
||||
{
|
||||
@@ -71,7 +71,7 @@ QModelIndex ResourceTreeModel::index( int _row, int _col,
|
||||
}
|
||||
else
|
||||
{
|
||||
parentItem = treeItem( _parent );
|
||||
parentItem = relation( _parent );
|
||||
}
|
||||
|
||||
if( _row < parentItem->rowCount( this ) )
|
||||
@@ -91,8 +91,8 @@ QModelIndex ResourceTreeModel::parent( const QModelIndex & _idx ) const
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
ResourceTreeItem * childItem = treeItem( _idx );
|
||||
ResourceTreeItem * parentItem = childItem->parent();
|
||||
ResourceItem::Relation * childItem = relation( _idx );
|
||||
ResourceItem::Relation * parentItem = childItem->parent();
|
||||
if( parentItem == db()->topLevelNode() )
|
||||
{
|
||||
return QModelIndex();
|
||||
@@ -123,7 +123,7 @@ void ResourceTreeModel::setFilter( const QString & _s )
|
||||
|
||||
|
||||
|
||||
bool ResourceTreeModel::filterItems( ResourceTreeItem * _item,
|
||||
bool ResourceTreeModel::filterItems( ResourceItem::Relation * _item,
|
||||
const QModelIndex & _parent,
|
||||
const QStringList & _keywords )
|
||||
{
|
||||
@@ -152,8 +152,7 @@ bool ResourceTreeModel::filterItems( ResourceTreeItem * _item,
|
||||
|
||||
int row = 0;
|
||||
bool hide = true;
|
||||
for( ResourceTreeItemList::Iterator it = _item->children().begin();
|
||||
it != _item->children().end(); ++it )
|
||||
foreachResourceItemRelation( _item->children() )
|
||||
{
|
||||
QModelIndex idx = createIndex( row, 0, *it );
|
||||
if( filterItems( *it, idx , _keywords ) )
|
||||
@@ -170,16 +169,14 @@ bool ResourceTreeModel::filterItems( ResourceTreeItem * _item,
|
||||
|
||||
|
||||
|
||||
void ResourceTreeModel::setHidden( ResourceTreeItem * _item,
|
||||
void ResourceTreeModel::setHidden( ResourceItem::Relation * _item,
|
||||
const QModelIndex & _parent,
|
||||
bool _hide, bool _recursive )
|
||||
{
|
||||
if( _recursive )
|
||||
{
|
||||
int row = 0;
|
||||
for( ResourceTreeItemList::Iterator it =
|
||||
_item->children().begin();
|
||||
it != _item->children().end(); ++it )
|
||||
foreachResourceItemRelation( _item->children() )
|
||||
{
|
||||
setHidden( *it, createIndex( row, 0, *it ), _hide );
|
||||
++row;
|
||||
|
||||
@@ -51,7 +51,7 @@ UnifiedResourceProvider::~UnifiedResourceProvider()
|
||||
|
||||
void UnifiedResourceProvider::addDatabase( ResourceDB * _db )
|
||||
{
|
||||
ResourceTreeItem * childRoot = _db->topLevelNode()->getChild( 0 );
|
||||
ResourceItem::Relation * childRoot = _db->topLevelNode()->getChild( 0 );
|
||||
if( childRoot )
|
||||
{
|
||||
m_mergedDatabases << _db;
|
||||
|
||||
@@ -93,14 +93,14 @@ void WebResourceProvider::finishDownload( int _id, bool a )
|
||||
|
||||
|
||||
// create a recursive tree from flat items and their path property
|
||||
ResourceTreeItem * WebResourceProvider::addTreeItem(
|
||||
ResourceTreeItem * _parent,
|
||||
ResourceItem::Relation * WebResourceProvider::addRelation(
|
||||
ResourceItem::Relation * _parent,
|
||||
ResourceItem * _item )
|
||||
{
|
||||
if( _parent == database()->topLevelNode() ||
|
||||
_item->path().isEmpty() )
|
||||
{
|
||||
return new ResourceTreeItem( _parent, _item );
|
||||
return new ResourceItem::Relation( _parent, _item );
|
||||
}
|
||||
|
||||
const QStringList itemPath = _item->path().split( '/' );
|
||||
@@ -114,23 +114,22 @@ ResourceTreeItem * WebResourceProvider::addTreeItem(
|
||||
const int parentPathSize = parentPath.count( '/' );
|
||||
if( parentPathSize+1 >= itemPath.size() )
|
||||
{
|
||||
if( _item->path() == parentPath )
|
||||
// if( _item->path() == parentPath )
|
||||
{
|
||||
return new ResourceTreeItem( _parent, _item );
|
||||
return new ResourceItem::Relation( _parent, _item );
|
||||
}
|
||||
else
|
||||
/* else
|
||||
{
|
||||
// something went wrong
|
||||
return new ResourceTreeItem( _parent, _item );
|
||||
}
|
||||
return new ResourceItem::Relation( _parent, _item );
|
||||
}*/
|
||||
}
|
||||
|
||||
pathComponent = itemPath[parentPathSize] + "/";
|
||||
}
|
||||
|
||||
ResourceTreeItem * subParent =
|
||||
_parent->findChild( pathComponent,
|
||||
ResourceItem::BaseURL );
|
||||
ResourceItem::Relation * subParent =
|
||||
_parent->findChild( pathComponent, ResourceItem::BaseURL );
|
||||
if( subParent == NULL )
|
||||
{
|
||||
ResourceItem * dirItem =
|
||||
@@ -140,16 +139,16 @@ ResourceTreeItem * WebResourceProvider::addTreeItem(
|
||||
ResourceItem::BaseURL,
|
||||
parentPath );
|
||||
database()->addItem( dirItem );
|
||||
subParent = new ResourceTreeItem( _parent, dirItem );
|
||||
subParent = new ResourceItem::Relation( _parent, dirItem );
|
||||
}
|
||||
return addTreeItem( subParent, _item );
|
||||
return addRelation( subParent, _item );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void WebResourceProvider::importNodeIntoDB( const QDomNode & _n,
|
||||
ResourceTreeItem * _parent )
|
||||
ResourceItem::Relation * _parent )
|
||||
{
|
||||
QDomNode n = _n;
|
||||
while( !n.isNull() )
|
||||
@@ -178,10 +177,10 @@ void WebResourceProvider::importNodeIntoDB( const QDomNode & _n,
|
||||
n.firstChildElement( "size" ).text().toInt() );
|
||||
database()->addItem( item );
|
||||
|
||||
ResourceTreeItem * treeItem = addTreeItem( _parent, item );
|
||||
ResourceItem::Relation * relation = addRelation( _parent, item );
|
||||
if( n.nodeName() != "file" )
|
||||
{
|
||||
importNodeIntoDB( n.firstChild(), treeItem );
|
||||
importNodeIntoDB( n.firstChild(), relation );
|
||||
}
|
||||
n = n.nextSibling();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user