*Calc [#re1dafbc]
Calc で Accessibility API を利用するときに。
#contents
**Accessible セル [#r2b88953]
Accessible セルはセルが編集状態のときに下記のコードで取得できます。一方、編集状態でない場合には Accessible テーブルから取得します。
#code(python){{
from com.sun.star.accessibility.AccessibleRole import \
PARAGRAPH as AR_PARAGRAPH, TOOL_BAR as AR_TOOL_BAR, PANEL as AR_PANEL, \
TABLE as AR_TABLE, SCROLL_PANE as AR_SCROLL_PANE
def _get_acc_cell(comp_win):
acc = comp_win.getAccessibleContext()
n = acc.getAccessibleChildCount()
acc_cell = None
acc_table = None
interface_context = u'com.sun.star.accessibility.XAccessibleContext'
interface_accessible = u'com.sun.star.accessibility.XAccessible'
acc_service = u'com.sun.star.AccessibleSpreadsheetDocumentView' # !
service_info = u'com.sun.star.lang.XServiceInfo'
# search in the reverse order
for i in range(acc.getAccessibleChildCount()):
#print acc.getAccessibleChildCount()
if has_interface(acc, interface_context):
acc_item = acc.getAccessibleChild(i)
acc_ctx = acc_item.getAccessibleContext()
#print i
if acc_ctx.getAccessibleRole() == AR_SCROLL_PANE:
for v in range(acc_ctx.getAccessibleChildCount()):
acc_something = acc_ctx.getAccessibleChild(v)
#print v
if has_interface(acc_something, interface_accessible):
acc_doc = acc_something.getAccessibleContext()
#print "doc"
if has_interface(acc_doc, service_info) and \
acc_doc.supportsService(acc_service):
for j in range(acc_doc.getAccessibleChildCount()):
# if any cell is editting, two items are there
# document table and editting cell
#print j
acc_sub = acc_doc.getAccessibleChild(j)
if acc_sub.getAccessibleRole() == AR_TABLE:
# table
acc_table = acc_sub
elif acc_sub.getAccessibleRole() == AR_PANEL:
# cell
acc_cell = acc_sub.getAccessibleChild(0)
#return acc_cell
return acc_table, acc_cell
}}
**Accessible テーブル [#s3b4ba58]
上記 Accessible セルのコードの最初の引数から取得します。.accessibility.XAccessibleTable インターフェースなどを利用できます。
**Input Line [#x981b0b4]
数式バーにある InputLine。
コンポーネントウィンドウから取得します。数式バーが表示されていない時には取得に失敗します。
#code(python){{
def test_input_line(frame):
comp_win = frame.getComponentWindow()
input_line = _get_input_line(comp_win)
if input_line:
pass
from com.sun.star.accessibility.AccessibleRole import \
PARAGRAPH as AR_PARAGRAPH, TOOL_BAR as AR_TOOL_BAR, PANEL as AR_PANEL, \
SCROLL_PANE as AR_SCROLL_PANE
def _get_input_line(comp_win):
acc = comp_win.getAccessibleContext()
n = acc.getAccessibleChildCount()
if n < 2: return # first part is the document body window
acc_input_line = None
interface_context = u'com.sun.star.accessibility.XAccessibleContext'
interface_accessible = u'com.sun.star.accessibility.XAccessible'
# search in the reverse order
for i in range(acc.getAccessibleChildCount())[::-1]:
#print i
if has_interface(acc, interface_context):
acc_item = acc.getAccessibleChild(i)
if has_interface(acc_item, interface_accessible):
acc_toolbar = acc_item.getAccessibleContext()
if acc_toolbar.getAccessibleRole() == AR_TOOL_BAR:
for v in range(acc_toolbar.getAccessibleChildCount())[::-1]:
#print v
acc_item = acc_toolbar.getAccessibleChild(v)
if acc_item.getAccessibleRole() == AR_PANEL:
if acc_item.getAccessibleChildCount() > 0:
acc_panel = acc_item.getAccessibleChild(0)
if acc_panel.getAccessibleRole() == AR_PANEL:
if acc_panel.getAccessibleChildCount() > 0:
return acc_panel.getAccessibleChild(0)
#return acc_input_line
return acc_input_line
}}
***文字のフォントを変更する [#wf6086f0]
Input line では UI のフォントが利用されるがウムラートが表示されないフォントだったので困った。Courier にすれば表示できるということで試してみたが、二度目以降 OOo がクラッシュする。
#code(python){{
def change_font_of_the_input_line():
try:
ctx = XSCRIPTCONTEXT.getComponentContext()
comp_win = get_component_window()
if not comp_win: return
input_line = get_input_line(comp_win)
if not input_line: return
p = PropertyValue()
p.Name = u'CharFontName'
p.Value = u'Courier'
n = input_line.getCharacterCount()
uno.invoke(input_line, "setAttributes",
(0, n, uno.Any("[]com.sun.star.beans.PropertyValue", (p,))))
except Exception,e:
print e
}}