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

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