[Contents] [Index] [Next] [Previous]

Transfer Models


This section describes the four techniques available for transferring data:

Clipboard Transfer
This technique transfers a selection from a source to the clipboard, and then subsequently from the clipboard to a destination.
Primary Transfer
This technique transfers the primary selection directly to a destination without using the clipboard for intermediate storage of the data.
Quick Transfer
This technique allows the user to indicate a range of elements (called a secondary selection) that are then transferred to the destination component.
Drag Transfer or Drag and Drop
This technique allows the user to drag a selection or an unselected element from a source to a destination.

Clipboard and primary transfer operations can be invoked from Pulldown or Popup Menus and have standard keyboard bindings as well. Primary, quick, and drag transfer operations can also be invoked using BTransfer.

There are three transfer operations generally available:

The default operation for primary and quick transfer using BTransfer is copy. The default operation for drag transfer is generally move, though it depends on the characteristics of the source and the destination. Modifiers can be used to force an operation different from the default:

If the move, copy, or link operation the user requests is not available, the transfer operation must fail.

When data is moved or copied, it can change its appearance or representation. The destination can determine the representation of the transferred data as it chooses. For example, if a graphic element representing a file is transferred to a Text component, the name of the file (or possibly the contents, if it is a text file) can be inserted. If possible, the source must transfer the format that the destination requests. Otherwise, the destination can use any heuristic to determine the best format to transfer the data in. That heuristic can even be, if the source cannot transfer in the preferred format, fail. If the destination decides that a transfer in its chosen format could possibly cause a loss of data between the source and the destination, the destination should notify the user of the possible loss of data and confirm the action before proceeding.

If there is a choice of the exact representation of data to be inserted, there should be some visual means that clearly indicates to the user which representation the application will use. If there is no such indication, then when the user performs the transfer operation, the application can post a Popup Menu or a DialogBox to allow the user to choose the representation.

A transfer can also cause the destination to take related actions. For example, transferring an element to a printer icon can cause the element to be printed.

The insertion position is the position in the destination at which transferred data is placed. The insertion position is determined in the following way:

Clipboard Transfer

The clipboard transfer operations Cut, Copy, and Paste, are usually performed using the Edit Menu of an application. They also have standard keyboard bindings that must be available in every editable collection.

[Cut] or and the Cut entry of the Edit Menu must cut selected elements of the target component to the clipboard.

[Copy] or and the Copy entry of the Edit Menu must copy selected elements of the target component to the clipboard and can mark the selection for subsequent use with Paste Link.

A Copy Link entry of the Edit Menu can be used to place a link in the clipboard to selected elements of the target component so that the link can be placed in a destination by subsequent use of Paste or Paste Link.

See the rules for operations that act on selections in Operation Targets for determining which component in a window is targeted by a Cut, Copy, or Copy Link operation.

[Paste] or and the Paste entry of the Edit Menu must paste the contents of the clipboard at the insertion position of the target component.

The Paste Link entry of the Edit Menu can place a link at the insertion position of the target component to the selection last marked by a Copy or Copy Link operation.

See the rules for operations that do not act on selections in Operation Targets for determining which collection in a window is targeted by a Paste or Paste Link operation.

If the last data cut was the primary selection, pasting it can make it the primary selection if there is no current primary selection. Otherwise, pasting data should not select it. However, if the collection is in normal mode, the anchor and the cursor should be placed at opposite ends of the pasted data so that subsequent use of [Select] or can be used to select it.

If Paste or Paste Link is invoked using a component's Popup Menu, the data must be pasted at the insertion position of the component. However, if the Popup Menu is popped up over a selection, the selection must first be deleted, even if pending delete is disabled, and the pasted data must replace it, if possible.

If Paste or Paste Link is invoked from the Edit Menu or by a keyboard operation, and the insertion position in the target component is not disjoint from a selection, the pasted data must replace the selection contents if pending delete is enabled.

Primary Transfer

Primary transfer can be invoked by clicking BTransfer or through standard keyboard bindings. There are three primary transfer operations:

Primary Copy
In an editable collection, BTransfer Click, BTransfer Click, [Copy], and must copy the primary selection to the insertion position, as defined above. (Note that the insertion position is usually different for mouse and keyboard operations.)
Primary Move
In an editable collection, BTransfer Click, [Cut], and must move the primary selection to the insertion position, as defined above. (Note that the insertion position is usually different for mouse and keyboard operations.)
Primary Link
In an editable collection, BTransfer Click must place a link to the primary selection at the insertion position, as defined above.

Transferring data to the destination by a Primary Copy or Primary Link must not select it. However, if the source and the destination components are different, and if the collection is in normal mode, the anchor and the cursor should be placed at opposite ends of the transferred data, so that subsequent use of [Select] or can be used to select it.

A Primary Move must move the primary selection as well as the elements selected; that is, the element moved to the destination must become selected as the primary selection.

If a primary transfer operation is invoked using a component's Popup Menu, the data must be transferred to the insertion position of the component. However, if the Popup Menu is popped up over a persistent nonprimary selection, the selection must first be deleted, even if pending delete is disabled, and the transferred data must replace it. When a primary transfer transfers data into a nonprimary selection, the transferred data must replace the selection contents if pending delete is enabled.

When a Primary Copy or Primary Link is invoked by using BTransfer with the pointer at the edge of the primary selection, by popping up a Popup Menu at the edge of a primary selection, or by a keyboard operation when the insertion position is at the edge of the primary selection, the data should be transferred, and the selection should be left unchanged, even if pending delete is enabled. If a Primary Copy or Primary Link is invoked inside the primary selection, the operation should have no effect.

If BTransfer is pressed outside a primary selection, but at a position both where a drag can be initiated and where data can be pasted by a primary transfer, a user-settable timeout and motion threshold should be used in the following way to distinguish drag initiation from primary transfer:

If BTransfer is pressed within a draggable primary selection, the drag should be initiated on the BTransfer Press.

Quick Transfer

Quick transfer is used to make a temporary (or secondary) selection and then immediately copy, move, or link that selection to the insertion position of the destination component. Quick transfer is implemented using BTransfer Motion, with the standard modifiers used to force the various transfer operations.

Text components must support quick transfer.

There are three quick transfer operations:

Quick Copy
If a component supports quick transfer, BTransfer Motion or BTransfer Motion must temporarily select elements in the specified range and, on release, must copy them to the insertion position of the destination component.
Quick Cut
If a component supports quick transfer, BTransfer Motion must temporarily select elements in the specified range and, on release, must move them to the insertion position of the destination component.
Quick Link
If a component supports quick transfer, BTransfer Motion must temporarily select elements in the specified range and, on release, must place a link to them at the insertion position of the destination component.

The range of the temporary selection must be determined by using exactly the same model used when BSelect Motion determines the range of a primary selection.

If the insertion position of the destination component is not disjoint from the selection, the transferred data must replace the selection contents if pending delete is enabled. Transferring data to the destination component by a quick transfer must not select it. However, if the destination component is in normal mode, the anchor and the cursor should be placed at opposite ends of the transferred data so that subsequent use of [Select] or can be used to select it.

Quick transfer can be used to transfer static text or graphics that are not ordinarily selectable. For example, a portion of the text label of a PushButton is not ordinarily selectable, since BSelect Click, [Select] or activate the PushButton instead.

While dragging out the quick selection, the range should be highlighted in some way. The highlighting mechanism should be different from that used for the primary selection. In text, the highlight should be underlining.

If the pointer is dragged out of a scrollable collection while making the temporary selection, autoscrolling must be used to scroll the collection in the direction of the pointer. If BTransfer is released with the pointer outside of the collection, or if is pressed with BTransfer pressed, the highlighting must be removed and a transfer must not be performed.

Drag Transfer

Drag transfer, also known as drag and drop, provides a quick and simple model for transferring data within and between applications. Depending on where it is initiated, drag transfer can be used to transfer the selected elements of a collection, a single unselected element, an entire collection, and even unselectable static textual and graphics labels.

A user performs a drag transfer by pressing BTransfer in the source, moving the pointer to the destination (called the drop site), and releasing BTransfer. This transfers the data from the source to the destination. The usual modifier keys can be used to force a copy, move, or link:

If no modifier key is chosen, the default operation should be a move, although it depends on the characteristics of the source and the destination. In particular, the default should be copy if the source is not editable, or if the destination is a copying or transformation device; for example, if the drop occurs over an icon for a printer or a compiler.

When a drag move moves the primary selection, the primary selection should move to the destination, as well as the elements selected; that is, the element moved to the destination should become selected as the primary selection.

When a drag move moves a selection within the same component, the selection must move along with the elements selected.

In other cases, data transferred by a drag transfer must not become selected at the destination. However, if the destination is in normal mode, then except when drag copy and drag link transfer a selection within the same component, the anchor and the cursor should be placed at opposite ends of the transferred data so that subsequent use of [Select] or can be used to select it.

Within a collection, drag transfer can be used to either drag a selected set of elements, a single unselected element, or the entire collection. This is determined in the following way:

If a drag is initiated in an unselected region and the pointer is over two possible draggable elements, the drag must occur on the highest draggable element in the stacking order. This also implies that with nested draggable elements, the drag occurs on the smallest draggable element under the pointer.

All collections should support drag transfer and should allow elements to be dragged to or from other collections, including those in different applications. A collection can support only drag (particularly if it is not editable) or only drop.

If a collection only allows elements dragged from it to be dropped in the same collection, then, during the drag, it can prevent the pointer from moving outside of the collection. If so, and if the collection is scrollable, holding the pointer at the edge of the collection should cause autoscrolling.

Drag Icons

When a drag operation is started, the pointer must be replaced with a drag icon. A drag icon provides visual feedback that a drag is in progress. It can be composed of three parts:

The illustration below shows move, copy, and link drag icons for graphical and textual information. The bulk of the icon is the source indicator. When defining new drag icons, you should follow the same rules as for defining new pointers described in Pointer Shapes.

All drag icons must include a source indicator. A source indicator should give a visual representation of the type of elements being dragged; for example, horizontal lines in a rectangle for representing text. The source indicator can include a fragment of the actual data being dragged, such as the first few characters of some text.

An operation indicator shows whether the drag operation will result in a move, copy, or link operation. Most drag icons should include an operation indicator. An operation indicator can be shown either as a separate element of the drag icon or as a variation of a graphic used for the source indicator.

The source of the dragged elements can also provide visual indications of the result of a drop. For example, if the default operation for the dragged elements is a move, the source can be hidden or deemphasized; or if the default operation of the dragged elements is a link, a line can be drawn from the source to the pointer.

A state indicator shows whether the current pointer location is over a valid drop site for the dragged elements. All drag icons can include a state indicator. A state indicator should be coincident with the hotspot of the pointer.

During a Drag

Systems should provide help operations during drag and drop. If a system provides drag and drop help, pressing (followed by releasing BTransfer) during a drag and drop operation should allow the posting of a DialogBox with the help information and the possible choices for concluding the drag and drop operation. The DialogBox should allow for canceling the drag and drop operation or for dropping the elements at the current location as a move, copy, or link.

Pressing during a drag operation must cancel the current drag operation and return the system to the state prior to the start of the drag operation.

It can be difficult during a drag and drop operation to make both the drag source and drop site visible to the user at the same time. A system can alleviate this problem by making it possible to navigate to drop sites that were not visibly available at the start of the drag operation. For example, a system can scroll a scrollable region when the pointer rests on the edge of that scrollable region. A system can open an icon view when the pointer rests on that icon. A system can also raise a window when the pointer rests in that window.

During a drag and drop interaction, the system should indicate dynamically whether the current pointer location is a possible valid drop site for the data that the user is dragging. This is done using drag-over effects, and drag-under effects. A drag-over effect is a change in the visual state of the drag icon. This change is usually represented in the drag icon's state indicator. If a drag icon has a state indicator, it should be coincident with the pointer's hotspot. The state indicator should be emphasized for valid drop sites and deemphasized for invalid drops sites. The state indicator can also indicate that there is no drop site under the pointer.

A drag-under effect is a change to the visual state of a possible valid drop site when the drag icon pointer is over the drop site. All drop sites should use some kind of drag-under effect. Drop sites can use a solid line around the site, or a raised or lowered beveled edge around the drop site as a drag-under effect. Drop sites can also change any visual component of the drop site, or even animate those changes, as a drag-under effect. For example, an icon representing a folder might show an animated image of the folder opening as a user drags a file onto it. Drop sites can also use other media (for example, audio effects) to provide feedback.

Ending a Drag

Releasing BTransfer (or BSelect when transfer and selection are integrated) must end a drag and drop operation. In addition, as mentioned in the previous section, pressing must also end a drag and drop operation by canceling the drag in progress. When a user releases BTransfer, the drop operation must occur at the location of the hotspot of the drag icon pointer. The drop must occur into the highest drop site in the stacking order. This also implies that in a group of nested drop sites the drop occurs into the smallest drop site under the pointer.

However, if a drop occurs within a selection at any level, the transferred data must replace the contents of the entire selection if pending delete is enabled.

Drop Results

Every drop operation, even when there was a visual indication of a valid drop site, can result in either success, failure, or partial failure (in the case of dragging multiple elements). While the transfer is in progress, that is until the drop site determines the success of the drag and drop operation, the data must not leave the source. While the transfer is in progress, a transfer icon representing the type of data being transferred should appear at the drop site.

After a successful transfer, the data must be placed in the drop site and the transfer icon must be removed. The removal of the transfer icon can be accompanied by an animation that shows the icon transforming into the drop site. For example, the transfer icon can melt into the drop site.

After a failed transfer, the data must remain at the drag source, the data must not be placed in the drop site, and the transfer icon must be removed. The removal of the transfer icon should be accompanied by an animation that shows the icon returning to the source location. For example, the transfer icon can snap back to the location of the drag source.

When multiple elements are involved in a drag and drop operation, the success or failure of the operation can be determined for the group as a whole or for each individual element in the group. If the group is transferred as a whole, there should only be one transfer icon at the drop site while the transfer is in progress. If the elements in the group succeed or fail individually, there can either be a transfer icon for each element or one transfer icon for the whole group. In either case, if partial success or failure is allowed, the drop site should post a message for each individual failure or otherwise indicate which transfers succeeded or failed.

Integrating Selection and Transfer

Instead of using BTransfer, transfer operations can be integrated with BSelect. When BSelect is used for dragging operations, its use partially supersedes the use of BSelect Motion in the selection models described in Selection Models. The following rules are designed to make the integration of selection and transfer less restrictive:

When BSelect is used for dragging, the and modifiers must be used to force the transfer operation as for BTransfer. When BSelect is only used for selection, the and modifiers have their usual selection-specific meanings.

If BMenu is not available for Popup Menus, BSelect must be used instead.

If BMenu is available, then when transfer is integrated with selection, BSelect Click should be used for primary transfer, and BSelect Motion should be used for quick transfer, with and forcing the transfer operation as usual.