⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 doc.cpp

📁 wxGTK 是 wxWidgets 的 linux GTK+ (>2.2.3)版本。wxWidgets 是一个跨平台的 GUI 框架
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        contrib/samples/ogl/studio/doc.cpp// Purpose:     Implements document functionality// Author:      Julian Smart// Modified by:// Created:     12/07/98// RCS-ID:      $Id: doc.cpp,v 1.11 2006/02/10 11:59:48 ABX 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#include "studio.h"#include "doc.h"#include "view.h"#include "wx/ogl/basicp.h"IMPLEMENT_DYNAMIC_CLASS(csDiagramDocument, wxDocument)#ifdef __VISUALC__#pragma warning(disable:4355)#endifcsDiagramDocument::csDiagramDocument():m_diagram(this){}#ifdef __VISUALC__#pragma warning(default:4355)#endifcsDiagramDocument::~csDiagramDocument(){}bool csDiagramDocument::OnCloseDocument(){  m_diagram.DeleteAllShapes();  return true;}#if wxUSE_PROLOGIObool csDiagramDocument::OnSaveDocument(const wxString& file){  if (file == wxEmptyString)    return false;  if (!m_diagram.SaveFile(file))  {    wxString msgTitle;    if (wxTheApp->GetAppName() != wxEmptyString)        msgTitle = wxTheApp->GetAppName();    else        msgTitle = wxString(_T("File error"));    (void)wxMessageBox(_T("Sorry, could not open this file for saving."), msgTitle, wxOK | wxICON_EXCLAMATION,      GetDocumentWindow());    return false;  }  Modify(false);  SetFilename(file);  return true;}bool csDiagramDocument::OnOpenDocument(const wxString& file){  if (!OnSaveModified())    return false;  wxString msgTitle;  if (wxTheApp->GetAppName() != wxEmptyString)    msgTitle = wxTheApp->GetAppName();  else    msgTitle = wxString(_T("File error"));  m_diagram.DeleteAllShapes();  if (!m_diagram.LoadFile(file))  {    (void)wxMessageBox(_T("Sorry, could not open this file."), msgTitle, wxOK|wxICON_EXCLAMATION,     GetDocumentWindow());    return false;  }  SetFilename(file, true);  Modify(false);  UpdateAllViews();  return true;}#endif // wxUSE_PROLOGIO/* * Implementation of drawing command */csDiagramCommand::csDiagramCommand(const wxString& name, csDiagramDocument *doc,    csCommandState* onlyState):  wxCommand(true, name){  m_doc = doc;  if (onlyState)  {    AddState(onlyState);  }}csDiagramCommand::~csDiagramCommand(){    wxObjectList::compatibility_iterator node = m_states.GetFirst();    while (node)    {        csCommandState* state = (csCommandState*) node->GetData();        delete state;        node = node->GetNext();    }}void csDiagramCommand::AddState(csCommandState* state){    state->m_doc = m_doc;//    state->m_cmd = m_cmd;    m_states.Append(state);}// Insert a state at the beginning of the listvoid csDiagramCommand::InsertState(csCommandState* state){    state->m_doc = m_doc;//    state->m_cmd = m_cmd;    m_states.Insert(state);}// Schedule all lines connected to the states to be cut.void csDiagramCommand::RemoveLines(){    wxObjectList::compatibility_iterator node = m_states.GetFirst();    while (node)    {        csCommandState* state = (csCommandState*) node->GetData();        wxShape* shape = state->GetShapeOnCanvas();        wxASSERT( (shape != NULL) );        wxObjectList::compatibility_iterator node1 = shape->GetLines().GetFirst();        while (node1)        {            wxLineShape *line = (wxLineShape *)node1->GetData();            if (!FindStateByShape(line))            {                csCommandState* newState = new csCommandState(ID_CS_CUT, NULL, line);                InsertState(newState);            }            node1 = node1->GetNext();        }        node = node->GetNext();    }}csCommandState* csDiagramCommand::FindStateByShape(wxShape* shape){    wxObjectList::compatibility_iterator node = m_states.GetFirst();    while (node)    {        csCommandState* state = (csCommandState*) node->GetData();        if (shape == state->GetShapeOnCanvas() || shape == state->GetSavedState())            return state;        node = node->GetNext();    }    return NULL;}bool csDiagramCommand::Do(){    wxObjectList::compatibility_iterator node = m_states.GetFirst();    while (node)    {        csCommandState* state = (csCommandState*) node->GetData();        if (!state->Do())            return false;        node = node->GetNext();    }    return true;}bool csDiagramCommand::Undo(){    // Undo in reverse order, so e.g. shapes get added    // back before the lines do.    wxObjectList::compatibility_iterator node = m_states.GetLast();    while (node)    {        csCommandState* state = (csCommandState*) node->GetData();        if (!state->Undo())            return false;        node = node->GetPrevious();    }    return true;}csCommandState::csCommandState(int cmd, wxShape* savedState, wxShape* shapeOnCanvas){    m_cmd = cmd;    m_doc = NULL;    m_savedState = savedState;    m_shapeOnCanvas = shapeOnCanvas;    m_linePositionFrom = 0;    m_linePositionTo = 0;}csCommandState::~csCommandState(){    if (m_savedState)    {        m_savedState->SetCanvas(NULL);        delete m_savedState;    }}bool csCommandState::Do(){  switch (m_cmd)  {    case ID_CS_CUT:    {        // New state is 'nothing' - maybe pass shape ID to state so we know what        // we're talking about.        // Then save old shape in m_savedState (actually swap pointers)        wxASSERT( (m_shapeOnCanvas != NULL) );        wxASSERT( (m_savedState == NULL) ); // new state will be 'nothing'        wxASSERT( (m_doc != NULL) );        wxShapeCanvas* canvas = m_shapeOnCanvas->GetCanvas();        // In case this is a line        wxShape* lineFrom = NULL;        wxShape* lineTo = NULL;        int attachmentFrom = 0, attachmentTo = 0;        if (m_shapeOnCanvas->IsKindOf(CLASSINFO(wxLineShape)))        {            // Store the from/to info to save in the line shape            wxLineShape* lineShape = (wxLineShape*) m_shapeOnCanvas;            lineFrom = lineShape->GetFrom();            lineTo = lineShape->GetTo();            attachmentFrom = lineShape->GetAttachmentFrom();            attachmentTo = lineShape->GetAttachmentTo();            m_linePositionFrom = lineFrom->GetLinePosition(lineShape);            m_linePositionTo = lineTo->GetLinePosition(lineShape);        }        m_shapeOnCanvas->Select(false);        ((csDiagramView*) m_doc->GetFirstView())->SelectShape(m_shapeOnCanvas, false);        m_shapeOnCanvas->Unlink();        m_doc->GetDiagram()->RemoveShape(m_shapeOnCanvas);        m_savedState = m_shapeOnCanvas;        if (m_savedState->IsKindOf(CLASSINFO(wxLineShape)))        {            // Restore the from/to info for future reference            wxLineShape* lineShape = (wxLineShape*) m_savedState;            lineShape->SetFrom(lineFrom);            lineShape->SetTo(lineTo);            lineShape->SetAttachments(attachmentFrom, attachmentTo);            wxClientDC dc(canvas);            canvas->PrepareDC(dc);            lineFrom->MoveLinks(dc);            lineTo->MoveLinks(dc);        }        m_doc->Modify(true);        m_doc->UpdateAllViews();        break;    }    case ID_CS_ADD_SHAPE:    case ID_CS_ADD_SHAPE_SELECT:    {        // The app has given the command state a new m_savedState        // shape, which is the new shape to add to the canvas (but

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -