31f9cc51e7f879bb4347d534b2fdd6bd70ff183c
1 /** @file
2 * @brief Messages dialog - implementation
3 */
4 /* Authors:
5 * Bob Jamison
6 * Other dudes from The Inkscape Organization
7 *
8 * Copyright (C) 2004, 2005 Authors
9 *
10 * Released under GNU GPL, read the file 'COPYING' for more information
11 */
12 #ifdef HAVE_CONFIG_H
13 # include <config.h>
14 #endif
16 #include "messages.h"
19 #include "verbs.h"
21 namespace Inkscape {
22 namespace UI {
23 namespace Dialog {
26 //#########################################################################
27 //## E V E N T S
28 //#########################################################################
30 /**
31 * Also a public method. Remove all text from the dialog
32 */
33 void Messages::clear()
34 {
35 Glib::RefPtr<Gtk::TextBuffer> buffer = messageText.get_buffer();
36 buffer->erase(buffer->begin(), buffer->end());
37 }
40 //#########################################################################
41 //## C O N S T R U C T O R / D E S T R U C T O R
42 //#########################################################################
43 /**
44 * Constructor
45 */
46 Messages::Messages()
47 : UI::Widget::Panel("", "/dialogs/messages", SP_VERB_DIALOG_DEBUG)
48 {
49 Gtk::Box *contents = _getContents();
51 //## Add a menu for clear()
52 menuBar.items().push_back( Gtk::Menu_Helpers::MenuElem(_("_File"), fileMenu) );
53 fileMenu.items().push_back( Gtk::Menu_Helpers::MenuElem(_("_Clear"),
54 sigc::mem_fun(*this, &Messages::clear) ) );
55 fileMenu.items().push_back( Gtk::Menu_Helpers::MenuElem(_("Capture log messages"),
56 sigc::mem_fun(*this, &Messages::captureLogMessages) ) );
57 fileMenu.items().push_back( Gtk::Menu_Helpers::MenuElem(_("Release log messages"),
58 sigc::mem_fun(*this, &Messages::releaseLogMessages) ) );
59 contents->pack_start(menuBar, Gtk::PACK_SHRINK);
62 //### Set up the text widget
63 messageText.set_editable(false);
64 textScroll.add(messageText);
65 textScroll.set_policy(Gtk::POLICY_ALWAYS, Gtk::POLICY_ALWAYS);
66 contents->pack_start(textScroll);
68 // sick of this thing shrinking too much
69 set_size_request(400, 300);
71 show_all_children();
73 message(_("Ready."));
74 message(_("Enable log display by setting dialogs.debug 'redirect' attribute to 1 in preferences.xml"));
76 handlerDefault = 0;
77 handlerGlibmm = 0;
78 handlerAtkmm = 0;
79 handlerPangomm = 0;
80 handlerGdkmm = 0;
81 handlerGtkmm = 0;
82 }
84 Messages::~Messages()
85 {
86 }
89 //#########################################################################
90 //## M E T H O D S
91 //#########################################################################
93 void Messages::message(char *msg)
94 {
95 Glib::RefPtr<Gtk::TextBuffer> buffer = messageText.get_buffer();
96 Glib::ustring uMsg = msg;
97 if (uMsg[uMsg.length()-1] != '\n')
98 uMsg += '\n';
99 buffer->insert (buffer->end(), uMsg);
100 }
102 // dialogLoggingCallback is already used in debug.cpp
103 static void dialogLoggingCallback(const gchar */*log_domain*/,
104 GLogLevelFlags /*log_level*/,
105 const gchar *messageText,
106 gpointer user_data)
107 {
108 Messages *dlg = (Messages *)user_data;
110 dlg->message((char *)messageText);
112 }
115 void Messages::captureLogMessages()
116 {
117 /*
118 This might likely need more code, to capture Gtkmm
119 and Glibmm warnings, or maybe just simply grab stdout/stderr
120 */
121 GLogLevelFlags flags = (GLogLevelFlags) (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL |
122 G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE |
123 G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG);
124 if ( !handlerDefault ) {
125 handlerDefault = g_log_set_handler(NULL, flags,
126 dialogLoggingCallback, (gpointer)this);
127 }
128 if ( !handlerGlibmm ) {
129 handlerGlibmm = g_log_set_handler("glibmm", flags,
130 dialogLoggingCallback, (gpointer)this);
131 }
132 if ( !handlerAtkmm ) {
133 handlerAtkmm = g_log_set_handler("atkmm", flags,
134 dialogLoggingCallback, (gpointer)this);
135 }
136 if ( !handlerPangomm ) {
137 handlerPangomm = g_log_set_handler("pangomm", flags,
138 dialogLoggingCallback, (gpointer)this);
139 }
140 if ( !handlerGdkmm ) {
141 handlerGdkmm = g_log_set_handler("gdkmm", flags,
142 dialogLoggingCallback, (gpointer)this);
143 }
144 if ( !handlerGtkmm ) {
145 handlerGtkmm = g_log_set_handler("gtkmm", flags,
146 dialogLoggingCallback, (gpointer)this);
147 }
148 message((char*)"log capture started");
149 }
151 void Messages::releaseLogMessages()
152 {
153 if ( handlerDefault ) {
154 g_log_remove_handler(NULL, handlerDefault);
155 handlerDefault = 0;
156 }
157 if ( handlerGlibmm ) {
158 g_log_remove_handler("glibmm", handlerGlibmm);
159 handlerGlibmm = 0;
160 }
161 if ( handlerAtkmm ) {
162 g_log_remove_handler("atkmm", handlerAtkmm);
163 handlerAtkmm = 0;
164 }
165 if ( handlerPangomm ) {
166 g_log_remove_handler("pangomm", handlerPangomm);
167 handlerPangomm = 0;
168 }
169 if ( handlerGdkmm ) {
170 g_log_remove_handler("gdkmm", handlerGdkmm);
171 handlerGdkmm = 0;
172 }
173 if ( handlerGtkmm ) {
174 g_log_remove_handler("gtkmm", handlerGtkmm);
175 handlerGtkmm = 0;
176 }
177 message((char*)"log capture discontinued");
178 }
180 } //namespace Dialog
181 } //namespace UI
182 } //namespace Inkscape
184 /*
185 Local Variables:
186 mode:c++
187 c-file-style:"stroustrup"
188 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
189 indent-tabs-mode:nil
190 fill-column:99
191 End:
192 */
193 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :