Provided by: tkdnd_2.6-1ubuntu1_amd64 bug

NAME

       tkdnd - Tk Drag and Drop Interface

SYNOPSIS

       tkdnd::drop_target register window ?type-list?
       tkdnd::drop_target unregister window

       tkdnd::drag_source register window ?type-list? ?mouse-button?
       tkdnd::drag_source unregister window

       tkdnd::platform_specific_types type-list
       tkdnd::platform_independent_types type-list

       tkdnd::GetDropFileTempDirectory
       tkdnd::SetDropFileTempDirectory directory

INTRODUCTION

       The  tkdnd  family  commands provide a Tcl interface to native, platform specific drag and
       drop mechanism.  Under Unix the drag & drop protocol in use is the XDND protocol version 5
       (also  used  by  the Qt toolkit, and the KDE and GNOME desktops).  Under Windows, the OLE2
       drag & drop interfaces are used.  Under Macintosh, the Cocoa drag and drop interfaces  are
       used.

       The  tkdnd  family  can be built from source code using the standard configure; make; make
       install procedure. Cmake is also supported. Some binary package  are  available  from  the
       SourceForge download site, from ActiveState's ActiveTcl distribution, and elsewhere.

       With  the  tkdnd  family commands the user is able to register existing Tk widgets as drag
       sources or drop targets, that are able to send  or  receive  data  during  drag  and  drop
       operations, encoded in specific types.  These types can be platform independent types like
       DND_Text and DND_Files or platform specific types, like CF_UNICODETEXT or text/plain.

       The legal forms for the tkdnd commands are:

       tkdnd::drop_target register window ?type-list?
              This command will register window as a drop target. A drop target is a widget  than
              can  accept a drop action. window must exist when this command is executed and this
              command can be executed multiple times on a widget.

              When window is registered as a drop target, and optional type-list can be provided.
              This  type list can contain one or more types that window will accept during a drop
              action, and it  can  contain  platform  independent  or  platform  specific  types.
              Platform  independent  are  DND_Text  for  dropping text portions and DND_Files for
              dropping a list of files (which can contain one or multiple files) on  window.   If
              type-list is not specified, it defaults to the empty list.

       tkdnd::drop_target unregister window
              This  command  will  stop  window from being a drop target.  Thus, window will stop
              receiving events related to drop operations.  It is an error to  use  this  command
              for  a window that has not been registered as a drop target with tkdnd::drop_target
              register.

       tkdnd::drag_source register window ?type-list? ?mouse-button?
              This command will register window as a drag source. A drag source is a widget  than
              can  start  a drag action. window must exist when this command is executed and this
              command can be executed multiple times on a widget.

              When window is registered as a drag source, and optional type-list can be provided.
              This type list can contain one or more types that window will provide during a drag
              action, and it  can  contain  platform  independent  or  platform  specific  types.
              Platform  independent  are  DND_Text  for  dropping text portions and DND_Files for
              dropping a list of files (which can contain  one  or  multiple  files)  on  window.
              However,  this  type  list  is  indicative/informative.  window can initiate a drag
              action with even a different type list. If type-list is not specified, it  defaults
              to the empty list.

              Finally,  mouse-button  is the mouse button that will be used for starting the drag
              action. It can have any of the values 1 (left mouse button), 2 (middle mouse button
              - wheel) and 3 (right mouse button).  If mouse-button is not specified, it defaults
              to 1.

       tkdnd::drag_source unregister window
              This command will stop window from being a drag source.   Thus,  window  will  stop
              receiving  events  related  to drag operations.  It is an error to use this command
              for a window that has not been registered as a drag source with  tkdnd::drag_source
              register.

       tkdnd::platform_specific_types type-list
              This  command will accept a list of types that can contain platform independnent or
              platform specific  types.  A  new  list  will  be  returned,  where  each  platform
              independent  type in type-list will be substituted by one or more platform specific
              types. Thus, the returned list may have more elements than type-list.

       tkdnd::platform_independent_types type-list
              This command will accept a list of types that can contain platform independnent  or
              platform  specific types. A new list will be returned, where each platform specific
              type in type-list will be substituted by one or more  platform  independent  types.
              Thus, the returned list may have more elements than type-list.

       tkdnd::GetDropFileTempDirectory
              This  command  will  return  the  temporary  directory  used  by  TkDND for storing
              temporary files. When the package is  loaded,  this  temporary  directory  will  be
              initialised  to  a proper directory according to the operating system. This default
              initial value can be changed  to  be  the  value  of  the  following  environmental
              variables: TKDND_TEMP_DIR, TEMP, TMP.

       tkdnd::SetDropFileTempDirectory directory
              This  command  will  change  the  temporary  directory  used  by  TkDND for storing
              temporary files to directory.

SUPPORTED TYPES

       In order to declare the format that the data that will transfered during a drag  and  drop
       operation,  all  drag  and  drop  protocols  use the notion of types.  Unfortunately, each
       protocol defines its own, usually platform specific,  types.  Tkdnd,  trying  to  maintain
       portability  among  different platforms, offers some predefined types for some basic kinds
       of data, like text, and filenames.  Currently,  the  following  predifined  cross-platform
       values are available:

       DND_Text:
            This  type  can be used for transfering textual data. Internally, it is translated to
            the following platform specific formats:
            Windows: CF_UNICODETEXT, CF_TEXT.
            Unix: text/plain;charset=UTF-8, text/plain.
            Mac: NSStringPboardType.

       DND_Files:
            This type can be used for transfering a  list  of  file  names.   Internally,  it  is
            translated to the following platform specific formats:
            Windows: CF_HDROP.
            Unix: text/uri-list.
            Mac: NSFilenamesPboardType.

       Additionally  to  the  platform  independent  types, tkdnd supports the following platform
       specific types:

       Windows:
            CF_UNICODETEXT: Text transfer encoded in unicode.
            CF_TEXT: Text transfer with application dependent encoding. If an encoding locale  is
            specified  through  CF_LOCALE  it  is  used, else the system encoding is used for the
            conversion.
            FileGroupDescriptor - FileContents: These two types are used for transfering a set of
            files  that  do  not appear physically on disk, like files from compressed folders or
            Outlook e-mail messages. File names are transfered as in the CF_TEXT type, while file
            contents  are  transfered in binary. Tkdnd retrieves both the file names and the file
            contents, and saves then in a temporary directory. When the transfer is complete, the
            file  names  of the saved files in the temporary folder are returned. Note that tkdnd
            support this type pair only as drop targets and not as drag sources.
            FileGroupDescriptorW - FileContents: These two types are used for transfering  a  set
            of files that do not appear physically on disk, like files from compressed folders or
            Outlook e-mail messages. File names are transfered as  in  the  CF_UNICODETEXT  type,
            while file contents are transfered in binary. Tkdnd retrieves both the file names and
            the file contents, and saves then in a temporary  directory.  When  the  transfer  is
            complete,  the  file  names  of the saved files in the temporary folder are returned.
            Note that tkdnd support this type pair only as drop targets and not as drag sources.
            CF_HDROP: Files transfer encoded in UTF-8.

       Unix:

       Finally, format types used for drop types can have wildcards, following the same rules  as
       "string  match". For example, registering a drop target with the type "*", will accept any
       drop, no matter what the drop format is.

EVENTS

       Windows registered as either drop targets or drag sources, will  receive  certain  events,
       during  drag  and  drop operations. As a result, the windows are expected to have bindings
       for some of these events. Some events are mandatory (in the sense  that  a  drag  or  drop
       operation  can be stopped if the bindings do not exist), while others are not. However, it
       is a good practice to define bindings for all events, so as the application will behave as
       expected during drag and drop operations.

       The  tkdnd package defines a set of virtual events, that correspond to various phases of a
       drag and drop operation. All windows that are either a drop target or a  drag  source  are
       expected  to have bindings for (all) these events, created with the bind Tk command. While
       these event bindings are regular Tk events, they have a small  difference  from  plain  Tk
       events:  most  of  them  are expected to return a value. Since Tk bindings cannot return a
       value, tkdnd does not actually generate these  events  (i.e.  through  "event  generate").
       Instead,  tkdnd  locates the script that has been bound to the virtual event, and directly
       executes it, as a script.  Apart  from  this  small  difference  in  how  the  events  are
       triggered,  the events required by tkdnd can be viewed as regular events. In the following
       two sections all virtual events defined by the tkdnd package are presented.

DROP TARGET EVENTS

       A window registered as a drop target, is expected  to  have  bindings  for  the  following
       virtual events:

       <<DropEnter>>:
              This  event is triggered when the mouse enters the window during a drop action. The
              purpose of this event is to change the visual state of the window, so as to  notify
              the  user whether the drop will be accepted or not.  The binding script is expected
              to return a single value that will define the drop action. This returned action can
              be  one  of  copy,  move,  link,  ask,  private  and refuse_drop. This event is not
              mandatory, but if it is defined, it has to return an action. In case an  action  is
              not returned, the drop is refused for this window.

       <<DropPosition>>:
              This  events  is  triggered  when  the  mouse moves inside the window during a drop
              action. The purpose of this event is to let window decide if  it  will  accept  the
              drop and the action of the drop, if a drop is going to happen at the specific mouse
              coordinates. Thus, the  script  binding  for  such  an  event  can  get  the  mouse
              coordinates  and  the pressed modifier buttons (such as ctrl, shift or alt), and is
              expected to return the drop action, which again must be one of  copy,  move,  link,
              ask, private and refuse_drop. This event is not mandatory, but if it is defined, it
              has to return an action. In case an action is not returned, the drop is refused for
              this window.

       <<DropLeave>>:
              This  event  is triggered when the mouse leaves outside the area covered by window,
              whithout a drop happening. The binding of such an event is expected to restore  the
              visual  state  of  the  window  to  normal (i.e. the visual state the window was in
              before the <<DropEnter>> event was triggered). The binding for such an event is not
              expected to return a value.

       <<Drop>>:
              This  event is triggered by a drop action, and it is expected to handle the dropped
              data and reset the visual state of the window. The binding script  is  expected  to
              return  a  value,  which will be the action that has been performed to the data and
              must be one of copy, move, link, ask, private and refuse_drop. This  event  is  not
              mandatory,  but  if it is defined, it has to return an action. In case an action is
              not returned, the drop is refused for this window.

       <<Drop:type>>:
              This event is a specialisation of the generic  <<Drop>>  event,  augmented  with  a
              type.  If  such a binding exists and the drop type matches type, this event binding
              will be executed, instead of the generic <<Drop>> event binding. These events allow
              for  easy  specialisation  of  drop  bindings, according to the type of the dropped
              data. type can be either a platform independent or a platform  specific  type.  The
              binding  script  of  such an event is expected to return a value, which will be the
              action that has been performed to the data and must be one  of  copy,  move,  link,
              ask, private and refuse_drop. This event is not mandatory, but if it is defined, it
              has to return an action. In case an action is not returned, the drop is refused for
              this window.

DRAG SOURCE EVENTS

       A  window  registered  as  a  drag  source, is expected to have bindings for the following
       virtual events:

       <<DragInitCmd>>:
              This event is triggered when a drag action is about to start. This is  a  mandatory
              event (whose absence will cancel the drag action), and is responsible for providing
              three things: the list of actions and format types supported by  the  drag  source,
              and  of  course  the data to be dropped. Thus, the binding script for such an event
              must return a list of three elements: the drop actions supported by the drag source
              (which can be any of copy, move, link, ask, and private), the format type list that
              the data can be dropped as (which can  be  any  platform  independent  or  platform
              specific type), and finally the data. A simple example of such a binding, is:
              bind .drag_source <<DragInitCmd>> \
                   {list copy DND_Text {Hellow world!}}

       <<DragEndCmd>>:
              This event is triggered when the drag action has finished (either when the drop was
              succesful or not). Its main purpose is to process the dropped data according to the
              drop  action  returned  by  the  drop  target.  Binding  for  such  an event is not
              mandatory, and the binding is not expected to return a value.

BINDING SCRIPTS AND SUBSTITUTIONS

       All bindings scripts defined for any of the virtual events above will be executed  in  the
       same  interpreter  that  was  used  for creating the window the event is bound to, and the
       binding script will executed at the global level  (i.e.  only  global  variables  will  be
       accessible).

       If  the binding script contains any % characters, then substitutions will be made, like in
       normal Tk binding scripts. Valid % specifiers are:

       %%   Replaced with a single percent.

       %A   The current action of the drag/drop operation.

       %a   The action list supported by the drag source.

       %b   The mouse button that is pressed during a drag/drop operation.  Note  that  always  a
            single  mouse  button is reported as pressed, even if more than one mouse buttons are
            actually pressed.

       %c   The codes of the list of types supported by the drag source. All codes are  in  octal
            format  and  have  the  same  order  as  the  list  of  types obtained through the %t
            substitution.

       %C   The code (in octal format) of the current type of the drag and drop operation.

       %CTT The list of types from the drop target type list that are common to the  drag  source
            type list.

       %CST The  list  of types from the drag source type list that are common to the drop target
            type list.

       %D   The data that has been dropped. Under some  platforms  the  data  will  be  available
            before  the  drop has occured. The format of the data is the current type of the drop
            operation.

       %e   The name of the  current  virtual  event.  One  of  <<DropEnter>>,  <<DropPosition>>,
            <<DropLeave>>, <<Drop:type>>, <<Drop>>, <<DragInitCmd>>, <<DragEndCmd>>.

       %L   The list of types supported by the drag source.

       %m   The  list of modifier keyboard keys that are pressed.  Modifier keys are some special
            keys, like Shift, Control or Alt.  Valid modifiers are "shift", "ctrl" and "alt".  It
            is  useful  for  binding  scripts  of  drop  target  events  to  examine this list of
            modifiers, as it is quite usuall to change the action according to the state of  some
            modifier keys.

       %ST  The list of types supported by the drag source.

       %t   The list of types supported by the drag source.

       %T   The current type of the drag and drop operation.

       %TT  The list of types supported by the drop target.

       %W   The window that the event is delivered to.

       %X   The mouse pointer x coordinate, relative to the root window.

       %Y   The mouse pointer y coordinate, relative to the root window.

SPECIFYING DROP TARGETS

       Creating drop targets is easy: we have to only register a window as a drop target with the
       list of format types it can accept, and add a few bindings. For  example,  a  window  that
       accepts textual drops can be as follows:
              label .drop_target -text {Text Drop Target!} -bg white
              tkdnd::drop_target register .drop_target DND_Text
              bind .drop_target <<DropEnter>> {%W configure -bg yellow; list copy}
              bind .drop_target <<DropPosition>> {list copy}
              bind .drop_target <<DropLeave>> {%W configure -bg white}
              bind .drop_target <<Drop>> {%W configure -text %D; %W configure -bg white}
       From  the  above bindings, none is obligatory. However, we usually want to receive dropped
       data (thus the <<Drop>> event must be handled) and we want to give visual feedback to  the
       users  through  the  <<DropEnter>> and <<DropLeave>> events.  Finally, <<DropPosition>> is
       only necessary if we want to only accept drops on specific areas of the window, or we want
       to change the drop action according to the pressed modifiers.

       Now, if we want to also add the ability to receive file drops, we could add:
              tkdnd::drop_target register .drop_target DND_Files
              bind .drop_target <<Drop:DND_Files>> \
                 {puts %D; %W configure -bg white}
       Note  that  we  have added a "specialised" drop binding, for the event <<Drop:DND_Files>>:
       this means that when a text portion is dropped over the window, the <<Drop>> event binding
       will   be   executed.  But  when  a  list  of  files  is  dropped  onto  the  window,  the
       <<Drop:DND_Files>> event binding will be executed.  If we proceed and define a binding for
       the  <<Drop:DND_Text>>  event,  the  binding of the "general" <<Drop>> event will never be
       executed.

SPECIFYING DRAG SOURCES

       In order to specify a drag source, we need to register a window as a drag source:
              tkdnd::drag_source register .text_drag_source
       The above command defines a drag source with  an  empty  type  list  (and  which  will  be
       declared  in the <<DragInitCmd>> event binding) and arranges mouse bindings such as a drag
       will be started with the left mouse button.  Then, it is absolutely necessary to define  a
       binding  for  the <<DragInitCmd>>: this event binding must return the list of actions, the
       list of format types and the actual data to be dropped:
              bind .text_drag_source <<DragInitCmd>> \
                   {list {copy move} DND_Text {Hello from Tk!}}
       And that was all!

BUGS

       Unix: Dragging from Tk windows has not yet been implemented.  OS X: TkDND under  OS  X  is
       built on top of the Cocoa framework. Thus, it is compatible with Tk version >= 8.6

KEYWORDS

       dnd, drag and drop