This section describes the four techniques available for transferring data:
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:
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:
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:
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.