- サマリ: AOO 4.0 における API の変更点
- 環境: General
- 状態: 解決
- 投稿者: はにゃ??
- 投稿日: 2013-01-10 (Thu) 00:49:58
質問 
Apache OpenOffice 4.0 で既存の API に変更が加えられる予定です。メジャーバージョンの増加に伴い、互換性の無い変更も行われる予定です。変更点は主に以下のようなものになると思われます。
- 初期化に引数を伴うサービスのコンストラクタ導入
- インターフェースの統合 (publish されて変更できなかったことによる 1, 2, 3, ... インターフェースなど)
- 不要な引数の削除
- 非推奨だったインターフェース削除
以下に変更点をまとめます。
コントロール関連 
i121514
- css.awt.UnoControlSimpleAnimation, UnoControlSimpleAnimationModel
- 非推奨サービス削除。css.awt.AnimatedImagesControl 使用のこと。
- css.awt.XSimpleAnimation
i121513
- css.awt.UnoControlThrobber, UnoControlThrobberModel
- 非推奨サービス削除。css.awt.SpinningProgressControlModel 使用のこと。
- css.awt.XThrobber
ウィンドウ関連 
i121442
- css.awt.XGraphics
- get/set メソッドが属性に変更。
- drawImage メソッドが追加。
メッセージボックス関連 
i121544
- css.awt.XMessageBoxFactory::createMessageBox
- 二番目引数 css.awt.Rectangle 削除
- (元) 三番目引数の指定が string から css.awt.MessageBoxType 列挙型に変更
- css.awt.MessageBoxType 追加
- createMessageBox メソッドでメッセージボックスの形式を指定
- css.awt.MessageBoxResults 追加
- css.awt.XMessageBox
- get/setCaptionText メソッドが CaptionText 属性に変更
- get/setMessageText メソッドが MessageText 属性に変更
- execute メソッドの返り値が css.awt.MessageBoxResults に定義された
- deprecated フラグが削除された
- css.awt.MessageBoxCommand
メニュー関連 
i121542
- css.awt.XMenuExtended, XMenuExtended2, XMenuBarExtended, XPopupMenuExtended
- 削除されて css.awt.XMenu および css.awt.XPopupMenu に統合。一部に非互換性あり。
- css.awt.MenuLogo 削除
- XPopupMenuExtended::get/setLogo メソッド削除
- css.awt.XPopupMenuExtended
- 以下のメソッドが削除
- get/setItemImageAngle, setItemImageMirrorMode, isItemImageInMirrorMode
css.awt.XPopupMenu::execute
css.awt.Rectangle の代わりに css.awt.Point を受け取るように 変更なし
- css.awt.XMenu
- set/getHelpText、set/getTipHelpText、enableAutoMnemonics メソッドが XPopupMenuExtended から移動
システム関連 
i121578
- css.system.SystemShellExecute
i121579
- css.system.SimpleCommandMail, SimpleSystemMail
- Windows 用および UNIX 用だったため、統合して css.system.SystemMailProvider に
- css.system.XSimpleMailClientSupplier
- css.system.XSystemMailProvider に変更
- css.system.XSimpleMailClient, XSimpleMailMessage, SimpleMailClientFlags
- css.system.XMailMessage
- 元の XSimpleMailMessage のメソッドは属性に変更
i121548
- プロキシ API 定義
- 長らく使用されていなかった、非推奨のプロキシ関連 IDL 削除
Writer 関連 
i25945
- css.text.ViewSettings
- ShowContentTips, ShowScrollBarTips 追加。
Calc 関連 
i120478
UI 関連 
サイドバー関連の IDL が追加されています。
- 以下追加
- css.ui.ContextChangeEventMultiplexer
- css.ui.ContextChangeEventObject
- css.ui.LayoutSize
- css.ui.XContextChangeEventListener
- css.ui.XContextChangeEventMultiplexer
- css.ui.XContextChangeListener
- css.ui.XSidebar
- css.ui.XSidebarPanel
- 以下変更
- css.util.EventMultiplexer
UCB 関連 
i121946
WebDav 関連のバグ修正に基づき、いくつか変更点があります。
- css.ucb.WebDAVHTTPMethod 追加
- css.ucb.XWebDAVCommandEnvironment
- getUserRequestHeaders メソッドの二番目の引数が文字列から WebDAVHTTPMethod に変更に
frame モジュール 
- css.frame.PopupMenuControllerFactory
- css.frame.StatusbarControllerFactory
- コンストラクタ追加
- css.frame.ToolbarControllerFactory
- 追加
deprecated 
- css.configuration.BootstrapContext
インターフェースのチェック方法 
C++ や Java など、API のインターフェースなどの静的な型が必要な場合は再コンパイルする必要があります。Java ではリフレクションを使うと無理やり同じバイナリが 3.X と 4 で動作するようにできるかもしれません。
一方、動的に型が決まる Basic、Python などでは変更点が少なければ、バージョンごとのパッケージを用意するのではなく、どちらでも動作するパッケージとしたくなります。Apache OpenOffice が提供しているリフレクション API を利用して、インターフェースやメソッドの返り値や引数を動的に調べることができます。
以下は Python での例です。
0
1
2
3
4
5
6
| | def create_service(ctx, name, args=None):
""" Create service with args if required. """
smgr = ctx.getServiceManager()
if args:
return smgr.createInstanceWithArgumentsAndContext(name, args, ctx)
else:
return smgr.createInstanceWithContext(name, ctx)
|
インターフェースの存在確認 
インターフェースが削除されてなくなった場合、そのインターフェースの有無を確認するには以下のようにします。
0
1
2
3
4
5
6
7
| | def interface_exists(ctx, name):
""" Check the interface exists. """
cr = create_service("com.sun.star.reflection.CoreReflection")
try:
return cr.hasByHierarchicalName(name)
except:
pass
return False
|
引数にはコンポーネントコンテキストと有無を確認したいインターフェース名を指定します。この関数はあまり利用する機会はないでしょう。
メソッドの引数を確認 
インターフェースの個々のメソッドが同名のまま引数が変更された場合などには以下のようにして引数を確認できます。
0
1
2
3
4
5
6
7
8
9
10
11
| | def check_method_parameter(ctx, interface_name, method_name, param_index, param_type):
""" Check the method has specific type parameter at the specific position. """
cr = create_service(ctx, "com.sun.star.reflection.CoreReflection")
try:
idl = cr.forName(interface_name)
m = idl.getMethod(method_name)
if m:
info = m.getParameterInfos()[param_index]
return info.aType.getName() == param_type
except:
pass
return False
|
引数は、コンポーネントコンテキスト、メソッドの所属するインターフェース名、メソッド名、引数の位置、引数の型です。指定した引数の型が合致する場合 True を返します。
例 
以下はメッセージボックスで上記の関数を利用してメソッドの引数を変更しています。メッセージボックスを作成する関数 createMessageBox の二番目の css.awt.Rectangle 型の引数がなくなったため、二番目の引数の型を確認します。
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| | def messagebox(ctx, parent, message, title, message_type, buttons):
""" Show message in message box. """
toolkit = parent.getToolkit()
older_imple = check_method_parameter(
ctx, "com.sun.star.awt.XMessageBoxFactory", "createMessageBox",
1, "com.sun.star.awt.Rectangle")
if older_imple:
msgbox = toolkit.createMessageBox(
parent, Rectangle(), message_type, buttons, title, message)
else:
message_type = uno.getConstantByName("com.sun.star.awt.MessageBoxType." + {
"messbox": "MESSAGEBOX", "infobox": "INFOBOX",
"warningbox": "WARNINGBOX", "errorbox": "ERRORBOX",
"querybox": "QUERYBOX"}[message_type])
msgbox = toolkit.createMessageBox(
parent, message_type, buttons, title, message)
n = msgbox.execute()
msgbox.dispose()
return n
|
リストに引数を追加していき、引数展開で渡してもいいかもしれません。
ボックスの形式を指定する方法も文字列から列挙型になっています。
回答 
感想,コメント,メモ 