Plugins/DocumentationPlugins/Ericapi/EricapiConfigDialog.py

changeset 0
de9c2efb9d02
child 12
1d8dd9706f46
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/DocumentationPlugins/Ericapi/EricapiConfigDialog.py	Mon Dec 28 16:03:33 2009 +0000
@@ -0,0 +1,261 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2004 - 2009 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to enter the parameters for eric4-api.
+"""
+
+import sys
+import os
+import copy
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from E4Gui.E4Completers import E4FileCompleter, E4DirCompleter
+
+from Ui_EricapiConfigDialog import Ui_EricapiConfigDialog
+import Utilities
+import DocumentationTools
+
+from eric4config import getConfig
+
+class EricapiConfigDialog(QDialog, Ui_EricapiConfigDialog):
+    """
+    Class implementing a dialog to enter the parameters for eric4-api.
+    """
+    def __init__(self, project, parms = None, parent = None):
+        """
+        Constructor
+        
+        @param project reference to the project object (Project.Project)
+        @param parms parameters to set in the dialog
+        @param parent parent widget of this dialog
+        """
+        QDialog.__init__(self,parent)
+        self.setupUi(self)
+        
+        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False)
+        for language in sorted(DocumentationTools.supportedExtensionsDictForApis.keys()):
+            self.languagesList.addItem(language)
+        
+        self.ppath = project.getProjectPath()
+        self.project = project
+        
+        self.__initializeDefaults()
+        
+        # get a copy of the defaults to store the user settings
+        self.parameters = copy.deepcopy(self.defaults)
+        
+        # combine it with the values of parms
+        if parms is not None:
+            for key, value in parms.items():
+                self.parameters[key] = parms[key]
+        
+        self.outputFileCompleter = E4FileCompleter(self.outputFileEdit)
+        self.ignoreDirCompleter = E4DirCompleter(self.ignoreDirEdit)
+        
+        self.recursionCheckBox.setChecked(self.parameters['useRecursion'])
+        self.oldStyleCheckBox.setChecked(not self.parameters['newStyle'])
+        self.includePrivateCheckBox.setChecked(self.parameters['includePrivate'])
+        self.outputFileEdit.setText(self.parameters['outputFile'])
+        self.baseEdit.setText(self.parameters['basePackage'])
+        self.ignoreDirsList.clear()
+        for d in self.parameters['ignoreDirectories']:
+            self.ignoreDirsList.addItem(d)
+        self.sourceExtEdit.setText(", ".join(self.parameters['sourceExtensions']))
+        self.excludeFilesEdit.setText(", ".join(self.parameters['ignoreFilePatterns']))
+        for language in self.parameters['languages']:
+            items = self.languagesList.findItems(language, Qt.MatchFlags(Qt.MatchExactly))
+            items[0].setSelected(True)
+    
+    def __initializeDefaults(self):
+        """
+        Private method to set the default values. 
+        
+        These are needed later on to generate the commandline
+        parameters.
+        """
+        self.defaults = {
+            'useRecursion' : False,
+            'newStyle' : True,
+            'includePrivate' : False, 
+            'outputFile' : '',
+            'basePackage' : '',
+            'ignoreDirectories' : [],
+            'ignoreFilePatterns' : [],
+            'sourceExtensions' : [],
+        }
+        
+        lang = self.project.getProjectLanguage()
+        if lang in DocumentationTools.supportedExtensionsDictForApis:
+            self.defaults['languages'] = [lang]
+        else:
+            self.defaults['languages'] = ["Python"]
+    
+    def generateParameters(self):
+        """
+        Public method that generates the commandline parameters.
+        
+        It generates a list of strings to be used
+        to set the QProcess arguments for the ericapi call and
+        a dictionary containing the non default parameters. This
+        dictionary can be passed back upon object generation to overwrite
+        the default settings.
+        
+        @return a tuple of the commandline parameters and non default parameters
+            (list of strings, dictionary)
+        """
+        parms = {}
+        args = []
+        
+        # 1. the program name
+        args.append(sys.executable)
+        args.append(Utilities.normabsjoinpath(getConfig('ericDir'), "eric4-api.py"))
+        
+        # 2. the commandline options
+        if self.parameters['outputFile'] != self.defaults['outputFile']:
+            parms['outputFile'] = self.parameters['outputFile']
+            args.append('-o')
+            if os.path.isabs(self.parameters['outputFile']):
+                args.append(self.parameters['outputFile'])
+            else:
+                args.append(os.path.join(self.ppath, self.parameters['outputFile']))
+        if self.parameters['basePackage'] != self.defaults['basePackage']:
+            parms['basePackage'] = self.parameters['basePackage']
+            args.append('-b')
+            args.append(self.parameters['basePackage'])
+        if self.parameters['ignoreDirectories'] != self.defaults['ignoreDirectories']:
+            parms['ignoreDirectories'] = self.parameters['ignoreDirectories'][:]
+            for d in self.parameters['ignoreDirectories']:
+                args.append('-x')
+                args.append(d)
+        if self.parameters['ignoreFilePatterns'] != self.defaults['ignoreFilePatterns']:
+            parms['ignoreFilePatterns'] = self.parameters['ignoreFilePatterns'][:]
+            for pattern in self.parameters['ignoreFilePatterns']:
+                args.append("--exclude-file=%s" % pattern)
+        if self.parameters['useRecursion'] != self.defaults['useRecursion']:
+            parms['useRecursion'] = self.parameters['useRecursion']
+            args.append('-r')
+        if self.parameters['sourceExtensions'] != self.defaults['sourceExtensions']:
+            parms['sourceExtensions'] = self.parameters['sourceExtensions'][:]
+            for ext in self.parameters['sourceExtensions']:
+                args.append('-t')
+                args.append(ext)
+        if self.parameters['newStyle'] != self.defaults['newStyle']:
+            parms['newStyle'] = self.parameters['newStyle']
+            args.append('--oldstyle')
+        if self.parameters['includePrivate'] != self.defaults['includePrivate']:
+            parms['includePrivate'] = self.parameters['includePrivate']
+            args.append('-p')
+        parms['languages'] = self.parameters['languages'][:]
+        for lang in self.parameters['languages']:
+            args.append('--language=%s' % lang)
+        
+        return (args, parms)
+
+    @pyqtSlot()
+    def on_outputFileButton_clicked(self):
+        """
+        Private slot to select the output file.
+        
+        It displays a file selection dialog to
+        select the file the api is written to.
+        """
+        filename = QFileDialog.getSaveFileName(\
+            self,
+            self.trUtf8("Select output file"),
+            self.outputFileEdit.text(),
+            self.trUtf8("API files (*.api);;All files (*)"))
+            
+        if filename:
+            # make it relative, if it is in a subdirectory of the project path 
+            fn = Utilities.toNativeSeparators(filename)
+            fn = fn.replace(self.ppath + os.sep, '')
+            self.outputFileEdit.setText(fn)
+
+    def on_outputFileEdit_textChanged(self, filename):
+        """
+        Private slot to enable/disable the "OK" button.
+        
+        @param filename name of the file (string)
+        """
+        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(filename != "")
+
+    @pyqtSlot()
+    def on_ignoreDirButton_clicked(self):
+        """
+        Private slot to select a directory to be ignored.
+        
+        It displays a directory selection dialog to
+        select a directory to be ignored.
+        """
+        startDir = self.ignoreDirEdit.text()
+        if not startDir:
+            startDir = self.ppath
+        directory = QFileDialog.getExistingDirectory(\
+            self,
+            self.trUtf8("Select directory to exclude"),
+            startDir,
+            QFileDialog.Options(QFileDialog.ShowDirsOnly))
+            
+        if directory:
+            # make it relative, if it is a subdirectory of the project path 
+            dn = Utilities.toNativeSeparators(directory)
+            dn = dn.replace(self.ppath + os.sep, '')
+            while dn.endswith(os.sep):
+                dn = dn[:-1]
+            self.ignoreDirEdit.setText(dn)
+    
+    @pyqtSlot()
+    def on_addButton_clicked(self):
+        """
+        Private slot to add the directory displayed to the listview.
+        
+        The directory in the ignore directories
+        line edit is moved to the listbox above and the edit is cleared.
+        """
+        self.ignoreDirsList.addItem(os.path.basename(self.ignoreDirEdit.text()))
+        self.ignoreDirEdit.clear()
+
+    @pyqtSlot()
+    def on_deleteButton_clicked(self):
+        """
+        Private slot to delete the currently selected directory of the listbox.
+        """
+        itm = self.ignoreDirsList.takeItem(self.ignoreDirsList.currentRow())
+        del itm
+
+    def accept(self):
+        """
+        Protected slot called by the Ok button. 
+        
+        It saves the values in the parameters dictionary.
+        """
+        self.parameters['useRecursion'] = self.recursionCheckBox.isChecked()
+        self.parameters['newStyle'] = not self.oldStyleCheckBox.isChecked()
+        self.parameters['includePrivate'] = self.includePrivateCheckBox.isChecked()
+        outfile = self.outputFileEdit.text()
+        if outfile != '':
+            outfile = os.path.normpath(outfile)
+        self.parameters['outputFile'] = outfile
+        self.parameters['basePackage'] = self.baseEdit.text()
+        self.parameters['ignoreDirectories'] = []
+        for row in range(0, self.ignoreDirsList.count()):
+            itm = self.ignoreDirsList.item(row)
+            self.parameters['ignoreDirectories'].append(\
+                os.path.normpath(itm.text()))
+        extensions = self.sourceExtEdit.text().split(',')
+        self.parameters['sourceExtensions'] = \
+            [ext.strip() for ext in extensions if len(ext) > 0]
+        patterns = self.excludeFilesEdit.text().split(',')
+        self.parameters['ignoreFilePatterns'] = \
+            [pattern.strip() for pattern in patterns]
+        self.parameters['languages'] = []
+        for itm in self.languagesList.selectedItems():
+            self.parameters['languages'].append(itm.text())
+        
+        # call the accept slot of the base class
+        QDialog.accept(self)

eric ide

mercurial