+
+
+void Container::MoveSelectedContentsTo(Container * newContainer)
+{
+ // Sanity check
+ if (newContainer == NULL)
+ return;
+
+ // Shuffle the contents of this container to the new one
+ for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end();)
+ {
+ if ((*i)->state != OSSelected)
+ {
+ i++;
+ continue;
+ }
+
+ newContainer->Add(*i);
+ (*i)->Reparent(newContainer);
+ objects.erase(i);
+ }
+}
+
+
+void Container::CopySelectedContentsTo(Container * newContainer)
+{
+ // Sanity check
+ if (newContainer == NULL)
+ return;
+
+ // Copy the contents of this container to the new one
+ for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+ {
+ if ((*i)->state == OSSelected)
+ newContainer->Add((*i)->Copy());
+ }
+}
+
+
+void Container::ResizeAllDimensions(double newSize)
+{
+ for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+ {
+ if ((*i)->type == OTDimension)
+ ((Dimension *)(*i))->size = newSize;
+ if ((*i)->type == OTContainer)
+ ((Container *)(*i))->ResizeAllDimensions(newSize);
+ }
+}
+
+
+/*virtual*/ void Container::Enumerate(FILE * file)
+{
+ // Only put "CONTAINER" markers if *not* the top level container
+// if (parent != NULL)
+ if (!isTopLevelContainer)
+ fprintf(file, "CONTAINER %i\n", layer);
+
+ for(uint i=0; i<objects.size(); i++)
+ objects[i]->Enumerate(file);
+
+// if (parent != NULL)
+ if (!isTopLevelContainer)
+ fprintf(file, "ENDCONTAINER\n");
+}
+
+
+/*virtual*/ Object * Container::Copy(void)
+{
+#warning "!!! This doesn't take care of attached Dimensions !!!"
+/*
+This is a real problem. While having a pointer in the Dimension to this line's points
+is fast & easy, it creates a huge problem when trying to replicate an object like this.
+
+Maybe a way to fix that then, is to have reference numbers instead of pointers. That
+way, if you copy them, ... you might still have problems. Because you can't be sure if
+a copy will be persistant or not, you then *definitely* do not want them to have the
+same reference number.
+*/
+ Container * c = new Container(position, parent);
+ *c = *this;
+ return c;
+}
+
+
+/*virtual*/ void Container::Rotate(Point point, double angle)
+{
+ for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+ (*i)->Rotate(point, angle);
+}
+
+
+/*virtual*/ void Container::RotateSelected(Point point, double angle)
+{
+ for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+ {
+ if ((*i)->state == OSSelected)
+ (*i)->Rotate(point, angle);
+ }
+}
+
+
+/*virtual*/ void Container::Mirror(Point p1, Point p2)
+{
+ for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+ (*i)->Mirror(p1, p2);
+}
+
+
+/*virtual*/ void Container::MirrorSelected(Point p1, Point p2)
+{
+ for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+ {
+ if ((*i)->state == OSSelected)
+ (*i)->Mirror(p1, p2);
+ }
+}
+
+
+/*virtual*/ void Container::Save(void)
+{
+ Object::Save();
+
+ for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+ (*i)->Save();
+}
+
+
+/*virtual*/ void Container::Restore(void)
+{
+ Object::Restore();
+
+ for(std::vector<Object *>::iterator i=objects.begin(); i!=objects.end(); i++)
+ (*i)->Restore();
+}
+