changeset 474:e91b224c223b

Merged changes.
author Jari-Matti M?kel? <jmjm@iki.fi>
date Thu, 08 Nov 2007 20:50:14 +0200
parents 381044a3feac (current diff) 30925590f392 (diff)
children 70fdd0701a77
files
diffstat 6 files changed, 163 insertions(+), 47 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/i18n/dil.tproj	Thu Nov 08 17:44:25 2007 +0200
+++ b/trunk/i18n/dil.tproj	Thu Nov 08 20:50:14 2007 +0200
@@ -1,6 +1,6 @@
 BuildScript: build.py
 CreationDate: '2007-10-12 09:41:17.868084'
-LangFiles: [en.cat, de.cat, tr.cat, fi.cat]
+LangFiles: [de.cat, tr.cat, fi.cat]
 MsgIDs:
 - {ID: 0, Name: IllegalCharacter, Order: 0}
 - {ID: 1, Name: InvalidUnicodeCharacter, Order: 1}
@@ -51,4 +51,4 @@
 - {ID: 46, Name: HelpGenerate, Order: 46}
 - {ID: 47, Name: HelpImportGraph, Order: 47}
 Name: dil
-SourceLangFile: ''
+SourceLangFile: en.cat
--- a/trunk/src/translator/langfile.py	Thu Nov 08 17:44:25 2007 +0200
+++ b/trunk/src/translator/langfile.py	Thu Nov 08 20:50:14 2007 +0200
@@ -15,6 +15,8 @@
 class LangFile:
   def __init__(self, filePath):
     self.filePath = filePath
+    self.isSource = False
+    self.source = None
     # Load language file and check data integrity.
     doc = yaml.load(open(filePath, "r"))
     self.doc = doc
@@ -39,7 +41,7 @@
         authors += [unicode(author[0]), unicode(author[1])]
     self.authors = authors
 
-    messages = []
+    self.msgDict = {} # {ID : msg, ...}
     for msg in self.messages:
       self.checkType(msg, dict, "LangFile: messages must be of type dict.")
       try:
@@ -49,12 +51,30 @@
         msg["LastEd"] = unicode(msg["LastEd"])
       except KeyError, e:
         raise LoadingError("LangFile: a message is missing the '%s' key." % str(e))
-      messages += [msg]
-    self.messages = messages
+      self.msgDict[msg["ID"]] = msg
 
   def checkType(self, var, type_, msg=""):
     if not isinstance(var, type_):
       raise LoadingError(msg)
 
+  def setSource(self, sourceLangFile):
+    self.source = sourceLangFile
+
+  def getMsg(self, ID):
+    for msg in self.messages:
+      if msg["ID"] == ID:
+        return msg
+    return None
+
+  def createMissingMessages(self, IDs):
+    for ID in IDs:
+      if not self.msgDict.has_key(ID):
+        msg = self.createEmptyMsg(ID)
+        self.msgDict[ID] = msg
+        self.messages += [msg]
+
+  def createEmptyMsg(self, ID):
+    return {"ID":ID,"Text":"","Annot":"","LastEd":""}
+
   def save(self):
     pass
--- a/trunk/src/translator/msg_form.ui	Thu Nov 08 17:44:25 2007 +0200
+++ b/trunk/src/translator/msg_form.ui	Thu Nov 08 20:50:14 2007 +0200
@@ -15,6 +15,9 @@
   <layout class="QVBoxLayout" >
    <item>
     <widget class="QSplitter" name="splitter" >
+     <property name="frameShape" >
+      <enum>QFrame::StyledPanel</enum>
+     </property>
      <property name="orientation" >
       <enum>Qt::Vertical</enum>
      </property>
@@ -28,11 +31,17 @@
         </widget>
        </item>
        <item>
-        <widget class="QListWidget" name="listWidget" />
+        <widget class="QTreeWidget" name="treeWidget" >
+         <column>
+          <property name="text" >
+           <string>1</string>
+          </property>
+         </column>
+        </widget>
        </item>
       </layout>
      </widget>
-     <widget class="QWidget" name="" >
+     <widget class="QWidget" name="layoutWidget" >
       <layout class="QGridLayout" >
        <item row="0" column="0" >
         <layout class="QVBoxLayout" >
@@ -72,7 +81,7 @@
           </widget>
          </item>
          <item>
-          <widget class="QTextEdit" name="destEdit" />
+          <widget class="QTextEdit" name="translEdit" />
          </item>
         </layout>
        </item>
@@ -86,7 +95,7 @@
           </widget>
          </item>
          <item>
-          <widget class="QTextEdit" name="destAnnotEdit" />
+          <widget class="QTextEdit" name="translAnnotEdit" />
          </item>
         </layout>
        </item>
--- a/trunk/src/translator/project.py	Thu Nov 08 17:44:25 2007 +0200
+++ b/trunk/src/translator/project.py	Thu Nov 08 20:50:14 2007 +0200
@@ -33,7 +33,7 @@
     self.checkType(doc, dict)
     try:
       self.name = str(doc["Name"])
-      self.source = str(doc["SourceLangFile"])
+      self.srcLangFilePath = str(doc["SourceLangFile"])
       self.langFilePaths = list(doc["LangFiles"])
       self.msgIDs = list(doc["MsgIDs"])
       self.creationDate = str(doc["CreationDate"])
@@ -58,19 +58,32 @@
 
     # Load language files.
     self.langFiles = []
+    IDList = [msg["ID"] for msgID in self.msgIDs]
     for filePath in self.langFilePaths:
-      if not os.path.exists(filePath):
-        # Look in project directory.
-        projectDir = os.path.dirname(projectPath)
-        filePath2 = os.path.join(projectDir, filePath)
-        if not os.path.exists(filePath2):
-          raise LoadingError("Project: Language file '%s' doesn't exist"%filePath)
-        filePath = filePath2
-      self.langFiles += [langfile.LangFile(filePath)]
+      langFile = self.loadLangFile(filePath)
+      langFile.createMissingMessages(IDList)
+      self.langFiles += [langFile]
+    self.srcLangFile = self.loadLangFile(self.srcLangFilePath)
+    self.srcLangFile.createMissingMessages(IDList)
+    self.srcLangFile.isSource = True
+    self.langFiles += [self.srcLangFile]
+
+    for langFile in self.langFiles:
+      langFile.setSource(self.srcLangFile)
 
   def checkType(self, var, type_):
     if not isinstance(var, type_):
       raise LoadingException("%s is not of type %s" % (str(var), str(type_)))
 
+  def loadLangFile(self, filePath):
+    if not os.path.exists(filePath):
+      # Look in project directory.
+      projectDir = os.path.dirname(self.projectPath)
+      filePath2 = os.path.join(projectDir, filePath)
+      if not os.path.exists(filePath2):
+        raise LoadingError("Project: Language file '%s' doesn't exist"%filePath)
+      filePath = filePath2
+    return langfile.LangFile(filePath)
+
   def save(self):
     pass
--- a/trunk/src/translator/translator.py	Thu Nov 08 17:44:25 2007 +0200
+++ b/trunk/src/translator/translator.py	Thu Nov 08 20:50:14 2007 +0200
@@ -29,6 +29,8 @@
 
     self.project = None
     # Modifications
+    self.pages = QtGui.QStackedWidget()
+    self.setCentralWidget(self.pages)
     self.disableMenuItems()
     self.projectDock = QtGui.QDockWidget("Project", self)
     self.projectTree = ProjectTree(self)
@@ -116,12 +118,15 @@
     self.action_Close_Project.setEnabled(False)
     self.menubar.removeAction(self.menu_Project.menuAction())
 
-  def projectTreeItemChanged(self, item, column):
-    if item == None:
+  def projectTreeItemChanged(self, current, previous):
+    if current == None:
       return
-    # TODO: set centralwidget to the form corresponding to the item.
-    if isinstance(item, LangFileItem):
-      print "LangFileItem"
+
+    if isinstance(current, LangFileItem):
+      index = self.pages.indexOf(current.msgForm)
+      if index == -1:
+        index = self.pages.addWidget(current.msgForm)
+      self.pages.setCurrentIndex(index)
 
   def closeEvent(self, event):
     if self.closeProject() == False:
@@ -166,17 +171,64 @@
     yaml.dump(g_settings, open(g_settingsFile, "w")) #default_flow_style=False
 
 class MsgForm(QtGui.QWidget, Ui_MsgForm):
-  def __init__(self):
+  def __init__(self, langFile):
     QtGui.QWidget.__init__(self)
     self.setupUi(self)
 
+    self.langFile = langFile
+    self.treeWidget.setColumnCount(2)
+    self.treeWidget.setHeaderLabels(["ID", "Text"])
+    for msg in self.langFile.messages:
+      item = QtGui.QTreeWidgetItem([str(msg["ID"]), msg["Text"]])
+      self.treeWidget.addTopLevelItem(item)
+
+    QtCore.QObject.connect(self.treeWidget, QtCore.SIGNAL("currentItemChanged (QTreeWidgetItem *,QTreeWidgetItem *)"), self.treeItemChanged)
+
+  def treeItemChanged(self, current, previous):
+    if current == None:
+      return
+    ID = int(current.text(0))
+    self.setTranslMsg(self.langFile.getMsg(ID))
+    self.setSourceMsg(self.langFile.source.getMsg(ID))
+
+  def setTranslMsg(self, msg):
+    self.translEdit.setText(msg["Text"])
+    self.translAnnotEdit.setText(msg["Annot"])
+
+  def setSourceMsg(self, msg):
+    self.sourceEdit.setText(msg["Text"])
+    self.sourceAnnotEdit.setText(msg["Annot"])
+
+class MsgFormSource(MsgForm):
+  def __init__(self, langFile):
+    MsgForm.__init__(self, langFile)
+
+    for x in [self.translEdit,
+              self.translAnnotEdit,
+              self.label_4,
+              self.label_5]:
+      x.close()
+
+  def treeItemChanged(self, current, previous):
+    ID = int(current.text(0))
+    self.setSourceMsg(self.langFile.getMsg(ID))
+
 class MsgIDItem(QtGui.QTreeWidgetItem):
   def __init__(self, parent, text):
     QtGui.QTreeWidgetItem.__init__(self, parent, [text])
 
 class LangFileItem(QtGui.QTreeWidgetItem):
-  def __init__(self, parent, text):
-    QtGui.QTreeWidgetItem.__init__(self, parent, [text])
+  def __init__(self, parent, langFile):
+    QtGui.QTreeWidgetItem.__init__(self, parent, [langFile.langCode])
+    self.langFile = langFile
+    if langFile.isSource:
+      self.msgForm = MsgFormSource(langFile)
+    else:
+      self.msgForm = MsgForm(langFile)
+
+class ProjectItem(QtGui.QTreeWidgetItem):
+  def __init__(self, text):
+    QtGui.QTreeWidgetItem.__init__(self, [text])
 
 class ProjectTree(QtGui.QTreeWidget):
   def __init__(self, parent):
@@ -188,11 +240,11 @@
   def setProject(self, project):
     self.project = project
 
-    self.topItem = QtGui.QTreeWidgetItem([self.project.name])
+    self.topItem = ProjectItem(self.project.name)
     self.addTopLevelItem(self.topItem)
 
     for langFile in self.project.langFiles:
-      langFileItem = LangFileItem(self.topItem, langFile.langCode)
+      langFileItem = LangFileItem(self.topItem, langFile)
 
     self.msgIDsItem = QtGui.QTreeWidgetItem(self.topItem, ["Message IDs"])
     for msgID in self.project.msgIDs:
@@ -201,6 +253,26 @@
     for x in [self.topItem, self.msgIDsItem]:
       x.setExpanded(True)
 
+  def contextMenuEvent(self, event):
+    item = self.itemAt(event.pos())
+    func_map = {
+      None : lambda item: None,
+      QtGui.QTreeWidgetItem : lambda item: None,
+      ProjectItem : self.showMenuProjectItem,
+      LangFileItem : self.showMenuLangFileItem,
+      MsgIDItem : self.showMenuMsgIDItem
+    }
+    func_map[type(item)](item)
+
+  def showMenuProjectItem(self, item):
+    print "ProjectItem"
+
+  def showMenuLangFileItem(self, item):
+    print "LangFileItem"
+
+  def showMenuMsgIDItem(self, item):
+    print "MsgIDItem"
+
   def clear(self):
     self.topItem = None
     self.msgIDsItem = None
--- a/trunk/src/translator/ui_msg_form.py	Thu Nov 08 17:44:25 2007 +0200
+++ b/trunk/src/translator/ui_msg_form.py	Thu Nov 08 20:50:14 2007 +0200
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'msg_form.ui'
 #
-# Created: Sun Oct 21 17:33:29 2007
+# Created: Tue Nov  6 12:15:01 2007
 #      by: PyQt4 UI code generator 4.1
 #
 # WARNING! All changes made in this file will be lost!
@@ -19,6 +19,7 @@
         self.vboxlayout.setObjectName("vboxlayout")
 
         self.splitter = QtGui.QSplitter(MsgForm)
+        self.splitter.setFrameShape(QtGui.QFrame.StyledPanel)
         self.splitter.setOrientation(QtCore.Qt.Vertical)
         self.splitter.setObjectName("splitter")
 
@@ -32,24 +33,24 @@
         self.label.setObjectName("label")
         self.vboxlayout1.addWidget(self.label)
 
-        self.listWidget = QtGui.QListWidget(self.layoutWidget)
-        self.listWidget.setObjectName("listWidget")
-        self.vboxlayout1.addWidget(self.listWidget)
+        self.treeWidget = QtGui.QTreeWidget(self.layoutWidget)
+        self.treeWidget.setObjectName("treeWidget")
+        self.vboxlayout1.addWidget(self.treeWidget)
 
-        self.widget = QtGui.QWidget(self.splitter)
-        self.widget.setObjectName("widget")
+        self.layoutWidget1 = QtGui.QWidget(self.splitter)
+        self.layoutWidget1.setObjectName("layoutWidget1")
 
-        self.gridlayout = QtGui.QGridLayout(self.widget)
+        self.gridlayout = QtGui.QGridLayout(self.layoutWidget1)
         self.gridlayout.setObjectName("gridlayout")
 
         self.vboxlayout2 = QtGui.QVBoxLayout()
         self.vboxlayout2.setObjectName("vboxlayout2")
 
-        self.label_2 = QtGui.QLabel(self.widget)
+        self.label_2 = QtGui.QLabel(self.layoutWidget1)
         self.label_2.setObjectName("label_2")
         self.vboxlayout2.addWidget(self.label_2)
 
-        self.sourceEdit = QtGui.QTextEdit(self.widget)
+        self.sourceEdit = QtGui.QTextEdit(self.layoutWidget1)
         self.sourceEdit.setObjectName("sourceEdit")
         self.vboxlayout2.addWidget(self.sourceEdit)
         self.gridlayout.addLayout(self.vboxlayout2,0,0,1,1)
@@ -57,11 +58,11 @@
         self.vboxlayout3 = QtGui.QVBoxLayout()
         self.vboxlayout3.setObjectName("vboxlayout3")
 
-        self.label_3 = QtGui.QLabel(self.widget)
+        self.label_3 = QtGui.QLabel(self.layoutWidget1)
         self.label_3.setObjectName("label_3")
         self.vboxlayout3.addWidget(self.label_3)
 
-        self.sourceAnnotEdit = QtGui.QTextEdit(self.widget)
+        self.sourceAnnotEdit = QtGui.QTextEdit(self.layoutWidget1)
         self.sourceAnnotEdit.setObjectName("sourceAnnotEdit")
         self.vboxlayout3.addWidget(self.sourceAnnotEdit)
         self.gridlayout.addLayout(self.vboxlayout3,0,1,1,1)
@@ -69,25 +70,25 @@
         self.vboxlayout4 = QtGui.QVBoxLayout()
         self.vboxlayout4.setObjectName("vboxlayout4")
 
-        self.label_4 = QtGui.QLabel(self.widget)
+        self.label_4 = QtGui.QLabel(self.layoutWidget1)
         self.label_4.setObjectName("label_4")
         self.vboxlayout4.addWidget(self.label_4)
 
-        self.destEdit = QtGui.QTextEdit(self.widget)
-        self.destEdit.setObjectName("destEdit")
-        self.vboxlayout4.addWidget(self.destEdit)
+        self.translEdit = QtGui.QTextEdit(self.layoutWidget1)
+        self.translEdit.setObjectName("translEdit")
+        self.vboxlayout4.addWidget(self.translEdit)
         self.gridlayout.addLayout(self.vboxlayout4,1,0,1,1)
 
         self.vboxlayout5 = QtGui.QVBoxLayout()
         self.vboxlayout5.setObjectName("vboxlayout5")
 
-        self.label_5 = QtGui.QLabel(self.widget)
+        self.label_5 = QtGui.QLabel(self.layoutWidget1)
         self.label_5.setObjectName("label_5")
         self.vboxlayout5.addWidget(self.label_5)
 
-        self.destAnnotEdit = QtGui.QTextEdit(self.widget)
-        self.destAnnotEdit.setObjectName("destAnnotEdit")
-        self.vboxlayout5.addWidget(self.destAnnotEdit)
+        self.translAnnotEdit = QtGui.QTextEdit(self.layoutWidget1)
+        self.translAnnotEdit.setObjectName("translAnnotEdit")
+        self.vboxlayout5.addWidget(self.translAnnotEdit)
         self.gridlayout.addLayout(self.vboxlayout5,1,1,1,1)
         self.vboxlayout.addWidget(self.splitter)
 
@@ -97,6 +98,7 @@
     def retranslateUi(self, MsgForm):
         MsgForm.setWindowTitle(QtGui.QApplication.translate("MsgForm", "Form", None, QtGui.QApplication.UnicodeUTF8))
         self.label.setText(QtGui.QApplication.translate("MsgForm", "Messages:", None, QtGui.QApplication.UnicodeUTF8))
+        self.treeWidget.headerItem().setText(0,QtGui.QApplication.translate("MsgForm", "1", None, QtGui.QApplication.UnicodeUTF8))
         self.label_2.setText(QtGui.QApplication.translate("MsgForm", "Source string:", None, QtGui.QApplication.UnicodeUTF8))
         self.label_3.setText(QtGui.QApplication.translate("MsgForm", "Source annotation:", None, QtGui.QApplication.UnicodeUTF8))
         self.label_4.setText(QtGui.QApplication.translate("MsgForm", "Translation:", None, QtGui.QApplication.UnicodeUTF8))