Flu_DND.h
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:8k
- /*
- * ===========================================================================
- * PRODUCTION $Log: Flu_DND.h,v $
- * PRODUCTION Revision 1000.0 2004/04/12 18:21:29 gouriano
- * PRODUCTION PRODUCTION: IMPORTED [CATCHUP_003] Dev-tree R1.1
- * PRODUCTION
- * ===========================================================================
- */
- /*
- * These files were imported into NCBI's CVS directly from FLU version 2.9.1.
- * Modifications to the source are listed below.
- *
- * ==========================================================================
- * $Log: Flu_DND.h,v $
- * Revision 1000.0 2004/04/12 18:21:29 gouriano
- * PRODUCTION: IMPORTED [CATCHUP_003] Dev-tree R1.1
- *
- * Revision 1.1 2004/03/11 13:51:54 dicuccio
- * Imported FLU version 2.9.1. Altered export specifiers to match NCBI layout.
- * Altered include paths to match NCBI toolkit layout.
- *
- * ==========================================================================
- */
- // $Id: Flu_DND.h,v 1000.0 2004/04/12 18:21:29 gouriano Exp $
- /***************************************************************
- * FLU - FLTK Utility Widgets
- * Copyright (C) 2002 Ohio Supercomputer Center, Ohio State University
- *
- * This file and its content is protected by a software license.
- * You should have received a copy of this license with this file.
- * If not, please contact the Ohio Supercomputer Center immediately:
- * Attn: Jason Bryan Re: FLU 1224 Kinnear Rd, Columbus, Ohio 43212
- *
- ***************************************************************/
- #ifndef _FLU_DND_H
- #define _FLU_DND_H
- #include <FL/Fl.H>
- #include <FL/fl_draw.H>
- #include <stdlib.h>
- #include <string.h>
- #include <gui/widgets/FLU/Flu_Enumerations.h>
- #define FLU_DND_MAX_TYPES 32
- //! This class encapsulates the event state for a single dragged object, and is designed to work exclusively with Flu_DND
- class NCBI_GUIWIDGETS_FLU_EXPORT Flu_DND_Event
- {
- friend class Flu_DND;
- public:
- //! Default constructor
- Flu_DND_Event();
- //! Default destructor
- ~Flu_DND_Event();
- //! return c true if currently dragging an object, c false otherwise
- inline bool event_is_valid() const
- { return dragging; }
- //! return c true if the dragged object is normal FLTK text (see Fl::copy() ), else c false if it is an object derived from Flu_DND
- inline bool event_is_text() const
- { return( _text != 0 ); }
- //! return c true if the dragged object is an object derived from Flu_DND, else c false if it is normal FLTK text (see Fl::copy() )
- inline bool event_is_other() const
- { return( _text == 0 ); }
- //! return the text from Fl::copy() if this event is a text event (see event_is_text() )
- /*! note This is valid only after the object has been dropped (i.e. in Flu_DND::on_dnd_drop() )*/
- inline const char* text() const
- { return _text; }
- //! return the dragged object data as added in Flu_DND::dnd_grab() if this event is an "other" event (see event_is_other() )
- /*! note This is valid only after the object has been dropped (i.e. in Flu_DND::on_dnd_drop() )*/
- inline void* data() const
- { return _data; }
- //! return the type of the data object that was dropped. This is c NULL for FLTK text events
- /*! note This is valid only after the object has been dropped (i.e. in Flu_DND::on_dnd_drop() )*/
- inline const char* data_type() const
- { return _dataType; }
- //! return c true if the type of the data object that was dropped is equal to b t, c false otherwise
- inline bool is_data_type( const char *t ) const
- { if( !_dataType ) return 0; else return( strcmp( _dataType, t ) == 0 ); }
- //! return the x coordinate (from Fl::event_x() ) of when the object was grabbed
- inline int grab_x() const
- { return _grab_x; }
- //! return the y coordinate (from Fl::event_y() ) of when the object was grabbed
- inline int grab_y() const
- { return _grab_y; }
- //! return the x coordinate (from Fl::event_x() ) of when the object was dropped
- inline int drop_x() const
- { return _drop_x; }
- //! return the y coordinate (from Fl::event_y() ) of when the object was dropped
- inline int drop_y() const
- { return _drop_y; }
- private:
- bool dragging;
- void *objUnderMouse;
- char *_text, *_dataType;
- void *_data;
- int _grab_x, _grab_y, _drop_x, _drop_y;
- bool exit;
- void clear();
- };
- //! This class augments the existing FLTK drag-n-drop feature, working with Flu_DND_Event to achieve new functionality
- /*! It adds the ability to create specific DND objects, allowing classes that handle
- DND to discriminate between which objects are "allowed" to be dropped on them.
- Almost all functions are protected, since only a derived class should be in charge of what kinds of events
- to handle and what kinds of objects to support.
- */
- class NCBI_GUIWIDGETS_FLU_EXPORT Flu_DND
- {
- public:
- //! Set the function that is called when the dragged object is dropped. This is called in addition to the member function on_dnd_drop()
- inline void dnd_callback( void (*cb)(const Flu_DND_Event*,void*), void *cbd = 0 )
- { dndCallback = cb; dndCallbackData = cbd; }
- protected:
- //! Default constructor
- Flu_DND( const char *thisType );
- //! Default destructor
- virtual ~Flu_DND();
- //! See Flu_DND_Event::event_is_text()
- inline bool dnd_event_is_text() const
- { return( dndEvent.dragging && !dndEvent._data ); }
- //! See Flu_DND_Event::event_is_other()
- inline bool dnd_event_is_other() const
- { return( dndEvent.dragging && dndEvent._data ); }
- //! See Flu_DND_Event::event_is_valid()
- inline bool dnd_is_dragging() const
- { return dndEvent.dragging; }
- //! See Flu_DND_Event::is_data_type()
- inline bool dnd_is_data_type( const char *t ) const
- { return dndEvent.is_data_type( t ); }
- //! Set whether standard FLTK text events can be dropped on this object
- inline void dnd_allow_text( bool b )
- { allowTextEvents = b; }
- //! Get whether standard FLTK text events can be dropped on this object
- inline bool dnd_allow_text() const
- { return allowTextEvents; }
- //! Set whether this object can be dragged to another object
- inline void dnd_allow_dragging( bool b )
- { allowDragging = b; }
- //! Get whether this object can be dragged to another object
- inline bool dnd_allow_dragging() const
- { return allowDragging; }
- //! Set whether this object can have other objects dropped on it
- inline void dnd_allow_dropping( bool b )
- { allowDropping = b; }
- //! Get whether this object can have other objects dropped on it
- inline bool dnd_allow_dropping() const
- { return allowDropping; }
- //! Add type b t to the list of types that are allowed to be dropped on this object (up to a compiled maximum of c b FLU_DND_MAX_TYPES)
- void dnd_allow_type( const char *t );
- //! return c true if type b t is allowed to be dropped on this object, c false otherwise
- bool dnd_type_allowed( const char *t ) const;
- //! Descendents should call this when they detect themselves being grabbed for a drag-n-drop
- void dnd_grab( void *data, const char *type );
- //! Descendents should call this at the start of their handle() method to handle DND processing
- int dnd_handle( int event );
- //! Descendents can override this to respond to when the mouse is let go during a drag-n-drop (regardless of whether the item was dropped on you)
- virtual void on_dnd_release();
- //! Descendents can override this to respond to when the mouse has entered you during a drag-n-drop
- virtual void on_dnd_enter();
- //! Descendents can override this to respond to when the mouse has left you during a drag-n-drop
- virtual void on_dnd_leave();
- //! Descendents should override this to respond to when the dragged object has been dropped on you
- virtual void on_dnd_drop( const Flu_DND_Event *e );
- //! Descendents should override this to indicate whether the currently dragged item is allowed to be dropped on you (for example, if the item can only be dropped at certain locations)
- virtual bool on_dnd_drag( int X, int Y );
- private:
- bool ok2drop();
- static Flu_DND_Event dndEvent;
- bool allowTextEvents, allowDragging, allowDropping;
- char* _thisType;
- char* allowedTypes[FLU_DND_MAX_TYPES];
- int nTypes;
- void (*dndCallback)(const Flu_DND_Event*,void*);
- void *dndCallbackData;
- };
- #endif