Calc Edit

Calc で Accessibility API を利用するときに。

Accessible セル Edit

Accessible セルはセルが編集状態のときに下記のコードで取得できます。一方、編集状態でない場合には Accessible テーブルから取得します。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
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 テーブル Edit

上記 Accessible セルのコードの最初の引数から取得します。.accessibility.XAccessibleTable インターフェースなどを利用できます。

Input Line Edit

数式バーにある InputLine。

コンポーネントウィンドウから取得します。数式バーが表示されていない時には取得に失敗します。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
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

文字のフォントを変更する Edit

Input line では UI のフォントが利用されるがウムラートが表示されないフォントだったので困った。Courier にすれば表示できるということで試してみたが、二度目以降 OOo がクラッシュする。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
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

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes