Curl Global Community
テキストフィールドの右クリックメニューのカスタマイズ - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: テキストフィールドの右クリックメニューのカスタマイズ (/showthread.php?tid=1197)



テキストフィールドの右クリックメニューのカスタマイズ - umemura - 01-20-2015

テキストフィールド(TextField)を非活性(enabled?=false)の状態で、
右クリックメニューから、文字列をコピーできるようにしたいです。

通常では、テキストフィールドが非活性の状態では、
すべての右クリックのメニューが押せません。

RecordGrid であれば、context-menu-at というメソッドがありましたが、
テキストフィールドではどのようにカスタマイズするのでしょうか。


RE: テキストフィールドの右クリックメニューのカスタマイズ - umemura - 01-20-2015

on-context-menu-event メソッドのオーバーフライドでできそうですね。
できれば、context-menu-for-text-field のMenuPane を直接操作したいのですが、
どのような仕組みになっているのかわからなかったのであきらめました。

Code:
{import * from CURL.DESKTOP.CLIPBOARD}

{define-class public CustomTextFieldUI {inherits SkinnableTextFieldUI}
  {constructor public {default ...}
    {construct-super {splice ...}}
  }

  {method open public {on-context-menu-event e:ContextMenuEvent}:void
    {if not e.consumed? then
        {if-non-null menu-pane =  self.context-menu-for-text-field then
            {e.consume}


            ||表示のみ状態のフィールドに対して、
            ||右クリックメニューからテキストのコピーができるよう修正
            let popup-custom-menu?:bool = false
            {type-switch self.control
             case tf:TextField do
                set popup-custom-menu? = not tf.enabled?


                {output tf.selection-context-active?}

            }

            {if popup-custom-menu? then
                def custom-menu =
                    {MenuPane
                        {MenuAction
                            label= "コピー",
                            {on Action do
                                def clipboard = {Clipboard.get-system-clipboard}
                                {clipboard.set-object tf.value}
                            }
                        }
                    }

                set menu-pane.enabled? = true
                {custom-menu.popup self, e.x, e.y}
             else

                ||enbled?=true の場合は通常のメニュー表示
                {menu-pane.popup self, e.x, e.y}
            }
        }
    }
  }
}

{def tf = {TextField ui-object = {CustomTextFieldUI}, value = "aaa"}}

{value tf}

{CheckButton
    label = "enabled?",
    {on ValueChanged at chkb:CheckButton do
        set tf.enabled? = not chkb.value
    }
}





RE: テキストフィールドの右クリックメニューのカスタマイズ - dyoshida - 01-20-2015

非活性に見せるためにコントロールを無効化(enabled?=false)すると、非活性どころか
完全に無効になる感があるので編集不可(editable?=false)にするのではどうでしょうか。

editable?=falseに設定するとフォント色などを自動的に非活性?に見えるような色に変更する
カスタムTextFieldなら比較的簡単そうな感がありますが。


RE: テキストフィールドの右クリックメニューのカスタマイズ - umemura - 01-21-2015

コメントありがとうございます。

非活性のコントロールには、タブキー遷移をさせたくないという要件もあります。

editable?=false かつ、takes-focus?=false でもいいのかもしれませんが、
文字列選択ができません。
(selection-context-active? ゲッターを無理やりtrueに固定すると、
文字列選択だけはできますが、右クリックメニューは非活性のまま)

特に、Dialog 内の複数コントロールを、一括で非活性にする場合などの互換性などを考慮して、
あえて enabled?=false を採用しています。
あえてね。△

チェックボタンや、ラジオボタンなど、コントロール系のすべてにeditable?があればよいのですが・・・。

editable?=falseの設定でも、右クリックメニューが非活性になってしまうのは変わりないようですし、


ちなみに、enabled?=false だと、デフォルトではご指摘のように文字が薄くなってしまうので、
disabled-color="black" としています。



RE: テキストフィールドの右クリックメニューのカスタマイズ - dyoshida - 01-21-2015

umemura さんなのでenabled?=false で無効化しているのは非活性にする以外になにか縛りがあるのだろうとは思っておりましたが
編集不可や非活性にするために単純にenabled?=false にしたものの、他の機能まで無効になって行き詰るという話をよく耳にする
ので、他に方法があるならまずそちらを!ということで書いてみました。

たしかに、コントロール系のすべてにeditable?のようなGUIから値を変更させないようにするオプションは欲しいですね。

ちなみに、editable?=falseにすると右クリックメニューが非活性になるわけではなく、ペーストができなくなるのでメニュー項目で
唯一活性化してる「ペースト」が非活性となっているだけで、文字列を選択すれば「コピー」の項目が活性化するのでは。
(takes-focus?=falseも指定すると、マウスクリックしてもフォーカスを得られない→文字列が選択できない
→コピーできないので「コピー」の項目も活性化しないとなってしまいますが)