📄 basic.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// Name: basic.cpp
// Purpose: Basic OGL classes
// Author: Julian Smart
// Modified by:
// Created: 12/07/98
// RCS-ID: $Id: basic.cpp,v 1.29 2006/04/18 22:26:26 PC Exp $
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#if wxUSE_PROLOGIO
#include "wx/deprecated/wxexpr.h"
#endif
#ifdef new
#undef new
#endif
#include <stdio.h>
#include <ctype.h>
#include "wx/ogl/ogl.h"
// Control point types
// Rectangle and most other shapes
#define CONTROL_POINT_VERTICAL 1
#define CONTROL_POINT_HORIZONTAL 2
#define CONTROL_POINT_DIAGONAL 3
// Line
#define CONTROL_POINT_ENDPOINT_TO 4
#define CONTROL_POINT_ENDPOINT_FROM 5
#define CONTROL_POINT_LINE 6
IMPLEMENT_DYNAMIC_CLASS(wxShapeTextLine, wxObject)
IMPLEMENT_DYNAMIC_CLASS(wxAttachmentPoint, wxObject)
wxShapeTextLine::wxShapeTextLine(double the_x, double the_y, const wxString& the_line)
{
m_x = the_x; m_y = the_y; m_line = the_line;
}
wxShapeTextLine::~wxShapeTextLine()
{
}
IMPLEMENT_ABSTRACT_CLASS(wxShapeEvtHandler, wxObject)
wxShapeEvtHandler::wxShapeEvtHandler(wxShapeEvtHandler *prev, wxShape *shape)
{
m_previousHandler = prev;
m_handlerShape = shape;
}
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()
{
if (this != GetShape())
delete this;
}
void wxShapeEvtHandler::OnDraw(wxDC& dc)
{
if (m_previousHandler)
m_previousHandler->OnDraw(dc);
}
void wxShapeEvtHandler::OnMoveLinks(wxDC& dc)
{
if (m_previousHandler)
m_previousHandler->OnMoveLinks(dc);
}
void wxShapeEvtHandler::OnMoveLink(wxDC& dc, bool moveControlPoints)
{
if (m_previousHandler)
m_previousHandler->OnMoveLink(dc, moveControlPoints);
}
void wxShapeEvtHandler::OnDrawContents(wxDC& dc)
{
if (m_previousHandler)
m_previousHandler->OnDrawContents(dc);
}
void wxShapeEvtHandler::OnDrawBranches(wxDC& dc, bool erase)
{
if (m_previousHandler)
m_previousHandler->OnDrawBranches(dc, erase);
}
void wxShapeEvtHandler::OnSize(double x, double y)
{
if (m_previousHandler)
m_previousHandler->OnSize(x, y);
}
bool wxShapeEvtHandler::OnMovePre(wxDC& dc, double x, double y, double old_x, double old_y, bool display)
{
if (m_previousHandler)
return m_previousHandler->OnMovePre(dc, x, y, old_x, old_y, display);
else
return true;
}
void wxShapeEvtHandler::OnMovePost(wxDC& dc, double x, double y, double old_x, double old_y, bool display)
{
if (m_previousHandler)
m_previousHandler->OnMovePost(dc, x, y, old_x, old_y, display);
}
void wxShapeEvtHandler::OnErase(wxDC& dc)
{
if (m_previousHandler)
m_previousHandler->OnErase(dc);
}
void wxShapeEvtHandler::OnEraseContents(wxDC& dc)
{
if (m_previousHandler)
m_previousHandler->OnEraseContents(dc);
}
void wxShapeEvtHandler::OnHighlight(wxDC& dc)
{
if (m_previousHandler)
m_previousHandler->OnHighlight(dc);
}
void wxShapeEvtHandler::OnLeftClick(double x, double y, int keys, int attachment)
{
if (m_previousHandler)
m_previousHandler->OnLeftClick(x, y, keys, attachment);
}
void wxShapeEvtHandler::OnLeftDoubleClick(double x, double y, int keys, int attachment)
{
if (m_previousHandler)
m_previousHandler->OnLeftDoubleClick(x, y, keys, attachment);
}
void wxShapeEvtHandler::OnRightClick(double x, double y, int keys, int attachment)
{
if (m_previousHandler)
m_previousHandler->OnRightClick(x, y, keys, attachment);
}
void wxShapeEvtHandler::OnDragLeft(bool draw, double x, double y, int keys, int attachment)
{
if (m_previousHandler)
m_previousHandler->OnDragLeft(draw, x, y, keys, attachment);
}
void wxShapeEvtHandler::OnBeginDragLeft(double x, double y, int keys, int attachment)
{
if (m_previousHandler)
m_previousHandler->OnBeginDragLeft(x, y, keys, attachment);
}
void wxShapeEvtHandler::OnEndDragLeft(double x, double y, int keys, int attachment)
{
if (m_previousHandler)
m_previousHandler->OnEndDragLeft(x, y, keys, attachment);
}
void wxShapeEvtHandler::OnDragRight(bool draw, double x, double y, int keys, int attachment)
{
if (m_previousHandler)
m_previousHandler->OnDragRight(draw, x, y, keys, attachment);
}
void wxShapeEvtHandler::OnBeginDragRight(double x, double y, int keys, int attachment)
{
if (m_previousHandler)
m_previousHandler->OnBeginDragRight(x, y, keys, attachment);
}
void wxShapeEvtHandler::OnEndDragRight(double x, double y, int keys, int attachment)
{
if (m_previousHandler)
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, double x, double y, int keys, int attachment)
{
if (m_previousHandler)
m_previousHandler->OnSizingDragLeft(pt, draw, x, y, keys, attachment);
}
void wxShapeEvtHandler::OnSizingBeginDragLeft(wxControlPoint* pt, double x, double y, int keys, int attachment)
{
if (m_previousHandler)
m_previousHandler->OnSizingBeginDragLeft(pt, x, y, keys, attachment);
}
void wxShapeEvtHandler::OnSizingEndDragLeft(wxControlPoint* pt, double x, double y, int keys, int attachment)
{
if (m_previousHandler)
m_previousHandler->OnSizingEndDragLeft(pt, x, y, keys, attachment);
}
void wxShapeEvtHandler::OnDrawOutline(wxDC& dc, double x, double y, double w, double h)
{
if (m_previousHandler)
m_previousHandler->OnDrawOutline(dc, x, y, w, h);
}
void wxShapeEvtHandler::OnDrawControlPoints(wxDC& dc)
{
if (m_previousHandler)
m_previousHandler->OnDrawControlPoints(dc);
}
void wxShapeEvtHandler::OnEraseControlPoints(wxDC& dc)
{
if (m_previousHandler)
m_previousHandler->OnEraseControlPoints(dc);
}
// Can override this to prevent or intercept line reordering.
void wxShapeEvtHandler::OnChangeAttachment(int attachment, wxLineShape* line, wxList& ordering)
{
if (m_previousHandler)
m_previousHandler->OnChangeAttachment(attachment, line, ordering);
}
IMPLEMENT_ABSTRACT_CLASS(wxShape, wxShapeEvtHandler)
wxShape::wxShape(wxShapeCanvas *can)
{
m_eventHandler = this;
SetShape(this);
m_id = 0;
m_formatted = false;
m_canvas = can;
m_xpos = 0.0; m_ypos = 0.0;
m_pen = g_oglBlackPen;
m_brush = wxWHITE_BRUSH;
m_font = g_oglNormalFont;
m_textColour = wxT("BLACK");
m_textColourName = wxT("BLACK");
m_visible = false;
m_selected = false;
m_attachmentMode = ATTACHMENT_MODE_NONE;
m_spaceAttachments = true;
m_disableLabel = false;
m_fixedWidth = false;
m_fixedHeight = false;
m_drawHandles = true;
m_sensitivity = OP_ALL;
m_draggable = true;
m_parent = NULL;
m_formatMode = FORMAT_CENTRE_HORIZ | FORMAT_CENTRE_VERT;
m_shadowMode = SHADOW_NONE;
m_shadowOffsetX = 6;
m_shadowOffsetY = 6;
m_shadowBrush = wxBLACK_BRUSH;
m_textMarginX = 5;
m_textMarginY = 5;
m_regionName = wxT("0");
m_centreResize = true;
m_maintainAspectRatio = false;
m_highlighted = false;
m_rotation = 0.0;
m_branchNeckLength = 10;
m_branchStemLength = 10;
m_branchSpacing = 10;
m_branchStyle = BRANCHING_ATTACHMENT_NORMAL;
// Set up a default region. Much of the above will be put into
// the region eventually (the duplication is for compatibility)
wxShapeRegion *region = new wxShapeRegion;
m_regions.Append(region);
region->SetName(wxT("0"));
region->SetFont(g_oglNormalFont);
region->SetFormatMode(FORMAT_CENTRE_HORIZ | FORMAT_CENTRE_VERT);
region->SetColour(wxT("BLACK"));
}
wxShape::~wxShape()
{
if (m_parent)
m_parent->GetChildren().DeleteObject(this);
ClearText();
ClearRegions();
ClearAttachments();
if (m_canvas)
m_canvas->RemoveShape(this);
GetEventHandler()->OnDelete();
}
void wxShape::SetHighlight(bool hi, bool recurse)
{
m_highlighted = hi;
if (recurse)
{
wxNode *node = m_children.GetFirst();
while (node)
{
wxShape *child = (wxShape *)node->GetData();
child->SetHighlight(hi, recurse);
node = node->GetNext();
}
}
}
void wxShape::SetSensitivityFilter(int sens, bool recursive)
{
if (sens & OP_DRAG_LEFT)
m_draggable = true;
else
m_draggable = false;
m_sensitivity = sens;
if (recursive)
{
wxNode *node = m_children.GetFirst();
while (node)
{
wxShape *obj = (wxShape *)node->GetData();
obj->SetSensitivityFilter(sens, true);
node = node->GetNext();
}
}
}
void wxShape::SetDraggable(bool drag, bool recursive)
{
m_draggable = drag;
if (m_draggable)
m_sensitivity |= OP_DRAG_LEFT;
else
if (m_sensitivity & OP_DRAG_LEFT)
m_sensitivity = m_sensitivity - OP_DRAG_LEFT;
if (recursive)
{
wxNode *node = m_children.GetFirst();
while (node)
{
wxShape *obj = (wxShape *)node->GetData();
obj->SetDraggable(drag, true);
node = node->GetNext();
}
}
}
void wxShape::SetDrawHandles(bool drawH)
{
m_drawHandles = drawH;
wxNode *node = m_children.GetFirst();
while (node)
{
wxShape *obj = (wxShape *)node->GetData();
obj->SetDrawHandles(drawH);
node = node->GetNext();
}
}
void wxShape::SetShadowMode(int mode, bool redraw)
{
if (redraw && GetCanvas())
{
wxClientDC dc(GetCanvas());
GetCanvas()->PrepareDC(dc);
Erase(dc);
m_shadowMode = mode;
Draw(dc);
}
else
{
m_shadowMode = mode;
}
}
void wxShape::SetCanvas(wxShapeCanvas *theCanvas)
{
m_canvas = theCanvas;
wxNode *node = m_children.GetFirst();
while (node)
{
wxShape *child = (wxShape *)node->GetData();
child->SetCanvas(theCanvas);
node = node->GetNext();
}
}
void wxShape::AddToCanvas(wxShapeCanvas *theCanvas, wxShape *addAfter)
{
theCanvas->AddShape(this, addAfter);
wxNode *node = m_children.GetFirst();
wxShape *lastImage = this;
while (node)
{
wxShape *object = (wxShape *)node->GetData();
object->AddToCanvas(theCanvas, lastImage);
lastImage = object;
node = node->GetNext();
}
}
// Insert at front of canvas
void wxShape::InsertInCanvas(wxShapeCanvas *theCanvas)
{
theCanvas->InsertShape(this);
wxNode *node = m_children.GetFirst();
wxShape *lastImage = this;
while (node)
{
wxShape *object = (wxShape *)node->GetData();
object->AddToCanvas(theCanvas, lastImage);
lastImage = object;
node = node->GetNext();
}
}
void wxShape::RemoveFromCanvas(wxShapeCanvas *theCanvas)
{
if (Selected())
Select(false);
theCanvas->RemoveShape(this);
wxNode *node = m_children.GetFirst();
while (node)
{
wxShape *object = (wxShape *)node->GetData();
object->RemoveFromCanvas(theCanvas);
node = node->GetNext();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -