flu_chat_buffer.cpp

来自「ncbi源码」· C++ 代码 · 共 349 行

CPP
349
字号
/* * =========================================================================== * PRODUCTION $Log: Flu_Chat_Buffer.cpp,v $ * PRODUCTION Revision 1000.1  2004/06/01 21:05:32  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2 * 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_Chat_Buffer.cpp,v $ * Revision 1000.1  2004/06/01 21:05:32  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2 * * Revision 1.2  2004/05/21 22:27:51  gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.1  2004/03/11 13:51:39  dicuccio * Imported FLU version 2.9.1.  Altered export specifiers to match NCBI layout. * Altered include paths to match NCBI toolkit layout. * * ========================================================================== */// $Id: Flu_Chat_Buffer.cpp,v 1000.1 2004/06/01 21:05:32 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 *  ***************************************************************/#include <ncbi_pch.hpp>#include <FL/fl_draw.H>#include <gui/widgets/FLU/Flu_Chat_Buffer.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#define X_OFFSET 5Flu_Chat_Buffer :: Flu_Chat_Buffer( int x, int y, int w, int h, const char *label )  : Fl_Widget( x, y, w, h, label ){  buffer = NULL;  scrollbar = new Fl_Scrollbar( x+w-22, y+2, 20, h-4 );  scrollbar->linesize( 1 );  scrollbar->callback( _scrollbarCB, this );  box( FL_DOWN_BOX );  color( FL_WHITE );  setSystemStyle( FL_HELVETICA_ITALIC, FL_BLACK );  setRemoteHandleStyle( FL_HELVETICA_BOLD, FL_RED );  setLocalHandleStyle( FL_HELVETICA_BOLD, FL_BLUE );  setRemoteMessageStyle( FL_HELVETICA, FL_RED );  setLocalMessageStyle( FL_HELVETICA, FL_BLUE );  clear();}Flu_Chat_Buffer :: ~Flu_Chat_Buffer(){  clear( 0 );}void Flu_Chat_Buffer :: draw(){  if( recomputeFootprint )    _computeMessageFootprint();  // draw the background box  draw_box();  // resize the scrollbar to be a constant width  scrollbar->resize( x()+w()-22, y()+2, 20, h()-4 );  scrollbar->redraw();  int height = h()-4;  int line;  if( ( currentLine == 0 ) && ( totalLines == 0 ) )    return;  line = currentLine - 1 - scrollbar->value();  fl_push_clip( x()+2, y()+2, w()-4, h()-4 );  while( height >= 0 )    {      switch( buffer[line].type )	{	case 'S':	  {	    height -= buffer[line].height;	    fl_color( systemColor );	    fl_font( systemFont, FL_NORMAL_SIZE );	    fl_draw( buffer[line].message, x()+X_OFFSET, y()+height,		     buffer[line].messageW, buffer[line].height, (Fl_Align)(FL_ALIGN_TOP_LEFT | FL_ALIGN_WRAP), NULL, 0 );	  }	  break;	case 'R':	  {	    height -= buffer[line].height;	    fl_color( remoteHandleColor );	    fl_font( remoteHandleFont, FL_NORMAL_SIZE );	    fl_draw( buffer[line].handle, x()+X_OFFSET, y()+height,		     buffer[line].handleW, buffer[line].height, (Fl_Align)(FL_ALIGN_TOP_LEFT | FL_ALIGN_WRAP), NULL, 0 );	    fl_color( remoteMessageColor );	    fl_font( remoteMessageFont, FL_NORMAL_SIZE );	    fl_draw( buffer[line].message, x()+X_OFFSET+buffer[line].handleW, y()+height,		     buffer[line].messageW, buffer[line].height, (Fl_Align)(FL_ALIGN_TOP_LEFT | FL_ALIGN_WRAP), NULL, 0 );	  }	  break;	case 'L':	  {	    height -= buffer[line].height;	    fl_color( localHandleColor );	    fl_font( localHandleFont, FL_NORMAL_SIZE );	    fl_draw( buffer[line].handle, x()+X_OFFSET, y()+height,		     buffer[line].handleW, buffer[line].height, (Fl_Align)(FL_ALIGN_TOP_LEFT | FL_ALIGN_WRAP), NULL, 0 );	    fl_color( localMessageColor );	    fl_font( localMessageFont, FL_NORMAL_SIZE );	    fl_draw( buffer[line].message, x()+X_OFFSET+buffer[line].handleW, y()+height,		     buffer[line].messageW, buffer[line].height, (Fl_Align)(FL_ALIGN_TOP_LEFT | FL_ALIGN_WRAP), NULL, 0 );	  }	  break;	}      if( ( line == 0 ) && ( totalLines < maxLines ) )	break;      if( line == 0 )	line = totalLines - 1;      else	line--;    }  fl_pop_clip();}void Flu_Chat_Buffer :: scrollbarCB(){  redraw();}void Flu_Chat_Buffer :: _addMessage( char type, char *handle, char *msg ){  buffer[currentLine].type = type;  buffer[currentLine].handle = handle;  buffer[currentLine].message = msg;  // increment the current line, and wrap to the beginning of the buffer  // if necessary  currentLine = (currentLine+1) % maxLines;  // increment the total lines (no more than maxLines)  totalLines = ( totalLines < maxLines ) ? totalLines+1 : maxLines;  recomputeFootprint = true;  redraw();}void Flu_Chat_Buffer :: addSystemMessage( const char *msg ){  if( !buffer || !msg )    return;  if( strlen( msg ) == 0 )    return;  _addMessage( 'S', NULL, strdup(msg) );}void Flu_Chat_Buffer :: addRemoteMessage( const char *handle, const char *msg ){  if( !buffer || !handle || !msg )    return;  if( ( strlen( handle ) == 0 ) || ( strlen( msg ) == 0 ) )    return;  _addMessage( 'R', strdup(handle), strdup(msg) );}void Flu_Chat_Buffer :: addLocalMessage( const char *handle, const char *msg ){  if( !buffer || !handle || !msg )    return;  if( ( strlen( handle ) == 0 ) || ( strlen( msg ) == 0 ) )    return;  _addMessage( 'L', strdup(handle), strdup(msg) );}void Flu_Chat_Buffer :: clear( int maximumLines ){  recomputeFootprint = true;  if( buffer )    {      for( int i = 0; i < maxLines; i++ )	{	  if( buffer[i].handle )	    free( buffer[i].handle );	  if( buffer[i].message )	    free( buffer[i].message );	}      free( buffer );      buffer = NULL;    }  maxLines = maximumLines;  if( maxLines == 0 )    return;  buffer = (MessageInfo*)malloc( maxLines * sizeof(MessageInfo) );  for( int i = 0; i < maxLines; i++ )    {      buffer[i].handle = buffer[i].message = NULL;      buffer[i].type = 0; // empty    }  totalLines = currentLine = 0;}void Flu_Chat_Buffer :: _computeMessageFootprint(){  recomputeFootprint = false;  // restrict the width calculation to account for the scrollbar  int width = w() - scrollbar->w() - X_OFFSET;  int linesPastHeight = 0;  int totalHeight = 0;  for( int i = 0; i < totalLines; i++ )    {      switch( buffer[i].type )	{	case 'S':	  {	    int tw = width, th;	    // set the font and color for system messages	    fl_color( systemColor );	    fl_font( systemFont, FL_NORMAL_SIZE );	    // measure how big the message is	    fl_measure( buffer[i].message, tw, th );	    buffer[i].messageW = tw;	    buffer[i].height = th;	    totalHeight += buffer[i].height;	    if( totalHeight > h() )	      linesPastHeight++;	  }	  break;	case 'R':	  {	    int tw = width, hh, mh;	    // set the font and color for remote handles	    fl_color( remoteHandleColor );	    fl_font( remoteHandleFont, FL_NORMAL_SIZE );	    // measure how big the handle is	    fl_measure( buffer[i].handle, tw, hh );	    buffer[i].handleW = tw;	    // set the font and color for remote messages, and adjust the width so the message	    // is aligned with the end of the handle	    fl_color( remoteMessageColor );	    fl_font( remoteMessageFont, FL_NORMAL_SIZE );	    tw = width - tw;	    // measure how big the message is	    fl_measure( buffer[i].message, tw, mh );	    buffer[i].messageW = tw;	    // increase total height by max of handle height and message height	    buffer[i].height = ( mh > hh ) ? mh : hh;	    totalHeight += buffer[i].height;	    if( totalHeight > h() )	      linesPastHeight++;	  }	  break;	case 'L':	  {	    int tw = width, hh, mh;	    // set the font and color for local handles	    fl_color( localHandleColor );	    fl_font( localHandleFont, FL_NORMAL_SIZE );	    // measure how big the handle is	    fl_measure( buffer[i].handle, tw, hh );	    buffer[i].handleW = tw;	    // set the font and color for local messages, and adjust the width so the message	    // is aligned with the end of the handle	    fl_color( localMessageColor );	    fl_font( localMessageFont, FL_NORMAL_SIZE );	    tw = width - tw;	    // measure how big the message is	    fl_measure( buffer[i].message, tw, mh );	    buffer[i].messageW = tw;	    // increase total height by max of handle height and message height	    buffer[i].height = ( mh > hh ) ? mh : hh;	    totalHeight += buffer[i].height;	    if( totalHeight > h() )	      linesPastHeight++;	  }	  break;	}          }  scrollbar->range( linesPastHeight, 0 );  float size = float(h()) / float(totalHeight);  if( size > 1.0f )    size = 1.0f;  if( size < 0.08f )    size = 0.08f;  scrollbar->slider_size( size );  redraw();}void Flu_Chat_Buffer :: resize( int x, int y, int w, int h ){  Fl_Widget::resize( x, y, w, h );  recomputeFootprint = true;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?