--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// 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 <wx/wxprec.h>
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+#include <wx/wxexpr.h>
+
+#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.SelectObject(*newBitmap);
+ memDC.SetUserScale(scaleFactor, scaleFactor);
+
+ 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;
+}
+