ダイアログ プロシージャ

Curl® GUI ツールキットは、ポップアップ ダイアログを作成するためのプロシージャを提供します。
ダイアログ プロシージャについて要約すると次のようになります。
プロシージャ目的
choose-fileユーザーがファイルを参照して選択できるようにし、アプレットがファイルにアクセスまたはファイルを作成します。Url、特に PrivilegedUrl を返します。ユーザーがダイアログをキャンセルした場合、null を返します。
choose-multiple-filesユーザーにファイルを参照して複数のファイルを選択させ、アプレットが複数のファイルにアクセスできるようにします。UrlArray を返します。配列内のオブジェクトは PrivilegedUrl です。ユーザーがダイアログをキャンセルした場合、null を返します。
choose-locationユーザーが URL を入力するか、または参照ボタンをクリックしてファイルを参照し、1 つ選択するようにします。ユーザーがダイアログをキャンセルした場合、null を返します。
choose-directoryユーザーがディレクトリを参照し、ディレクトリ ロケーションを選択できるようになります。 Url を返します。ユーザーがダイアログをキャンセルすると、null を返します。
choose-color 色ホイールを含む色選択ダイアログを表示し、 ユーザーが選択する FillPattern を返します。 ユーザーがダイアログをキャンセルすると、null を返します。
choose-color-string 色ホイールを含む色選択ダイアログを表示します。 色を表現する StringArray の文字列 (例:"white" や "#FFFFFF") を提供すると、 提供された色を表示する見本 パレットがダイアログに含まれます。 ユーザーが選択した色を示す String を返します。 ユーザーがダイアログをキャンセルすると、null を返します。
popup-messageメッセージまたはグラフィックスと [OK] ボタンを含みます。
popup-text-queryユーザーにテキスト文字列を入力するよう要求します。
popup-questionはい / いいえの応答を求める質問をします。

ファイル ダイアログの作成

ファイル ダイアログ プロシージャは、特権のないアプレットがファイルを操作する方法です。ユーザーにファイルを参照して 1 つまたは複数のファイルを選択させる、ポップアップ ダイアログを作成します。これらのプロシージャは PrivilegedUrl を返します。これは追加のアクセス権を持つ Url です。通常は許可されていない状況でも、関連づけられたファイルを直接読み取ったり書き込んだりすることができます。 セキュリティーとファイルアクセスの詳細に関しては、「ネットワーク アクセスの制限 」 および 「ファイル アクセスの制限」 を参照してください。
各プロシージャについて、style パラメータで、
次の表は 3 つのファイル ダイアログ スタイルを説明しています。次の第 2 ダイアログが表示される状況についても説明しています。
アプレット実行中...ファイル ダイアログ スタイル既定のタイトルアクセス権2 番目の「ファイルが見つかりません」ダイアログ2 番目の「ファイルを置き換えますか」ダイアログ
既存のファイルを読み取りで開くFileDialogStyle.read読み取りrYユーザーが存在しないファイルの名前を入力した場合N
既存のファイルを読み取り書き込みで開くFileDialogStyle.edit開くr+wYユーザーが存在しないファイルの名前を入力した場合N
新しいファイルを読み取り書き込みで作成するFileDialogStyle.save-as名前を付けて保存r+wNYユーザーが既存のファイルを選択した場合
上記のパラメータの他に、ファイル ダイアログ プロシージャには次の項目を指定するパラメータがあります。
また、choose-location には文字列をとる label パラメータもあります。ダイアログの目的を表示します。

ファイル ダイアログ フィルター

上記のプロシージャ コールの 1 つの結果として表示される各ダイアログには、ファイル拡張子のフィルターとして動作する DropdownList があります。フィルタを設定するには、次を実行します。
  1. 必要な拡張子ごとに FileDialogTypeFilter を作成します。たとえば、txttexthtmhtml のそれぞれについて 1 つずつ作成します。
  2. FileDialogFilter を作成し、説明を FileDialogTypeFilter の配列でカプセル化します。たとえば、説明 "HTML FILES" は拡張子 "txt" および "text" を説明する FileDialogTypeFilter の配列と一括りにすることができます。
  3. プロシージャの filters 引数を FileDialogFilter の配列に設定します。
クラス定数 FileDialogFilter.all-files-filter-array は、すべてのファイル拡張子を表示する FileDialogTypeFilter が 1 つある FileDialogFilter です。
次の例では、ファイル種別がテキストおよび HTML 用のフィルタを作成します。
このサンプルをここで実行するか、特権が与えられていないディレクトリでローカル ファイルとして実行すると、セキュリティ ダイアログが表示されます。特権ディレクトリから実行した場合には、セキュリティ ダイアログは表示されません。

例: ファイル ダイアログ フィルターの使用
{let filters:{Array-of FileDialogFilter} =
    {new
        {Array-of FileDialogFilter},
        {FileDialogFilter
            "HTML Files",
            {new
                {Array-of FileDialogTypeFilter},
                {FileDialogTypeFilter "htm"},
                {FileDialogTypeFilter "html"}
            }
        },
        {FileDialogFilter
            "Text Files",
            {new
                {Array-of FileDialogTypeFilter},
                {FileDialogTypeFilter "txt"},
                {FileDialogTypeFilter "text"}
            }
        },
        {FileDialogFilter
            "All Files",
            {new
                {Array-of FileDialogTypeFilter},
                {FileDialogTypeFilter "*"}
            }
        }
    }
}

{CommandButton
    label="Launch a File Dialog to read HTML and text files",
    {on Action do
        {choose-file
            filters=filters
        }
    }
}

簡単なポップアップ ダイアログの作成

これらのプロシージャで最初のもの以外は常に modal ダイアログを生成します。モーダル ダイアログはアプリケーション内のフォーカスを独占するダイアログで、ユーザーは次に進む前に応答しなければなりません。ただし、popup-message プロシージャはオプションで non-modal ダイアログを生成できます。
popup-message
popup-message は、ポップアップ ダイアログを生成する簡単なショートカット プロシージャです。必要な引数はメッセージだけです。このメッセージは String またはグラフィカル オブジェクトで、ネストされたオブジェクトを含むことがあります。既定では [OK] ラベルの付いたボタンがあります。オプションで [キャンセル] ボタンを含めることもできます。
このショートカット プロシージャは、既定でモーダル ポップアップ ダイアログ (次へ進む前に応答が必要なダイアログ) を生成します。modal? = false を指定すると、非モーダル ダイアログをポップアップするために使用することもできます。
popup-message がモーダルの場合、プロシージャはユーザーがクリックしたボタンを示す String をダイアログが閉じられた後に返します。取りうる値は次の通りです。
popup-message が非モーダルの場合、プロシージャはダイアログが閉じるのを待たずにすぐに String"Open" を返します。
このショートカットで作成されたポップアップ ダイアログは、次のキーワード引数のいずれかでカスタマイズすることができます。
このプロシージャの詳細な説明については『API リファレンス マニュアル』を参照してください。
この簡単な例では popup-message プロシージャが起動され、メッセージ用テキストと [OK] ボタンのあるポップアップが作成されます。

例: popup-message の使用
{CommandButton label = "Click for User Message",
    {on Action do
        {popup-message "You've clicked a button!",
            title = "Friendly Message"}
    }
}
次の例では、より興味深い popup-message を作成します。ユーザーが [OK] ボタンをクリックするとプログラムに値を返す RadioFrame が含まれています。選択せずにダイアログを閉じられることをユーザーに知らせる [キャンセル] ボタンも含まれています。

例: popup-message の使用
{let x:Dynamic =
    {Dynamic "initial value"}
}
{let rf:RadioFrame =
    {radio-buttons
        "Past",
        "Present",
        "Future",
        value = "Present"  || initial selection
    }
}
{spaced-vbox
    {CommandButton label =
        "Click for Popup Modal Dialog",
        {on Action do
            let result:String = {popup-message
                                    use-look-and-feel?=false,
                                    cancel? = true,
                                    background = "yellow",
                                    {spaced-vbox
                                        rf
                                    }
                                }
            {if (result == Dialog.ok) then
                set x.value = rf.value
            }
        }
    }, || Button
    {paragraph
        Dialog's Return Value: {value x}
    }
}
前の例では 2 つの点でモーダルなポップアップ ダイアログに依存していることに注目してください。
popup-question
popup-questionは、[はい][いいえ]、および (オプションで) [キャンセル] ボタンのあるモーダル ダイアログ ボックスをポップアップします。このプロシージャを使用して、ユーザーにはいまたはいいえの答えを求める質問をすることができます。
このプロシージャは通常、ユーザーがクリックしたボタンに応じて、Dialog.yesDialog.no、または Dialog.cancel の値を持つ String を返します。
ただし、ユーザーがどのボタンもクリックしないでダイアログ ボックスを閉じた場合は、既定の値を返します。ダイアログ ボックスに [キャンセル] ボタンがある場合、返される既定値は "cancel" です。[キャンセル] ボタンがない場合、返される既定値は Dialog.no です。
次の例では popup-question プロシージャが起動され、質問と [はい][いいえ] および [キャンセル] ボタンのあるポップアップ ダイアログが作成されます。

例: popup-question の使用
{CommandButton label = "Click for Yes/No Dialog",
    {on Action do
        let x:String =
            {popup-question
                cancel? = true,
                "Do you like orange juice?",
                title = "OJ Question"}

        {popup-message
            cancel? = true,
            {if x == Dialog.yes then "I like orange juice too"
             elseif x == Dialog.no then "Have some milk"
             else "Never mind"}
        }
    }
}
popup-text-query
popup-text-query は、入力応答を求めるモーダル ダイアログ ボックスを作成します。[OK] ボタンをクリックしてダイアログがコミットされると、ユーザーの応答を String として返します。ユーザーが [キャンセル] ボタンをクリックするかウィンドウを閉じると、NULL を返します。
開発者は、引数にキーワード prefix を指定することによりオプションでテキスト フィールドの初期値を入力することができます。

例: popup-text-query の使用
{let cap:Dynamic =
    {Dynamic {text }}
}
{CommandButton
    label = "Click for Dialog",
    {on Action do
        set cap.value =
            {popup-text-query
                title = "Introduction",
                "Who are you?",
                prefix = "the Phantom Menace"
            }
    }
}
{text
    font-style = "italic",
    You are {value cap}
}

ダイアログのサイズ変更

場合によっては、ユーザーに可視的に表示されている間に、 ダイアログの中身を変更および追加する必要があります。 例えば、ユーザーの選択に応じてコントロールを追加する場合がそうです。 このような状況では、RootFrame.set-size-from-child メソッドを使用すると、Dialog は新しい内容を反映するサイズに調整されます。
次の例でこのプロセスを示します。コマンド ボタンをクリックすると、 チェック ボタンを含むダイアログが表示します。 チェック ボタンを選択すると、CheckButton のイベント ハンドラは、 コマンドボタンが 3 つある HBoxDialog に追加します。 get-view メソッドは Dialog を含む View を取得します。 このビューの set-size-from-child を呼ぶと、 ダイアログのサイズが調整され、コマンドボタンを全て収容できるようになります。 以下に示す行をコメントに入れ、例を実行してみてください。 ダイアログのサイズは変更されず、全てを収容する余地がなくなることに留意してください。
{{dialog.get-view}.set-size-from-child}

例: 可視 Dialog のサイズ変更
{value
    let cb1:CommandButton = {CommandButton}
    let cb2:CommandButton = {CommandButton}
    let cb3:CommandButton = {CommandButton}

    let buttons:HBox = {spaced-hbox cb1, cb2, cb3}

    let vbox:VBox = 
        {spaced-vbox 
            margin=5pt
        }
    let dialog:Dialog = 
        {Dialog 
            vbox, 
            border-width = 2pt

        }
    let cb:CheckButton = 
        {CheckButton
            value = false,
            label = "Add command buttons?",
            {on ValueChanged at cb:CheckButton do
                {vbox.add buttons}
                {{dialog.get-view}.set-size-from-child}
            }
        }
    {vbox.add
        cb
    }

    let button:CommandButton =
        {CommandButton
            label = "Show Dialog",
            border-width = 3pt,
            {on Action do
                {dialog.show modal?=true,
                    title = "Dialog"
                }
                {dialog.clear}
                {dialog.add
                    vbox
                }
            }
        }
    button
}