CVS sync.
authorAndrey Paskal <apaskal@gmail.com>
Tue, 23 Dec 2008 14:16:11 +0000 (17:16 +0300)
committerAndrey Paskal <apaskal@gmail.com>
Tue, 23 Dec 2008 14:16:11 +0000 (17:16 +0300)
Original comment:new metadata system making

17 files changed:
src/lib/metadata/ametadata.cpp
src/lib/metadata/ametadata.h
src/lib/metadata/ametadataio.h
src/lib/metadata/ametadataioxml.cpp
src/lib/metadata/ametadataioxml.h
src/lib/metadata/ametadocument.cpp
src/lib/metadata/ametadocument.h
src/lib/metadata/ametafield.cpp
src/lib/metadata/ametafield.h
src/lib/metadata/ametaform.cpp
src/lib/metadata/ametaform.h
src/lib/metadata/ametaobject.cpp
src/lib/metadata/ametaobject.h
src/lib/metadata/ametaobjectgroup.cpp
src/lib/metadata/ametaobjectgroup.h
src/test/testametadata.cpp
src/test/testametadata.h

index 8bf566e..e819efa 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametadata.cpp,v 1.3 2008/12/14 10:53:02 leader Exp $
+** $Id: ametadata.cpp,v 1.5 2008/12/20 21:17:49 leader Exp $
 **
 ** Code file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
@@ -39,7 +39,7 @@ AMetaData AMetaData_default;
  *
  */
 AMetaData::AMetaData()
-:AMetaObjectGroup( "MetaData", (AMetaObjectGroup *) 0 )
+:AMetaGroup( "MetaData", 0 )
 {
 /*
     int i = qRegisterMetaType<AMetaDataInfo>("AMetaDataInfo");
@@ -54,6 +54,17 @@ int id = QMetaType::type("AMetaDataInfo");
      myClassPtr = 0;
  }
 */
+    addChild( &v_info );
+    addChild( &v_global );
+
+    addChild( &v_catalogues );
+    addChild( &v_documents );
+    addChild( &v_reports );
+    addChild( &v_journals );
+    addChild( &v_inforegisters );
+    addChild( &v_accregisters );
+
+//    addChild( &v_info );
 }
 
 
index 4a2fcf9..b4b18a2 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametadata.h,v 1.3 2008/12/14 10:53:02 leader Exp $
+** $Id: ametadata.h,v 1.4 2008/12/20 21:17:49 leader Exp $
 **
 ** Header file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
@@ -36,6 +36,7 @@
 
 #include "ametaobject.h"
 #include "ametaobjectgroup.h"
+#include "ametadocument.h"
 
 
 #ifdef __BORLANDC__
@@ -66,7 +67,7 @@
  *     Наследует QObject.
  *\_ru
  */
-class AMetaData: public AMetaObjectGroup
+class AMetaData: public AMetaGroup
 {
 Q_OBJECT
 //Q_PROPERTY( AMetaDataInfo info READ info SCRIPTABLE true )
index f515e92..1e904b8 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametadataio.h,v 1.3 2008/12/15 22:22:48 leader Exp $
+** $Id: ametadataio.h,v 1.4 2008/12/19 20:15:50 leader Exp $
 **
 ** Header file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
@@ -42,7 +42,7 @@ public:
     virtual int write( const QString &name, AMetaData *md = 0);
     virtual QObject *createObject( const QString &name ); 
     //virtual void storeGroup( AMetaObjectGroup *g );
-    virtual void storeGroupBegin( AMetaObjectGroup *g );
+//    virtual void storeGroupBegin( AMetaObjectGroup *g );
 
 signals:
     void message( int msg_class, const QString & msg );
index 29d0e72..3012b8f 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametadataioxml.cpp,v 1.2 2008/12/13 22:19:15 leader Exp $
+** $Id: ametadataioxml.cpp,v 1.5 2008/12/20 21:17:49 leader Exp $
 **
 ** Code file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
@@ -285,22 +285,29 @@ AMetaDataIOXML::write(  const QString &name, AMetaData *md )
     QFile file( name );
 
     if ( !md ) md = AMetaData::metadata();
-//    QDomDocument xml("ananas4_configuration");
     QDomNode cur, sub;
     QDomElement node, rootnode, cfginfo, mdelement, iface, actions;
 
     xml.setContent(QString("<?xml version = '1.0' encoding = 'UTF-8'?>\n"));
     xml.appendChild( xml.implementation().createDocumentType("ananas_configuration",
                      QString::null,"ananas-cfg.dtd"));
-    rootnode = xml.createElement( md_root );
+    rootnode = AMetaObjectToXML( md );
+//xml.createElement( md_root );
     xml.appendChild( rootnode );
     rootnode = xml.documentElement();
 
+//    rootnode.appendChild( AMetaObjectToXML( md ) );
+/*    
     rootnode.appendChild( AMetaObjectToXML( md->info() ) );
     rootnode.appendChild( AMetaObjectToXML( md->global() ) );
 
-
-    node     = xml.createElement( md_info );
+    int i;
+    for ( i = 0; i< md->groupCount(); i++ ){
+        node     = xml.createElement( md->group( i )->name() );
+        rootnode.appendChild( node );
+    }
+*/
+/*    node     = xml.createElement( md_info );
     rootnode.appendChild( node );
 
 
@@ -312,7 +319,7 @@ AMetaDataIOXML::write(  const QString &name, AMetaData *md )
 
     node     = xml.createElement( md_actions );
     rootnode.appendChild( node );
-
+*/
 
     if ( !file.open( QIODevice::WriteOnly ) ) return 1;
     QTextStream ts( &file );
@@ -331,6 +338,7 @@ AMetaDataIOXML::XMLToAMetaObject( QDomElement e, AMetaObject *o )
     QDomNode cur;
     QString s, t;
     int id;
+    QVariant v;
 
        cur = e.firstChild();
        while (!cur.isNull()) {
@@ -340,9 +348,12 @@ AMetaDataIOXML::XMLToAMetaObject( QDomElement e, AMetaObject *o )
                 id = se.attribute( mda_id ).toInt();
                 o->setId( id );
             }
-            s = se.text();
-// qDebug() << se.tagName() << ":" << s;
-            if ( !s.isNull() ) o->setText( se.tagName(), s );
+            if ( se.hasAttribute( "type" ) ) {
+              t = se.attribute("type");
+              v.clear();
+              v = se.text();
+              if ( v.convert( QVariant::nameToType( t ) ) ) o->setAttr( se.tagName(), v );
+            }
             cur = cur.nextSibling();
        }
 
@@ -357,15 +368,26 @@ AMetaDataIOXML::AMetaObjectToXML( AMetaObject *o )
     QDomElement e, se;
 
     e = xml.createElement( o->className() );
-    for ( i=0; i< o->textCount(); i++ ){
-       se = xml.createElement( o->textName( i ) );
-       se.appendChild( xml.createTextNode( o->text( i ) ) );
+    if ( !o->inherits("AMetaObjectGroup") ){
+      if ( !o->name().isEmpty() ) {
+          e.setAttribute("name", o->name() );
+          if ( o->id() > 0 ) e.setAttribute("id", QString::number(o->id()) );
+      }
+    }
+    for ( i=0; i< o->attrCount(); i++ ){
+       se = xml.createElement( o->attrName( i ) );
+       se.setAttribute("type", o->attr( i ).typeName() );
+       se.appendChild( xml.createTextNode( o->attr( i ).toString() ) );
        e.appendChild( se );
     }
+    for ( i=0; i< o->childCount(); i++ ){
+        e.appendChild( AMetaObjectToXML( o->child( i ) ) );
+    }
     return e;
 }
 
 
+
 QString 
 AMetaDataIOXML::text()
 {
index bae4f59..590f1e4 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametadataioxml.h,v 1.2 2008/12/13 22:19:15 leader Exp $
+** $Id: ametadataioxml.h,v 1.4 2008/12/20 21:17:49 leader Exp $
 **
 ** Header file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
index 0de6592..b7678c5 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametadocument.cpp,v 1.1 2008/12/15 22:22:48 leader Exp $
+** $Id: ametadocument.cpp,v 1.2 2008/12/20 21:17:49 leader Exp $
 **
 ** Code file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
  * \class AMetaDocument
  *
  */
-AMetaDocument::AMetaDocument()
-:AMetaObject("Document")
+AMetaDocument::AMetaDocument( AMetaObject *parent )
+:AMetaObject("Document", "", parent )
 {
+    setId( lastId() );
+    setName( QString("%1_%2").arg( tr("Document") ).arg( id() ) );
+    addChild( &v_fields );
+    addChild( &v_tables );
+    addChild( &v_forms );
+
 }
 
 
@@ -59,3 +65,16 @@ AMetaDocument::forms()
 {
     return &v_forms;
 }
+
+
+
+/*!
+ * \class ADocumentsGroup
+ *
+ */
+ADocumentsGroup::ADocumentsGroup()
+:AMetaGroup("Documents")
+{
+
+}
+
index 91ff5e8..9b10a54 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametadocument.h,v 1.1 2008/12/15 22:22:48 leader Exp $
+** $Id: ametadocument.h,v 1.2 2008/12/20 21:17:49 leader Exp $
 **
 ** Header file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
 #include "ametaobject.h"
 #include "ametaobjectgroup.h"
 #include "ametafield.h"
+#include "ametaform.h"
 
 
 class AMetaDocument: public AMetaObject
 {
 Q_OBJECT
 public:
-    AMetaDocument();
+    AMetaDocument( AMetaObject *parent = 0 );
 
 public slots:
     AMetaFields      *fields();
@@ -53,4 +54,23 @@ private:
     AMetaForms       v_forms;
 };
 
+
+
+class ADocumentsGroup: public AMetaGroup
+{
+Q_OBJECT
+public:
+    ADocumentsGroup();
+
+    AMetaDocument *newDocument(){ return new AMetaDocument( this );};
+    AMetaDocument *document( const QString &name ){ return (AMetaDocument*) child( name );};
+    AMetaDocument *document( int idx ){ return (AMetaDocument*) child( idx );};
+    int documentCount(){ return childCount(); };
+
+public slots:
+    QString test(){ return QString("DOCUMENTS TEST STRING");};
+
+
+};
+
 #endif
index e979278..590a3f2 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametafield.cpp,v 1.1 2008/12/15 22:22:48 leader Exp $
+** $Id: ametafield.cpp,v 1.2 2008/12/20 21:17:49 leader Exp $
 **
 ** Code file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
  * \class AMetaField
  *
  */
-AMetaField::AMetaField()
-:AMetaObject("MetaField")
+AMetaField::AMetaField( AMetaObject *parent )
+:AMetaObject("MetaField","", parent )
 {
+    setId( lastId() );
+    setName( QString("%1_%2").arg( tr("Field") ).arg( id() ) );
     setFieldType( Unknown );
     setFieldSubType( 0 );
     setWidth( 0 );
@@ -47,8 +49,9 @@ AMetaField::AMetaField()
 }
 
 
-AMetaField::AMetaField( FieldTypes t, int st, int w, int d, bool notnul, bool notneg, bool calcsum )
-:AMetaObject("MetaField")
+/*
+AMetaField::AMetaField( FieldTypes t, int st, int w, int d, bool notnul, bool notneg, bool calcsum,  )
+:AMetaObject("MetaField", "", parent )
 {
     setFieldType( t );
     setFieldSubType( st );
@@ -58,7 +61,7 @@ AMetaField::AMetaField( FieldTypes t, int st, int w, int d, bool notnul, bool no
     setNotNegative( notneg );
     setCalcSumm( calcsum );
 }
-
+*/
 
 int 
 AMetaField::fieldType()
@@ -169,7 +172,7 @@ AMetaField::setCalcSumm( bool f )
  *
  */
 AMetaFields::AMetaFields()
-:AMetaObjectGroup("MetaFields")
+:AMetaGroup("MetaFields")
 {
 
 }
index 9e3c5e6..f27d130 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametafield.h,v 1.1 2008/12/15 22:22:48 leader Exp $
+** $Id: ametafield.h,v 1.2 2008/12/20 21:17:49 leader Exp $
 **
 ** Header file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
@@ -49,12 +49,12 @@ Q_PROPERTY( bool calcsumm     READ calcSumm     SCRIPTABLE true )
 
 public:
     enum FieldTypes { Unknown, Char, String, Number, Date, Object, Document, Catalogue };
-    AMetaField();
+    AMetaField( AMetaObject *parent = 0 );
 
-    AMetaField( FieldTypes t, int st = 0, int w = 0, 
+/*    AMetaField( FieldTypes t, int st = 0, int w = 0, 
                 int d = 0, bool notnul = false, bool notneg = false, 
                 bool calcsum = false );
-
+*/
     int fieldType();
     void setFieldType( FieldTypes t );
 
@@ -81,11 +81,15 @@ private:
 };
 
 
-class AMetaFields: public AMetaObjectGroup
+class AMetaFields: public AMetaGroup
 {
 Q_OBJECT
 public:
     AMetaFields();
+    AMetaField * newField(){ return new AMetaField( this );};
+    AMetaField *field( const QString &name ){ return (AMetaField*) child( name );};
+    AMetaField *field( int idx ){ return (AMetaField*) child( idx );};
+    int fieldCount(){ return childCount(); };
 
 public slots:
 
index 4f98592..23bded5 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametaform.cpp,v 1.1 2008/12/15 22:22:48 leader Exp $
+** $Id: ametaform.cpp,v 1.2 2008/12/20 21:17:49 leader Exp $
 **
 ** Code file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
@@ -38,3 +38,14 @@ AMetaForm::AMetaForm()
 :AMetaObject("MetaForm")
 {
 }
+
+
+/*!
+ * \class AMetaForms
+ *
+ */
+AMetaForms::AMetaForms()
+:AMetaGroup("MetaForms")
+{
+
+}
index 0436d21..65f4997 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametaform.h,v 1.1 2008/12/15 22:22:48 leader Exp $
+** $Id: ametaform.h,v 1.2 2008/12/20 21:17:49 leader Exp $
 **
 ** Header file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
@@ -42,4 +42,16 @@ private:
     
 };
 
+
+class AMetaForms: public AMetaGroup
+{
+Q_OBJECT
+public:
+    AMetaForms();
+
+public slots:
+
+
+};
+
 #endif
index 7f19273..d4952de 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametaobject.cpp,v 1.2 2008/12/15 22:22:48 leader Exp $
+** $Id: ametaobject.cpp,v 1.5 2008/12/20 21:17:49 leader Exp $
 **
 ** Code file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
@@ -34,6 +34,7 @@
 #include <qstringlist.h>
 #include <QTextStream>
 #include <QDomDocument>
+#include <QMutex>
 
 #include "ametaobject.h"
 #include "ametaobjectgroup.h"
  *     Наследует QObject.
  *\_ru
  */
+int AMetaObject::v_lastId = 101;
 
 AMetaObject::AMetaObject(const QString &objectclass, 
                      const QString &objectname, 
-                     AMetaObjectGroup *parent)
+                     AMetaObject *parent)
 :QObject( parent )
 {
     setObjectName( objectname );
     setClassName( objectclass );
     setDescription("");
+    setId( 0 );
+    if ( parent ) parent->addChild( this );
+//    if ( !this->inherits("AMetaObjectGroup") ) setId( lastId() );
 }
 
 
+AMetaObject::~AMetaObject()
+{
+    AMetaObject *p = ( AMetaObject *) parent();
+    if ( p && p->inherits("AMetaObject") ) p->removeChild( this );
+}
+
+
+
 Q_ULONG 
 AMetaObject::id()
 {
@@ -98,65 +111,62 @@ AMetaObject::name()
 }
 
 
-QString 
-AMetaObject::description()
+AMetaObject *
+AMetaObject::rootObject()
 {
-    return text("description");
+    AMetaObject *o = parentMetaObject();
+    while ( o->parentMetaObject() ) o = o->parentMetaObject();
+    if ( !o->inherits("AMetaData" ) ) o = 0;
+    return o;
 }
 
-void 
-AMetaObject::setDescription( const QString &descr )
-{
-    setText( "description", descr );
-}
 
 
-void 
-AMetaObject::setAttr( const QString &name, const QVariant &value )
+AMetaObject *
+AMetaObject::parentMetaObject()
 {
-    if ( value.isNull() && attrExists( name ) ) v_attr.remove( name );
-    else v_attr[ name ] = value;
+    AMetaObject *p = (AMetaObject *) parent();
+    if ( !p ) p = v_parent;
+    else if ( !p->inherits("AMetaObject") ) p = 0;
+    return p;
 }
 
 
 
 void 
-AMetaObject::setText( const QString &name, const QString &text )
+AMetaObject::setParentMetaObject( AMetaObject * parent )
 {
-    if ( text.isNull() && textExists( name ) ) v_text.remove( name );
-    else v_text[ name ] = text;
+    v_parent = parent;
 }
 
 
-void 
-AMetaObject::setRawdata( const QString &name, const QByteArray &data )
+
+QString 
+AMetaObject::description()
 {
-    if ( data.isNull() && rawdataExists( name ) ) v_rawdata.remove( name );
-    else v_rawdata[ name ] = data;
+    return v_description;
 }
 
-
-
-QVariant
-AMetaObject::attr( const QString &name ) const
+void 
+AMetaObject::setDescription( const QString &descr )
 {
-    return v_attr.value( name, QVariant() );
+    v_description = descr;
 }
 
 
-
-QString 
-AMetaObject::text( const QString &name ) const
+void 
+AMetaObject::setAttr( const QString &name, const QVariant &value )
 {
-    return v_text.value( name, QString::null );
+    if ( value.isNull() && attrExists( name ) ) v_attr.remove( name );
+    else v_attr[ name ] = value;
 }
 
 
 
-QByteArray 
-AMetaObject::rawdata( const QString &name ) const
+QVariant
+AMetaObject::attr( const QString &name ) const
 {
-    return v_rawdata.value( name, QByteArray() );
+    return v_attr.value( name, QVariant() );
 }
 
 
@@ -170,91 +180,94 @@ AMetaObject::attr( int idx ) const
 
 
 QString 
-AMetaObject::text( int idx ) const
+AMetaObject::attrName( int idx ) const
 {
-    return text( textName( idx ) );
+    if ( idx < 0 || idx >= attrCount() ) return QString::null;
+    return v_attr.keys().at( idx );
 }
 
 
 
-QByteArray 
-AMetaObject::rawdata( int idx ) const
+bool 
+AMetaObject::attrExists( const QString &name )
 {
-    return rawdata( rawdataName( idx ) );
+    return v_attr.contains( name );
 }
 
 
 
-QString 
-AMetaObject::attrName( int idx ) const
+int 
+AMetaObject::attrCount() const
 {
-    if ( idx < 0 || idx >= attrCount() ) return QString::null;
-    return v_attr.keys().at( idx );
+    return v_attr.size();
 }
 
 
 
-QString 
-AMetaObject::textName( int idx ) const
+int 
+AMetaObject::lastId()
 {
-    if ( idx < 0 || idx >= textCount() ) return QString::null;
-    return v_text.keys().at( idx );
-}
-
-
+    static QMutex m;
 
-QString 
-AMetaObject::rawdataName( int idx ) const
-{
-    if ( idx < 0 || idx >= rawdataCount() ) return QString::null;
-    return v_rawdata.keys().at( idx );
+    m.lock();
+    int res = v_lastId;
+    v_lastId++;
+    m.unlock();
+    return res;
 }
 
 
 
-bool 
-AMetaObject::attrExists( const QString &name )
+void 
+AMetaObject::setLastId( int id )
 {
-    return v_attr.contains( name );
+    v_lastId = id;
 }
 
 
-
-bool 
-AMetaObject::textExists( const QString &name )
+int 
+AMetaObject::childCount()
 {
-    return v_text.contains( name );
+    return v_child.count();
 }
 
 
 
-bool 
-AMetaObject::rawdataExists( const QString &name )
+AMetaObject *
+AMetaObject::child( int idx )
 {
-    return v_rawdata.contains( name );
+    if ( idx < 0 || idx >= childCount() ) return 0;
+    return v_child.values().at( idx );
 }
 
 
 
-int 
-AMetaObject::attrCount() const
+AMetaObject *
+AMetaObject::child( const QString &name )
 {
-    return v_attr.size();
+    return v_child.value( name, 0 );
 }
 
 
 
-int 
-AMetaObject::textCount() const
+void
+AMetaObject::addChild( AMetaObject * c )
 {
-    return v_text.size();
+    QString name;
+
+    if ( c ) {
+        name = c->name();
+        if ( name.isEmpty() ) name = c->className();
+        v_child.insertMulti( name, c );
+    }
 }
 
 
-int 
-AMetaObject::rawdataCount() const
+
+void
+AMetaObject::removeChild( AMetaObject * c )
 {
-    return v_rawdata.size();
+    if ( c ) v_child.remove( v_child.key( c ) );
 }
 
 
@@ -266,6 +279,8 @@ AMetaObject::rawdataCount() const
 AMetaCatalogue::AMetaCatalogue()
 :AMetaObject("Catalogue")
 {
+    setId( lastId() );
+    setName( QString("%1_%2").arg( tr("Catalogue") ).arg( id() ) );
 }
 
 
@@ -306,56 +321,56 @@ AMetaDataInfo::operator=(const AMetaDataInfo&)
 QString 
 AMetaDataInfo::appName()
 {
-    return text("name");
+    return attr("name").toString();
 }
 
 
 void 
 AMetaDataInfo::setAppName( const QString &name )
 {
-    setText( "name", name );
+    setAttr( "name", name );
 }
 
 
-long 
+int
 AMetaDataInfo::lastId()
 {
-    return text( "lastid" ).toLong();
+    return attr( "lastid" ).toInt();
 }
 
 
 void 
-AMetaDataInfo::setLastId( long id )
+AMetaDataInfo::setLastId( int id )
 {
-    setText( "lastid", QString::number( id ) );
+    setAttr( "lastid", id );
 }
 
 
 QString 
 AMetaDataInfo::author()
 {
-    return text("author");
+    return attr("author").toString();
 }
 
 
 void 
 AMetaDataInfo::setAuthor( const QString &name )
 {
-    setText( "author", name );
+    setAttr( "author", name );
 }
 
 
 QDate 
 AMetaDataInfo::date()
 {
-    return QDate::fromString( text("date"), Qt::ISODate );
+    return attr("date").toDate();
 }
 
 
 void 
 AMetaDataInfo::setDate( QDate d )
 {
-    setText( "date", d.toString( Qt::ISODate ) );
+    setAttr( "date", d );
 }
 
 
@@ -374,13 +389,13 @@ AMetaDataGlobal::AMetaDataGlobal()
 QString 
 AMetaDataGlobal::sourceCode()
 {
-    return text("sourcecode");
+    return attr("sourcecode").toString();
 }
 
 
 void 
 AMetaDataGlobal::setSourceCode( const QString &src )
 {
-    setText( "sourcecode", src );
+    setAttr( "sourcecode", src );
 }
 
index 18bb096..7499ea9 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametaobject.h,v 1.2 2008/12/15 22:22:48 leader Exp $
+** $Id: ametaobject.h,v 1.5 2008/12/20 21:17:49 leader Exp $
 **
 ** Header file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
@@ -47,7 +47,8 @@
 #define RC_OK          0       /**< All right - no errors */
 #define RC_ERROR       1       /**< Error while executing method */
 
-#include <QHash>
+//#include <QHash>
+#include <QMap>
 #include <QVariant>
 class AMetaObjectGroup;
 
@@ -63,52 +64,74 @@ Q_PROPERTY( QString description READ description SCRIPTABLE true )
 public:
     AMetaObject( const QString &objectclass  = QString::null, 
                  const QString &objectname = QString::null, 
-                 AMetaObjectGroup *parent = 0 );
+                 AMetaObject *parent = 0 );
 
+    ~AMetaObject();
     void setClassName( const QString &name );
 
     Q_ULONG id();
     void setId( Q_ULONG );
     QString className();
     QString name();
+    AMetaObject *rootObject();
+    AMetaObject *parentMetaObject();
+    void setParentMetaObject( AMetaObject * parent );
 
     QString description();
     void setDescription( const QString &descr );
 
     void setAttr( const QString &name, const QVariant &value );
-    void setText( const QString &name, const QString &text );
-    void setRawdata( const QString &name, const QByteArray &data );
-
     QVariant attr( const QString &name ) const;
-    QString text( const QString &name ) const;
-    QByteArray rawdata( const QString &name ) const;
-
     QVariant attr( int idx ) const;
-    QString text( int idx ) const;
-    QByteArray rawdata( int idx ) const;
-
     QString attrName( int idx ) const;
-    QString textName( int idx ) const;
-    QString rawdataName( int idx ) const;
-
     bool attrExists( const QString &name );
-    bool textExists( const QString &name );
-    bool rawdataExists( const QString &name );
-
     int attrCount() const;
-    int textCount() const;
-    int rawdataCount() const;
+
+    static int lastId();
+    static void setLastId( int id );
+
+    int childCount();
+    AMetaObject *child( int idx );
+    AMetaObject *child( const QString &name );
+    void addChild( AMetaObject * c );
+    void removeChild( AMetaObject * c );
 
 public slots:
 
 private:
+    static int v_lastId;
+    AMetaObject *v_parent;
     Q_ULONG v_id;
     QString v_className;
-    QHash <QString, QVariant> v_attr;
-    QHash <QString, QString> v_text;
-    QHash <QString, QByteArray> v_rawdata;
+    QString v_description;
+    QMap <QString, QVariant> v_attr;
+    QMap <QString, AMetaObject *> v_child;
+};
+
+
+class AMetaGroup: public AMetaObject
+{
+Q_OBJECT
+public:
+    AMetaGroup( const QString &groupname, AMetaObject *parent = 0 )
+    :AMetaObject( groupname, QString::null, parent ){};
+};
+
+
+
+template<class T>
+class  AMetaGroupA : public AMetaGroup
+{
+//    Q_OBJECT
+public:
+
+    AMetaGroupA( AMetaObject * parent = 0 )
+    :AMetaGroup( "", parent )
+    { 
+    };
 };
 
+typedef AMetaGroupA<AMetaObject> AMetaGroupAXXX;
 
 
 class AMetaCatalogue: public AMetaObject
@@ -134,8 +157,8 @@ public:
 
     QString appName();
     void setAppName( const QString &name );
-    long lastId();
-    void setLastId( long id );
+    int lastId();
+    void setLastId( int id );
     QString author();
     void setAuthor( const QString &name );
     QDate date();
index bd2e97a..a17128e 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametaobjectgroup.cpp,v 1.2 2008/12/15 22:22:48 leader Exp $
+** $Id: ametaobjectgroup.cpp,v 1.4 2008/12/20 21:17:49 leader Exp $
 **
 ** Code file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
 
 
 /*!
- * \class AMetaObjectGroup
+ * \class AMetaGroup
  *
  */
-AMetaObjectGroup::AMetaObjectGroup( const QString &groupname )
-:QObject()
-{
-    setObjectName( groupname );
-}
-
-
-
-
-AMetaObjectGroup::AMetaObjectGroup( const QString &groupname, AMetaObject *parent )
-:QObject( parent )
-{
-    setObjectName( groupname );
-}
-
-
-AMetaObjectGroup::AMetaObjectGroup( const QString &groupname, AMetaObjectGroup *parent )
-:QObject( parent )
-{
-    setObjectName( groupname );
-}
-
-
-QString
-AMetaObjectGroup::name()
-{
-    return objectName();
-}
-
-
-
-AMetaObject *
-AMetaObjectGroup::metaObject( const QString &name )
-{
-    return findChild<AMetaObject *>( name );
-}
-
-
-
-AMetaObject *
-AMetaObjectGroup::metaObject( int idx )
-{
-    return v_metaObjects.at( idx );
-}
-
-
-void 
-AMetaObjectGroup::append( AMetaObject *obj )
-{
-    obj->setParent( this );
-    v_metaObjects.append( obj );
-    connect( obj, SIGNAL(destroyed(QObject*)), this, SLOT(destroyed(QObject *)));
-}
-
-
-int 
-AMetaObjectGroup::count() const
-{
-    return v_metaObjects.count();
-}
-
-
-void 
-AMetaObjectGroup::clear()
-{
-    v_metaObjects.clear();
-}
-
-
-void 
-AMetaObjectGroup::destroyed( QObject *obj )
-{
-  if ( obj->inherits("AMetaObject") ){
-      v_metaObjects.removeAll( ( AMetaObject *) obj );
-  }
-}
-
-
-
-/*!
- * \class ADocumentsGroup
- *
- */
-ADocumentsGroup::ADocumentsGroup()
-:AMetaObjectGroup("Documents")
-{
-
-}
 
 
 
@@ -142,7 +54,7 @@ ADocumentsGroup::ADocumentsGroup()
  *
  */
 ACataloguesGroup::ACataloguesGroup()
-:AMetaObjectGroup("Catalogues")
+:AMetaGroup("Catalogues")
 {
 
 }
@@ -154,7 +66,7 @@ ACataloguesGroup::ACataloguesGroup()
  *
  */
 AReportsGroup::AReportsGroup()
-:AMetaObjectGroup("Reports")
+:AMetaGroup("Reports")
 {
 
 }
@@ -166,7 +78,7 @@ AReportsGroup::AReportsGroup()
  *
  */
 AJournalsGroup::AJournalsGroup()
-:AMetaObjectGroup("Journals")
+:AMetaGroup("Journals")
 {
 
 }
@@ -178,7 +90,7 @@ AJournalsGroup::AJournalsGroup()
  *
  */
 AInfoRegistersGroup::AInfoRegistersGroup()
-:AMetaObjectGroup("InfoRegisters")
+:AMetaGroup("InfoRegisters")
 {
 
 }
@@ -190,7 +102,7 @@ AInfoRegistersGroup::AInfoRegistersGroup()
  *
  */
 AAccRegistersGroup::AAccRegistersGroup()
-:AMetaObjectGroup("AccRegisters")
+:AMetaGroup("AccRegisters")
 {
 
 }
@@ -202,19 +114,10 @@ AAccRegistersGroup::AAccRegistersGroup()
  *
  */
 AMetaTables::AMetaTables()
-:AMetaObjectGroup("MetaTables")
+:AMetaGroup("MetaTables")
 {
 
 }
 
 
 
-/*!
- * \class AMetaForms
- *
- */
-AMetaForms::AMetaForms()
-:AMetaObjectGroup("MetaForms")
-{
-
-}
index 52210a6..6f26d46 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: ametaobjectgroup.h,v 1.2 2008/12/15 22:22:48 leader Exp $
+** $Id: ametaobjectgroup.h,v 1.4 2008/12/20 21:17:49 leader Exp $
 **
 ** Header file of the Ananas configuration objects of Ananas
 ** Designer and Engine applications
 #include <QVariant>
 
 
-/*!
- *\en
- *     Metadata object for metadata script access.
- *\_en
- *\ru
- *     \brief Объект метаданных для обеспечения доступа из скриптов.
- *     Наследует QObject.
- *\_ru
- */
-class AMetaObjectGroup: public QObject
-{
-Q_OBJECT
-Q_PROPERTY( QString name READ name SCRIPTABLE true )
-public:
-    AMetaObjectGroup( const QString &groupname );
-    AMetaObjectGroup( const QString &groupname, AMetaObject *parent );
-    AMetaObjectGroup( const QString &groupname, AMetaObjectGroup *parent );
-
-    QString name();
-//        QMetaObject *metaObject(const QString &objClass, const QString &objName);
-//    QMetaObject *metaObject(const QString &objClass, const QString &objName);
-    AMetaObject *metaObject( const QString &name );
-    AMetaObject *metaObject( int idx );
-    void append( AMetaObject *object );
-    int count() const;
-    void clear();
-
-public slots:
-    QString test(){ return QString("TEST STRING");};
-
-private slots:
-    void destroyed( QObject *obj );
-
-private:
-    QList <AMetaObject *> v_metaObjects;
-};
-
-
-class ACataloguesGroup: public AMetaObjectGroup
+class ACataloguesGroup: public AMetaGroup
 {
 Q_OBJECT
 public:
@@ -92,21 +54,7 @@ public slots:
 
 
 
-class ADocumentsGroup: public AMetaObjectGroup
-{
-Q_OBJECT
-public:
-    ADocumentsGroup();
-
-public slots:
-    QString test(){ return QString("DOCUMENTS TEST STRING");};
-
-
-};
-
-
-
-class AReportsGroup: public AMetaObjectGroup
+class AReportsGroup: public AMetaGroup
 {
 Q_OBJECT
 public:
@@ -119,7 +67,7 @@ public slots:
 
 
 
-class AJournalsGroup: public AMetaObjectGroup
+class AJournalsGroup: public AMetaGroup
 {
 Q_OBJECT
 public:
@@ -132,7 +80,7 @@ public slots:
 
 
 
-class AInfoRegistersGroup: public AMetaObjectGroup
+class AInfoRegistersGroup: public AMetaGroup
 {
 Q_OBJECT
 public:
@@ -145,7 +93,7 @@ public slots:
 
 
 
-class AAccRegistersGroup: public AMetaObjectGroup
+class AAccRegistersGroup: public AMetaGroup
 {
 Q_OBJECT
 public:
@@ -158,7 +106,7 @@ public slots:
 
 
 
-class AMetaTables: public AMetaObjectGroup
+class AMetaTables: public AMetaGroup
 {
 Q_OBJECT
 public:
@@ -171,15 +119,5 @@ public slots:
 
 
 
-class AMetaForms: public AMetaObjectGroup
-{
-Q_OBJECT
-public:
-    AMetaForms();
-
-public slots:
-
-
-};
 
 #endif
index 29ee89c..64a0ed1 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: testametadata.cpp,v 1.5 2008/12/15 22:22:48 leader Exp $
+** $Id: testametadata.cpp,v 1.8 2008/12/20 21:17:49 leader Exp $
 ** 
 ** Tool for automatic running Ananas tests
 **
@@ -88,9 +88,9 @@ void TestAMetaData::testAMetaObject()
 
     o->setAttr("String","String");
     o->setAttr("Int", 123456 );
-    o->setText("Text", QString::fromUtf8("Проверочный текст"));
-    o->setRawdata("RAW1", ba );
-    o->setRawdata("RAW2", ba );
+//    o->setText("Text", QString::fromUtf8("Проверочный текст"));
+//    o->setRawdata("RAW1", ba );
+//    o->setRawdata("RAW2", ba );
 
 // Test attr functions
     QVERIFY( o->attrCount() == 2 );
@@ -99,40 +99,46 @@ void TestAMetaData::testAMetaObject()
     QVERIFY( o->attrExists("IntX") == false );
     QVERIFY( o->attr("String") == "String" );
     QVERIFY( o->attr("Int") == 123456 );
-    QVERIFY( o->attr( 0 ) == "String" );
-    QVERIFY( o->attr( 1 ) == 123456 );
+    QVERIFY( o->attr( 1 ) == "String" );
+    QVERIFY( o->attr( 0 ) == 123456 );
     QVERIFY( o->attr( -1 ) == QVariant() );
     QVERIFY( o->attr( 10 ) == QVariant() );
 // Test text functions
-    QVERIFY( o->textCount() == 1+1 );
-    QVERIFY( o->textExists("Text") );
-    QVERIFY( o->textExists("Text0") == false );
-    QVERIFY( o->text("Text") == QString::fromUtf8("Проверочный текст") );
-    QVERIFY( o->text( 1 ) == QString::fromUtf8("Проверочный текст") );
-    QVERIFY( o->text( -1 ) == QString::null );
-    QVERIFY( o->text( 10 ) == QString::null );
+//    QVERIFY( o->textCount() == 1+1 );
+//    QVERIFY( o->textExists("Text") );
+//    QVERIFY( o->textExists("Text0") == false );
+//    QVERIFY( o->text("Text") == QString::fromUtf8("Проверочный текст") );
+//    QVERIFY( o->text( 1 ) == QString::fromUtf8("Проверочный текст") );
+//    QVERIFY( o->text( -1 ) == QString::null );
+//    QVERIFY( o->text( 10 ) == QString::null );
 // Test rawdata functions
-    QVERIFY( o->rawdataCount() == 2 );
-    QVERIFY( o->rawdataExists("RAW1") );
-    QVERIFY( o->rawdataExists("RAW2") );
-    QVERIFY( o->rawdataExists("RAW3") == false );
-    QVERIFY( o->rawdata("RAW1") == QString( ba.data() ) );
-    QVERIFY( o->rawdata("RAW2") == QString( ba.data() ) );
-    QVERIFY( o->rawdata( 0 ) == QString( ba.data() ) );
-    QVERIFY( o->rawdata( 1 ) == QString( ba.data() ) );
-    QVERIFY( o->rawdata( -1 ) == QByteArray() );
-    QVERIFY( o->rawdata( 10 ) == QByteArray() );
+//    QVERIFY( o->rawdataCount() == 2 );
+//    QVERIFY( o->rawdataExists("RAW1") );
+//    QVERIFY( o->rawdataExists("RAW2") );
+//    QVERIFY( o->rawdataExists("RAW3") == false );
+//    QVERIFY( o->rawdata("RAW1") == QString( ba.data() ) );
+//    QVERIFY( o->rawdata("RAW2") == QString( ba.data() ) );
+//    QVERIFY( o->rawdata( 0 ) == QString( ba.data() ) );
+//    QVERIFY( o->rawdata( 1 ) == QString( ba.data() ) );
+//    QVERIFY( o->rawdata( -1 ) == QByteArray() );
+//    QVERIFY( o->rawdata( 10 ) == QByteArray() );
     delete o;
 }
 
 
 
-void TestAMetaData::testAMetaObjectGroup()
+void TestAMetaData::testAMetaGroup()
 {
-    AMetaObjectGroup *o = new AMetaObjectGroup( QString::fromUtf8("ИмяОбъекта") );
+    AMetaGroup *o = new AMetaGroup( QString::fromUtf8("ИмяОбъекта") );
 
-    QCOMPARE( o->name(),      QString::fromUtf8("ИмяОбъекта"));
+    AMetaGroupAXXX oo;
+    printf("xxx=%s\n", oo.className().toUtf8().data() );
+
+
+    QCOMPARE( o->className(),      QString::fromUtf8("ИмяОбъекта"));
+    QCOMPARE( o->name(), QString("") );
     delete o;
+    
 }
 
 
@@ -140,7 +146,11 @@ void TestAMetaData::testAMetaObjectGroup()
 void TestAMetaData::testAMetaData()
 {
     AMetaData *o = new AMetaData();
-    QCOMPARE( o->name(), QString("MetaData") );
+    AMetaObject::setLastId( 101 );
+    QCOMPARE( o->className(), QString("MetaData") );
+    QCOMPARE( AMetaObject::lastId(), 101 );
+    QCOMPARE( AMetaObject::lastId(), 102 );
+    QCOMPARE( o->childCount(), 8 );
     delete o;
 }
 
@@ -164,7 +174,14 @@ void TestAMetaData::testAMetaDataIOXML()
 {
     AMetaDataIOXML *o = new AMetaDataIOXML();
     QString xml;
-    
+
+    AMetaData *md = AMetaData::metadata();
+    AMetaDocument *d = md->documents()->newDocument();
+    AMetaField *f;
+    f = d->fields()->newField();
+    f = d->fields()->newField();
+        
+//    delete d;
     QCOMPARE( o->write("test.cfg"), 0 );
     QCOMPARE( o->read("test1.cfg"), 0 );
     xml = o->text();
index 939ca8e..e6788a8 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id: testametadata.h,v 1.5 2008/12/15 22:22:48 leader Exp $
+** $Id: testametadata.h,v 1.6 2008/12/20 21:17:49 leader Exp $
 ** 
 ** Tool for automatic running Ananas tests
 **
@@ -43,7 +43,7 @@ private slots:
 //    void toUpper();
 
     void testAMetaObject();
-    void testAMetaObjectGroup();
+    void testAMetaGroup();
     void testAMetaData();
     void testAMetaField();
     void testAMetaDataIOXML();