1 /** \file
2 *
3 * Authors:
4 * bulia byak <buliabyak@users.sf.net>
5 * Bryce W. Harrington <bryce@bryceharrington.org>
6 * Lauris Kaplinski <lauris@kaplinski.com>
7 * Jon Phillips <jon@rejon.org>
8 * Ralf Stephan <ralf@ark.in-berlin.de> (Gtkmm)
9 *
10 * Copyright (C) 2000 - 2005 Authors
11 *
12 * Released under GNU GPL. Read the file 'COPYING' for more information
13 */
15 #ifdef HAVE_CONFIG_H
16 # include <config.h>
17 #endif
19 #include <gtkmm/scrolledwindow.h>
20 #include <gtkmm/entry.h>
22 #include "inkscape.h"
23 #include "rdf.h"
24 #include "ui/widget/registry.h"
26 #include "entity-entry.h"
28 namespace Inkscape {
29 namespace UI {
30 namespace Widget {
32 //===================================================
34 //---------------------------------------------------
36 EntityEntry*
37 EntityEntry::create (rdf_work_entity_t* ent, Gtk::Tooltips& tt, Registry& wr)
38 {
39 g_assert (ent);
40 EntityEntry* obj = 0;
41 switch (ent->format)
42 {
43 case RDF_FORMAT_LINE:
44 obj = new EntityLineEntry (ent, tt, wr);
45 break;
46 case RDF_FORMAT_MULTILINE:
47 obj = new EntityMultiLineEntry (ent, tt, wr);
48 break;
49 default:
50 g_warning ("An unknown RDF format was requested.");
51 }
53 g_assert (obj);
54 obj->_label.show();
55 return obj;
56 }
58 EntityEntry::EntityEntry (rdf_work_entity_t* ent, Gtk::Tooltips& tt, Registry& wr)
59 : _label(Glib::ustring(_(ent->title))+":", 1.0, 0.5), _packable(0),
60 _entity(ent), _tt(&tt), _wr(&wr)
61 {
62 }
64 EntityEntry::~EntityEntry()
65 {
66 _changed_connection.disconnect();
67 }
69 EntityLineEntry::EntityLineEntry (rdf_work_entity_t* ent, Gtk::Tooltips& tt, Registry& wr)
70 : EntityEntry (ent, tt, wr)
71 {
72 Gtk::Entry *e = new Gtk::Entry;
73 tt.set_tip (*e, _(ent->tip));
74 _packable = e;
75 _changed_connection = e->signal_changed().connect (sigc::mem_fun (*this, &EntityLineEntry::on_changed));
76 }
78 EntityLineEntry::~EntityLineEntry()
79 {
80 delete static_cast<Gtk::Entry*>(_packable);
81 }
83 void
84 EntityLineEntry::update (SPDocument *doc)
85 {
86 const char *text = rdf_get_work_entity (doc, _entity);
87 static_cast<Gtk::Entry*>(_packable)->set_text (text ? text : "");
88 }
90 void
91 EntityLineEntry::on_changed()
92 {
93 if (_wr->isUpdating()) return;
95 _wr->setUpdating (true);
96 SPDocument *doc = SP_ACTIVE_DOCUMENT;
97 Glib::ustring text = static_cast<Gtk::Entry*>(_packable)->get_text();
98 if (rdf_set_work_entity (doc, _entity, text.c_str()))
99 sp_document_done (doc, SP_VERB_NONE,
100 /* TODO: annotate */ "entity-entry.cpp:101");
101 _wr->setUpdating (false);
102 }
104 EntityMultiLineEntry::EntityMultiLineEntry (rdf_work_entity_t* ent, Gtk::Tooltips& tt, Registry& wr)
105 : EntityEntry (ent, tt, wr)
106 {
107 Gtk::ScrolledWindow *s = new Gtk::ScrolledWindow;
108 s->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
109 s->set_shadow_type (Gtk::SHADOW_IN);
110 _packable = s;
111 _v.set_size_request (-1, 5);
112 _v.set_wrap_mode (Gtk::WRAP_WORD);
113 _v.set_accepts_tab (false);
114 s->add (_v);
115 tt.set_tip (_v, _(ent->tip));
116 _changed_connection = _v.get_buffer()->signal_changed().connect (sigc::mem_fun (*this, &EntityMultiLineEntry::on_changed));
117 }
119 EntityMultiLineEntry::~EntityMultiLineEntry()
120 {
121 delete static_cast<Gtk::ScrolledWindow*>(_packable);
122 }
124 void
125 EntityMultiLineEntry::update (SPDocument *doc)
126 {
127 const char *text = rdf_get_work_entity (doc, _entity);
128 Gtk::ScrolledWindow *s = static_cast<Gtk::ScrolledWindow*>(_packable);
129 Gtk::TextView *tv = static_cast<Gtk::TextView*>(s->get_child());
130 tv->get_buffer()->set_text (text ? text : "");
131 }
133 void
134 EntityMultiLineEntry::on_changed()
135 {
136 if (_wr->isUpdating()) return;
138 _wr->setUpdating (true);
139 SPDocument *doc = SP_ACTIVE_DOCUMENT;
140 Gtk::ScrolledWindow *s = static_cast<Gtk::ScrolledWindow*>(_packable);
141 Gtk::TextView *tv = static_cast<Gtk::TextView*>(s->get_child());
142 Glib::ustring text = tv->get_buffer()->get_text();
143 if (rdf_set_work_entity (doc, _entity, text.c_str()))
144 sp_document_done (doc, SP_VERB_NONE,
145 /* TODO: annotate */ "entity-entry.cpp:146");
146 _wr->setUpdating (false);
147 }
149 } // namespace Dialog
150 } // namespace UI
151 } // namespace Inkscape
153 /*
154 Local Variables:
155 mode:c++
156 c-file-style:"stroustrup"
157 c-file-offsets:((innamespace . 0)(inline-open . 0))
158 indent-tabs-mode:nil
159 fill-column:99
160 End:
161 */
162 // vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :