Code

Extensions. Shebangs branch merge.
[inkscape.git] / src / ui / dialog / messages.cpp
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);
60     
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);
70     
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);
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)
108     Messages *dlg = (Messages *)user_data;
110     dlg->message((char *)messageText);
115 void Messages::captureLogMessages()
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");
151 void Messages::releaseLogMessages()
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");
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 :