1 /* === S Y N F I G ========================================================= */
3 ** \brief Template File
8 ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
10 ** This package is free software; you can redistribute it and/or
11 ** modify it under the terms of the GNU General Public License as
12 ** published by the Free Software Foundation; either version 2 of
13 ** the License, or (at your option) any later version.
15 ** This package is distributed in the hope that it will be useful,
16 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 ** General Public License for more details.
21 /* ========================================================================= */
23 /* === H E A D E R S ======================================================= */
33 #include <sigc++/hide.h>
35 #include "docks/dockable.h"
36 #include "docks/dockmanager.h"
37 #include "docks/dockbook.h"
38 #include "docks/dockdialog.h"
39 #include <synfig/general.h>
40 #include <gtkmm/table.h>
47 /* === U S I N G =========================================================== */
51 using namespace synfig;
52 using namespace studio;
54 /* === M A C R O S ========================================================= */
59 # define IMAGE_DIR "share\\pixmaps"
64 # define IMAGE_DIR "/usr/local/share/pixmaps"
68 # define IMAGE_EXT "png"
71 /* === G L O B A L S ======================================================= */
73 /* === P R O C E D U R E S ================================================= */
75 /* === M E T H O D S ======================================================= */
77 Dockable::Dockable(const synfig::String& name,const synfig::String& local_name,Gtk::StockID stock_id_):
78 // Gtk::Window(Gtk::WINDOW_TOPLEVEL),
80 local_name_(local_name),
81 // dialog_settings(this,name),
82 title_label_(local_name,Gtk::ALIGN_LEFT),
90 attach_dnd_to(title_label_);
95 Gtk::Table* table(this);
98 title_label_.set_padding(0,0);
99 //title_label_.show();
100 Gtk::EventBox* event_box(manage(new Gtk::EventBox()));
101 event_box->set_border_width(0);
102 event_box->add(title_label_);
103 //table->attach(*event_box, 0, 1, 0,1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
105 header_box_.pack_start(*event_box);
107 attach_dnd_to(*event_box);
109 // event_box->set_events(Gdk::ALL_EVENTS_MASK); //!< \todo change this to only allow what is necessary for DnD
112 Gtk::Button* bttn_close(manage(new Gtk::Button(_("X"))));
113 //table->attach(*bttn_close, 1, 2, 0,1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
114 header_box_.pack_end(*bttn_close,false,false);
116 bttn_close->set_relief(Gtk::RELIEF_NONE);
117 bttn_close->signal_clicked().connect(sigc::mem_fun(*this,&Dockable::detach));
118 bttn_close->set_border_width(0);
119 dynamic_cast<Gtk::Misc*>(bttn_close->get_child())->set_padding(0,0);
122 prev_widget_=manage(new Gtk::Label(" "));
124 //table->attach(header_box_, 0, 1, 0,1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
125 table->attach(*prev_widget_, 0, 1, 1,2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
126 //table->attach(*toolbar_, 0, 1, 2,3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
127 set_toolbar(*manage(new Gtk::Toolbar));
130 prev_widget_->show();
132 set_size_request(175,120);
136 Dockable::~Dockable()
146 Dockable::attach_dnd_to(Gtk::Widget& widget)
148 std::list<Gtk::TargetEntry> listTargets;
149 listTargets.push_back( Gtk::TargetEntry("DOCK") );
151 widget.drag_source_set(listTargets);
152 widget.drag_source_set_icon(get_stock_id());
153 widget.drag_dest_set(listTargets);
156 widget.signal_drag_data_get().connect(sigc::mem_fun(*this,&Dockable::on_drag_data_get));
157 widget.signal_drag_end().connect(sigc::mem_fun(*this,&Dockable::on_drag_end));
158 widget.signal_drag_begin().connect(sigc::mem_fun(*this,&Dockable::on_drag_begin));
159 widget.signal_drag_data_received().connect(sigc::mem_fun(*this,&Dockable::on_drag_data_received));
163 Dockable::on_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& context, int, int, const Gtk::SelectionData& selection_data, guint, guint time)
165 if ((selection_data.get_length() >= 0) && (selection_data.get_format() == 8))
167 Dockable& dockable(**reinterpret_cast<Dockable**>(const_cast<guint8*>(selection_data.get_data())));
169 if(dockable.parent_ != parent_)
170 parent_->add(dockable,parent_->page_num(*this));
172 parent_->reorder_child(dockable,parent_->page_num(*this));
174 context->drag_finish(true, false, time);
178 context->drag_finish(false, false, time);
182 Dockable::on_drag_end(const Glib::RefPtr<Gdk::DragContext>&/*context*/)
192 Dockable::on_drag_begin(const Glib::RefPtr<Gdk::DragContext>&/*context*/)
198 Dockable::on_drag_data_get(const Glib::RefPtr<Gdk::DragContext>&, Gtk::SelectionData& selection_data, guint /*info*/, guint /*time*/)
203 selection_data.set(8, reinterpret_cast<const guchar*>(&tmp), 4);
207 Dockable::set_local_name(const synfig::String& local_name)
209 //set_title(local_name);
210 title_label_.set_text(local_name);
216 //if(!toolbar_->children().empty())
217 // toolbar_->children().clear();
218 set_toolbar(*manage(new Gtk::Toolbar));
223 Dockable::set_toolbar(Gtk::Toolbar& toolbar)
225 if(toolbar_)remove(*toolbar_);
230 attach(*toolbar_, 0, 1, 2,3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
231 gtk_toolbar_set_icon_size(toolbar_->gobj(),GtkIconSize(1)/*GTK_ICON_SIZE_MENU*/);
237 Dockable::clear_previous()
240 prev_widget_delete_connection.disconnect();
245 Dockable::add(Gtk::Widget& x)
249 remove(*prev_widget_);
261 scrolled_=new Gtk::ScrolledWindow;
265 attach(*scrolled_, 0, 1, 1,2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
271 scrolled_->set_shadow_type(Gtk::SHADOW_NONE);
272 scrolled_->set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC);
273 prev_widget_=scrolled_;
277 attach(x, 0, 1, 1,2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
281 prev_widget_delete_connection=prev_widget_->signal_delete_event().connect(
285 &Dockable::clear_previous
292 Dockable::add_button(const Gtk::StockID& stock_id, const synfig::String& tooltip)
295 set_toolbar(*manage(new Gtk::Toolbar));
297 //Gtk::IconSize iconsize(4);
298 //Gtk::IconSize iconsize(Gtk::IconSize::from_name("synfig-small_icon"));
300 Gtk::ToolButton* ret(manage(new Gtk::ToolButton(stock_id)));
301 //Gtk::Image* icon(manage(new Gtk::Image(stock_id,iconsize)));
303 //ret->set_relief(Gtk::RELIEF_HALF);
304 //ret->set_relief(Gtk::RELIEF_NONE);
305 ret->set_label(tooltip);
306 if (toolbar_->get_tooltips_object())
307 toolbar_->get_tooltips_object()->set_tip(*ret,tooltip);
311 toolbar_->set_tooltips(true);
313 toolbar_->append(*ret);
314 //button_box_.pack_start(*ret,false,false);
315 //get_action_area()->pack_start(*ret,false,false);
316 //add_action_widget(*ret,1);
325 parent_->remove(*this);
333 parent_->set_current_page(parent_->page_num(*this));
338 DockDialog* dock_dialog(new DockDialog());
339 dock_dialog->get_dock_book().add(*this);
340 /* //hack: always display composition selector on top of canvas browser
341 if(get_name()=="canvases")
342 dock_dialog->set_composition_selector(true);
344 dock_dialog->present();
349 Dockable::create_tab_label()
351 Gtk::EventBox* event_box(manage(new Gtk::EventBox()));
353 attach_dnd_to(*event_box);
356 Gtk::StockID stock_id(get_stock_id());
359 // Check to make sure the icon is valid
360 if(Gtk::Stock::lookup(stock_id,item))
362 Gtk::Image* icon(manage(new Gtk::Image(stock_id,Gtk::IconSize(4))));
363 event_box->add(*icon);
364 tooltips_.set_tip(*event_box,get_local_name());
369 // Bad icon, try to make a label
371 Glib::ustring text(get_local_name());
373 Gtk::Label* label(manage(new Gtk::Label(text)));
374 event_box->add(*label);