*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 }} |