+ case OTLine:
+ if (c->clicked->hitPoint[0])
+ clickedPoint = c->clicked->p[0];
+ else if (c->clicked->hitPoint[1])
+ clickedPoint = c->clicked->p[1];
+ else if (c->clicked->hitObject)
+//Weirdness: some lines get a midpoint, some don't...
+ clickedPoint = Geometry::Midpoint((Line *)(c->clicked));
+
+ break;
+
+ case OTCircle:
+ if (c->clicked->hitPoint[0])
+ clickedPoint = c->clicked->p[0];
+// else if (c->clicked->hitObject)
+// clickedPoint = point - delta;
+
+ break;
+
+ case OTArc:
+ if (c->clicked->hitPoint[0])
+ clickedPoint = c->clicked->p[0];
+ else if (c->clicked->hitPoint[1])
+ clickedPoint = c->clicked->p[0] + (Vector(cos(c->clicked->angle[0]), sin(c->clicked->angle[0])) * c->clicked->radius[0]);
+ else if (c->clicked->hitPoint[2])
+ clickedPoint = c->clicked->p[0] + (Vector(cos(c->clicked->angle[0] + c->clicked->angle[1]), sin(c->clicked->angle[0] + c->clicked->angle[1])) * c->clicked->radius[0]);
+// else if (c->clicked->hitObject)
+// clickedPoint = point - delta;
+
+ break;
+
+ case OTDimension:
+ break;
+
+ case OTText:
+ break;
+ }
+
+ Point clickedDelta = point - clickedPoint;
+ TranslateObject((Object *)c, clickedDelta);
+}
+
+//
+// Translate all objects in the passed in vector, including Containers and all
+// the objects they contain.
+//
+void TranslateObjects(VPVector & v, Point delta)
+{
+ for(VPVectorIter i=v.begin(); i!=v.end(); i++)
+ {
+ Object * obj = (Object *)(*i);