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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: Flu_Chat_Buffer.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:05:32  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_Chat_Buffer.cpp,v $
  15.  * Revision 1000.1  2004/06/01 21:05:32  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_Chat_Buffer.cpp,v 1000.1 2004/06/01 21:05:32 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 <FL/fl_draw.H>
  40. #include <gui/widgets/FLU/Flu_Chat_Buffer.h>
  41. #include <stdlib.h>
  42. #include <stdio.h>
  43. #include <string.h>
  44. #define X_OFFSET 5
  45. Flu_Chat_Buffer :: Flu_Chat_Buffer( int x, int y, int w, int h, const char *label )
  46.   : Fl_Widget( x, y, w, h, label )
  47. {
  48.   buffer = NULL;
  49.   scrollbar = new Fl_Scrollbar( x+w-22, y+2, 20, h-4 );
  50.   scrollbar->linesize( 1 );
  51.   scrollbar->callback( _scrollbarCB, this );
  52.   box( FL_DOWN_BOX );
  53.   color( FL_WHITE );
  54.   setSystemStyle( FL_HELVETICA_ITALIC, FL_BLACK );
  55.   setRemoteHandleStyle( FL_HELVETICA_BOLD, FL_RED );
  56.   setLocalHandleStyle( FL_HELVETICA_BOLD, FL_BLUE );
  57.   setRemoteMessageStyle( FL_HELVETICA, FL_RED );
  58.   setLocalMessageStyle( FL_HELVETICA, FL_BLUE );
  59.   clear();
  60. }
  61. Flu_Chat_Buffer :: ~Flu_Chat_Buffer()
  62. {
  63.   clear( 0 );
  64. }
  65. void Flu_Chat_Buffer :: draw()
  66. {
  67.   if( recomputeFootprint )
  68.     _computeMessageFootprint();
  69.   // draw the background box
  70.   draw_box();
  71.   // resize the scrollbar to be a constant width
  72.   scrollbar->resize( x()+w()-22, y()+2, 20, h()-4 );
  73.   scrollbar->redraw();
  74.   int height = h()-4;
  75.   int line;
  76.   if( ( currentLine == 0 ) && ( totalLines == 0 ) )
  77.     return;
  78.   line = currentLine - 1 - scrollbar->value();
  79.   fl_push_clip( x()+2, y()+2, w()-4, h()-4 );
  80.   while( height >= 0 )
  81.     {
  82.       switch( buffer[line].type )
  83. {
  84. case 'S':
  85.   {
  86.     height -= buffer[line].height;
  87.     fl_color( systemColor );
  88.     fl_font( systemFont, FL_NORMAL_SIZE );
  89.     fl_draw( buffer[line].message, x()+X_OFFSET, y()+height,
  90.      buffer[line].messageW, buffer[line].height, (Fl_Align)(FL_ALIGN_TOP_LEFT | FL_ALIGN_WRAP), NULL, 0 );
  91.   }
  92.   break;
  93. case 'R':
  94.   {
  95.     height -= buffer[line].height;
  96.     fl_color( remoteHandleColor );
  97.     fl_font( remoteHandleFont, FL_NORMAL_SIZE );
  98.     fl_draw( buffer[line].handle, x()+X_OFFSET, y()+height,
  99.      buffer[line].handleW, buffer[line].height, (Fl_Align)(FL_ALIGN_TOP_LEFT | FL_ALIGN_WRAP), NULL, 0 );
  100.     fl_color( remoteMessageColor );
  101.     fl_font( remoteMessageFont, FL_NORMAL_SIZE );
  102.     fl_draw( buffer[line].message, x()+X_OFFSET+buffer[line].handleW, y()+height,
  103.      buffer[line].messageW, buffer[line].height, (Fl_Align)(FL_ALIGN_TOP_LEFT | FL_ALIGN_WRAP), NULL, 0 );
  104.   }
  105.   break;
  106. case 'L':
  107.   {
  108.     height -= buffer[line].height;
  109.     fl_color( localHandleColor );
  110.     fl_font( localHandleFont, FL_NORMAL_SIZE );
  111.     fl_draw( buffer[line].handle, x()+X_OFFSET, y()+height,
  112.      buffer[line].handleW, buffer[line].height, (Fl_Align)(FL_ALIGN_TOP_LEFT | FL_ALIGN_WRAP), NULL, 0 );
  113.     fl_color( localMessageColor );
  114.     fl_font( localMessageFont, FL_NORMAL_SIZE );
  115.     fl_draw( buffer[line].message, x()+X_OFFSET+buffer[line].handleW, y()+height,
  116.      buffer[line].messageW, buffer[line].height, (Fl_Align)(FL_ALIGN_TOP_LEFT | FL_ALIGN_WRAP), NULL, 0 );
  117.   }
  118.   break;
  119. }
  120.       if( ( line == 0 ) && ( totalLines < maxLines ) )
  121. break;
  122.       if( line == 0 )
  123. line = totalLines - 1;
  124.       else
  125. line--;
  126.     }
  127.   fl_pop_clip();
  128. }
  129. void Flu_Chat_Buffer :: scrollbarCB()
  130. {
  131.   redraw();
  132. }
  133. void Flu_Chat_Buffer :: _addMessage( char type, char *handle, char *msg )
  134. {
  135.   buffer[currentLine].type = type;
  136.   buffer[currentLine].handle = handle;
  137.   buffer[currentLine].message = msg;
  138.   // increment the current line, and wrap to the beginning of the buffer
  139.   // if necessary
  140.   currentLine = (currentLine+1) % maxLines;
  141.   // increment the total lines (no more than maxLines)
  142.   totalLines = ( totalLines < maxLines ) ? totalLines+1 : maxLines;
  143.   recomputeFootprint = true;
  144.   redraw();
  145. }
  146. void Flu_Chat_Buffer :: addSystemMessage( const char *msg )
  147. {
  148.   if( !buffer || !msg )
  149.     return;
  150.   if( strlen( msg ) == 0 )
  151.     return;
  152.   _addMessage( 'S', NULL, strdup(msg) );
  153. }
  154. void Flu_Chat_Buffer :: addRemoteMessage( const char *handle, const char *msg )
  155. {
  156.   if( !buffer || !handle || !msg )
  157.     return;
  158.   if( ( strlen( handle ) == 0 ) || ( strlen( msg ) == 0 ) )
  159.     return;
  160.   _addMessage( 'R', strdup(handle), strdup(msg) );
  161. }
  162. void Flu_Chat_Buffer :: addLocalMessage( const char *handle, const char *msg )
  163. {
  164.   if( !buffer || !handle || !msg )
  165.     return;
  166.   if( ( strlen( handle ) == 0 ) || ( strlen( msg ) == 0 ) )
  167.     return;
  168.   _addMessage( 'L', strdup(handle), strdup(msg) );
  169. }
  170. void Flu_Chat_Buffer :: clear( int maximumLines )
  171. {
  172.   recomputeFootprint = true;
  173.   if( buffer )
  174.     {
  175.       for( int i = 0; i < maxLines; i++ )
  176. {
  177.   if( buffer[i].handle )
  178.     free( buffer[i].handle );
  179.   if( buffer[i].message )
  180.     free( buffer[i].message );
  181. }
  182.       free( buffer );
  183.       buffer = NULL;
  184.     }
  185.   maxLines = maximumLines;
  186.   if( maxLines == 0 )
  187.     return;
  188.   buffer = (MessageInfo*)malloc( maxLines * sizeof(MessageInfo) );
  189.   for( int i = 0; i < maxLines; i++ )
  190.     {
  191.       buffer[i].handle = buffer[i].message = NULL;
  192.       buffer[i].type = 0; // empty
  193.     }
  194.   totalLines = currentLine = 0;
  195. }
  196. void Flu_Chat_Buffer :: _computeMessageFootprint()
  197. {
  198.   recomputeFootprint = false;
  199.   // restrict the width calculation to account for the scrollbar
  200.   int width = w() - scrollbar->w() - X_OFFSET;
  201.   int linesPastHeight = 0;
  202.   int totalHeight = 0;
  203.   for( int i = 0; i < totalLines; i++ )
  204.     {
  205.       switch( buffer[i].type )
  206. {
  207. case 'S':
  208.   {
  209.     int tw = width, th;
  210.     // set the font and color for system messages
  211.     fl_color( systemColor );
  212.     fl_font( systemFont, FL_NORMAL_SIZE );
  213.     // measure how big the message is
  214.     fl_measure( buffer[i].message, tw, th );
  215.     buffer[i].messageW = tw;
  216.     buffer[i].height = th;
  217.     totalHeight += buffer[i].height;
  218.     if( totalHeight > h() )
  219.       linesPastHeight++;
  220.   }
  221.   break;
  222. case 'R':
  223.   {
  224.     int tw = width, hh, mh;
  225.     // set the font and color for remote handles
  226.     fl_color( remoteHandleColor );
  227.     fl_font( remoteHandleFont, FL_NORMAL_SIZE );
  228.     // measure how big the handle is
  229.     fl_measure( buffer[i].handle, tw, hh );
  230.     buffer[i].handleW = tw;
  231.     // set the font and color for remote messages, and adjust the width so the message
  232.     // is aligned with the end of the handle
  233.     fl_color( remoteMessageColor );
  234.     fl_font( remoteMessageFont, FL_NORMAL_SIZE );
  235.     tw = width - tw;
  236.     // measure how big the message is
  237.     fl_measure( buffer[i].message, tw, mh );
  238.     buffer[i].messageW = tw;
  239.     // increase total height by max of handle height and message height
  240.     buffer[i].height = ( mh > hh ) ? mh : hh;
  241.     totalHeight += buffer[i].height;
  242.     if( totalHeight > h() )
  243.       linesPastHeight++;
  244.   }
  245.   break;
  246. case 'L':
  247.   {
  248.     int tw = width, hh, mh;
  249.     // set the font and color for local handles
  250.     fl_color( localHandleColor );
  251.     fl_font( localHandleFont, FL_NORMAL_SIZE );
  252.     // measure how big the handle is
  253.     fl_measure( buffer[i].handle, tw, hh );
  254.     buffer[i].handleW = tw;
  255.     // set the font and color for local messages, and adjust the width so the message
  256.     // is aligned with the end of the handle
  257.     fl_color( localMessageColor );
  258.     fl_font( localMessageFont, FL_NORMAL_SIZE );
  259.     tw = width - tw;
  260.     // measure how big the message is
  261.     fl_measure( buffer[i].message, tw, mh );
  262.     buffer[i].messageW = tw;
  263.     // increase total height by max of handle height and message height
  264.     buffer[i].height = ( mh > hh ) ? mh : hh;
  265.     totalHeight += buffer[i].height;
  266.     if( totalHeight > h() )
  267.       linesPastHeight++;
  268.   }
  269.   break;
  270. }
  271.       
  272.     }
  273.   scrollbar->range( linesPastHeight, 0 );
  274.   float size = float(h()) / float(totalHeight);
  275.   if( size > 1.0f )
  276.     size = 1.0f;
  277.   if( size < 0.08f )
  278.     size = 0.08f;
  279.   scrollbar->slider_size( size );
  280.   redraw();
  281. }
  282. void Flu_Chat_Buffer :: resize( int x, int y, int w, int h )
  283. {
  284.   Fl_Widget::resize( x, y, w, h );
  285.   recomputeFootprint = true;
  286. }