class TextEditBone(html5.Div): def __init__(self, moduleName, boneName, readOnly, isPlainText, languages=None, descrHint=None, *args, **kwargs): super(TextEditBone, self).__init__(*args, **kwargs) self.moduleName = moduleName self.boneName = boneName self.readOnly = readOnly self.selectedLang = False self.isPlainText = isPlainText self.languages = languages self.descrHint = descrHint self.value = {} # multilangbone if self.languages: if "currentlanguage" in conf and conf[ "currentlanguage"] in self.languages: self.selectedLang = conf["currentlanguage"] elif len(self.languages) > 0: self.selectedLang = self.languages[0] self.langButContainer = html5.Div() self.langButContainer["class"].append("languagebuttons") for lang in self.languages: abut = html5.ext.Button(lang, self.changeLang) abut["value"] = lang self.langButContainer.appendChild(abut) self.appendChild(self.langButContainer) self._refreshBtnStates() if not readOnly and not self.isPlainText: self.input = HtmlEditor() self.input.boneName = self.boneName else: self.input = html5.Textarea() if readOnly: self.input["readonly"] = True self.appendChild(self.input) self.sinkEvent("onKeyUp") self.changeEvent = EventDispatcher("boneChange") def _setDisabled(self, disable): """ Reset the is_active flag (if any) """ super(TextEditBone, self)._setDisabled(disable) if not disable and not self._disabledState and "is_active" in self.parent( )["class"]: self.parent()["class"].remove("is_active") def changeLang(self, btn): self.value[self.selectedLang] = self.input["value"] self.selectedLang = btn["value"] self.input["value"] = self.value.get(self.selectedLang, "") self._refreshBtnStates() def _refreshBtnStates(self): for btn in self.langButContainer.children(): if self.value.get(btn["value"]): btn.removeClass("is_unfilled") btn.addClass("is_filled") else: btn.removeClass("is_filled") btn.addClass("is_unfilled") if btn["value"] == self.selectedLang: btn.addClass("is_active") else: btn.removeClass("is_active") @staticmethod def fromSkelStructure(moduleName, boneName, skelStructure, *args, **kwargs): readOnly = "readonly" in skelStructure[boneName].keys( ) and skelStructure[boneName]["readonly"] isPlainText = "validHtml" in skelStructure[boneName].keys( ) and not skelStructure[boneName]["validHtml"] langs = skelStructure[boneName]["languages"] if ( "languages" in skelStructure[boneName].keys() and skelStructure[boneName]["languages"]) else None descr = skelStructure[boneName]["descr"] if "descr" in skelStructure[ boneName].keys() else None return TextEditBone(moduleName, boneName, readOnly, isPlainText, langs, descrHint=descr) def unserialize(self, data): data = data.get(self.boneName) or "" if self.languages: self.value.clear() for lang in self.languages: if isinstance(data, dict): self.value[lang] = data.get(lang, "") else: self.value[lang] = data self.input["value"] = self.value[self.selectedLang] self._refreshBtnStates() else: self.input["value"] = data def serializeForPost(self): if self.selectedLang: self.value[self.selectedLang] = self.input["value"] return {self.boneName: self.value.copy()} return {self.boneName: self.input["value"]} def serializeForDocument(self): return self.serializeForPost() def setExtendedErrorInformation(self, errorInfo): pass def onKeyUp(self, event): self.changeEvent.fire(self) @staticmethod def checkForTextBone(moduleName, boneName, skelStucture, *args, **kwargs): return skelStucture[boneName]["type"] == "text"