class ZTranslationEditor(ZHeaderDialog, ZPersistentDialogMixin): def __init__(self, parent, translation, defaultTranslation, translationDisplayName): self.translationDisplayName = translationDisplayName self.model = ZTranslationEditorModel(translation, defaultTranslation) style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER ZHeaderDialog.__init__(self, parent, wx.ID_ANY, _extstr(u"translationeditor.EditTranslation_") % translationDisplayName, style=style) #$NON-NLS-1$ ZPersistentDialogMixin.__init__( self, IZBlogAppUserPrefsKeys.TRANSLATION_DIALOG, True, True) self.selectedKey = None self.selectedValue = None # end __init__() def GetBestSize(self): return wx.Size(600, 500) # end GetBestSize() def _createNonHeaderWidgets(self): self.showOnlyCB = wx.CheckBox( self, wx.ID_ANY, _extstr(u"translationeditor.ShowOnlyUntranslated")) #$NON-NLS-1$ self.listProvider = ZStringBundleProvider(self.model) self.listBox = ZListViewEx(self.listProvider, self, wx.ID_ANY) bitmap = getFlagBitmapForLocale(u"en_US") #$NON-NLS-1$ self.englishFlag = ZStaticBitmap(self, bitmap) self.englishLabel = wx.StaticText( self, wx.ID_ANY, _extstr(u"translationeditor.EnglishValue")) #$NON-NLS-1$ bitmap = getFlagBitmapForLocale( self.model.getTranslation().getLocale().toString()) if bitmap is None: bitmap = getEmptyFlagBitmap() self.translationFlag = ZStaticBitmap(self, bitmap) self.translationLabel = wx.StaticText(self, wx.ID_ANY, self.translationDisplayName) self.englishText = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_BESTWRAP) self.translationText = wx.TextCtrl( self, wx.ID_ANY, style=wx.TE_MULTILINE | wx.TE_BESTWRAP | wx.TE_PROCESS_ENTER) self.translationText.Enable(False) self.staticLine = wx.StaticLine(self, wx.HORIZONTAL) # end _createNonHeaderWidgets() def _populateNonHeaderWidgets(self): self.showOnlyCB.SetValue(False) # end _populateNonHeaderWidgets() def _layoutNonHeaderWidgets(self): englishSizer = wx.BoxSizer(wx.HORIZONTAL) englishSizer.Add(self.englishFlag, 0, wx.ALL | wx.EXPAND, 2) englishSizer.Add(self.englishLabel, 1, wx.ALL | wx.EXPAND, 2) translationSizer = wx.BoxSizer(wx.HORIZONTAL) translationSizer.Add(self.translationFlag, 0, wx.ALL | wx.EXPAND, 2) translationSizer.Add(self.translationLabel, 1, wx.ALL | wx.EXPAND, 2) labelSizer = wx.BoxSizer(wx.HORIZONTAL) labelSizer.AddSizer(englishSizer, 1, wx.EXPAND) labelSizer.AddSizer(translationSizer, 1, wx.EXPAND) valueSizer = wx.BoxSizer(wx.HORIZONTAL) valueSizer.Add(self.englishText, 1, wx.ALL | wx.EXPAND, 2) valueSizer.Add(self.translationText, 1, wx.ALL | wx.EXPAND, 2) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.showOnlyCB, 0, wx.ALL | wx.EXPAND, 3) sizer.Add(self.listBox, 2, wx.ALL | wx.EXPAND, 3) sizer.AddSizer(labelSizer, 0, wx.ALL | wx.EXPAND, 1) sizer.AddSizer(valueSizer, 1, wx.ALL | wx.EXPAND, 1) sizer.Add(self.staticLine, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 2) return sizer # end _layoutNonHeaderWidgets() def _getHeaderTitle(self): return _extstr(u"translationeditor.TranslationEditor") #$NON-NLS-1$ # end _getHeaderTitle() def _getHeaderMessage(self): return _extstr(u"translationeditor.UseThisDialogMsg") #$NON-NLS-1$ # end _getHeaderMessage() def _getHeaderImagePath(self): return u"images/dialogs/translation/editor/header.png" #$NON-NLS-1$ # end _getHeaderImagePath() def _getHeaderHelpURL(self): return u"http://www.zoundry.com" #$NON-NLS-1$ # end _getHeaderHelpUrl() def _bindWidgetEvents(self): self._bindOkButton(self.onSave) self._bindCancelButton(self.onCancel) self.Bind(wx.EVT_CHECKBOX, self.onShowOnly, self.showOnlyCB) self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.onListSelection, self.listBox) self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.onListActivation, self.listBox) self.Bind(wx.EVT_TEXT_ENTER, self.onTranslationActivation, self.translationText) wx.EVT_KILL_FOCUS(self.translationText, self.onTranslationUnfocus) # end _bindWidgetEvents() def _setInitialFocus(self): self.listBox.SetFocus() # end _setInitialFocus() def _getOKButtonLabel(self): return _extstr(u"translationeditor.Save") #$NON-NLS-1$ # end _getOKButtonLabel() def onSave(self, event): wx.BusyCursor() self.model.save() event.Skip() # end onSave() def onCancel(self, event): if self.model.isDirty() and ZShowYesNoMessage( self, _extstr(u"translationeditor.CancelTranslationMessage"), _extstr(u"translationeditor.CancelTranslationTitle") ): #$NON-NLS-2$ #$NON-NLS-1$ self.model.getTranslation().clear() event.Skip() elif not self.model.isDirty(): event.Skip() # end onCancel() def onListSelection(self, event): self._doListSelection() event.Skip() # end onListSelection() def onShowOnly(self, event): self.model.setShowOnlyUntranslated(event.IsChecked()) self.listBox.refresh() event.Skip() # end onShowOnly() def onTranslationUnfocus(self, event): value = self.translationText.GetValue() # if there is a selection, and the value has changed if self.selectedKey is not None and value != self.selectedValue: value = getSafeString(value).strip() self.model.setTranslationValue(self.selectedKey, value) self.listBox.refresh() self.translationText.Enable(False) event.Skip() # end onTranslationUnfocus() def onListActivation(self, event): self._doListSelection() self.translationText.Enable(True) self.translationText.SetFocus() event.Skip() # end onListActivation() def onTranslationActivation(self, event): self.listBox.SetFocus() selectionIdx = self.listBox.getSelection()[0] if not self.showOnlyCB.IsChecked(): selectionIdx = selectionIdx + 1 self.listBox.Select(selectionIdx, True) self._doListSelection() event.Skip() # end onTranslationActivation() def _doListSelection(self): selectionIdx = self.listBox.getSelection()[0] self.selectedKey = self.model.getKeys()[selectionIdx] defValue = self.model.getDefaultValue(self.selectedKey) transValue = self.model.getTranslationValue(self.selectedKey) self.selectedValue = getSafeString(transValue).strip() self.englishText.SetValue(defValue) self.translationText.SetValue(self.selectedValue)