gtk_text_win.cc
上传用户:psq1974
上传日期:2007-01-06
资源大小:1195k
文件大小:7k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /* Copyright (C) 1998, 1999 State University of New York at Stony Brook
  2.    Author: Andrew V. Shuvalov ( andrew@ecsl.cs.sunysb.edu )
  3.    Software license is located in file "COPYING"
  4. */
  5. #include  <stdio.h>
  6. #include  <gtk--.h>
  7. #include "movie_item.h"
  8. #include "gtk_text_win.h"
  9. const int TextWindow::topWindowInitSizeX = 600;
  10. const int TextWindow::topWindowInitSizeY = 400;
  11. const int TextWindow::movieTextColumns = 3;
  12. TextWindow::TextWindow( int id, Session &s ) : movieId( id ), session( s )
  13. {
  14.   // make vertical box
  15.   Gtk_VBox *top_vbox_layout = new Gtk_VBox();
  16.   {
  17.     // create menu bar
  18.     menuBar = new Gtk_MenuBar();
  19.     // create menu 'File'
  20.     Gtk_MenuItem *fileMenuRootItem = new Gtk_MenuItem( "File" );
  21.     menuBar->append( *fileMenuRootItem );
  22.     menuBar->show();
  23.     Gtk_Menu     *fileMenu = new Gtk_Menu();
  24.     fileMenuRootItem->set_submenu( *fileMenu );
  25.     fileMenuRootItem->show();
  26.     
  27.     Gtk_MenuItem *searchMenuItem = new Gtk_MenuItem( "Search" );
  28.     fileMenu->append( *searchMenuItem );
  29.     searchMenuItem->show();
  30.     Gtk_MenuItem *closeMenuItem = new Gtk_MenuItem( "Close" );
  31.     fileMenu->append( *closeMenuItem );
  32.     closeMenuItem->show();
  33.     
  34.     // connect entries
  35.     connect_to_method( searchMenuItem->activate, &session, 
  36.        &Session::callback_search );
  37.     connect_to_method( closeMenuItem->activate, &session, 
  38.        &Session::menu_close_text_window, movieId );
  39.     // pack to vbox container
  40.     top_vbox_layout->pack_start( *menuBar, FALSE, FALSE, 0 );
  41.     // handle box
  42.     Gtk_HandleBox *handleBox = new Gtk_HandleBox();
  43.     top_vbox_layout->pack_start( *handleBox, FALSE, FALSE, 0 );
  44.     handleBox->show();
  45.     // toolbar for handle box
  46.     Gtk_Toolbar *toolbar = new Gtk_Toolbar();
  47.     handleBox->add( toolbar );
  48.     toolbar->show();
  49.     // buttons:
  50.     // start button
  51.     try
  52.       {
  53. // if creation of funny buttons fails, try to create simple one
  54. Gtk_Button *bst = 
  55.   new Gtk_ImageTextButton( session.PlayPixmap.c_str(),"");
  56. bst->show();
  57. toolbar->add( bst );
  58. connect_to_method( bst->clicked, this, 
  59.    &TextWindow::callback_play );
  60. // stop button
  61. Gtk_Button *bsto = 
  62.   new Gtk_ImageTextButton( session.StopPixmap.c_str(),"");
  63. bsto->show();
  64. toolbar->add( bsto );
  65. connect_to_method( bsto->clicked, this, 
  66.    &TextWindow::callback_stop );
  67.       }
  68.     catch( BasicException e )
  69.       {
  70. Gtk_Button *bst = 
  71.   new Gtk_Button( "Play" );
  72. bst->show();
  73. toolbar->add( bst );
  74. connect_to_method( bst->clicked, this, 
  75.    &TextWindow::callback_play );
  76. // stop button
  77. Gtk_Button *bsto = 
  78.   new Gtk_Button( "Stop" );
  79. bsto->show();
  80. toolbar->add( bsto );
  81. connect_to_method( bsto->clicked, this, 
  82.    &TextWindow::callback_stop );
  83.       }
  84.     // status bar
  85.     statusBar = new Gtk_Statusbar();
  86.     top_vbox_layout->pack_end( *statusBar, FALSE, FALSE, 0 );
  87.     statusBar->show();
  88.     // text
  89.     static char *col_text[movieTextColumns] = { "", "text", "date" };
  90.     GtkWidget *clist;
  91.     clist = gtk_clist_new_with_titles( movieTextColumns, col_text );
  92.     movieText = new Gtk_CList( GTK_CLIST (clist) );
  93.     movieText->set_usize( topWindowInitSizeX, topWindowInitSizeY );
  94.     //    movieText->set_policy( GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
  95.     movieText->set_column_width( 0, 10 );
  96.     movieText->set_column_width( 1, topWindowInitSizeX *3/4);
  97.     movieText->show();
  98.     // movieText is inside the scrolled window
  99.     Gtk_ScrolledWindow *scrolled_win = new Gtk_ScrolledWindow ();
  100.     scrolled_win->show();
  101.     scrolled_win->set_policy (GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
  102.     scrolled_win->add( *movieText );
  103.     top_vbox_layout->pack_start( *scrolled_win, TRUE, TRUE, 0 );
  104.     // signals
  105.     connect_to_method( movieText->select_row, this, 
  106.        &TextWindow::callback_text_select_row );
  107.     // load the text of the movie
  108.     const TextOfMovieT *text = session.get_movie_text( movieId );
  109.     if( text ) 
  110.       {
  111. char tbl_text[movieTextColumns][100];
  112. const gchar *tbl_texts[movieTextColumns];
  113. for( int i = 0; i < movieTextColumns; i++ )
  114.   tbl_texts[i] = tbl_text[i];
  115. *tbl_text[0] = '';
  116. for( int i = 0; i < text->size(); i++ )
  117.   {
  118.     // insert new row
  119.     string t = (*text)[i].get_text();
  120.     strcpy( tbl_text[1], t.c_str() );
  121.     const struct tm &tim = (*text)[i].get_time();
  122.     sprintf( tbl_text[2], "%2d:%2d:%2d", tim.tm_hour, 
  123.      tim.tm_min, tim.tm_sec );
  124.     int row = movieText->append( tbl_texts );
  125.     movieText->set_row_data( row, (gpointer) (*text)[i].get_time_t() );
  126.   }
  127.       }
  128.     // whatever have we text or not, currentSelectTime should be initiated 
  129.     // as the start time of the movie
  130.     const MovieItem &mi = session.get_movie_by_id( movieId );
  131.     // here const is not violated, arg is not modified
  132.     currentSelectTime = mktime( ( tm * ) &mi.get_start() ); 
  133.   }
  134.   add( top_vbox_layout );
  135.   top_vbox_layout->show();
  136.   // selection only after text is filled - to force the selection 
  137.   // of first row
  138.   movieText->set_selection_mode( GTK_SELECTION_BROWSE );
  139.   movieText->select_row( 0, 0, NULL );
  140.   const MovieItem &mov = session.get_movie_by_id( movieId );
  141.   set_title( mov.get_name().c_str() );
  142.   // set this window user data to id
  143.   set_user_data( (gpointer) id );
  144. }
  145. int TextWindow::close_text_window( GdkEventAny *ev )
  146. {
  147.   return 0;
  148. }
  149. gint TextWindow::delete_event_impl( GdkEventAny * )
  150. {
  151.   destroy();
  152.   session.notify_text_win_die( movieId );
  153.   return 0;
  154. }
  155. TextWindow::~TextWindow()
  156. {
  157.   cout << "text win destructorn";
  158.   //  session.notify_text_win_die( movieId );
  159. }
  160. void TextWindow::select_text_line_by_time( time_t destt )
  161. {
  162.   const TextOfMovieT *text = session.get_movie_text( movieId );
  163.   if( !text ) 
  164.     return;
  165.   // find by time
  166.   int lowbound = 0;
  167.   int highbound = (*text).size();
  168.   int middle = 0;
  169.   while( lowbound < highbound )
  170.     {
  171.       middle = ( lowbound + highbound ) / 2;
  172.       if( lowbound + 1 == highbound )
  173. {
  174.   middle = highbound;
  175.   break;
  176. }
  177.       if( (*text)[middle].get_time_t() == destt )
  178. break;
  179.       if( (*text)[middle].get_time_t() > destt )
  180. highbound = middle;
  181.       else
  182. lowbound = middle;
  183.     }
  184.   // and position selected text to middle
  185.   movieText->moveto( middle, 0, 0.5, 0.0 );
  186.   movieText->cause_select_row( middle, 0 );
  187. }
  188. void TextWindow::select_text_line( unsigned int linenum )
  189. {
  190.   movieText->moveto( linenum, 0, 0.5, 0.0 );
  191.   movieText->cause_select_row( linenum, 0 );
  192. }
  193. //-------------------------- call backs ---------------------------
  194. void TextWindow::callback_text_select_row
  195. ( gint row, gint col, GdkEvent *_button )
  196. {
  197.   GdkEventButton *button = (GdkEventButton *)_button;
  198.   time_t t = (time_t) movieText->get_row_data( row );
  199.   if( t )
  200.     currentSelectTime = t;
  201. }
  202. void TextWindow::callback_play()
  203. {
  204.   // attention: currentSelectTime may not be valid
  205.   struct tm t = *localtime( &currentSelectTime );
  206.   session.playVideo( *this, t, movieId );
  207. }
  208. void TextWindow::callback_stop()
  209. {
  210.   session.stop();
  211. }
  212. // ------------------------------- Gtk_ImageTextButton ----------------------
  213. // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  214. Gtk_ImageTextButton::Gtk_ImageTextButton( const gchar *xpmpath, 
  215.   const char *label )
  216. {
  217.   Gtk_VBox *vbox_layout = new Gtk_VBox();
  218.   vbox_layout->show();
  219.   add( vbox_layout );
  220.   Gtk_Pixmap *pixmapwid = new Gtk_Pixmap( *vbox_layout, xpmpath );
  221.   pixmapwid->show();
  222.   vbox_layout->pack_start( *pixmapwid, FALSE, FALSE, 0 );
  223.   Gtk_Label *labelwid;
  224.   if( strlen( label ) )
  225.     {
  226.       labelwid = new Gtk_Label( label );
  227.       labelwid->show();
  228.       vbox_layout->pack_start( *labelwid, FALSE, FALSE, 0 );
  229.     }
  230. }