LibreOffice5(62)Map AppFont (ma)とピクセル

2017-07-24

旧ブログ

t f B! P L
LibreOffice5(58)モードレスダイアログの例をPythonに翻訳する:その4で遭遇したMap AppFont (ma)とピクセルについてもっと詳しくみます。オプションダイアログはxdlファイルを使う必要がありxdlファイルではma単位なので(LibreOffice5(64)オプションページを持つ拡張機能の例を作る: その2)、ma単位も使っていくことにしました。

前の関連記事:LibreOffice5(61)オプションダイアログの作成例: MaximumPageSize.oxt


(2018.1.22追記。コンテナウィンドウやコンポーネントウィンドウのXUnitConversionインターフェイスのメソッドでma単位とピクセルの変換ができました。
componentwindow.convertPointToLogic(Point(X=x, Y=y), MeasureUnit.APPFONT)
これでピクセル単位がma単位に変換できました。componentwindowにはコンポーネントウィンドウが入っており、PointはStruct、MeasureUnitは定数です。)

ダイアログエディタで作成したダイアログの単位はMap AppFont (ma)


LibreOffice5(21)ダイアログエディタでGUIを作成しPythonで利用する:その1でやったLibreOfficeのダイアログエディタで作成したxdlファイルでの単位はMap AppFont (ma)とわかりました。

Pythonからxdlファイルのダイアログを呼び出すとコントロールモデルのプロパティではma単位、コントロールのgetPosSize()メソッドからはそのピクセル(px)単位が確認できることがわかりました。

ということでLibreOffice5(61)オプションダイアログの作成例: MaximumPageSize.oxtで使ったMaximumPageSize.oxtに含まれているmytoolsExtensionsMaximumPaperSize.xdlで定義されてる各コントロールについて、ma単位とpx単位を調べてみました。

OSはlinxBean 14.04、システムフォントの大きさは豆ボタン→ルックアンドフィールを設定します、で確認するとデフォルトのフォントはSans 10になっています。

dlgで始まる項目はxdlファイルの定義、続いてコントロールの定義、コントロールモデルの定義を書いています。

dlg:window dlg:left="80" dlg:top="79" dlg:width="263" dlg:height="185"
UnoControlDialog  X 1 Y 1 Width 644 Height 423
UnoControlDialogModel   PositionX 80  PositionY 79  Width 263  Height 185

これがオプションダイアログの位置と大きさです。

dlg:leftがX座標、dlg:topがY座標、dlg:widthがwidth、dlg:heightがHeightに該当します。

xdlファイルの数値とUnoControlDialogModelの数値は一致しています。

デベロッパーガイドのCreating the GUI of the Options Pageにはオプションページの大きさは幅260(263?)、高さ185と書いてあるので、デベロッパーガイドの単位はma単位であることがわかります。

他のコントロールについてもそれぞれ調べました。

dlg:fixedline dlg:left="5" dlg:top="13" dlg:width="250" dlg:height="10"
UnoControlFixedLine x12 y23 w581 h18
UnoControlFixedLineModel x5 y13 w250 h10

dlgの単位とコントロールモデルの単位は同一とわかったので、以下はコントロールモデルの値は書いていません。

dlg:text dlg:left="11" dlg:top="39" dlg:width="49" dlg:height="15"
UnoControlFixedText x26 y68 w114 h26

dlg:numericfield dlg:left="65" dlg:top="39" dlg:width="60" dlg:height="15"
UnoControlNumericField  x151 Y68 W140 H26

dlg:numericfield dlg:left="65" dlg:top="64" dlg:width="60" dlg:height="15"
UnoControlNumericField  x151 Y112 W140 H26

dlg:text dlg:left="11" dlg:top="66" dlg:width="49" dlg:height="15"
UnoControlFixedText x26 y116 w114 h26

dlg:text dlg:left="127" dlg:top="42" dlg:width="25" dlg:height="15"
UnoControlFixedText x295 y74 w58 h26

dlg:text dlg:left="127" dlg:top="68" dlg:width="25" dlg:height="15"
UnoControlFixedText x295 y119 w58 h26

dlg:button dlg:left="155" dlg:top="39" dlg:width="50" dlg:height="15"
UnoControlButton x360 y68 w116 h26

dlg:button dlg:left="155" dlg:top="64" dlg:width="50" dlg:height="15"
UnoControlButton x360 y112 w116 h26

うーん、maとpxの換算は簡単にはいかなさそうに見えるし、システムフォントの大きさが違うとpxが変わってきそうなのでmaも使っていこうかと思いました。

コントロールをma単位で設定するにはコントロールモデルをダイアログモデルから生成しないといけない


GUI/modelessdialog2macro_unocontroldialog.py at 8d6d24ee0b718b0685efd3671ce66ea70f91a016 · p--q/GUI

これではコントロールモデルをサービスマネージャーからインスタンス化していましたが、これだとma単位では設定できませんでした。

その理由はma単位でコントロールを設定するUnoControlDialogElementサービスがないからです。

このサービスはサービスマネージャーからではなく、UnoControlDialogModelサービスからインスタンス化されないとサポートされないのでした。

GUI/modelessdialog2macro_unocontroldialog.py at 5f47812af955e4bdba46b753a5f9f1553c0101a2 · p--q/GUI

ということで、コントロールモデルをサービスマネージャーからではなく、ダイアログモデルからインスタンス化するとma単位でコントロールの位置と大きさを設定できるようになりました。

(2017.8.19追記UnoControlContainer自体はma単位で設定できるのにこれからはコントロールをインスタンス化できないので LibreOffice5(58)モードレスダイアログの例をPythonに翻訳する:その4にあるようなcreateWindow()TaskCreatorからウィンドウを作成してそこにコントロールを載せる場合はピクセル単位を使用することになります。)

参考にしたサイト


Creating the GUI of the Options Page - Apache OpenOffice Wiki
オプションページの大きさは幅260ma、高さ185maです。

次の関連記事:LibreOffice5(63)オプションページを持つ拡張機能の例を作る: その1

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ