Curl Global Community
標準の右クリックメニューから一部機能を削除 - Printable Version

+- Curl Global Community (http://communities.curl.com)
+-- Forum: Discussions (http://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (http://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: 標準の右クリックメニューから一部機能を削除 (/showthread.php?tid=493)



標準の右クリックメニューから一部機能を削除 - okm - 05-09-2012

標準の右クリックメニューから、
一部の機能だけを消すことって可能でしょうか?

メニュー自体の作り変えになるんじゃないかと思っているのですが・・

ご存知でしたら教えてください!

よろしくお願いいたします。


RE: 標準の右クリックメニューから一部機能を削除 - kim - 05-10-2012

context-popupプロシージャを使えば結構簡単に制御できますよ。

こんな感じです。

Code:
{value
    let rect1:RectangleGraphic =
        {RectangleGraphic
            width=1in, height=0.5in,
            {context-popup
                menu-pane={MenuPane
                              {MenuAction
                                  label="Blue Fill",
                                  {on Action do
                                      set rect1.fill-color =
                                          "blue"}},
                              {MenuAction
                                  label="Red Fill",
                                  {on Action do
                                      set rect1.fill-color =
                                          "red"}}}}}
    rect1
}





RE: 標準の右クリックメニューから一部機能を削除 - ashimo - 05-10-2012

たとえば以下のようにすると、
テキストフィールドの右クリックメニューから「削除」を取り除くことができます。

Code:
{curl 7.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}

{define-class public MyTextFieldUI {inherits StandardTextFieldUI}
  {constructor {default ...}
    {construct-super {splice ...}}
  }
  {method private {make-menu-pane-for-text-field view:View}:MenuPane
    let fm:FocusManager = {non-null view.focus-manager}
    {return
        {MenuPane
            {MenuAction
                label = {host-localize "Cut"},
                bound-command = {fm.get-command "cut"} ||""
            },
            {MenuAction
                label = {host-localize "Copy"},
                bound-command = {fm.get-command "copy"} ||""
            },
            {MenuAction
                label = {Label
                            {host-localize "Paste"}
                        },
                bound-command = {fm.get-command "paste"} ||""
            }
        }
    }
  }
  {method open public {on-context-menu-event e:ContextMenuEvent}:void
    {if not e.consumed? then
        {if-non-null v = {self.get-view} then
            {if-non-null
                menu-pane = {self.make-menu-pane-for-text-field v}
             then
                {e.consume}
                {menu-pane.popup self, e.x, e.y}
            }
        }
    }
  }
}
{View
    {TextField ui-object = {MyTextFieldUI}},
    visibility = "normal",
    {on WindowClose do
        {exit}
    }
}



RE: 標準の右クリックメニューから一部機能を削除 - okm - 05-10-2012

kimさん、ashimoさん

ありがとうございます!

ただ、これはどちらもメニューを作り変えてるということですよね?
作り変えずに、一機能だけ抜かすということはやはりできないのでしょうか?

よろしくお願いいたします。


RE: 標準の右クリックメニューから一部機能を削除 - umemura - 03-04-2014

自分のメニューのラベルから判断する方法がありそうです。
出来ればもっと厳密にやりたいところですが・・・。

Code:
{define-class public AppRecordGridUI {inherits StandardRecordGridUI}
  field protected menu-for-read-only:StringArray =
      {StringArray
          ||非活性にするメニュー
        "昇順ソート",
        "降順ソート",
        "フィルタを取り除く",
        "のみのフィルタ",
        "以下のフィルタ",
        "以上のフィルタ",
        "以外のフィルタ",
        "貼り付け領域",
        "行の固定",
        "を解除",
        "フレームの固定"
||--        ,"貼り付け",
||--        "コピー",
||--        "列の固定"
      }

  field protected menu-for-remove:StringArray =
      {StringArray
        "変更をコミットする",
        "変更を戻す"
      }


  {method public {context-menu-at x:Distance, y:Distance}:#MenuPane
    let menu-pane:#MenuPane = {super.context-menu-at x, y}

    ||メニュー削除用の保持配列
    def delete-menu = {{Array-of MenuAction}}

    ||入力用・表示用のグリッドにあわせてメニューを変更する
    {if-non-null menu-pane then
        {for i:int = 0  below menu-pane.size do

            def menu =  {menu-pane.get i}

            {type-switch menu
             case action:MenuAction do
                def label-string:String = {action.label.get-text}

                ||非活性にしたいラベルの文字列が見つかったら
                ||その MenuAction を無効にする
                {for label in self.menu-for-read-only do
                    {if {label-string.find-string label} > -1 then
                        set action.enabled? = false
                    }
                }

                ||削除したいラベルの文字列が見つかったら
                ||その MenuAction を削除用配列に保持にする
                {for label in self.menu-for-remove do
                    {if {label-string.find-string label} > -1 then
                        {delete-menu.append action}
                    }
                }
            }
        }
    }

    ||削除用配列のメニューを削除する
    {for ma in delete-menu do
        {menu-pane.remove ma}
    }
    {return menu-pane}
  }
}

{let people:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField "First", domain = String},
            {RecordField "Last", domain = String},
            {RecordField "Age", domain = int}
        },
        {RecordData First = "John", Last = "Smith", Age = 25},
        {RecordData First = "Jane", Last = "Smith", Age = 29},
        {RecordData First = "Jane", Last = "Jones", Age = 28}
    }
}
{value
    {RecordGrid
        record-source = people,
        ui-object = {AppRecordGridUI}
    }
}