my log
[synfig.git] / synfig-studio / trunk / src / gtkmm / widget_canvaschooser.cpp
1 /* === S Y N F I G ========================================================= */
2 /*!     \file widget_canvaschooser.cpp
3 **      \brief Template File
4 **
5 **      $Id: widget_canvaschooser.cpp,v 1.1.1.1 2005/01/07 03:34:37 darco Exp $
6 **
7 **      \legal
8 **      Copyright (c) 2002 Robert B. Quattlebaum Jr.
9 **
10 **      This software and associated documentation
11 **      are CONFIDENTIAL and PROPRIETARY property of
12 **      the above-mentioned copyright holder.
13 **
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.
18 **      \endlegal
19 */
20 /* ========================================================================= */
21
22 /* === H E A D E R S ======================================================= */
23
24 #ifdef USING_PCH
25 #       include "pch.h"
26 #else
27 #ifdef HAVE_CONFIG_H
28 #       include <config.h>
29 #endif
30
31 #include "widget_canvaschooser.h"
32 #include <gtkmm/menu.h>
33 #include "app.h"
34
35 #endif
36
37 /* === U S I N G =========================================================== */
38
39 using namespace std;
40 using namespace etl;
41 using namespace synfig;
42 using namespace studio;
43
44 /* === M A C R O S ========================================================= */
45
46 /* === G L O B A L S ======================================================= */
47
48 /* === P R O C E D U R E S ================================================= */
49
50 /* === M E T H O D S ======================================================= */
51
52 Widget_CanvasChooser::Widget_CanvasChooser()
53 {
54 }
55
56 Widget_CanvasChooser::~Widget_CanvasChooser()
57 {
58 }
59
60 void
61 Widget_CanvasChooser::set_parent_canvas(etl::handle<synfig::Canvas> x)
62 {
63         assert(x);
64         parent_canvas=x;
65 }
66
67 void
68 Widget_CanvasChooser::set_value_(etl::handle<synfig::Canvas> data)
69 {
70         set_value(data);
71         activate();
72 }
73
74 void
75 Widget_CanvasChooser::set_value(etl::handle<synfig::Canvas> data)
76 {
77         assert(parent_canvas);
78         canvas=data;
79
80         canvas_menu=manage(new class Gtk::Menu());
81
82         synfig::Canvas::Children::iterator iter;
83         synfig::Canvas::Children &children(parent_canvas->children());
84         String label;
85         
86         if(canvas)
87         {
88                 label=canvas->get_name().empty()?canvas->get_id():canvas->get_name();
89                 canvas_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(label));
90         }
91         
92         for(iter=children.begin();iter!=children.end();iter++)
93                 if(*iter!=canvas)
94                 {
95                         label=(*iter)->get_name().empty()?(*iter)->get_id():(*iter)->get_name();
96                         canvas_menu->items().push_back(
97                                 Gtk::Menu_Helpers::MenuElem(
98                                         label,
99                                         sigc::bind(
100                                                 sigc::mem_fun(
101                                                         *this,
102                                                         &Widget_CanvasChooser::set_value_
103                                                 ),
104                                                 *iter
105                                         )
106                                 )
107                         );
108                 }
109         canvas_menu->items().push_back(
110                 Gtk::Menu_Helpers::MenuElem(
111                         _("Other..."),
112                         sigc::mem_fun(*this,&Widget_CanvasChooser::chooser_menu)
113                 )
114         );
115         set_menu(*canvas_menu);
116
117         if(canvas)
118                 set_history(0);
119 }
120
121 const etl::handle<synfig::Canvas> &
122 Widget_CanvasChooser::get_value()
123 {
124         return canvas;
125 }
126
127 void
128 Widget_CanvasChooser::chooser_menu()
129 {
130         String canvas_name;
131         App::dialog_entry(_("Choose Canvas"),_("Enter the relative name of the canvas that you want"),canvas_name);
132         Canvas::Handle new_canvas;
133         try
134         {
135                 new_canvas=parent_canvas->find_canvas(canvas_name);
136                 set_value_(new_canvas);
137         }
138         catch(std::runtime_error x)
139         {
140                 App::dialog_error_blocking(_("Error:Exception Thrown"),x.what());
141                 set_value_(canvas);             
142         }
143         catch(...)
144         {
145                 App::dialog_error_blocking(_("Error"),_("Unknown Exception"));
146                 set_value_(canvas);
147         }
148 }