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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: tt_window.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:10:29  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: tt_window.cpp,v 1000.1 2004/06/01 21:10:29 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software / database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software / database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "tt_window.hpp"
  41. #include <gui/opengl/glutils.hpp>
  42. #include <math.h>
  43. BEGIN_NCBI_SCOPE
  44. static const int s_Border = 10;
  45. CTTWindow::CTTWindow(int x, int y, int w, int h, const char* label)
  46.     : CGlCanvas2d(x, y, w, h, label),
  47.       m_Font(CGlBitmapFont::eHelvetica12)
  48. {
  49.     m_bActiveTooltip = false; // change this to see the difference
  50.     if(m_bActiveTooltip)
  51.         m_Tooltip.EnableActiveMode(static_cast<ITooltipClient*>(this));
  52. }
  53. void CTTWindow::draw()
  54. {
  55.     glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
  56.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  57.     glMatrixMode(GL_PROJECTION);
  58.     glLoadIdentity();
  59.     glOrtho(0, w(), h(), 0, 1, -1);
  60.     x_RenderFirstRow();
  61.     x_RenderSecondRow();
  62.     x_RenderThirdRow();
  63.     CGlUtils::CheckGlError();
  64. }
  65. static int kRowH = 80;
  66. static int kRowSpace = 5;
  67. static int kButtons = 12;
  68. static int kButtonSize = 22;
  69. static int kButtonSpace = 4;
  70.     
  71. void CTTWindow::x_RenderFirstRow()
  72. {
  73.     static char Seq[8] = {'A', 0, 'C', 0, 'T', 0, 'G', 0    };
  74.     int text_h = m_Font.TextHeight();
  75.     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);        
  76.     glColor3d(0.9, 0.9, 1.0);
  77.     glRectd(kRowSpace, kRowSpace, 
  78.             kRowSpace * 2 + kButtons * (kButtonSize + kButtonSpace), kRowH  - kRowSpace);
  79.     glColor3i(0, 0, 0);
  80.     m_Font.TextOut(kRowSpace + 5, kRowSpace + 5 + text_h, "CTooltip::eHideOnMove");
  81.     
  82.     float x = kRowSpace + kButtonSpace / 2;
  83.     float y = kRowH - kRowSpace - kButtonSpace / 2 - kButtonSize;
  84.     for(int i = 0; i < 12; i++) {        
  85.         glColor3d(0.7, 0.7, 1.0);
  86.         glRectd(x, y, x + kButtonSize, y + kButtonSize);
  87.         glColor3d(0, 0, 0.25);
  88.         int ind = (i % 4) * 2;
  89.         m_Font.TextOut(x, y, kButtonSize, kButtonSize, Seq + ind, FL_ALIGN_CENTER);
  90.         x += kButtonSize + kButtonSpace;
  91.     }  
  92. }
  93. static int kAmp = 20;
  94. static int kSignalLength = 400;
  95. double GetFuncValue(int index)  
  96. {
  97.     double a = 0.1 * index;
  98.     return sin(a) * kAmp;
  99. }
  100. void CTTWindow::x_RenderSecondRow()
  101. {    
  102.     int text_h = m_Font.TextHeight();
  103.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);        
  104.     glColor3d(0.9, 1.0, 0.9);
  105.     glRectd(kRowSpace, kRowH + kRowSpace, 
  106.             kRowSpace * 2 + kSignalLength, 2 * kRowH  - kRowSpace);
  107.     glColor3i(0, 0, 0);
  108.     m_Font.TextOut(kRowSpace + 5, kRowH + kRowSpace + 5 + text_h, "CTooltip::eTrackOnMove");    
  109.     //draw signal
  110.     glColor3d(0, 0.5, 0);
  111.     int y = 2 * kRowH - kRowSpace - kAmp;
  112.     glBegin(GL_LINE_STRIP);
  113.         for( int i = 0; i< kSignalLength; i++ ) {
  114.             double v = GetFuncValue(i);    
  115.             glVertex2d(i + kRowSpace, y + v);
  116.         }
  117.     glEnd();
  118. }
  119. void CTTWindow::x_RenderThirdRow()
  120. {
  121.     int text_h = m_Font.TextHeight();
  122.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);        
  123.     glColor3d(1.0, 0.9, 0.9);
  124.     glRectd(kRowSpace, 2 * kRowH + kRowSpace, 
  125.             kRowSpace * 2 + kButtons * (kButtonSize + kButtonSpace), 3 * kRowH  - kRowSpace);
  126.     glColor3i(0, 0, 0);
  127.     m_Font.TextOut(kRowSpace + 5, 2 * kRowH + kRowSpace + 5 + text_h, "CTooltip::eStayOnMove");    
  128.     float x = kRowSpace + kButtonSpace / 2;
  129.     float y = 3 * kRowH - kRowSpace - kButtonSpace / 2 - kButtonSize;
  130.     for(int i = 0; i < 12; i++) {        
  131.         glColor3d(1.0, 0.7, 0.7);
  132.         glRectd(x, y, x + kButtonSize, y + kButtonSize);
  133.         glColor3d(0, 0, 0.25);
  134.         int ind = (i % 4) * 2;
  135.         m_Font.TextOut(x, y, kButtonSize, kButtonSize, NStr::IntToString(i + 1).c_str(), FL_ALIGN_CENTER);
  136.         x += kButtonSize + kButtonSpace;
  137.     }
  138. }
  139. int CTTWindow::handle(int event)
  140. {
  141.    switch (event) {
  142.    case FL_MOVE:
  143.         if(! m_bActiveTooltip)  { // this is needed only for "passive" tooltip
  144.             bool b_reset = true;
  145.         
  146.             int x = Fl::event_x();
  147.             int y = Fl::event_y();
  148.             
  149.             int row = x_HitTest(x, y, b_reset);                
  150.         
  151.             if(row == -1)    {
  152.                 m_Tooltip.Deactivate(b_reset); // explicit deactivation
  153.             } else  {
  154.                 CTooltip::EMode mode;
  155.                 switch(row) {
  156.                 case 0: mode = CTooltip::eHideOnMove; break;
  157.                 case 1: mode = CTooltip::eTrackOnMove; break;
  158.                 case 2: mode = CTooltip::eStayOnMove; break;
  159.                 }
  160.                 m_Tooltip.SetMode(mode);
  161.                 
  162.                 // explicit activation
  163.                 m_Tooltip.Activate(this, m_TooltipText, m_X, m_Y, m_W, m_H);
  164.             }            
  165.         }
  166.         break;
  167.     }
  168.     
  169.     // pass events to the tooltip object
  170.     m_Tooltip.Handle(event);
  171.     return CGlCanvas2d::handle(event);
  172. }
  173. /// Performs hit testing and save results (m_Tooltiptext, m_X, m_Y, m_W, m_H) 
  174. /// for possible future use
  175. int    CTTWindow::x_HitTest(int x, int y, bool& b_reset)
  176. {
  177.     switch(y / kRowH)   { // swith by row index
  178.     case 0: {
  179.         int btn_size = kButtonSize + kButtonSpace;
  180.         if(y >= kRowH  - kRowSpace - btn_size  &&  y < kRowH  - kRowSpace
  181.             && x > kRowSpace  &&  x < (kRowSpace * 2 + kButtons * btn_size) )    {
  182.             int loc_x = (x - kRowSpace - kButtonSpace / 2);
  183.             if(loc_x % btn_size < kButtonSize)  { // hit a button
  184.                 int ind = loc_x / btn_size; // button index
  185.                 m_TooltipText = "Postion ";
  186.                 m_TooltipText += NStr::IntToString(ind);
  187.                 if(! m_bActiveTooltip)  {
  188.                     m_X = x;
  189.                     m_Y = y;
  190.                     m_W = m_H = 1;
  191.                 }
  192.                 return 0;
  193.             }
  194.         }
  195.     }; break;
  196.     case 1: {
  197.         int bottom = 2 * kRowH  - kRowSpace;
  198.         if(y > bottom - 2 * kAmp  &&  y < bottom
  199.             && x > kRowSpace  &&  x < (kRowSpace * 2 + kSignalLength) )    {
  200.             int loc_x = x - kRowSpace;
  201.             double v = GetFuncValue(loc_x);
  202.         
  203.             char s[100];
  204.             sprintf(s, "Function value %.2f", v / -kAmp);
  205.             m_TooltipText = s;
  206.             
  207.             if(! m_bActiveTooltip)  {
  208.                 m_X = x;
  209.                 m_Y = y;
  210.                 m_W = m_H = 1;
  211.             }
  212.             return 1;
  213.         }
  214.     
  215.     };
  216.     case 2: {
  217.         int btn_size = kButtonSize + kButtonSpace;
  218.         int bottom = 3 * kRowH  - kRowSpace;
  219.         if(y >= bottom - btn_size  &&  y < bottom - kButtonSpace
  220.             && x > kRowSpace  &&  x < (kRowSpace * 2 + kButtons * btn_size) )    {
  221.             b_reset = false;
  222.             int loc_x = (x - kRowSpace - kButtonSpace / 2);
  223.             if(loc_x % btn_size < kButtonSize)  {
  224.                 int ind = loc_x / btn_size;
  225.                 m_TooltipText = "Button # ";
  226.                 m_TooltipText += NStr::IntToString(ind + 1);
  227.                 
  228.                 // set tooltip area equal to button rectangle
  229.                 m_X = kRowSpace + kButtonSpace / 2;
  230.                 m_Y = 2 * kRowH  - kRowSpace;
  231.                 m_W = m_H = kButtonSize;
  232.                 return 2;
  233.             }
  234.         }
  235.     };
  236.     default: break;
  237.     }
  238.     return -1;
  239. }
  240. ///////////////////////////////////////////////////////////////////////////////
  241. /// ITooltip Implementation
  242. /// TC_NeedTooltip() and TC_GetTooltip() is evrything needed to show toolitps
  243. /// in "active" mode
  244. bool    CTTWindow::TC_NeedTooltip(int x, int y)
  245. {
  246.     bool b_reset; // dummy
  247.     int row = x_HitTest(x, y, b_reset);                
  248.     
  249.     if(row == -1)    {
  250.         return false; // do not show (hide if visible)
  251.     } else  {
  252.         CTooltip::EMode mode;
  253.         switch(row) {
  254.         case 0: mode = CTooltip::eHideOnMove; break;
  255.         case 1: mode = CTooltip::eTrackOnMove; break;
  256.         case 2: mode = CTooltip::eStayOnMove; break;
  257.         }
  258.         m_Tooltip.SetMode(mode);
  259.         return true; // show tooltip
  260.     }    
  261. }
  262. string  CTTWindow::TC_GetTooltip(int& x, int& y, int& w, int& h)
  263. {
  264.     x = m_X;
  265.     y = m_Y;
  266.     w = m_W;
  267.     h = m_H;
  268.     return m_TooltipText;
  269. }
  270. END_NCBI_SCOPE
  271. /*
  272.  * ===========================================================================
  273.  * $Log: tt_window.cpp,v $
  274.  * Revision 1000.1  2004/06/01 21:10:29  gouriano
  275.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  276.  *
  277.  * Revision 1.2  2004/05/21 22:27:54  gorelenk
  278.  * Added PCH ncbi_pch.hpp
  279.  *
  280.  * Revision 1.1  2004/01/14 11:55:57  lebedev
  281.  * Moved from gui/opengl/demo
  282.  *
  283.  * Revision 1.3  2004/01/08 19:49:09  yazhuk
  284.  * Implemented demonstration of "active" and "passive" CTooltips
  285.  *
  286.  * Revision 1.2  2003/12/29 21:14:01  yazhuk
  287.  * Migrated from Fl_Tooltip to CTooltip
  288.  *
  289.  * Revision 1.1  2003/09/29 17:00:55  dicuccio
  290.  * Initial revision
  291.  *
  292.  * ===========================================================================
  293.  */