なるほど TabPane.label の親をたどっていくと、選択用のボタンがあるので、
そのイベントをconsume する、という方法があるのですね。
ただ、いただいたコードだけだと、キーボードの矢印キーを操作されたときには、
対象のTabPaneが表示できてしまったので、
TabContainer.tab-index セッターと、TabContainer.showpane メソッドをオーバーライドする方法を考えてみました。
それでも、この方法だと、
・矢印キー操作時、無効TabPane の隣を表示したい
・無効TabPaneが表示されているときに無効化されたらどうする?
など、いろいろ考慮が必要そうですね・・・。
Code:
||表示無効化が可能なタブペイン
{define-class public DisabledTabPane {inherits TabPane}
field disabled?:bool = false
field private attatched?:bool = false
{constructor public {default
disabled?:bool = false,
...}
set self.disabled? = disabled?
{construct-super {splice ...}}
||表示時に、タブセレクトボタンの押下時に
||無効化されているかどうかを判断する処理を追加する
{self.add-event-handler
{on AttachEvent do
{if not self.attatched? then
set self.attatched? = true
def tab-selector =
self.label.parent.parent.parent.parent asa TabSelectorButton
{tab-selector.add-event-handler
{on e:Action do
{e.consume}
}
}
}
}
}
}
}
||無効タブペインを保持できるタブコンテナ
{define-class public CustomTabContainer {inherits TabContainer}
{constructor public {default ...}
{construct-super {splice ...}}
}
{setter public open {current-pane-index index:int}:void
def tp = self.tab-panes[index]
{type-switch tp
case dtp:DisabledTabPane do
{if dtp.disabled? then
{return}
}
}
set super.current-pane-index = index
}
{method public open {show-pane pane:TabPane}:bool
{type-switch pane
case dtp:DisabledTabPane do
{if dtp.disabled? then
{return false}
}
}
{return
{if {super.show-pane pane} then
{self.ensure-button-visible {non-null self.current-pane}}
true
else
false
}
}
}
}
{def disabled-tp =
{DisabledTabPane
disabled? = true,
{text font-size = 28pt, A}
}
}
{def tc =
{CustomTabContainer
disabled-tp,
{TabPane
enabled? = true,
{text font-size = 28pt, B}
},
{TabPane
enabled? = true,
{text font-size = 28pt, C}
}
}}
{value tc}
{CheckButton
label = "タブ表示無効",
value = disabled-tp.disabled?,
{on ValueChanged at chkb:CheckButton do
set disabled-tp.disabled? = chkb.value
}
}