--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Templates/TemplatePropertiesDialog.py Mon Dec 28 16:03:33 2009 +0000 @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2005 - 2009 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the templates properties dialog. +""" + +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +import QScintilla.Lexers + +from Ui_TemplatePropertiesDialog import Ui_TemplatePropertiesDialog + + +class TemplatePropertiesDialog(QDialog, Ui_TemplatePropertiesDialog): + """ + Class implementing the templates properties dialog. + """ + def __init__(self, parent, groupMode = False, itm = None): + """ + Constructor + + @param parent the parent widget (QWidget) + @param groupMode flag indicating group mode (boolean) + @param itm item (TemplateEntry or TemplateGroup) to + read the data from + """ + QDialog.__init__(self, parent) + self.setupUi(self) + + if not groupMode: + self.nameEdit.setWhatsThis(self.trUtf8( + """<b>Template name<b><p>Enter the name of the template.""" + """ Templates may be autocompleted upon this name.""" + """ In order to support autocompletion. the template name""" + """ must only consist of letters (a-z and A-Z),""" + """ digits (0-9) and underscores (_).</p>""" + )) + self.__nameValidator = QRegExpValidator(QRegExp("[a-zA-Z0-9_]+"), + self.nameEdit) + self.nameEdit.setValidator(self.__nameValidator) + + self.languages = [("All", self.trUtf8("All"))] + supportedLanguages = QScintilla.Lexers.getSupportedLanguages() + languages = sorted(supportedLanguages.keys()) + for language in languages: + self.languages.append((language, supportedLanguages[language][0])) + + self.groupMode = groupMode + if groupMode: + langList = [] + for lang, langDisp in self.languages: + langList.append(langDisp) + + self.groupLabel.setText(self.trUtf8("Language:")) + self.groupCombo.addItems(langList) + self.templateLabel.setEnabled(False) + self.templateEdit.setEnabled(False) + self.templateEdit.setPlainText(self.trUtf8("GROUP")) + self.helpButton.setEnabled(False) + self.descriptionLabel.hide() + self.descriptionEdit.hide() + else: + groups = [] + for group in parent.getGroupNames(): + groups.append(group) + self.groupCombo.addItems(groups) + + if itm is not None: + self.nameEdit.setText(itm.getName()) + if groupMode: + lang = itm.getLanguage() + for l, d in self.languages: + if l == lang: + self.setSelectedGroup(d) + break + else: + self.setSelectedGroup(itm.getGroupName()) + self.templateEdit.setPlainText(itm.getTemplateText()) + self.descriptionEdit.setText(itm.getDescription()) + + self.nameEdit.selectAll() + + def keyPressEvent(self, ev): + """ + Re-implemented to handle the user pressing the escape key. + + @param ev key event (QKeyEvent) + """ + if ev.key() == Qt.Key_Escape: + res = QMessageBox.question(self, + self.trUtf8("Close dialog"), + self.trUtf8("""Do you really want to close the dialog?"""), + QMessageBox.StandardButtons(\ + QMessageBox.No | \ + QMessageBox.Yes), + QMessageBox.No) + if res == QMessageBox.Yes: + self.reject() + + @pyqtSlot() + def on_helpButton_clicked(self): + """ + Public slot to show some help. + """ + QMessageBox.information(self, + self.trUtf8("Template Help"), + self.trUtf8(\ + """<p>To use variables in a template, you just have to enclose""" + """ the variablename with $-characters. When you use the template,""" + """ you will then be asked for a value for this variable.</p>""" + """<p>Example template: This is a $VAR$</p>""" + """<p>When you use this template you will be prompted for a value""" + """ for the variable $VAR$. Any occurrences of $VAR$ will then be""" + """ replaced with whatever you've entered.</p>""" + """<p>If you need a single $-character in a template, which is not""" + """ used to enclose a variable, type $$(two dollar characters)""" + """ instead. They will automatically be replaced with a single""" + """ $-character when you use the template.</p>""" + """<p>If you want a variables contents to be treated specially,""" + """ the variablename must be followed by a ':' and one formatting""" + """ specifier (e.g. $VAR:ml$). The supported specifiers are:""" + """<table>""" + """<tr><td>ml</td><td>Specifies a multiline formatting.""" + """ The first line of the variable contents is prefixed with the string""" + """ occuring before the variable on the same line of the template.""" + """ All other lines are prefixed by the same amount of whitespace""" + """ as the line containing the variable.""" + """</td></tr>""" + """<tr><td>rl</td><td>Specifies a repeated line formatting.""" + """ Each line of the variable contents is prefixed with the string""" + """ occuring before the variable on the same line of the template.""" + """</td></tr>""" + """</table></p>""" + """<p>The following predefined variables may be used in a template:""" + """<table>""" + """<tr><td>date</td>""" + """<td>today's date in ISO format (YYYY-MM-DD)</td></tr>""" + """<tr><td>year</td>""" + """<td>the current year</td></tr>""" + """<tr><td>project_name</td>""" + """<td>the name of the project (if any)</td></tr>""" + """<tr><td>path_name</td>""" + """<td>full path of the current file</td></tr>""" + """<tr><td>dir_name</td>""" + """<td>full path of the parent directory</td></tr>""" + """<tr><td>file_name</td>""" + """<td>the current file name (without directory)</td></tr>""" + """<tr><td>base_name</td>""" + """<td>like <i>file_name</i>, but without extension</td></tr>""" + """<tr><td>ext</td>""" + """<td>the extension of the current file</td></tr>""" + """</table></p>""" + """<p>If you want to change the default delimiter to anything""" + """ different, please use the configuration dialog to do so.</p>""")) + + def setSelectedGroup(self, name): + """ + Public method to select a group. + + @param name name of the group to be selected (string) + """ + index = self.groupCombo.findText(name) + self.groupCombo.setCurrentIndex(index) + + def getData(self): + """ + Public method to get the data entered into the dialog. + + @return a tuple of two strings (name, language), if the dialog is in group mode, + and a tuple of four strings (name, description, group name, template) + otherwise. + """ + if self.groupMode: + return (self.nameEdit.text(), + self.languages[self.groupCombo.currentIndex()][0] + ) + else: + return (self.nameEdit.text(), + self.descriptionEdit.text(), + self.groupCombo.currentText(), + self.templateEdit.toPlainText() + )