[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