fltk_utils.hpp
来自「ncbi源码」· HPP 代码 · 共 496 行
HPP
496 行
/* * =========================================================================== * PRODUCTION $Log: fltk_utils.hpp,v $ * PRODUCTION Revision 1000.4 2004/06/01 19:51:09 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.34 * PRODUCTION * =========================================================================== */#ifndef GUI_UTILS___FLTK_UTILS__HPP#define GUI_UTILS___FLTK_UTILS__HPP/* $Id: fltk_utils.hpp,v 1000.4 2004/06/01 19:51:09 gouriano Exp $ * =========================================================================== * * PUBLIC DOMAIN NOTICE * National Center for Biotechnology Information * * This software/database is a "United States Government Work" under the * terms of the United States Copyright Act. It was written as part of * the author's official duties as a United States Government employee and * thus cannot be copyrighted. This software/database is freely available * to the public for use. The National Library of Medicine and the U.S. * Government have not placed any restriction on its use or reproduction. * * Although all reasonable efforts have been taken to ensure the accuracy * and reliability of the software and data, the NLM and the U.S. * Government do not and cannot warrant the performance or results that * may be obtained by using this software or data. The NLM and the U.S. * Government disclaim all warranties, express or implied, including * warranties of performance, merchantability or fitness for any particular * purpose. * * Please cite the author in any work or product based on this material. * * =========================================================================== * * Authors: Mike DiCuccio * * File Description: * Generic FLTK utilites. */#include <corelib/ncbiobj.hpp>#include <FL/Fl.H>#include <FL/Fl_Menu_.H>#include <map>#include <vector>#include <set>#include <gui/utils/gui_event.hpp> // temp. for backward compatibilityBEGIN_NCBI_SCOPE/** @addtogroup GUI_UTILS * * @{ */class NCBI_GUIUTILS_EXPORT CFltkUtils{public: // enums for NCBI-specific box types enum EBoxType { eBox_RightEdge = FL_FREE_BOXTYPE }; // perform all FLTK-specific initialization static void Init(int argc, char** argv); // wrappers for FLTK's thread locking mechanism. FLTK unfortunately // doesn't include stub functions of Fl::lock() and Fl::unlock() in // non-threaded compiles, so this is needed to work around this. static void Lock(void); // Unlock() takes an optional void* that will be made available to each // thread after Fl::awake() is called. static void Unlock(void* data = NULL); // wrapper for setting the FLTK cursor. We need to do this because FLTK // does not provide any way to retrieve what the current cursor is. static void SetCursor(Fl_Cursor cursor); static Fl_Cursor GetCursor(void); // Escape fltk special characters: \, @, & static string EscapeSpecialChars(const string& src);
private: static Fl_Cursor m_CurrentCursor;};//// class CFltkMenuMgrBase defines base class functionality for handling dynamic// menus.//// GBENCH supports dynamically-loaded menus. These menus are designed so that// a list of applicable plugins can be generated and iterated, with each plugin// being added to the dynamic menu. We need a menu manager to maintain state// and a few additional pieces of data associated with each menu item. FLTK// provides one unique and one menu-common pieces of user-defined data. For// our purposes, we need two unique pieces of data for each menu item. This// class maintains pairs of unique items so that menu callbacks can be// correctly followed.//// The requirement for this template is that class Object be a completely// self-contained object that supports the function Object::Run()//template <class Object>class CFltkMenuMgrBase{public: CFltkMenuMgrBase(Fl_Menu_* menu) : m_Menu(menu) { } virtual ~CFltkMenuMgrBase(); // Set the base menu text. This is the fully-resolved name of the menu // originating from the root menu. Submenus are distinguished via a '/'; a // '&' can be placed before the letter of the menu shortcut. void SetMenuBase(const string& base) { m_Base = base; }protected: // the FLTK menu itself Fl_Menu_* m_Menu; // The menu base item string m_Base; // Our list of callback data. The callback is passed the address of the // object in question. typedef vector< CRef<Object> > TCallbackData; typedef void (*FCallbackFunc)(Fl_Widget*, void*); TCallbackData m_Data; // Our static menu callback function static void x_StaticCB(Fl_Widget*, void* data); // Add a menu item to the base. virtual void x_AddItem(const string& item, Object* plugin, FCallbackFunc = &x_StaticCB); // Clear all items from the data array. void x_ClearData(); // Add a NULL item to the menu. The item will be deactivated; the null // item text is passed in. void x_AddNullItem(const string& item); // utility function to remove the children of a given fully-qualified // submenu name. Submenus are indicated with a '/' void x_RemoveSubitems(const string& menu);};//// class CFltkGuard is a simple exception-safe guard wrapper for// FLTK's GUI locking mechanism//class CFltkGuard{public: CFltkGuard(Fl_Widget* w = NULL) : m_Widget(w) { CFltkUtils::Lock(); } ~CFltkGuard() { CFltkUtils::Unlock(m_Widget); }private: Fl_Widget* m_Widget; CFltkGuard(const CFltkGuard&); CFltkGuard& operator=(const CFltkGuard&);};//// class CFltkCursorGuard implements a guard paradigm for changing// and restoring the current cursor.//// Please note that this contains a CFltkGuard internally, so there is no// need to use CFltkGuard in conjunction with this.//class NCBI_GUIUTILS_EXPORT CFltkCursorGuard{public: CFltkCursorGuard(Fl_Cursor cursor = FL_CURSOR_WAIT); ~CFltkCursorGuard();private: CFltkGuard m_Guard; // for restoring the cursor Fl_Cursor m_OrigCursor; Fl_Window* m_CursorWindow;};//////////////////////////////////////////////////////////////////////////// Inline Methods//////////////////////////////////////////////////////////////////////////template <class Object>inlineCFltkMenuMgrBase<Object>::~CFltkMenuMgrBase(){ x_ClearData();}//// x_AddItem()// private function to add an item to a given menu//template <class Object>inlinevoid CFltkMenuMgrBase<Object>::x_AddItem(const string& item, Object* plugin, FCallbackFunc callback){ if ( !m_Menu ) { return; } // save our callback data m_Data.push_back( CRef<Object> (plugin)); // create a new menu item m_Menu->add(item.c_str(), (const char*) NULL, (Fl_Callback*) callback, reinterpret_cast<void*> (plugin));}//// x_Clear()// clear the contents of our menu base//template <class Object>inlinevoid CFltkMenuMgrBase<Object>::x_ClearData(void){ // clear our callback data array m_Data.clear();}//// x_AddNullItem()// add an emtpy (deactivated) entry to a menu//template <class Object>inlinevoid CFltkMenuMgrBase<Object>::x_AddNullItem(const string& text){ if ( !m_Menu ) { return; } m_Menu->add(text.c_str(), 0, NULL, NULL, FL_MENU_INACTIVE);}//// x_RemoveItem()// removes the children of a given submenu//template <class Object>inlinevoid CFltkMenuMgrBase<Object>::x_RemoveSubitems(const string& menu){ string menu_stripped(menu); SIZE_TYPE pos; while ( (pos = menu_stripped.find_first_of("&")) != string::npos) { menu_stripped.erase(pos, 1); } // exception: menu_stripped is empty; we just remove the whole thing if (menu_stripped.empty()) { m_Menu->clear(); return; } // scan through our menu to find our entry string curr_menu; for (int i = 0; i < m_Menu->size(); ++i) { const char* p = m_Menu->text(i); // NULL entry = go up one level in the menu if ( !p ) { SIZE_TYPE pos = curr_menu.find_last_of("/"); if (pos != string::npos) { curr_menu.erase(pos); } else { curr_menu = ""; } continue; } // non-null entry // see if we're a submenu const Fl_Menu_Item& item = m_Menu->menu()[i]; string s = p; if ( !curr_menu.empty() ) { s = curr_menu + "/" + s; } while ( (pos = s.find_first_of("&")) != string::npos) { s.erase(pos, 1); } if (item.flags & FL_SUBMENU) { curr_menu = s; } if (menu_stripped == s) { // found it! // here we just iterate until we count balanced NULLs ++i; int submenu_size = m_Menu->menu()[i].size() - 1; for (int j = 0; j < submenu_size; ++j) { m_Menu->remove(i); } } }}//// x_StaticCB()// this is the main menu callback function//template <class CallbackMgr>inlinevoid CFltkMenuMgrBase<CallbackMgr>::x_StaticCB(Fl_Widget*, void* data){ if ( !data ) { return; } // we hold a CRef<> here because Run() may trigger some untoward events, // such as plug being deleted... CRef<CallbackMgr> plug(reinterpret_cast<CallbackMgr*> (data)); plug->DoCallback();}END_NCBI_SCOPE/* @} *//* * =========================================================================== * $Log: fltk_utils.hpp,v $ * Revision 1000.4 2004/06/01 19:51:09 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.34 * * Revision 1.34 2004/05/25 17:05:35 dicuccio * Added single point for FLTK initialization. Defined new box type (right edge * vertical line) * * Revision 1.33 2004/05/18 11:32:56 friedman * Added method to add escape char to FLTK special chars. * * Revision 1.32 2004/04/16 14:24:45 dicuccio * Added doxygen module tag. Updated include guard to reflect real location * * Revision 1.31 2004/03/23 13:35:13 dicuccio * Added GetCursor(), plus storage of current cursor. Fixed hanging wait cursors. * * Revision 1.30 2004/03/17 19:50:59 yazhuk * Moved Event classes to gui_event.hpp * * Revision 1.29 2004/03/08 16:36:09 lebedev * eInsZoomStateIn and eInsZoomStateOut states added * * Revision 1.28 2004/03/05 12:27:52 lebedev * eLensZoomState added * * Revision 1.27 2004/01/30 17:12:34 dicuccio * Added standard event types for cut/copy/paste/undo/redo * * Revision 1.26 2004/01/06 20:12:17 dicuccio * Added CFltkCursorGuard * * Revision 1.25 2003/12/31 20:19:16 dicuccio * Added CFltkUtils. Added Lock() / Unlock(). * * Revision 1.24 2003/12/22 23:42:41 ucko * Conditionalize use of FLTK locking on NCBI_THREADS, as single-threaded * FLTK builds lack stub versions. * * Revision 1.23 2003/12/22 19:15:35 dicuccio * Code reformatting * * Revision 1.22 2003/12/01 16:31:06 yazhuk * Added CGUIEvent class * * Revision 1.21 2003/09/30 13:39:03 dicuccio * Cleaned up erroneous comments. Changed template parameter name from Plugin to * Object (clearer on its intent). Fixed bug in clearning menus when the menu * base is an empty string * * Revision 1.20 2003/07/21 19:23:15 dicuccio * Minor semantic change: changed name of template parameter to match its use * * Revision 1.19 2003/06/25 16:59:41 dicuccio * Changed CPluginHandle into a pointer-to-implementation (the previous * implementation is now the pointer held). Lots of #include file clean-ups. * * Revision 1.18 2003/06/20 20:00:32 dicuccio * Minor reformatting * * Revision 1.17 2003/04/17 16:24:28 rsmith * in definition of class CFltkMenuMgrBase, moved declaration of x_StaticCB before it is used in x_AddItem so Codewarrior will compile. * * Revision 1.16 2003/03/25 18:34:28 dicuccio * Changed export from GUIUTILS --> GUIUTILS * * Revision 1.15 2003/03/21 16:57:30 dicuccio * Moved from gui/core --> gui/utils. Added event type for double-click. * * Revision 1.14 2003/02/26 19:16:11 dicuccio * Fixed menu removal, using Fl_Menu_Item::size() * * Revision 1.13 2003/02/26 18:57:42 dicuccio * Revered change to menu removal function * * Revision 1.12 2003/02/26 17:52:26 dicuccio * Cleaned up dynamic menus to make them resistant to refreshing the menu while * the menu callback is running * * Revision 1.11 2003/02/20 19:44:06 dicuccio * Created new plugin architecture, mediated via an ASN.1 spec. Moved GBENCH * framework over to use new plugin architecture. * * Revision 1.10 2003/01/13 13:11:42 dicuccio * Namespace clean-up. Retired namespace gui -> converted to namespace ncbi. * Moved all FLUID-generated code into namespace ncbi. * * Revision 1.9 2003/01/09 04:02:36 vakatov * Removed extraneous comma after the last enum value in * CFltkEvent::EEventFlags -- it resulted in a warning with Forte * * Revision 1.8 2002/12/30 17:49:52 dicuccio * Added mechanism for menu managers to define their own private static menu * callback function * * Revision 1.7 2002/12/26 21:10:09 dicuccio * Minor header rearrangement to avoid compiler warning for MSVC * * Revision 1.6 2002/12/23 14:35:54 kuznets * Added #include<vector> * * Revision 1.5 2002/12/23 13:47:27 dicuccio * Added missing #include <vector>. Changed all *EventState -> *Event - less * verbose. * * Revision 1.4 2002/12/20 19:10:16 dicuccio * Added a base class for the menu managers. This class is responsible for * managing a container of dynamically created items, each of which serves as * the callback data for an FLTK menu. These classes can encapsulate the * information needed to launch a context-specific plugin. * * Revision 1.3 2002/12/19 18:13:02 dicuccio * Added export specifiers for Win32. * * Revision 1.2 2002/12/12 15:18:16 dicuccio * Minor formatting change. * * Revision 1.1 2002/11/19 16:58:15 dicuccio * Initial revision. * * =========================================================================== */#endif // GUI_UTILS___FLTK_UTILS__HPP
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?