my log
[synfig.git] / synfig-studio / trunk / src / synfigapp / instance.cpp
1 /* === S Y N F I G ========================================================= */
2 /*!     \file instance.cpp
3 **      \brief Instance
4 **
5 **      $Id: instance.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 "instance.h"
32 #include "canvasinterface.h"
33 #include <iostream>
34 #include <synfig/loadcanvas.h>
35 #include <synfig/savecanvas.h>
36 #include <synfig/valuenode_composite.h>
37 #include <synfig/valuenode_radialcomposite.h>
38 #include <synfig/valuenode_reference.h>
39 #include <map>
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 synfigapp;
49
50 /* === M A C R O S ========================================================= */
51
52 /* === G L O B A L S ======================================================= */
53
54 static std::map<loose_handle<Canvas>, loose_handle<Instance> > instance_map_;
55
56 /* === P R O C E D U R E S ================================================= */
57
58 bool
59 synfigapp::is_editable(synfig::ValueNode::Handle value_node)
60 {
61         if(ValueNode_Const::Handle::cast_dynamic(value_node)
62                 || ValueNode_TimedSwap::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)const
152 {
153         bool ret=save_canvas(file_name,canvas_);
154         if(ret)
155         {
156                 reset_action_count();
157                 const_cast<sigc::signal<void>& >(signal_saved_)();
158         }
159         return ret;
160 }
161
162 bool
163 Instance::save_as(const std::string &file_name)
164 {
165         bool ret;
166
167         String old_file_name(get_file_name());
168         
169         set_file_name(file_name);
170
171         ret=save_canvas(file_name,canvas_);
172
173         if(ret)
174         {
175                 reset_action_count();
176                 signal_saved_();
177         }
178         else
179         {
180                 set_file_name(old_file_name);
181         }
182
183         signal_filename_changed_();
184
185         return ret;
186 }