1 /* === S I N F G =========================================================== */
2 /*! \file dockdialog.cpp
3 ** \brief Template File
5 ** $Id: dockdialog.cpp,v 1.1.1.1 2005/01/07 03:34:36 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++/adaptors/hide.h>
34 #include "dockdialog.h"
36 #include "dockmanager.h"
37 #include "widget_compselect.h"
38 #include <sinfg/general.h>
39 #include <sinfg/uniqueid.h>
40 #include <gtkmm/table.h>
41 #include <sigc++/hide.h>
42 #include <sigc++/slot.h>
43 #include <sigc++/retype_return.h>
44 #include <sigc++/retype.h>
45 #include "canvasview.h"
46 #include <gtkmm/paned.h>
47 #include <gtkmm/box.h>
48 #include <sinfgapp/main.h>
52 /* === U S I N G =========================================================== */
56 using namespace sinfg;
57 using namespace studio;
59 /* === M A C R O S ========================================================= */
61 #define GRAB_HINT_DATA(y) { \
63 if(sinfgapp::Main::settings().get_value(String("pref.")+y+"_hints",x)) \
65 set_type_hint((Gdk::WindowTypeHint)atoi(x.c_str())); \
69 /* === G L O B A L S ======================================================= */
71 /* === P R O C E D U R E S ================================================= */
73 /* === M E T H O D S ======================================================= */
75 DockDialog::DockDialog():
76 Gtk::Window(Gtk::WINDOW_TOPLEVEL)
78 composition_selector_=false;
84 widget_comp_select=new Widget_CompSelect();
86 // Give ourselves an ID that is most likely unique
87 set_id(sinfg::UniqueID().get_uid()^reinterpret_cast<int>(this));
90 //set_type_hint(Gdk::WINDOW_TYPE_HINT_UTILITY);
91 set_title("Dock Dialog");
92 GRAB_HINT_DATA("dock_dialog");
94 // Register with the dock manager
95 App::dock_manager->dock_dialog_list_.push_back(this);
98 // connect our signals
99 signal_delete_event().connect(
101 sigc::mem_fun(*this,&DockDialog::close)
106 App::signal_canvas_view_focus().connect(
110 &DockDialog::refresh_accel_group
116 add_accel_group(App::ui_manager()->get_accel_group());
117 App::signal_present_all().connect(sigc::mem_fun(*this,&DockDialog::present));
120 DockDialog::~DockDialog()
122 empty_sig.disconnect();
128 // Remove all of the dock books
129 for(;!dock_book_list.empty();dock_book_list.pop_front())
131 dock_book_list.front()->clear();
134 // The following line really should be uncommented,
135 // but it causes crashes. Without it, a small
136 // memory hole is created--but at least it doesn't crash
137 // delete dock_book_list.front();
139 // Oddly enough, the following line should
140 // theoreticly do the same thing after this
141 // class is destroyed, but it doesn't seem to
143 manage(dock_book_list.front());
146 // Remove us from the dock manager
147 if(App::dock_manager)try{
148 std::list<DockDialog*>::iterator iter;
149 for(iter=App::dock_manager->dock_dialog_list_.begin();iter!=App::dock_manager->dock_dialog_list_.end();++iter)
152 App::dock_manager->dock_dialog_list_.erase(iter);
158 sinfg::warning("DockDialog::~DockDialog(): Exception thrown when trying to remove from dock manager...?");
161 delete widget_comp_select;
167 DockDialog::drop_on_prepend(const Glib::RefPtr<Gdk::DragContext>& context, int, int, const Gtk::SelectionData& selection_data, guint, guint time)
169 if ((selection_data.get_length() >= 0) && (selection_data.get_format() == 8))
171 Dockable& dockable(**reinterpret_cast<Dockable**>(const_cast<guint8*>(selection_data.get_data())));
172 prepend_dock_book()->add(dockable);
173 context->drag_finish(true, false, time);
177 context->drag_finish(false, false, time);
181 DockDialog::drop_on_append(const Glib::RefPtr<Gdk::DragContext>& context, int, int, const Gtk::SelectionData& selection_data, guint, guint time)
183 if ((selection_data.get_length() >= 0) && (selection_data.get_format() == 8))
185 Dockable& dockable(**reinterpret_cast<Dockable**>(const_cast<guint8*>(selection_data.get_data())));
186 append_dock_book()->add(dockable);
187 context->drag_finish(true, false, time);
191 context->drag_finish(false, false, time);
196 DockDialog::on_hide()
198 Gtk::Window::on_hide();
203 DockDialog::prepend_dock_book()
205 if(is_deleting)return 0;
207 dock_book_list.push_front(new DockBook);
208 last_dock_book=dock_book_list.front();
211 last_dock_book->signal_empty().connect(
213 sigc::mem_fun(*this,&DockDialog::erase_dock_book),
218 dock_book_sizes_.insert(dock_book_sizes_.begin(),225);
220 return last_dock_book;
224 DockDialog::append_dock_book()
226 if(is_deleting)return 0;
228 dock_book_list.push_back(new DockBook);
229 last_dock_book=dock_book_list.back();
230 last_dock_book->signal_empty().connect(
232 sigc::mem_fun(*this,&DockDialog::erase_dock_book),
236 last_dock_book->signal_changed().connect(
237 sigc::mem_fun(*this,&DockDialog::refresh_title)
239 last_dock_book->signal_changed().connect(
240 sigc::mem_fun(*this,&DockDialog::refresh_title)
242 dock_book_sizes_.push_back(225);
244 //last_dock_book->show();
246 return last_dock_book;
250 DockDialog::erase_dock_book(DockBook* dock_book)
252 if(is_deleting)return;
254 std::list<DockBook*>::iterator iter;
255 for(iter=dock_book_list.begin();iter!=dock_book_list.end();++iter)
258 dock_book_list.erase(iter);
260 if(dock_book_list.empty())
268 if(last_dock_book==dock_book)
269 last_dock_book=dock_book_list.front();
279 DockDialog::refresh()
281 sinfg::info("dock_book_list.size()=%d",dock_book_list.size());
284 if(dock_book_list.empty())
288 box=(manage(is_horizontal?(Gtk::Box*)new Gtk::HBox:(Gtk::Box*)new Gtk::VBox));
291 box->pack_start(*widget_comp_select,false,true);
293 Gtk::Button* append_button(manage(new Gtk::Button));
294 Gtk::Button* prepend_button(manage(new Gtk::Button));
296 std::list<Gtk::TargetEntry> listTargets;
297 listTargets.push_back( Gtk::TargetEntry("DOCK") );
299 append_button->drag_dest_set(listTargets);
300 prepend_button->drag_dest_set(listTargets);
302 append_button->signal_drag_data_received().connect(
303 sigc::mem_fun(*this,&DockDialog::drop_on_append)
306 prepend_button->signal_drag_data_received().connect(
307 sigc::mem_fun(*this,&DockDialog::drop_on_prepend)
310 box->pack_start(*prepend_button,false,true);
311 box->pack_end(*append_button,false,true);
313 //prepend_button->show();
314 //append_button->show();
317 if(dock_book_list.size()==1)
319 box->pack_start(get_dock_book(),true,true);
323 Gtk::Paned* parent(manage(is_horizontal?(Gtk::Paned*)new Gtk::HPaned:(Gtk::Paned*)new Gtk::VPaned));
325 pannels_.push_back(parent);
327 if(pannels_.size()<=dock_book_sizes_.size())
328 pannels_.back()->set_position(dock_book_sizes_[pannels_.size()-1]);
329 pannels_.back()->property_position().signal_changed().connect(
330 sigc::mem_fun(*this,&DockDialog::rebuild_sizes)
333 parent->add1(*dock_book_list.front());
334 //dock_book_list.front()->show();
336 box->pack_start(*parent,true,true);
338 std::list<DockBook*>::iterator iter,next;
339 for(next=dock_book_list.begin(),next++,iter=next++;next!=dock_book_list.end();iter=next++)
341 Gtk::Paned* current(manage(is_horizontal?(Gtk::Paned*)new Gtk::HPaned:(Gtk::Paned*)new Gtk::VPaned));
342 pannels_.push_back(current);
344 if(pannels_.size()<=dock_book_sizes_.size())
345 pannels_.back()->set_position(dock_book_sizes_[pannels_.size()-1]);
346 pannels_.back()->property_position().signal_changed().connect(
347 sigc::mem_fun(*this,&DockDialog::rebuild_sizes)
351 parent->add2(*current);
353 current->add1(**iter);
359 parent->add2(**iter);
364 if(!composition_selector_)
365 widget_comp_select->hide();
370 DockDialog::rebuild_sizes()
373 dock_book_sizes_.clear();
374 for(i=0;i<pannels_.size();i++)
376 dock_book_sizes_.push_back(pannels_[i]->get_position());
381 DockDialog::set_dock_book_sizes(const std::vector<int>& new_sizes)
384 for(i=0;i<pannels_.size() && i<new_sizes.size();i++)
386 pannels_[i]->set_position(new_sizes[i]);
388 dock_book_sizes_=new_sizes;
393 DockDialog::refresh_accel_group()
396 if(last_accel_group_)
398 last_accel_group_->unlock();
399 remove_accel_group(last_accel_group_);
400 last_accel_group_=Glib::RefPtr<Gtk::AccelGroup>();
403 etl::loose_handle<CanvasView> canvas_view(App::get_selected_canvas_view());
406 last_accel_group_=canvas_view->get_accel_group();
407 last_accel_group_->lock();
408 add_accel_group(last_accel_group_);
411 etl::loose_handle<CanvasView> canvas_view(App::get_selected_canvas_view());
414 canvas_view->mainmenu.accelerate(*this);
421 sinfg::info("DockDialog::close(): DELETED!");
422 empty_sig.disconnect();
423 //get_dock_book().clear();
429 DockDialog::get_dock_book()
432 return *append_dock_book();
433 return *last_dock_book;
437 DockDialog::get_dock_book()const
439 return *last_dock_book;
444 DockDialog::get_contents()const
448 std::list<DockBook*>::const_iterator iter;
449 for(iter=dock_book_list.begin();iter!=dock_book_list.end();++iter)
452 ret+=is_horizontal?" | ":" - ";
453 ret+=(*iter)->get_contents();
461 DockDialog::set_contents(const sinfg::String& z)
466 sinfg::String str(z);
469 unsigned int separator=str.find_first_of('-');
471 unsigned int sep2=str.find_first_of('|');
472 if(separator!=sinfg::String::npos || sep2!=sinfg::String::npos)
474 if((separator==sinfg::String::npos || sep2<separator) && sep2!=sinfg::String::npos)
484 sinfg::String book_contents;
485 if(separator==sinfg::String::npos)
492 book_contents=String(str.begin(),str.begin()+separator);
493 str=String(str.begin()+separator+1,str.end());
498 append_dock_book()->set_contents(book_contents);
506 DockDialog::set_composition_selector(bool x)
508 if(x==get_composition_selector())
510 composition_selector_=x;
512 widget_comp_select->show();
514 widget_comp_select->hide();
518 DockDialog::refresh_title()
520 if(is_deleting)return;
521 if(dock_book_list.size())
525 std::list<DockBook*>::const_iterator iter;
526 for(iter=dock_book_list.begin();iter!=dock_book_list.end();++iter)
530 title+=(*iter)->get_local_contents();
535 set_title(_("Empty Dock Dialog"));