📄 view.cpp
字号:
// Generalised command
void csDiagramView::DoCmd(wxList& shapes, wxList& oldShapes, int cmd, const wxString& op)
{
csDiagramDocument *doc = (csDiagramDocument *)GetDocument();
if (shapes.GetCount() > 0)
{
csDiagramCommand* command = new csDiagramCommand(op, doc);
wxObjectList::compatibility_iterator node = shapes.GetFirst();
wxObjectList::compatibility_iterator node1 = oldShapes.GetFirst();
while (node && node1)
{
wxShape *theShape = (wxShape*) node->GetData();
wxShape *oldShape = (wxShape*) node1->GetData();
csCommandState* state = new csCommandState(cmd, theShape, oldShape);
command->AddState(state);
node = node->GetNext();
node1 = node1->GetNext();
}
doc->GetCommandProcessor()->Submit(command);
}
}
void csDiagramView::OnChangeBackgroundColour(wxCommandEvent& WXUNUSED(event))
{
csDiagramDocument *doc = (csDiagramDocument *)GetDocument();
wxList selections;
FindSelectedShapes(selections);
if (selections.GetCount() > 0)
{
wxColourData data;
data.SetChooseFull(true);
if (selections.GetCount() == 1)
{
wxShape* firstShape = (wxShape*) selections.GetFirst()->GetData();
data.SetColour(firstShape->GetBrush()->GetColour());
}
wxColourDialog *dialog = new wxColourDialog(frame, &data);
wxBrush *theBrush = NULL;
if (dialog->ShowModal() == wxID_OK)
{
wxColourData retData = dialog->GetColourData();
wxColour col = retData.GetColour();
theBrush = wxTheBrushList->FindOrCreateBrush(col, wxSOLID);
}
dialog->Close(true);
if (!theBrush)
return;
csDiagramCommand* cmd = new csDiagramCommand(_T("Change colour"), doc);
wxObjectList::compatibility_iterator node = selections.GetFirst();
while (node)
{
wxShape *theShape = (wxShape*) node->GetData();
wxShape* newShape = theShape->CreateNewCopy();
newShape->SetBrush(theBrush);
csCommandState* state = new csCommandState(ID_CS_CHANGE_BACKGROUND_COLOUR, newShape, theShape);
cmd->AddState(state);
node = node->GetNext();
}
doc->GetCommandProcessor()->Submit(cmd);
}
}
void csDiagramView::OnEditProperties(wxCommandEvent& WXUNUSED(event))
{
wxShape *theShape = FindFirstSelectedShape();
if (theShape)
((csEvtHandler *)theShape->GetEventHandler())->EditProperties();
}
void csDiagramView::OnEditPropertiesUpdate(wxUpdateUIEvent& event)
{
wxList selections;
FindSelectedShapes(selections);
event.Enable( (selections.GetCount() > 0) );
}
void csDiagramView::OnPointSizeComboSel(wxCommandEvent& event)
{
wxComboBox* combo = (wxComboBox*) event.GetEventObject();
wxASSERT( combo != NULL );
int newPointSize = (combo->GetSelection() + 1);
ApplyPointSize(newPointSize);
}
// TODO: must find out how to intercept the Return key, rather than
// every key stroke. But for now, do every key stroke.
void csDiagramView::OnPointSizeComboText(wxCommandEvent& event)
{
wxComboBox* combo = (wxComboBox*) event.GetEventObject();
wxASSERT( combo != NULL );
wxString str(combo->GetValue());
long newPointSize;
str.ToLong( &newPointSize );
if (newPointSize < 2)
return;
ApplyPointSize(newPointSize);
}
void csDiagramView::ApplyPointSize(int pointSize)
{
csDiagramDocument *doc = (csDiagramDocument *)GetDocument();
wxList selections;
FindSelectedShapes(selections);
if (selections.GetCount() > 0)
{
csDiagramCommand* cmd = new csDiagramCommand(_T("Point size"), doc);
wxObjectList::compatibility_iterator node = selections.GetFirst();
while (node)
{
wxShape *theShape = (wxShape*) node->GetData();
wxShape *newShape = theShape->CreateNewCopy();
wxFont* newFont = wxTheFontList->FindOrCreateFont(pointSize,
theShape->GetFont()->GetFamily(),
theShape->GetFont()->GetStyle(),
theShape->GetFont()->GetWeight(),
theShape->GetFont()->GetUnderlined(),
theShape->GetFont()->GetFaceName());
newShape->SetFont(newFont);
csCommandState* state = new csCommandState(ID_CS_FONT_CHANGE, newShape, theShape);
cmd->AddState(state);
node = node->GetNext();
}
doc->GetCommandProcessor()->Submit(cmd);
}
}
void csDiagramView::OnZoomSel(wxCommandEvent& event)
{
int maxZoom = 200;
int minZoom = 5;
int inc = 5;
int noStrings = (maxZoom - minZoom)/inc ;
wxComboBox* combo = (wxComboBox*) event.GetEventObject();
wxASSERT( combo != NULL );
int scale = (int) ((noStrings - combo->GetSelection() - 1)*inc + minZoom);
canvas->SetScale((double) (scale/100.0), (double) (scale/100.0));
canvas->Refresh();
}
// Select or deselect all
void csDiagramView::SelectAll(bool select)
{
wxClientDC dc(canvas);
canvas->PrepareDC(dc);
if (!select)
{
wxList selections;
FindSelectedShapes(selections);
wxObjectList::compatibility_iterator node = selections.GetFirst();
while (node)
{
wxShape *theShape = (wxShape*) node->GetData();
theShape->Select(false, &dc);
SelectShape(theShape, false);
node = node->GetNext();
}
}
else
{
csDiagramDocument *doc = (csDiagramDocument *)GetDocument();
wxObjectList::compatibility_iterator node = doc->GetDiagram()->GetShapeList()->GetFirst();
while (node)
{
wxShape *eachShape = (wxShape *)node->GetData();
if (eachShape->GetParent() == NULL &&
!eachShape->IsKindOf(CLASSINFO(wxControlPoint)) &&
!eachShape->IsKindOf(CLASSINFO(wxLabelShape)))
{
eachShape->Select(true, &dc);
SelectShape(eachShape, true);
}
node = node->GetNext();
}
}
}
void csDiagramView::OnToggleArrowTool(wxCommandEvent& WXUNUSED(event))
{
csDiagramDocument *doc = (csDiagramDocument *)GetDocument();
bool state = wxGetApp().GetDiagramToolBar()->GetToolState(DIAGRAM_TOOLBAR_LINE_ARROW);
wxString stateName;
if (state)
stateName = _T("Arrow on");
else
stateName = _T("Arrow off");
wxList selections;
FindSelectedShapes(selections, CLASSINFO(wxLineShape));
if (selections.GetCount() > 0)
{
csDiagramCommand* cmd = new csDiagramCommand(stateName, doc);
wxObjectList::compatibility_iterator node = selections.GetFirst();
while (node)
{
wxLineShape *theShape = (wxLineShape*) node->GetData();
wxLineShape *newShape = NULL;
if (state)
{
// Add arrow
if (theShape->GetArrows().GetCount() == 0)
{
newShape = (wxLineShape*) theShape->CreateNewCopy();
newShape->AddArrow(ARROW_ARROW, ARROW_POSITION_MIDDLE, 10.0, 0.0, _T("Normal arrowhead"));
}
}
else
{
if (theShape->GetArrows().GetCount() > 0)
{
newShape = (wxLineShape*) theShape->CreateNewCopy();
newShape->ClearArrowsAtPosition();
}
}
// If the new state is the same as the old, don't bother adding it to the command state.
if (newShape)
{
csCommandState* state = new csCommandState(ID_CS_ARROW_CHANGE, newShape, theShape);
cmd->AddState(state);
}
node = node->GetNext();
}
doc->GetCommandProcessor()->Submit(cmd);
}
}
void csDiagramView::OnToggleArrowToolUpdate(wxUpdateUIEvent& event)
{
wxList selections;
FindSelectedShapes(selections, CLASSINFO(wxLineShape));
event.Enable( (selections.GetCount() > 0) );
}
// Make the point size combobox reflect this
void csDiagramView::ReflectPointSize(int pointSize)
{
wxComboBox* comboBox = wxGetApp().GetPointSizeComboBox();
comboBox->SetSelection(pointSize -1);
}
// Make the arrow toggle button reflect the state of the line
void csDiagramView::ReflectArrowState(wxLineShape* lineShape)
{
bool haveArrow = false;
wxObjectList::compatibility_iterator node = lineShape->GetArrows().GetFirst();
while (node)
{
wxArrowHead *arrow = (wxArrowHead *)node->GetData();
if (ARROW_POSITION_MIDDLE == arrow->GetArrowEnd())
haveArrow = true;
node = node->GetNext();
}
wxGetApp().GetDiagramToolBar()->ToggleTool(DIAGRAM_TOOLBAR_LINE_ARROW, haveArrow);
}
void csDiagramView::OnAlign(wxCommandEvent& event)
{
// Make a copy of the selections, keeping only those shapes
// that are top-level non-line shapes.
wxList selections;
wxObjectList::compatibility_iterator node = GetSelectionList().GetFirst();
while (node)
{
wxShape* shape = (wxShape*) node->GetData();
if ((shape->GetParent() == NULL) && (!shape->IsKindOf(CLASSINFO(wxLineShape))))
{
selections.Append(shape);
}
node = node->GetNext();
}
if (selections.GetCount() == 0)
return;
csDiagramDocument *doc = (csDiagramDocument *)GetDocument();
csDiagramCommand* cmd = new csDiagramCommand(_T("Align"), doc);
node = selections.GetFirst();
wxShape* firstShape = (wxShape*) node->GetData();
double x = firstShape->GetX();
double y = firstShape->GetY();
double width, height;
firstShape->GetBoundingBoxMax(&width, &height);
node = selections.GetFirst();
while (node)
{
wxShape* shape = (wxShape*) node->GetData();
if (shape != firstShape)
{
/* double x1 = */ shape->GetX();
/* double y1 = */ shape->GetY();
double width1, height1;
shape->GetBoundingBoxMax(& width1, & height1);
wxShape* newShape = shape->CreateNewCopy();
switch (event.GetId())
{
case DIAGRAM_TOOLBAR_ALIGNL:
{
double x2 = (double)(x - (width/2.0) + (width1/2.0));
newShape->SetX(x2);
break;
}
case DIAGRAM_TOOLBAR_ALIGNR:
{
double x2 = (double)(x + (width/2.0) - (width1/2.0));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -