mp3splt-gtk
messages.c
Go to the documentation of this file.
00001 /**********************************************************
00002  *
00003  * mp3splt-gtk -- utility based on mp3splt,
00004  *                for mp3/ogg splitting without decoding
00005  *
00006  * Copyright: (C) 2005-2011 Alexandru Munteanu
00007  * Contact: io_fx@yahoo.fr
00008  *
00009  * http://mp3splt.sourceforge.net/
00010  *
00011  *********************************************************/
00012 
00013 /**********************************************************
00014  *
00015  * This program is free software; you can redistribute it and/or
00016  * modify it under the terms of the GNU General Public License
00017  * as published by the Free Software Foundation; either version 2
00018  * of the License, or (at your option) any later version.
00019  *
00020  * This program is distributed in the hope that it will be useful,
00021  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00022  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023  * GNU General Public License for more details.
00024  *
00025  * You should have received a copy of the GNU General Public License
00026  * along with this program; if not, write to the Free Software
00027  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
00028  * USA.
00029  *
00030  *********************************************************/
00031 
00032 /*!********************************************************
00033  * \file 
00034  * The messages history dialog
00035  *********************************************************/
00036 
00037 #include <gtk/gtk.h>
00038 #include <glib/gi18n.h>
00039 
00040 #include <libmp3splt/mp3splt.h>
00041 
00042 #include "main_win.h"
00043 
00044 GtkWidget *mess_history_dialog = NULL;
00045 GtkTextBuffer *mess_hist_buffer = NULL;
00046 GtkTextTagTable *mess_hist_tag_table = NULL;
00047 GtkWidget *mess_hist_view = NULL;
00048 gint debug_is_active = FALSE;
00049 
00050 void create_mess_history_dialog();
00051 
00052 extern splt_state *the_state;
00053 
00055 const char *get_current_time()
00056 {
00057   time_t cur_time = { 0 };
00058   static char time_str[128] = { '\0' };
00059   cur_time = time(NULL);
00060   const struct tm *tm = localtime(&cur_time);
00061   strftime(time_str, sizeof(time_str), "(%H:%M:%S) ", tm);
00062 
00063   return time_str;
00064 }
00065 
00067 void put_message_in_history(const gchar *message, splt_message_type mess_type)
00068 {
00069   if (mess_type == SPLT_MESSAGE_INFO ||
00070       (mess_type == SPLT_MESSAGE_DEBUG && debug_is_active))
00071   {
00072     GtkTextTag *gray_tag =
00073       gtk_text_tag_table_lookup(mess_hist_tag_table, "gray_bold");
00074 
00075     GtkTextIter iter;
00076     const char *current_time = get_current_time();
00077     gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(mess_hist_buffer), &iter);
00078     gtk_text_buffer_insert_with_tags(GTK_TEXT_BUFFER(mess_hist_buffer),
00079         &iter, current_time, -1, gray_tag, NULL);
00080 
00081     gtk_text_buffer_insert(GTK_TEXT_BUFFER(mess_hist_buffer), &iter,
00082         message, -1);
00083     gtk_text_buffer_insert(GTK_TEXT_BUFFER(mess_hist_buffer), &iter,
00084         "\n", -1);
00085 
00086     gtk_text_iter_set_line_offset(&iter, 0);
00087     GtkTextMark *mark = gtk_text_buffer_get_mark(mess_hist_buffer, "end");
00088     gtk_text_buffer_move_mark(mess_hist_buffer, mark, &iter);
00089     gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(mess_hist_view), mark);
00090   }
00091 }
00092 
00094 void mess_history_hide(GtkDialog *dialog, gint response_id, gpointer data)
00095 {
00096   gtk_widget_hide(mess_history_dialog);
00097 }
00098 
00105 void mess_history_hide2(GtkWidget *widget, gpointer data)
00106 {
00107   mess_history_hide(NULL, 0, NULL);
00108   //TODO: ugly HACK!
00109   create_mess_history_dialog();
00110 }
00111 
00113 void add_mess_hist_tags()
00114 {
00115   GtkTextTag *tag = gtk_text_tag_new("gray_bold");
00116 
00117   GValue fg_val = { 0 };
00118   g_value_init(&fg_val, G_TYPE_STRING);
00119   g_value_set_static_string(&fg_val, "gray");
00120   g_object_set_property(G_OBJECT(tag), "foreground", &fg_val);
00121 
00122   gtk_text_tag_table_add(mess_hist_tag_table, tag);
00123 }
00124 
00126 void debug_check_event(GtkToggleButton *debug_toggle, gpointer user_data)
00127 {
00128   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(debug_toggle)))
00129   {
00130     debug_is_active = TRUE;
00131   }
00132   else
00133   {
00134     debug_is_active = FALSE;
00135   }
00136 }
00137 
00139 void clear_messages_event(GtkWidget *widget, gpointer data)
00140 {
00141   GtkTextIter start_iter;
00142   GtkTextIter end_iter;
00143   gtk_text_buffer_get_start_iter(mess_hist_buffer, &start_iter);
00144   gtk_text_buffer_get_end_iter(mess_hist_buffer, &end_iter);
00145   gtk_text_buffer_delete(mess_hist_buffer, &start_iter, &end_iter);
00146 }
00147 
00149 GtkWidget *create_text_component()
00150 {
00151   GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
00152 
00153   //text view
00154   mess_hist_tag_table = gtk_text_tag_table_new();
00155   add_mess_hist_tags();
00156 
00157   mess_hist_buffer = gtk_text_buffer_new(mess_hist_tag_table);
00158   GtkTextIter iter;
00159   gtk_text_buffer_get_end_iter(mess_hist_buffer, &iter);
00160   gtk_text_buffer_create_mark(mess_hist_buffer, "end", &iter, TRUE);
00161   mess_hist_view = gtk_text_view_new_with_buffer(mess_hist_buffer);
00162 
00163   gtk_text_view_set_editable(GTK_TEXT_VIEW(mess_hist_view), FALSE);
00164   gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(mess_hist_view), FALSE);
00165   gtk_text_view_set_left_margin(GTK_TEXT_VIEW(mess_hist_view), 5);
00166 
00167   GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
00168   gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_NONE);
00169   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
00170       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
00171 
00172   gtk_container_add(GTK_CONTAINER(scrolled_window), mess_hist_view);
00173 
00174   //top
00175   GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
00176   gtk_container_set_border_width(GTK_CONTAINER(hbox), 3);
00177 
00178   //debug option
00179   GtkWidget *debug_check_button =
00180     gtk_check_button_new_with_mnemonic(_("Show _debug messages"));
00181   g_signal_connect(G_OBJECT(debug_check_button), "toggled",
00182       G_CALLBACK(debug_check_event), NULL);
00183   gtk_box_pack_start(GTK_BOX(hbox), debug_check_button, FALSE, FALSE, 0);
00184 
00185   //clear button
00186   GtkWidget *clear_button =
00187     create_cool_button(GTK_STOCK_CLEAR, _("C_lear"), FALSE);
00188   g_signal_connect(G_OBJECT(clear_button), "clicked",
00189       G_CALLBACK(clear_messages_event), NULL);
00190   gtk_box_pack_end(GTK_BOX(hbox), clear_button, FALSE, FALSE, 0);
00191 
00192   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
00193   gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 3);
00194   
00195   return vbox;
00196 }
00197 
00199 void create_mess_history_dialog()
00200 {
00201   mess_history_dialog = gtk_dialog_new_with_buttons(_("Messages history"), NULL,
00202       GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL);
00203 
00204   gtk_window_set_default_size(GTK_WINDOW(mess_history_dialog), 550, 300);
00205 
00206   g_signal_connect_swapped(mess_history_dialog, "response",
00207     G_CALLBACK(mess_history_hide), NULL);
00208   g_signal_connect(G_OBJECT(mess_history_dialog), "delete_event",
00209       G_CALLBACK(mess_history_hide2), NULL);
00210 
00211   gtk_window_set_position(GTK_WINDOW(mess_history_dialog), GTK_WIN_POS_CENTER);
00212 
00213   GtkWidget *text_component = create_text_component();
00214   GtkWidget *area = gtk_dialog_get_content_area(GTK_DIALOG(mess_history_dialog));
00215   gtk_box_pack_start(GTK_BOX(area), text_component, TRUE, TRUE, 0);
00216 }
00217