Create data pilots
This commit is contained in:
parent
0b450c2436
commit
97ff8c8221
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue