X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dbeac4bd72c8604616919c89f0450899b182313a..306dfc2b3d49ca45445bdfb2164fe1eea45ab321:/utils/ogl/samples/studio/symbols.cpp diff --git a/utils/ogl/samples/studio/symbols.cpp b/utils/ogl/samples/studio/symbols.cpp new file mode 100644 index 0000000000..52ee3a0a59 --- /dev/null +++ b/utils/ogl/samples/studio/symbols.cpp @@ -0,0 +1,203 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: symbols.cpp +// Purpose: Implements the Studio symbol database +// Author: Julian Smart +// Modified by: +// Created: 12/07/98 +// RCS-ID: $Id$ +// Copyright: (c) Julian Smart +// Licence: +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +// #pragma implementation +#endif + +// For compilers that support precompilation, includes "wx.h". +#include + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include +#endif + +#include + +#include "studio.h" +#include "doc.h" +#include "shapes.h" +#include "view.h" +#include "symbols.h" + +/* + * csSymbol + * Represents information about a symbol. + */ + +csSymbol::csSymbol(const wxString& name, wxShape* shape) +{ + m_name = name; + m_shape = shape; + m_toolId = 0; +} + +csSymbol::~csSymbol() +{ + delete m_shape; +} + +/* + * A table of all possible shapes. + * We can use this to construct a palette, etc. + */ +csSymbolDatabase::csSymbolDatabase() +{ + m_currentId = 800; +} + +csSymbolDatabase::~csSymbolDatabase() +{ + ClearSymbols(); +} + +void csSymbolDatabase::AddSymbol(csSymbol* symbol) +{ + symbol->SetToolId(m_currentId); + m_symbols.Append(symbol); + + m_currentId ++; +} + +void csSymbolDatabase::ClearSymbols() +{ + wxNode* node = m_symbols.First(); + while (node) + { + csSymbol* symbol = (csSymbol*) node->Data(); + delete symbol; + + node = node->Next(); + } + m_symbols.Clear(); +} + +csSymbol* csSymbolDatabase::FindSymbol(const wxString& name) const +{ + wxNode* node = m_symbols.First(); + while (node) + { + csSymbol* symbol = (csSymbol*) node->Data(); + if (symbol->GetName() == name) + return symbol; + + node = node->Next(); + } + return NULL; +} + +csSymbol* csSymbolDatabase::FindSymbol(int toolId) const +{ + wxNode* node = m_symbols.First(); + while (node) + { + csSymbol* symbol = (csSymbol*) node->Data(); + if (symbol->GetToolId() == toolId) + return symbol; + + node = node->Next(); + } + return NULL; +} + +// Add symbols to database +void csApp::InitSymbols() +{ + m_symbolDatabase = new csSymbolDatabase; + + wxShape* shape = new csCircleShape(); + shape->AssignNewIds(); + shape->SetEventHandler(new csEvtHandler(shape, shape, wxString(""))); + + m_symbolDatabase->AddSymbol(new csSymbol("Circle", shape)); + + shape = new csCircleShadowShape(); + shape->AssignNewIds(); + shape->SetEventHandler(new csEvtHandler(shape, shape, wxString(""))); + + m_symbolDatabase->AddSymbol(new csSymbol("Circle shadow", shape)); + + shape = new csThinRectangleShape(); + shape->AssignNewIds(); + shape->SetEventHandler(new csEvtHandler(shape, shape, wxString(""))); + + m_symbolDatabase->AddSymbol(new csSymbol("Thin Rectangle", shape)); + + shape = new csWideRectangleShape(); + shape->AssignNewIds(); + shape->SetEventHandler(new csEvtHandler(shape, shape, wxString(""))); + + m_symbolDatabase->AddSymbol(new csSymbol("Wide Rectangle", shape)); + + shape = new csSemiCircleShape(); + shape->AssignNewIds(); + shape->SetEventHandler(new csEvtHandler(shape, shape, wxString(""))); + + m_symbolDatabase->AddSymbol(new csSymbol("SemiCircle", shape)); + + shape = new csTriangleShape(); + shape->AssignNewIds(); + shape->SetEventHandler(new csEvtHandler(shape, shape, wxString(""))); + + m_symbolDatabase->AddSymbol(new csSymbol("Triangle", shape)); + + shape = new csOctagonShape(); + shape->AssignNewIds(); + shape->SetEventHandler(new csEvtHandler(shape, shape, wxString(""))); + + m_symbolDatabase->AddSymbol(new csSymbol("Octagon", shape)); + + shape = new csGroupShape(); + shape->AssignNewIds(); + shape->SetEventHandler(new csEvtHandler(shape, shape, wxString(""))); + + m_symbolDatabase->AddSymbol(new csSymbol("Group", shape)); +} + +wxBitmap* csSymbolDatabase::CreateToolBitmap(csSymbol* symbol) +{ + int objectBitmapSize = 32; + + symbol->GetShape()->Recompute(); + + wxBitmap *newBitmap = new wxBitmap(objectBitmapSize, objectBitmapSize); + + wxMemoryDC memDC; + + double height, width, maxSize; + symbol->GetShape()->GetBoundingBoxMax(&width, &height); + + if (height > width) + maxSize = height; + else + maxSize = width; + + double borderMargin = 4.0; + double scaleFactor = (double)(objectBitmapSize / (maxSize + 2*borderMargin)); + double centreX = (double)((objectBitmapSize/scaleFactor)/2.0)-1; + double centreY = centreX; + + memDC.SetUserScale(scaleFactor, scaleFactor); + + memDC.SelectObject(*newBitmap); + memDC.SetBackground(wxBrush(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE), wxSOLID)); + memDC.Clear(); + symbol->GetShape()->Show(TRUE); + symbol->GetShape()->Move(memDC, centreX, centreY); + memDC.SelectObject(wxNullBitmap); + + return newBitmap; +} +