#include <wx/wxexpr.h>
#endif
-#if USE_IOSTREAMH
+#if wxUSE_IOSTREAMH
#include <iostream.h>
#else
#include <iostream>
for (i = 0; i < n; i++)
{
double xp, yp;
- if (GetAttachmentPosition(i, &xp, &yp))
+ if (GetAttachmentPositionEdge(i, &xp, &yp))
{
double l = (double)sqrt(((xp - x) * (xp - x)) +
((yp - y) * (yp - y)));
// and we would want to connect to a point on that vertical --
// oglFindEndForPolyline can't cope with this (the arrow
// gets drawn to the wrong place).
- if ((!m_attachmentMode) && (x1 == x2))
+ if ((m_attachmentMode == ATTACHMENT_MODE_NONE) && (x1 == x2))
{
// Look for the point we'd be connecting to. This is
// a heuristic...
m_controlPoints.Append(control);
node = node->Next();
}
-
-/*
- double maxX, maxY, minX, minY;
-
- GetBoundingBoxMax(&maxX, &maxY);
- GetBoundingBoxMin(&minX, &minY);
-
- double widthMin = (double)(minX + CONTROL_POINT_SIZE + 2);
- double heightMin = (double)(minY + CONTROL_POINT_SIZE + 2);
-
- // Offsets from main object
- double top = (double)(- (heightMin / 2.0));
- double bottom = (double)(heightMin / 2.0 + (maxY - minY));
- double left = (double)(- (widthMin / 2.0));
- double right = (double)(widthMin / 2.0 + (maxX - minX));
-
- wxControlPoint *control = new wxControlPoint(m_canvas, this, CONTROL_POINT_SIZE, left, top,
- CONTROL_POINT_DIAGONAL);
- m_canvas->AddShape(control);
- m_controlPoints.Append(control);
-
- control = new wxControlPoint(m_canvas, this, CONTROL_POINT_SIZE, 0, top,
- CONTROL_POINT_VERTICAL);
- m_canvas->AddShape(control);
- m_controlPoints.Append(control);
-
- control = new wxControlPoint(m_canvas, this, CONTROL_POINT_SIZE, right, top,
- CONTROL_POINT_DIAGONAL);
- m_canvas->AddShape(control);
- m_controlPoints.Append(control);
-
- control = new wxControlPoint(m_canvas, this, CONTROL_POINT_SIZE, right, 0,
- CONTROL_POINT_HORIZONTAL);
- m_canvas->AddShape(control);
- m_controlPoints.Append(control);
-
- control = new wxControlPoint(m_canvas, this, CONTROL_POINT_SIZE, right, bottom,
- CONTROL_POINT_DIAGONAL);
- m_canvas->AddShape(control);
- m_controlPoints.Append(control);
-
- control = new wxControlPoint(m_canvas, this, CONTROL_POINT_SIZE, 0, bottom,
- CONTROL_POINT_VERTICAL);
- m_canvas->AddShape(control);
- m_controlPoints.Append(control);
-
- control = new wxControlPoint(m_canvas, this, CONTROL_POINT_SIZE, left, bottom,
- CONTROL_POINT_DIAGONAL);
- m_canvas->AddShape(control);
- m_controlPoints.Append(control);
-
- control = new wxControlPoint(m_canvas, this, CONTROL_POINT_SIZE, left, 0,
- CONTROL_POINT_HORIZONTAL);
- m_canvas->AddShape(control);
- m_controlPoints.Append(control);
-*/
}
void wxPolygonShape::ResetControlPoints()
node = node->Next();
controlPointNode = controlPointNode->Next();
}
-/*
-
- if (m_controlPoints.Number() < 1)
- return;
-
- double maxX, maxY, minX, minY;
-
- GetBoundingBoxMax(&maxX, &maxY);
- GetBoundingBoxMin(&minX, &minY);
-
- double widthMin = (double)(minX + CONTROL_POINT_SIZE + 2);
- double heightMin = (double)(minY + CONTROL_POINT_SIZE + 2);
-
- // Offsets from main object
- double top = (double)(- (heightMin / 2.0));
- double bottom = (double)(heightMin / 2.0 + (maxY - minY));
- double left = (double)(- (widthMin / 2.0));
- double right = (double)(widthMin / 2.0 + (maxX - minX));
-
- wxNode *node = m_controlPoints.First();
- wxControlPoint *control = (wxControlPoint *)node->Data();
- control->xoffset = left; control->yoffset = top;
-
- node = node->Next(); control = (wxControlPoint *)node->Data();
- control->xoffset = 0; control->yoffset = top;
-
- node = node->Next(); control = (wxControlPoint *)node->Data();
- control->xoffset = right; control->yoffset = top;
-
- node = node->Next(); control = (wxControlPoint *)node->Data();
- control->xoffset = right; control->yoffset = 0;
-
- node = node->Next(); control = (wxControlPoint *)node->Data();
- control->xoffset = right; control->yoffset = bottom;
-
- node = node->Next(); control = (wxControlPoint *)node->Data();
- control->xoffset = 0; control->yoffset = bottom;
-
- node = node->Next(); control = (wxControlPoint *)node->Data();
- control->xoffset = left; control->yoffset = bottom;
-
- node = node->Next(); control = (wxControlPoint *)node->Data();
- control->xoffset = left; control->yoffset = 0;
-*/
}
clause->AddAttributeValue("y", m_ypos);
// Make a list of lists for the coordinates
- wxExpr *list = new wxExpr(PrologList);
+ wxExpr *list = new wxExpr(wxExprList);
wxNode *node = m_points->First();
while (node)
{
wxRealPoint *point = (wxRealPoint *)node->Data();
- wxExpr *point_list = new wxExpr(PrologList);
+ wxExpr *point_list = new wxExpr(wxExprList);
wxExpr *x_expr = new wxExpr((double)point->x);
wxExpr *y_expr = new wxExpr((double)point->y);
clause->AddAttributeValue("points", list);
// Save the original (unscaled) points
- list = new wxExpr(PrologList);
+ list = new wxExpr(wxExprList);
node = m_originalPoints->First();
while (node)
{
wxRealPoint *point = (wxRealPoint *)node->Data();
- wxExpr *point_list = new wxExpr(PrologList);
+ wxExpr *point_list = new wxExpr(wxExprList);
wxExpr *x_expr = new wxExpr((double) point->x);
wxExpr *y_expr = new wxExpr((double) point->y);
point_list->Append(x_expr);
bool wxPolygonShape::GetAttachmentPosition(int attachment, double *x, double *y,
int nth, int no_arcs, wxLineShape *line)
{
- if (m_attachmentMode && m_points && attachment < m_points->Number())
+ if ((m_attachmentMode == ATTACHMENT_MODE_EDGE) && m_points && attachment < m_points->Number())
{
wxRealPoint *point = (wxRealPoint *)m_points->Nth(attachment)->Data();
*x = point->x + m_xpos;
return FALSE;
}
+// Rotate about the given axis by the given amount in radians
+void wxPolygonShape::Rotate(double x, double y, double theta)
+{
+ double actualTheta = theta-m_rotation;
+
+ // Rotate attachment points
+ double sinTheta = (double)sin(actualTheta);
+ double cosTheta = (double)cos(actualTheta);
+ wxNode *node = m_attachmentPoints.First();
+ while (node)
+ {
+ wxAttachmentPoint *point = (wxAttachmentPoint *)node->Data();
+ double x1 = point->m_x;
+ double y1 = point->m_y;
+ point->m_x = x1*cosTheta - y1*sinTheta + x*(1.0 - cosTheta) + y*sinTheta;
+ point->m_y = x1*sinTheta + y1*cosTheta + y*(1.0 - cosTheta) + x*sinTheta;
+ node = node->Next();
+ }
+
+ node = m_points->First();
+ while (node)
+ {
+ wxRealPoint *point = (wxRealPoint *)node->Data();
+ double x1 = point->x;
+ double y1 = point->y;
+ point->x = x1*cosTheta - y1*sinTheta + x*(1.0 - cosTheta) + y*sinTheta;
+ point->y = x1*sinTheta + y1*cosTheta + y*(1.0 - cosTheta) + x*sinTheta;
+ node = node->Next();
+ }
+ node = m_originalPoints->First();
+ while (node)
+ {
+ wxRealPoint *point = (wxRealPoint *)node->Data();
+ double x1 = point->x;
+ double y1 = point->y;
+ point->x = x1*cosTheta - y1*sinTheta + x*(1.0 - cosTheta) + y*sinTheta;
+ point->y = x1*sinTheta + y1*cosTheta + y*(1.0 - cosTheta) + x*sinTheta;
+ node = node->Next();
+ }
+
+ m_rotation = theta;
+
+ CalculatePolygonCentre();
+ CalculateBoundingBox();
+ ResetControlPoints();
+}
+
// Rectangle object
IMPLEMENT_DYNAMIC_CLASS(wxRectangleShape, wxShape)
bool wxRectangleShape::GetAttachmentPosition(int attachment, double *x, double *y,
int nth, int no_arcs, wxLineShape *line)
{
- if (m_attachmentMode)
- {
- double top = (double)(m_ypos + m_height/2.0);
- double bottom = (double)(m_ypos - m_height/2.0);
- double left = (double)(m_xpos - m_width/2.0);
- double right = (double)(m_xpos + m_width/2.0);
-
- bool isEnd = (line && line->IsEnd(this));
-
- // Simplified code
- switch (attachment)
- {
- case 0:
- {
- wxRealPoint pt = CalcSimpleAttachment(wxRealPoint(left, bottom), wxRealPoint(right, bottom),
- nth, no_arcs, line);
-
- *x = pt.x; *y = pt.y;
- break;
- }
- case 1:
- {
- wxRealPoint pt = CalcSimpleAttachment(wxRealPoint(right, bottom), wxRealPoint(right, top),
- nth, no_arcs, line);
-
- *x = pt.x; *y = pt.y;
- break;
- }
- case 2:
- {
- wxRealPoint pt = CalcSimpleAttachment(wxRealPoint(left, top), wxRealPoint(right, top),
- nth, no_arcs, line);
-
- *x = pt.x; *y = pt.y;
- break;
- }
- case 3:
- {
- wxRealPoint pt = CalcSimpleAttachment(wxRealPoint(left, bottom), wxRealPoint(left, top),
- nth, no_arcs, line);
-
- *x = pt.x; *y = pt.y;
- break;
- }
- default:
- {
- return wxShape::GetAttachmentPosition(attachment, x, y, nth, no_arcs, line);
- break;
- }
- }
-
- // Old code
-#if 0
- switch (attachment)
- {
- case 0:
- {
- if (m_spaceAttachments)
- {
- if (line && (line->GetAlignmentType(isEnd) == LINE_ALIGNMENT_TO_NEXT_HANDLE))
- {
- // Align line according to the next handle along
- wxRealPoint *point = line->GetNextControlPoint(this);
- if (point->x < left)
- *x = left;
- else if (point->x > right)
- *x = right;
- else
- *x = point->x;
- }
- else
- *x = left + (nth + 1)*m_width/(no_arcs + 1);
- }
- else *x = m_xpos;
-
- *y = bottom;
- break;
- }
- case 1:
- {
- *x = right;
- if (m_spaceAttachments)
- {
- if (line && (line->GetAlignmentType(isEnd) == LINE_ALIGNMENT_TO_NEXT_HANDLE))
- {
- // Align line according to the next handle along
- wxRealPoint *point = line->GetNextControlPoint(this);
- if (point->y < bottom)
- *y = bottom;
- else if (point->y > top)
- *y = top;
- else
- *y = point->y;
- }
- else
- *y = bottom + (nth + 1)*m_height/(no_arcs + 1);
- }
- else *y = m_ypos;
- break;
- }
- case 2:
- {
- if (m_spaceAttachments)
- {
- if (line && (line->GetAlignmentType(isEnd) == LINE_ALIGNMENT_TO_NEXT_HANDLE))
- {
- // Align line according to the next handle along
- wxRealPoint *point = line->GetNextControlPoint(this);
- if (point->x < left)
- *x = left;
- else if (point->x > right)
- *x = right;
- else
- *x = point->x;
- }
- else
- *x = left + (nth + 1)*m_width/(no_arcs + 1);
- }
- else *x = m_xpos;
- *y = top;
- break;
- }
- case 3:
- {
- *x = left;
- if (m_spaceAttachments)
- {
- if (line && (line->GetAlignmentType(isEnd) == LINE_ALIGNMENT_TO_NEXT_HANDLE))
- {
- // Align line according to the next handle along
- wxRealPoint *point = line->GetNextControlPoint(this);
- if (point->y < bottom)
- *y = bottom;
- else if (point->y > top)
- *y = top;
- else
- *y = point->y;
- }
- else
- *y = bottom + (nth + 1)*m_height/(no_arcs + 1);
- }
- else *y = m_ypos;
- break;
- }
- default:
- {
- return wxShape::GetAttachmentPosition(attachment, x, y, nth, no_arcs, line);
- break;
- }
- }
-#endif
- return TRUE;
- }
- else
- { *x = m_xpos; *y = m_ypos; return TRUE; }
+ return wxShape::GetAttachmentPosition(attachment, x, y, nth, no_arcs, line);
}
// Text object (no box)
bool wxEllipseShape::GetAttachmentPosition(int attachment, double *x, double *y,
int nth, int no_arcs, wxLineShape *line)
{
- if (m_attachmentMode)
+ if (m_attachmentMode == ATTACHMENT_MODE_BRANCHING)
+ return wxShape::GetAttachmentPosition(attachment, x, y, nth, no_arcs, line);
+
+ if (m_attachmentMode != ATTACHMENT_MODE_NONE)
{
double top = (double)(m_ypos + m_height/2.0);
double bottom = (double)(m_ypos - m_height/2.0);
double left = (double)(m_xpos - m_width/2.0);
double right = (double)(m_xpos + m_width/2.0);
- switch (attachment)
+
+ int physicalAttachment = LogicalToPhysicalAttachment(attachment);
+
+ switch (physicalAttachment)
{
case 0:
{
wxCircleShape::wxCircleShape(double diameter):wxEllipseShape(diameter, diameter)
{
+ SetMaintainAspectRatio(TRUE);
}
void wxCircleShape::Copy(wxShape& copy)
// Control points
-double wxControlPoint::controlPointDragStartX = 0.0;
-double wxControlPoint::controlPointDragStartY = 0.0;
-double wxControlPoint::controlPointDragStartWidth = 0.0;
-double wxControlPoint::controlPointDragStartHeight = 0.0;
-double wxControlPoint::controlPointDragEndWidth = 0.0;
-double wxControlPoint::controlPointDragEndHeight = 0.0;
-double wxControlPoint::controlPointDragPosX = 0.0;
-double wxControlPoint::controlPointDragPosY = 0.0;
+double wxControlPoint::sm_controlPointDragStartX = 0.0;
+double wxControlPoint::sm_controlPointDragStartY = 0.0;
+double wxControlPoint::sm_controlPointDragStartWidth = 0.0;
+double wxControlPoint::sm_controlPointDragStartHeight = 0.0;
+double wxControlPoint::sm_controlPointDragEndWidth = 0.0;
+double wxControlPoint::sm_controlPointDragEndHeight = 0.0;
+double wxControlPoint::sm_controlPointDragPosX = 0.0;
+double wxControlPoint::sm_controlPointDragPosY = 0.0;
IMPLEMENT_DYNAMIC_CLASS(wxControlPoint, wxRectangleShape)
// Constrain sizing according to what control point you're dragging
if (pt->m_type == CONTROL_POINT_HORIZONTAL)
- new_height = bound_y;
+ {
+ if (GetMaintainAspectRatio())
+ {
+ new_height = bound_y*(new_width/bound_x);
+ }
+ else
+ new_height = bound_y;
+ }
else if (pt->m_type == CONTROL_POINT_VERTICAL)
- new_width = bound_x;
+ {
+ if (GetMaintainAspectRatio())
+ {
+ new_width = bound_x*(new_height/bound_y);
+ }
+ else
+ new_width = bound_x;
+ }
else if (pt->m_type == CONTROL_POINT_DIAGONAL && (keys & KEY_SHIFT))
new_height = bound_y*(new_width/bound_x);
if (this->GetFixedHeight())
new_height = bound_y;
- pt->controlPointDragEndWidth = new_width;
- pt->controlPointDragEndHeight = new_height;
+ pt->sm_controlPointDragEndWidth = new_width;
+ pt->sm_controlPointDragEndHeight = new_height;
this->GetEventHandler()->OnDrawOutline(dc, this->GetX(), this->GetY(),
new_width, new_height);
else
{
// Don't maintain the same centre point!
- double newX1 = wxMin(pt->controlPointDragStartX, x);
- double newY1 = wxMin(pt->controlPointDragStartY, y);
- double newX2 = wxMax(pt->controlPointDragStartX, x);
- double newY2 = wxMax(pt->controlPointDragStartY, y);
+ double newX1 = wxMin(pt->sm_controlPointDragStartX, x);
+ double newY1 = wxMin(pt->sm_controlPointDragStartY, y);
+ double newX2 = wxMax(pt->sm_controlPointDragStartX, x);
+ double newY2 = wxMax(pt->sm_controlPointDragStartY, y);
if (pt->m_type == CONTROL_POINT_HORIZONTAL)
{
- newY1 = pt->controlPointDragStartY;
- newY2 = newY1 + pt->controlPointDragStartHeight;
+ newY1 = pt->sm_controlPointDragStartY;
+ newY2 = newY1 + pt->sm_controlPointDragStartHeight;
}
else if (pt->m_type == CONTROL_POINT_VERTICAL)
{
- newX1 = pt->controlPointDragStartX;
- newX2 = newX1 + pt->controlPointDragStartWidth;
+ newX1 = pt->sm_controlPointDragStartX;
+ newX2 = newX1 + pt->sm_controlPointDragStartWidth;
}
- else if (pt->m_type == CONTROL_POINT_DIAGONAL && (keys & KEY_SHIFT))
+ else if (pt->m_type == CONTROL_POINT_DIAGONAL && ((keys & KEY_SHIFT) || GetMaintainAspectRatio()))
{
- double newH = (double)((newX2 - newX1)*(pt->controlPointDragStartHeight/pt->controlPointDragStartWidth));
- if (GetY() > pt->controlPointDragStartY)
+ double newH = (double)((newX2 - newX1)*(pt->sm_controlPointDragStartHeight/pt->sm_controlPointDragStartWidth));
+ if (GetY() > pt->sm_controlPointDragStartY)
newY2 = (double)(newY1 + newH);
else
newY1 = (double)(newY2 - newH);
double newWidth = (double)(newX2 - newX1);
double newHeight = (double)(newY2 - newY1);
- pt->controlPointDragPosX = (double)(newX1 + (newWidth/2.0));
- pt->controlPointDragPosY = (double)(newY1 + (newHeight/2.0));
+ if (pt->m_type == CONTROL_POINT_VERTICAL && GetMaintainAspectRatio())
+ {
+ newWidth = bound_x * (newHeight/bound_y) ;
+ }
+
+ if (pt->m_type == CONTROL_POINT_HORIZONTAL && GetMaintainAspectRatio())
+ {
+ newHeight = bound_y * (newWidth/bound_x) ;
+ }
+
+ pt->sm_controlPointDragPosX = (double)(newX1 + (newWidth/2.0));
+ pt->sm_controlPointDragPosY = (double)(newY1 + (newHeight/2.0));
if (this->GetFixedWidth())
newWidth = bound_x;
if (this->GetFixedHeight())
newHeight = bound_y;
- pt->controlPointDragEndWidth = newWidth;
- pt->controlPointDragEndHeight = newHeight;
- this->GetEventHandler()->OnDrawOutline(dc, pt->controlPointDragPosX, pt->controlPointDragPosY, newWidth, newHeight);
+ pt->sm_controlPointDragEndWidth = newWidth;
+ pt->sm_controlPointDragEndHeight = newHeight;
+ this->GetEventHandler()->OnDrawOutline(dc, pt->sm_controlPointDragPosX, pt->sm_controlPointDragPosY, newWidth, newHeight);
}
}
// Choose the 'opposite corner' of the object as the stationary
// point in case this is non-centring resizing.
if (pt->GetX() < this->GetX())
- pt->controlPointDragStartX = (double)(this->GetX() + (bound_x/2.0));
+ pt->sm_controlPointDragStartX = (double)(this->GetX() + (bound_x/2.0));
else
- pt->controlPointDragStartX = (double)(this->GetX() - (bound_x/2.0));
+ pt->sm_controlPointDragStartX = (double)(this->GetX() - (bound_x/2.0));
if (pt->GetY() < this->GetY())
- pt->controlPointDragStartY = (double)(this->GetY() + (bound_y/2.0));
+ pt->sm_controlPointDragStartY = (double)(this->GetY() + (bound_y/2.0));
else
- pt->controlPointDragStartY = (double)(this->GetY() - (bound_y/2.0));
+ pt->sm_controlPointDragStartY = (double)(this->GetY() - (bound_y/2.0));
if (pt->m_type == CONTROL_POINT_HORIZONTAL)
- pt->controlPointDragStartY = (double)(this->GetY() - (bound_y/2.0));
+ pt->sm_controlPointDragStartY = (double)(this->GetY() - (bound_y/2.0));
else if (pt->m_type == CONTROL_POINT_VERTICAL)
- pt->controlPointDragStartX = (double)(this->GetX() - (bound_x/2.0));
+ pt->sm_controlPointDragStartX = (double)(this->GetX() - (bound_x/2.0));
// We may require the old width and height.
- pt->controlPointDragStartWidth = bound_x;
- pt->controlPointDragStartHeight = bound_y;
+ pt->sm_controlPointDragStartWidth = bound_x;
+ pt->sm_controlPointDragStartHeight = bound_y;
wxPen dottedPen(wxColour(0, 0, 0), 1, wxDOT);
dc.SetPen(dottedPen);
// Constrain sizing according to what control point you're dragging
if (pt->m_type == CONTROL_POINT_HORIZONTAL)
- new_height = bound_y;
+ {
+ if (GetMaintainAspectRatio())
+ {
+ new_height = bound_y*(new_width/bound_x);
+ }
+ else
+ new_height = bound_y;
+ }
else if (pt->m_type == CONTROL_POINT_VERTICAL)
- new_width = bound_x;
+ {
+ if (GetMaintainAspectRatio())
+ {
+ new_width = bound_x*(new_height/bound_y);
+ }
+ else
+ new_width = bound_x;
+ }
else if (pt->m_type == CONTROL_POINT_DIAGONAL && (keys & KEY_SHIFT))
new_height = bound_y*(new_width/bound_x);
if (this->GetFixedHeight())
new_height = bound_y;
- pt->controlPointDragEndWidth = new_width;
- pt->controlPointDragEndHeight = new_height;
+ pt->sm_controlPointDragEndWidth = new_width;
+ pt->sm_controlPointDragEndHeight = new_height;
this->GetEventHandler()->OnDrawOutline(dc, this->GetX(), this->GetY(),
new_width, new_height);
}
else
{
// Don't maintain the same centre point!
- double newX1 = wxMin(pt->controlPointDragStartX, x);
- double newY1 = wxMin(pt->controlPointDragStartY, y);
- double newX2 = wxMax(pt->controlPointDragStartX, x);
- double newY2 = wxMax(pt->controlPointDragStartY, y);
+ double newX1 = wxMin(pt->sm_controlPointDragStartX, x);
+ double newY1 = wxMin(pt->sm_controlPointDragStartY, y);
+ double newX2 = wxMax(pt->sm_controlPointDragStartX, x);
+ double newY2 = wxMax(pt->sm_controlPointDragStartY, y);
if (pt->m_type == CONTROL_POINT_HORIZONTAL)
{
- newY1 = pt->controlPointDragStartY;
- newY2 = newY1 + pt->controlPointDragStartHeight;
+ newY1 = pt->sm_controlPointDragStartY;
+ newY2 = newY1 + pt->sm_controlPointDragStartHeight;
}
else if (pt->m_type == CONTROL_POINT_VERTICAL)
{
- newX1 = pt->controlPointDragStartX;
- newX2 = newX1 + pt->controlPointDragStartWidth;
+ newX1 = pt->sm_controlPointDragStartX;
+ newX2 = newX1 + pt->sm_controlPointDragStartWidth;
}
- else if (pt->m_type == CONTROL_POINT_DIAGONAL && (keys & KEY_SHIFT))
+ else if (pt->m_type == CONTROL_POINT_DIAGONAL && ((keys & KEY_SHIFT) || GetMaintainAspectRatio()))
{
- double newH = (double)((newX2 - newX1)*(pt->controlPointDragStartHeight/pt->controlPointDragStartWidth));
- if (pt->GetY() > pt->controlPointDragStartY)
+ double newH = (double)((newX2 - newX1)*(pt->sm_controlPointDragStartHeight/pt->sm_controlPointDragStartWidth));
+ if (pt->GetY() > pt->sm_controlPointDragStartY)
newY2 = (double)(newY1 + newH);
else
newY1 = (double)(newY2 - newH);
double newWidth = (double)(newX2 - newX1);
double newHeight = (double)(newY2 - newY1);
- pt->controlPointDragPosX = (double)(newX1 + (newWidth/2.0));
- pt->controlPointDragPosY = (double)(newY1 + (newHeight/2.0));
+ if (pt->m_type == CONTROL_POINT_VERTICAL && GetMaintainAspectRatio())
+ {
+ newWidth = bound_x * (newHeight/bound_y) ;
+ }
+
+ if (pt->m_type == CONTROL_POINT_HORIZONTAL && GetMaintainAspectRatio())
+ {
+ newHeight = bound_y * (newWidth/bound_x) ;
+ }
+
+ pt->sm_controlPointDragPosX = (double)(newX1 + (newWidth/2.0));
+ pt->sm_controlPointDragPosY = (double)(newY1 + (newHeight/2.0));
if (this->GetFixedWidth())
newWidth = bound_x;
if (this->GetFixedHeight())
newHeight = bound_y;
- pt->controlPointDragEndWidth = newWidth;
- pt->controlPointDragEndHeight = newHeight;
- this->GetEventHandler()->OnDrawOutline(dc, pt->controlPointDragPosX, pt->controlPointDragPosY, newWidth, newHeight);
+ pt->sm_controlPointDragEndWidth = newWidth;
+ pt->sm_controlPointDragEndHeight = newHeight;
+ this->GetEventHandler()->OnDrawOutline(dc, pt->sm_controlPointDragPosX, pt->sm_controlPointDragPosY, newWidth, newHeight);
}
}
this->Show(FALSE);
*/
- this->SetSize(pt->controlPointDragEndWidth, pt->controlPointDragEndHeight);
+ this->SetSize(pt->sm_controlPointDragEndWidth, pt->sm_controlPointDragEndHeight);
// The next operation could destroy this control point (it does for label objects,
// via formatting the text), so save all values we're going to use, or
if (theObject->GetCentreResize())
theObject->Move(dc, theObject->GetX(), theObject->GetY());
else
- theObject->Move(dc, pt->controlPointDragPosX, pt->controlPointDragPosY);
+ theObject->Move(dc, pt->sm_controlPointDragPosX, pt->sm_controlPointDragPosY);
/*
if (!eraseIt)