1 /* === S Y N F I G ========================================================= */
2 /*!	\file widget_canvaschooser.cpp
3 **	\brief Template File
4 **
5 **	$Id$
6 **
7 **	\legal
8 **	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 **	Copyright (c) 2007 Chris Moore
10 **
11 **	This package is free software; you can redistribute it and/or
12 **	modify it under the terms of the GNU General Public License as
13 **	published by the Free Software Foundation; either version 2 of
14 **	the License, or (at your option) any later version.
15 **
16 **	This package is distributed in the hope that it will be useful,
17 **	but WITHOUT ANY WARRANTY; without even the implied warranty of
18 **	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 **	General Public License for more details.
20 **	\endlegal
21 */
22 /* ========================================================================= */
23 
24 /* === H E A D E R S ======================================================= */
25 
26 #ifdef USING_PCH
27 #	include "pch.h"
28 #else
29 #ifdef HAVE_CONFIG_H
30 #	include <config.h>
31 #endif
32 
33 #include <synfig/general.h>
34 
35 #include "widgets/widget_canvaschooser.h"
36 #include <gtkmm/menu.h>
37 #include "app.h"
38 
39 #include <gui/localization.h>
40 
41 #endif
42 
43 /* === U S I N G =========================================================== */
44 
45 using namespace std;
46 using namespace etl;
47 using namespace synfig;
48 using namespace studio;
49 
50 /* === M A C R O S ========================================================= */
51 
52 /* === G L O B A L S ======================================================= */
53 
54 /* === P R O C E D U R E S ================================================= */
55 
56 /* === M E T H O D S ======================================================= */
57 
Widget_CanvasChooser()58 Widget_CanvasChooser::Widget_CanvasChooser():
59 	canvas_menu(NULL)
60 { }
61 
~Widget_CanvasChooser()62 Widget_CanvasChooser::~Widget_CanvasChooser()
63 { }
64 
65 void
set_parent_canvas(synfig::Canvas::Handle x)66 Widget_CanvasChooser::set_parent_canvas(synfig::Canvas::Handle x)
67 {
68 	assert(x);
69 	parent_canvas=x;
70 }
71 
72 void
set_value_(synfig::Canvas::Handle data)73 Widget_CanvasChooser::set_value_(synfig::Canvas::Handle data)
74 {
75 	set_value(data);
76 	activate();
77 }
78 
79 void
on_changed()80 Widget_CanvasChooser::on_changed()
81 {
82 	int i = get_active_row_number();
83 	if (i < 0 || i > (int)canvases.size()) return;
84 
85 	// Check "Other..." item at the end
86 	if (i == (int)canvases.size()) { chooser_menu(); return; }
87 
88 	if (canvas != canvases[i]) set_value_(canvases[i]);
89 }
90 
91 void
set_value(synfig::Canvas::Handle data)92 Widget_CanvasChooser::set_value(synfig::Canvas::Handle data)
93 {
94 	assert(parent_canvas);
95 	canvas=data;
96 
97 	synfig::Canvas::Children::iterator iter;
98 	synfig::Canvas::Children &children(parent_canvas->children());
99 	String label;
100 
101 	set_active(-1);
102 	remove_all();
103 	canvases.clear();
104 
105 	if(canvas)
106 	{
107 		label=canvas->get_name().empty()?canvas->get_id():canvas->get_name();
108 		canvases.push_back(canvas);
109 		append(label);
110 	}
111 
112 	for(iter=children.begin();iter!=children.end();iter++)
113 		if(*iter!=canvas)
114 		{
115 			label=(*iter)->get_name().empty()?(*iter)->get_id():(*iter)->get_name();
116 			canvases.push_back(*iter);
117 			append(label);
118 		}
119 
120 	append(_("Other..."));
121 
122 	if(canvas)
123 		set_active(0);
124 }
125 
126 const etl::handle<synfig::Canvas> &
get_value()127 Widget_CanvasChooser::get_value()
128 {
129 	return canvas;
130 }
131 
132 void
chooser_menu()133 Widget_CanvasChooser::chooser_menu()
134 {
135 	String canvas_name;
136 
137 	if (!App::dialog_entry(_("Choose canvas"),
138 			_("Canvas Name: "),
139 			canvas_name,
140 			_("Cancel"),
141 			_("Choose"))
142 	)
143 	{
144 		// the user hit 'cancel', so set the parameter back to its previous value
145 		set_value_(canvas);
146 		return;
147 	}
148 
149 	if (canvas_name == "")
150 	{
151 		App::dialog_message_1b(
152 				"ERROR",
153 				_("No canvas name was specified"),
154 				"details",
155 				_("Close"));
156 
157 		set_value_(canvas);
158 		return;
159 	}
160 
161 	Canvas::Handle new_canvas;
162 	try
163 	{
164 		String warnings;
165 		new_canvas=parent_canvas->find_canvas(canvas_name, warnings);
166 		set_value_(new_canvas);
167 	}
168 	catch(std::runtime_error x)
169 	{
170 		App::dialog_message_1b(
171 				"ERROR",
172 				String(_("(Exception Thrown) Error selecting canvas:\n\n")) + x.what(),
173 				"details",
174 				_("Close"));
175 
176 		set_value_(canvas);
177 	}
178 	catch(...)
179 	{
180 		App::dialog_message_1b(
181 				"ERROR",
182 				_("Unknown Exception"),
183 				"details",
184 				_("Close"));
185 
186 		set_value_(canvas);
187 	}
188 }
189