Various bug fixes to OGL; wxStripExtension prototype added to filefn.h
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@437 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -10,8 +10,7 @@ No parent class.
|
|||||||
|
|
||||||
\wxheading{See also}
|
\wxheading{See also}
|
||||||
|
|
||||||
\overview{Overview}{wxclassinfooverview}\\
|
\helpref{Overview}{wxclassinfooverview}, \helpref{wxObject}{wxobject}
|
||||||
\helpref{wxObject}{wxobject}
|
|
||||||
|
|
||||||
\latexignore{\rtfignore{\wxheading{Members}}}
|
\latexignore{\rtfignore{\wxheading{Members}}}
|
||||||
|
|
||||||
|
@@ -73,6 +73,7 @@ void WXDLLEXPORT wxUnix2DosFilename(char *s);
|
|||||||
|
|
||||||
// Strip the extension, in situ
|
// Strip the extension, in situ
|
||||||
void WXDLLEXPORT wxStripExtension(char *buffer);
|
void WXDLLEXPORT wxStripExtension(char *buffer);
|
||||||
|
void WXDLLEXPORT wxStripExtension(wxString& buffer);
|
||||||
|
|
||||||
// Get a temporary filename, opening and closing the file.
|
// Get a temporary filename, opening and closing the file.
|
||||||
char* WXDLLEXPORT wxGetTempFileName(const wxString& prefix, char *buf = NULL);
|
char* WXDLLEXPORT wxGetTempFileName(const wxString& prefix, char *buf = NULL);
|
||||||
|
@@ -102,6 +102,7 @@ wxDocMDIChildFrame::wxDocMDIChildFrame(wxDocument *doc, wxView *view, wxMDIParen
|
|||||||
|
|
||||||
wxDocMDIChildFrame::~wxDocMDIChildFrame(void)
|
wxDocMDIChildFrame::~wxDocMDIChildFrame(void)
|
||||||
{
|
{
|
||||||
|
m_childView = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extend event processing to search the view's event table
|
// Extend event processing to search the view's event table
|
||||||
|
@@ -196,16 +196,28 @@ bool wxDocument::SaveAs(void)
|
|||||||
|
|
||||||
char *tmp = wxFileSelector("Save as", docTemplate->GetDirectory(), GetFilename(),
|
char *tmp = wxFileSelector("Save as", docTemplate->GetDirectory(), GetFilename(),
|
||||||
docTemplate->GetDefaultExtension(), docTemplate->GetFileFilter(),
|
docTemplate->GetDefaultExtension(), docTemplate->GetFileFilter(),
|
||||||
0, GetDocumentWindow());
|
wxSAVE|wxOVERWRITE_PROMPT, GetDocumentWindow());
|
||||||
|
|
||||||
if (!tmp)
|
if (!tmp)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SetFilename(tmp);
|
wxString fileName(tmp);
|
||||||
SetTitle(wxFileNameFromPath(tmp));
|
wxString path("");
|
||||||
|
wxString name("");
|
||||||
|
wxString ext("");
|
||||||
|
wxSplitPath(fileName, & path, & name, & ext);
|
||||||
|
|
||||||
GetDocumentManager()->AddFileToHistory(tmp);
|
if (ext.IsEmpty() || ext == "")
|
||||||
|
{
|
||||||
|
fileName += ".";
|
||||||
|
fileName += docTemplate->GetDefaultExtension();
|
||||||
|
}
|
||||||
|
|
||||||
|
SetFilename(fileName);
|
||||||
|
SetTitle(wxFileNameFromPath(fileName));
|
||||||
|
|
||||||
|
GetDocumentManager()->AddFileToHistory(fileName);
|
||||||
|
|
||||||
// Notify the views that the filename has changed
|
// Notify the views that the filename has changed
|
||||||
wxNode *node = m_documentViews.First();
|
wxNode *node = m_documentViews.First();
|
||||||
|
@@ -81,6 +81,22 @@ wxShapeEvtHandler::~wxShapeEvtHandler()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Creates a copy of this event handler.
|
||||||
|
wxShapeEvtHandler* wxShapeEvtHandler::CreateNewCopy()
|
||||||
|
{
|
||||||
|
wxShapeEvtHandler* newObject = (wxShapeEvtHandler*) GetClassInfo()->CreateObject();
|
||||||
|
|
||||||
|
wxASSERT( (newObject != NULL) );
|
||||||
|
wxASSERT( (newObject->IsKindOf(CLASSINFO(wxShapeEvtHandler))) );
|
||||||
|
|
||||||
|
newObject->m_previousHandler = newObject;
|
||||||
|
|
||||||
|
CopyData(*newObject);
|
||||||
|
|
||||||
|
return newObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void wxShapeEvtHandler::OnDelete()
|
void wxShapeEvtHandler::OnDelete()
|
||||||
{
|
{
|
||||||
if (this != GetShape())
|
if (this != GetShape())
|
||||||
@@ -197,6 +213,26 @@ void wxShapeEvtHandler::OnEndDragRight(float x, float y, int keys, int attachmen
|
|||||||
m_previousHandler->OnEndDragRight(x, y, keys, attachment);
|
m_previousHandler->OnEndDragRight(x, y, keys, attachment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Control points ('handles') redirect control to the actual shape, to make it easier
|
||||||
|
// to override sizing behaviour.
|
||||||
|
void wxShapeEvtHandler::OnSizingDragLeft(wxControlPoint* pt, bool draw, float x, float y, int keys, int attachment)
|
||||||
|
{
|
||||||
|
if (m_previousHandler)
|
||||||
|
m_previousHandler->OnSizingDragLeft(pt, draw, x, y, keys, attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxShapeEvtHandler::OnSizingBeginDragLeft(wxControlPoint* pt, float x, float y, int keys, int attachment)
|
||||||
|
{
|
||||||
|
if (m_previousHandler)
|
||||||
|
m_previousHandler->OnSizingBeginDragLeft(pt, x, y, keys, attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxShapeEvtHandler::OnSizingEndDragLeft(wxControlPoint* pt, float x, float y, int keys, int attachment)
|
||||||
|
{
|
||||||
|
if (m_previousHandler)
|
||||||
|
m_previousHandler->OnSizingEndDragLeft(pt, x, y, keys, attachment);
|
||||||
|
}
|
||||||
|
|
||||||
void wxShapeEvtHandler::OnDrawOutline(wxDC& dc, float x, float y, float w, float h)
|
void wxShapeEvtHandler::OnDrawOutline(wxDC& dc, float x, float y, float w, float h)
|
||||||
{
|
{
|
||||||
if (m_previousHandler)
|
if (m_previousHandler)
|
||||||
@@ -220,7 +256,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxShape, wxShapeEvtHandler)
|
|||||||
wxShape::wxShape(wxShapeCanvas *can)
|
wxShape::wxShape(wxShapeCanvas *can)
|
||||||
{
|
{
|
||||||
m_eventHandler = this;
|
m_eventHandler = this;
|
||||||
SetHandlerShape(this);
|
SetShape(this);
|
||||||
m_id = 0;
|
m_id = 0;
|
||||||
m_formatted = FALSE;
|
m_formatted = FALSE;
|
||||||
m_canvas = can;
|
m_canvas = can;
|
||||||
@@ -1876,7 +1912,7 @@ void wxShape::ReadRegions(wxExpr *clause)
|
|||||||
m_regionProportionX = propXExpr->RealValue();
|
m_regionProportionX = propXExpr->RealValue();
|
||||||
m_regionProportionY = propYExpr->RealValue();
|
m_regionProportionY = propYExpr->RealValue();
|
||||||
|
|
||||||
formatMode = (formatExpr->IntegerValue() != 0);
|
formatMode = (int) formatExpr->IntegerValue();
|
||||||
fontSize = (int)sizeExpr->IntegerValue();
|
fontSize = (int)sizeExpr->IntegerValue();
|
||||||
fontFamily = (int)familyExpr->IntegerValue();
|
fontFamily = (int)familyExpr->IntegerValue();
|
||||||
fontStyle = (int)styleExpr->IntegerValue();
|
fontStyle = (int)styleExpr->IntegerValue();
|
||||||
@@ -2056,16 +2092,48 @@ void wxShape::Copy(wxShape& copy)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create and return a new, fully copied object.
|
// Create and return a new, fully copied object.
|
||||||
wxShape *wxShape::CreateNewCopy(wxShapeCanvas *theCanvas)
|
wxShape *wxShape::CreateNewCopy(bool resetMapping, bool recompute)
|
||||||
{
|
{
|
||||||
|
if (resetMapping)
|
||||||
wxObjectCopyMapping.Clear();
|
wxObjectCopyMapping.Clear();
|
||||||
wxShape *newObject = PrivateCopy();
|
|
||||||
if (theCanvas)
|
wxShape* newObject = (wxShape*) GetClassInfo()->CreateObject();
|
||||||
newObject->AddToCanvas(theCanvas);
|
|
||||||
|
wxASSERT( (newObject != NULL) );
|
||||||
|
wxASSERT( (newObject->IsKindOf(CLASSINFO(wxShape))) );
|
||||||
|
|
||||||
|
Copy(*newObject);
|
||||||
|
|
||||||
|
if (GetEventHandler() != this)
|
||||||
|
{
|
||||||
|
wxShapeEvtHandler* newHandler = GetEventHandler()->CreateNewCopy();
|
||||||
|
newObject->SetEventHandler(newHandler);
|
||||||
|
newObject->SetPreviousHandler(newObject);
|
||||||
|
newHandler->SetPreviousHandler(newHandler);
|
||||||
|
newHandler->SetShape(newObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (recompute)
|
||||||
newObject->Recompute();
|
newObject->Recompute();
|
||||||
return newObject;
|
return newObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Does the copying for this object, including copying event
|
||||||
|
// handler data if any. Calls the virtual Copy function.
|
||||||
|
void wxShape::CopyWithHandler(wxShape& copy)
|
||||||
|
{
|
||||||
|
Copy(copy);
|
||||||
|
|
||||||
|
if (GetEventHandler() != this)
|
||||||
|
{
|
||||||
|
wxASSERT( copy.GetEventHandler() != NULL );
|
||||||
|
wxASSERT( copy.GetEventHandler() != (©) );
|
||||||
|
wxASSERT( GetEventHandler()->GetClassInfo() == copy.GetEventHandler()->GetClassInfo() );
|
||||||
|
GetEventHandler()->CopyData(* (copy.GetEventHandler()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Default - make 6 control points
|
// Default - make 6 control points
|
||||||
void wxShape::MakeControlPoints()
|
void wxShape::MakeControlPoints()
|
||||||
{
|
{
|
||||||
|
@@ -114,9 +114,12 @@ class wxShapeEvtHandler: public wxObject
|
|||||||
wxShapeEvtHandler(wxShapeEvtHandler *prev = NULL, wxShape *shape = NULL);
|
wxShapeEvtHandler(wxShapeEvtHandler *prev = NULL, wxShape *shape = NULL);
|
||||||
virtual ~wxShapeEvtHandler();
|
virtual ~wxShapeEvtHandler();
|
||||||
|
|
||||||
inline void SetHandlerShape(wxShape *sh) { m_handlerShape = sh; }
|
inline void SetShape(wxShape *sh) { m_handlerShape = sh; }
|
||||||
inline wxShape *GetShape() const { return m_handlerShape; }
|
inline wxShape *GetShape() const { return m_handlerShape; }
|
||||||
|
|
||||||
|
inline void SetPreviousHandler(wxShapeEvtHandler* handler) { m_previousHandler = handler; }
|
||||||
|
inline wxShapeEvtHandler* GetPreviousHandler() const { return m_previousHandler; }
|
||||||
|
|
||||||
// This is called when the _shape_ is deleted.
|
// This is called when the _shape_ is deleted.
|
||||||
virtual void OnDelete();
|
virtual void OnDelete();
|
||||||
virtual void OnDraw(wxDC& dc);
|
virtual void OnDraw(wxDC& dc);
|
||||||
@@ -142,9 +145,22 @@ class wxShapeEvtHandler: public wxObject
|
|||||||
virtual void OnEraseControlPoints(wxDC& dc);
|
virtual void OnEraseControlPoints(wxDC& dc);
|
||||||
virtual void OnMoveLink(wxDC& dc, bool moveControlPoints = TRUE);
|
virtual void OnMoveLink(wxDC& dc, bool moveControlPoints = TRUE);
|
||||||
|
|
||||||
|
// Control points ('handles') redirect control to the actual shape, to make it easier
|
||||||
|
// to override sizing behaviour.
|
||||||
|
virtual void OnSizingDragLeft(wxControlPoint* pt, bool draw, float x, float y, int keys=0, int attachment = 0); // Erase if draw false
|
||||||
|
virtual void OnSizingBeginDragLeft(wxControlPoint* pt, float x, float y, int keys=0, int attachment = 0);
|
||||||
|
virtual void OnSizingEndDragLeft(wxControlPoint* pt, float x, float y, int keys=0, int attachment = 0);
|
||||||
|
|
||||||
virtual void OnBeginSize(float WXUNUSED(w), float WXUNUSED(h)) { }
|
virtual void OnBeginSize(float WXUNUSED(w), float WXUNUSED(h)) { }
|
||||||
virtual void OnEndSize(float WXUNUSED(w), float WXUNUSED(h)) { }
|
virtual void OnEndSize(float WXUNUSED(w), float WXUNUSED(h)) { }
|
||||||
|
|
||||||
|
// Creates a copy of this event handler.
|
||||||
|
wxShapeEvtHandler *CreateNewCopy();
|
||||||
|
|
||||||
|
// Does the copy - override for new event handlers which might store
|
||||||
|
// app-specific data.
|
||||||
|
virtual void CopyData(wxShapeEvtHandler& copy) {};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxShapeEvtHandler* m_previousHandler;
|
wxShapeEvtHandler* m_previousHandler;
|
||||||
wxShape* m_handlerShape;
|
wxShape* m_handlerShape;
|
||||||
@@ -207,6 +223,12 @@ class wxShape: public wxShapeEvtHandler
|
|||||||
virtual void OnBeginSize(float WXUNUSED(w), float WXUNUSED(h)) { }
|
virtual void OnBeginSize(float WXUNUSED(w), float WXUNUSED(h)) { }
|
||||||
virtual void OnEndSize(float WXUNUSED(w), float WXUNUSED(h)) { }
|
virtual void OnEndSize(float WXUNUSED(w), float WXUNUSED(h)) { }
|
||||||
|
|
||||||
|
// Control points ('handles') redirect control to the actual shape, to make it easier
|
||||||
|
// to override sizing behaviour.
|
||||||
|
virtual void OnSizingDragLeft(wxControlPoint* pt, bool draw, float x, float y, int keys=0, int attachment = 0); // Erase if draw false
|
||||||
|
virtual void OnSizingBeginDragLeft(wxControlPoint* pt, float x, float y, int keys=0, int attachment = 0);
|
||||||
|
virtual void OnSizingEndDragLeft(wxControlPoint* pt, float x, float y, int keys=0, int attachment = 0);
|
||||||
|
|
||||||
virtual void MakeControlPoints();
|
virtual void MakeControlPoints();
|
||||||
virtual void DeleteControlPoints(wxDC *dc = NULL);
|
virtual void DeleteControlPoints(wxDC *dc = NULL);
|
||||||
virtual void ResetControlPoints();
|
virtual void ResetControlPoints();
|
||||||
@@ -309,7 +331,7 @@ class wxShape: public wxShapeEvtHandler
|
|||||||
virtual void NameRegions(const wxString& parentName = "");
|
virtual void NameRegions(const wxString& parentName = "");
|
||||||
|
|
||||||
// Get list of regions
|
// Get list of regions
|
||||||
inline wxList& GetRegions() { return m_regions; }
|
inline wxList& GetRegions() const { return (wxList&) m_regions; }
|
||||||
|
|
||||||
virtual void AddRegion(wxShapeRegion *region);
|
virtual void AddRegion(wxShapeRegion *region);
|
||||||
|
|
||||||
@@ -341,10 +363,6 @@ class wxShape: public wxShapeEvtHandler
|
|||||||
virtual void ReadRegions(wxExpr *clause);
|
virtual void ReadRegions(wxExpr *clause);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Does the WHOLE copy calling PrivateCopy - don't redefine.
|
|
||||||
// If canvas is non-null, set the canvas too.
|
|
||||||
wxShape *CreateNewCopy(wxShapeCanvas *theCanvas = NULL);
|
|
||||||
|
|
||||||
// Attachment code
|
// Attachment code
|
||||||
virtual bool GetAttachmentPosition(int attachment, float *x, float *y,
|
virtual bool GetAttachmentPosition(int attachment, float *x, float *y,
|
||||||
int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
|
int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
|
||||||
@@ -369,10 +387,15 @@ class wxShape: public wxShapeEvtHandler
|
|||||||
// Returns TRUE if image is a descendant of this image
|
// Returns TRUE if image is a descendant of this image
|
||||||
bool HasDescendant(wxShape *image);
|
bool HasDescendant(wxShape *image);
|
||||||
|
|
||||||
|
// Creates a copy of this shape.
|
||||||
|
wxShape *CreateNewCopy(bool resetMapping = TRUE, bool recompute = TRUE);
|
||||||
|
|
||||||
// Does the copying for this object
|
// Does the copying for this object
|
||||||
void Copy(wxShape& copy);
|
virtual void Copy(wxShape& copy);
|
||||||
// Returns a new instance, and does the copy for this class. Define for each class.
|
|
||||||
virtual wxShape *PrivateCopy() = 0;
|
// Does the copying for this object, including copying event
|
||||||
|
// handler data if any. Calls the virtual Copy function.
|
||||||
|
void CopyWithHandler(wxShape& copy);
|
||||||
|
|
||||||
// Rotate about the given axis by the given amount in radians
|
// Rotate about the given axis by the given amount in radians
|
||||||
// (does nothing for most objects)
|
// (does nothing for most objects)
|
||||||
@@ -455,6 +478,12 @@ class wxPolygonShape: public wxShape
|
|||||||
void OnDraw(wxDC& dc);
|
void OnDraw(wxDC& dc);
|
||||||
void OnDrawOutline(wxDC& dc, float x, float y, float w, float h);
|
void OnDrawOutline(wxDC& dc, float x, float y, float w, float h);
|
||||||
|
|
||||||
|
// Control points ('handles') redirect control to the actual shape, to make it easier
|
||||||
|
// to override sizing behaviour.
|
||||||
|
virtual void OnSizingDragLeft(wxControlPoint* pt, bool draw, float x, float y, int keys=0, int attachment = 0);
|
||||||
|
virtual void OnSizingBeginDragLeft(wxControlPoint* pt, float x, float y, int keys=0, int attachment = 0);
|
||||||
|
virtual void OnSizingEndDragLeft(wxControlPoint* pt, float x, float y, int keys=0, int attachment = 0);
|
||||||
|
|
||||||
// A polygon should have a control point at each vertex,
|
// A polygon should have a control point at each vertex,
|
||||||
// with the option of moving the control points individually
|
// with the option of moving the control points individually
|
||||||
// to change the shape.
|
// to change the shape.
|
||||||
@@ -485,8 +514,7 @@ class wxPolygonShape: public wxShape
|
|||||||
int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
|
int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
|
||||||
bool AttachmentIsValid(int attachment);
|
bool AttachmentIsValid(int attachment);
|
||||||
// Does the copying for this object
|
// Does the copying for this object
|
||||||
void Copy(wxPolygonShape& copy);
|
void Copy(wxShape& copy);
|
||||||
wxShape *PrivateCopy();
|
|
||||||
|
|
||||||
inline wxList *GetPoints() { return m_points; }
|
inline wxList *GetPoints() { return m_points; }
|
||||||
|
|
||||||
@@ -522,8 +550,7 @@ class wxRectangleShape: public wxShape
|
|||||||
bool GetAttachmentPosition(int attachment, float *x, float *y,
|
bool GetAttachmentPosition(int attachment, float *x, float *y,
|
||||||
int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
|
int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
|
||||||
// Does the copying for this object
|
// Does the copying for this object
|
||||||
void Copy(wxRectangleShape& copy);
|
void Copy(wxShape& copy);
|
||||||
wxShape *PrivateCopy();
|
|
||||||
|
|
||||||
inline float GetWidth() const { return m_width; }
|
inline float GetWidth() const { return m_width; }
|
||||||
inline float GetHeight() const { return m_height; }
|
inline float GetHeight() const { return m_height; }
|
||||||
@@ -547,8 +574,7 @@ class wxTextShape: public wxRectangleShape
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Does the copying for this object
|
// Does the copying for this object
|
||||||
void Copy(wxTextShape& copy);
|
void Copy(wxShape& copy);
|
||||||
wxShape *PrivateCopy();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class wxEllipseShape: public wxShape
|
class wxEllipseShape: public wxShape
|
||||||
@@ -576,8 +602,7 @@ class wxEllipseShape: public wxShape
|
|||||||
int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
|
int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
|
||||||
|
|
||||||
// Does the copying for this object
|
// Does the copying for this object
|
||||||
void Copy(wxEllipseShape& copy);
|
void Copy(wxShape& copy);
|
||||||
wxShape *PrivateCopy();
|
|
||||||
|
|
||||||
inline float GetWidth() const { return m_width; }
|
inline float GetWidth() const { return m_width; }
|
||||||
inline float GetHeight() const { return m_height; }
|
inline float GetHeight() const { return m_height; }
|
||||||
@@ -597,8 +622,7 @@ class wxCircleShape: public wxEllipseShape
|
|||||||
float x2, float y2,
|
float x2, float y2,
|
||||||
float *x3, float *y3);
|
float *x3, float *y3);
|
||||||
// Does the copying for this object
|
// Does the copying for this object
|
||||||
void Copy(wxCircleShape& copy);
|
void Copy(wxShape& copy);
|
||||||
wxShape *PrivateCopy();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -826,26 +826,30 @@ void wxPolygonShape::ReadPrologAttributes(wxExpr *clause)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void wxPolygonShape::Copy(wxPolygonShape& copy)
|
void wxPolygonShape::Copy(wxShape& copy)
|
||||||
{
|
{
|
||||||
wxShape::Copy(copy);
|
wxShape::Copy(copy);
|
||||||
|
|
||||||
if (copy.m_points)
|
wxASSERT( copy.IsKindOf(CLASSINFO(wxPolygonShape)) );
|
||||||
delete copy.m_points;
|
|
||||||
|
|
||||||
copy.m_points = new wxList;
|
wxPolygonShape& polyCopy = (wxPolygonShape&) copy;
|
||||||
|
|
||||||
if (copy.m_originalPoints)
|
if (polyCopy.m_points)
|
||||||
delete copy.m_originalPoints;
|
delete polyCopy.m_points;
|
||||||
|
|
||||||
copy.m_originalPoints = new wxList;
|
polyCopy.m_points = new wxList;
|
||||||
|
|
||||||
|
if (polyCopy.m_originalPoints)
|
||||||
|
delete polyCopy.m_originalPoints;
|
||||||
|
|
||||||
|
polyCopy.m_originalPoints = new wxList;
|
||||||
|
|
||||||
wxNode *node = m_points->First();
|
wxNode *node = m_points->First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxRealPoint *point = (wxRealPoint *)node->Data();
|
wxRealPoint *point = (wxRealPoint *)node->Data();
|
||||||
wxRealPoint *new_point = new wxRealPoint(point->x, point->y);
|
wxRealPoint *new_point = new wxRealPoint(point->x, point->y);
|
||||||
copy.m_points->Append((wxObject*) new_point);
|
polyCopy.m_points->Append((wxObject*) new_point);
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
}
|
}
|
||||||
node = m_originalPoints->First();
|
node = m_originalPoints->First();
|
||||||
@@ -853,20 +857,13 @@ void wxPolygonShape::Copy(wxPolygonShape& copy)
|
|||||||
{
|
{
|
||||||
wxRealPoint *point = (wxRealPoint *)node->Data();
|
wxRealPoint *point = (wxRealPoint *)node->Data();
|
||||||
wxRealPoint *new_point = new wxRealPoint(point->x, point->y);
|
wxRealPoint *new_point = new wxRealPoint(point->x, point->y);
|
||||||
copy.m_originalPoints->Append((wxObject*) new_point);
|
polyCopy.m_originalPoints->Append((wxObject*) new_point);
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
}
|
}
|
||||||
copy.m_boundWidth = m_boundWidth;
|
polyCopy.m_boundWidth = m_boundWidth;
|
||||||
copy.m_boundHeight = m_boundHeight;
|
polyCopy.m_boundHeight = m_boundHeight;
|
||||||
copy.m_originalWidth = m_originalWidth;
|
polyCopy.m_originalWidth = m_originalWidth;
|
||||||
copy.m_originalHeight = m_originalHeight;
|
polyCopy.m_originalHeight = m_originalHeight;
|
||||||
}
|
|
||||||
|
|
||||||
wxShape *wxPolygonShape::PrivateCopy()
|
|
||||||
{
|
|
||||||
wxPolygonShape *obj = new wxPolygonShape;
|
|
||||||
Copy(*obj);
|
|
||||||
return obj;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxPolygonShape::GetNumberOfAttachments()
|
int wxPolygonShape::GetNumberOfAttachments()
|
||||||
@@ -1020,21 +1017,17 @@ void wxRectangleShape::ReadPrologAttributes(wxExpr *clause)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void wxRectangleShape::Copy(wxRectangleShape& copy)
|
void wxRectangleShape::Copy(wxShape& copy)
|
||||||
{
|
{
|
||||||
wxShape::Copy(copy);
|
wxShape::Copy(copy);
|
||||||
copy.m_width = m_width;
|
|
||||||
copy.m_height = m_height;
|
|
||||||
copy.m_cornerRadius = m_cornerRadius;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxShape *wxRectangleShape::PrivateCopy()
|
wxASSERT( copy.IsKindOf(CLASSINFO(wxRectangleShape)) );
|
||||||
{
|
|
||||||
wxRectangleShape *obj = new wxRectangleShape(0.0, 0.0);
|
|
||||||
Copy(*obj);
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
wxRectangleShape& rectCopy = (wxRectangleShape&) copy;
|
||||||
|
rectCopy.m_width = m_width;
|
||||||
|
rectCopy.m_height = m_height;
|
||||||
|
rectCopy.m_cornerRadius = m_cornerRadius;
|
||||||
|
}
|
||||||
|
|
||||||
int wxRectangleShape::GetNumberOfAttachments()
|
int wxRectangleShape::GetNumberOfAttachments()
|
||||||
{
|
{
|
||||||
@@ -1171,14 +1164,7 @@ void wxTextShape::OnDraw(wxDC& dc)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
wxShape *wxTextShape::PrivateCopy()
|
void wxTextShape::Copy(wxShape& copy)
|
||||||
{
|
|
||||||
wxTextShape *obj = new wxTextShape(0.0, 0.0);
|
|
||||||
Copy(*obj);
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxTextShape::Copy(wxTextShape& copy)
|
|
||||||
{
|
{
|
||||||
wxRectangleShape::Copy(copy);
|
wxRectangleShape::Copy(copy);
|
||||||
}
|
}
|
||||||
@@ -1276,19 +1262,16 @@ void wxEllipseShape::ReadPrologAttributes(wxExpr *clause)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void wxEllipseShape::Copy(wxEllipseShape& copy)
|
void wxEllipseShape::Copy(wxShape& copy)
|
||||||
{
|
{
|
||||||
wxShape::Copy(copy);
|
wxShape::Copy(copy);
|
||||||
|
|
||||||
copy.m_width = m_width;
|
wxASSERT( copy.IsKindOf(CLASSINFO(wxEllipseShape)) );
|
||||||
copy.m_height = m_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxShape *wxEllipseShape::PrivateCopy()
|
wxEllipseShape& ellipseCopy = (wxEllipseShape&) copy;
|
||||||
{
|
|
||||||
wxEllipseShape *obj = new wxEllipseShape(0.0, 0.0);
|
ellipseCopy.m_width = m_width;
|
||||||
Copy(*obj);
|
ellipseCopy.m_height = m_height;
|
||||||
return obj;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxEllipseShape::GetNumberOfAttachments()
|
int wxEllipseShape::GetNumberOfAttachments()
|
||||||
@@ -1368,14 +1351,7 @@ wxCircleShape::wxCircleShape(float diameter):wxEllipseShape(diameter, diameter)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
wxShape *wxCircleShape::PrivateCopy()
|
void wxCircleShape::Copy(wxShape& copy)
|
||||||
{
|
|
||||||
wxCircleShape *obj = new wxCircleShape(0.0);
|
|
||||||
Copy(*obj);
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxCircleShape::Copy(wxCircleShape& copy)
|
|
||||||
{
|
{
|
||||||
wxEllipseShape::Copy(copy);
|
wxEllipseShape::Copy(copy);
|
||||||
}
|
}
|
||||||
@@ -1394,6 +1370,15 @@ bool wxCircleShape::GetPerimeterPoint(float x1, float y1,
|
|||||||
|
|
||||||
// Control points
|
// Control points
|
||||||
|
|
||||||
|
float wxControlPoint::controlPointDragStartX = 0.0;
|
||||||
|
float wxControlPoint::controlPointDragStartY = 0.0;
|
||||||
|
float wxControlPoint::controlPointDragStartWidth = 0.0;
|
||||||
|
float wxControlPoint::controlPointDragStartHeight = 0.0;
|
||||||
|
float wxControlPoint::controlPointDragEndWidth = 0.0;
|
||||||
|
float wxControlPoint::controlPointDragEndHeight = 0.0;
|
||||||
|
float wxControlPoint::controlPointDragPosX = 0.0;
|
||||||
|
float wxControlPoint::controlPointDragPosY = 0.0;
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxControlPoint, wxRectangleShape)
|
IMPLEMENT_DYNAMIC_CLASS(wxControlPoint, wxRectangleShape)
|
||||||
|
|
||||||
wxControlPoint::wxControlPoint(wxShapeCanvas *theCanvas, wxShape *object, float size, float the_xoffset, float the_yoffset, int the_type):wxRectangleShape(size, size)
|
wxControlPoint::wxControlPoint(wxShapeCanvas *theCanvas, wxShape *object, float size, float the_xoffset, float the_yoffset, int the_type):wxRectangleShape(size, size)
|
||||||
@@ -1431,25 +1416,41 @@ void wxControlPoint::OnErase(wxDC& dc)
|
|||||||
wxRectangleShape::OnErase(dc);
|
wxRectangleShape::OnErase(dc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Store original top-left, bottom-right coordinates
|
|
||||||
* in case we're doing non-vertical resizing.
|
|
||||||
*/
|
|
||||||
static float controlPointDragStartX = 0.0;
|
|
||||||
static float controlPointDragStartY = 0.0;
|
|
||||||
static float controlPointDragStartWidth = 0.0;
|
|
||||||
static float controlPointDragStartHeight = 0.0;
|
|
||||||
static float controlPointDragEndWidth = 0.0;
|
|
||||||
static float controlPointDragEndHeight = 0.0;
|
|
||||||
static float controlPointDragPosX = 0.0;
|
|
||||||
static float controlPointDragPosY = 0.0;
|
|
||||||
|
|
||||||
// Implement resizing of canvas object
|
// Implement resizing of canvas object
|
||||||
void wxControlPoint::OnDragLeft(bool draw, float x, float y, int keys, int attachment)
|
void wxControlPoint::OnDragLeft(bool draw, float x, float y, int keys, int attachment)
|
||||||
|
{
|
||||||
|
m_shape->GetEventHandler()->OnSizingDragLeft(this, draw, x, y, keys, attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControlPoint::OnBeginDragLeft(float x, float y, int keys, int attachment)
|
||||||
|
{
|
||||||
|
m_shape->GetEventHandler()->OnSizingBeginDragLeft(this, x, y, keys, attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxControlPoint::OnEndDragLeft(float x, float y, int keys, int attachment)
|
||||||
|
{
|
||||||
|
m_shape->GetEventHandler()->OnSizingEndDragLeft(this, x, y, keys, attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxControlPoint::GetNumberOfAttachments()
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxControlPoint::GetAttachmentPosition(int attachment, float *x, float *y,
|
||||||
|
int nth, int no_arcs, wxLineShape *line)
|
||||||
|
{
|
||||||
|
*x = m_xpos; *y = m_ypos;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Control points ('handles') redirect control to the actual shape, to make it easier
|
||||||
|
// to override sizing behaviour.
|
||||||
|
void wxShape::OnSizingDragLeft(wxControlPoint* pt, bool draw, float x, float y, int keys, int attachment)
|
||||||
{
|
{
|
||||||
float bound_x;
|
float bound_x;
|
||||||
float bound_y;
|
float bound_y;
|
||||||
m_shape->GetBoundingBoxMin(&bound_x, &bound_y);
|
this->GetBoundingBoxMin(&bound_x, &bound_y);
|
||||||
|
|
||||||
wxClientDC dc(GetCanvas());
|
wxClientDC dc(GetCanvas());
|
||||||
GetCanvas()->PrepareDC(dc);
|
GetCanvas()->PrepareDC(dc);
|
||||||
@@ -1460,58 +1461,53 @@ void wxControlPoint::OnDragLeft(bool draw, float x, float y, int keys, int attac
|
|||||||
dc.SetPen(dottedPen);
|
dc.SetPen(dottedPen);
|
||||||
dc.SetBrush((* wxTRANSPARENT_BRUSH));
|
dc.SetBrush((* wxTRANSPARENT_BRUSH));
|
||||||
|
|
||||||
if (m_shape->GetCentreResize())
|
if (this->GetCentreResize())
|
||||||
{
|
{
|
||||||
// Maintain the same centre point.
|
// Maintain the same centre point.
|
||||||
float new_width = (float)(2.0*fabs(x - m_shape->GetX()));
|
float new_width = (float)(2.0*fabs(x - this->GetX()));
|
||||||
float new_height = (float)(2.0*fabs(y - m_shape->GetY()));
|
float new_height = (float)(2.0*fabs(y - this->GetY()));
|
||||||
|
|
||||||
// Constrain sizing according to what control point you're dragging
|
// Constrain sizing according to what control point you're dragging
|
||||||
if (m_type == CONTROL_POINT_HORIZONTAL)
|
if (pt->m_type == CONTROL_POINT_HORIZONTAL)
|
||||||
new_height = bound_y;
|
new_height = bound_y;
|
||||||
else if (m_type == CONTROL_POINT_VERTICAL)
|
else if (pt->m_type == CONTROL_POINT_VERTICAL)
|
||||||
new_width = bound_x;
|
new_width = bound_x;
|
||||||
else if (m_type == CONTROL_POINT_DIAGONAL && (keys & KEY_SHIFT))
|
else if (pt->m_type == CONTROL_POINT_DIAGONAL && (keys & KEY_SHIFT))
|
||||||
new_height = bound_y*(new_width/bound_x);
|
new_height = bound_y*(new_width/bound_x);
|
||||||
|
|
||||||
// m_shape->OnBeginSize(m_shape->m_fixedWidth ? bound_x : new_width,
|
if (this->GetFixedWidth())
|
||||||
// m_shape->m_fixedHeight ? bound_y : new_height);
|
|
||||||
|
|
||||||
// m_shape->SetSize(m_shape->m_fixedWidth ? bound_x : new_width,
|
|
||||||
// m_shape->m_fixedHeight ? bound_y : new_height);
|
|
||||||
if (m_shape->GetFixedWidth())
|
|
||||||
new_width = bound_x;
|
new_width = bound_x;
|
||||||
|
|
||||||
if (m_shape->GetFixedHeight())
|
if (this->GetFixedHeight())
|
||||||
new_height = bound_y;
|
new_height = bound_y;
|
||||||
|
|
||||||
controlPointDragEndWidth = new_width;
|
pt->controlPointDragEndWidth = new_width;
|
||||||
controlPointDragEndHeight = new_height;
|
pt->controlPointDragEndHeight = new_height;
|
||||||
|
|
||||||
m_shape->GetEventHandler()->OnDrawOutline(dc, m_shape->GetX(), m_shape->GetY(),
|
this->GetEventHandler()->OnDrawOutline(dc, this->GetX(), this->GetY(),
|
||||||
new_width, new_height);
|
new_width, new_height);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Don't maintain the same centre point!
|
// Don't maintain the same centre point!
|
||||||
float newX1 = wxMin(controlPointDragStartX, x);
|
float newX1 = wxMin(pt->controlPointDragStartX, x);
|
||||||
float newY1 = wxMin(controlPointDragStartY, y);
|
float newY1 = wxMin(pt->controlPointDragStartY, y);
|
||||||
float newX2 = wxMax(controlPointDragStartX, x);
|
float newX2 = wxMax(pt->controlPointDragStartX, x);
|
||||||
float newY2 = wxMax(controlPointDragStartY, y);
|
float newY2 = wxMax(pt->controlPointDragStartY, y);
|
||||||
if (m_type == CONTROL_POINT_HORIZONTAL)
|
if (pt->m_type == CONTROL_POINT_HORIZONTAL)
|
||||||
{
|
{
|
||||||
newY1 = controlPointDragStartY;
|
newY1 = pt->controlPointDragStartY;
|
||||||
newY2 = newY1 + controlPointDragStartHeight;
|
newY2 = newY1 + pt->controlPointDragStartHeight;
|
||||||
}
|
}
|
||||||
else if (m_type == CONTROL_POINT_VERTICAL)
|
else if (pt->m_type == CONTROL_POINT_VERTICAL)
|
||||||
{
|
{
|
||||||
newX1 = controlPointDragStartX;
|
newX1 = pt->controlPointDragStartX;
|
||||||
newX2 = newX1 + controlPointDragStartWidth;
|
newX2 = newX1 + pt->controlPointDragStartWidth;
|
||||||
}
|
}
|
||||||
else if (m_type == CONTROL_POINT_DIAGONAL && (keys & KEY_SHIFT))
|
else if (pt->m_type == CONTROL_POINT_DIAGONAL && (keys & KEY_SHIFT))
|
||||||
{
|
{
|
||||||
float newH = (float)((newX2 - newX1)*(controlPointDragStartHeight/controlPointDragStartWidth));
|
float newH = (float)((newX2 - newX1)*(pt->controlPointDragStartHeight/pt->controlPointDragStartWidth));
|
||||||
if (GetY() > controlPointDragStartY)
|
if (GetY() > pt->controlPointDragStartY)
|
||||||
newY2 = (float)(newY1 + newH);
|
newY2 = (float)(newY1 + newH);
|
||||||
else
|
else
|
||||||
newY1 = (float)(newY2 - newH);
|
newY1 = (float)(newY2 - newH);
|
||||||
@@ -1519,114 +1515,106 @@ void wxControlPoint::OnDragLeft(bool draw, float x, float y, int keys, int attac
|
|||||||
float newWidth = (float)(newX2 - newX1);
|
float newWidth = (float)(newX2 - newX1);
|
||||||
float newHeight = (float)(newY2 - newY1);
|
float newHeight = (float)(newY2 - newY1);
|
||||||
|
|
||||||
// m_shape->OnBeginSize(newWidth,
|
pt->controlPointDragPosX = (float)(newX1 + (newWidth/2.0));
|
||||||
// newHeight);
|
pt->controlPointDragPosY = (float)(newY1 + (newHeight/2.0));
|
||||||
|
if (this->GetFixedWidth())
|
||||||
// m_shape->SetSize(newWidth,
|
|
||||||
// newHeight);
|
|
||||||
controlPointDragPosX = (float)(newX1 + (newWidth/2.0));
|
|
||||||
controlPointDragPosY = (float)(newY1 + (newHeight/2.0));
|
|
||||||
if (m_shape->GetFixedWidth())
|
|
||||||
newWidth = bound_x;
|
newWidth = bound_x;
|
||||||
|
|
||||||
if (m_shape->GetFixedHeight())
|
if (this->GetFixedHeight())
|
||||||
newHeight = bound_y;
|
newHeight = bound_y;
|
||||||
|
|
||||||
controlPointDragEndWidth = newWidth;
|
pt->controlPointDragEndWidth = newWidth;
|
||||||
controlPointDragEndHeight = newHeight;
|
pt->controlPointDragEndHeight = newHeight;
|
||||||
m_shape->GetEventHandler()->OnDrawOutline(dc, controlPointDragPosX, controlPointDragPosY, newWidth, newHeight);
|
this->GetEventHandler()->OnDrawOutline(dc, pt->controlPointDragPosX, pt->controlPointDragPosY, newWidth, newHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxControlPoint::OnBeginDragLeft(float x, float y, int keys, int attachment)
|
void wxShape::OnSizingBeginDragLeft(wxControlPoint* pt, float x, float y, int keys, int attachment)
|
||||||
{
|
{
|
||||||
m_canvas->CaptureMouse();
|
m_canvas->CaptureMouse();
|
||||||
|
|
||||||
wxClientDC dc(GetCanvas());
|
wxClientDC dc(GetCanvas());
|
||||||
GetCanvas()->PrepareDC(dc);
|
GetCanvas()->PrepareDC(dc);
|
||||||
|
|
||||||
if (m_eraseObject)
|
if (pt->m_eraseObject)
|
||||||
m_shape->Erase(dc);
|
this->Erase(dc);
|
||||||
|
|
||||||
dc.SetLogicalFunction(wxXOR);
|
dc.SetLogicalFunction(wxXOR);
|
||||||
|
|
||||||
float bound_x;
|
float bound_x;
|
||||||
float bound_y;
|
float bound_y;
|
||||||
m_shape->GetBoundingBoxMin(&bound_x, &bound_y);
|
this->GetBoundingBoxMin(&bound_x, &bound_y);
|
||||||
|
|
||||||
// Choose the 'opposite corner' of the object as the stationary
|
// Choose the 'opposite corner' of the object as the stationary
|
||||||
// point in case this is non-centring resizing.
|
// point in case this is non-centring resizing.
|
||||||
if (GetX() < m_shape->GetX())
|
if (pt->GetX() < this->GetX())
|
||||||
controlPointDragStartX = (float)(m_shape->GetX() + (bound_x/2.0));
|
pt->controlPointDragStartX = (float)(this->GetX() + (bound_x/2.0));
|
||||||
else
|
else
|
||||||
controlPointDragStartX = (float)(m_shape->GetX() - (bound_x/2.0));
|
pt->controlPointDragStartX = (float)(this->GetX() - (bound_x/2.0));
|
||||||
|
|
||||||
if (GetY() < m_shape->GetY())
|
if (pt->GetY() < this->GetY())
|
||||||
controlPointDragStartY = (float)(m_shape->GetY() + (bound_y/2.0));
|
pt->controlPointDragStartY = (float)(this->GetY() + (bound_y/2.0));
|
||||||
else
|
else
|
||||||
controlPointDragStartY = (float)(m_shape->GetY() - (bound_y/2.0));
|
pt->controlPointDragStartY = (float)(this->GetY() - (bound_y/2.0));
|
||||||
|
|
||||||
if (m_type == CONTROL_POINT_HORIZONTAL)
|
if (pt->m_type == CONTROL_POINT_HORIZONTAL)
|
||||||
controlPointDragStartY = (float)(m_shape->GetY() - (bound_y/2.0));
|
pt->controlPointDragStartY = (float)(this->GetY() - (bound_y/2.0));
|
||||||
else if (m_type == CONTROL_POINT_VERTICAL)
|
else if (pt->m_type == CONTROL_POINT_VERTICAL)
|
||||||
controlPointDragStartX = (float)(m_shape->GetX() - (bound_x/2.0));
|
pt->controlPointDragStartX = (float)(this->GetX() - (bound_x/2.0));
|
||||||
|
|
||||||
// We may require the old width and height.
|
// We may require the old width and height.
|
||||||
controlPointDragStartWidth = bound_x;
|
pt->controlPointDragStartWidth = bound_x;
|
||||||
controlPointDragStartHeight = bound_y;
|
pt->controlPointDragStartHeight = bound_y;
|
||||||
|
|
||||||
wxPen dottedPen(wxColour(0, 0, 0), 1, wxDOT);
|
wxPen dottedPen(wxColour(0, 0, 0), 1, wxDOT);
|
||||||
dc.SetPen(dottedPen);
|
dc.SetPen(dottedPen);
|
||||||
dc.SetBrush((* wxTRANSPARENT_BRUSH));
|
dc.SetBrush((* wxTRANSPARENT_BRUSH));
|
||||||
|
|
||||||
if (m_shape->GetCentreResize())
|
if (this->GetCentreResize())
|
||||||
{
|
{
|
||||||
float new_width = (float)(2.0*fabs(x - m_shape->GetX()));
|
float new_width = (float)(2.0*fabs(x - this->GetX()));
|
||||||
float new_height = (float)(2.0*fabs(y - m_shape->GetY()));
|
float new_height = (float)(2.0*fabs(y - this->GetY()));
|
||||||
|
|
||||||
// Constrain sizing according to what control point you're dragging
|
// Constrain sizing according to what control point you're dragging
|
||||||
if (m_type == CONTROL_POINT_HORIZONTAL)
|
if (pt->m_type == CONTROL_POINT_HORIZONTAL)
|
||||||
new_height = bound_y;
|
new_height = bound_y;
|
||||||
else if (m_type == CONTROL_POINT_VERTICAL)
|
else if (pt->m_type == CONTROL_POINT_VERTICAL)
|
||||||
new_width = bound_x;
|
new_width = bound_x;
|
||||||
else if (m_type == CONTROL_POINT_DIAGONAL && (keys & KEY_SHIFT))
|
else if (pt->m_type == CONTROL_POINT_DIAGONAL && (keys & KEY_SHIFT))
|
||||||
new_height = bound_y*(new_width/bound_x);
|
new_height = bound_y*(new_width/bound_x);
|
||||||
|
|
||||||
// Non-recursive SetSize for speed
|
if (this->GetFixedWidth())
|
||||||
// m_shape->SetSize(new_width, new_height, FALSE);
|
|
||||||
|
|
||||||
if (m_shape->GetFixedWidth())
|
|
||||||
new_width = bound_x;
|
new_width = bound_x;
|
||||||
|
|
||||||
if (m_shape->GetFixedHeight())
|
if (this->GetFixedHeight())
|
||||||
new_height = bound_y;
|
new_height = bound_y;
|
||||||
|
|
||||||
controlPointDragEndWidth = new_width;
|
pt->controlPointDragEndWidth = new_width;
|
||||||
controlPointDragEndHeight = new_height;
|
pt->controlPointDragEndHeight = new_height;
|
||||||
m_shape->GetEventHandler()->OnDrawOutline(dc, m_shape->GetX(), m_shape->GetY(),
|
this->GetEventHandler()->OnDrawOutline(dc, this->GetX(), this->GetY(),
|
||||||
new_width, new_height);
|
new_width, new_height);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Don't maintain the same centre point!
|
// Don't maintain the same centre point!
|
||||||
float newX1 = wxMin(controlPointDragStartX, x);
|
float newX1 = wxMin(pt->controlPointDragStartX, x);
|
||||||
float newY1 = wxMin(controlPointDragStartY, y);
|
float newY1 = wxMin(pt->controlPointDragStartY, y);
|
||||||
float newX2 = wxMax(controlPointDragStartX, x);
|
float newX2 = wxMax(pt->controlPointDragStartX, x);
|
||||||
float newY2 = wxMax(controlPointDragStartY, y);
|
float newY2 = wxMax(pt->controlPointDragStartY, y);
|
||||||
if (m_type == CONTROL_POINT_HORIZONTAL)
|
if (pt->m_type == CONTROL_POINT_HORIZONTAL)
|
||||||
{
|
{
|
||||||
newY1 = controlPointDragStartY;
|
newY1 = pt->controlPointDragStartY;
|
||||||
newY2 = newY1 + controlPointDragStartHeight;
|
newY2 = newY1 + pt->controlPointDragStartHeight;
|
||||||
}
|
}
|
||||||
else if (m_type == CONTROL_POINT_VERTICAL)
|
else if (pt->m_type == CONTROL_POINT_VERTICAL)
|
||||||
{
|
{
|
||||||
newX1 = controlPointDragStartX;
|
newX1 = pt->controlPointDragStartX;
|
||||||
newX2 = newX1 + controlPointDragStartWidth;
|
newX2 = newX1 + pt->controlPointDragStartWidth;
|
||||||
}
|
}
|
||||||
else if (m_type == CONTROL_POINT_DIAGONAL && (keys & KEY_SHIFT))
|
else if (pt->m_type == CONTROL_POINT_DIAGONAL && (keys & KEY_SHIFT))
|
||||||
{
|
{
|
||||||
float newH = (float)((newX2 - newX1)*(controlPointDragStartHeight/controlPointDragStartWidth));
|
float newH = (float)((newX2 - newX1)*(pt->controlPointDragStartHeight/pt->controlPointDragStartWidth));
|
||||||
if (GetY() > controlPointDragStartY)
|
if (pt->GetY() > pt->controlPointDragStartY)
|
||||||
newY2 = (float)(newY1 + newH);
|
newY2 = (float)(newY1 + newH);
|
||||||
else
|
else
|
||||||
newY1 = (float)(newY2 - newH);
|
newY1 = (float)(newY2 - newH);
|
||||||
@@ -1634,51 +1622,46 @@ void wxControlPoint::OnBeginDragLeft(float x, float y, int keys, int attachment)
|
|||||||
float newWidth = (float)(newX2 - newX1);
|
float newWidth = (float)(newX2 - newX1);
|
||||||
float newHeight = (float)(newY2 - newY1);
|
float newHeight = (float)(newY2 - newY1);
|
||||||
|
|
||||||
// m_shape->OnBeginSize(newWidth,
|
pt->controlPointDragPosX = (float)(newX1 + (newWidth/2.0));
|
||||||
// newHeight);
|
pt->controlPointDragPosY = (float)(newY1 + (newHeight/2.0));
|
||||||
|
if (this->GetFixedWidth())
|
||||||
// m_shape->SetSize(newWidth,
|
|
||||||
// newHeight);
|
|
||||||
controlPointDragPosX = (float)(newX1 + (newWidth/2.0));
|
|
||||||
controlPointDragPosY = (float)(newY1 + (newHeight/2.0));
|
|
||||||
if (m_shape->GetFixedWidth())
|
|
||||||
newWidth = bound_x;
|
newWidth = bound_x;
|
||||||
|
|
||||||
if (m_shape->GetFixedHeight())
|
if (this->GetFixedHeight())
|
||||||
newHeight = bound_y;
|
newHeight = bound_y;
|
||||||
|
|
||||||
controlPointDragEndWidth = newWidth;
|
pt->controlPointDragEndWidth = newWidth;
|
||||||
controlPointDragEndHeight = newHeight;
|
pt->controlPointDragEndHeight = newHeight;
|
||||||
m_shape->GetEventHandler()->OnDrawOutline(dc, controlPointDragPosX, controlPointDragPosY, newWidth, newHeight);
|
this->GetEventHandler()->OnDrawOutline(dc, pt->controlPointDragPosX, pt->controlPointDragPosY, newWidth, newHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxControlPoint::OnEndDragLeft(float x, float y, int keys, int attachment)
|
void wxShape::OnSizingEndDragLeft(wxControlPoint* pt, float x, float y, int keys, int attachment)
|
||||||
{
|
{
|
||||||
wxClientDC dc(GetCanvas());
|
wxClientDC dc(GetCanvas());
|
||||||
GetCanvas()->PrepareDC(dc);
|
GetCanvas()->PrepareDC(dc);
|
||||||
|
|
||||||
m_canvas->ReleaseMouse();
|
m_canvas->ReleaseMouse();
|
||||||
dc.SetLogicalFunction(wxCOPY);
|
dc.SetLogicalFunction(wxCOPY);
|
||||||
m_shape->Recompute();
|
this->Recompute();
|
||||||
m_shape->ResetControlPoints();
|
this->ResetControlPoints();
|
||||||
|
|
||||||
if (!m_eraseObject)
|
if (!pt->m_eraseObject)
|
||||||
m_shape->Show(FALSE);
|
this->Show(FALSE);
|
||||||
|
|
||||||
m_shape->SetSize(controlPointDragEndWidth, controlPointDragEndHeight);
|
this->SetSize(pt->controlPointDragEndWidth, pt->controlPointDragEndHeight);
|
||||||
|
|
||||||
// The next operation could destroy this control point (it does for label objects,
|
// 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
|
// via formatting the text), so save all values we're going to use, or
|
||||||
// we'll be accessing garbage.
|
// we'll be accessing garbage.
|
||||||
wxShape *theObject = m_shape;
|
wxShape *theObject = this;
|
||||||
wxShapeCanvas *theCanvas = m_canvas;
|
wxShapeCanvas *theCanvas = m_canvas;
|
||||||
bool eraseIt = m_eraseObject;
|
bool eraseIt = pt->m_eraseObject;
|
||||||
|
|
||||||
if (theObject->GetCentreResize())
|
if (theObject->GetCentreResize())
|
||||||
theObject->Move(dc, theObject->GetX(), theObject->GetY());
|
theObject->Move(dc, theObject->GetX(), theObject->GetY());
|
||||||
else
|
else
|
||||||
theObject->Move(dc, controlPointDragPosX, controlPointDragPosY);
|
theObject->Move(dc, pt->controlPointDragPosX, pt->controlPointDragPosY);
|
||||||
|
|
||||||
if (!eraseIt)
|
if (!eraseIt)
|
||||||
theObject->Show(TRUE);
|
theObject->Show(TRUE);
|
||||||
@@ -1694,17 +1677,6 @@ void wxControlPoint::OnEndDragLeft(float x, float y, int keys, int attachment)
|
|||||||
if (!theCanvas->GetQuickEditMode() && eraseIt) theCanvas->Redraw(dc);
|
if (!theCanvas->GetQuickEditMode() && eraseIt) theCanvas->Redraw(dc);
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxControlPoint::GetNumberOfAttachments()
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wxControlPoint::GetAttachmentPosition(int attachment, float *x, float *y,
|
|
||||||
int nth, int no_arcs, wxLineShape *line)
|
|
||||||
{
|
|
||||||
*x = m_xpos; *y = m_ypos;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Polygon control points
|
// Polygon control points
|
||||||
@@ -1716,6 +1688,7 @@ wxPolygonControlPoint::wxPolygonControlPoint(wxShapeCanvas *theCanvas, wxShape *
|
|||||||
wxControlPoint(theCanvas, object, size, the_xoffset, the_yoffset, 0)
|
wxControlPoint(theCanvas, object, size, the_xoffset, the_yoffset, 0)
|
||||||
{
|
{
|
||||||
m_polygonVertex = vertex;
|
m_polygonVertex = vertex;
|
||||||
|
m_originalDistance = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxPolygonControlPoint::~wxPolygonControlPoint()
|
wxPolygonControlPoint::~wxPolygonControlPoint()
|
||||||
@@ -1725,71 +1698,92 @@ wxPolygonControlPoint::~wxPolygonControlPoint()
|
|||||||
// Implement resizing polygon or moving the vertex.
|
// Implement resizing polygon or moving the vertex.
|
||||||
void wxPolygonControlPoint::OnDragLeft(bool draw, float x, float y, int keys, int attachment)
|
void wxPolygonControlPoint::OnDragLeft(bool draw, float x, float y, int keys, int attachment)
|
||||||
{
|
{
|
||||||
wxClientDC dc(GetCanvas());
|
m_shape->GetEventHandler()->OnSizingDragLeft(this, draw, x, y, keys, attachment);
|
||||||
GetCanvas()->PrepareDC(dc);
|
|
||||||
|
|
||||||
dc.SetLogicalFunction(wxXOR);
|
|
||||||
|
|
||||||
wxPen dottedPen(wxColour(0, 0, 0), 1, wxDOT);
|
|
||||||
dc.SetPen(dottedPen);
|
|
||||||
dc.SetBrush((* wxTRANSPARENT_BRUSH));
|
|
||||||
|
|
||||||
float bound_x;
|
|
||||||
float bound_y;
|
|
||||||
m_shape->GetBoundingBoxMin(&bound_x, &bound_y);
|
|
||||||
/*
|
|
||||||
float new_width = (float)(2.0*fabs(x - m_shape->GetX()));
|
|
||||||
float new_height = (float)(2.0*fabs(y - m_shape->GetY()));
|
|
||||||
*/
|
|
||||||
float dist = (float)sqrt((x - m_shape->GetX())*(x - m_shape->GetX()) +
|
|
||||||
(y - m_shape->GetY())*(y - m_shape->GetY()));
|
|
||||||
|
|
||||||
if (keys & KEY_CTRL)
|
|
||||||
{
|
|
||||||
m_canvas->Snap(&x, &y);
|
|
||||||
|
|
||||||
// Move point
|
|
||||||
m_polygonVertex->x = x - m_shape->GetX();
|
|
||||||
m_polygonVertex->y = y - m_shape->GetY();
|
|
||||||
m_xpos = x;
|
|
||||||
m_xpos = y;
|
|
||||||
((wxPolygonShape *)m_shape)->CalculateBoundingBox();
|
|
||||||
((wxPolygonShape *)m_shape)->CalculatePolygonCentre();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
float new_width = (float)(dist/m_originalDistance)*m_originalSize.x;
|
|
||||||
float new_height = (float)(dist/m_originalDistance)*m_originalSize.y;
|
|
||||||
|
|
||||||
// Non-recursive SetSize for speed
|
|
||||||
m_shape->SetSize(new_width, new_height, FALSE);
|
|
||||||
}
|
|
||||||
float w, h;
|
|
||||||
m_shape->GetBoundingBoxMax(&w, &h);
|
|
||||||
m_shape->GetEventHandler()->OnDrawOutline(dc, m_shape->GetX(), m_shape->GetY(), w, h);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxPolygonControlPoint::OnBeginDragLeft(float x, float y, int keys, int attachment)
|
void wxPolygonControlPoint::OnBeginDragLeft(float x, float y, int keys, int attachment)
|
||||||
{
|
{
|
||||||
|
m_shape->GetEventHandler()->OnSizingBeginDragLeft(this, x, y, keys, attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPolygonControlPoint::OnEndDragLeft(float x, float y, int keys, int attachment)
|
||||||
|
{
|
||||||
|
m_shape->GetEventHandler()->OnSizingEndDragLeft(this, x, y, keys, attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Control points ('handles') redirect control to the actual shape, to make it easier
|
||||||
|
// to override sizing behaviour.
|
||||||
|
void wxPolygonShape::OnSizingDragLeft(wxControlPoint* pt, bool draw, float x, float y, int keys, int attachment)
|
||||||
|
{
|
||||||
|
wxPolygonControlPoint* ppt = (wxPolygonControlPoint*) pt;
|
||||||
|
|
||||||
wxClientDC dc(GetCanvas());
|
wxClientDC dc(GetCanvas());
|
||||||
GetCanvas()->PrepareDC(dc);
|
GetCanvas()->PrepareDC(dc);
|
||||||
|
|
||||||
m_shape->Erase(dc);
|
dc.SetLogicalFunction(wxXOR);
|
||||||
|
|
||||||
|
wxPen dottedPen(wxColour(0, 0, 0), 1, wxDOT);
|
||||||
|
dc.SetPen(dottedPen);
|
||||||
|
dc.SetBrush((* wxTRANSPARENT_BRUSH));
|
||||||
|
|
||||||
|
float bound_x;
|
||||||
|
float bound_y;
|
||||||
|
this->GetBoundingBoxMin(&bound_x, &bound_y);
|
||||||
|
/*
|
||||||
|
float new_width = (float)(2.0*fabs(x - this->GetX()));
|
||||||
|
float new_height = (float)(2.0*fabs(y - this->GetY()));
|
||||||
|
*/
|
||||||
|
float dist = (float)sqrt((x - this->GetX())*(x - this->GetX()) +
|
||||||
|
(y - this->GetY())*(y - this->GetY()));
|
||||||
|
|
||||||
|
if (keys & KEY_CTRL)
|
||||||
|
{
|
||||||
|
m_canvas->Snap(&x, &y);
|
||||||
|
|
||||||
|
// Move point
|
||||||
|
ppt->m_polygonVertex->x = x - this->GetX();
|
||||||
|
ppt->m_polygonVertex->y = y - this->GetY();
|
||||||
|
ppt->SetX(x);
|
||||||
|
ppt->SetY(y);
|
||||||
|
((wxPolygonShape *)this)->CalculateBoundingBox();
|
||||||
|
((wxPolygonShape *)this)->CalculatePolygonCentre();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float new_width = (float)(dist/ppt->m_originalDistance)*ppt->m_originalSize.x;
|
||||||
|
float new_height = (float)(dist/ppt->m_originalDistance)*ppt->m_originalSize.y;
|
||||||
|
|
||||||
|
// Non-recursive SetSize for speed
|
||||||
|
this->SetSize(new_width, new_height, FALSE);
|
||||||
|
}
|
||||||
|
float w, h;
|
||||||
|
this->GetBoundingBoxMax(&w, &h);
|
||||||
|
this->GetEventHandler()->OnDrawOutline(dc, this->GetX(), this->GetY(), w, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPolygonShape::OnSizingBeginDragLeft(wxControlPoint* pt, float x, float y, int keys, int attachment)
|
||||||
|
{
|
||||||
|
wxPolygonControlPoint* ppt = (wxPolygonControlPoint*) pt;
|
||||||
|
|
||||||
|
wxClientDC dc(GetCanvas());
|
||||||
|
GetCanvas()->PrepareDC(dc);
|
||||||
|
|
||||||
|
this->Erase(dc);
|
||||||
|
|
||||||
dc.SetLogicalFunction(wxXOR);
|
dc.SetLogicalFunction(wxXOR);
|
||||||
|
|
||||||
float bound_x;
|
float bound_x;
|
||||||
float bound_y;
|
float bound_y;
|
||||||
m_shape->GetBoundingBoxMin(&bound_x, &bound_y);
|
this->GetBoundingBoxMin(&bound_x, &bound_y);
|
||||||
|
|
||||||
float dist = (float)sqrt((x - m_shape->GetX())*(x - m_shape->GetX()) +
|
float dist = (float)sqrt((x - this->GetX())*(x - this->GetX()) +
|
||||||
(y - m_shape->GetY())*(y - m_shape->GetY()));
|
(y - this->GetY())*(y - this->GetY()));
|
||||||
|
|
||||||
m_originalDistance = dist;
|
ppt->m_originalDistance = dist;
|
||||||
m_originalSize.x = bound_x;
|
ppt->m_originalSize.x = bound_x;
|
||||||
m_originalSize.y = bound_y;
|
ppt->m_originalSize.y = bound_y;
|
||||||
|
|
||||||
if (m_originalDistance == 0.0) m_originalDistance = (float) 0.0001;
|
if (ppt->m_originalDistance == 0.0) ppt->m_originalDistance = (float) 0.0001;
|
||||||
|
|
||||||
wxPen dottedPen(wxColour(0, 0, 0), 1, wxDOT);
|
wxPen dottedPen(wxColour(0, 0, 0), 1, wxDOT);
|
||||||
dc.SetPen(dottedPen);
|
dc.SetPen(dottedPen);
|
||||||
@@ -1800,30 +1794,30 @@ void wxPolygonControlPoint::OnBeginDragLeft(float x, float y, int keys, int atta
|
|||||||
m_canvas->Snap(&x, &y);
|
m_canvas->Snap(&x, &y);
|
||||||
|
|
||||||
// Move point
|
// Move point
|
||||||
m_polygonVertex->x = x - m_shape->GetX();
|
ppt->m_polygonVertex->x = x - this->GetX();
|
||||||
m_polygonVertex->y = y - m_shape->GetY();
|
ppt->m_polygonVertex->y = y - this->GetY();
|
||||||
m_xpos = x;
|
ppt->SetX(x);
|
||||||
m_xpos = y;
|
ppt->SetY(y);
|
||||||
((wxPolygonShape *)m_shape)->CalculateBoundingBox();
|
((wxPolygonShape *)this)->CalculateBoundingBox();
|
||||||
((wxPolygonShape *)m_shape)->CalculatePolygonCentre();
|
((wxPolygonShape *)this)->CalculatePolygonCentre();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
float new_width = (float)(dist/m_originalDistance)*m_originalSize.x;
|
float new_width = (float)(dist/ppt->m_originalDistance)*ppt->m_originalSize.x;
|
||||||
float new_height = (float)(dist/m_originalDistance)*m_originalSize.y;
|
float new_height = (float)(dist/ppt->m_originalDistance)*ppt->m_originalSize.y;
|
||||||
|
|
||||||
// Non-recursive SetSize for speed
|
// Non-recursive SetSize for speed
|
||||||
m_shape->SetSize(new_width, new_height, FALSE);
|
this->SetSize(new_width, new_height, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
float w, h;
|
float w, h;
|
||||||
m_shape->GetBoundingBoxMax(&w, &h);
|
this->GetBoundingBoxMax(&w, &h);
|
||||||
m_shape->GetEventHandler()->OnDrawOutline(dc, m_shape->GetX(), m_shape->GetY(), w, h);
|
this->GetEventHandler()->OnDrawOutline(dc, this->GetX(), this->GetY(), w, h);
|
||||||
|
|
||||||
m_canvas->CaptureMouse();
|
m_canvas->CaptureMouse();
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxPolygonControlPoint::OnEndDragLeft(float x, float y, int keys, int attachment)
|
void wxPolygonShape::OnSizingEndDragLeft(wxControlPoint* pt, float x, float y, int keys, int attachment)
|
||||||
{
|
{
|
||||||
wxClientDC dc(GetCanvas());
|
wxClientDC dc(GetCanvas());
|
||||||
GetCanvas()->PrepareDC(dc);
|
GetCanvas()->PrepareDC(dc);
|
||||||
@@ -1834,20 +1828,19 @@ void wxPolygonControlPoint::OnEndDragLeft(float x, float y, int keys, int attach
|
|||||||
// If we're changing shape, must reset the original points
|
// If we're changing shape, must reset the original points
|
||||||
if (keys & KEY_CTRL)
|
if (keys & KEY_CTRL)
|
||||||
{
|
{
|
||||||
((wxPolygonShape *)m_shape)->CalculateBoundingBox();
|
((wxPolygonShape *)this)->CalculateBoundingBox();
|
||||||
((wxPolygonShape *)m_shape)->UpdateOriginalPoints();
|
((wxPolygonShape *)this)->UpdateOriginalPoints();
|
||||||
}
|
}
|
||||||
|
|
||||||
((wxPolygonShape *)m_shape)->CalculateBoundingBox();
|
((wxPolygonShape *)this)->CalculateBoundingBox();
|
||||||
((wxPolygonShape *)m_shape)->CalculatePolygonCentre();
|
((wxPolygonShape *)this)->CalculatePolygonCentre();
|
||||||
|
|
||||||
m_shape->Recompute();
|
this->Recompute();
|
||||||
m_shape->ResetControlPoints();
|
this->ResetControlPoints();
|
||||||
m_shape->Move(dc, m_shape->GetX(), m_shape->GetY());
|
this->Move(dc, this->GetX(), this->GetY());
|
||||||
if (!m_canvas->GetQuickEditMode()) m_canvas->Redraw(dc);
|
if (!m_canvas->GetQuickEditMode()) m_canvas->Redraw(dc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Object region
|
* Object region
|
||||||
*
|
*
|
||||||
|
@@ -40,10 +40,14 @@ protected:
|
|||||||
float m_y;
|
float m_y;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class wxShape;
|
||||||
class wxControlPoint: public wxRectangleShape
|
class wxControlPoint: public wxRectangleShape
|
||||||
{
|
{
|
||||||
DECLARE_DYNAMIC_CLASS(wxControlPoint)
|
DECLARE_DYNAMIC_CLASS(wxControlPoint)
|
||||||
|
|
||||||
|
friend class wxShapeEvtHandler;
|
||||||
|
friend class wxShape;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
wxControlPoint(wxShapeCanvas *the_canvas = NULL, wxShape *object = NULL, float size = 0.0, float the_xoffset = 0.0,
|
wxControlPoint(wxShapeCanvas *the_canvas = NULL, wxShape *object = NULL, float size = 0.0, float the_xoffset = 0.0,
|
||||||
float the_yoffset = 0.0, int the_type = 0);
|
float the_yoffset = 0.0, int the_type = 0);
|
||||||
@@ -70,12 +74,25 @@ public:
|
|||||||
wxCursor* m_oldCursor;
|
wxCursor* m_oldCursor;
|
||||||
bool m_eraseObject; // If TRUE, erases object before dragging handle.
|
bool m_eraseObject; // If TRUE, erases object before dragging handle.
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Store original top-left, bottom-right coordinates
|
||||||
|
* in case we're doing non-vertical resizing.
|
||||||
|
*/
|
||||||
|
static float controlPointDragStartX;
|
||||||
|
static float controlPointDragStartY;
|
||||||
|
static float controlPointDragStartWidth;
|
||||||
|
static float controlPointDragStartHeight;
|
||||||
|
static float controlPointDragEndWidth;
|
||||||
|
static float controlPointDragEndHeight;
|
||||||
|
static float controlPointDragPosX;
|
||||||
|
static float controlPointDragPosY;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class wxPolygonShape;
|
||||||
class wxPolygonControlPoint: public wxControlPoint
|
class wxPolygonControlPoint: public wxControlPoint
|
||||||
{
|
{
|
||||||
DECLARE_DYNAMIC_CLASS(wxPolygonControlPoint)
|
DECLARE_DYNAMIC_CLASS(wxPolygonControlPoint)
|
||||||
|
friend class wxPolygonShape;
|
||||||
public:
|
public:
|
||||||
wxPolygonControlPoint(wxShapeCanvas *the_canvas = NULL, wxShape *object = NULL, float size = 0.0, wxRealPoint *vertex = NULL,
|
wxPolygonControlPoint(wxShapeCanvas *the_canvas = NULL, wxShape *object = NULL, float size = 0.0, wxRealPoint *vertex = NULL,
|
||||||
float the_xoffset = 0.0, float the_yoffset = 0.0);
|
float the_xoffset = 0.0, float the_yoffset = 0.0);
|
||||||
|
@@ -101,19 +101,16 @@ void wxBitmapShape::ReadPrologAttributes(wxExpr *clause)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Does the copying for this object
|
// Does the copying for this object
|
||||||
void wxBitmapShape::Copy(wxBitmapShape& copy)
|
void wxBitmapShape::Copy(wxShape& copy)
|
||||||
{
|
{
|
||||||
wxRectangleShape::Copy(copy);
|
wxRectangleShape::Copy(copy);
|
||||||
copy.m_bitmap = m_bitmap;
|
|
||||||
copy.SetFilename(m_filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns a new instance, and does the copy for this class. Define for each class.
|
wxASSERT( copy.IsKindOf(CLASSINFO(wxBitmapShape)) ) ;
|
||||||
wxShape *wxBitmapShape::PrivateCopy()
|
|
||||||
{
|
wxBitmapShape& bitmapCopy = (wxBitmapShape&) copy;
|
||||||
wxBitmapShape *obj = new wxBitmapShape;
|
|
||||||
Copy(*obj);
|
bitmapCopy.m_bitmap = m_bitmap;
|
||||||
return obj;
|
bitmapCopy.SetFilename(m_filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxBitmapShape::SetBitmap(const wxBitmap& bm)
|
void wxBitmapShape::SetBitmap(const wxBitmap& bm)
|
||||||
|
@@ -35,10 +35,7 @@ class wxBitmapShape: public wxRectangleShape
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Does the copying for this object
|
// Does the copying for this object
|
||||||
void Copy(wxBitmapShape& copy);
|
void Copy(wxShape& copy);
|
||||||
|
|
||||||
// Returns a new instance, and does the copy for this class. Define for each class.
|
|
||||||
wxShape *PrivateCopy();
|
|
||||||
|
|
||||||
void SetSize(float w, float h, bool recursive = TRUE);
|
void SetSize(float w, float h, bool recursive = TRUE);
|
||||||
inline wxBitmap& GetBitmap() const { return (wxBitmap&) m_bitmap; }
|
inline wxBitmap& GetBitmap() const { return (wxBitmap&) m_bitmap; }
|
||||||
|
@@ -360,28 +360,32 @@ void wxCompositeShape::RemoveChildFromConstraints(wxShape *child)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxCompositeShape::Copy(wxCompositeShape& copy)
|
void wxCompositeShape::Copy(wxShape& copy)
|
||||||
{
|
{
|
||||||
wxRectangleShape::Copy(copy);
|
wxRectangleShape::Copy(copy);
|
||||||
|
|
||||||
// Associate old and new copies for copying constraints and division geometry
|
wxASSERT( copy.IsKindOf(CLASSINFO(wxCompositeShape)) ) ;
|
||||||
wxObjectCopyMapping.Append((long)this, ©);
|
|
||||||
|
wxCompositeShape& compositeCopy = (wxCompositeShape&) copy;
|
||||||
|
|
||||||
|
// Associate old and new copies for compositeCopying constraints and division geometry
|
||||||
|
wxObjectCopyMapping.Append((long)this, &compositeCopy);
|
||||||
|
|
||||||
// Copy the children
|
// Copy the children
|
||||||
wxNode *node = m_children.First();
|
wxNode *node = m_children.First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxShape *object = (wxShape *)node->Data();
|
wxShape *object = (wxShape *)node->Data();
|
||||||
wxShape *newObject = object->PrivateCopy();
|
wxShape *newObject = object->CreateNewCopy(FALSE, FALSE);
|
||||||
if (newObject->GetId() == 0)
|
if (newObject->GetId() == 0)
|
||||||
newObject->SetId(NewId());
|
newObject->SetId(NewId());
|
||||||
|
|
||||||
newObject->SetParent(©);
|
newObject->SetParent(&compositeCopy);
|
||||||
copy.m_children.Append(newObject);
|
compositeCopy.m_children.Append(newObject);
|
||||||
|
|
||||||
// Some m_children may be divisions
|
// Some m_children may be divisions
|
||||||
if (m_divisions.Member(object))
|
if (m_divisions.Member(object))
|
||||||
copy.m_divisions.Append(newObject);
|
compositeCopy.m_divisions.Append(newObject);
|
||||||
|
|
||||||
wxObjectCopyMapping.Append((long)object, newObject);
|
wxObjectCopyMapping.Append((long)object, newObject);
|
||||||
|
|
||||||
@@ -414,12 +418,12 @@ void wxCompositeShape::Copy(wxCompositeShape& copy)
|
|||||||
newConstraint->m_constraintName = constraint->m_constraintName;
|
newConstraint->m_constraintName = constraint->m_constraintName;
|
||||||
}
|
}
|
||||||
newConstraint->SetSpacing(constraint->m_xSpacing, constraint->m_ySpacing);
|
newConstraint->SetSpacing(constraint->m_xSpacing, constraint->m_ySpacing);
|
||||||
copy.m_constraints.Append(newConstraint);
|
compositeCopy.m_constraints.Append(newConstraint);
|
||||||
|
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now copy the division geometry
|
// Now compositeCopy the division geometry
|
||||||
node = m_divisions.First();
|
node = m_divisions.First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
@@ -453,13 +457,6 @@ void wxCompositeShape::Copy(wxCompositeShape& copy)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wxShape *wxCompositeShape::PrivateCopy()
|
|
||||||
{
|
|
||||||
wxCompositeShape *obj = new wxCompositeShape;
|
|
||||||
Copy(*obj);
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
OGLConstraint *wxCompositeShape::AddConstraint(OGLConstraint *constraint)
|
OGLConstraint *wxCompositeShape::AddConstraint(OGLConstraint *constraint)
|
||||||
{
|
{
|
||||||
m_constraints.Append(constraint);
|
m_constraints.Append(constraint);
|
||||||
@@ -971,29 +968,26 @@ void wxDivisionShape::CalculateSize()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxDivisionShape::Copy(wxDivisionShape& copy)
|
void wxDivisionShape::Copy(wxShape& copy)
|
||||||
{
|
{
|
||||||
wxCompositeShape::Copy(copy);
|
wxCompositeShape::Copy(copy);
|
||||||
|
|
||||||
copy.m_leftSideStyle = m_leftSideStyle;
|
wxASSERT( copy.IsKindOf(CLASSINFO(wxDivisionShape)) ) ;
|
||||||
copy.m_topSideStyle = m_topSideStyle;
|
|
||||||
copy.m_leftSideColour = m_leftSideColour;
|
|
||||||
copy.m_topSideColour = m_topSideColour;
|
|
||||||
|
|
||||||
copy.m_leftSidePen = m_leftSidePen;
|
wxDivisionShape& divisionCopy = (wxDivisionShape&) copy;
|
||||||
copy.m_topSidePen = m_topSidePen;
|
|
||||||
copy.m_handleSide = m_handleSide;
|
divisionCopy.m_leftSideStyle = m_leftSideStyle;
|
||||||
|
divisionCopy.m_topSideStyle = m_topSideStyle;
|
||||||
|
divisionCopy.m_leftSideColour = m_leftSideColour;
|
||||||
|
divisionCopy.m_topSideColour = m_topSideColour;
|
||||||
|
|
||||||
|
divisionCopy.m_leftSidePen = m_leftSidePen;
|
||||||
|
divisionCopy.m_topSidePen = m_topSidePen;
|
||||||
|
divisionCopy.m_handleSide = m_handleSide;
|
||||||
|
|
||||||
// Division geometry copying is handled at the wxCompositeShape level.
|
// Division geometry copying is handled at the wxCompositeShape level.
|
||||||
}
|
}
|
||||||
|
|
||||||
wxShape *wxDivisionShape::PrivateCopy()
|
|
||||||
{
|
|
||||||
wxDivisionShape *obj = new wxDivisionShape;
|
|
||||||
Copy(*obj);
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef PROLOGIO
|
#ifdef PROLOGIO
|
||||||
void wxDivisionShape::WritePrologAttributes(wxExpr *clause)
|
void wxDivisionShape::WritePrologAttributes(wxExpr *clause)
|
||||||
{
|
{
|
||||||
|
@@ -85,8 +85,7 @@ public:
|
|||||||
void ReadConstraints(wxExpr *clause, wxExprDatabase *database);
|
void ReadConstraints(wxExpr *clause, wxExprDatabase *database);
|
||||||
#endif
|
#endif
|
||||||
// Does the copying for this object
|
// Does the copying for this object
|
||||||
void Copy(wxCompositeShape& copy);
|
void Copy(wxShape& copy);
|
||||||
wxShape *PrivateCopy();
|
|
||||||
|
|
||||||
virtual wxDivisionShape *OnCreateDivision();
|
virtual wxDivisionShape *OnCreateDivision();
|
||||||
|
|
||||||
@@ -160,8 +159,7 @@ class wxDivisionShape: public wxCompositeShape
|
|||||||
void ReadPrologAttributes(wxExpr *clause);
|
void ReadPrologAttributes(wxExpr *clause);
|
||||||
#endif
|
#endif
|
||||||
// Does the copying for this object
|
// Does the copying for this object
|
||||||
void Copy(wxDivisionShape& copy);
|
void Copy(wxShape& copy);
|
||||||
wxShape *PrivateCopy();
|
|
||||||
|
|
||||||
// Divide horizontally (wxHORIZONTAL) or vertically (wxVERTICAL)
|
// Divide horizontally (wxHORIZONTAL) or vertically (wxVERTICAL)
|
||||||
bool Divide(int direction);
|
bool Divide(int direction);
|
||||||
|
@@ -336,18 +336,11 @@ bool wxDividedShape::AttachmentIsValid(int attachment)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxDividedShape::Copy(wxDividedShape& copy)
|
void wxDividedShape::Copy(wxShape& copy)
|
||||||
{
|
{
|
||||||
wxRectangleShape::Copy(copy);
|
wxRectangleShape::Copy(copy);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxShape *wxDividedShape::PrivateCopy()
|
|
||||||
{
|
|
||||||
wxDividedShape *obj = new wxDividedShape(m_width, m_height);
|
|
||||||
Copy(*obj);
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Region operations
|
// Region operations
|
||||||
|
|
||||||
void wxDividedShape::MakeControlPoints()
|
void wxDividedShape::MakeControlPoints()
|
||||||
|
@@ -52,8 +52,7 @@ class wxDividedShape: public wxRectangleShape
|
|||||||
void ReadPrologAttributes(wxExpr *clause);
|
void ReadPrologAttributes(wxExpr *clause);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void Copy(wxDividedShape ©);
|
void Copy(wxShape ©);
|
||||||
wxShape *PrivateCopy();
|
|
||||||
|
|
||||||
// Set all region sizes according to proportions and
|
// Set all region sizes according to proportions and
|
||||||
// this object total size
|
// this object total size
|
||||||
|
@@ -162,19 +162,16 @@ void wxDrawnShape::ReadPrologAttributes(wxExpr *clause)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Does the copying for this object
|
// Does the copying for this object
|
||||||
void wxDrawnShape::Copy(wxDrawnShape& copy)
|
void wxDrawnShape::Copy(wxShape& copy)
|
||||||
{
|
{
|
||||||
wxRectangleShape::Copy(copy);
|
wxRectangleShape::Copy(copy);
|
||||||
m_metafile.Copy(copy.m_metafile);
|
|
||||||
copy.m_saveToFile = m_saveToFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns a new instance, and does the copy for this class. Define for each class.
|
wxASSERT( copy.IsKindOf(CLASSINFO(wxDrawnShape)) ) ;
|
||||||
wxShape *wxDrawnShape::PrivateCopy()
|
|
||||||
{
|
wxDrawnShape& drawnCopy = (wxDrawnShape&) copy;
|
||||||
wxDrawnShape *obj = new wxDrawnShape;
|
|
||||||
Copy(*obj);
|
m_metafile.Copy(drawnCopy.m_metafile);
|
||||||
return obj;
|
drawnCopy.m_saveToFile = m_saveToFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxDrawnShape::LoadFromMetaFile(char *filename)
|
bool wxDrawnShape::LoadFromMetaFile(char *filename)
|
||||||
|
@@ -86,10 +86,7 @@ class wxDrawnShape: public wxRectangleShape
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Does the copying for this object
|
// Does the copying for this object
|
||||||
void Copy(wxDrawnShape& copy);
|
void Copy(wxShape& copy);
|
||||||
|
|
||||||
// Returns a new instance, and does the copy for this class. Define for each class.
|
|
||||||
wxShape *PrivateCopy();
|
|
||||||
|
|
||||||
void Scale(float sx, float sy);
|
void Scale(float sx, float sy);
|
||||||
void Translate(float x, float y);
|
void Translate(float x, float y);
|
||||||
|
@@ -1589,66 +1589,63 @@ void wxLineShape::ReadPrologAttributes(wxExpr *clause)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void wxLineShape::Copy(wxLineShape& copy)
|
void wxLineShape::Copy(wxShape& copy)
|
||||||
{
|
{
|
||||||
wxShape::Copy(copy);
|
wxShape::Copy(copy);
|
||||||
|
|
||||||
copy.m_isSpline = m_isSpline;
|
wxASSERT( copy.IsKindOf(CLASSINFO(wxLineShape)) );
|
||||||
copy.m_alignmentStart = m_alignmentStart;
|
|
||||||
copy.m_alignmentEnd = m_alignmentEnd;
|
wxLineShape& lineCopy = (wxLineShape&) copy;
|
||||||
copy.m_maintainStraightLines = m_maintainStraightLines;
|
|
||||||
copy.m_lineOrientations.Clear();
|
lineCopy.m_isSpline = m_isSpline;
|
||||||
|
lineCopy.m_alignmentStart = m_alignmentStart;
|
||||||
|
lineCopy.m_alignmentEnd = m_alignmentEnd;
|
||||||
|
lineCopy.m_maintainStraightLines = m_maintainStraightLines;
|
||||||
|
lineCopy.m_lineOrientations.Clear();
|
||||||
wxNode *node = m_lineOrientations.First();
|
wxNode *node = m_lineOrientations.First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
copy.m_lineOrientations.Append(node->Data());
|
lineCopy.m_lineOrientations.Append(node->Data());
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (copy.m_lineControlPoints)
|
if (lineCopy.m_lineControlPoints)
|
||||||
{
|
{
|
||||||
ClearPointList(*copy.m_lineControlPoints);
|
ClearPointList(*lineCopy.m_lineControlPoints);
|
||||||
delete copy.m_lineControlPoints;
|
delete lineCopy.m_lineControlPoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
copy.m_lineControlPoints = new wxList;
|
lineCopy.m_lineControlPoints = new wxList;
|
||||||
|
|
||||||
node = m_lineControlPoints->First();
|
node = m_lineControlPoints->First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxRealPoint *point = (wxRealPoint *)node->Data();
|
wxRealPoint *point = (wxRealPoint *)node->Data();
|
||||||
wxRealPoint *new_point = new wxRealPoint(point->x, point->y);
|
wxRealPoint *new_point = new wxRealPoint(point->x, point->y);
|
||||||
copy.m_lineControlPoints->Append((wxObject*) new_point);
|
lineCopy.m_lineControlPoints->Append((wxObject*) new_point);
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
copy.start_style = start_style;
|
lineCopy.start_style = start_style;
|
||||||
copy.end_style = end_style;
|
lineCopy.end_style = end_style;
|
||||||
copy.middle_style = middle_style;
|
lineCopy.middle_style = middle_style;
|
||||||
|
|
||||||
copy.arrow_length = arrow_length;
|
lineCopy.arrow_length = arrow_length;
|
||||||
copy.arrow_width = arrow_width;
|
lineCopy.arrow_width = arrow_width;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Copy new OGL stuff
|
// Copy new OGL stuff
|
||||||
copy.ClearArrowsAtPosition(-1);
|
lineCopy.ClearArrowsAtPosition(-1);
|
||||||
node = m_arcArrows.First();
|
node = m_arcArrows.First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxArrowHead *arrow = (wxArrowHead *)node->Data();
|
wxArrowHead *arrow = (wxArrowHead *)node->Data();
|
||||||
copy.m_arcArrows.Append(new wxArrowHead(*arrow));
|
lineCopy.m_arcArrows.Append(new wxArrowHead(*arrow));
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wxShape *wxLineShape::PrivateCopy()
|
|
||||||
{
|
|
||||||
wxLineShape *line = new wxLineShape;
|
|
||||||
Copy(*line);
|
|
||||||
return line;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Override select, to create/delete temporary label-moving objects
|
// Override select, to create/delete temporary label-moving objects
|
||||||
void wxLineShape::Select(bool select, wxDC* dc)
|
void wxLineShape::Select(bool select, wxDC* dc)
|
||||||
{
|
{
|
||||||
@@ -1725,6 +1722,25 @@ void wxLineControlPoint::OnDraw(wxDC& dc)
|
|||||||
// Implement movement of Line point
|
// Implement movement of Line point
|
||||||
void wxLineControlPoint::OnDragLeft(bool draw, float x, float y, int keys, int attachment)
|
void wxLineControlPoint::OnDragLeft(bool draw, float x, float y, int keys, int attachment)
|
||||||
{
|
{
|
||||||
|
m_shape->GetEventHandler()->OnSizingDragLeft(this, draw, x, y, keys, attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxLineControlPoint::OnBeginDragLeft(float x, float y, int keys, int attachment)
|
||||||
|
{
|
||||||
|
m_shape->GetEventHandler()->OnSizingBeginDragLeft(this, x, y, keys, attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxLineControlPoint::OnEndDragLeft(float x, float y, int keys, int attachment)
|
||||||
|
{
|
||||||
|
m_shape->GetEventHandler()->OnSizingEndDragLeft(this, x, y, keys, attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Control points ('handles') redirect control to the actual shape, to make it easier
|
||||||
|
// to override sizing behaviour.
|
||||||
|
void wxLineShape::OnSizingDragLeft(wxControlPoint* pt, bool draw, float x, float y, int keys, int attachment)
|
||||||
|
{
|
||||||
|
wxLineControlPoint* lpt = (wxLineControlPoint*) pt;
|
||||||
|
|
||||||
wxClientDC dc(GetCanvas());
|
wxClientDC dc(GetCanvas());
|
||||||
GetCanvas()->PrepareDC(dc);
|
GetCanvas()->PrepareDC(dc);
|
||||||
|
|
||||||
@@ -1734,14 +1750,14 @@ void wxLineControlPoint::OnDragLeft(bool draw, float x, float y, int keys, int a
|
|||||||
dc.SetPen(dottedPen);
|
dc.SetPen(dottedPen);
|
||||||
dc.SetBrush((* wxTRANSPARENT_BRUSH));
|
dc.SetBrush((* wxTRANSPARENT_BRUSH));
|
||||||
|
|
||||||
if (m_type == CONTROL_POINT_LINE)
|
if (lpt->m_type == CONTROL_POINT_LINE)
|
||||||
{
|
{
|
||||||
m_canvas->Snap(&x, &y);
|
m_canvas->Snap(&x, &y);
|
||||||
|
|
||||||
m_xpos = x; m_ypos = y;
|
lpt->SetX(x); lpt->SetY(y);
|
||||||
m_point->x = x; m_point->y = y;
|
lpt->m_point->x = x; lpt->m_point->y = y;
|
||||||
|
|
||||||
wxLineShape *lineShape = (wxLineShape *)m_shape;
|
wxLineShape *lineShape = (wxLineShape *)this;
|
||||||
|
|
||||||
wxPen *old_pen = lineShape->GetPen();
|
wxPen *old_pen = lineShape->GetPen();
|
||||||
wxBrush *old_brush = lineShape->GetBrush();
|
wxBrush *old_brush = lineShape->GetBrush();
|
||||||
@@ -1756,24 +1772,26 @@ void wxLineControlPoint::OnDragLeft(bool draw, float x, float y, int keys, int a
|
|||||||
lineShape->SetBrush(old_brush);
|
lineShape->SetBrush(old_brush);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_type == CONTROL_POINT_ENDPOINT_FROM || m_type == CONTROL_POINT_ENDPOINT_TO)
|
if (lpt->m_type == CONTROL_POINT_ENDPOINT_FROM || lpt->m_type == CONTROL_POINT_ENDPOINT_TO)
|
||||||
{
|
{
|
||||||
m_xpos = x; m_ypos = y;
|
lpt->SetX(x); lpt->SetY(y);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxLineControlPoint::OnBeginDragLeft(float x, float y, int keys, int attachment)
|
void wxLineShape::OnSizingBeginDragLeft(wxControlPoint* pt, float x, float y, int keys, int attachment)
|
||||||
{
|
{
|
||||||
|
wxLineControlPoint* lpt = (wxLineControlPoint*) pt;
|
||||||
|
|
||||||
wxClientDC dc(GetCanvas());
|
wxClientDC dc(GetCanvas());
|
||||||
GetCanvas()->PrepareDC(dc);
|
GetCanvas()->PrepareDC(dc);
|
||||||
|
|
||||||
wxLineShape *lineShape = (wxLineShape *)m_shape;
|
wxLineShape *lineShape = (wxLineShape *)this;
|
||||||
if (m_type == CONTROL_POINT_LINE)
|
if (lpt->m_type == CONTROL_POINT_LINE)
|
||||||
{
|
{
|
||||||
m_canvas->Snap(&x, &y);
|
m_canvas->Snap(&x, &y);
|
||||||
|
|
||||||
m_shape->Erase(dc);
|
this->Erase(dc);
|
||||||
|
|
||||||
// Redraw start and end objects because we've left holes
|
// Redraw start and end objects because we've left holes
|
||||||
// when erasing the line
|
// when erasing the line
|
||||||
@@ -1782,11 +1800,11 @@ void wxLineControlPoint::OnBeginDragLeft(float x, float y, int keys, int attachm
|
|||||||
lineShape->GetTo()->OnDraw(dc);
|
lineShape->GetTo()->OnDraw(dc);
|
||||||
lineShape->GetTo()->OnDrawContents(dc);
|
lineShape->GetTo()->OnDrawContents(dc);
|
||||||
|
|
||||||
m_shape->SetDisableLabel(TRUE);
|
this->SetDisableLabel(TRUE);
|
||||||
dc.SetLogicalFunction(wxXOR);
|
dc.SetLogicalFunction(wxXOR);
|
||||||
|
|
||||||
m_xpos = x; m_ypos = y;
|
lpt->m_xpos = x; lpt->m_ypos = y;
|
||||||
m_point->x = x; m_point->y = y;
|
lpt->m_point->x = x; lpt->m_point->y = y;
|
||||||
|
|
||||||
wxPen *old_pen = lineShape->GetPen();
|
wxPen *old_pen = lineShape->GetPen();
|
||||||
wxBrush *old_brush = lineShape->GetBrush();
|
wxBrush *old_brush = lineShape->GetBrush();
|
||||||
@@ -1801,11 +1819,11 @@ void wxLineControlPoint::OnBeginDragLeft(float x, float y, int keys, int attachm
|
|||||||
lineShape->SetBrush(old_brush);
|
lineShape->SetBrush(old_brush);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_type == CONTROL_POINT_ENDPOINT_FROM || m_type == CONTROL_POINT_ENDPOINT_TO)
|
if (lpt->m_type == CONTROL_POINT_ENDPOINT_FROM || lpt->m_type == CONTROL_POINT_ENDPOINT_TO)
|
||||||
{
|
{
|
||||||
Erase(dc);
|
lpt->Erase(dc);
|
||||||
lineShape->OnDraw(dc);
|
lineShape->OnDraw(dc);
|
||||||
if (m_type == CONTROL_POINT_ENDPOINT_FROM)
|
if (lpt->m_type == CONTROL_POINT_ENDPOINT_FROM)
|
||||||
{
|
{
|
||||||
lineShape->GetFrom()->OnDraw(dc);
|
lineShape->GetFrom()->OnDraw(dc);
|
||||||
lineShape->GetFrom()->OnDrawContents(dc);
|
lineShape->GetFrom()->OnDrawContents(dc);
|
||||||
@@ -1816,35 +1834,37 @@ void wxLineControlPoint::OnBeginDragLeft(float x, float y, int keys, int attachm
|
|||||||
lineShape->GetTo()->OnDrawContents(dc);
|
lineShape->GetTo()->OnDrawContents(dc);
|
||||||
}
|
}
|
||||||
m_canvas->SetCursor(GraphicsBullseyeCursor);
|
m_canvas->SetCursor(GraphicsBullseyeCursor);
|
||||||
m_oldCursor = wxSTANDARD_CURSOR;
|
lpt->m_oldCursor = wxSTANDARD_CURSOR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxLineControlPoint::OnEndDragLeft(float x, float y, int keys, int attachment)
|
void wxLineShape::OnSizingEndDragLeft(wxControlPoint* pt, float x, float y, int keys, int attachment)
|
||||||
{
|
{
|
||||||
|
wxLineControlPoint* lpt = (wxLineControlPoint*) pt;
|
||||||
|
|
||||||
wxClientDC dc(GetCanvas());
|
wxClientDC dc(GetCanvas());
|
||||||
GetCanvas()->PrepareDC(dc);
|
GetCanvas()->PrepareDC(dc);
|
||||||
|
|
||||||
m_shape->SetDisableLabel(FALSE);
|
this->SetDisableLabel(FALSE);
|
||||||
wxLineShape *lineShape = (wxLineShape *)m_shape;
|
wxLineShape *lineShape = (wxLineShape *)this;
|
||||||
|
|
||||||
if (m_type == CONTROL_POINT_LINE)
|
if (lpt->m_type == CONTROL_POINT_LINE)
|
||||||
{
|
{
|
||||||
m_canvas->Snap(&x, &y);
|
m_canvas->Snap(&x, &y);
|
||||||
|
|
||||||
dc.SetLogicalFunction(wxCOPY);
|
dc.SetLogicalFunction(wxCOPY);
|
||||||
m_xpos = x; m_ypos = y;
|
lpt->m_xpos = x; lpt->m_ypos = y;
|
||||||
m_point->x = x; m_point->y = y;
|
lpt->m_point->x = x; lpt->m_point->y = y;
|
||||||
|
|
||||||
lineShape->GetEventHandler()->OnMoveLink(dc);
|
lineShape->GetEventHandler()->OnMoveLink(dc);
|
||||||
}
|
}
|
||||||
if (m_type == CONTROL_POINT_ENDPOINT_FROM)
|
if (lpt->m_type == CONTROL_POINT_ENDPOINT_FROM)
|
||||||
{
|
{
|
||||||
if (m_oldCursor)
|
if (lpt->m_oldCursor)
|
||||||
m_canvas->SetCursor(m_oldCursor);
|
m_canvas->SetCursor(lpt->m_oldCursor);
|
||||||
m_shape->Erase(dc);
|
this->Erase(dc);
|
||||||
|
|
||||||
m_xpos = x; m_ypos = y;
|
lpt->m_xpos = x; lpt->m_ypos = y;
|
||||||
|
|
||||||
if (lineShape->GetFrom())
|
if (lineShape->GetFrom())
|
||||||
{
|
{
|
||||||
@@ -1852,12 +1872,12 @@ void wxLineControlPoint::OnEndDragLeft(float x, float y, int keys, int attachmen
|
|||||||
lineShape->GetFrom()->MoveLinks(dc);
|
lineShape->GetFrom()->MoveLinks(dc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (m_type == CONTROL_POINT_ENDPOINT_TO)
|
if (lpt->m_type == CONTROL_POINT_ENDPOINT_TO)
|
||||||
{
|
{
|
||||||
if (m_oldCursor)
|
if (lpt->m_oldCursor)
|
||||||
m_canvas->SetCursor(m_oldCursor);
|
m_canvas->SetCursor(lpt->m_oldCursor);
|
||||||
|
|
||||||
m_xpos = x; m_ypos = y;
|
lpt->m_xpos = x; lpt->m_ypos = y;
|
||||||
|
|
||||||
if (lineShape->GetTo())
|
if (lineShape->GetTo())
|
||||||
{
|
{
|
||||||
@@ -1867,7 +1887,7 @@ void wxLineControlPoint::OnEndDragLeft(float x, float y, int keys, int attachmen
|
|||||||
}
|
}
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (i = 0; i < lineShape->GetLineControlPoints()->Number(); i++)
|
for (i = 0; i < lineShape->GetLineControlPoints()->Number(); i++)
|
||||||
if (((wxRealPoint *)(lineShape->GetLineControlPoints()->Nth(i)->Data())) == m_point)
|
if (((wxRealPoint *)(lineShape->GetLineControlPoints()->Nth(i)->Data())) == lpt->m_point)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// N.B. in OnMoveControlPoint, an event handler in Hardy could have deselected
|
// N.B. in OnMoveControlPoint, an event handler in Hardy could have deselected
|
||||||
|
@@ -161,6 +161,12 @@ class wxLineShape: public wxShape
|
|||||||
void OnBeginDragLeft(float x, float y, int keys=0, int attachment = 0);
|
void OnBeginDragLeft(float x, float y, int keys=0, int attachment = 0);
|
||||||
void OnEndDragLeft(float x, float y, int keys=0, int attachment = 0);
|
void OnEndDragLeft(float x, float y, int keys=0, int attachment = 0);
|
||||||
|
|
||||||
|
// Control points ('handles') redirect control to the actual shape, to make it easier
|
||||||
|
// to override sizing behaviour.
|
||||||
|
virtual void OnSizingDragLeft(wxControlPoint* pt, bool draw, float x, float y, int keys=0, int attachment = 0);
|
||||||
|
virtual void OnSizingBeginDragLeft(wxControlPoint* pt, float x, float y, int keys=0, int attachment = 0);
|
||||||
|
virtual void OnSizingEndDragLeft(wxControlPoint* pt, float x, float y, int keys=0, int attachment = 0);
|
||||||
|
|
||||||
// Override select, to create/delete temporary label-moving objects
|
// Override select, to create/delete temporary label-moving objects
|
||||||
void Select(bool select = TRUE, wxDC* dc = NULL);
|
void Select(bool select = TRUE, wxDC* dc = NULL);
|
||||||
|
|
||||||
@@ -192,8 +198,7 @@ class wxLineShape: public wxShape
|
|||||||
virtual bool Draggable() const { return FALSE; }
|
virtual bool Draggable() const { return FALSE; }
|
||||||
|
|
||||||
// Does the copying for this object
|
// Does the copying for this object
|
||||||
void Copy(wxLineShape& copy);
|
void Copy(wxShape& copy);
|
||||||
wxShape *PrivateCopy();
|
|
||||||
|
|
||||||
// New OGL stuff
|
// New OGL stuff
|
||||||
wxArrowHead *AddArrow(WXTYPE type, int end = ARROW_POSITION_END,
|
wxArrowHead *AddArrow(WXTYPE type, int end = ARROW_POSITION_END,
|
||||||
|
@@ -16,10 +16,11 @@
|
|||||||
#pragma interface "linesp.h"
|
#pragma interface "linesp.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
class wxLineShape;
|
||||||
class wxLineControlPoint: public wxControlPoint
|
class wxLineControlPoint: public wxControlPoint
|
||||||
{
|
{
|
||||||
DECLARE_DYNAMIC_CLASS(wxLineControlPoint)
|
DECLARE_DYNAMIC_CLASS(wxLineControlPoint)
|
||||||
|
friend class wxLineShape;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
wxLineControlPoint(wxShapeCanvas *the_canvas = NULL, wxShape *object = NULL, float size = 0.0,
|
wxLineControlPoint(wxShapeCanvas *the_canvas = NULL, wxShape *object = NULL, float size = 0.0,
|
||||||
|
Reference in New Issue
Block a user