第8章


ドラッグアンドドロップ


ある項目をドラッグしてから、ふさわしい送り先の上でドロップする技法をドラッグアンドドロップと呼びます。

この章において、ある項目とは文字列、画像、アイコンなど、ユーザが選択できるあらゆる物を指します。便宜上、この章ではユーザはマウスでドラッグを行うと仮定しますが、これらのガイドラインはペンやトラックボールといったその他の入力機器にも適用されます。

ドラッグアンドドロップの概要

Macintoshユーザは洗練され、簡単に使えて、浸透しているMac OS Xのドラッグアンドドロップ機能に慣れ親しんでいます。ユーザはしばしばドラッグアンドドロップを用いることを好むので、あなたのMac OS Xアプリケーションにこの直接操作技術を正しく組み込むことは、ユーザの期待に合致させるための長い道のりとなることでしょう。

理想的には、ユーザは任意のウインドウの任意の内容を、その種類の内容を受け付ける他の任意のウインドウへドラッグできなければいけません。もし送り元と送り先が同時に見えないのであれば、ユーザはデータをFinderウインドウにドラッグすることでクリッピングを作成することができます。クリッピングはさらに、後で別のアプリケーションウインドウへドラッグできます。

ドラッグアンドドロップは簡単に使える技法として配慮する必要があります。ただしドラッグアンドドロップが、あるアプリケーションにとって本質的な操作であり、適切な代用となる手法が存在しない場合を除きます—たとえばFinderでのアイコンのドラッグ—この場合、ドラッグアンドドロップに依存した作業のために常に別の手段がある必要があります。

ドラッグアンドドロップの相互作用モデルの基本的な手順は、ある項目を選択し、編集メニューからコピーを選択し、送り先を指定し、そこでペーストを選択するというコピーとペーストの順序に似ています。けれども、ドラッグアンドドロップは単独の技法であり、クリップボードは使いません。ユーザはクリップボードとドラッグアンドドロップを、互いに副作用をもたらすことなく、両者の利点を活用することができます。

ドラッグアンドドロップ操作は要所において即時の反応を返す必要があります。データが選択されたとき、ドラッグしている間、適切な送り先に到達したとき、そしてデータがドロップされたときにです。ペーストされるデータは対象によって決まる必要があります。たとえば、ユーザがアドレスブックの登録情報をMailの「宛先」文字列入力欄にドラッグしたら、個人の連絡先情報すべてではなく、電子メールアドレスだけが貼り付けられます。

あなたのアプリケーションで有効化した、あらゆるドラッグアンドドロップ操作に対して、あなたは「取り消し」を実装する必要があります。もし取り消せないドラッグアンドドロップ操作を実装するのであれば、ドロップを実行する前に確認ダイアログを表示してください。たとえば、ユーザがアイコンを共有ボリュームの書き込み専用ドロップボックスへドロップしようとしたときに確認ダイアログが現れます。なぜなら、ユーザはドロップボックスを開いて動作を取り消すための権限を持たないからです。

ドラッグアンドドロップの意味

あなたのアプリケーションは、ドラッグされた項目が送り先にドロップされた後で、移動とコピーのどちらを行うか判断しなければいけません。どちらが適切なふるまいとなるのかは、このセクションで説明するように、ドラッグアンドドロップ操作の文脈に依存します。

移動 対 コピー

もし、送り元と送り先が同一の容れものであれば(たとえば、ウインドウやボリューム)、ドラッグアンドドロップ操作は移動として解釈されます(つまり、カットとペースト)。ある項目をある容れものから別の容れものへドラッグすることでコピーが開始されます(コピーとペースト)。ユーザはドラッグする間Optionキーを押し続けることで、同一の容れものの中でコピー操作を行うこともできます。コピー操作を行うときは、コピーカーソルを用いることでユーザにコピー操作を示してください。(「標準カーソル」(143ページ)を参照。)

ドラッグされた項目を移動するか、もしくはコピーするかを決定したとき、あなたは送り先ウインドウの内容の基礎的なデータ構造に配慮する必要があります。たとえば、もしあなたのアプリケーションが同一文書を二つのウインドウで表示できる場合(同一データの複数表示)、これら二つのウインドウ間のドラッグアンドドロップ操作は結果的に移動とならなければいけません。

これらのドラッグアンドドロップのガイドラインを貫く原則は、ユーザを不慮のデータ消失から避けることです。送り先アプリケーションでの「取り消し」コマンドは送り元アプリケーションの「取り消し」の契機とはならないので、アプリケーション間のデータ移動は結果としてデータ消失の可能性があるかもしれません。同一ウインドウ(もしくは同一ボリューム、Finderの場合においては)の中でのデータ移動はデータ消失に通じることはありません。

表 8-1 一般的なドラッグアンドドロップ操作と結果

ドラッグされた項目 送り先 結果
文書内のデータ 同じ文書 移動
文書内のデータ 別の文書 コピー
文書内のデータ Finder コピー(クリッピングの作成)
Finderアイコン 開いている文書ウインドウ コピー
Finderアイコン 同一ボリューム 移動
Finderアイコン 別のボリューム コピー

Optionキーの状態を調べるとき

あなたのアプリケーションは、ドロップされた時点でOptionキーが押されているかどうかを確認する必要があります。このふるまいは、ユーザにドラッグアンドドロップの手順の中で、移動かコピーかの決定を後の時点に回すことができるという柔軟性を与えます。ドラッグアンドドロップ手順の間にOptionキーを押したという事実は、その後の手順において「固定」されてはいけません。

注:Optionキーは交互切り替えとして動作しません。容れものの間のOption-ドラッグは常にコピー操作を開始します。このガイドラインはユーザがOptionはコピーを意味するということを学ぶ役に立ちます。

【同一ボリューム内で: ドラッグ=移動 → Option-ドラッグ=コピー
異なるボリューム内で: ドラッグ=コピー → Option-ドラッグ=コピー(移動ではない)
Optionキーは効果を反転させる意味ではないということ】

選択に対する反応

このセクションは、ドラッグアンドドロップの文脈において特筆すべき話題を扱います。選択に対する反応は「選択する」(103ページ)でより詳細に述べられています。

単一ジェスチャによる選択とドラッグ

ドラッグはマウスボタンを押しながらのマウス移動と定義されているので、マウスダウンイベントはドラッグが起こる前に発生しなければいけません。選択はこのマウスダウンイベントの結果として、ちょうどユーザがドラッグを始める前に行われます。たとえば、ユーザはフォルダアイコンの選択とドラッグを単一のジェスチャで行うことができます。

ユーザは最初にフォルダアイコンをクリックし、マウスボタンを放し、さらにアイコンをドラッグし始めるために再びマウスボタンを押す必要はありません。あなたのアプリケーションは適切なときは、ユーザがドラッグを始めたときに、暗黙の選択が発生することを保障しなければいけません。

単一ジェスチャによる選択とドラッグは、ある項目の選択過程においてドラッグを必要としないときにだけ可能です。範囲選択操作—文字列や複数の画像オブジェクトの選択のような—は単一ジェスチャによる選択とドラッグには適していません。なぜなら、範囲選択操作はそれ自体がドラッグを必要とするからです。

背面の選択範囲

強調表示された選択範囲を含むウインドウが非活性になったとき、あなたのアプリケーションはユーザが以前選択されたデータを非活性ウインドウから活性ウインドウへドラッグできるように、選択範囲を維持する必要があります。

背面の選択範囲は、ドラッグされる項目が単独であれば不要です—たとえば、アイコンや画像オブジェクトなど—なぜなら、項目がドラッグされたときに暗黙の選択が発生するからです。けれども、範囲選択操作でのみ選択される項目—たとえば、文字列やアイコンの集まり—はユーザが非アクティブウインドウの外へこれらの項目をドラッグできるように、背面の選択範囲を持たなければいけません。もし何かが、通常の選択範囲として強調表示されたら、非活性ウインドウはいつでも背面の選択範囲を作成します。

ドラッグの反応

あなたのアプリケーションは、ユーザが項目を最低3ピクセルドラッグしたら、すぐにドラッグの反応を提供する必要があります。もしユーザがマウスボタンをオブジェクトや選択された文字列の上で押し続けた場合は、すぐにドラッグ可能とし、マウスが押され続けている間はドラッグ可能のままとする必要があります。一般的に、アプリケーションはドラッグのための画像を提供し、受付枠を処理しなければいけません。アクアでは、ドラッグされた項目は透過します。

注:代理アイコンはすぐにはドラッグ可能にはなりません。代理アイコンはタイトルバーにあり、ユーザはウインドウの移動を開始する目的でそこを頻繁にクリックするため、代理アイコンはドラッグ可能になるまで、しばらくマウスボタンを押し続けることをユーザに求めます。

送り先の反応

もしユーザがあなたのアプリケーション内の送り先へと項目をドラッグしたら、あなたのアプリケーションはその項目を受け付けるかどうかを示す反応を提供します。送り先の反応はあなたのアプリケーションが単純に「ドラッグ感知」だからといって発生させてはいけません。それよりも、ドラッグされた項目に含まれる種類のデータを受け付ける、送り先の能力に依存する必要があります。たとえば、文字列だけを受け付けている文字列入力欄は、ドラッグされた項目が画像のときは強調表示すべきではありません。

マウスが保持しているものを放した結果を表すために、カーソルを使用しましょう。たとえば、あなたがアイコンをツールバーの外にドラッグされていたら、ユーザがアイコンをツールバーの外側で保持している間は消滅カーソルを表示して、そこでアイコンを放せば項目は消去されるということを示してください。ドラッグ操作の間に有意義な反応を提供するその他のカーソルとしては、エイリアス、コピー、不許可カーソルが含まれます。Mac OS Xで利用できるカーソルの詳細は「カーソル」(143ページ)を参照してください。

Carbon:送り先の反応の実際の外見は、送り先の性質によります。Drag Managerは単純な強調表示のための、いくつかのユーティリティを提供します。もしあなたのアプリケーションがより複雑な強調表示を必要とするのであれば、あなたは独自の強調表示ユーティリティを提供する必要があります。

ウインドウ

有効な文書ウインドウの送り先領域は、通常はウインドウの内容領域からタイトルバーとコントロール用に使用している領域(スクロールバー、サイズ変更コントロール、ツールパレット、ルーラ、プラカード)を差し引いた部分です。ウインドウの内側に複数の送り先領域があるとき、一度に強調表示される送り先領域はひとつだけです。

ユーザが受け入れられる項目を、ある送り先領域から別の送り先領域へドラッグしたとき、あなたのアプリケーションはポインタが送り先領域に侵入したらすぐに強調表示し、ポインタが領域を離れたら強調表示を消去します。

もしドラッグアンドドロップ操作が、ひとつの送り先領域の内側で完全に行われたら(たとえば、文書アイコンを同一のフォルダウインドウ内の別の位置に移動した場合)、ユーザの混乱を避けるため、送り先領域を強調表示してはいけません。けれども、もしユーザがある項目を完全に送り先領域の外へドラッグしてから、同じ項目を同じ送り先領域へドラッグして戻した場合は、送り先領域は強調表示される必要があります。

あなたは、大きな送り先領域の内側で、より特定された送り先の反応を提供することもできます。たとえば、ユーザが文字列をある文書ウインドウから別の文書ウインドウへドラッグしたとき、送り先ウインドウは、ユーザがマウスボタンを離したらドラッグされた文字列が入る場所に挿入ポイントを表示すべきでしょう。

多くの状況において、内容領域全体を強調表示するよりも、ウインドウのより狭く定義された領域を強調表示するほうが、より適切です。例としてはスプレッドシート、テキストボックス、穴埋め式の書式、ペインが挙げられます。これらの場合には、送り先領域はより正確に特定の送り先を表すように仕立てる必要があります。

文字列

ユーザがある項目を文字列領域へドラッグしている間、文字列の中の、ユーザがマウスボタンを離したらドラッグされている項目が挿入される位置に、挿入表示(垂直の棒)が現れる必要があります。

一覧

一覧の中の、ユーザがマウスボタンを離すと、ドラッグされている項目が挿入されるであろう位置に、挿入表示が現れる必要があります。たとえば、ユーザがある項目をFinderのサイドバーの中へドラッグしたとき、水平挿入表示が現れます。

複数のドラッグされた項目

ユーザが複数の項目をドラッグしたら、送り先の反応はドラッグされているすべての項目を受け入れることができる場合にのみ発生しなければいけません。もし送り先がドラッグされているすべての項目を受け入れることができないのであれば、ユーザの試みは結果的に「無効なドロップのための反応」(119ページ)で説明されている反応となります。

送り先がドラッグされている、すべての項目を受け入れることができるときは、送り先は送り元で指定された順番でこれらを受け入れる必要があります。送り元アプリケーションは、二つの場合を除き、ドラッグされた項目を選択された順にまとめる必要があります。

もしドラッグされた項目が、順序を指定された表示(日付やアルファベット順のリスト表示など)からやってきたのであれば、表示の順序は選択の順序より優先されます。もし送り元と送り先が共に位置的な順序(画像アプリケーションなどのように)を提供するのであれば、位置的な順序は選択の順序より優先されます。

自動スクロール

ある項目がドラッグされたとき、あなたのアプリケーションは内容をスクロールするか、もしくは項目がウインドウを「抜ける」ことを許可するのかを判断する必要があります。もしあなたのアプリケーションが、項目をウインドウの外側へドラッグされることを許可するのであれば、あなたは自動スクロール領域を定義する必要があります。自動的に送り先ウインドウをスクロールするのは、送り先が送り元ウインドウでもあり、最前面である場合だけにしてください。非活性ウインドウを自動的にスクロールしてはいけません。

ゴミ箱を送り先として用いる

項目をゴミ箱へドラッグすることは、項目を送り元からゴミ箱へ移動する結果となります。たとえば、ワードプロセッサアプリケーションから文字列選択範囲をドラッグし、それをゴミ箱アイコン(もしくはゴミ箱ウインドウ)へドロップすることは、文字列がアプリケーションから削除され、ゴミ箱の内部にその文字列を含むクリッピングが作成される結果となります。

二つの容れものの間でドラッグされたにも関わらず、項目は移動されたという点に注意してください【本章の原則に従えば、これはコピーとなるはずの操作である】。前に述べた規則に対するこの例外は適切なものです。なぜなら、ユーザはゴミ箱から元の送り元へクリッピングをドラッグすることにより、操作を元に戻すことができるからです。これは不慮のデータ消失を避けるという原則に一貫しています。

ゴミ箱のコンテナプロパティを保存することは重要です。ゴミ箱にクリッピングやその他の項目を作成せずに、送り元を単純に削除してはいけません。

ドロップの反応

ユーザがある項目を送り先へドラッグした後で、マウスボタンを離したときに、ドラッグアンドドロップ操作は成功したということを、反応によってユーザに知らせる必要があります。このときに反応は視覚を利用することができますし、それが一番自然なふるまいです。意味論の操作から来るふるまい【移動かコピーかの意味?】はドラッグアンドドロップ手順によって示されます。

Finderアイコン

ユーザがある項目を、そのアイコンをフォルダアイコン上にドロップすることで移動したとき、ドロップされたアイコンは消去され、送り先フォルダアイコンからは強調表示が取り除かれます。

もしアイコンが印刷のような作業を表していた場合、あなたは作業が実行されたことを示すための、進行状況の反応を提供する必要性を感じることでしょう。

画像

画像をドロップしたときのドロップの反応は、通常、マウスアップイベントの発生した位置まで、実際に項目が移動することで表されます。

文字列

文字列がドロップされたあとで、その送り先が強調表示されることで【反応が】示されます。

文字列がスタイル付き文字列に対応する送り先にドロップされたときは、ドロップされた文字列はそのフォント、タイプフェイス、大きさの属性を維持します。もし送り先がスタイル付き文字列に対応していなければ、ドロップされた文字列は送り先の挿入ポイントによって特定される、フォント、タイプフェイス、大きさ属性を仮定する必要があります。

文字列を伴うドラッグアンドドロップ操作は、「賢いカットアンドペースト」(109ページ)で説明される、賢いカットアンドペーストの規則に対応する必要があります。

選択範囲を転送する

単一ウインドウを伴うドラッグアンドドロップ手順の成功の後でも、選択に対する反応は新しい場所で維持されます。このふるまいは重要なユーザの手がかりを提供し、ユーザに選択範囲を再び作ることを必要とせずに、選択範囲を再配置することができるようにします。

もしユーザが項目を活性ウインドウから非活性ウインドウへドラッグしたら、ドラッグされた項目は送り先で背面の選択範囲となります。活性ウインドウの中の選択範囲は選択されたままです。このガイドラインは、ある項目が非活性ウインドウから活性ウインドウにドラッグされるという逆の状況にも適用されます。

何か選択されているウインドウへ内容がドロップされたときは、あなたのアプリケーションは選択範囲をドラッグされた項目で置き換えるのではなく、ドロップの前に送り先のすべてを選択解除する必要があります。

無効なドロップのための反応

もしユーザが、ある項目を受け付けていない送り先の上でドロップしようと試みた場合は、その項目はマウスアップ位置から送り元の位置まで急旋回します(これが「ズームバック」です)。またズームバックのふるまいは、有効な送り先の内部でのドロップが結果的に操作成功とならなかったときにも発生する必要があります。

もしユーザが複数の項目を、そのすべてを受け付けてはいない送り先の上でドラッグしようと試みた場合は、どの項目も受け付けられてはいけません。このような場合には、あなたは送り先がどの種類のデータを受け付け、ドラッグされた中のどの項目が受け付けられなかったのかを、ユーザに知らせるダイアログを表示するのもよいでしょう。

クリッピング【切り抜き】

ある項目がアプリケーションからデスクトップへドラッグされたとき、ドラッグされた項目の中のデータを含むクリッピングが作成されます。もし送り元からFinderへ非連続の選択範囲がドラッグされたら、選択された項目のそれぞれについて分割されたクリッピングが作成されます。

あなたのアプリケーションは、その後のさまざまな送り先についての柔軟性を保障するために、いくつかの代理表現(TEXT、PICTなどのネイティブフォーマット)を提供する必要があります。代理表現が【送り先で】記録されたかどうかに関わらず、往復したデータは完全な状態を保っていなければいけません。クリッピングをその送り元へドラッグして戻すことで、もとの項目と一致する必要があります。


←第7章:ユーザ入力
→第9章:文字列