Top > OOoBasic > Window > TabBrowsing

タブブラウジング Edit

OOo をタブブラウズ化する拡張機能が
http://wiki.services.openoffice.org/wiki/Framework/WorkInProgress/Tabbed_Windows_Extension
にあります。が、長い間メンテされておらず、利用すると OOo がクラッシュするらしいです。

このタブ化の方法を調べてみるページ。

概要 Edit

現在の OOo はタブブラウジングが可能で、そのためのサービスを /org.openoffice.Office.TabBrowse に登録すると利用できるようになります。

登録された TaskCreator はタブ付きのウィンドウを用意しておき、要求があるとそのウィンドウに新しくタブを追加してウィンドウを表示します。

タブ付きのウィンドウは自分で実装するのもいいですが、既に OOo に含まれている com.sun.star.frame.TabWindowFactory を利用できます。IDL はありませんが、OOo Basic などから CreateUnoService などでインスタンス化できます。上記の拡張機能ではこの TabWindowFactory を利用しています。

あとは、ドキュメントごとにフレームを用意して内部にドキュメントを読み込みます。タブごとにウィンドウの Visibility を切り替えてやります。

twf = CrateUnoService("com.sun.star.frame.TabWindowFactory")
tbwin = twf.createInstanceWithContext(GetDefaultContext())

TaskCreator サービス Edit

必要なインターフェース。

  • com.sun.star.lang.XSingleServiceFactory が deprecated になっている
  • com.sun.star.lang.XMultiServiceFactory 代わりにこっち?

と思ったが、XSingleServiceFactory を継承していないといけないようだ。クラスがインスタンス化されるがその後 createInstanceWithArguments が呼ばれない。

メモ Edit

OOo Basic でタブウィンドウから ParentWindow を取得しようとすると不可解なエラーで失敗する。

tbwin.getPropertyValue("ParentWindow")

「プロパティは読み込みせんようデス。」

…。

Python なら問題ないので不具合。

ParentWindow はタブウィンドウのメニューバーおよび下のタブを除いた部分のウィンドウ。 TopWindow はタブも含まれるウィンドウ部分。タブごとのウィンドウを表示するには ParentWindow が必要。

TaskCreator Edit

初めに TaskCreator のインスタンスが作成されて、それに対して新しいドキュメントを読み込んだりしたときにフレームの作成依頼が来るんだと思ったら。違うらしい。フレームの作成ごとに TaskCreator がインスタンス化される。__init__ でタブウィンドウを作成するようにしたら、フレーム作成ごとに新しいタブウィンドウが作成されてしまった。

複数の TaskCreator が登録されている場合には、後からのものが利用されます。デフォルトでは OOo のシステムの TaskCreator が利用されています。

タブウィンドウ化はタブ内にウィンドウを提供する TaskCreator を新しく組み込むことで実現されているようです。

タブウィンドウ化の弊害 Edit

この方法でのタブウィンドウ化の弊害。他の方法では分かりません。

このタブウィンドウでは親フレームに各ドキュメントのサブフレームが存在します。Desktop などから getCurrentComponent メソッドでは現在のフレーム (ドキュメントの所属する) のコンポーネントにアクセスできます。しかし、ここでのタブウィンドウでは親フレームにはドキュメントのコンポーネントが直接所属している分けではないため void が戻ります。

TabWindow の作成 Edit

TabWidowFactory を利用した TabWindow の作成方法です。

TabWindow は TOP ウィンドウにしかなれません。

作成時に既存の TOP ウィンドウを渡すとそのウィンドウ上にタブウィンドウを作成してくれます。渡さない場合にはフレームおよびウィンドウが自動的に作成されますが、そのフレームはデスクトップの XFramesSupplier に append されないため外部からアクセスできなくなります。

概要を書くと次のようになります。

  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
        # make parent top window with frame
        attr = WA_CLOSEABLE + WA_MOVEABLE + WA_SIZEABLE + WA_BORDER + WA_MINSIZE
        self.topwin = createWindow(
            self.toolkit,self.toolkit.getDesktopWindow(),
            "window",attr,
            0,0,0,0)
        self.tab_frame = self.smgr.createInstanceWithContext(
            "com.sun.star.frame.Frame",self.ctx)
        self.tab_frame.initialize(self.topwin)
        self.tab_frame.Name = "TAB_FRAME"
        self.topwin.setBackground(0xEEEEEE)
        self.topwin.setVisible(True)
        
        tfl = tab_frame_listener(self)
        self.tab_frame.addCloseListener(tfl)
        
        # add frame to the desktop frames
        self.desktop.getFrames().append(self.tab_frame)
        
        tbf = self.smgr.createInstanceWithContext(
            "com.sun.star.frame.TabWindowFactory",self.ctx)
        
        # create tab window on the top window
        p = create_PropertyValue("TopWindow",self.topwin)
        self.tbc = tbf.createInstanceWithArgumentsAndContext(
            (p,),self.ctx)
        #tbc = tbf.createInstanceWithContext(ctx)
        
        self.tb_parent = self.tbc.getPropertyValue("ParentWindow")

createInstanceWithArgumentsAndContext メソッドの引数に .beans.NamedValue で TopWindow を渡します。(Size の指定は無視されるようです)

TabWindow Edit

作成したタブウィンドウは次のようなメソッドを持ち、表示するタブを管理できます。タブは ID で管理されます。ID はタブを insertTab メソッドで最初に挿入したときに返り値として戻されます。

メソッド引数返り値説明
activateTab( [in] long ID )voidID のタブをアクティブにする
getActiveTabID()longアクティブなタブの ID
getTabProps( [in] long ID )[]com.sun.star.beans.NamedValueタブの値を取得する
setTabProps( [in] long ID, [in] []com.sun.star.beans.NamedValue Properties )voidタブの値を設定する
insertTab()long新規タブを挿入する
removeTab( [in] long ID )voidID のタブを削除する
addTabListener( [in] com.sun.star.awt.XTabListener Listener )voidタブリスナーを追加する
removeTabListener( [in] com.sun.star.awt.XTabListener Listener )voidタブリスナーを削除する
initialize( [in] []any aArguments )void初期化する

タブの値は Position と Title の二つです。それぞれ表示位置および表示するテキストを設定します。

Py-UNO でのタブウィンドウ化 Edit

Py-UNO を利用して TaskCreator を実装してタブウィンドウ化しようというもの。 最後のウィンドウを Python 側から閉じられないこと以外に特に問題なく動作するタブウィンドウを作成することができます。(上記のタブウィンドウファクトリを利用する)

注意する必要があるのはウィンドウを閉じるときの処理くらいです。

限界が見えたので終了。

fileTabWindow-0.0.1.oxt

  • ウィンドウを色々開いて、いろんな閉じ方をしてもクラッシュしたりしません。
  • 最後に残るタブウィンドウを close したり dispose もしくはデスクトップを terminate しようとするとクラッシュするので、最後にタブウィンドウが残った場合にはスタートセンターを開きます
  • タブにドキュメント名を表示しようとしたが断念

Attach file: fileTabWindow-0.0.1.oxt 720 download [Information]

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