git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1640 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			204 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // 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.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;
 | |
| }
 | |
| 
 |