Top > OOoBasic > Dialog > TabControl

* タブ [#f1866eda]
OOo 3.4 から利用できます。LibreOffice 3.4 では以下で説明している方法で作成しても表示されません。
OOo 3.4 から利用できます。LibreOffice 3.4 では以下で説明している方法で作成しても表示されません、[[../TabControl2]] 参照。

#contents
** 例 [#w1720403]
 Sub tab_1
  DialogLibraries.loadLibrary("Standard")
  
  oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
  oDialogModel = oDialog.getModel()
  
  ' tab container
  oTabModel = oDialogModel.createInstance(_
    "com.sun.star.awt.tab.UnoControlTabPageContainerModel")
  
  oDialogModel.insertByName("tab", oTabModel)
  oTabModel.setPropertyValues(Array("Height", "PositionX", "PositionY", "Width"), _
      Array(130, 10, 10, 140))
  
  ' page 1
  oPage1 = oTabModel.createTabPage(1)
  oPage1.Title = "Page 1"
  oTabModel.insertByIndex(0, oPage1)
  'oPage1.ImageURL = "file:///home/hoge/Documents/images/icons/up.png"
  'oPage1.Tooltip = "page"
  'oPage1.Enabled = False
  
  oEdit = oPage1.createInstance("com.sun.star.awt.UnoControlEditModel")
  oEdit.setPropertyValues(Array("Height", "PositionX", "PositionY", "Width"), _
      Array(12, 5, 5, 100))
  oPage1.insertByName("edit", oEdit)
  oEdit.Text = "Page 1"
  
  ' page 2
  oPage2 = oTabModel.createTabPage(2)
  oPage2.Title = "Page 2"
  oTabModel.insertByIndex(1, oPage2)
  
  oButton = oPage2.createInstance("com.sun.star.awt.UnoControlButtonModel")
  oButton.setPropertyValues(Array("Height", "PositionX", "PositionY", "Width"), _
      Array(13, 5, 5, 35))
  oPage2.insertByName("button", oButton)
  oButton.Label = "Button"
  
  oDialog.getControl("tab").ActiveTabPageID = 1
  
  oDialog.execute()
  oDialog.dispose()
 End Sub


ページ ID を 0 にするとそのページは選択できなくなります。1 以上の値を指定してください。
** タブページコンテナ [#d478bd65]
com.sun.star.awt.tab.UnoControlTabPageContainerModel サービスを利用します。
一般的なダイアログのコンポーネント追加方法の場合には、このコンポーネントをダイアログのモデルに追加すると自動的に作成される対応した com.sun.star.awt.tab.UnoControlTabPageContainer コンポーネントのインスタンスがダイアログビューから取得できます。上記では追加するタブコンテナコントロール名を tab としているので同名でダイアログコンテナから取得できます。

 oTabContainer = oDialog.getControl("tab")

タブコンテナはダイアログのコンテナとしての機能と同じですが、コントロールとして保持しているのはタブページコンポーネントです。次のようにするとコントロールコンテナが保持しているページオブジェクトを取得できます。

 oPages = oTabContaienr.getControls()
 For i = 0 To UBound(oPages) step 1
   msgbox oPages(i).getModel().Name & " " & CStr(oPages(i).getModel().TabPageID)
 Next

タブページコンテナをダイアログに追加する前にタブページを追加しないでください、クラッシュします。
** タブページ [#iaf9d071]
タブページはダイアログのように子コントロールを保持しています。新しいタブページは次のようにして作成します。初期化時に配列で指定するのはページの ID です、1 以上の値を指定してください。

 oPage1 = oTabModel.createTabPage(1)
 oPage1.Title = "Page 1"

タブページはタブコンテナにインデックスを指定して挿入します。この時に指定するインデックスはページ ID ではありません。

 oTabModel.insertByIndex(0, oPage1)

ページはインデックスのみで管理されており、名前でページを取得することはできません。必要であればタイトルで検索したりできますが、ローカライズなどの観点から見ていい方法ではありません。

タブページはタブコンテナで記載したようにコントロールオブジェクトを取得できます。
タブページに追加したコントロールにリスナーなどを追加したい場合にはコントロールオブジェクトが必要です。
** タブページのプロパティ [#ea1f3a3d]
|名前|型|説明|h
|ImageURL|string||
|Title|string||
|Tooltip|string||
|Enabled|boolean||
|TabPageID|short|ページ ID。readonly|

*** タブページ内部のサイズ [#cb584fec]
タブコンテナオブジェクトのサイズはタブの部分や枠線の部分があるため、タブページ内部のサイズとは異なります。

ダイアログやウィンドウのサイズが変更されたときには、タブコンテナのサイズを変更したとしても表示されていないタブページのサイズは変更されていませんので注意が必要です。


ウィンドウ内に配置した場合には、タブページオブジェクトから getOutputSize メソッドでサイズを調べると内部のみのサイズが取得できます。
ウィンドウが非表示のときにサイズ変更したタブコンテナのサイズに合わせるにはウィンドウを表示状態にしてやる必要があります。
** タブページリスナー [#j92d5e7d]
タブの切り替えを検出するリスナーが利用できます。イベントオブジェクトから取得できるのはページID の TabPageID 要素です。

 oTabListener = CreateUnoListener("XTabPageContainerListener_", _
    "com.sun.star.awt.tab.XTabPageContainerListener")
 oTabContainer.addTabPageListener(oTabListener)
 
 Function XTabPageContainerListener_tabPageActivated(ev)
   msgbox ev.TabPageID
 End Function
 Function XTabPageContainerListener_disposing(ev)
 End Function

** ウィンドウ上での利用 [#hdb0faee]
ダイアログでなくウィンドウ上で利用しようとして、タブコントロールを css.lang.XMultiComponentFactory から作成してもうまくいきません。
適当なダイアログを css.awt.ContainerWindowProvider から作成、そのウィンドウをウィンドウに埋め込んでやるとタブコントロールがウィンドウ上でも作成できます。

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