Graphics/ApplicationDiagram.py

changeset 2031
c36c2eb62a75
parent 2030
db11a2fe9bbc
child 2032
704593d042fe
diff -r db11a2fe9bbc -r c36c2eb62a75 Graphics/ApplicationDiagram.py
--- a/Graphics/ApplicationDiagram.py	Sun Sep 09 14:46:59 2012 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,255 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2007 - 2012 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a dialog showing an imports diagram of the application.
-"""
-
-import os
-import glob
-
-from PyQt4.QtGui import QApplication, QProgressDialog
-
-from .UMLDialog import UMLDialog
-from .PackageItem import PackageItem, PackageModel
-from .AssociationItem import AssociationItem, Imports
-
-import Utilities.ModuleParser
-import Utilities
-
-import Preferences
-
-
-class ApplicationDiagram(UMLDialog):
-    """
-    Class implementing a dialog showing an imports diagram of the application.
-    """
-    def __init__(self, project, parent=None, name=None,  noModules=False):
-        """
-        Constructor
-        
-        @param project reference to the project object
-        @param parent parent widget of the view (QWidget)
-        @param name name of the view widget (string)
-        @keyparam noModules flag indicating, that no module names should be
-            shown (boolean)
-        """
-        self.project = project
-        self.noModules = noModules
-        
-        UMLDialog.__init__(self, "ApplicationDiagram", buildFunction=self.__buildPackages,
-            parent=parent)
-        self.setDiagramName(
-            self.trUtf8("Application Diagram {0}").format(project.getProjectName()))
-        
-        if not name:
-            self.setObjectName("ApplicationDiagram")
-        else:
-            self.setObjectName(name)
-        
-        self.umlView.setPersistenceData(
-            "project={0}".format(self.project.getProjectFile()))
-        
-        self.umlView.relayout.connect(self.relayout)
-        
-    def __buildModulesDict(self):
-        """
-        Private method to build a dictionary of modules contained in the application.
-        
-        @return dictionary of modules contained in the application.
-        """
-        extensions = Preferences.getPython("PythonExtensions") + \
-            Preferences.getPython("Python3Extensions") + ['.rb']
-        moduleDict = {}
-        mods = self.project.pdata["SOURCES"]
-        modules = []
-        for module in mods:
-            modules.append(Utilities.normabsjoinpath(self.project.ppath, module))
-        tot = len(modules)
-        try:
-            prog = 0
-            progress = QProgressDialog(self.trUtf8("Parsing modules..."),
-                None, 0, tot, self)
-            progress.show()
-            QApplication.processEvents()
-            for module in modules:
-                progress.setValue(prog)
-                QApplication.processEvents()
-                prog += 1
-                if module.endswith("__init__.py"):
-                    continue
-                try:
-                    mod = Utilities.ModuleParser.readModule(module, extensions=extensions)
-                except ImportError:
-                    continue
-                else:
-                    name = mod.name
-                    moduleDict[name] = mod
-        finally:
-            progress.setValue(tot)
-        return moduleDict
-        
-    def __buildPackages(self):
-        """
-        Private method to build the packages shapes of the diagram.
-        """
-        project = os.path.splitdrive(self.project.getProjectPath())[1]\
-            .replace(os.sep, '.')[1:]
-        packages = {}
-        shapes = {}
-        p = 10
-        y = 10
-        maxHeight = 0
-        sceneRect = self.umlView.sceneRect()
-        
-        modules = self.__buildModulesDict()
-        sortedkeys = sorted(modules.keys())
-        
-        # step 1: build a dictionary of packages
-        for module in sortedkeys:
-            l = module.split('.')
-            package = '.'.join(l[:-1])
-            if package in packages:
-                packages[package][0].append(l[-1])
-            else:
-                packages[package] = ([l[-1]], [])
-                
-        # step 2: assign modules to dictionaries and update import relationship
-        for module in sortedkeys:
-            l = module.split('.')
-            package = '.'.join(l[:-1])
-            impLst = []
-            for i in modules[module].imports:
-                if i in modules:
-                    impLst.append(i)
-                else:
-                    if i.find('.') == -1:
-                        n = "{0}.{1}".format(modules[module].package, i)
-                        if n in modules:
-                            impLst.append(n)
-                        else:
-                            n = "{0}.{1}".format(project, i)
-                            if n in modules:
-                                impLst.append(n)
-                            elif n in packages:
-                                n = "{0}.<<Dummy>>".format(n)
-                                impLst.append(n)
-                    else:
-                        n = "{0}.{1}".format(project, i)
-                        if n in modules:
-                            impLst.append(n)
-            for i in list(modules[module].from_imports.keys()):
-                if i.startswith('.'):
-                    dots = len(i) - len(i.lstrip('.'))
-                    if dots == 1:
-                        i = i[1:]
-                    elif dots > 1:
-                        packagePath = os.path.dirname(modules[module].file)
-                        hasInit = True
-                        ppath = packagePath
-                        while hasInit:
-                            ppath = os.path.dirname(ppath)
-                            hasInit = \
-                                len(glob.glob(os.path.join(ppath, '__init__.*'))) > 0
-                        shortPackage = \
-                            packagePath.replace(ppath, '').replace(os.sep, '.')[1:]
-                        packageList = shortPackage.split('.')[1:]
-                        packageListLen = len(packageList)
-                        i = '.'.join(packageList[:packageListLen - dots + 1] + [i[dots:]])
-                
-                if i in modules:
-                    impLst.append(i)
-                else:
-                    if i.find('.') == -1:
-                        n = "{0}.{1}".format(modules[module].package, i)
-                        if n in modules:
-                            impLst.append(n)
-                        else:
-                            n = "{0}.{1}".format(project, i)
-                            if n in modules:
-                                impLst.append(n)
-                            elif n in packages:
-                                n = "{0}.<<Dummy>>".format(n)
-                                impLst.append(n)
-                    else:
-                        n = "{0}.{1}".format(project, i)
-                        if n in modules:
-                            impLst.append(n)
-            for imp in impLst:
-                impPackage = '.'.join(imp.split('.')[:-1])
-                if not impPackage in packages[package][1] and \
-                   not impPackage == package:
-                    packages[package][1].append(impPackage)
-                    
-        sortedkeys = sorted(packages.keys())
-        for package in sortedkeys:
-            if package:
-                relPackage = package.replace(project, '')
-                if relPackage and relPackage[0] == '.':
-                    relPackage = relPackage[1:]
-                else:
-                    relPackage = self.trUtf8("<<Application>>")
-            else:
-                relPackage = self.trUtf8("<<Others>>")
-            shape = self.__addPackage(relPackage, packages[package][0], 0.0, 0.0)
-            shapeRect = shape.sceneBoundingRect()
-            shapes[package] = (shape, packages[package][1])
-            pn = p + shapeRect.width() + 10
-            maxHeight = max(maxHeight, shapeRect.height())
-            if pn > sceneRect.width():
-                p = 10
-                y += maxHeight + 10
-                maxHeight = shapeRect.height()
-                shape.setPos(p, y)
-                p += shapeRect.width() + 10
-            else:
-                shape.setPos(p, y)
-                p = pn
-        
-        rect = self.umlView._getDiagramRect(10)
-        sceneRect = self.umlView.sceneRect()
-        if rect.width() > sceneRect.width():
-            sceneRect.setWidth(rect.width())
-        if rect.height() > sceneRect.height():
-            sceneRect.setHeight(rect.height())
-        self.umlView.setSceneSize(sceneRect.width(), sceneRect.height())
-        
-        self.__createAssociations(shapes)
-        self.umlView.autoAdjustSceneSize(limit=True)
-        
-    def __addPackage(self, name, modules, x, y):
-        """
-        Private method to add a package to the diagram.
-        
-        @param name package name to be shown (string)
-        @param modules list of module names contained in the package
-            (list of strings)
-        @param x x-coordinate (float)
-        @param y y-coordinate (float)
-        """
-        modules.sort()
-        pm = PackageModel(name, modules)
-        pw = PackageItem(pm, x, y, noModules=self.noModules, scene=self.scene)
-        pw.setId(self.umlView.getItemId())
-        return pw
-        
-    def __createAssociations(self, shapes):
-        """
-        Private method to generate the associations between the package shapes.
-        
-        @param shapes list of shapes
-        """
-        for package in shapes:
-            for rel in shapes[package][1]:
-                assoc = AssociationItem(
-                        shapes[package][0], shapes[rel][0],
-                        Imports)
-                self.scene.addItem(assoc)
-        
-    def relayout(self):
-        """
-        Method to relayout the diagram.
-        """
-        self.__buildPackages()

eric ide

mercurial