基本のアプリケーション・アーキテクチャには、ドラッグ&ドロップを設計する上で理解しておくべきことがいくつかあります。
ドラッグされるオブジェクトの型
オブジェクトがドロップされたときに起こるアクション
ソース・アプリケーションと出力先アプリケーションの間で操作をマッチする方法
共通デスクトップ環境では、ドラッグ可能なオブジェクトには、ファイル、バッファ、テキスト選択の 3 つの型があります。
個々のアプリケーションは、ドラッグ&ドロップが可能なオブジェクトを独自に持っています。たとえば、カレンダはアポイントを、メール・プログラムはメール・メッセージを、ファイル・マネージャはフォルダやファイルを使用します。ファイル・マネージャのフォルダおよびファイル・アイコンは、基本ファイル・システムの中では独立して存在するため、ドラッグ&ドロップの際にはファイルとして扱われます。しかし、カレンダのアポイントやメール・プログラムのメッセージは、ファイル・システムの中で独立した存在ではありません。これらのオブジェクトがドラッグされるときには、バッファとして扱われます。
この違いは、ユーザにとっては混乱の元になります。ユーザには、この両方の型のオブジェクトは同じものに見えます。どちらもアイコンで表示でき、どちらも他の似たようなオブジェクトから独立して操作できます。しかし、実装の都合上、ユーザは操作するオブジェクトの型によって、異なる結果を得ることになります。
テキストの一部の選択は、ユーザにとってアイコンの選択とはまったく異なる操作なので、テキスト選択は別のカテゴリに分類されます。ユーザはドキュメント・ウィンドウの中でテキストの範囲を選択します。テキストはドキュメント全体を表すのではなく、ドキュメントの一部を表すだけです。実際には、ユーザはテキストの一部を独立したオブジェクトと考えることはほとんどなく、テキストの一部をドロップしたときに、それがアイコンのように動作することを期待しません。このため、テキストのドラッグ&ドロップ・モデルは、[編集] メニューから使用するカット、コピー、およびペースト操作を反映しています。
オブジェクトがドロップされたときに起こるアクションには、挿入と読み込みの 2 つがあります。
挿入アクションは、ドロップされたオブジェクトを出力先に挿入し、アプリケーションまたはドキュメントの現在のデータに追加します。オブジェクトは、ユーザがアポイントのスケジュールを設定したり、ドキュメントを印刷したり、ドキュメントを接続したり、テキストをペーストしたり、メール・メッセージを追加したときに挿入されます。このようなアクションは、出力先とユーザに応じた、移動またはコピー操作です。選択したテキストの一部を、移動するのではなくコピーしたい場合もあります。ドラッグ・アイコンは、操作がコピーと移動のどちらなのかを表示しなければなりません。
読み込みアクションは、ユーザが [ファイル] メニューから [開く] を選択し、ファイルを選択して [開く] ボタンをクリックしたときと同じ動作をします。ドロップされたオブジェクトはアプリケーションに読み込まれます。ユーザはオブジェクトを編集し、変更内容を元のファイルに保存できます。現時点で、読み込みが機能するのはファイルに対してのみで、バッファやテキストに対しては機能しません。ユーザがオブジェクトを、読み込みアクションをサポートしているドロップ領域上にドラッグする際には、コピー・ドラッグ・アイコンを表示しなければなりません。
バッファに対しても読み込みは機能します。ただし、バッファは読み込み専用で読み込まれます。詳細は、「アタッチメント・ユーザ・モデル」の節を参照してください。
ドラッグ&ドロップのアプリケーション内での動作を設計するときは、ドラッグ&ドロップのソースと出力先がマッチしないときに、どのような操作を行うべきなのかを Motif が決定する方法を理解しなければなりません。
各ドラッグ・ソースについて、アプリケーションはどのドラッグ&ドロップ操作が可能で、どの出力先にドロップできるのかを公示します。各ドラッグ出力先について、アプリケーションは許容されるソースと操作のタイプを公示します。ソースとその出力先で 2 つ以上の操作が共通している場合、Motif は特定の順序に従って、どの操作を使用するかを決定します。この順序は移動、コピー、リンクです。アプリケーションは、ドラッグされるものの型に応じて、受け入れられた操作を変更できません。
たとえば、アプリケーション A が、要素の移動またはコピーが可能であるということを公示しているとします。アプリケーション B は、出力先がコピーまたはリンクを受け入れることを公示しています。この例での共通操作はコピーです。アプリケーション B 内の出力先が移動またはコピーを受け入れる場合には、操作の順序で移動操作の方が先なので、ソースが移動されます。
この例で、ユーザは修飾キーを押すことによって移動操作を無効にできます。たとえば、[Control] キーを押すと、操作をコピーに変更できます。これができるのは、コピー操作が操作の共通セットに含まれている場合だけです。コピー操作が共通セットに含まれていない場合、ドラッグは無効なドラッグになります。
マッチング操作を考慮しなければならないのは、出力先が移動を受け入れることはできるが、コピーの方が望ましい場合だけです。この場合、出力先はコピーだけを受け入れた方がいいことになります。
コピーは常に受け入れる方がいいでしょう。コピーを受け入れると、受け入れ可能なドロップの範囲が広がります。移動が受け入れられるならば、ほとんどの場合にコピーも機能します。移動はコピーを行なった後に削除を実行するという方法で実装されていることに注意してください。