Index: gc_lang/fr/config.ini ================================================================== --- gc_lang/fr/config.ini +++ gc_lang/fr/config.ini @@ -90,10 +90,13 @@ # TextFormatter oxt/TextFormatter/TextFormatter.py = pythonpath/TextFormatter.py oxt/TextFormatter/tf_strings.py = pythonpath/tf_strings.py oxt/TextFormatter/tf_options.py = pythonpath/tf_options.py oxt/TextFormatter/tf_tabrep.py = pythonpath/tf_tabrep.py +# Lexicographer +oxt/Lexicographer/Enumerator.py = pythonpath/Enumerator.py +oxt/Lexicographer/enum_strings.py = pythonpath/enum_strings.py # Conjugueur oxt/Conjugueur/Conjugueur.py = pythonpath/Conjugueur.py # Modify author oxt/ChangeAuthor/Author.py = pythonpath/Author.py oxt/ChangeAuthor/ca_strings.py = pythonpath/ca_strings.py Index: gc_lang/fr/oxt/AppLauncher.py ================================================================== --- gc_lang/fr/oxt/AppLauncher.py +++ gc_lang/fr/oxt/AppLauncher.py @@ -52,10 +52,14 @@ xDialog.run(self.sLang) elif sCmd == "OP": import Options xDialog = Options.GC_Options(self.ctx) xDialog.run(self.sLang) + elif sCmd == "EN": + import Enumerator + xDialog = Enumerator.Enumerator(self.ctx) + xDialog.run(self.sLang) elif sCmd.startswith("FA/"): findAll(sCmd[6:], (sCmd[3:4] == "y"), (sCmd[4:5] == "y")) # elif sCmd.startswith("URL/"): # # Call from context menu to launch URL? # # http://opengrok.libreoffice.org/xref/core/sw/source/ui/lingu/olmenu.cxx#785 ADDED gc_lang/fr/oxt/Lexicographer/Enumerator.py Index: gc_lang/fr/oxt/Lexicographer/Enumerator.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/Lexicographer/Enumerator.py @@ -0,0 +1,200 @@ +# Dictionary Options +# by Olivier R. +# License: MPL 2 + +import unohelper +import uno +import traceback +import time + +import helpers +import enum_strings +import grammalecte.graphspell as sc + +from com.sun.star.task import XJobExecutor +from com.sun.star.awt import XActionListener +from com.sun.star.beans import PropertyValue + + +class Enumerator (unohelper.Base, XActionListener, XJobExecutor): + + def __init__ (self, ctx): + self.ctx = ctx + self.xSvMgr = self.ctx.ServiceManager + self.xDesktop = self.xSvMgr.createInstanceWithContext("com.sun.star.frame.Desktop", self.ctx) + self.xDocument = self.xDesktop.getCurrentComponent() + self.xContainer = None + self.xDialog = None + self.oSpellChecker = None + + def _addWidget (self, name, wtype, x, y, w, h, **kwargs): + xWidget = self.xDialog.createInstance('com.sun.star.awt.UnoControl%sModel' % wtype) + xWidget.Name = name + xWidget.PositionX = x + xWidget.PositionY = y + xWidget.Width = w + xWidget.Height = h + for k, w in kwargs.items(): + setattr(xWidget, k, w) + self.xDialog.insertByName(name, xWidget) + return xWidget + + def _addGrid (self, name, x, y, w, h, columns, **kwargs): + xGridModel = self.xDialog.createInstance('com.sun.star.awt.grid.UnoControlGridModel') + xGridModel.Name = name + xGridModel.PositionX = x + xGridModel.PositionY = y + xGridModel.Width = w + xGridModel.Height = h + xColumnModel = xGridModel.ColumnModel + for e in columns: + xCol = xColumnModel.createColumn() + for k, w in e.items(): + setattr(xCol, k, w) + xColumnModel.addColumn(xCol) + for k, w in kwargs.items(): + setattr(xGridModel, k, w) + self.xDialog.insertByName(name, xGridModel) + return xGridModel + + def run (self, sLang): + dUI = enum_strings.getUI(sLang) + + # dialog + self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx) + self.xDialog.Width = 240 + self.xDialog.Height = 280 + self.xDialog.Title = dUI.get('title', "#title#") + xWindowSize = helpers.getWindowSize() + self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2)) + self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2)) + + # fonts + xFDTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDTitle.Height = 9 + xFDTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDTitle.Name = "Verdana" + + xFDSubTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDSubTitle.Height = 8 + xFDSubTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDSubTitle.Name = "Verdana" + + # widget + nX = 10 + nY1 = 10 + nY2 = nY1 + 225 + + nWidth = self.xDialog.Width - 20 + nHeight = 10 + + # List + self._addWidget("list_section", 'FixedLine', nX, nY1, nWidth, nHeight, Label = dUI.get("list_section", "#err"), FontDescriptor = xFDTitle) + self._addWidget('count_button', 'Button', nX, nY1+12, 70, 10, Label = dUI.get('count_button', "#err")) + self._addWidget('count2_button', 'Button', nX+75, nY1+12, 70, 10, Label = dUI.get('count2_button', "#err")) + self._addWidget('unknown_button', 'Button', nX+150, nY1+12, 70, 10, Label = dUI.get('unknown_button', "#err")) + self.xGridModel = self._addGrid("list_grid", nX, nY1+25, nWidth, 180, [ + {"Title": "Mot", "ColumnWidth": 180}, + {"Title": "Occur.", "ColumnWidth": 40} + ]) + self._addWidget('num_of_words', 'FixedText', nX, nY1+210, 60, nHeight, Label = dUI.get('num_of_words', "#err"), Align = 2) + self.xNumWord = self._addWidget('num_of_words_res', 'FixedText', nX+65, nY1+210, 30, nHeight, Label = "—") + self._addWidget('tot_of_words', 'FixedText', nX+100, nY1+210, 60, nHeight, Label = dUI.get('tot_of_words', "#err"), Align = 2) + self.xTotWord = self._addWidget('total_words_res', 'FixedText', nX+165, nY1+210, 30, nHeight, Label = "—") + + # Tag + self._addWidget("tag_section", 'FixedLine', nX, nY2, nWidth, nHeight, Label = dUI.get("tag_section", "#err"), FontDescriptor = xFDTitle) + + self._addWidget('tag_button', 'Button', nX, self.xDialog.Height-25, 50, 14, Label = dUI.get('tag_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x000000) + + # Close + self._addWidget('close_button', 'Button', self.xDialog.Width-60, self.xDialog.Height-25, 50, 14, Label = dUI.get('close_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x550000) + + # container + self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx) + self.xContainer.setModel(self.xDialog) + + self.xContainer.getControl('count_button').addActionListener(self) + self.xContainer.getControl('count_button').setActionCommand('Count') + self.xContainer.getControl('count2_button').addActionListener(self) + self.xContainer.getControl('count2_button').setActionCommand('CountByLemma') + self.xContainer.getControl('unknown_button').addActionListener(self) + self.xContainer.getControl('unknown_button').setActionCommand('UnknownWords') + self.xContainer.getControl('tag_button').addActionListener(self) + self.xContainer.getControl('tag_button').setActionCommand('Tag') + self.xContainer.getControl('close_button').addActionListener(self) + self.xContainer.getControl('close_button').setActionCommand('Close') + self.xContainer.setVisible(False) + toolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx) + self.xContainer.createPeer(toolkit, None) + self.xContainer.execute() + + # XActionListener + def actionPerformed (self, xActionEvent): + try: + if xActionEvent.ActionCommand == "Count": + self.count() + elif xActionEvent.ActionCommand == "CountByLemma": + self.count(bByLemma=True) + elif xActionEvent.ActionCommand == "UnknownWords": + self.count(bOnlyUnknownWords=True) + elif xActionEvent.ActionCommand == "Tag": + pass + elif xActionEvent.ActionCommand == "Close": + self.xContainer.endExecute() + except: + traceback.print_exc() + + # XJobExecutor + def trigger (self, args): + try: + xDialog = Enumerator(self.ctx) + xDialog.run() + except: + traceback.print_exc() + + # Code + def getParagraphsOfText (self): + "generator: returns full document text paragraph by paragraph" + xCursor = self.xDocument.Text.createTextCursor() + xCursor.gotoStart(False) + xCursor.gotoEndOfParagraph(True) + yield xCursor.getString() + while xCursor.gotoNextParagraph(False): + xCursor.gotoEndOfParagraph(True) + yield xCursor.getString() + + def count (self, bByLemma=False, bOnlyUnknownWords=False): + # change pointer + xPointer = self.xSvMgr.createInstanceWithContext("com.sun.star.awt.Pointer", self.ctx) + xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.WAIT")) + xWindowPeer = self.xContainer.getPeer() + xWindowPeer.setPointer(xPointer) + for x in xWindowPeer.Windows: + x.setPointer(xPointer) + # processing + if not self.oSpellChecker: + self.oSpellChecker = sc.SpellChecker("fr") + xGridDataModel = self.xGridModel.GridDataModel + xGridDataModel.removeAllRows() + dWord = {} + for sParagraph in self.getParagraphsOfText(): + dWord = self.oSpellChecker.countWordsOccurrences(sParagraph, bByLemma, bOnlyUnknownWords, dWord) + i = 0 + nTotOccur = 0 + for k, w in sorted(dWord.items(), key=lambda t: t[1], reverse=True): + xGridDataModel.addRow(i, (k, w)) + i += 1 + nTotOccur += w + self.xNumWord.Label = str(i) + self.xTotWord.Label = str(nTotOccur) + # end of processing + xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.ARROW")) + xWindowPeer.setPointer(xPointer) + for x in xWindowPeer.Windows: + x.setPointer(xPointer) + self.xContainer.setVisible(True) # seems necessary to refresh the dialog box and text widgets (why?) + + +#g_ImplementationHelper = unohelper.ImplementationHelper() +#g_ImplementationHelper.addImplementation(Enumerator, 'net.grammalecte.enumerator', ('com.sun.star.task.Job',)) ADDED gc_lang/fr/oxt/Lexicographer/enum_strings.py Index: gc_lang/fr/oxt/Lexicographer/enum_strings.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/Lexicographer/enum_strings.py @@ -0,0 +1,37 @@ +def getUI (sLang): + if sLang in dStrings: + return dStrings[sLang] + return dStrings["fr"] + +dStrings = { + "fr": { + "title": "Grammalecte · Recenseur", + + "list_section": "Calcul des occurrences des mots", + "count_button": "Compter tout", + "count2_button": "Compter par lemme", + "unknown_button": "Mots inconnus", + "num_of_words": "Nombre de mots :", + "tot_of_words": "Total des mots :", + + "tag_section": "Formatage", + "tag": "Taguer", + + "close_button": "Fermer", + }, + "en": { + "title": "Grammalecte · Enumerator", + + "list_section": "Words", + "count_button": "Count all", + "count2_button": "Count by lemma", + "unknown_button": "Unknown words", + "num_of_words": "Number of words:", + "tot_of_words": "Total of words:", + + "tag_section": "Format", + "tag": "Tag", + + "close_button": "Close", + }, +} Index: gc_lang/fr/oxt/addons.xcu ================================================================== --- gc_lang/fr/oxt/addons.xcu +++ gc_lang/fr/oxt/addons.xcu @@ -69,10 +69,26 @@ com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument + + service:net.grammalecte.AppLauncher?EN + + + + ~Recenseur… + ~Enumerator… + + + _self + + + com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument + + + service:net.grammalecte.AppLauncher?MA @@ -87,19 +103,19 @@ com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument - + private:separator com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument - + service:net.grammalecte.AppLauncher?OP