fd62d7583f5f6e7bdb87028ad9d89deeb7400ebc
[synfig.git] / synfig-studio / trunk / src / synfigapp / instance.cpp
1 /* === S Y N F I G ========================================================= */
2 /*!     \file synfigapp/instance.cpp
3 **      \brief Instance
4 **
5 **      $Id$
6 **
7 **      \legal
8 **      Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 **
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.
14 **
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.
19 **      \endlegal
20 */
21 /* ========================================================================= */
22
23 /* === H E A D E R S ======================================================= */
24
25 #ifdef USING_PCH
26 #       include "pch.h"
27 #else
28 #ifdef HAVE_CONFIG_H
29 #       include <config.h>
30 #endif
31
32 #include "instance.h"
33 #include "canvasinterface.h"
34 #include <iostream>
35 #include <synfig/loadcanvas.h>
36 #include <synfig/savecanvas.h>
37 #include <synfig/valuenode_composite.h>
38 #include <synfig/valuenode_radialcomposite.h>
39 #include <synfig/valuenode_reference.h>
40 #include <map>
41
42 #endif
43
44 /* === U S I N G =========================================================== */
45
46 using namespace std;
47 using namespace etl;
48 using namespace synfig;
49 using namespace synfigapp;
50
51 /* === M A C R O S ========================================================= */
52
53 /* === G L O B A L S ======================================================= */
54
55 static std::map<loose_handle<Canvas>, loose_handle<Instance> > instance_map_;
56
57 /* === P R O C E D U R E S ================================================= */
58
59 bool
60 synfigapp::is_editable(synfig::ValueNode::Handle value_node)
61 {
62         if(ValueNode_Const::Handle::cast_dynamic(value_node)
63                 || ValueNode_Animated::Handle::cast_dynamic(value_node)
64                 || ValueNode_Composite::Handle::cast_dynamic(value_node)
65                 || ValueNode_RadialComposite::Handle::cast_dynamic(value_node)
66                 || ValueNode_Reference::Handle::cast_dynamic(value_node)
67         )
68                 return true;
69         return false;
70 }
71
72 etl::handle<Instance>
73 synfigapp::find_instance(etl::handle<synfig::Canvas> canvas)
74 {
75         if(instance_map_.count(canvas)==0)
76                 return 0;
77         return instance_map_[canvas];
78 }
79
80 /* === M E T H O D S ======================================================= */
81
82 Instance::Instance(Canvas::Handle canvas):
83         CVSInfo(canvas->get_file_name()),
84         canvas_(canvas)
85 {
86         assert(canvas->is_root());
87
88         unset_selection_manager();
89
90         instance_map_[canvas]=this;
91 } // END of synfigapp::Instance::Instance()
92
93 handle<Instance>
94 Instance::create(Canvas::Handle canvas)
95 {
96         // Construct a new instance
97         handle<Instance> instance(new Instance(canvas));
98
99         return instance;
100 } // END of synfigapp::Instance::create()
101
102 synfig::String
103 Instance::get_file_name()const
104 {
105         return get_canvas()->get_file_name();
106 }
107
108 void
109 Instance::set_file_name(const synfig::String &name)
110 {
111         get_canvas()->set_file_name(name);
112         CVSInfo::set_file_name(name);
113 }
114
115 Instance::~Instance()
116 {
117         instance_map_.erase(canvas_);
118         synfig::info("studio::Instance::~Instance(): Deleted");
119 } // END of studio::Instance::~Instance()
120
121 handle<CanvasInterface>
122 Instance::find_canvas_interface(handle<Canvas> canvas)
123 {
124         if(!canvas)
125                 return 0;
126         while(canvas->is_inline())
127                 canvas=canvas->parent();
128
129         CanvasInterfaceList::iterator iter;
130
131         for(iter=canvas_interface_list().begin();iter!=canvas_interface_list().end();iter++)
132                 if((*iter)->get_canvas()==canvas)
133                         return *iter;
134
135         return CanvasInterface::create(this,canvas);
136 }
137
138 bool
139 Instance::save()const
140 {
141         bool ret=save_canvas(get_file_name(),canvas_);
142         if(ret)
143         {
144                 reset_action_count();
145                 const_cast<sigc::signal<void>& >(signal_saved_)();
146         }
147         return ret;
148 }
149
150 bool
151 Instance::save_as(const std::string &file_name)
152 {
153         bool ret;
154
155         String old_file_name(get_file_name());
156
157         set_file_name(file_name);
158
159         ret=save_canvas(file_name,canvas_);
160
161         if(ret)
162         {
163                 reset_action_count();
164                 signal_saved_();
165         }
166         else
167                 set_file_name(old_file_name);
168
169         signal_filename_changed_();
170
171         return ret;
172 }