Flu_DND.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: Flu_DND.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:05:44  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*
  10.  * These files were imported into NCBI's CVS directly from FLU version 2.9.1.
  11.  * Modifications to the source are listed below.
  12.  *
  13.  * ==========================================================================
  14.  * $Log: Flu_DND.cpp,v $
  15.  * Revision 1000.1  2004/06/01 21:05:44  gouriano
  16.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  17.  *
  18.  * Revision 1.2  2004/05/21 22:27:51  gorelenk
  19.  * Added PCH ncbi_pch.hpp
  20.  *
  21.  * Revision 1.1  2004/03/11 13:51:39  dicuccio
  22.  * Imported FLU version 2.9.1.  Altered export specifiers to match NCBI layout.
  23.  * Altered include paths to match NCBI toolkit layout.
  24.  *
  25.  * ==========================================================================
  26.  */
  27. // $Id: Flu_DND.cpp,v 1000.1 2004/06/01 21:05:44 gouriano Exp $
  28. /***************************************************************
  29.  *                FLU - FLTK Utility Widgets 
  30.  *  Copyright (C) 2002 Ohio Supercomputer Center, Ohio State University
  31.  *
  32.  * This file and its content is protected by a software license.
  33.  * You should have received a copy of this license with this file.
  34.  * If not, please contact the Ohio Supercomputer Center immediately:
  35.  * Attn: Jason Bryan Re: FLU 1224 Kinnear Rd, Columbus, Ohio 43212
  36.  * 
  37.  ***************************************************************/
  38. #include <ncbi_pch.hpp>
  39. #include <stdio.h>
  40. #include <gui/widgets/FLU/Flu_DND.h>
  41. Flu_DND_Event :: Flu_DND_Event()
  42. {
  43.   _text = _dataType = 0;
  44.   clear();
  45. }
  46. Flu_DND_Event :: ~Flu_DND_Event()
  47. {
  48.   clear();
  49. }
  50. void Flu_DND_Event :: clear()
  51. {
  52.   // reset everything
  53.   objUnderMouse = false;
  54.   dragging = false;
  55.   exit = false;
  56.   if(_text) free(_text); _text = 0;
  57.   if(_dataType) free(_dataType); _dataType = 0;
  58.   _data = 0;
  59.   _grab_x = _grab_y = _drop_x = _drop_y = 0;
  60. }
  61. Flu_DND_Event Flu_DND::dndEvent;
  62. Flu_DND :: Flu_DND( const char *thisType )
  63. {
  64.   // initialize everything
  65.   nTypes = 0;
  66.   _thisType = strdup( thisType );
  67.   dnd_allow_text( false );
  68.   dnd_callback( 0 );
  69.   allowDragging = allowDropping = true;
  70. }
  71. Flu_DND :: ~Flu_DND()
  72. {
  73.   // free all the stored types
  74.   if( _thisType )
  75.     free( _thisType );
  76.   for( int i = 0; i < nTypes; i++ )
  77.     free( allowedTypes[i] );
  78. }
  79. void Flu_DND :: dnd_allow_type( const char *t )
  80. {
  81.   if( nTypes >= FLU_DND_MAX_TYPES )
  82.     return;
  83.   allowedTypes[nTypes++] = strdup( t );
  84. }
  85. bool Flu_DND :: dnd_type_allowed( const char *t ) const
  86. {
  87.   for( int i = 0; i < nTypes; i++ )
  88.     if( strcmp( allowedTypes[i], t ) == 0 )
  89.       return true;
  90.   return false;
  91. }
  92. void Flu_DND :: dnd_grab( void *data, const char *type )
  93. {
  94.   dndEvent.clear();
  95.   if( !allowDragging || !data )
  96.     return;
  97.   // remember the event
  98.   //printf( "dnd_grab %s %Xn", _thisType, this );
  99.   dndEvent.dragging = true;
  100.   dndEvent.exit = false;
  101.   dndEvent.objUnderMouse = this;
  102.   dndEvent._data = data;
  103.   dndEvent._dataType = strdup( type );
  104.   dndEvent._grab_x = Fl::event_x();
  105.   dndEvent._grab_y = Fl::event_y();
  106.   // start the fltk system-wide DND
  107.   Fl::copy( " ", 1, 0 );
  108.   Fl::dnd();
  109. }
  110. void Flu_DND :: on_dnd_enter()
  111. {
  112. }
  113. void Flu_DND :: on_dnd_leave()
  114. {
  115. }
  116. void Flu_DND :: on_dnd_drop( const Flu_DND_Event *e )
  117. {
  118. }
  119. void Flu_DND :: on_dnd_release()
  120. {
  121. }
  122. bool Flu_DND :: on_dnd_drag( int X, int Y )
  123. {
  124.   return true;
  125. }
  126. int Flu_DND :: dnd_handle( int event )
  127. {
  128.   // if dnd is on, then only DND events are generated
  129.   // but, there appears to be a bug in fltk where an FL_NO_EVENT is generated if the mouse
  130.   // is released when outside of any fltk widget. so, if we detect the NO_EVENT, and we are still
  131.   // dragging, then we need to process it as a release
  132.   if( dndEvent.dragging && event == FL_NO_EVENT )
  133.     {
  134.       if( dndEvent.exit ) // not in any widget
  135. {
  136.   // trash the event and return
  137.   //printf( "exit %s %Xn", _thisType, this );
  138.   dndEvent.clear();
  139.   return 1;
  140. }
  141.       // otherwise the NO_EVENT is inside a widget. i don't know why a NO_EVENT is generated
  142.       // since the event is inside a widget. but, whatever. at any rate, this object should process
  143.       // it as a paste, only if it is the object the mouse is over (as tracked by dndEvent.objUnderMouse)
  144.       if( dndEvent.objUnderMouse == this )
  145. {
  146.   //printf( "FL_NO_EVENT %s %Xn", _thisType, this );
  147.   event = FL_PASTE;
  148. }
  149.     }
  150.   //printf( "event %d %s %Xn", event, _thisType, this );
  151.   switch( event )
  152.     {
  153.     case FL_DND_DRAG:
  154.       {
  155. //printf( "FL_DND_DRAG %s %Xn", _thisType, this );
  156. // if we receive a drag event and we are not holding data, then it must be
  157. // from an fltk text widget
  158. // remember where the dragging occurs and check if it's ok for us
  159. // to drop the item here
  160. dndEvent.dragging = true;
  161. dndEvent.objUnderMouse = this;
  162. dndEvent._drop_x = Fl::event_x();
  163. dndEvent._drop_y = Fl::event_y();
  164. return ok2drop();
  165.       }
  166.     case FL_DND_RELEASE:
  167.       //printf( "FL_DND_RELEASE %s %Xn", _thisType, this );
  168.       on_dnd_release();
  169.       return ok2drop();
  170.     case FL_UNFOCUS:
  171.       //printf( "FL_UNFOCUS %s %Xn", _thisType, this );
  172.       return 1;
  173.     case FL_FOCUS:
  174.       //printf( "FL_FOCUS %s %Xn", _thisType, this );
  175.       return 1;
  176.     case FL_DND_ENTER:
  177.       //printf( "FL_DND_ENTER %s %Xn", _thisType, this );
  178.       dndEvent.exit = false;
  179.       dndEvent.objUnderMouse = this;
  180.       dndEvent._drop_x = Fl::event_x();
  181.       dndEvent._drop_y = Fl::event_y();
  182.       if( ok2drop() )  // if it's ok to drop, then it's ok to enter
  183. {
  184.   on_dnd_enter();
  185.   return 1;
  186. }
  187.       else
  188. return 0;
  189.     case FL_DND_LEAVE:
  190.       //printf( "FL_DND_LEAVE %s %Xn", _thisType, this );
  191.       dndEvent.exit = true;
  192.       dndEvent.objUnderMouse = NULL;
  193.       on_dnd_leave();
  194.       return 1;
  195.     case FL_PASTE:
  196.       //printf( "FL_PASTE %s %Xn", _thisType, this );
  197.       on_dnd_release();
  198.       // if the mouse is not inside a DND widget, then there's nothing to do
  199.       if( dndEvent.exit )
  200. {
  201.   dndEvent.clear();
  202.   return 0;
  203. }
  204.       //if( dndEvent.objUnderMouse != this )
  205.       //return 0;
  206.       // if there's no data, then this paste is generated from an FLTK text DND event
  207.       if( !dndEvent.data() )
  208. {
  209.   dndEvent.clear();
  210.   dndEvent._text = strdup( Fl::event_text() );
  211. }
  212.       dndEvent._drop_x = Fl::event_x();
  213.       dndEvent._drop_y = Fl::event_y();
  214.       // if it's ok to drop, then call the drop processing members
  215.       if( true )
  216. {
  217.   if( dndCallback )
  218.     dndCallback( &dndEvent, dndCallbackData );
  219.   on_dnd_drop(&dndEvent);
  220.   dndEvent.clear();
  221.   return 1;
  222. }
  223.       else
  224. {
  225.   dndEvent.clear();
  226.   return 0;
  227. }
  228.     default:
  229.       // just in case
  230.       //printf( "event: %dn", event );
  231.       if( dndEvent.exit )
  232. {
  233.   on_dnd_release();
  234.   dndEvent.clear();
  235. }
  236.       break;
  237.     }
  238.   return 0;
  239. }
  240. bool Flu_DND :: ok2drop()
  241. {
  242.   if( !allowDropping )
  243.     return false;
  244.   if( dndEvent.data() )  // see if the dnd event is valid
  245.     {
  246.       // check if the source type is allowed by this class
  247.       if( !dnd_type_allowed( dndEvent.data_type() ) )
  248. return false;
  249.     }
  250.   else if( !allowTextEvents ) // event is a normal FLTK text dnd event
  251.     return false;
  252.   return on_dnd_drag( Fl::event_x(), Fl::event_y() );
  253. }