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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: Flu_Helpers.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:05:49  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_Helpers.cpp,v $
  15.  * Revision 1000.1  2004/06/01 21:05:49  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_Helpers.cpp,v 1000.1 2004/06/01 21:05:49 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 <gui/widgets/FLU/Flu_Helpers.h>
  40. #include <string.h>
  41. #include <stdio.h>
  42. #include <stdlib.h>
  43. #define streq(a,b) (strcmp(a,b)==0)
  44. static int fl_Full_Find_In_Menu( const Fl_Menu_* menu, const Fl_Menu_Item* items, int &which, const char* fullname )
  45. {
  46.   if( fullname == NULL )
  47.     return -1;
  48.   if( fullname[0] == '' )
  49.     return -1;
  50.   char *name = strdup( fullname );
  51.   bool submenu = false;
  52.   // strip off the first part of the path
  53.   char* slash = strchr( name, '/' );
  54.   if( slash )
  55.     {
  56.       *slash = '';
  57.       submenu = true; // if there is a slash, then the first part is a submenu
  58.     }
  59.   // search for the name
  60.   for(;;)
  61.     {
  62.       // if we're at the end, quit searching
  63.       if( which >= menu->size() )
  64. {
  65.   return -1;
  66. }
  67.       bool match = false;
  68.       if( items[which].label() )
  69. match = streq( name, items[which].label() );
  70.       else
  71. match = false;
  72.       // see if the name matches the next menu item
  73.       if( match )
  74. {
  75.   // if the path indicates this is a submenu...
  76.   if( submenu )
  77.     {
  78.       // ...but the menu item does not indicate that it is a submenu, then we have a problem
  79.       if( !items[which].submenu() )
  80. {
  81.   free(name);
  82.   return -1;
  83. }
  84.       // ...the menu item agrees that it is a submenu, so recurse on the remaining items and path
  85.       else
  86. {
  87.   fullname += (slash-name) + 1;
  88.   which++;
  89.   free(name);
  90.   return fl_Full_Find_In_Menu( menu, items, which, fullname );
  91. }
  92.     }
  93.   // we have an exact match and the the path indicates the item is not a submenu
  94.   else
  95.     {
  96.       // if the item disagrees, then we have a problem
  97.       //if( items[which].submenu() )
  98.       //{
  99.       //  free(name);
  100.       //  return -1;
  101.       //}
  102.       // otherwise the path and the item are in agreement that this is the actual item
  103.       // being searched for, so return it
  104.       //else
  105. {
  106.   free(name);
  107.   return which;
  108. }
  109.     }
  110. }
  111.       // the name doesn't match, so skip to the next item
  112.       else
  113. {
  114.   // if the item is a submenu, skip all its children
  115.   if( items[which].submenu() )
  116.     {
  117.       while( items[which].label() != 0 )
  118. which++;
  119.       which++; // increment one more to eat the end-of-submenu marker
  120.     }
  121.   // otherwise just skip the item
  122.   else
  123.     which++;
  124. }
  125.     }
  126. }
  127. int fl_Full_Find_In_Menu( const Fl_Menu_* menu, const char* fullname )
  128. {
  129.   if( menu == NULL )
  130.     return -1;
  131.   if( fullname == NULL )
  132.     return -1;
  133.   const Fl_Menu_Item *items = menu->menu();
  134.   // remove any leading '/' (there shouldn't be one...but just in case)
  135.   if( fullname[0] == '/' )
  136.     fullname++;
  137.   // delete any 'flag' characters
  138.   char *correctedName = strdup( fullname );
  139.   {
  140.     int index = 0;
  141.     for( int i = 0; i < (int)strlen( fullname ); i++ )
  142.       {
  143. if( fullname[i] == '&' && fullname[i+1] == '&' )
  144.   correctedName[index++] = '&';
  145. else if( fullname[i] == '&' )
  146.   continue;
  147. else if( fullname[i] == '_' )
  148.   continue;
  149. else
  150.   correctedName[index++] = fullname[i];
  151.       }
  152.     correctedName[index] = '';
  153.   }
  154.   // find the menu entry
  155.   int which = 0;
  156.   while( items[which].label() != 0 && which != menu->size() )
  157.     {
  158.       int val = fl_Full_Find_In_Menu( menu, items, which, correctedName );
  159.       if( val != -1 )
  160. {
  161.   free( correctedName );
  162.   return val;
  163. }
  164.     }
  165.   free( correctedName );
  166.   return -1;
  167. }
  168. int fl_Find_In_Menu( const Fl_Menu_* menu, const char* name )
  169. {
  170.   if( menu == NULL )
  171.     return -1;
  172.   if( name == NULL )
  173.     return -1;
  174.   const Fl_Menu_Item *items = menu->menu();
  175.   for( int i = 0; i < menu->size(); i++ )
  176.     {
  177.       if( items[i].label() == NULL )
  178. continue;
  179.       if( strlen( items[i].label() ) == 0 )
  180. continue;
  181.       if( strcmp( name, items[i].label() ) == 0 )
  182. return i;
  183.     }
  184.   return -1;
  185. }