[Uml-devel] KDE/kdesdk/umbrello/umbrello

Ralf Habacker ralf.habacker at gmail.com
Thu Dec 15 16:03:19 UTC 2011


SVN commit 1268827 by habacker:

added import feature

If enabled in the new code import settings page for each imported c++ file
an artifact will be created in the component view.
The rational of this feature - when it is completed - is to generate files
completly from the parsed content including file header comments and the
exact collection of which classes belongs to a file.

To achieve this, a new class FileAST has been created, which holds all
file related informations not fitting into other declarations.

The implementation creates artifacts with the raw file name because there
are problems in Model_Utils::findUMLObject searching full pathes.

To complete this feature the following is to do:

- UMLArtifact has to be extended to hold uml objects collected for this file.

- ArtifactWidget has to be extended to let users editable the lists provided
  by UMLArtifact.

- The parser should add the collected uml objects to the related UMLArtifact

- The artifacts in the component view should be structured into folders using
  abolute pathes or based on the import root (switchable in the code import
  settings page)

 M  +2 -0      CMakeLists.txt  
 M  +1 -0      codeimport/cppimport.cpp  
 M  +14 -0     codeimport/import_utils.cpp  
 M  +6 -0      codeimport/kdevcppparser/ast.cpp  
 M  +27 -0     codeimport/kdevcppparser/ast.h  
 M  +7 -0      codeimport/kdevcppparser/cpptree2uml.cpp  
 M  +1 -0      codeimport/kdevcppparser/cpptree2uml.h  
 M  +11 -0     codeimport/kdevcppparser/parser.cpp  
 M  +10 -0     codeimport/kdevcppparser/tree_parser.cpp  
 M  +1 -0      codeimport/kdevcppparser/tree_parser.h  
 A             dialogs/codeimportoptionspage.cpp   [License: GPL (v2+)]
 A             dialogs/codeimportoptionspage.h   [License: UNKNOWN]
 A             dialogs/codeimportoptionspage.ui  
 M  +26 -1     dialogs/settingsdlg.cpp  
 M  +4 -1      dialogs/settingsdlg.h  
 M  +2 -0      icon_utils.cpp  
 M  +1 -0      icon_utils.h  
 M  +6 -0      optionstate.h  
 M  +7 -0      umbrello.kcfg  
 M  +5 -0      uml.cpp  


--- trunk/KDE/kdesdk/umbrello/umbrello/CMakeLists.txt #1268826:1268827
@@ -212,6 +212,7 @@
     dialogs/classwizard.cpp
     dialogs/codeeditor.cpp
     dialogs/codegenerationpolicypage.cpp
+    dialogs/codeimportoptionspage.cpp
     dialogs/codeviewerdialog.cpp
     dialogs/codevieweroptionspage.cpp
     dialogs/codetextedit.cpp
@@ -249,6 +250,7 @@
     ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/importprojectdlgbase.ui
     ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/umlrolepropertiesbase.ui
     ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/diagrampropertiespage.ui
+    ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/codeimportoptionspage.ui
 )
 
 set(librefactoring_SRCS
--- trunk/KDE/kdesdk/umbrello/umbrello/codeimport/cppimport.cpp #1268826:1268827
@@ -109,6 +109,7 @@
     ms_driver->reset();
     // The driver shall attempt to parse included files.
     ms_driver->setResolveDependencesEnabled( true );
+    // FIXME: port to win32
     // Add some standard include paths
     ms_driver->addIncludePath( "/usr/include" );
     ms_driver->addIncludePath( "/usr/include/c++" );
--- trunk/KDE/kdesdk/umbrello/umbrello/codeimport/import_utils.cpp #1268826:1268827
@@ -13,6 +13,7 @@
 
 // app includes
 #include "association.h"
+#include "artifact.h"
 #include "attribute.h"
 #include "classifier.h"
 #include "debug_utils.h"
@@ -26,6 +27,7 @@
 #include "uml.h"
 #include "umldoc.h"
 #include "umlobject.h"
+#include "umbrellosettings.h"
 
 // kde includes
 #include <kmessagebox.h>
@@ -168,6 +170,18 @@
 {
     QString name = inName;
     UMLDoc *umldoc = UMLApp::app()->document();
+    if (type == UMLObject::ot_Artifact) {
+        if (!Settings::optionState().codeImportState.createArtifacts)
+            return 0;
+        QFileInfo fi(name);
+        UMLFolder *logicalView = umldoc->rootFolder(Uml::ModelType::Component);
+        UMLObject *o = Object_Factory::createUMLObject(type, fi.fileName(), parentPkg, false);
+        UMLArtifact *a = static_cast<UMLArtifact*>(o);
+        a->setDrawAsType(UMLArtifact::file);
+        a->setDoc(comment);
+        uDebug() << name << comment;
+        return o;
+    }
     UMLFolder *logicalView = umldoc->rootFolder(Uml::ModelType::Logical);
     const Uml::ProgrammingLanguage pl = UMLApp::app()->activeLanguage();
     if (parentPkg == NULL) {
--- trunk/KDE/kdesdk/umbrello/umbrello/codeimport/kdevcppparser/ast.cpp #1268826:1268827
@@ -228,6 +228,12 @@
 
 // ------------------------------------------------------------------------
 
+FileAST::FileAST()
+{
+}
+
+// ------------------------------------------------------------------------
+
 LinkageBodyAST::LinkageBodyAST()
 {
 }
--- trunk/KDE/kdesdk/umbrello/umbrello/codeimport/kdevcppparser/ast.h #1268826:1268827
@@ -171,6 +171,7 @@
     NodeType_TemplateParameter,
     NodeType_TemplateParameterList,
     NodeType_Condition,
+    NodeType_File,
 
     NodeType_Custom = 2000
   };
@@ -422,6 +423,32 @@
     void operator = ( const DeclarationAST& source );
 };
 
+class FileAST: public DeclarationAST
+{
+public:
+    typedef AUTO_PTR<FileAST> Node;
+    enum { Type = NodeType_File };
+
+    DECLARE_ALLOC( FileAST )
+
+    public:
+    FileAST();
+    
+    QString fileName() { return m_fileName; }
+    void setFileName(QString fileName) { m_fileName = fileName; }
+
+    QList<AST*> nodeList() { return m_nodeList; }
+    void addNode( AST::Node& node );
+
+private:
+    QList<AST*> m_nodeList;
+    QString m_fileName;
+
+private:
+    FileAST( const FileAST& source );
+    void operator = ( const FileAST& source );
+};
+
 class AccessDeclarationAST: public DeclarationAST
 {
 public:
--- trunk/KDE/kdesdk/umbrello/umbrello/codeimport/kdevcppparser/cpptree2uml.cpp #1268826:1268827
@@ -60,6 +60,13 @@
     TreeParser::parseTranslationUnit( ast );
 }
 
+void CppTree2Uml::parseFile( FileAST* ast )
+{
+    Import_Utils::createUMLObject(UMLObject::ot_Artifact, ast->fileName(),
+                                  0,
+                                  ast->comment());
+}
+
 void CppTree2Uml::parseNamespace( NamespaceAST* ast )
 {
     if (m_clsCnt > 0) {
--- trunk/KDE/kdesdk/umbrello/umbrello/codeimport/kdevcppparser/cpptree2uml.h #1268826:1268827
@@ -36,6 +36,7 @@
     // declarations
     //virtual void parseDeclaration( DeclarationAST* );  // use parent method
     //virtual void parseLinkageSpecification( LinkageSpecificationAST* );  // use parent method
+    virtual void parseFile( FileAST* ast );
     virtual void parseNamespace( NamespaceAST* );
     //virtual void parseNamespaceAlias( NamespaceAliasAST* );  // use parent method
     //virtual void parseUsing( UsingAST* );  // use parent method
--- trunk/KDE/kdesdk/umbrello/umbrello/codeimport/kdevcppparser/parser.cpp #1268826:1268827
@@ -421,12 +421,23 @@
 bool Parser::parseDeclaration(DeclarationAST::Node& node)
 {
     //uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- "  << "Parser::parseDeclaration()";
+    bool firstToken = m_tokenIt == lex->tokenBegin();
 
     QString comment;
     while ((*m_tokenIt) == Token_comment) {
         comment += (*m_tokenIt).text();
         ++m_tokenIt;
     }
+
+    if (firstToken)
+    {
+        FileAST::Node ast = CreateNode<FileAST>();
+        ast->setComment(comment);
+        ast->setFileName(m_driver->currentFileName());
+        node = ast;
+        return true;
+    }
+
     if ((*m_tokenIt).isNull())
         return false;
 
--- trunk/KDE/kdesdk/umbrello/umbrello/codeimport/kdevcppparser/tree_parser.cpp #1268826:1268827
@@ -47,6 +47,10 @@
         return;
 
     switch (declaration->nodeType()) {
+    case NodeType_File:
+        parseFile(static_cast<FileAST*>(declaration));
+        break;
+
     case NodeType_LinkageSpecification:
         parseLinkageSpecification(static_cast<LinkageSpecificationAST*>(declaration));
         break;
@@ -89,6 +93,12 @@
     }
 }
 
+void TreeParser::parseFile(FileAST* decl)
+{
+    //uDebug() << "TreeParser::parseFile()";
+    Q_UNUSED(decl);
+}
+
 void TreeParser::parseLinkageSpecification(LinkageSpecificationAST* ast)
 {
     //uDebug() << "TreeParser::parseLinkageSpecification()";
--- trunk/KDE/kdesdk/umbrello/umbrello/codeimport/kdevcppparser/tree_parser.h #1268826:1268827
@@ -33,6 +33,7 @@
 
     // declarations
     virtual void parseDeclaration( DeclarationAST* );
+    virtual void parseFile( FileAST* );
     virtual void parseLinkageSpecification( LinkageSpecificationAST* );
     virtual void parseNamespace( NamespaceAST* );
     virtual void parseNamespaceAlias( NamespaceAliasAST* );
--- trunk/KDE/kdesdk/umbrello/umbrello/dialogs/settingsdlg.cpp #1268826:1268827
@@ -12,6 +12,7 @@
 #include "settingsdlg.h"
 
 // app includes
+#include "codeimportoptionspage.h"
 #include "codegenoptionspage.h"
 #include "codevieweroptionspage.h"
 #include "dialog_utils.h"
@@ -41,6 +42,7 @@
     setupFontPage();
     setupUIPage();
     setupClassPage();
+    setupCodeImportPage();
     setupCodeGenPage();
     setupCodeViewerPage(state->codeViewerState);
     connect(this,SIGNAL(okClicked()),this,SLOT(slotOk()));
@@ -352,6 +354,17 @@
     m_ClassWidgets.m_pOperationScopeCB->completionObject()->addItem( type );
 }
 
+void SettingsDlg::setupCodeImportPage()
+{
+    //setup code importer settings page
+    KVBox * page = new KVBox();
+    pageCodeImport = new KPageWidgetItem( page,i18n("Code Importer") );
+    pageCodeImport->setHeader( i18n("Code Import Settings") );
+    pageCodeImport->setIcon( Icon_Utils::DesktopIcon(Icon_Utils::it_Properties_CodeImport) );
+    addPage( pageCodeImport );
+    m_pCodeImportPage = new CodeImportOptionsPage(page);
+}
+
 void SettingsDlg::setupCodeGenPage()
 {
     //setup code generation settings page
@@ -399,6 +412,7 @@
     applyPage( pageGeneral);
     applyPage( pageUserInterface );
     applyPage( pageCodeViewer);
+    applyPage( pageCodeImport );
     applyPage( pageCodeGen );
     applyPage( pageFont );
     accept();
@@ -441,10 +455,17 @@
         m_ClassWidgets.m_pAttribScopeCB->setCurrentIndex(1); // Private
         m_ClassWidgets.m_pOperationScopeCB->setCurrentIndex(0); // Public
     }
-    else if (  current == pageCodeGen || current == pageCodeViewer )
+    else if (  current == pageCodeImport )
     {
+        m_pCodeImportPage->setDefaults();
     }
+    else if (  current == pageCodeGen )
+    {
 }
+    else if ( current == pageCodeViewer )
+    {
+    }
+}
 
 void SettingsDlg::applyPage( KPageWidgetItem*item )
 {
@@ -489,6 +510,10 @@
         m_pOptionState->classState.defaultAttributeScope = (Uml::Visibility::Value) m_ClassWidgets.m_pAttribScopeCB->currentIndex();
         m_pOptionState->classState.defaultOperationScope = (Uml::Visibility::Value) m_ClassWidgets.m_pOperationScopeCB->currentIndex();
     }
+    else if ( item == pageCodeImport )
+    {
+        m_pCodeImportPage->apply();
+    }
     else if ( item == pageCodeGen )
     {
         m_pCodeGenPage->apply();
--- trunk/KDE/kdesdk/umbrello/umbrello/dialogs/settingsdlg.h #1268826:1268827
@@ -28,6 +28,7 @@
 // app includes
 #include "optionstate.h"
 
+class CodeImportOptionsPage;
 class CodeGenOptionsPage;
 class CodeViewerOptionsPage;
 
@@ -138,6 +139,7 @@
     void setupUIPage();
     void setupGeneralPage();
     void setupClassPage();
+    void setupCodeImportPage();
     void setupCodeGenPage();
     void setupCodeViewerPage(Settings::CodeViewerState options);
     void applyPage( KPageWidgetItem* );
@@ -148,11 +150,12 @@
     UIWidgets m_UiWidgets;
     ClassWidgets m_ClassWidgets;
     Settings::OptionState *m_pOptionState;
+    CodeImportOptionsPage * m_pCodeImportPage;
     CodeGenOptionsPage * m_pCodeGenPage;
     CodeViewerOptionsPage * m_pCodeViewerPage;
 
     bool m_bChangesApplied;
-    KPageWidgetItem *pageCodeViewer, *pageFont, *pageCodeGen, *pageUserInterface, *pageGeneral, *pageClass;
+    KPageWidgetItem *pageCodeViewer, *pageFont, *pageCodeImport, *pageCodeGen, *pageUserInterface, *pageGeneral, *pageClass;
 
 private slots:
     void slotApply();
--- trunk/KDE/kdesdk/umbrello/umbrello/icon_utils.cpp #1268826:1268827
@@ -191,6 +191,8 @@
             return "preferences-desktop-theme";
         case it_Properties_Class:
             return "document-properties";
+        case it_Properties_CodeImport:
+            return "text-x-generic";
         case it_Properties_CodeGeneration:
             return "text-x-generic";
         case it_Properties_CodeViewer:
--- trunk/KDE/kdesdk/umbrello/umbrello/icon_utils.h #1268826:1268827
@@ -68,6 +68,7 @@
         it_Properties_Roles,
         it_Properties_UserInterface,
         it_Properties_Class,
+        it_Properties_CodeImport,
         it_Properties_CodeGeneration,
         it_Properties_CodeViewer,
         it_Properties_Columns,
--- trunk/KDE/kdesdk/umbrello/umbrello/optionstate.h #1268826:1268827
@@ -25,6 +25,7 @@
     page_font,
     page_UI,
     page_class,
+    page_codeimport,
     page_codegen,
     page_codeview
 };
@@ -126,12 +127,17 @@
     RubyCodeGenerationState rubyCodeGenerationState;
 };
 
+struct CodeImportState {
+    bool createArtifacts;
+};
+
 struct OptionState {
     GeneralState        generalState;
     UIState             uiState;
     ClassState          classState;
     CodeViewerState     codeViewerState;
     CodeGenerationState codeGenerationState;
+    CodeImportState     codeImportState;
 };
 
 OptionState& optionState();
--- trunk/KDE/kdesdk/umbrello/umbrello/umbrello.kcfg #1268826:1268827
@@ -261,6 +261,13 @@
          <default>grey</default>
        </entry>
    </group>
+    <group name="Code Importer">
+       <entry name="createArtifacts" type="Bool">
+         <label>Create Artifacts for imported files</label>
+         <whatsthis>Create an artifact in the component view for each imported file</whatsthis>
+         <default>true</default>
+       </entry>
+    </group>
    <group name="Code Generation">
        <entry name="autoGenEmptyConstructors" type="Bool">
          <label>Auto Generate Empty Constructors</label>
--- trunk/KDE/kdesdk/umbrello/umbrello/uml.cpp #1268826:1268827
@@ -985,6 +985,8 @@
     // now write the basic defaults to config
     m_commoncodegenpolicy->writeConfig();
 
+    UmbrelloSettings::setCreateArtifacts(optionState.codeImportState.createArtifacts);
+
     UmbrelloSettings::self()->writeConfig();
 }
 
@@ -1993,6 +1995,9 @@
     optionState.codeGenerationState.rubyCodeGenerationState.autoGenerateAttributeAccessors = UmbrelloSettings::autoGenerateAttributeAccessorsRuby();
     optionState.codeGenerationState.rubyCodeGenerationState.autoGenerateAssocAccessors = UmbrelloSettings::autoGenerateAssocAccessorsRuby();
 
+    // code importer options
+    optionState.codeImportState.createArtifacts = UmbrelloSettings::createArtifacts();
+
     // general config options will be read when created
 }
 




More information about the umbrello-devel mailing list