1 /* === S I N F G =========================================================== */
3 ** \brief Template File
5 ** $Id: dockable.cpp,v 1.2 2005/01/12 07:24:45 darco Exp $
8 ** Copyright (c) 2002 Robert B. Quattlebaum Jr.
10 ** This software and associated documentation
11 ** are CONFIDENTIAL and PROPRIETARY property of
12 ** the above-mentioned copyright holder.
14 ** You may not copy, print, publish, or in any
15 ** other way distribute this software without
16 ** a prior written agreement with
17 ** the copyright holder.
20 /* ========================================================================= */
22 /* === H E A D E R S ======================================================= */
32 #include <sigc++/hide.h>
35 #include "dockmanager.h"
37 #include "dockdialog.h"
38 #include <sinfg/general.h>
39 #include <gtkmm/table.h>
44 /* === U S I N G =========================================================== */
48 using namespace sinfg;
49 using namespace studio;
51 /* === M A C R O S ========================================================= */
56 # define IMAGE_DIR "share\\pixmaps"
61 # define IMAGE_DIR "/usr/local/share/pixmaps"
65 # define IMAGE_EXT "png"
68 /* === G L O B A L S ======================================================= */
70 /* === P R O C E D U R E S ================================================= */
72 /* === M E T H O D S ======================================================= */
74 Dockable::Dockable(const sinfg::String& name,const sinfg::String& local_name,Gtk::StockID stock_id_):
75 // Gtk::Window(Gtk::WINDOW_TOPLEVEL),
77 local_name_(local_name),
78 // dialog_settings(this,name),
79 title_label_(local_name,Gtk::ALIGN_LEFT),
87 //set_title(local_name);
88 //set_type_hint(Gdk::WINDOW_TYPE_HINT_UTILITY);
93 attach_dnd_to(title_label_);
95 //scrolled_.set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC);
97 //scrolled_.set_shadow_type(Gtk::SHADOW_NONE);
100 //button_box_.show();
102 Gtk::Table* table(this);
105 title_label_.set_padding(0,0);
106 Gtk::EventBox* event_box(manage(new Gtk::EventBox()));
107 event_box->set_border_width(0);
108 event_box->add(title_label_);
109 //table->attach(*event_box, 0, 1, 0,1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
111 header_box_.pack_start(*event_box);
113 attach_dnd_to(*event_box);
115 // event_box->set_events(Gdk::ALL_EVENTS_MASK); //!< \todo change this to only allow what is necessary for DnD
118 Gtk::Button* bttn_close(manage(new Gtk::Button("X")));
119 //table->attach(*bttn_close, 1, 2, 0,1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
120 header_box_.pack_end(*bttn_close,false,false);
122 bttn_close->set_relief(Gtk::RELIEF_NONE);
123 bttn_close->signal_clicked().connect(sigc::mem_fun(*this,&Dockable::detach));
124 bttn_close->set_border_width(0);
125 dynamic_cast<Gtk::Misc*>(bttn_close->get_child())->set_padding(0,0);
128 prev_widget_=manage(new Gtk::Label(" "));
130 //table->attach(header_box_, 0, 1, 0,1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
131 table->attach(*prev_widget_, 0, 1, 1,2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
132 //table->attach(*toolbar_, 0, 1, 2,3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
133 set_toolbar(*manage(new Gtk::Toolbar));
136 prev_widget_->show();
138 set_size_request(175,120);
139 //scrolled_.set_shadow_type(Gtk::SHADOW_NONE);
143 Dockable::~Dockable()
151 /*if(App::dock_manager)try{
152 App::dock_manager->unregister_dockable(*this);
153 std::list<Dockable*>::iterator iter;
154 for(iter=App::dock_manager->dockable_list_.begin();iter!=App::dock_manager->dockable_list_.end();++iter)
157 App::dock_manager->dockable_list_.erase(iter);
162 //if(App::dock_manager)
163 // App::dock_manager->dockable_list_.erase(this);
167 Dockable::attach_dnd_to(Gtk::Widget& widget)
169 std::list<Gtk::TargetEntry> listTargets;
170 listTargets.push_back( Gtk::TargetEntry("DOCK") );
172 widget.drag_source_set(listTargets);
173 widget.drag_source_set_icon(get_stock_id());
174 widget.drag_dest_set(listTargets);
177 widget.signal_drag_data_get().connect(sigc::mem_fun(*this,&Dockable::on_drag_data_get));
178 widget.signal_drag_end().connect(sigc::mem_fun(*this,&Dockable::on_drag_end));
179 widget.signal_drag_begin().connect(sigc::mem_fun(*this,&Dockable::on_drag_begin));
180 widget.signal_drag_data_received().connect(sigc::mem_fun(*this,&Dockable::on_drag_data_received));
184 Dockable::on_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& context, int, int, const Gtk::SelectionData& selection_data, guint, guint time)
186 if ((selection_data.get_length() >= 0) && (selection_data.get_format() == 8))
188 Dockable& dockable(**reinterpret_cast<Dockable**>(const_cast<guint8*>(selection_data.get_data())));
190 if(dockable.parent_ != parent_)
191 parent_->add(dockable,parent_->page_num(*this));
193 parent_->reorder_child(dockable,parent_->page_num(*this));
195 context->drag_finish(true, false, time);
199 context->drag_finish(false, false, time);
203 Dockable::on_drag_end(const Glib::RefPtr<Gdk::DragContext>&context)
213 Dockable::on_drag_begin(const Glib::RefPtr<Gdk::DragContext>&context)
219 Dockable::on_drag_data_get(const Glib::RefPtr<Gdk::DragContext>&, Gtk::SelectionData& selection_data, guint info, guint time)
224 selection_data.set(8, reinterpret_cast<const guchar*>(&tmp), 4);
228 Dockable::set_local_name(const sinfg::String& local_name)
230 //set_title(local_name);
231 title_label_.set_text(local_name);
237 //if(!toolbar_->children().empty())
238 // toolbar_->children().clear();
239 set_toolbar(*manage(new Gtk::Toolbar));
244 Dockable::set_toolbar(Gtk::Toolbar& toolbar)
246 if(toolbar_)remove(*toolbar_);
251 attach(*toolbar_, 0, 1, 2,3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
252 gtk_toolbar_set_icon_size(toolbar_->gobj(),GtkIconSize(1)/*GTK_ICON_SIZE_MENU*/);
258 Dockable::clear_previous()
261 prev_widget_delete_connection.disconnect();
266 Dockable::add(Gtk::Widget& x)
270 remove(*prev_widget_);
283 scrolled_=new Gtk::ScrolledWindow;
287 attach(*scrolled_, 0, 1, 1,2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
293 scrolled_->set_shadow_type(Gtk::SHADOW_NONE);
294 scrolled_->set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC);
295 prev_widget_=scrolled_;
299 attach(x, 0, 1, 1,2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
303 prev_widget_delete_connection=prev_widget_->signal_delete_event().connect(
307 &Dockable::clear_previous
314 Dockable::add_button(const Gtk::StockID& stock_id, const sinfg::String& tooltip)
317 set_toolbar(*manage(new Gtk::Toolbar));
319 //Gtk::IconSize iconsize(4);
320 //Gtk::IconSize iconsize(Gtk::IconSize::from_name("sinfg-small_icon"));
322 Gtk::ToolButton* ret(manage(new Gtk::ToolButton(stock_id)));
323 //Gtk::Image* icon(manage(new Gtk::Image(stock_id,iconsize)));
325 //ret->set_relief(Gtk::RELIEF_HALF);
326 //ret->set_relief(Gtk::RELIEF_NONE);
327 ret->set_label(tooltip);
328 //toolbar_->get_tooltips_object()->set_tip(*ret,tooltip);
332 toolbar_->set_tooltips(true);
334 toolbar_->append(*ret);
335 //button_box_.pack_start(*ret,false,false);
336 //get_action_area()->pack_start(*ret,false,false);
337 //add_action_widget(*ret,1);
346 parent_->remove(*this);
354 parent_->set_current_page(parent_->page_num(*this));
359 DockDialog* dock_dialog(new DockDialog());
360 dock_dialog->get_dock_book().add(*this);
361 //if(get_name()=="canvases")
362 // dock_dialog->set_composition_selector(true);
363 dock_dialog->present();
368 Dockable::create_tab_label()
370 Gtk::EventBox* event_box(manage(new Gtk::EventBox()));
372 attach_dnd_to(*event_box);
375 Gtk::StockID stock_id(get_stock_id());
378 // Check to make sure the icon is valid
379 if(Gtk::Stock::lookup(stock_id,item))
381 Gtk::Image* icon(manage(new Gtk::Image(stock_id,Gtk::IconSize(4))));
382 event_box->add(*icon);
383 tooltips_.set_tip(*event_box,get_local_name());
388 // Bad icon, try to make a label
390 Glib::ustring text(get_local_name());
392 Gtk::Label* label(manage(new Gtk::Label(text)));
393 event_box->add(*label);