Calc(43)コメントを非表示にしたのにTargetにセルが入らないことの対策

2017-11-12

旧ブログ

t f B! P L
非表示にしたコメントがあった場所をクリックすると、XEnhancedMouseClickHandlerインターフェイスのメソッドの引数のEnhancedMouseEvent StructのTargetにセルではなく、コメントのCellAnnotationShapeが入る問題へ対策を考えます。

前の関連記事:Calc(42)コメントのサービスとインターフェイスの一覧


コメントを非表示にしてもコメントのCellAnnotationShapeがTargetに入ってしまう


Calc(27)ドキュメント内のすべてのシートでクリックを補足するのenhancedmouseclickhandlerexample.odsでコメントを作成してみます。

コメントはセルを右クリック→コメントを挿入、ででてくる吹き出しに適当な文字列を入力します。


セルを右クリック→コメントを表示、とすると常にコメントが表示された状態になります

常にコメントが表示された状態でセルを右クリック→コメントを非表示、にするとコメントがあることを示す赤い四角だけが表示され、マウスカーソルをそのセルに入れるとコメントが出現します。


このシートはクリックしたところに文字列が入るようにEnhancedMouseClickHandlerを設定してあります。

XEnhancedMouseClickHandlerインターフェイスのメソッドの引数のEnhancedMouseEvent StructのTargetにセルが入っている場合は、そのセルにクリック数を入力するようなマクロになっています。

コメントがあったあたりのセルをクリックしてみます。


各セルの真ん中あたりをクリックするとこのようになります。

でも、コメントがあるであろう場所を避けてセルの隅をクリックするとすべてのセルに文字列を代入することができます。

これはコメントは見えなくても、その部分をクリックするとEnhancedMouseEvent StructのTargetには、セルではなくコメントのCellAnnotationShapeが入ってくるからです。

コメントを非表示にしてもCellAnnotationShapeのVisibleプロパティがFalseにならないのが原因


どう対策しようかと思ってまず原因を考えました。

Calc(42)コメントのサービスとインターフェイスの一覧を眺めていてようやく原因がわかりました。

コメントの表示/非表示の切り替えは、コメント、つまりCellAnnotationサービスのインスタンスのXSheetAnnotationインターフェイスのsetIsVisible()メソッドの引数のブーリアンで行います。

setIsVisible()メソッドの設定した結果は同じインターフェイスのgetIsVisible()で返ってくるブーリアンで判断できます。

setIsVisible()でFalseを与えてコメントを非表示にしても、CellAnnotationShapeが返ってくるということは、その設定がFalseになっていないということが疑われます。

ということで、CellAnnotationShapeのサービスとインターフェイスの一覧を眺めて、ようやくShapeサービスのVisibleプロパティをみつけました。

デバッガで調べてみるとコメントを非表示にしても、CellAnnotationShapeのVisibleプロパティは常にTrueになっていました。

それでこれをFalseにするとコメントを非表示にするとちゃんとTargetにセルが返ってくるようになりました。

CellAnnotationShapeのVisibleプロパティをFalseにして解決


シートからコメントコレクションを取得して、各セルにコメントを挿入した後、最後にそれぞれのコメントからCellAnnotationShapeを取得してそのVisibleプロパティをFalseにします。
 annotations = sheet.getAnnotations()  # シートのコメントコレクションを取得。
 annotations.insertNew(sheet["A1"].getCellAddress(), "Comment1")  # セル注釈を挿入。
 annotations.insertNew(sheet["B1"].getCellAddress(), "Comment2")  # セル注釈を挿入。
 [i.getAnnotationShape().setPropertyValue("Visible", False) for i in annotations]  # これをしないとmousePressed()のTargetにAnnotationShapeが入ってしまう。
変数sheetはシートです。

これでCellAnnotationShapeのVisibleプロパティをFalseにすると、GUIではコメントを表示にできなくなります。

セルを右クリック→コメントを表示、にしても、コメントは表示されず、右クリックのメニューが、コメントを非表示、に変化するだけです。

コメントを設定したセルにマウスカーソルをもってくるとコメントがポップアップする機能は、VisibleプロパティをFalseにしていても動作します。

問題点はGUIのコメントの編集がやりにくいことです。


セルを右クリック→コメントの編集、にするとコメントの編集はできるのですが、背景が表示されないので文字がとてもみにくいです。

どうしても編集したいときはショートカットキーでエディタにコピペして、編集後にまたコピペするしかなさそうです。

コメントの設定は変えずにマウスハンドラの方を変える方法


先に思いついたのはこっちの方法でした。

単にTargetを使わないという方法です。

セルはコントローラーのgetSelection()メソッドで取得します。

Targetを利用しないのであれば、XEnhancedMouseClickHandlerインターフェイスを使わなくても、XMouseClickHandlerインターフェイスで事足ります。

左クリックの場合は必ずセルを選択することになるのでこの方法でセルを取得できます。

しかし、右クリックの場合はこの方法ではセルは常に取得できるわけではありません。

ということもあってこの方法は採用しませんでした。

(2018.10.2追記。この問題はWindows版LibreOffice6.0.6でも解決されていません。)

次の関連記事:Calc(44)ファイルフィルターのオプションダイアログ

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ