Create data pilots

This commit is contained in:
Mauricio Baeza 2021-04-13 21:47:45 -05:00
parent 0b450c2436
commit 97ff8c8221
1 changed files with 302 additions and 21 deletions

View File

@ -83,8 +83,9 @@ from com.sun.star.util import Time, Date, DateTime
from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK
from com.sun.star.text.TextContentAnchorType import AS_CHARACTER from com.sun.star.text.TextContentAnchorType import AS_CHARACTER
from com.sun.star.awt import XActionListener from com.sun.star.lang import Locale
from com.sun.star.lang import XEventListener from com.sun.star.lang import XEventListener
from com.sun.star.awt import XActionListener
from com.sun.star.awt import XMenuListener from com.sun.star.awt import XMenuListener
from com.sun.star.awt import XMouseListener from com.sun.star.awt import XMouseListener
from com.sun.star.awt import XMouseMotionListener from com.sun.star.awt import XMouseMotionListener
@ -204,6 +205,12 @@ class ConditionOperator():
CO = ConditionOperator CO = ConditionOperator
class DataPilotFieldOrientation():
from com.sun.star.sheet.DataPilotFieldOrientation \
import HIDDEN, COLUMN, ROW, PAGE, DATA
DPFO = DataPilotFieldOrientation
OS = platform.system() OS = platform.system()
IS_WIN = OS == 'Windows' IS_WIN = OS == 'Windows'
IS_MAC = OS == 'Darwin' IS_MAC = OS == 'Darwin'
@ -309,6 +316,11 @@ def get_app_config(node_name: str, key: str=''):
LANGUAGE = get_app_config('org.openoffice.Setup/L10N/', 'ooLocale') LANGUAGE = get_app_config('org.openoffice.Setup/L10N/', 'ooLocale')
LANG = LANGUAGE.split('-')[0] LANG = LANGUAGE.split('-')[0]
try:
COUNTRY = LANGUAGE.split('-')[1]
except:
COUNTRY = ''
LOCALE = Locale(LANG, COUNTRY, '')
NAME = TITLE = get_app_config('org.openoffice.Setup/Product', 'ooName') NAME = TITLE = get_app_config('org.openoffice.Setup/Product', 'ooName')
VERSION = get_app_config('org.openoffice.Setup/Product','ooSetupVersion') VERSION = get_app_config('org.openoffice.Setup/Product','ooSetupVersion')
@ -1526,6 +1538,142 @@ class LOSheetCharts(object):
return LOChart(name, self.obj[name], self._sheet.draw_page) return LOChart(name, self.obj[name], self._sheet.draw_page)
class LOSheetTableField(object):
def __init__(self, obj):
self._obj = obj
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
pass
@property
def obj(self):
return self._obj
@property
def name(self):
return self.obj.Name
@property
def orientation(self):
return self.obj.Orientation
@orientation.setter
def orientation(self, value):
self.obj.Orientation = value
# ~ com.sun.star.sheet.DataPilotFieldOrientation.ROW
class LOSheetTable(object):
def __init__(self, obj):
self._obj = obj
self._source = None
def __getitem__(self, index):
field = self.obj.DataPilotFields[index]
return LOSheetTableField(field)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
pass
@property
def obj(self):
return self._obj
@property
def filter(self):
return self.obj.ShowFilterButton
@filter.setter
def filter(self, value):
self.obj.ShowFilterButton = value
@property
def source(self):
return self._source
@source.setter
def source(self, value):
self._source = value
self.obj.SourceRange = value.range_address
@property
def rows(self):
return self.obj.RowFields
@rows.setter
def rows(self, values):
if not isinstance(values, tuple):
values = (values,)
for v in values:
with self[v] as f:
f.orientation = DPFO.ROW
@property
def columns(self):
return self.obj.ColumnFields
@columns.setter
def columns(self, values):
if not isinstance(values, tuple):
values = (values,)
for v in values:
with self[v] as f:
f.orientation = DPFO.COLUMN
@property
def data(self):
return self.obj.DataFields
@data.setter
def data(self, values):
if not isinstance(values, tuple):
values = (values,)
for v in values:
with self[v] as f:
f.orientation = DPFO.DATA
class LOSheetTables(object):
def __init__(self, obj, sheet):
self._obj = obj
self._sheet = sheet
def __getitem__(self, index):
return LOSheetTable(self.obj[index])
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
pass
def __contains__(self, item):
return item in self.obj
@property
def obj(self):
return self._obj
@property
def count(self):
return self.obj.Count
@property
def names(self):
return self.obj.ElementNames
def new(self, name, target):
table = self.obj.createDataPilotDescriptor()
self.obj.insertNewByName(name, target.address, table)
return LOSheetTable(self.obj[name])
def remove(self, name):
self.obj.removeByName(name)
return
class LOFormControl(LOBaseObject): class LOFormControl(LOBaseObject):
EVENTS = { EVENTS = {
'action': 'actionPerformed', 'action': 'actionPerformed',
@ -2051,6 +2199,10 @@ class LOCalcSheet(object):
def charts(self): def charts(self):
return LOSheetCharts(self.obj.Charts, self) return LOSheetCharts(self.obj.Charts, self)
@property
def tables(self):
return LOSheetTables(self.obj.DataPilotTables, self)
@property @property
def rows(self): def rows(self):
return LOSheetRows(self, self.obj.Rows) return LOSheetRows(self, self.obj.Rows)
@ -2730,6 +2882,55 @@ class LOCalcRange(object):
return return
class LOWriterStyles(object):
def __init__(self, styles):
self._styles = styles
@property
def names(self):
return {s.DisplayName: s.Name for s in self._styles}
def __str__(self):
return '\n'.join(tuple(self.names.values()))
class LOWriterStylesFamilies(object):
def __init__(self, styles):
self._styles = styles
def __getitem__(self, index):
styles = {
'Character': 'CharacterStyles',
'Paragraph': 'ParagraphStyles',
'Page': 'PageStyles',
'Frame': 'FrameStyles',
'Numbering': 'NumberingStyles',
'Table': 'TableStyles',
'Cell': 'CellStyles',
}
name = styles.get(index, index)
return LOWriterStyles(self._styles[name])
def __iter__(self):
self._index = 0
return self
def __next__(self):
obj = LOWriterStyles(self._styles[self._index])
self._index += 1
return obj
# ~ raise StopIteration
@property
def names(self):
return self._styles.ElementNames
def __str__(self):
return '\n'.join(self.names)
class LOWriterPageStyle(LOBaseObject): class LOWriterPageStyle(LOBaseObject):
def __init__(self, obj): def __init__(self, obj):
@ -2766,18 +2967,23 @@ class LOWriterTextRange(object):
self._doc = doc self._doc = doc
self._is_paragraph = self.obj.ImplementationName == 'SwXParagraph' self._is_paragraph = self.obj.ImplementationName == 'SwXParagraph'
self._is_table = self.obj.ImplementationName == 'SwXTextTable' self._is_table = self.obj.ImplementationName == 'SwXTextTable'
self._is_text = self.obj.ImplementationName == 'SwXTextPortion'
self._parts = []
if self._is_paragraph:
self._parts = [LOWriterTextRange(p, doc) for p in obj]
def __iter__(self): def __iter__(self):
self._index = 0 self._index = 0
return self return self
def __next__(self): def __next__(self):
for i, p in enumerate(self.obj): try:
if i == self._index: obj = self._parts[self._index]
obj = LOWriterTextRange(p, self._doc) except IndexError:
self._index += 1 raise StopIteration
return obj
raise StopIteration self._index += 1
return obj
@property @property
def obj(self): def obj(self):
@ -2796,11 +3002,37 @@ class LOWriterTextRange(object):
@property @property
def value(self): def value(self):
return self.string return self.string
@value.setter
def value(self, value):
self.string = value
@property
def style(self):
s = ''
if self.is_paragraph:
s = self.obj.ParaStyleName
elif self.is_text:
s = self.obj.CharStyleName
return s
@style.setter
def style(self, value):
if self.is_paragraph:
self.obj.ParaStyleName = value
elif self.is_text:
self.obj.CharStyleName = value
@property
def is_paragraph(self):
return self._is_paragraph
@property @property
def is_table(self): def is_table(self):
return self._is_table return self._is_table
@property
def is_text(self):
return self._is_text
@property @property
def text(self): def text(self):
return self.obj.Text return self.obj.Text
@ -2813,6 +3045,13 @@ class LOWriterTextRange(object):
def dp(self): def dp(self):
return self._doc.dp return self._doc.dp
def delete(self):
cursor = self.cursor
cursor.gotoStartOfParagraph(False)
cursor.gotoNextParagraph(True)
cursor.String = ''
return
def offset(self): def offset(self):
cursor = self.cursor.getEnd() cursor = self.cursor.getEnd()
return LOWriterTextRange(cursor, self._doc) return LOWriterTextRange(cursor, self._doc)
@ -2857,25 +3096,26 @@ class LOWriterTextRanges(object):
def __init__(self, obj, doc): def __init__(self, obj, doc):
self._obj = obj self._obj = obj
self._doc = doc self._doc = doc
self._paragraphs = [LOWriterTextRange(p, doc) for p in obj]
def __len__(self):
return len(self._paragraphs)
def __getitem__(self, index): def __getitem__(self, index):
for i, p in enumerate(self.obj): return self._paragraphs[index]
if i == index:
obj = LOWriterTextRange(p, self._doc)
break
return obj
def __iter__(self): def __iter__(self):
self._index = 0 self._index = 0
return self return self
def __next__(self): def __next__(self):
for i, p in enumerate(self.obj): try:
if i == self._index: obj = self._paragraphs[self._index]
obj = LOWriterTextRange(p, self._doc) except IndexError:
self._index += 1 raise StopIteration
return obj
raise StopIteration self._index += 1
return obj
@property @property
def obj(self): def obj(self):
@ -2931,7 +3171,7 @@ class LOWriter(LODocument):
@property @property
def text(self): def text(self):
return LOWriterTextRange(self.obj.Text, self) return self.paragraphs
@property @property
def paragraphs(self): def paragraphs(self):
@ -2984,6 +3224,10 @@ class LOWriter(LODocument):
ps = self.obj.StyleFamilies['PageStyles'] ps = self.obj.StyleFamilies['PageStyles']
return LOWriterPageStyles(ps) return LOWriterPageStyles(ps)
@property
def styles(self):
return LOWriterStylesFamilies(self.obj.StyleFamilies)
@property @property
def search_descriptor(self): def search_descriptor(self):
return self.obj.createSearchDescriptor() return self.obj.createSearchDescriptor()
@ -5843,6 +6087,7 @@ _CB = ClipBoard
class Paths(object): class Paths(object):
FILE_PICKER = 'com.sun.star.ui.dialogs.FilePicker' FILE_PICKER = 'com.sun.star.ui.dialogs.FilePicker'
FOLDER_PICKER = 'com.sun.star.ui.dialogs.FolderPicker'
def __init__(self, path=''): def __init__(self, path=''):
if path.startswith('file://'): if path.startswith('file://'):
@ -5952,7 +6197,7 @@ class Paths(object):
@classmethod @classmethod
def get_dir(cls, init_dir=''): def get_dir(cls, init_dir=''):
folder_picker = create_instance(cls.FILE_PICKER) folder_picker = create_instance(cls.FOLDER_PICKER)
if not init_dir: if not init_dir:
init_dir = cls.documents init_dir = cls.documents
init_dir = cls.to_url(init_dir) init_dir = cls.to_url(init_dir)
@ -5961,7 +6206,7 @@ class Paths(object):
path = '' path = ''
if folder_picker.execute(): if folder_picker.execute():
path = cls.to_system(folder_picker.getDisplayDirectory()) path = cls.to_system(folder_picker.getDirectory())
return path return path
@classmethod @classmethod
@ -6230,6 +6475,42 @@ class Paths(object):
_P = Paths _P = Paths
class SpellChecker(object):
def __init__(self):
service = 'com.sun.star.linguistic2.SpellChecker'
self._spellchecker = create_instance(service, True)
self._locale = LOCALE
@property
def locale(self):
slocal = f'{self._locale.Language}-{self._locale.Country}'
return slocale
@locale.setter
def locale(self, value):
lang = value.split('-')
self._locale = Locale(lang[0], lang[1], '')
def is_valid(self, word):
result = self._spellchecker.isValid(word, self._locale, ())
return result
def spell(self, word):
result = self._spellchecker.spell(word, self._locale, ())
if result:
result = result.getAlternatives()
if not isinstance(result, tuple):
result = ()
return result
def spell(word, locale=''):
sc = SpellChecker()
if locale:
sc.locale = locale
return sc.spell(word)
def __getattr__(name): def __getattr__(name):
if name == 'active': if name == 'active':
return LODocs().active return LODocs().active