Added revamped Object Graphics Library (for node/arc diagrams).
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@305 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
							
								
								
									
										41
									
								
								utils/ogl/distrib/ogl.rsp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					src/*.cpp
 | 
				
			||||||
 | 
					src/*.c
 | 
				
			||||||
 | 
					src/*.h
 | 
				
			||||||
 | 
					src/*.rc
 | 
				
			||||||
 | 
					src/*.def
 | 
				
			||||||
 | 
					src/*.xbm
 | 
				
			||||||
 | 
					src/make*.*
 | 
				
			||||||
 | 
					src/*.txt
 | 
				
			||||||
 | 
					src/*.ico
 | 
				
			||||||
 | 
					src/*.bmp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					samples/ogledit/*.cpp
 | 
				
			||||||
 | 
					samples/ogledit/*.c
 | 
				
			||||||
 | 
					samples/ogledit/*.h
 | 
				
			||||||
 | 
					samples/ogledit/*.rc
 | 
				
			||||||
 | 
					samples/ogledit/*.def
 | 
				
			||||||
 | 
					samples/ogledit/*.xbm
 | 
				
			||||||
 | 
					samples/ogledit/make*.*
 | 
				
			||||||
 | 
					samples/ogledit/*.txt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					samples/ogledit/*.ico
 | 
				
			||||||
 | 
					samples/ogledit/*.bmp
 | 
				
			||||||
 | 
					samples/ogledit/bitmaps/*.bmp
 | 
				
			||||||
 | 
					samples/ogledit/bitmaps/*.gif
 | 
				
			||||||
 | 
					samples/ogledit/bitmaps/*.xbm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					lib/dummy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					distrib/*.rsp
 | 
				
			||||||
 | 
					distrib/*.bat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					docs/*.txt
 | 
				
			||||||
 | 
					docs/*.tex
 | 
				
			||||||
 | 
					docs/*.ini
 | 
				
			||||||
 | 
					docs/*.hpj
 | 
				
			||||||
 | 
					docs/*.ps
 | 
				
			||||||
 | 
					docs/*.eps
 | 
				
			||||||
 | 
					docs/*.cnt
 | 
				
			||||||
 | 
					docs/*.bmp
 | 
				
			||||||
 | 
					docs/*.gif
 | 
				
			||||||
 | 
					docs/*.hlp
 | 
				
			||||||
							
								
								
									
										48
									
								
								utils/ogl/distrib/tarogl.bat
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					@echo off
 | 
				
			||||||
 | 
					rem Tar up an external distribution of OGL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if "%1" == "" goto usage
 | 
				
			||||||
 | 
					if "%2" == "" goto usage
 | 
				
			||||||
 | 
					echo About to archive an external OGL distribution:
 | 
				
			||||||
 | 
					echo   From   %1
 | 
				
			||||||
 | 
					echo   To     %2\ogl.tgz
 | 
				
			||||||
 | 
					echo CTRL-C if this is not correct.
 | 
				
			||||||
 | 
					inkey /W4 `Press any key to continue...` %%input
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					erase %2\ogl.tgz
 | 
				
			||||||
 | 
					cd %1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rem First, expand the wildcards in the ogl.rsp file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rem Create empty list file
 | 
				
			||||||
 | 
					erase %1\distrib\ogl.lis
 | 
				
			||||||
 | 
					c:\bin\touch %1\distrib\ogl.lis
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rem Create a .rsp file with backslashes instead
 | 
				
			||||||
 | 
					rem of forward slashes
 | 
				
			||||||
 | 
					rem No need if using ls2 (from UNIX95 distribution)
 | 
				
			||||||
 | 
					rem sed -e "s/\//\\/g" %1\distrib\ogl.rsp > %1\distrib\ogl.rs2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set len=%@LINES[%1\distrib\ogl.rsp]
 | 
				
			||||||
 | 
					rem set len=%@DEC[%len]
 | 
				
			||||||
 | 
					do i = 0 to %len by 1
 | 
				
			||||||
 | 
					  set line=%@LINE[%1\distrib\ogl.rsp,%i]
 | 
				
			||||||
 | 
					  if NOT "%line" == "" ls2 -1 %line >> %1\distrib\ogl.lis
 | 
				
			||||||
 | 
					enddo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tar -c -T %1\distrib\ogl.lis
 | 
				
			||||||
 | 
					move archive.tar ogl.tar
 | 
				
			||||||
 | 
					gzip ogl.tar
 | 
				
			||||||
 | 
					move ogl.taz %2\ogl.tgz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo OGL archived.
 | 
				
			||||||
 | 
					goto end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:usage
 | 
				
			||||||
 | 
					echo DOS OGL distribution.
 | 
				
			||||||
 | 
					echo Usage: tarogl source destination
 | 
				
			||||||
 | 
					echo e.g. tarogl c:\wx\utils\ogl c:\wx\utils\ogl\deliver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										26
									
								
								utils/ogl/distrib/zipogl.bat
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					@echo off
 | 
				
			||||||
 | 
					rem Zip up an external distribution of OGL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if "%1" == "" goto usage
 | 
				
			||||||
 | 
					if "%2" == "" goto usage
 | 
				
			||||||
 | 
					echo About to archive an external OGL distribution:
 | 
				
			||||||
 | 
					echo   From   %1
 | 
				
			||||||
 | 
					echo   To     %2\ogl.zip
 | 
				
			||||||
 | 
					echo CTRL-C if this is not correct.
 | 
				
			||||||
 | 
					inkey /W4 `Press any key to continue...` %%input
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					erase %2\ogl.zip
 | 
				
			||||||
 | 
					cd %1
 | 
				
			||||||
 | 
					zip -P %3 %4 %5 %6 %7 %8 %2\ogl.zip @%1\distrib\ogl.rsp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo OGL archived.
 | 
				
			||||||
 | 
					goto end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:usage
 | 
				
			||||||
 | 
					echo DOS OGL distribution.
 | 
				
			||||||
 | 
					echo Usage: zipogl source destination
 | 
				
			||||||
 | 
					echo e.g. zipogl c:\wx\utils\ogl c:\wx\utils\ogl\deliver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								utils/ogl/docs/back.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 225 B  | 
							
								
								
									
										
											BIN
										
									
								
								utils/ogl/docs/books.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.2 KiB  | 
							
								
								
									
										11
									
								
								utils/ogl/docs/bugs.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					\chapter{Bugs}\label{bugs}%
 | 
				
			||||||
 | 
					\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
 | 
				
			||||||
 | 
					\setfooter{\thepage}{}{}{}{}{\thepage}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These are the known bugs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\begin{itemize}\itemsep=0pt
 | 
				
			||||||
 | 
					\item In the OGLEdit sample, .dia files are output double-spaced
 | 
				
			||||||
 | 
					due to an unidentified bug in the way a stream is converted to a file.
 | 
				
			||||||
 | 
					\end{itemize}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								utils/ogl/docs/bullet.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 138 B  | 
							
								
								
									
										9
									
								
								utils/ogl/docs/changes.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					\chapter{Change log}
 | 
				
			||||||
 | 
					\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
 | 
				
			||||||
 | 
					\setfooter{\thepage}{}{}{}{}{\thepage}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Version 2.0, June 1st 1996
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\begin{itemize}\itemsep=0pt
 | 
				
			||||||
 | 
					\item First publically released version.
 | 
				
			||||||
 | 
					\end{itemize}
 | 
				
			||||||
							
								
								
									
										2505
									
								
								utils/ogl/docs/classes.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								utils/ogl/docs/contents.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 231 B  | 
							
								
								
									
										
											BIN
										
									
								
								utils/ogl/docs/forward.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 164 B  | 
							
								
								
									
										45
									
								
								utils/ogl/docs/intro.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					\chapter{Introduction}
 | 
				
			||||||
 | 
					\pagenumbering{arabic}%
 | 
				
			||||||
 | 
					\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
 | 
				
			||||||
 | 
					\setfooter{\thepage}{}{}{}{}{\thepage}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Object Graphics Library (\ogl) is a C++ library supporting the creation and
 | 
				
			||||||
 | 
					manipulation of simple and complex graphic images on a canvas.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It can be found in the directory {\tt utils/ogl/src} in the
 | 
				
			||||||
 | 
					wxWindows distribution. The file {\tt ogl.h} must be included to make use
 | 
				
			||||||
 | 
					of the library.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please see \helpref{OGL overview}{ogloverview} for a general description how the object library works. For details,
 | 
				
			||||||
 | 
					please see the \helpref{class reference}{classref}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\section{File structure}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These are the files that comprise the \ogl\ library.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\begin{description}\itemsep=0pt
 | 
				
			||||||
 | 
					\item[basic.h] Header for basic objects such as wxShape and wxRectangleShape.
 | 
				
			||||||
 | 
					\item[basic.cpp] Basic objects implementation (1).
 | 
				
			||||||
 | 
					\item[basic2.cpp] Basic objects implementation (2).
 | 
				
			||||||
 | 
					\item[bitmap.cpp] wxBitmapShape class header.
 | 
				
			||||||
 | 
					\item[bitmap.cpp] wxBitmapShape implementation.
 | 
				
			||||||
 | 
					\item[canvas.h] wxShapeCanvas class header.
 | 
				
			||||||
 | 
					\item[canvas.cpp] wxShapeCanvas class implementation.
 | 
				
			||||||
 | 
					\item[composit.h] Composite object class header.
 | 
				
			||||||
 | 
					\item[composit.cpp] Composite object class implementation.
 | 
				
			||||||
 | 
					\item[constrnt.h] Constraint classes header.
 | 
				
			||||||
 | 
					\item[constrnt.cpp] Constraint classes implementation.
 | 
				
			||||||
 | 
					\item[divided.h] Divided object class header.
 | 
				
			||||||
 | 
					\item[divided.cpp] Divided object class implementation.
 | 
				
			||||||
 | 
					\item[drawn.h] Drawn (metafile) object class header.
 | 
				
			||||||
 | 
					\item[drawn.cpp] Drawn (metafile) object class implementation.
 | 
				
			||||||
 | 
					\item[graphics.h] Main include file.
 | 
				
			||||||
 | 
					\item[lines.h] wxLineShape class header.
 | 
				
			||||||
 | 
					\item[lines.cpp] wxLineShape class implementation.
 | 
				
			||||||
 | 
					\item[misc.h] Miscellaneous graphics functions header.
 | 
				
			||||||
 | 
					\item[misc.cpp] Miscellaneous graphics functions implementation.
 | 
				
			||||||
 | 
					\item[ogldiag.h] wxDiagram class header.
 | 
				
			||||||
 | 
					\item[ogldiag.cpp] wxDiagram implementation.
 | 
				
			||||||
 | 
					\end{description}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										17
									
								
								utils/ogl/docs/ogl.hpj
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					[OPTIONS]
 | 
				
			||||||
 | 
					BMROOT=d:\wx2\wxwind~1\utils\ogl\docs ; Assume that bitmaps are where the source is
 | 
				
			||||||
 | 
					TITLE=OGL Manual
 | 
				
			||||||
 | 
					CONTENTS=Contents
 | 
				
			||||||
 | 
					COMPRESS=HIGH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[FILES]
 | 
				
			||||||
 | 
					ogl.rtf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[CONFIG]
 | 
				
			||||||
 | 
					CreateButton("Up", "&Up", "JumpId(`ogl.hlp', `Contents')")
 | 
				
			||||||
 | 
					BrowseButtons()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[MAP]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[BITMAPS]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										38
									
								
								utils/ogl/docs/ogl.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					\documentstyle[a4,makeidx,verbatim,texhelp,fancyhea,mysober,mytitle]{report}
 | 
				
			||||||
 | 
					\newcommand{\ogl}[0]{{OGL}}
 | 
				
			||||||
 | 
					\input psbox.tex
 | 
				
			||||||
 | 
					\parindent 0pt
 | 
				
			||||||
 | 
					\parskip 11pt
 | 
				
			||||||
 | 
					\title{Manual for Object Graphics Library 3.0}
 | 
				
			||||||
 | 
					\author{Julian Smart}
 | 
				
			||||||
 | 
					\date{July 1998}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\makeindex
 | 
				
			||||||
 | 
					\begin{document}
 | 
				
			||||||
 | 
					\maketitle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\pagestyle{fancyplain}
 | 
				
			||||||
 | 
					\bibliographystyle{plain}
 | 
				
			||||||
 | 
					\pagenumbering{roman}
 | 
				
			||||||
 | 
					\setheader{{\it CONTENTS}}{}{}{}{}{{\it CONTENTS}}
 | 
				
			||||||
 | 
					\setfooter{\thepage}{}{}{}{}{\thepage}
 | 
				
			||||||
 | 
					\tableofcontents%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\input{intro.tex}
 | 
				
			||||||
 | 
					%
 | 
				
			||||||
 | 
					\input{sample.tex}
 | 
				
			||||||
 | 
					%
 | 
				
			||||||
 | 
					\input{classes.tex}
 | 
				
			||||||
 | 
					%
 | 
				
			||||||
 | 
					\input{topics.tex}
 | 
				
			||||||
 | 
					%
 | 
				
			||||||
 | 
					\input{bugs.tex}
 | 
				
			||||||
 | 
					%
 | 
				
			||||||
 | 
					\input{changes.tex}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%
 | 
				
			||||||
 | 
					\addcontentsline{toc}{chapter}{Index}
 | 
				
			||||||
 | 
					\setheader{{\it INDEX}}{}{}{}{}{{\it INDEX}}
 | 
				
			||||||
 | 
					\setfooter{\thepage}{}{}{}{}{\thepage}%
 | 
				
			||||||
 | 
					\printindex
 | 
				
			||||||
 | 
					\end{document}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								utils/ogl/docs/ogledit.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 86 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								utils/ogl/docs/ogledit.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.0 KiB  | 
							
								
								
									
										128
									
								
								utils/ogl/docs/sample.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,128 @@
 | 
				
			|||||||
 | 
					\chapter{OGLEdit: a sample OGL application}\label{ogledit}%
 | 
				
			||||||
 | 
					\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
 | 
				
			||||||
 | 
					\setfooter{\thepage}{}{}{}{}{\thepage}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OGLEdit is a sample OGL application that allows the user to draw, edit,
 | 
				
			||||||
 | 
					save and load a few shapes. It should clarify aspects of OGL usage, and
 | 
				
			||||||
 | 
					can act as a template for similar applications. OGLEdit can be found in\rtfsp
 | 
				
			||||||
 | 
					{\tt samples/ogledit} in the OGL distribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$$\image{10cm;0cm}{ogledit.eps}$$\par
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The wxWindows document/view model has been used in OGL, to reduce the amount of
 | 
				
			||||||
 | 
					housekeeping logic required to get it up and running. OGLEdit also provides
 | 
				
			||||||
 | 
					a demonstration of the Undo/Redo capability supported by the document/view classes,
 | 
				
			||||||
 | 
					and how a typical application might implement this feature.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{\it Note:} A bug in the wxWindows document/view implementation before
 | 
				
			||||||
 | 
					version 1.66C may cause Do/Undo to misbehave and get out of sync. If this is the case,
 | 
				
			||||||
 | 
					please replace wxCommandProcessor::Submit with the following in wx\_doc.cpp.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{\small
 | 
				
			||||||
 | 
					\begin{verbatim}
 | 
				
			||||||
 | 
					  Bool wxCommandProcessor::Submit(wxCommand *command, Bool storeIt)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    Bool success = command->Do();
 | 
				
			||||||
 | 
					    if (success && storeIt)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (commands.Number() == maxNoCommands)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxNode *firstNode = commands.First();
 | 
				
			||||||
 | 
					        wxCommand *firstCommand = (wxCommand *)firstNode->Data();
 | 
				
			||||||
 | 
					        delete firstCommand;
 | 
				
			||||||
 | 
					        delete firstNode;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Correct a bug: we must chop off the current 'branch'
 | 
				
			||||||
 | 
					      // so that we're at the end of the command list.
 | 
				
			||||||
 | 
					      if (currentCommand)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxNode *node = currentCommand->Next();
 | 
				
			||||||
 | 
					        while (node)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          wxNode *next = node->Next();
 | 
				
			||||||
 | 
					          delete node;
 | 
				
			||||||
 | 
					          node = next;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					      commands.Append(command);
 | 
				
			||||||
 | 
					      currentCommand = commands.Last();
 | 
				
			||||||
 | 
					      SetMenuStrings();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return success;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					\end{verbatim}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\section{OGLEdit files}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OGLEdit comprises the following source files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\begin{itemize}\itemsep=0pt
 | 
				
			||||||
 | 
					\item doc.h, doc.cpp: MyDiagram, DiagramDocument, DiagramCommand, MyEvtHandler
 | 
				
			||||||
 | 
					classes related to diagram functionality and documents.
 | 
				
			||||||
 | 
					\item view.h, view.cpp: MyCanvas, DiagramView classes related to visualisation of
 | 
				
			||||||
 | 
					the diagram.
 | 
				
			||||||
 | 
					\item ogledit.h, ogledit.cpp: MyFrame, MyApp classes related to the overall application.
 | 
				
			||||||
 | 
					\item palette.h, palette.cpp: EditorToolPalette implementing the shape palette.
 | 
				
			||||||
 | 
					\end{itemize}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\section{How OGLEdit works}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OGLEdit defines a DiagramDocument class, each of instance of which holds a MyDiagram
 | 
				
			||||||
 | 
					member which itself contains the shapes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In order to implement specific mouse behaviour for shapes, a class MyEvtHandler is
 | 
				
			||||||
 | 
					defined which is `plugged into' each shape when it is created, instead of overriding each shape class
 | 
				
			||||||
 | 
					individually. This event handler class also holds a label string.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The DiagramCommand class is the key to implementing Undo/Redo. Each instance of DiagramCommand
 | 
				
			||||||
 | 
					stores enough information about an operation (create, delete, change colour etc.) to allow
 | 
				
			||||||
 | 
					it to carry out (or undo) its command. In DiagramView::OnMenuCommand, when the user initiates the
 | 
				
			||||||
 | 
					command, a new DiagramCommand instance is created which is then sent to the document's
 | 
				
			||||||
 | 
					command processor (see wxWindows manual for more information about doc/view and command
 | 
				
			||||||
 | 
					processing).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Apart from menu commands, another way commands are initiated is by the user left-clicking on
 | 
				
			||||||
 | 
					the canvas or right-dragging on a node. MyCanvas::OnLeftClick in view.cpp shows how
 | 
				
			||||||
 | 
					the appropriate wxClassInfo is passed to a DiagramCommand, to allow DiagramCommand::Do
 | 
				
			||||||
 | 
					to create a new shape given the wxClassInfo.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The MyEvtHandler right-drag methods in doc.cpp implement drawing a line between
 | 
				
			||||||
 | 
					two shapes, detecting where the right mouse button was released and looking for a second
 | 
				
			||||||
 | 
					shape. Again, a new DiagramCommand instance is created and passed to the command
 | 
				
			||||||
 | 
					processor to carry out the command.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DiagramCommand::Do and DiagramCommand::Undo embody much of the
 | 
				
			||||||
 | 
					interesting interaction with the OGL library. A complication of note
 | 
				
			||||||
 | 
					when implementing undo is the problem of deleting a node shape which has
 | 
				
			||||||
 | 
					one or more arcs attached to it. If you delete the node, the arc(s)
 | 
				
			||||||
 | 
					should be deleted too. But multiple arc deletion represents more information
 | 
				
			||||||
 | 
					that can be incorporated in the existing DiagramCommand scheme. OGLEdit
 | 
				
			||||||
 | 
					copes with this by treating each arc deletion as a separate command, and
 | 
				
			||||||
 | 
					sending Cut commands recursively, providing an undo path. Undoing such a
 | 
				
			||||||
 | 
					Cut will only undo one command at a time - not a one to one
 | 
				
			||||||
 | 
					correspondence with the original command - but it's a reasonable
 | 
				
			||||||
 | 
					compromise and preserves Do/Undo whilst keeping our DiagramCommand class
 | 
				
			||||||
 | 
					simple.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\section{Possible enhancements}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OGLEdit is very simplistic and does not employ the more advanced features
 | 
				
			||||||
 | 
					of OGL, such as:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\begin{itemize}\itemsep=0pt
 | 
				
			||||||
 | 
					\item attachment points (arcs are drawn to particular points on a shape)
 | 
				
			||||||
 | 
					\item metafile and bitmaps shapes
 | 
				
			||||||
 | 
					\item divided rectangles
 | 
				
			||||||
 | 
					\item composite shapes, and constraints
 | 
				
			||||||
 | 
					\item creating labels in shape regions
 | 
				
			||||||
 | 
					\item arc labels (OGL has support for three movable labels per arc)
 | 
				
			||||||
 | 
					\item spline and multiple-segment line arcs
 | 
				
			||||||
 | 
					\item adding annotations to node and arc shapes
 | 
				
			||||||
 | 
					\item line-straightening (supported by OGL) and alignment (not supported directly by OGL)
 | 
				
			||||||
 | 
					\end{itemize}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These could be added to OGLEdit, at the risk of making it a less
 | 
				
			||||||
 | 
					useful example for beginners.
 | 
				
			||||||
							
								
								
									
										20
									
								
								utils/ogl/docs/tex2rtf.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					runTwice = yes
 | 
				
			||||||
 | 
					titleFontSize = 12
 | 
				
			||||||
 | 
					authorFontSize = 10
 | 
				
			||||||
 | 
					chapterFontSize = 12
 | 
				
			||||||
 | 
					sectionFontSize = 12
 | 
				
			||||||
 | 
					subsectionFontSize = 12
 | 
				
			||||||
 | 
					headerRule = yes
 | 
				
			||||||
 | 
					footerRule = yes
 | 
				
			||||||
 | 
					useHeadingStyles = yes
 | 
				
			||||||
 | 
					listItemIndent=40
 | 
				
			||||||
 | 
					generateHPJ = no
 | 
				
			||||||
 | 
					htmlBrowseButtons = bitmap
 | 
				
			||||||
 | 
					winHelpVersion = 3
 | 
				
			||||||
 | 
					winHelpContents = yes
 | 
				
			||||||
 | 
					winHelpTitle = "OGL Manual"
 | 
				
			||||||
 | 
					truncateFilenames = yes
 | 
				
			||||||
 | 
					combineSubSections = yes
 | 
				
			||||||
 | 
					\overview [2] {\rtfonly{See also }\sethotspotcolour{off}\sethotspotunderline{on}\winhelponly{\image{}{books.bmp}}
 | 
				
			||||||
 | 
					\htmlonly{\image{}{books.gif}}\helpref{#1}{#2}
 | 
				
			||||||
 | 
					\sethotspotcolour{on}\sethotspotunderline{on}}
 | 
				
			||||||
							
								
								
									
										163
									
								
								utils/ogl/docs/topics.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,163 @@
 | 
				
			|||||||
 | 
					\chapter{Topic overviews}
 | 
				
			||||||
 | 
					\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
 | 
				
			||||||
 | 
					\setfooter{\thepage}{}{}{}{}{\thepage}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The following sections describe particular topics.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\section{OGL overview}\label{ogloverview}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\helpref{wxShapeCanvas}{wxshapecanvas}, derived from {\bf wxCanvas}, is the drawing area
 | 
				
			||||||
 | 
					for a number of \helpref{wxShape}{wxshape} instances. Everything drawn on a
 | 
				
			||||||
 | 
					wxShapeCanvas is derived from wxShape, which provides virtual
 | 
				
			||||||
 | 
					member functions for redrawing, creating and destroying
 | 
				
			||||||
 | 
					resize/selection `handles', movement and erasing behaviour, mouse
 | 
				
			||||||
 | 
					click behaviour, calculating the bounding box of the shape, linking
 | 
				
			||||||
 | 
					nodes with arcs, and so on.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The way a client application copes with `damage' to the canvas is to
 | 
				
			||||||
 | 
					erase (white out) anything should no longer be displayed, redraw the shape,
 | 
				
			||||||
 | 
					and then redraw everything on the canvas to repair any damage. If quick edit
 | 
				
			||||||
 | 
					mode is on for the canvas, the complete should be omitted by OGL and the
 | 
				
			||||||
 | 
					application.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Selection handles (called control points in the code) are implemented as
 | 
				
			||||||
 | 
					wxRectangleShapes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Events are passed to shapes by the canvas in a high-level form, for example {\bf OnLeftClick},
 | 
				
			||||||
 | 
					{\bf OnBeginDragLeft}, {\bf OnDragLeft}, {\bf OnEndDragLeft}. The canvas decides
 | 
				
			||||||
 | 
					what is a click and what is a drag, whether it is on a shape or the canvas itself,
 | 
				
			||||||
 | 
					and (by interrogating the shape) which attachment point the click is associated with.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In order to provide event-handling flexibility, each shapes has an `event handler' associated with it,
 | 
				
			||||||
 | 
					which by default is the shape itself (all shapes derive from wxShapeEvtHandler).
 | 
				
			||||||
 | 
					An application can modify the event-handling behaviour simply by plugging a new
 | 
				
			||||||
 | 
					event handler into the shape. This can avoid the need for multiple inheritance when
 | 
				
			||||||
 | 
					new properties and behaviour are required for a number of different shape classes: instead
 | 
				
			||||||
 | 
					of overriding each class, one new event handler class can be defined and used for all
 | 
				
			||||||
 | 
					existing shape classes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A range of shapes have been predefined in the library, including rectangles, ellipses,
 | 
				
			||||||
 | 
					polygons. A client application can derive from these shapes and/or derive entirely
 | 
				
			||||||
 | 
					new shapes from wxShape.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Instances of a class called \helpref{wxDiagram}{wxdiagram} organise collections of
 | 
				
			||||||
 | 
					shapes, providing default file input and output behaviour.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\section{wxDividedShape overview}\label{dividedshapeoverview}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Classes: \helpref{wxDividedShape}{wxdividedshape}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A wxDividedShape is a rectangle with a number of vertical divisions. Each
 | 
				
			||||||
 | 
					division may have its text formatted with independent characteristics, and
 | 
				
			||||||
 | 
					the size of each division relative to the whole image may be specified.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Once a wxDividedShape has been created, the user may move the divisions with the
 | 
				
			||||||
 | 
					mouse. By pressing Ctrl while right-clicking, the region attributes can be edited.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Here are examples of creating wxDividedShape objects:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{\small
 | 
				
			||||||
 | 
					\begin{verbatim}
 | 
				
			||||||
 | 
					  /*
 | 
				
			||||||
 | 
					   * Divided rectangle with 3 regions
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxDividedShape *dividedRect = new wxDividedShape(50, 60);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxShapeRegion *region = new wxShapeRegion;
 | 
				
			||||||
 | 
					  region->SetProportions(0.0, 0.25);
 | 
				
			||||||
 | 
					  dividedRect->AddRegion(region);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  region = new wxShapeRegion;
 | 
				
			||||||
 | 
					  region->SetProportions(0.0, 0.5);
 | 
				
			||||||
 | 
					  dividedRect->AddRegion(region);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  region = new wxShapeRegion;
 | 
				
			||||||
 | 
					  region->SetProportions(0.0, 0.25);
 | 
				
			||||||
 | 
					  dividedRect->AddRegion(region);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  dividedRect->SetSize(50, 60); // Allow it to calculate region sizes
 | 
				
			||||||
 | 
					  dividedRect->SetPen(wxBLACK_PEN);
 | 
				
			||||||
 | 
					  dividedRect->SetBrush(wxWHITE_BRUSH);
 | 
				
			||||||
 | 
					  dividedRect->Show(TRUE);
 | 
				
			||||||
 | 
					  dividedRect->NameRegions();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /*
 | 
				
			||||||
 | 
					   * Divided rectangle with 3 regions, rounded
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxDividedShape *dividedRect3 = new wxDividedShape(50, 60);
 | 
				
			||||||
 | 
					  dividedRect3->SetCornerRadius(-0.4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  region = new wxShapeRegion;
 | 
				
			||||||
 | 
					  region->SetProportions(0.0, 0.25);
 | 
				
			||||||
 | 
					  dividedRect3->AddRegion(region);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  region = new wxShapeRegion;
 | 
				
			||||||
 | 
					  region->SetProportions(0.0, 0.5);
 | 
				
			||||||
 | 
					  dividedRect3->AddRegion(region);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  region = new wxShapeRegion;
 | 
				
			||||||
 | 
					  region->SetProportions(0.0, 0.25);
 | 
				
			||||||
 | 
					  dividedRect3->AddRegion(region);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  dividedRect3->SetSize(50, 60); // Allow it to calculate region sizes
 | 
				
			||||||
 | 
					  dividedRect3->SetPen(wxBLACK_PEN);
 | 
				
			||||||
 | 
					  dividedRect3->SetBrush(wxWHITE_BRUSH);
 | 
				
			||||||
 | 
					  dividedRect3->Show(TRUE);
 | 
				
			||||||
 | 
					  dividedRect3->NameRegions();
 | 
				
			||||||
 | 
					\end{verbatim}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\section{wxCompositeShape overview}\label{compositeshapeoverview}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Classes: \helpref{wxCompositeShape}{wxcompositeshape}, \helpref{OGLConstraint}{oglconstraint}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The wxCompositeShape allows fairly complex shapes to be created, and maintains
 | 
				
			||||||
 | 
					a set of constraints which specify the layout and proportions of child shapes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Add child shapes to a wxCompositeShape using \helpref{AddChild}{wxcompositeshapeaddchild}, and
 | 
				
			||||||
 | 
					add constraints using \helpref{AddConstraint}{wxcompositeshapeaddconstraint}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					After children and shapes have been added, call \helpref{Recompute}{wxcompositeshaperecompute} which
 | 
				
			||||||
 | 
					will return TRUE is the constraints could be satisfied, FALSE otherwise. If
 | 
				
			||||||
 | 
					constraints have been correctly and consistently specified, this call will succeed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If there is more than one child, constraints must be specified: OGL cannot calculate
 | 
				
			||||||
 | 
					the size and position of children otherwise. Don't assume that children will simply
 | 
				
			||||||
 | 
					move relative to the parent without the use of constraints.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To specify a constraint, you need three things:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\begin{enumerate}\itemsep=0pt
 | 
				
			||||||
 | 
					\item a constraint type, such as gyCONSTRAINT\_CENTRED\_VERTICALLY;
 | 
				
			||||||
 | 
					\item a reference shape, with respect to which other shapes are going to be positioned - the\rtfsp
 | 
				
			||||||
 | 
					{\it constraining} shape;
 | 
				
			||||||
 | 
					\item a list of one or more shapes to be constrained: the {\it constrained} shapes.
 | 
				
			||||||
 | 
					\end{enumerate}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The constraining shape can be either the parent of the constrained shapes, or a sibling. The
 | 
				
			||||||
 | 
					constrained shapes must all be siblings of each other.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For an exhaustive list and description of the available constraint types, see the \helpref{OGLConstraint constructor}{oglconstraintconstr}.
 | 
				
			||||||
 | 
					Note that most constraints operate in one dimension only (vertically or horizontally), so you will
 | 
				
			||||||
 | 
					usually need to specify constraints in pairs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can set the spacing between constraining and constrained shapes by
 | 
				
			||||||
 | 
					calling \helpref{OGLConstraint::SetSpacing}{oglconstraintsetspacing}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Finally, a wxCompositeShape can have {\it divisions}, which are special child shapes of class
 | 
				
			||||||
 | 
					wxDivisionShape (not to be confused with wxDividedShape). The purpose of this is to allow
 | 
				
			||||||
 | 
					the composite to be divided into user-adjustable regions (divisions) into which other shapes
 | 
				
			||||||
 | 
					can be dropped dynamically, given suitable application code. Divisons allow the child
 | 
				
			||||||
 | 
					shapes to have an identity of their own - they can be manipulated independently of their container -
 | 
				
			||||||
 | 
					but to behave as if they are contained with the division, moving with the parent shape.
 | 
				
			||||||
 | 
					Divisions boundaries can themselves be moved using the mouse.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To create an initial division, call \helpref{wxCompositeShape::MakeContainer}{wxcompositeshapemakecontainer}.
 | 
				
			||||||
 | 
					Make further divisions by calling \helpref{wxDivisionShape::Divide}{wxdivisionshapedivide}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								utils/ogl/docs/up.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 137 B  | 
							
								
								
									
										2434
									
								
								utils/ogl/src/basic.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										605
									
								
								utils/ogl/src/basic.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,605 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        basic.h
 | 
				
			||||||
 | 
					// Purpose:     Basic OGL classes and definitions
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_BASIC_H_
 | 
				
			||||||
 | 
					#define _OGL_BASIC_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "basic.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define OGL_VERSION     2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef DEFAULT_MOUSE_TOLERANCE
 | 
				
			||||||
 | 
					#define DEFAULT_MOUSE_TOLERANCE 3
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Edit these lines if you positively don't want PROLOGIO support
 | 
				
			||||||
 | 
					#ifndef PROLOGIO
 | 
				
			||||||
 | 
					#define PROLOGIO
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Key identifiers
 | 
				
			||||||
 | 
					#define KEY_SHIFT 1
 | 
				
			||||||
 | 
					#define KEY_CTRL  2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Arrow styles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ARROW_NONE         0
 | 
				
			||||||
 | 
					#define ARROW_END          1
 | 
				
			||||||
 | 
					#define ARROW_BOTH         2
 | 
				
			||||||
 | 
					#define ARROW_MIDDLE       3
 | 
				
			||||||
 | 
					#define ARROW_START        4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Control point types
 | 
				
			||||||
 | 
					// Rectangle and most other shapes
 | 
				
			||||||
 | 
					#define CONTROL_POINT_VERTICAL   1
 | 
				
			||||||
 | 
					#define CONTROL_POINT_HORIZONTAL 2
 | 
				
			||||||
 | 
					#define CONTROL_POINT_DIAGONAL   3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Line
 | 
				
			||||||
 | 
					#define CONTROL_POINT_ENDPOINT_TO 4
 | 
				
			||||||
 | 
					#define CONTROL_POINT_ENDPOINT_FROM 5
 | 
				
			||||||
 | 
					#define CONTROL_POINT_LINE       6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Types of formatting: can be combined in a bit list
 | 
				
			||||||
 | 
					#define FORMAT_NONE           0
 | 
				
			||||||
 | 
					                                // Left justification
 | 
				
			||||||
 | 
					#define FORMAT_CENTRE_HORIZ   1
 | 
				
			||||||
 | 
					                                // Centre horizontally
 | 
				
			||||||
 | 
					#define FORMAT_CENTRE_VERT    2
 | 
				
			||||||
 | 
					                                // Centre vertically
 | 
				
			||||||
 | 
					#define FORMAT_SIZE_TO_CONTENTS 4
 | 
				
			||||||
 | 
					                                // Resize shape to contents
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Shadow mode
 | 
				
			||||||
 | 
					#define SHADOW_NONE           0
 | 
				
			||||||
 | 
					#define SHADOW_LEFT           1
 | 
				
			||||||
 | 
					#define SHADOW_RIGHT          2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Declare types
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SHAPE_BASIC           wxTYPE_USER + 1
 | 
				
			||||||
 | 
					#define SHAPE_RECTANGLE       wxTYPE_USER + 2
 | 
				
			||||||
 | 
					#define SHAPE_ELLIPSE         wxTYPE_USER + 3
 | 
				
			||||||
 | 
					#define SHAPE_POLYGON         wxTYPE_USER + 4
 | 
				
			||||||
 | 
					#define SHAPE_CIRCLE          wxTYPE_USER + 5
 | 
				
			||||||
 | 
					#define SHAPE_LINE            wxTYPE_USER + 6
 | 
				
			||||||
 | 
					#define SHAPE_DIVIDED_RECTANGLE wxTYPE_USER + 8
 | 
				
			||||||
 | 
					#define SHAPE_COMPOSITE       wxTYPE_USER + 9
 | 
				
			||||||
 | 
					#define SHAPE_CONTROL_POINT   wxTYPE_USER + 10
 | 
				
			||||||
 | 
					#define SHAPE_DRAWN           wxTYPE_USER + 11
 | 
				
			||||||
 | 
					#define SHAPE_DIVISION        wxTYPE_USER + 12
 | 
				
			||||||
 | 
					#define SHAPE_LABEL_OBJECT    wxTYPE_USER + 13
 | 
				
			||||||
 | 
					#define SHAPE_BITMAP          wxTYPE_USER + 14
 | 
				
			||||||
 | 
					#define SHAPE_DIVIDED_OBJECT_CONTROL_POINT   wxTYPE_USER + 15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define OBJECT_REGION         wxTYPE_USER + 20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define OP_CLICK_LEFT  1
 | 
				
			||||||
 | 
					#define OP_CLICK_RIGHT 2
 | 
				
			||||||
 | 
					#define OP_DRAG_LEFT 4
 | 
				
			||||||
 | 
					#define OP_DRAG_RIGHT 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define OP_ALL (OP_CLICK_LEFT | OP_CLICK_RIGHT | OP_DRAG_LEFT | OP_DRAG_RIGHT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxShapeTextLine;
 | 
				
			||||||
 | 
					class wxShapeCanvas;
 | 
				
			||||||
 | 
					class wxLineShape;
 | 
				
			||||||
 | 
					class wxControlPoint;
 | 
				
			||||||
 | 
					class wxShapeRegion;
 | 
				
			||||||
 | 
					class wxShape;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					class wxExpr;
 | 
				
			||||||
 | 
					class wxDatabase;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxShapeEvtHandler: public wxObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxShapeEvtHandler)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxShapeEvtHandler(wxShapeEvtHandler *prev = NULL, wxShape *shape = NULL);
 | 
				
			||||||
 | 
					  virtual ~wxShapeEvtHandler();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline void SetHandlerShape(wxShape *sh) { m_handlerShape = sh; }
 | 
				
			||||||
 | 
					  inline wxShape *GetShape() const { return m_handlerShape; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // This is called when the _shape_ is deleted.
 | 
				
			||||||
 | 
					  virtual void OnDelete();
 | 
				
			||||||
 | 
					  virtual void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnDrawContents(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnMoveLinks(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnErase(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnEraseContents(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnHighlight(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnLeftClick(float x, float y, int keys = 0, int attachment = 0);
 | 
				
			||||||
 | 
					  virtual void OnRightClick(float x, float y, int keys = 0, int attachment = 0);
 | 
				
			||||||
 | 
					  virtual void OnSize(float x, float y);
 | 
				
			||||||
 | 
					  virtual bool OnMovePre(wxDC& dc, float x, float y, float old_x, float old_y, bool display = TRUE);
 | 
				
			||||||
 | 
					  virtual void OnMovePost(wxDC& dc, float x, float y, float old_x, float old_y, bool display = TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void OnDragLeft(bool draw, float x, float y, int keys=0, int attachment = 0); // Erase if draw false
 | 
				
			||||||
 | 
					  virtual void OnBeginDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  virtual void OnEndDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  virtual void OnDragRight(bool draw, float x, float y, int keys=0, int attachment = 0); // Erase if draw false
 | 
				
			||||||
 | 
					  virtual void OnBeginDragRight(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  virtual void OnEndDragRight(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  virtual void OnDrawOutline(wxDC& dc, float x, float y, float w, float h);
 | 
				
			||||||
 | 
					  virtual void OnDrawControlPoints(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnEraseControlPoints(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnMoveLink(wxDC& dc, bool moveControlPoints = TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void OnBeginSize(float WXUNUSED(w), float WXUNUSED(h)) { }
 | 
				
			||||||
 | 
					  virtual void OnEndSize(float WXUNUSED(w), float WXUNUSED(h)) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 private:
 | 
				
			||||||
 | 
					  wxShapeEvtHandler*    m_previousHandler;
 | 
				
			||||||
 | 
					  wxShape*              m_handlerShape;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxShape: public wxShapeEvtHandler
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_ABSTRACT_CLASS(wxShape)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxShape(wxShapeCanvas *can = NULL);
 | 
				
			||||||
 | 
					  virtual ~wxShape();
 | 
				
			||||||
 | 
					  virtual void GetBoundingBoxMax(float *width, float *height);
 | 
				
			||||||
 | 
					  virtual void GetBoundingBoxMin(float *width, float *height) = 0;
 | 
				
			||||||
 | 
					  virtual bool GetPerimeterPoint(float x1, float y1,
 | 
				
			||||||
 | 
					                                 float x2, float y2,
 | 
				
			||||||
 | 
					                                 float *x3, float *y3);
 | 
				
			||||||
 | 
					  inline wxShapeCanvas *GetCanvas() { return m_canvas; }
 | 
				
			||||||
 | 
					  void SetCanvas(wxShapeCanvas *the_canvas);
 | 
				
			||||||
 | 
					  virtual void AddToCanvas(wxShapeCanvas *the_canvas, wxShape *addAfter = NULL);
 | 
				
			||||||
 | 
					  virtual void InsertInCanvas(wxShapeCanvas *the_canvas);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void RemoveFromCanvas(wxShapeCanvas *the_canvas);
 | 
				
			||||||
 | 
					  inline float GetX() const { return m_xpos; }
 | 
				
			||||||
 | 
					  inline float GetY() const { return m_ypos; }
 | 
				
			||||||
 | 
					  inline void SetX(float x) { m_xpos = x; }
 | 
				
			||||||
 | 
					  inline void SetY(float y) { m_ypos = y; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline wxShape *GetParent() const { return m_parent; }
 | 
				
			||||||
 | 
					  inline void SetParent(wxShape *p) { m_parent = p; }
 | 
				
			||||||
 | 
					  wxShape *GetTopAncestor();
 | 
				
			||||||
 | 
					  inline wxList& GetChildren() { return m_children; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnDrawContents(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnMoveLinks(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void Unlink() { };
 | 
				
			||||||
 | 
					  void SetDrawHandles(bool drawH);
 | 
				
			||||||
 | 
					  inline bool GetDrawHandles() { return m_drawHandles; }
 | 
				
			||||||
 | 
					  virtual void OnErase(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnEraseContents(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnHighlight(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnLeftClick(float x, float y, int keys = 0, int attachment = 0);
 | 
				
			||||||
 | 
					  virtual void OnRightClick(float x, float y, int keys = 0, int attachment = 0);
 | 
				
			||||||
 | 
					  virtual void OnSize(float x, float y);
 | 
				
			||||||
 | 
					  virtual bool OnMovePre(wxDC& dc, float x, float y, float old_x, float old_y, bool display = TRUE);
 | 
				
			||||||
 | 
					  virtual void OnMovePost(wxDC& dc, float x, float y, float old_x, float old_y, bool display = TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void OnDragLeft(bool draw, float x, float y, int keys=0, int attachment = 0); // Erase if draw false
 | 
				
			||||||
 | 
					  virtual void OnBeginDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  virtual void OnEndDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  virtual void OnDragRight(bool draw, float x, float y, int keys=0, int attachment = 0); // Erase if draw false
 | 
				
			||||||
 | 
					  virtual void OnBeginDragRight(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  virtual void OnEndDragRight(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  virtual void OnDrawOutline(wxDC& dc, float x, float y, float w, float h);
 | 
				
			||||||
 | 
					  virtual void OnDrawControlPoints(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void OnEraseControlPoints(wxDC& dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void OnBeginSize(float WXUNUSED(w), float WXUNUSED(h)) { }
 | 
				
			||||||
 | 
					  virtual void OnEndSize(float WXUNUSED(w), float WXUNUSED(h)) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void MakeControlPoints();
 | 
				
			||||||
 | 
					  virtual void DeleteControlPoints(wxDC *dc = NULL);
 | 
				
			||||||
 | 
					  virtual void ResetControlPoints();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline wxShapeEvtHandler *GetEventHandler() { return m_eventHandler; }
 | 
				
			||||||
 | 
					  inline void SetEventHandler(wxShapeEvtHandler *handler) { m_eventHandler = handler; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Mandatory control points, e.g. the divided line moving handles
 | 
				
			||||||
 | 
					  // should appear even if a child of the 'selected' image
 | 
				
			||||||
 | 
					  virtual void MakeMandatoryControlPoints();
 | 
				
			||||||
 | 
					  virtual void ResetMandatoryControlPoints();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline virtual bool Recompute() { return TRUE; };
 | 
				
			||||||
 | 
					  // Calculate size recursively, if size changes. Size might depend on children.
 | 
				
			||||||
 | 
					  inline virtual void CalculateSize() { };
 | 
				
			||||||
 | 
					  virtual void Select(bool select = TRUE, wxDC* dc = NULL);
 | 
				
			||||||
 | 
					  virtual void SetHighlight(bool hi = TRUE, bool recurse = FALSE);
 | 
				
			||||||
 | 
					  inline virtual bool IsHighlighted() const { return m_highlighted; };
 | 
				
			||||||
 | 
					  virtual bool Selected() const;
 | 
				
			||||||
 | 
					  virtual bool AncestorSelected() const;
 | 
				
			||||||
 | 
					  void SetSensitivityFilter(int sens = OP_ALL, bool recursive = FALSE);
 | 
				
			||||||
 | 
					  int GetSensitivityFilter() const { return m_sensitivity; }
 | 
				
			||||||
 | 
					  void SetDraggable(bool drag, bool recursive = FALSE);
 | 
				
			||||||
 | 
					  inline  void SetFixedSize(bool x, bool y) { m_fixedWidth = x; m_fixedHeight = y; };
 | 
				
			||||||
 | 
					  inline  void GetFixedSize(bool *x, bool *y) const { *x = m_fixedWidth; *y = m_fixedHeight; };
 | 
				
			||||||
 | 
					  inline  bool GetFixedWidth() const { return m_fixedWidth; }
 | 
				
			||||||
 | 
					  inline  bool GetFixedHeight() const { return m_fixedHeight; }
 | 
				
			||||||
 | 
					  inline  void SetSpaceAttachments(bool sp) { m_spaceAttachments = sp; };
 | 
				
			||||||
 | 
					  inline  bool GetSpaceAttachments() const { return m_spaceAttachments; };
 | 
				
			||||||
 | 
					  void SetShadowMode(int mode, bool redraw = FALSE);
 | 
				
			||||||
 | 
					  inline int GetShadowMode() const { return m_shadowMode; }
 | 
				
			||||||
 | 
					  virtual bool HitTest(float x, float y, int *attachment, float *distance);
 | 
				
			||||||
 | 
					  inline void SetCentreResize(bool cr) { m_centreResize = cr; }
 | 
				
			||||||
 | 
					  inline bool GetCentreResize() const { return m_centreResize; }
 | 
				
			||||||
 | 
					  inline wxList& GetLines() { return m_lines; }
 | 
				
			||||||
 | 
					  inline void SetDisableLabel(bool flag) { m_disableLabel = flag; }
 | 
				
			||||||
 | 
					  inline bool GetDisableLabel() const { return m_disableLabel; }
 | 
				
			||||||
 | 
					  inline void SetAttachmentMode(bool flag) { m_attachmentMode = flag; }
 | 
				
			||||||
 | 
					  inline bool GetAttachmentMode() const { return m_attachmentMode; }
 | 
				
			||||||
 | 
					  inline void SetId(long i) { m_id = i; }
 | 
				
			||||||
 | 
					  inline long GetId() const { return m_id; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void SetPen(wxPen *pen);
 | 
				
			||||||
 | 
					  void SetBrush(wxBrush *brush);
 | 
				
			||||||
 | 
					  inline void SetClientData(wxObject *client_data) { m_clientData = client_data; };
 | 
				
			||||||
 | 
					  inline wxObject *GetClientData() const { return m_clientData; };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void Show(bool show);
 | 
				
			||||||
 | 
					  virtual bool IsShown() const { return m_visible; }
 | 
				
			||||||
 | 
					  virtual void Move(wxDC& dc, float x1, float y1, bool display = TRUE);
 | 
				
			||||||
 | 
					  virtual void Erase(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void EraseContents(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void Draw(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void Flash();
 | 
				
			||||||
 | 
					  virtual void MoveLinks(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void DrawContents(wxDC& dc);  // E.g. for drawing text label
 | 
				
			||||||
 | 
					  virtual void SetSize(float x, float y, bool recursive = TRUE);
 | 
				
			||||||
 | 
					  virtual void SetAttachmentSize(float x, float y);
 | 
				
			||||||
 | 
					  void Attach(wxShapeCanvas *can);
 | 
				
			||||||
 | 
					  void Detach();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline virtual bool Constrain() { return FALSE; } ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void AddLine(wxLineShape *line, wxShape *other,
 | 
				
			||||||
 | 
					               int attachFrom = 0, int attachTo = 0);
 | 
				
			||||||
 | 
					  void AddText(const wxString& string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline wxPen *GetPen() const { return m_pen; }
 | 
				
			||||||
 | 
					  inline wxBrush *GetBrush() const { return m_brush; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /*
 | 
				
			||||||
 | 
					   * Region-specific functions (defaults to the default region
 | 
				
			||||||
 | 
					   * for simple objects
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Set the default, single region size to be consistent
 | 
				
			||||||
 | 
					  // with the object size
 | 
				
			||||||
 | 
					  void SetDefaultRegionSize();
 | 
				
			||||||
 | 
					  virtual void FormatText(wxDC& dc, const wxString& s, int regionId = 0);
 | 
				
			||||||
 | 
					  virtual void SetFormatMode(int mode, int regionId = 0);
 | 
				
			||||||
 | 
					  virtual int GetFormatMode(int regionId = 0) const;
 | 
				
			||||||
 | 
					  virtual void SetFont(wxFont *font, int regionId = 0);
 | 
				
			||||||
 | 
					  virtual wxFont *GetFont(int regionId = 0) const;
 | 
				
			||||||
 | 
					  virtual void SetTextColour(const wxString& colour, int regionId = 0);
 | 
				
			||||||
 | 
					  virtual wxString GetTextColour(int regionId = 0) const;
 | 
				
			||||||
 | 
					  virtual inline int GetNumberOfTextRegions() const { return m_regions.Number(); }
 | 
				
			||||||
 | 
					  virtual void SetRegionName(const wxString& name, int regionId = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Get the name representing the region for this image alone.
 | 
				
			||||||
 | 
					  // I.e. this image's region ids go from 0 to N-1.
 | 
				
			||||||
 | 
					  // But the names might be "0.2.0", "0.2.1" etc. depending on position in composite.
 | 
				
			||||||
 | 
					  // So the last digit represents the region Id, the others represent positions
 | 
				
			||||||
 | 
					  // in composites.
 | 
				
			||||||
 | 
					  virtual wxString GetRegionName(int regionId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Gets the region corresponding to the name, or -1 if not found.
 | 
				
			||||||
 | 
					  virtual int GetRegionId(const wxString& name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Construct names for regions, unique even for children of a composite.
 | 
				
			||||||
 | 
					  virtual void NameRegions(const wxString& parentName = "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Get list of regions
 | 
				
			||||||
 | 
					  inline wxList& GetRegions() { return m_regions; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void AddRegion(wxShapeRegion *region);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void ClearRegions();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Assign new ids to this image and children (if composite)
 | 
				
			||||||
 | 
					  void AssignNewIds();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns actual image (same as 'this' if non-composite) and region id
 | 
				
			||||||
 | 
					  // for given region name.
 | 
				
			||||||
 | 
					  virtual wxShape *FindRegion(const wxString& regionName, int *regionId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Finds all region names for this image (composite or simple).
 | 
				
			||||||
 | 
					  // Supply empty string list.
 | 
				
			||||||
 | 
					  virtual void FindRegionNames(wxStringList& list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void ClearText(int regionId = 0);
 | 
				
			||||||
 | 
					  void RemoveLine(wxLineShape *line);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					  // Prolog database stuff
 | 
				
			||||||
 | 
					  virtual char *GetFunctor();
 | 
				
			||||||
 | 
					  virtual void WritePrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					  virtual void ReadPrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // In case the object has constraints it needs to read in in a different pass
 | 
				
			||||||
 | 
					  inline virtual void ReadConstraints(wxExpr *WXUNUSED(clause), wxExprDatabase *WXUNUSED(database)) { };
 | 
				
			||||||
 | 
					  virtual void WriteRegions(wxExpr *clause);
 | 
				
			||||||
 | 
					  virtual void ReadRegions(wxExpr *clause);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Does the WHOLE copy calling PrivateCopy - don't redefine.
 | 
				
			||||||
 | 
					  // If canvas is non-null, set the canvas too.
 | 
				
			||||||
 | 
					  wxShape *CreateNewCopy(wxShapeCanvas *theCanvas = NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Attachment code
 | 
				
			||||||
 | 
					  virtual bool GetAttachmentPosition(int attachment, float *x, float *y,
 | 
				
			||||||
 | 
					                                     int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
 | 
				
			||||||
 | 
					  virtual int GetNumberOfAttachments();
 | 
				
			||||||
 | 
					  virtual bool AttachmentIsValid(int attachment);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void EraseLinks(wxDC& dc, int attachment = -1, bool recurse = FALSE);
 | 
				
			||||||
 | 
					  virtual void DrawLinks(wxDC& dc, int attachment = -1, bool recurse = FALSE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void MoveLineToNewAttachment(wxDC& dc, wxLineShape *to_move,
 | 
				
			||||||
 | 
					                                       float x, float y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Reorders the lines coming into the node image at this attachment
 | 
				
			||||||
 | 
					  // position, in the order in which they appear in linesToSort.
 | 
				
			||||||
 | 
					  virtual void SortLines(int attachment, wxList& linesToSort);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // This is really to distinguish between lines and other images.
 | 
				
			||||||
 | 
					  // For lines, want to pass drag to canvas, since lines tend to prevent
 | 
				
			||||||
 | 
					  // dragging on a canvas (they get in the way.)
 | 
				
			||||||
 | 
					  virtual bool Draggable() const { return TRUE; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns TRUE if image is a descendant of this image
 | 
				
			||||||
 | 
					  bool HasDescendant(wxShape *image);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Does the copying for this object
 | 
				
			||||||
 | 
					  void Copy(wxShape& copy);
 | 
				
			||||||
 | 
					  // Returns a new instance, and does the copy for this class. Define for each class.
 | 
				
			||||||
 | 
					  virtual wxShape *PrivateCopy() = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Rotate about the given axis by the given amount in radians
 | 
				
			||||||
 | 
					  // (does nothing for most objects)
 | 
				
			||||||
 | 
					  // But even non-rotating objects should record their notional
 | 
				
			||||||
 | 
					  // rotation in case it's important (e.g. in dog-leg code).
 | 
				
			||||||
 | 
					  virtual inline void Rotate(float WXUNUSED(x), float WXUNUSED(y), float theta) { m_rotation = theta; }
 | 
				
			||||||
 | 
					  virtual inline float GetRotation() const { return m_rotation; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void ClearAttachments();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Recentres all the text regions for this object
 | 
				
			||||||
 | 
					  void Recentre(wxDC& dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Clears points from a list of wxRealPoints
 | 
				
			||||||
 | 
					  void ClearPointList(wxList& list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 private:
 | 
				
			||||||
 | 
					  wxObject*             m_clientData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 protected:
 | 
				
			||||||
 | 
					  wxShapeEvtHandler*    m_eventHandler;
 | 
				
			||||||
 | 
					  bool                  m_formatted;
 | 
				
			||||||
 | 
					  float                 m_xpos, m_ypos;
 | 
				
			||||||
 | 
					  wxPen*                m_pen;
 | 
				
			||||||
 | 
					  wxBrush*              m_brush;
 | 
				
			||||||
 | 
					  wxFont*               m_font;
 | 
				
			||||||
 | 
					  wxColour*             m_textColour;
 | 
				
			||||||
 | 
					  wxString              m_textColourName;
 | 
				
			||||||
 | 
					  wxShapeCanvas*        m_canvas;
 | 
				
			||||||
 | 
					  wxList                m_lines;
 | 
				
			||||||
 | 
					  wxList                m_text;
 | 
				
			||||||
 | 
					  wxList                m_controlPoints;
 | 
				
			||||||
 | 
					  wxList                m_regions;
 | 
				
			||||||
 | 
					  wxList                m_attachmentPoints;
 | 
				
			||||||
 | 
					  bool                  m_visible;
 | 
				
			||||||
 | 
					  bool                  m_disableLabel;
 | 
				
			||||||
 | 
					  long                  m_id;
 | 
				
			||||||
 | 
					  bool                  m_selected;
 | 
				
			||||||
 | 
					  bool                  m_highlighted;      // Different from selected: user-defined highlighting,
 | 
				
			||||||
 | 
					                                            // e.g. thick border.
 | 
				
			||||||
 | 
					  float                 m_rotation;
 | 
				
			||||||
 | 
					  int                   m_sensitivity;
 | 
				
			||||||
 | 
					  bool                  m_draggable;
 | 
				
			||||||
 | 
					  bool                  m_attachmentMode;   // TRUE if using attachments, FALSE otherwise
 | 
				
			||||||
 | 
					  bool                  m_spaceAttachments; // TRUE if lines at one side should be spaced
 | 
				
			||||||
 | 
					  bool                  m_fixedWidth;
 | 
				
			||||||
 | 
					  bool                  m_fixedHeight;
 | 
				
			||||||
 | 
					  bool                  m_centreResize;    // Default is to resize keeping the centre constant (TRUE)
 | 
				
			||||||
 | 
					  bool                  m_drawHandles;     // Don't draw handles if FALSE, usually TRUE
 | 
				
			||||||
 | 
					  wxList                m_children;      // In case it's composite
 | 
				
			||||||
 | 
					  wxShape*              m_parent;      // In case it's a child
 | 
				
			||||||
 | 
					  int                   m_formatMode;
 | 
				
			||||||
 | 
					  int                   m_shadowMode;
 | 
				
			||||||
 | 
					  wxBrush*              m_shadowBrush;
 | 
				
			||||||
 | 
					  int                   m_shadowOffsetX;
 | 
				
			||||||
 | 
					  int                   m_shadowOffsetY;
 | 
				
			||||||
 | 
					  int                   m_textMarginX;    // Gap between text and border
 | 
				
			||||||
 | 
					  int                   m_textMarginY;
 | 
				
			||||||
 | 
					  wxString              m_regionName;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxPolygonShape: public wxShape
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxPolygonShape)
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxPolygonShape();
 | 
				
			||||||
 | 
					  ~wxPolygonShape();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Takes a list of wxRealPoints; each point is an OFFSET from the centre.
 | 
				
			||||||
 | 
					  // Deletes user's points in destructor.
 | 
				
			||||||
 | 
					  virtual void Create(wxList *points);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void GetBoundingBoxMin(float *w, float *h);
 | 
				
			||||||
 | 
					  void CalculateBoundingBox();
 | 
				
			||||||
 | 
					  bool GetPerimeterPoint(float x1, float y1,
 | 
				
			||||||
 | 
					                                 float x2, float y2,
 | 
				
			||||||
 | 
					                                 float *x3, float *y3);
 | 
				
			||||||
 | 
					  bool HitTest(float x, float y, int *attachment, float *distance);
 | 
				
			||||||
 | 
					  void SetSize(float x, float y, bool recursive = TRUE);
 | 
				
			||||||
 | 
					  void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnDrawOutline(wxDC& dc, float x, float y, float w, float h);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // A polygon should have a control point at each vertex,
 | 
				
			||||||
 | 
					  // with the option of moving the control points individually
 | 
				
			||||||
 | 
					  // to change the shape.
 | 
				
			||||||
 | 
					  void MakeControlPoints();
 | 
				
			||||||
 | 
					  void ResetControlPoints();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // If we've changed the shape, must make the original
 | 
				
			||||||
 | 
					  // points match the working points
 | 
				
			||||||
 | 
					  void UpdateOriginalPoints();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Add a control point after the given point
 | 
				
			||||||
 | 
					  virtual void AddPolygonPoint(int pos = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Delete a control point
 | 
				
			||||||
 | 
					  virtual void DeletePolygonPoint(int pos = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Recalculates the centre of the polygon
 | 
				
			||||||
 | 
					  virtual void CalculatePolygonCentre();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					  // Prolog database stuff
 | 
				
			||||||
 | 
					  void WritePrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					  void ReadPrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int GetNumberOfAttachments();
 | 
				
			||||||
 | 
					  bool GetAttachmentPosition(int attachment, float *x, float *y,
 | 
				
			||||||
 | 
					                                     int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
 | 
				
			||||||
 | 
					  bool AttachmentIsValid(int attachment);
 | 
				
			||||||
 | 
					  // Does the copying for this object
 | 
				
			||||||
 | 
					  void Copy(wxPolygonShape& copy);
 | 
				
			||||||
 | 
					  wxShape *PrivateCopy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline wxList *GetPoints() { return m_points; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 private:
 | 
				
			||||||
 | 
					  wxList*       m_points;
 | 
				
			||||||
 | 
					  wxList*       m_originalPoints;
 | 
				
			||||||
 | 
					  float         m_boundWidth;
 | 
				
			||||||
 | 
					  float         m_boundHeight;
 | 
				
			||||||
 | 
					  float         m_originalWidth;
 | 
				
			||||||
 | 
					  float         m_originalHeight;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxRectangleShape: public wxShape
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxRectangleShape)
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxRectangleShape(float w = 0.0, float h = 0.0);
 | 
				
			||||||
 | 
					  void GetBoundingBoxMin(float *w, float *h);
 | 
				
			||||||
 | 
					  bool GetPerimeterPoint(float x1, float y1,
 | 
				
			||||||
 | 
					                                 float x2, float y2,
 | 
				
			||||||
 | 
					                                 float *x3, float *y3);
 | 
				
			||||||
 | 
					  void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					  void SetSize(float x, float y, bool recursive = TRUE);
 | 
				
			||||||
 | 
					  void SetCornerRadius(float rad); // If > 0, rounded corners
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					  // Prolog database stuff
 | 
				
			||||||
 | 
					  void WritePrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					  void ReadPrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int GetNumberOfAttachments();
 | 
				
			||||||
 | 
					  bool GetAttachmentPosition(int attachment, float *x, float *y,
 | 
				
			||||||
 | 
					                                     int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
 | 
				
			||||||
 | 
					  // Does the copying for this object
 | 
				
			||||||
 | 
					  void Copy(wxRectangleShape& copy);
 | 
				
			||||||
 | 
					  wxShape *PrivateCopy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline float GetWidth() const { return m_width; }
 | 
				
			||||||
 | 
					  inline float GetHeight() const { return m_height; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					  float m_width;
 | 
				
			||||||
 | 
					  float m_height;
 | 
				
			||||||
 | 
					  float m_cornerRadius;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxTextShape: public wxRectangleShape
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxTextShape)
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxTextShape(float width = 0.0, float height = 0.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					  void WritePrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Does the copying for this object
 | 
				
			||||||
 | 
					  void Copy(wxTextShape& copy);
 | 
				
			||||||
 | 
					  wxShape *PrivateCopy();
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxEllipseShape: public wxShape
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxEllipseShape)
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxEllipseShape(float w = 0.0, float h = 0.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void GetBoundingBoxMin(float *w, float *h);
 | 
				
			||||||
 | 
					  bool GetPerimeterPoint(float x1, float y1,
 | 
				
			||||||
 | 
					                                 float x2, float y2,
 | 
				
			||||||
 | 
					                                 float *x3, float *y3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					  void SetSize(float x, float y, bool recursive = TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					  // Prolog database stuff
 | 
				
			||||||
 | 
					  void WritePrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					  void ReadPrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int GetNumberOfAttachments();
 | 
				
			||||||
 | 
					  bool GetAttachmentPosition(int attachment, float *x, float *y,
 | 
				
			||||||
 | 
					                                     int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Does the copying for this object
 | 
				
			||||||
 | 
					  void Copy(wxEllipseShape& copy);
 | 
				
			||||||
 | 
					  wxShape *PrivateCopy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline float GetWidth() const { return m_width; }
 | 
				
			||||||
 | 
					  inline float GetHeight() const { return m_height; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					  float m_width;
 | 
				
			||||||
 | 
					  float m_height;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxCircleShape: public wxEllipseShape
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxCircleShape)
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxCircleShape(float w = 0.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool GetPerimeterPoint(float x1, float y1,
 | 
				
			||||||
 | 
					                                 float x2, float y2,
 | 
				
			||||||
 | 
					                                 float *x3, float *y3);
 | 
				
			||||||
 | 
					  // Does the copying for this object
 | 
				
			||||||
 | 
					  void Copy(wxCircleShape& copy);
 | 
				
			||||||
 | 
					  wxShape *PrivateCopy();
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					 // _OGL_BASIC_H_
 | 
				
			||||||
							
								
								
									
										2001
									
								
								utils/ogl/src/basic2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										195
									
								
								utils/ogl/src/basicp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,195 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        basicp.h
 | 
				
			||||||
 | 
					// Purpose:     Private OGL classes and definitions
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_BASICP_H_
 | 
				
			||||||
 | 
					#define _OGL_BASICP_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "basicp.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CONTROL_POINT_SIZE       6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxShapeTextLine: public wxObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxShapeTextLine)
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					   wxShapeTextLine(float the_x = 0.0, float the_y = 0.0, const wxString& the_line = "");
 | 
				
			||||||
 | 
					   ~wxShapeTextLine();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   inline float GetX() const { return m_x; }
 | 
				
			||||||
 | 
					   inline float GetY() const { return m_y; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   inline void SetX(float x) { m_x = x; }
 | 
				
			||||||
 | 
					   inline void SetY(float y) { m_y = y; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   inline void SetText(const wxString& text) { m_line = text; }
 | 
				
			||||||
 | 
					   inline wxString GetText() const { return m_line; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					   wxString     m_line;
 | 
				
			||||||
 | 
					   float        m_x;
 | 
				
			||||||
 | 
					   float        m_y;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxControlPoint: public wxRectangleShape
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxControlPoint)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxControlPoint(wxShapeCanvas *the_canvas = NULL, wxShape *object = NULL, float size = 0.0, float the_xoffset = 0.0,
 | 
				
			||||||
 | 
					    float the_yoffset = 0.0, int the_type = 0);
 | 
				
			||||||
 | 
					  ~wxControlPoint();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnErase(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnDrawContents(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnDragLeft(bool draw, float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnBeginDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnEndDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool GetAttachmentPosition(int attachment, float *x, float *y,
 | 
				
			||||||
 | 
					                                     int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
 | 
				
			||||||
 | 
					  int GetNumberOfAttachments();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline void SetEraseObject(bool er) { m_eraseObject = er; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  int           m_type;
 | 
				
			||||||
 | 
					  float         m_xoffset;
 | 
				
			||||||
 | 
					  float         m_yoffset;
 | 
				
			||||||
 | 
					  wxShape*      m_shape;
 | 
				
			||||||
 | 
					  wxCursor*     m_oldCursor;
 | 
				
			||||||
 | 
					  bool          m_eraseObject; // If TRUE, erases object before dragging handle.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxPolygonControlPoint: public wxControlPoint
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxPolygonControlPoint)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxPolygonControlPoint(wxShapeCanvas *the_canvas = NULL, wxShape *object = NULL, float size = 0.0, wxRealPoint *vertex = NULL,
 | 
				
			||||||
 | 
					    float the_xoffset = 0.0, float the_yoffset = 0.0);
 | 
				
			||||||
 | 
					  ~wxPolygonControlPoint();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnDragLeft(bool draw, float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnBeginDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnEndDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  wxRealPoint*      m_polygonVertex;
 | 
				
			||||||
 | 
					  wxRealPoint       m_originalSize;
 | 
				
			||||||
 | 
					  float             m_originalDistance;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Object regions.
 | 
				
			||||||
 | 
					 * Every shape has one or more text regions with various
 | 
				
			||||||
 | 
					 * properties. Not all of a region's properties will be used
 | 
				
			||||||
 | 
					 * by a shape.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxShapeRegion: public wxObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxShapeRegion)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  // Constructor
 | 
				
			||||||
 | 
					  wxShapeRegion();
 | 
				
			||||||
 | 
					  // Copy constructor
 | 
				
			||||||
 | 
					  wxShapeRegion(wxShapeRegion& region);
 | 
				
			||||||
 | 
					  // Destructor
 | 
				
			||||||
 | 
					  ~wxShapeRegion();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Accessors
 | 
				
			||||||
 | 
					  inline void SetText(const wxString& s) { m_regionText = s; }
 | 
				
			||||||
 | 
					  void SetFont(wxFont *f);
 | 
				
			||||||
 | 
					  void SetMinSize(float w, float h);
 | 
				
			||||||
 | 
					  void SetSize(float w, float h);
 | 
				
			||||||
 | 
					  void SetPosition(float x, float y);
 | 
				
			||||||
 | 
					  void SetProportions(float x, float y);
 | 
				
			||||||
 | 
					  void SetFormatMode(int mode);
 | 
				
			||||||
 | 
					  inline void SetName(const wxString& s) { m_regionName = s; };
 | 
				
			||||||
 | 
					  void SetColour(const wxString& col); // Text colour
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline wxString GetText() const { return m_regionText; }
 | 
				
			||||||
 | 
					  inline wxFont *GetFont() const { return m_font; }
 | 
				
			||||||
 | 
					  inline void GetMinSize(float *x, float *y) const { *x = m_minWidth; *y = m_minHeight; }
 | 
				
			||||||
 | 
					  inline void GetProportion(float *x, float *y) const { *x = m_regionProportionX; *y = m_regionProportionY; }
 | 
				
			||||||
 | 
					  inline void GetSize(float *x, float *y) const { *x = m_width; *y = m_height; }
 | 
				
			||||||
 | 
					  inline void GetPosition(float *xp, float *yp) const { *xp = m_x; *yp = m_y; }
 | 
				
			||||||
 | 
					  inline int GetFormatMode() const { return m_formatMode; }
 | 
				
			||||||
 | 
					  inline wxString GetName() const { return m_regionName; }
 | 
				
			||||||
 | 
					  inline wxString GetColour() const { return m_textColour; }
 | 
				
			||||||
 | 
					  wxColour *GetActualColourObject();
 | 
				
			||||||
 | 
					  inline wxList& GetFormattedText() { return m_formattedText; }
 | 
				
			||||||
 | 
					  inline wxString GetPenColour() const { return m_penColour; }
 | 
				
			||||||
 | 
					  inline int GetPenStyle() const { return m_penStyle; }
 | 
				
			||||||
 | 
					  inline void SetPenStyle(int style) { m_penStyle = style; m_actualPenObject = NULL; }
 | 
				
			||||||
 | 
					  void SetPenColour(const wxString& col);
 | 
				
			||||||
 | 
					  wxPen *GetActualPen();
 | 
				
			||||||
 | 
					  inline float GetWidth() const { return m_width; }
 | 
				
			||||||
 | 
					  inline float GetHeight() const { return m_height; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void ClearText();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  wxString              m_regionText;
 | 
				
			||||||
 | 
					  wxList                m_formattedText;   // List of wxShapeTextLines
 | 
				
			||||||
 | 
					  wxFont*               m_font;
 | 
				
			||||||
 | 
					  float                 m_minHeight;        // If zero, hide region.
 | 
				
			||||||
 | 
					  float                 m_minWidth;        // If zero, hide region.
 | 
				
			||||||
 | 
					  float                 m_width;
 | 
				
			||||||
 | 
					  float                 m_height;
 | 
				
			||||||
 | 
					  float                 m_x;
 | 
				
			||||||
 | 
					  float                 m_y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float                 m_regionProportionX; // Proportion of total object size;
 | 
				
			||||||
 | 
					                                             // -1.0 indicates equal proportion
 | 
				
			||||||
 | 
					  float                 m_regionProportionY; // Proportion of total object size;
 | 
				
			||||||
 | 
					                                             // -1.0 indicates equal proportion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int                   m_formatMode;        // FORMAT_CENTRE_HORIZ | FORMAT_CENTRE_VERT | FORMAT_NONE
 | 
				
			||||||
 | 
					  wxString              m_regionName;
 | 
				
			||||||
 | 
					  wxString              m_textColour;
 | 
				
			||||||
 | 
					  wxColour*             m_actualColourObject; // For speed purposes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // New members for specifying divided rectangle division colour/style 30/6/94
 | 
				
			||||||
 | 
					  wxString              m_penColour;
 | 
				
			||||||
 | 
					  int                   m_penStyle;
 | 
				
			||||||
 | 
					  wxPen*                m_actualPenObject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * User-defined attachment point
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxAttachmentPoint: public wxObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxAttachmentPoint)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  inline wxAttachmentPoint()
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    m_id = 0; m_x = 0.0; m_y = 0.0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  int           m_id;           // Identifier
 | 
				
			||||||
 | 
					  float         m_x;            // x offset from centre of object
 | 
				
			||||||
 | 
					  float         m_y;            // y offset from centre of object
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  // _OGL_BASICP_H_
 | 
				
			||||||
							
								
								
									
										126
									
								
								utils/ogl/src/bitmap.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,126 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        bitmap.cpp
 | 
				
			||||||
 | 
					// Purpose:     Bitmap shape class
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma implementation "bitmap.h"
 | 
				
			||||||
 | 
					#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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					#include <wx/wxexpr.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "basic.h"
 | 
				
			||||||
 | 
					#include "basicp.h"
 | 
				
			||||||
 | 
					#include "canvas.h"
 | 
				
			||||||
 | 
					#include "bitmap.h"
 | 
				
			||||||
 | 
					#include "misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Bitmap object
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IMPLEMENT_DYNAMIC_CLASS(wxBitmapShape, wxShape)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxBitmapShape::wxBitmapShape():wxRectangleShape(100.0, 50.0)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  m_filename = "";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxBitmapShape::~wxBitmapShape()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxBitmapShape::OnDraw(wxDC& dc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (!m_bitmap.Ok())
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  wxMemoryDC tempDC;
 | 
				
			||||||
 | 
					  tempDC.SelectObject(m_bitmap);
 | 
				
			||||||
 | 
					  float x, y;
 | 
				
			||||||
 | 
					  x = (long)(m_xpos - m_bitmap.GetWidth() / 2.0);
 | 
				
			||||||
 | 
					  y = (long)(m_ypos - m_bitmap.GetHeight() / 2.0);
 | 
				
			||||||
 | 
					  dc.Blit(x, y, m_bitmap.GetWidth(), m_bitmap.GetHeight(), &tempDC, 0, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxBitmapShape::SetSize(float w, float h, bool recursive)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (m_bitmap.Ok())
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    w = m_bitmap.GetWidth();
 | 
				
			||||||
 | 
					    h = m_bitmap.GetHeight();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SetAttachmentSize(w, h);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  m_width = w;
 | 
				
			||||||
 | 
					  m_height = h;
 | 
				
			||||||
 | 
					  SetDefaultRegionSize();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					// Prolog database stuff
 | 
				
			||||||
 | 
					char *wxBitmapShape::GetFunctor()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return "node_image";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxBitmapShape::WritePrologAttributes(wxExpr *clause)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  // Can't really save the bitmap; so instantiate the bitmap
 | 
				
			||||||
 | 
					  // at a higher level in the application, from a symbol library.
 | 
				
			||||||
 | 
					  wxRectangleShape::WritePrologAttributes(clause);
 | 
				
			||||||
 | 
					  clause->AddAttributeValueString("filename", m_filename);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxBitmapShape::ReadPrologAttributes(wxExpr *clause)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxRectangleShape::ReadPrologAttributes(clause);
 | 
				
			||||||
 | 
					  clause->GetAttributeValue("filename", m_filename);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Does the copying for this object
 | 
				
			||||||
 | 
					void wxBitmapShape::Copy(wxBitmapShape& copy)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxRectangleShape::Copy(copy);
 | 
				
			||||||
 | 
					  copy.m_bitmap = m_bitmap;
 | 
				
			||||||
 | 
					  copy.SetFilename(m_filename);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Returns a new instance, and does the copy for this class. Define for each class.
 | 
				
			||||||
 | 
					wxShape *wxBitmapShape::PrivateCopy()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxBitmapShape *obj = new wxBitmapShape;
 | 
				
			||||||
 | 
					  Copy(*obj);
 | 
				
			||||||
 | 
					  return obj;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxBitmapShape::SetBitmap(const wxBitmap& bm)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  m_bitmap = bm;
 | 
				
			||||||
 | 
					  if (m_bitmap.Ok())
 | 
				
			||||||
 | 
					    SetSize(m_bitmap.GetWidth(), m_bitmap.GetHeight());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										57
									
								
								utils/ogl/src/bitmap.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,57 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        bitmap.h
 | 
				
			||||||
 | 
					// Purpose:     wxBitmapShape
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_BITMAP_H_
 | 
				
			||||||
 | 
					#define _OGL_BITMAP_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "bitmap.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "basic.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxBitmapShape: public wxRectangleShape
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxBitmapShape)
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxBitmapShape();
 | 
				
			||||||
 | 
					  ~wxBitmapShape();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					  // Prolog database stuff
 | 
				
			||||||
 | 
					  char *GetFunctor();
 | 
				
			||||||
 | 
					  void WritePrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					  void ReadPrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Does the copying for this object
 | 
				
			||||||
 | 
					  void Copy(wxBitmapShape& copy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns a new instance, and does the copy for this class. Define for each class.
 | 
				
			||||||
 | 
					  wxShape *PrivateCopy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void SetSize(float w, float h, bool recursive = TRUE);
 | 
				
			||||||
 | 
					  inline wxBitmap& GetBitmap() const { return (wxBitmap&) m_bitmap; }
 | 
				
			||||||
 | 
					  void SetBitmap(const wxBitmap& bm);
 | 
				
			||||||
 | 
					  inline void SetFilename(const wxString& f) { m_filename = f; };
 | 
				
			||||||
 | 
					  inline wxString GetFilename() const { return m_filename; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					  wxBitmap      m_bitmap;
 | 
				
			||||||
 | 
					  wxString      m_filename;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  // _OGL_BITMAP_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										511
									
								
								utils/ogl/src/canvas.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,511 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        canvas.cpp
 | 
				
			||||||
 | 
					// Purpose:     Shape canvas class
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma implementation "canvas.h"
 | 
				
			||||||
 | 
					#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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					#include <wx/wxexpr.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if USE_IOSTREAMH
 | 
				
			||||||
 | 
					#include <iostream.h>
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <ctype.h>
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "basic.h"
 | 
				
			||||||
 | 
					#include "basicp.h"
 | 
				
			||||||
 | 
					#include "canvas.h"
 | 
				
			||||||
 | 
					#include "ogldiag.h"
 | 
				
			||||||
 | 
					#include "misc.h"
 | 
				
			||||||
 | 
					#include "lines.h"
 | 
				
			||||||
 | 
					#include "composit.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CONTROL_POINT_SIZE       6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Control point types
 | 
				
			||||||
 | 
					// Rectangle and most other shapes
 | 
				
			||||||
 | 
					#define CONTROL_POINT_VERTICAL   1
 | 
				
			||||||
 | 
					#define CONTROL_POINT_HORIZONTAL 2
 | 
				
			||||||
 | 
					#define CONTROL_POINT_DIAGONAL   3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Line
 | 
				
			||||||
 | 
					#define CONTROL_POINT_ENDPOINT_TO 4
 | 
				
			||||||
 | 
					#define CONTROL_POINT_ENDPOINT_FROM 5
 | 
				
			||||||
 | 
					#define CONTROL_POINT_LINE       6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern wxCursor *GraphicsBullseyeCursor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IMPLEMENT_DYNAMIC_CLASS(wxShapeCanvas, wxScrolledWindow)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BEGIN_EVENT_TABLE(wxShapeCanvas, wxScrolledWindow)
 | 
				
			||||||
 | 
					    EVT_PAINT(wxShapeCanvas::OnPaint)
 | 
				
			||||||
 | 
					    EVT_MOUSE_EVENTS(wxShapeCanvas::OnMouseEvent)
 | 
				
			||||||
 | 
					END_EVENT_TABLE()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Object canvas
 | 
				
			||||||
 | 
					wxShapeCanvas::wxShapeCanvas(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style):
 | 
				
			||||||
 | 
					  wxScrolledWindow(parent, id, pos, size, style)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  m_shapeDiagram = NULL;
 | 
				
			||||||
 | 
					  m_dragState = NoDragging;
 | 
				
			||||||
 | 
					  m_draggedShape = NULL;
 | 
				
			||||||
 | 
					  m_oldDragX = 0;
 | 
				
			||||||
 | 
					  m_oldDragY = 0;
 | 
				
			||||||
 | 
					  m_firstDragX = 0;
 | 
				
			||||||
 | 
					  m_firstDragY = 0;
 | 
				
			||||||
 | 
					  m_checkTolerance = TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxShapeCanvas::~wxShapeCanvas()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxShapeCanvas::OnPaint(wxPaintEvent& event)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    wxPaintDC dc(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    PrepareDC(dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dc.Clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (GetDiagram())
 | 
				
			||||||
 | 
							GetDiagram()->Redraw(dc);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxShapeCanvas::OnMouseEvent(wxMouseEvent& event)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxClientDC dc(this);
 | 
				
			||||||
 | 
					  PrepareDC(dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxPoint logPos(event.GetLogicalPosition(dc));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float x, y;
 | 
				
			||||||
 | 
					  x = (float) logPos.x;
 | 
				
			||||||
 | 
					  y = (float) logPos.y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int keys = 0;
 | 
				
			||||||
 | 
					  if (event.ShiftDown())
 | 
				
			||||||
 | 
					    keys = keys | KEY_SHIFT;
 | 
				
			||||||
 | 
					  if (event.ControlDown())
 | 
				
			||||||
 | 
					    keys = keys | KEY_CTRL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool dragging = event.Dragging();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Check if we're within the tolerance for mouse movements.
 | 
				
			||||||
 | 
					  // If we're very close to the position we started dragging
 | 
				
			||||||
 | 
					  // from, this may not be an intentional drag at all.
 | 
				
			||||||
 | 
					  if (dragging)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    int dx = abs(dc.LogicalToDeviceX(x - m_firstDragX));
 | 
				
			||||||
 | 
					    int dy = abs(dc.LogicalToDeviceY(y - m_firstDragY));
 | 
				
			||||||
 | 
					    if (m_checkTolerance && (dx <= GetDiagram()->GetMouseTolerance()) && (dy <= GetDiagram()->GetMouseTolerance()))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      // If we've ignored the tolerance once, then ALWAYS ignore
 | 
				
			||||||
 | 
					      // tolerance in this drag, even if we come back within
 | 
				
			||||||
 | 
					      // the tolerance range.
 | 
				
			||||||
 | 
					      m_checkTolerance = FALSE;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Dragging - note that the effect of dragging is left entirely up
 | 
				
			||||||
 | 
					  // to the object, so no movement is done unless explicitly done by
 | 
				
			||||||
 | 
					  // object.
 | 
				
			||||||
 | 
					  if (dragging && m_draggedShape && m_dragState == StartDraggingLeft)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    m_dragState = ContinueDraggingLeft;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // If the object isn't m_draggable, transfer message to canvas
 | 
				
			||||||
 | 
					    if (m_draggedShape->Draggable())
 | 
				
			||||||
 | 
					      m_draggedShape->GetEventHandler()->OnBeginDragLeft((float)x, (float)y, keys, m_draggedAttachment);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      m_draggedShape = NULL;
 | 
				
			||||||
 | 
					      OnBeginDragLeft((float)x, (float)y, keys);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_oldDragX = x; m_oldDragY = y;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (dragging && m_draggedShape && m_dragState == ContinueDraggingLeft)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // Continue dragging
 | 
				
			||||||
 | 
					    m_draggedShape->GetEventHandler()->OnDragLeft(FALSE, m_oldDragX, m_oldDragY, keys, m_draggedAttachment);
 | 
				
			||||||
 | 
					    m_draggedShape->GetEventHandler()->OnDragLeft(TRUE, (float)x, (float)y, keys, m_draggedAttachment);
 | 
				
			||||||
 | 
					    m_oldDragX = x; m_oldDragY = y;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (event.LeftUp() && m_draggedShape && m_dragState == ContinueDraggingLeft)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    m_dragState = NoDragging;
 | 
				
			||||||
 | 
					    m_checkTolerance = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_draggedShape->GetEventHandler()->OnDragLeft(FALSE, m_oldDragX, m_oldDragY, keys, m_draggedAttachment);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_draggedShape->GetEventHandler()->OnEndDragLeft((float)x, (float)y, keys, m_draggedAttachment);
 | 
				
			||||||
 | 
					    m_draggedShape = NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (dragging && m_draggedShape && m_dragState == StartDraggingRight)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    m_dragState = ContinueDraggingRight;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (m_draggedShape->Draggable())
 | 
				
			||||||
 | 
					      m_draggedShape->GetEventHandler()->OnBeginDragRight((float)x, (float)y, keys, m_draggedAttachment);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      m_draggedShape = NULL;
 | 
				
			||||||
 | 
					      OnBeginDragRight((float)x, (float)y, keys);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    m_oldDragX = x; m_oldDragY = y;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (dragging && m_draggedShape && m_dragState == ContinueDraggingRight)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // Continue dragging
 | 
				
			||||||
 | 
					    m_draggedShape->GetEventHandler()->OnDragRight(FALSE, m_oldDragX, m_oldDragY, keys, m_draggedAttachment);
 | 
				
			||||||
 | 
					    m_draggedShape->GetEventHandler()->OnDragRight(TRUE, (float)x, (float)y, keys, m_draggedAttachment);
 | 
				
			||||||
 | 
					    m_oldDragX = x; m_oldDragY = y;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (event.RightUp() && m_draggedShape && m_dragState == ContinueDraggingRight)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    m_dragState = NoDragging;
 | 
				
			||||||
 | 
					    m_checkTolerance = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_draggedShape->GetEventHandler()->OnDragRight(FALSE, m_oldDragX, m_oldDragY, keys, m_draggedAttachment);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_draggedShape->GetEventHandler()->OnEndDragRight((float)x, (float)y, keys, m_draggedAttachment);
 | 
				
			||||||
 | 
					    m_draggedShape = NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // All following events sent to canvas, not object
 | 
				
			||||||
 | 
					  else if (dragging && !m_draggedShape && m_dragState == StartDraggingLeft)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    m_dragState = ContinueDraggingLeft;
 | 
				
			||||||
 | 
					    OnBeginDragLeft((float)x, (float)y, keys);
 | 
				
			||||||
 | 
					    m_oldDragX = x; m_oldDragY = y;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (dragging && !m_draggedShape && m_dragState == ContinueDraggingLeft)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // Continue dragging
 | 
				
			||||||
 | 
					    OnDragLeft(FALSE, m_oldDragX, m_oldDragY, keys);
 | 
				
			||||||
 | 
					    OnDragLeft(TRUE, (float)x, (float)y, keys);
 | 
				
			||||||
 | 
					    m_oldDragX = x; m_oldDragY = y;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (event.LeftUp() && !m_draggedShape && m_dragState == ContinueDraggingLeft)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    m_dragState = NoDragging;
 | 
				
			||||||
 | 
					    m_checkTolerance = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    OnDragLeft(FALSE, m_oldDragX, m_oldDragY, keys);
 | 
				
			||||||
 | 
					    OnEndDragLeft((float)x, (float)y, keys);
 | 
				
			||||||
 | 
					    m_draggedShape = NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (dragging && !m_draggedShape && m_dragState == StartDraggingRight)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    m_dragState = ContinueDraggingRight;
 | 
				
			||||||
 | 
					    OnBeginDragRight((float)x, (float)y, keys);
 | 
				
			||||||
 | 
					    m_oldDragX = x; m_oldDragY = y;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (dragging && !m_draggedShape && m_dragState == ContinueDraggingRight)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // Continue dragging
 | 
				
			||||||
 | 
					    OnDragRight(FALSE, m_oldDragX, m_oldDragY, keys);
 | 
				
			||||||
 | 
					    OnDragRight(TRUE, (float)x, (float)y, keys);
 | 
				
			||||||
 | 
					    m_oldDragX = x; m_oldDragY = y;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (event.RightUp() && !m_draggedShape && m_dragState == ContinueDraggingRight)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    m_dragState = NoDragging;
 | 
				
			||||||
 | 
					    m_checkTolerance = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    OnDragRight(FALSE, m_oldDragX, m_oldDragY, keys);
 | 
				
			||||||
 | 
					    OnEndDragRight((float)x, (float)y, keys);
 | 
				
			||||||
 | 
					    m_draggedShape = NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Non-dragging events
 | 
				
			||||||
 | 
					  else if (event.IsButton())
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    m_checkTolerance = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Find the nearest object
 | 
				
			||||||
 | 
					    int attachment = 0;
 | 
				
			||||||
 | 
					    wxShape *nearest_object = FindShape(x, y, &attachment);
 | 
				
			||||||
 | 
					    if (nearest_object) // Object event
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (event.LeftDown())
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        m_draggedShape = nearest_object;
 | 
				
			||||||
 | 
					        m_draggedAttachment = attachment;
 | 
				
			||||||
 | 
					        m_dragState = StartDraggingLeft;
 | 
				
			||||||
 | 
					        m_firstDragX = x;
 | 
				
			||||||
 | 
					        m_firstDragY = y;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else if (event.LeftUp())
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        // N.B. Only register a click if the same object was
 | 
				
			||||||
 | 
					        // identified for down *and* up.
 | 
				
			||||||
 | 
					        if (nearest_object == m_draggedShape)
 | 
				
			||||||
 | 
					          nearest_object->GetEventHandler()->OnLeftClick((float)x, (float)y, keys, attachment);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m_draggedShape = NULL;
 | 
				
			||||||
 | 
					        m_dragState = NoDragging;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else if (event.RightDown())
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        m_draggedShape = nearest_object;
 | 
				
			||||||
 | 
					        m_draggedAttachment = attachment;
 | 
				
			||||||
 | 
					        m_dragState = StartDraggingRight;
 | 
				
			||||||
 | 
					        m_firstDragX = x;
 | 
				
			||||||
 | 
					        m_firstDragY = y;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else if (event.RightUp())
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        if (nearest_object == m_draggedShape)
 | 
				
			||||||
 | 
					          nearest_object->GetEventHandler()->OnRightClick((float)x, (float)y, keys, attachment);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m_draggedShape = NULL;
 | 
				
			||||||
 | 
					        m_dragState = NoDragging;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else // Canvas event (no nearest object)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (event.LeftDown())
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        m_draggedShape = NULL;
 | 
				
			||||||
 | 
					        m_dragState = StartDraggingLeft;
 | 
				
			||||||
 | 
					        m_firstDragX = x;
 | 
				
			||||||
 | 
					        m_firstDragY = y;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else if (event.LeftUp())
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        OnLeftClick((float)x, (float)y, keys);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m_draggedShape = NULL;
 | 
				
			||||||
 | 
					        m_dragState = NoDragging;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else if (event.RightDown())
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        m_draggedShape = NULL;
 | 
				
			||||||
 | 
					        m_dragState = StartDraggingRight;
 | 
				
			||||||
 | 
					        m_firstDragX = x;
 | 
				
			||||||
 | 
					        m_firstDragY = y;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else if (event.RightUp())
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        OnRightClick((float)x, (float)y, keys);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m_draggedShape = NULL;
 | 
				
			||||||
 | 
					        m_dragState = NoDragging;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Try to find a sensitive object, working up the hierarchy of composites.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					wxShape *wxShapeCanvas::FindFirstSensitiveShape(float x, float y, int *new_attachment, int op)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxShape *image = FindShape(x, y, new_attachment);
 | 
				
			||||||
 | 
					  if (!image) return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxShape *actualImage = FindFirstSensitiveShape1(image, op);
 | 
				
			||||||
 | 
					  if (actualImage)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    float dist;
 | 
				
			||||||
 | 
					    // Find actual attachment
 | 
				
			||||||
 | 
					    actualImage->HitTest(x, y, new_attachment, &dist);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return actualImage;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxShape *wxShapeCanvas::FindFirstSensitiveShape1(wxShape *image, int op)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (image->GetSensitivityFilter() & op)
 | 
				
			||||||
 | 
					    return image;
 | 
				
			||||||
 | 
					  if (image->GetParent())
 | 
				
			||||||
 | 
					    return FindFirstSensitiveShape1(image->GetParent(), op);
 | 
				
			||||||
 | 
					  return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Helper function: TRUE if 'contains' wholly contains 'contained'.
 | 
				
			||||||
 | 
					static bool WhollyContains(wxShape *contains, wxShape *contained)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float xp1, yp1, xp2, yp2;
 | 
				
			||||||
 | 
					  float w1, h1, w2, h2;
 | 
				
			||||||
 | 
					  float left1, top1, right1, bottom1, left2, top2, right2, bottom2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  xp1 = contains->GetX(); yp1 = contains->GetY(); xp2 = contained->GetX(); yp2 = contained->GetY();
 | 
				
			||||||
 | 
					  contains->GetBoundingBoxMax(&w1, &h1);
 | 
				
			||||||
 | 
					  contained->GetBoundingBoxMax(&w2, &h2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  left1 = (float)(xp1 - (w1 / 2.0));
 | 
				
			||||||
 | 
					  top1 = (float)(yp1 - (h1 / 2.0));
 | 
				
			||||||
 | 
					  right1 = (float)(xp1 + (w1 / 2.0));
 | 
				
			||||||
 | 
					  bottom1 = (float)(yp1 + (h1 / 2.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  left2 = (float)(xp2 - (w2 / 2.0));
 | 
				
			||||||
 | 
					  top2 = (float)(yp2 - (h2 / 2.0));
 | 
				
			||||||
 | 
					  right2 = (float)(xp2 + (w2 / 2.0));
 | 
				
			||||||
 | 
					  bottom2 = (float)(yp2 + (h2 / 2.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return ((left1 <= left2) && (top1 <= top2) && (right1 >= right2) && (bottom1 >= bottom2));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxShape *wxShapeCanvas::FindShape(float x, float y, int *attachment, wxClassInfo *info, wxShape *notObject)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float nearest = 100000.0;
 | 
				
			||||||
 | 
					  int nearest_attachment = 0;
 | 
				
			||||||
 | 
					  wxShape *nearest_object = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Go backward through the object list, since we want:
 | 
				
			||||||
 | 
					  // (a) to have the control points drawn LAST to overlay
 | 
				
			||||||
 | 
					  //     the other objects
 | 
				
			||||||
 | 
					  // (b) to find the control points FIRST if they exist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxNode *current = GetDiagram()->GetShapeList()->Last();
 | 
				
			||||||
 | 
					  while (current)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShape *object = (wxShape *)current->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float dist;
 | 
				
			||||||
 | 
					    int temp_attachment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // First pass for lines, which might be inside a container, so we
 | 
				
			||||||
 | 
					    // want lines to take priority over containers. This first loop
 | 
				
			||||||
 | 
					    // could fail if we clickout side a line, so then we'll
 | 
				
			||||||
 | 
					    // try other shapes.
 | 
				
			||||||
 | 
					    if (object->IsShown() &&
 | 
				
			||||||
 | 
					        object->IsKindOf(CLASSINFO(wxLineShape)) &&
 | 
				
			||||||
 | 
					        object->HitTest(x, y, &temp_attachment, &dist) &&
 | 
				
			||||||
 | 
					        ((info == NULL) || object->IsKindOf(info)) &&
 | 
				
			||||||
 | 
					        (!notObject || !notObject->HasDescendant(object)))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      // A line is trickier to spot than a normal object.
 | 
				
			||||||
 | 
					      // For a line, since it's the diagonal of the box
 | 
				
			||||||
 | 
					      // we use for the hit test, we may have several
 | 
				
			||||||
 | 
					      // lines in the box and therefore we need to be able
 | 
				
			||||||
 | 
					      // to specify the nearest point to the centre of the line
 | 
				
			||||||
 | 
					      // as our hit criterion, to give the user some room for
 | 
				
			||||||
 | 
					      // manouevre.
 | 
				
			||||||
 | 
					      if (dist < nearest)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        nearest = dist;
 | 
				
			||||||
 | 
					        nearest_object = object;
 | 
				
			||||||
 | 
					        nearest_attachment = temp_attachment;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (current)
 | 
				
			||||||
 | 
					      current = current->Previous();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  current = GetDiagram()->GetShapeList()->Last();
 | 
				
			||||||
 | 
					  while (current)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShape *object = (wxShape *)current->Data();
 | 
				
			||||||
 | 
					    float dist;
 | 
				
			||||||
 | 
					    int temp_attachment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // On second pass, only ever consider non-composites or divisions. If children want to pass
 | 
				
			||||||
 | 
					    // up control to the composite, that's up to them.
 | 
				
			||||||
 | 
					    if (object->IsShown() && (object->IsKindOf(CLASSINFO(wxDivisionShape)) || !object->IsKindOf(CLASSINFO(wxCompositeShape)))
 | 
				
			||||||
 | 
					        && object->HitTest(x, y, &temp_attachment, &dist) && ((info == NULL) || object->IsKindOf(info)) &&
 | 
				
			||||||
 | 
					        (!notObject || !notObject->HasDescendant(object)))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (!object->IsKindOf(CLASSINFO(wxLineShape)))
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        // If we've hit a container, and we have already found a line in the
 | 
				
			||||||
 | 
					        // first pass, then ignore the container in case the line is in the container.
 | 
				
			||||||
 | 
					        // Check for division in case line straddles divisions (i.e. is not wholly contained).
 | 
				
			||||||
 | 
					        if (!nearest_object || !(object->IsKindOf(CLASSINFO(wxDivisionShape)) || WhollyContains(object, nearest_object)))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          nearest = dist;
 | 
				
			||||||
 | 
					          nearest_object = object;
 | 
				
			||||||
 | 
					          nearest_attachment = temp_attachment;
 | 
				
			||||||
 | 
					          current = NULL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (current)
 | 
				
			||||||
 | 
					      current = current->Previous();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  *attachment = nearest_attachment;
 | 
				
			||||||
 | 
					  return nearest_object;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Higher-level events called by OnEvent
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxShapeCanvas::OnLeftClick(float x, float y, int keys)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxShapeCanvas::OnRightClick(float x, float y, int keys)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxShapeCanvas::OnDragLeft(bool draw, float x, float y, int keys)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxShapeCanvas::OnBeginDragLeft(float x, float y, int keys)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxShapeCanvas::OnEndDragLeft(float x, float y, int keys)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxShapeCanvas::OnDragRight(bool draw, float x, float y, int keys)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxShapeCanvas::OnBeginDragRight(float x, float y, int keys)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxShapeCanvas::OnEndDragRight(float x, float y, int keys)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxShapeCanvas::AddShape(wxShape *object, wxShape *addAfter)
 | 
				
			||||||
 | 
					 { GetDiagram()->AddShape(object, addAfter); }
 | 
				
			||||||
 | 
					void wxShapeCanvas::InsertShape(wxShape *object)
 | 
				
			||||||
 | 
					 { GetDiagram()->InsertShape(object); }
 | 
				
			||||||
 | 
					void wxShapeCanvas::RemoveShape(wxShape *object)
 | 
				
			||||||
 | 
					 { GetDiagram()->RemoveShape(object); }
 | 
				
			||||||
 | 
					bool wxShapeCanvas::GetQuickEditMode()
 | 
				
			||||||
 | 
					 { return GetDiagram()->GetQuickEditMode(); }
 | 
				
			||||||
 | 
					void wxShapeCanvas::Redraw(wxDC& dc)
 | 
				
			||||||
 | 
					 { GetDiagram()->Redraw(dc); }
 | 
				
			||||||
 | 
					void wxShapeCanvas::Snap(float *x, float *y)
 | 
				
			||||||
 | 
					 { GetDiagram()->Snap(x, y); }
 | 
				
			||||||
							
								
								
									
										83
									
								
								utils/ogl/src/canvas.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,83 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        canvas.h
 | 
				
			||||||
 | 
					// Purpose:     wxShapeCanvas
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_CANVAS_H_
 | 
				
			||||||
 | 
					#define _OGL_CANVAS_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "canvas.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Drag states
 | 
				
			||||||
 | 
					#define NoDragging             0
 | 
				
			||||||
 | 
					#define StartDraggingLeft      1
 | 
				
			||||||
 | 
					#define ContinueDraggingLeft   2
 | 
				
			||||||
 | 
					#define StartDraggingRight     3
 | 
				
			||||||
 | 
					#define ContinueDraggingRight  4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// When drag_count reaches 0, process drag message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxDiagram;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxShapeCanvas: public wxScrolledWindow
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxShapeCanvas)
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxShapeCanvas(wxWindow *parent = NULL, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
 | 
				
			||||||
 | 
					               long style = wxBORDER | wxRETAINED);
 | 
				
			||||||
 | 
					  ~wxShapeCanvas();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline void SetDiagram(wxDiagram *diag) { m_shapeDiagram = diag; }
 | 
				
			||||||
 | 
					  inline wxDiagram *GetDiagram() const { return m_shapeDiagram; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void OnLeftClick(float x, float y, int keys = 0);
 | 
				
			||||||
 | 
					  virtual void OnRightClick(float x, float y, int keys = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void OnDragLeft(bool draw, float x, float y, int keys=0); // Erase if draw false
 | 
				
			||||||
 | 
					  virtual void OnBeginDragLeft(float x, float y, int keys=0);
 | 
				
			||||||
 | 
					  virtual void OnEndDragLeft(float x, float y, int keys=0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void OnDragRight(bool draw, float x, float y, int keys=0); // Erase if draw false
 | 
				
			||||||
 | 
					  virtual void OnBeginDragRight(float x, float y, int keys=0);
 | 
				
			||||||
 | 
					  virtual void OnEndDragRight(float x, float y, int keys=0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Find object for mouse click, of given wxClassInfo (NULL for any type).
 | 
				
			||||||
 | 
					  // If notImage is non-NULL, don't find an object that is equal to or a descendant of notImage
 | 
				
			||||||
 | 
					  virtual wxShape *FindShape(float x, float y, int *attachment, wxClassInfo *info = NULL, wxShape *notImage = NULL);
 | 
				
			||||||
 | 
					  wxShape *FindFirstSensitiveShape(float x, float y, int *new_attachment, int op);
 | 
				
			||||||
 | 
					  wxShape *FindFirstSensitiveShape1(wxShape *image, int op);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // Redirect to wxDiagram object
 | 
				
			||||||
 | 
					  virtual void AddShape(wxShape *object, wxShape *addAfter = NULL);
 | 
				
			||||||
 | 
					  virtual void InsertShape(wxShape *object);
 | 
				
			||||||
 | 
					  virtual void RemoveShape(wxShape *object);
 | 
				
			||||||
 | 
					  virtual bool GetQuickEditMode();
 | 
				
			||||||
 | 
					  virtual void Redraw(wxDC& dc);
 | 
				
			||||||
 | 
					  void Snap(float *x, float *y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Events
 | 
				
			||||||
 | 
					  void OnPaint(wxPaintEvent& event);
 | 
				
			||||||
 | 
					  void OnMouseEvent(wxMouseEvent& event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 protected:
 | 
				
			||||||
 | 
					  wxDiagram*        m_shapeDiagram;
 | 
				
			||||||
 | 
					  int               m_dragState;
 | 
				
			||||||
 | 
					  float             m_oldDragX, m_oldDragY;     // Previous drag coordinates
 | 
				
			||||||
 | 
					  float             m_firstDragX, m_firstDragY; // INITIAL drag coordinates
 | 
				
			||||||
 | 
					  bool              m_checkTolerance;           // Whether to check drag tolerance
 | 
				
			||||||
 | 
					  wxShape*          m_draggedShape;
 | 
				
			||||||
 | 
					  int               m_draggedAttachment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DECLARE_EVENT_TABLE()
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					 // _OGL_CANVAS_H_
 | 
				
			||||||
							
								
								
									
										1769
									
								
								utils/ogl/src/composit.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										244
									
								
								utils/ogl/src/composit.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,244 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        composit.h
 | 
				
			||||||
 | 
					// Purpose:     wxCompositeShape
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_COMPOSIT_H_
 | 
				
			||||||
 | 
					#define _OGL_COMPOSIT_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "composit.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxDivisionShape;
 | 
				
			||||||
 | 
					class OGLConstraint;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * A composite object is an invisible rectangle surrounding all children
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxCompositeShape: public wxRectangleShape
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxCompositeShape)
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxCompositeShape();
 | 
				
			||||||
 | 
					  ~wxCompositeShape();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnDrawContents(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnErase(wxDC& dc);
 | 
				
			||||||
 | 
					  bool OnMovePre(wxDC& dc, float x, float y, float oldX, float oldY, bool display = TRUE);
 | 
				
			||||||
 | 
					  void OnDragLeft(bool draw, float x, float y, int keys, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnBeginDragLeft(float x, float y, int keys, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnEndDragLeft(float x, float y, int keys, int attachment = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnRightClick(float x, float y, int keys, int attachment = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void SetSize(float w, float h, bool recursive = TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns TRUE if it settled down
 | 
				
			||||||
 | 
					  bool Recompute();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // New members
 | 
				
			||||||
 | 
					  void AddChild(wxShape *child, wxShape *addAfter = NULL);
 | 
				
			||||||
 | 
					  void RemoveChild(wxShape *child);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLConstraint *AddConstraint(OGLConstraint *constraint);
 | 
				
			||||||
 | 
					  OGLConstraint *AddConstraint(int type, wxShape *constraining, wxList& constrained);
 | 
				
			||||||
 | 
					  OGLConstraint *AddConstraint(int type, wxShape *constraining, wxShape *constrained);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void DeleteConstraint(OGLConstraint *constraint);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Delete constraints that involve this child.
 | 
				
			||||||
 | 
					  void DeleteConstraintsInvolvingChild(wxShape *child);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Remove the image from any constraints involving it, but DON'T
 | 
				
			||||||
 | 
					  // remove any constraints.
 | 
				
			||||||
 | 
					  void RemoveChildFromConstraints(wxShape *child);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Find constraint, also returning actual composite the constraint was in,
 | 
				
			||||||
 | 
					  // in case it had to find it recursively.
 | 
				
			||||||
 | 
					  OGLConstraint *FindConstraint(long id, wxCompositeShape **actualComposite = NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns TRUE if something changed
 | 
				
			||||||
 | 
					  bool Constrain();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Make this composite into a container by creating one wxDivisionShape
 | 
				
			||||||
 | 
					  void MakeContainer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Calculates size and position of composite object based on children
 | 
				
			||||||
 | 
					  void CalculateSize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					  // Prolog database stuff
 | 
				
			||||||
 | 
					  void WritePrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					  void ReadPrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					  // In case the object has constraints it needs to read in in a different pass
 | 
				
			||||||
 | 
					  void ReadConstraints(wxExpr *clause, wxExprDatabase *database);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  // Does the copying for this object
 | 
				
			||||||
 | 
					  void Copy(wxCompositeShape& copy);
 | 
				
			||||||
 | 
					  wxShape *PrivateCopy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual wxDivisionShape *OnCreateDivision();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Finds the image used to visualize a container. This is any child
 | 
				
			||||||
 | 
					  // of the composite that is not in the divisions list.
 | 
				
			||||||
 | 
					  wxShape *FindContainerImage();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns TRUE if division is a descendant of this container
 | 
				
			||||||
 | 
					  bool ContainsDivision(wxDivisionShape *division);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline wxList& GetDivisions() const { return (wxList&) m_divisions; }
 | 
				
			||||||
 | 
					  inline wxList& GetConstraints() const { return (wxList&) m_constraints; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					  float             m_oldX;
 | 
				
			||||||
 | 
					  float             m_oldY;
 | 
				
			||||||
 | 
					  wxList            m_constraints;
 | 
				
			||||||
 | 
					  wxList            m_divisions; // In case it's a container
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * A division object is a composite with special properties,
 | 
				
			||||||
 | 
					 * to be used for containment. It's a subdivision of a container.
 | 
				
			||||||
 | 
					 * A containing node image consists of a composite with a main child shape
 | 
				
			||||||
 | 
					 * such as rounded rectangle, plus a list of division objects.
 | 
				
			||||||
 | 
					 * It needs to be a composite because a division contains pieces
 | 
				
			||||||
 | 
					 * of diagram.
 | 
				
			||||||
 | 
					 * NOTE a container has at least one wxDivisionShape for consistency.
 | 
				
			||||||
 | 
					 * This can be subdivided, so it turns into two objects, then each of
 | 
				
			||||||
 | 
					 * these can be subdivided, etc.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define DIVISION_SIDE_NONE      0
 | 
				
			||||||
 | 
					#define DIVISION_SIDE_LEFT      1
 | 
				
			||||||
 | 
					#define DIVISION_SIDE_TOP       2
 | 
				
			||||||
 | 
					#define DIVISION_SIDE_RIGHT     3
 | 
				
			||||||
 | 
					#define DIVISION_SIDE_BOTTOM    4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxDivisionShape: public wxCompositeShape
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxDivisionShape)
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxDivisionShape();
 | 
				
			||||||
 | 
					  ~wxDivisionShape();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnDrawContents(wxDC& dc);
 | 
				
			||||||
 | 
					  bool OnMovePre(wxDC& dc, float x, float y, float oldX, float oldY, bool display = TRUE);
 | 
				
			||||||
 | 
					  void OnDragLeft(bool draw, float x, float y, int keys, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnBeginDragLeft(float x, float y, int keys, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnEndDragLeft(float x, float y, int keys, int attachment = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnRightClick(float x, float y, int keys = 0, int attachment = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Don't want this kind of composite to resize its subdiagrams, so
 | 
				
			||||||
 | 
					  // override composite's SetSize.
 | 
				
			||||||
 | 
					  void SetSize(float w, float h, bool recursive = TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Similarly for calculating size: it's fixed at whatever SetSize
 | 
				
			||||||
 | 
					  // set it to, not in terms of children.
 | 
				
			||||||
 | 
					  void CalculateSize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void MakeControlPoints();
 | 
				
			||||||
 | 
					  void ResetControlPoints();
 | 
				
			||||||
 | 
					  void MakeMandatoryControlPoints();
 | 
				
			||||||
 | 
					  void ResetMandatoryControlPoints();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					  // Prolog database stuff
 | 
				
			||||||
 | 
					  void WritePrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					  void ReadPrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  // Does the copying for this object
 | 
				
			||||||
 | 
					  void Copy(wxDivisionShape& copy);
 | 
				
			||||||
 | 
					  wxShape *PrivateCopy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Divide horizontally (wxHORIZONTAL) or vertically (wxVERTICAL)
 | 
				
			||||||
 | 
					  bool Divide(int direction);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Resize adjoining divisions at the given side. If test is TRUE,
 | 
				
			||||||
 | 
					  // just see whether it's possible for each adjoining region,
 | 
				
			||||||
 | 
					  // returning FALSE if it's not.
 | 
				
			||||||
 | 
					  bool ResizeAdjoining(int side, float newPos, bool test);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Adjust a side, returning FALSE if it's not physically possible.
 | 
				
			||||||
 | 
					  bool AdjustLeft(float left, bool test);
 | 
				
			||||||
 | 
					  bool AdjustTop(float top, bool test);
 | 
				
			||||||
 | 
					  bool AdjustRight(float right, bool test);
 | 
				
			||||||
 | 
					  bool AdjustBottom(float bottom, bool test);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Edit style of left or top side
 | 
				
			||||||
 | 
					  void EditEdge(int side);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Popup menu
 | 
				
			||||||
 | 
					  void PopupMenu(float x, float y);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  inline void SetLeftSide(wxDivisionShape *shape) { m_leftSide = shape; }
 | 
				
			||||||
 | 
					  inline void SetTopSide(wxDivisionShape *shape) { m_topSide = shape; }
 | 
				
			||||||
 | 
					  inline void SetRightSide(wxDivisionShape *shape) { m_rightSide = shape; }
 | 
				
			||||||
 | 
					  inline void SetBottomSide(wxDivisionShape *shape) { m_bottomSide = shape; }
 | 
				
			||||||
 | 
					  inline wxDivisionShape *GetLeftSide() const { return m_leftSide; }
 | 
				
			||||||
 | 
					  inline wxDivisionShape *GetTopSide() const { return m_topSide; }
 | 
				
			||||||
 | 
					  inline wxDivisionShape *GetRightSide() const { return m_rightSide; }
 | 
				
			||||||
 | 
					  inline wxDivisionShape *GetBottomSide() const { return m_bottomSide; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline void SetHandleSide(int side) { m_handleSide = side; }
 | 
				
			||||||
 | 
					  inline int GetHandleSide() const { return m_handleSide; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline void SetLeftSidePen(wxPen *pen) { m_leftSidePen = pen; }
 | 
				
			||||||
 | 
					  inline wxPen *GetLeftSidePen() const { return m_leftSidePen; }
 | 
				
			||||||
 | 
					  inline void SetTopSidePen(wxPen *pen) { m_topSidePen = pen; }
 | 
				
			||||||
 | 
					  inline wxPen *GetTopSidePen() const { return m_topSidePen; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void SetLeftSideColour(const wxString& colour);
 | 
				
			||||||
 | 
					  void SetTopSideColour(const wxString& colour);
 | 
				
			||||||
 | 
					  void SetLeftSideStyle(const wxString& style);
 | 
				
			||||||
 | 
					  void SetTopSideStyle(const wxString& style);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline wxString GetLeftSideColour() const { return m_leftSideColour; }
 | 
				
			||||||
 | 
					  inline wxString GetTopSideColour() const { return m_topSideColour; }
 | 
				
			||||||
 | 
					  inline wxString GetLeftSideStyle() const { return m_leftSideStyle; }
 | 
				
			||||||
 | 
					  inline wxString GetTopSideStyle() const { return m_topSideStyle; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 protected:
 | 
				
			||||||
 | 
					  // Adjoining divisions. NULL indicates edge
 | 
				
			||||||
 | 
					  // of container, and that side shouldn't be
 | 
				
			||||||
 | 
					  // drawn.
 | 
				
			||||||
 | 
					  wxDivisionShape*      m_leftSide;
 | 
				
			||||||
 | 
					  wxDivisionShape*      m_rightSide;
 | 
				
			||||||
 | 
					  wxDivisionShape*      m_topSide;
 | 
				
			||||||
 | 
					  wxDivisionShape*      m_bottomSide;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int                   m_handleSide;       // Side at which handle is legal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxPen*                m_leftSidePen;
 | 
				
			||||||
 | 
					  wxPen*                m_topSidePen;
 | 
				
			||||||
 | 
					  wxString              m_leftSideColour;
 | 
				
			||||||
 | 
					  wxString              m_topSideColour;
 | 
				
			||||||
 | 
					  wxString              m_leftSideStyle;
 | 
				
			||||||
 | 
					  wxString              m_topSideStyle;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern wxMenu *oglPopupDivisionMenu;
 | 
				
			||||||
 | 
					extern void oglGraphicsDivisionMenuProc(wxMenu& menu, wxCommandEvent& event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DIVISION_MENU_SPLIT_HORIZONTALLY    1
 | 
				
			||||||
 | 
					#define DIVISION_MENU_SPLIT_VERTICALLY      2
 | 
				
			||||||
 | 
					#define DIVISION_MENU_EDIT_LEFT_EDGE        3
 | 
				
			||||||
 | 
					#define DIVISION_MENU_EDIT_TOP_EDGE         4
 | 
				
			||||||
 | 
					#define DIVISION_MENU_EDIT_RIGHT_EDGE       5
 | 
				
			||||||
 | 
					#define DIVISION_MENU_EDIT_BOTTOM_EDGE      6
 | 
				
			||||||
 | 
					#define DIVISION_MENU_DELETE_ALL            7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					 // _OGL_COMPOSIT_H_
 | 
				
			||||||
							
								
								
									
										600
									
								
								utils/ogl/src/constrnt.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,600 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        constrnt.cpp
 | 
				
			||||||
 | 
					// Purpose:     OGL Constraint classes
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma implementation "constrnt.h"
 | 
				
			||||||
 | 
					#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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					#include <wx/wxexpr.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "basic.h"
 | 
				
			||||||
 | 
					#include "constrnt.h"
 | 
				
			||||||
 | 
					#include "canvas.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxList OGLConstraintTypes(wxKEY_INTEGER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Constraint type
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IMPLEMENT_DYNAMIC_CLASS(OGLConstraintType, wxObject)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OGLConstraintType::OGLConstraintType(int theType, const wxString& theName, const wxString& thePhrase)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  m_type = theType;
 | 
				
			||||||
 | 
					  m_name = theName;
 | 
				
			||||||
 | 
					  m_phrase = thePhrase;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OGLConstraintType::~OGLConstraintType()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void OGLInitializeConstraintTypes()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_CENTRED_VERTICALLY,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_CENTRED_VERTICALLY, "Centre vertically", "centred vertically w.r.t."));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_CENTRED_HORIZONTALLY,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_CENTRED_HORIZONTALLY, "Centre horizontally", "centred horizontally w.r.t."));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_CENTRED_BOTH,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_CENTRED_BOTH, "Centre", "centred w.r.t."));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_LEFT_OF,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_LEFT_OF, "Left of", "left of"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_RIGHT_OF,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_RIGHT_OF, "Right of", "right of"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_ABOVE,
 | 
				
			||||||
 | 
					   new OGLConstraintType(gyCONSTRAINT_ABOVE, "Above", "above"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_BELOW,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_BELOW, "Below", "below"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Alignment
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_ALIGNED_TOP,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_ALIGNED_TOP, "Top-aligned", "aligned to the top of"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_ALIGNED_BOTTOM,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_ALIGNED_BOTTOM, "Bottom-aligned", "aligned to the bottom of"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_ALIGNED_LEFT,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_ALIGNED_LEFT, "Left-aligned", "aligned to the left of"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_ALIGNED_RIGHT,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_ALIGNED_RIGHT, "Right-aligned", "aligned to the right of"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Mid-alignment
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_MIDALIGNED_TOP,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_MIDALIGNED_TOP, "Top-midaligned", "centred on the top of"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_MIDALIGNED_BOTTOM,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_MIDALIGNED_BOTTOM, "Bottom-midaligned", "centred on the bottom of"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_MIDALIGNED_LEFT,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_MIDALIGNED_LEFT, "Left-midaligned", "centred on the left of"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLConstraintTypes.Append(gyCONSTRAINT_MIDALIGNED_RIGHT,
 | 
				
			||||||
 | 
					    new OGLConstraintType(gyCONSTRAINT_MIDALIGNED_RIGHT, "Right-midaligned", "centred on the right of"));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Constraint Stuff
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IMPLEMENT_DYNAMIC_CLASS(OGLConstraint, wxObject)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OGLConstraint::OGLConstraint(int type, wxShape *constraining, wxList& constrained)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  m_xSpacing = 0.0;
 | 
				
			||||||
 | 
					  m_ySpacing = 0.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  m_constraintType = type;
 | 
				
			||||||
 | 
					  m_constrainingObject = constraining;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  m_constraintId = 0;
 | 
				
			||||||
 | 
					  m_constraintName = "noname";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxNode *node = constrained.First();
 | 
				
			||||||
 | 
					  while (node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    m_constrainedObjects.Append(node->Data());
 | 
				
			||||||
 | 
					    node = node->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OGLConstraint::~OGLConstraint()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool OGLConstraint::Equals(float a, float b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float marg = 0.5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool eq = ((b <= a + marg) && (b >= a - marg));
 | 
				
			||||||
 | 
					  return eq;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Return TRUE if anything changed
 | 
				
			||||||
 | 
					bool OGLConstraint::Evaluate()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float maxWidth, maxHeight, minWidth, minHeight, x, y;
 | 
				
			||||||
 | 
					  m_constrainingObject->GetBoundingBoxMax(&maxWidth, &maxHeight);
 | 
				
			||||||
 | 
					  m_constrainingObject->GetBoundingBoxMin(&minWidth, &minHeight);
 | 
				
			||||||
 | 
					  x = m_constrainingObject->GetX();
 | 
				
			||||||
 | 
					  y = m_constrainingObject->GetY();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxClientDC dc(m_constrainingObject->GetCanvas());
 | 
				
			||||||
 | 
					  m_constrainingObject->GetCanvas()->PrepareDC(dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  switch (m_constraintType)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_CENTRED_VERTICALLY:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      int n = m_constrainedObjects.Number();
 | 
				
			||||||
 | 
					      float totalObjectHeight = 0.0;
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					        totalObjectHeight += height2;
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      float startY;
 | 
				
			||||||
 | 
					      float spacingY;
 | 
				
			||||||
 | 
					      // Check if within the constraining object...
 | 
				
			||||||
 | 
					      if ((totalObjectHeight + (n + 1)*m_ySpacing) <= minHeight)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        spacingY = (float)((minHeight - totalObjectHeight)/(n + 1));
 | 
				
			||||||
 | 
					        startY = (float)(y - (minHeight/2.0));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      // Otherwise, use default spacing
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        spacingY = m_ySpacing;
 | 
				
			||||||
 | 
					        startY = (float)(y - ((totalObjectHeight + (n+1)*spacingY)/2.0));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Now position the objects
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					      node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					        startY += (float)(spacingY + (height2/2.0));
 | 
				
			||||||
 | 
					        if (!Equals(startY, constrainedObject->GetY()))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, constrainedObject->GetX(), startY, FALSE);
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        startY += (float)(height2/2.0);
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_CENTRED_HORIZONTALLY:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      int n = m_constrainedObjects.Number();
 | 
				
			||||||
 | 
					      float totalObjectWidth = 0.0;
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					        totalObjectWidth += width2;
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      float startX;
 | 
				
			||||||
 | 
					      float spacingX;
 | 
				
			||||||
 | 
					      // Check if within the constraining object...
 | 
				
			||||||
 | 
					      if ((totalObjectWidth + (n + 1)*m_xSpacing) <= minWidth)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        spacingX = (float)((minWidth - totalObjectWidth)/(n + 1));
 | 
				
			||||||
 | 
					        startX = (float)(x - (minWidth/2.0));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      // Otherwise, use default spacing
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        spacingX = m_xSpacing;
 | 
				
			||||||
 | 
					        startX = (float)(x - ((totalObjectWidth + (n+1)*spacingX)/2.0));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Now position the objects
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					      node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					        startX += (float)(spacingX + (width2/2.0));
 | 
				
			||||||
 | 
					        if (!Equals(startX, constrainedObject->GetX()))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, startX, constrainedObject->GetY(), FALSE);
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        startX += (float)(width2/2.0);
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_CENTRED_BOTH:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      int n = m_constrainedObjects.Number();
 | 
				
			||||||
 | 
					      float totalObjectWidth = 0.0;
 | 
				
			||||||
 | 
					      float totalObjectHeight = 0.0;
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					        totalObjectWidth += width2;
 | 
				
			||||||
 | 
					        totalObjectHeight += height2;
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      float startX;
 | 
				
			||||||
 | 
					      float spacingX;
 | 
				
			||||||
 | 
					      float startY;
 | 
				
			||||||
 | 
					      float spacingY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Check if within the constraining object...
 | 
				
			||||||
 | 
					      if ((totalObjectWidth + (n + 1)*m_xSpacing) <= minWidth)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        spacingX = (float)((minWidth - totalObjectWidth)/(n + 1));
 | 
				
			||||||
 | 
					        startX = (float)(x - (minWidth/2.0));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      // Otherwise, use default spacing
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        spacingX = m_xSpacing;
 | 
				
			||||||
 | 
					        startX = (float)(x - ((totalObjectWidth + (n+1)*spacingX)/2.0));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Check if within the constraining object...
 | 
				
			||||||
 | 
					      if ((totalObjectHeight + (n + 1)*m_ySpacing) <= minHeight)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        spacingY = (float)((minHeight - totalObjectHeight)/(n + 1));
 | 
				
			||||||
 | 
					        startY = (float)(y - (minHeight/2.0));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      // Otherwise, use default spacing
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        spacingY = m_ySpacing;
 | 
				
			||||||
 | 
					        startY = (float)(y - ((totalObjectHeight + (n+1)*spacingY)/2.0));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Now position the objects
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					      node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					        startX += (float)(spacingX + (width2/2.0));
 | 
				
			||||||
 | 
					        startY += (float)(spacingY + (height2/2.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ((!Equals(startX, constrainedObject->GetX())) || (!Equals(startY, constrainedObject->GetY())))
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, startX, startY, FALSE);
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        startX += (float)(width2/2.0);
 | 
				
			||||||
 | 
					        startY += (float)(height2/2.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_LEFT_OF:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float x3 = (float)(x - (minWidth/2.0) - (width2/2.0) - m_xSpacing);
 | 
				
			||||||
 | 
					        if (!Equals(x3, constrainedObject->GetX()))
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, x3, constrainedObject->GetY(), FALSE);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_RIGHT_OF:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float x3 = (float)(x + (minWidth/2.0) + (width2/2.0) + m_xSpacing);
 | 
				
			||||||
 | 
					        if (!Equals(x3, constrainedObject->GetX()))
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, x3, constrainedObject->GetY(), FALSE);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_ABOVE:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float y3 = (float)(y - (minHeight/2.0) - (height2/2.0) - m_ySpacing);
 | 
				
			||||||
 | 
					        if (!Equals(y3, constrainedObject->GetY()))
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, constrainedObject->GetX(), y3, FALSE);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_BELOW:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float y3 = (float)(y + (minHeight/2.0) + (height2/2.0) + m_ySpacing);
 | 
				
			||||||
 | 
					        if (!Equals(y3, constrainedObject->GetY()))
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, constrainedObject->GetX(), y3, FALSE);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_ALIGNED_LEFT:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float x3 = (float)(x - (minWidth/2.0) + (width2/2.0) + m_xSpacing);
 | 
				
			||||||
 | 
					        if (!Equals(x3, constrainedObject->GetX()))
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, x3, constrainedObject->GetY(), FALSE);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_ALIGNED_RIGHT:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float x3 = (float)(x + (minWidth/2.0) - (width2/2.0) - m_xSpacing);
 | 
				
			||||||
 | 
					        if (!Equals(x3, constrainedObject->GetX()))
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, x3, constrainedObject->GetY(), FALSE);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_ALIGNED_TOP:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float y3 = (float)(y - (minHeight/2.0) + (height2/2.0) + m_ySpacing);
 | 
				
			||||||
 | 
					        if (!Equals(y3, constrainedObject->GetY()))
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, constrainedObject->GetX(), y3, FALSE);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_ALIGNED_BOTTOM:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float width2, height2;
 | 
				
			||||||
 | 
					        constrainedObject->GetBoundingBoxMax(&width2, &height2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float y3 = (float)(y + (minHeight/2.0) - (height2/2.0) - m_ySpacing);
 | 
				
			||||||
 | 
					        if (!Equals(y3, constrainedObject->GetY()))
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, constrainedObject->GetX(), y3, FALSE);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_MIDALIGNED_LEFT:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float x3 = (float)(x - (minWidth/2.0));
 | 
				
			||||||
 | 
					        if (!Equals(x3, constrainedObject->GetX()))
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, x3, constrainedObject->GetY(), FALSE);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_MIDALIGNED_RIGHT:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float x3 = (float)(x + (minWidth/2.0));
 | 
				
			||||||
 | 
					        if (!Equals(x3, constrainedObject->GetX()))
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, x3, constrainedObject->GetY(), FALSE);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_MIDALIGNED_TOP:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float y3 = (float)(y - (minHeight/2.0));
 | 
				
			||||||
 | 
					        if (!Equals(y3, constrainedObject->GetY()))
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, constrainedObject->GetX(), y3, FALSE);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case gyCONSTRAINT_MIDALIGNED_BOTTOM:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      bool changed = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wxNode *node = m_constrainedObjects.First();
 | 
				
			||||||
 | 
					      while (node)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *constrainedObject = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        float y3 = (float)(y + (minHeight/2.0));
 | 
				
			||||||
 | 
					        if (!Equals(y3, constrainedObject->GetY()))
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
					          changed = TRUE;
 | 
				
			||||||
 | 
					          constrainedObject->Move(dc, constrainedObject->GetX(), y3, FALSE);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return changed;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					      return FALSE;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return FALSE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										86
									
								
								utils/ogl/src/constrnt.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,86 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        constrnt.h
 | 
				
			||||||
 | 
					// Purpose:     OGL constraint definitions
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_CONSTRNT_H_
 | 
				
			||||||
 | 
					#define _OGL_CONSTRNT_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "constrnt.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * OGL Constraints
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class OGLConstraintType: public wxObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(OGLConstraintType)
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  OGLConstraintType(int type = 0, const wxString& name = "", const wxString& phrase = "");
 | 
				
			||||||
 | 
					  ~OGLConstraintType();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  int           m_type;     // E.g. gyCONSTRAINT_CENTRED_VERTICALLY
 | 
				
			||||||
 | 
					  wxString      m_name;     // E.g. "Centre vertically"
 | 
				
			||||||
 | 
					  wxString      m_phrase;   // E.g. "centred vertically with respect to", "left of"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern wxList OGLConstraintTypes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_CENTRED_VERTICALLY   1
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_CENTRED_HORIZONTALLY 2
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_CENTRED_BOTH         3
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_LEFT_OF              4
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_RIGHT_OF             5
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_ABOVE                6
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_BELOW                7
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_ALIGNED_TOP          8
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_ALIGNED_BOTTOM       9
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_ALIGNED_LEFT         10
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_ALIGNED_RIGHT        11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Like aligned, but with the objects centred on the respective edge
 | 
				
			||||||
 | 
					// of the reference object.
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_MIDALIGNED_TOP       12
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_MIDALIGNED_BOTTOM    13
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_MIDALIGNED_LEFT      14
 | 
				
			||||||
 | 
					#define gyCONSTRAINT_MIDALIGNED_RIGHT     15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class OGLConstraint: public wxObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(OGLConstraint)
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  OGLConstraint() { m_xSpacing = 0.0; m_ySpacing = 0.0; m_constraintType = 0; m_constraintName = ""; m_constraintId = 0;
 | 
				
			||||||
 | 
					                        m_constrainingObject = NULL; }
 | 
				
			||||||
 | 
					  OGLConstraint(int type, wxShape *constraining, wxList& constrained);
 | 
				
			||||||
 | 
					  ~OGLConstraint();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns TRUE if anything changed
 | 
				
			||||||
 | 
					  bool Evaluate();
 | 
				
			||||||
 | 
					  inline void SetSpacing(float x, float y) { m_xSpacing = x; m_ySpacing = y; };
 | 
				
			||||||
 | 
					  bool Equals(float a, float b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float         m_xSpacing;
 | 
				
			||||||
 | 
					  float         m_ySpacing;
 | 
				
			||||||
 | 
					  int           m_constraintType;
 | 
				
			||||||
 | 
					  wxString      m_constraintName;
 | 
				
			||||||
 | 
					  long          m_constraintId;
 | 
				
			||||||
 | 
					  wxShape*      m_constrainingObject;
 | 
				
			||||||
 | 
					  wxList        m_constrainedObjects;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void OGLInitializeConstraintTypes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					 // _OGL_CONSTRNT_H_
 | 
				
			||||||
							
								
								
									
										729
									
								
								utils/ogl/src/divided.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,729 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        divided.cpp
 | 
				
			||||||
 | 
					// Purpose:     wxDividedShape class
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma implementation "divided.h"
 | 
				
			||||||
 | 
					#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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					#include <wx/wxexpr.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "basic.h"
 | 
				
			||||||
 | 
					#include "basicp.h"
 | 
				
			||||||
 | 
					#include "canvas.h"
 | 
				
			||||||
 | 
					#include "divided.h"
 | 
				
			||||||
 | 
					#include "lines.h"
 | 
				
			||||||
 | 
					#include "misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxDividedShapeControlPoint: public wxControlPoint
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxDividedShapeControlPoint)
 | 
				
			||||||
 | 
					 private:
 | 
				
			||||||
 | 
					  int regionId;
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxDividedShapeControlPoint() { regionId = 0; }
 | 
				
			||||||
 | 
					  wxDividedShapeControlPoint(wxShapeCanvas *the_canvas, wxShape *object, int region,
 | 
				
			||||||
 | 
					                            float size, float the_xoffset, float the_yoffset, int the_type);
 | 
				
			||||||
 | 
					  ~wxDividedShapeControlPoint();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnDragLeft(bool draw, float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnBeginDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnEndDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IMPLEMENT_DYNAMIC_CLASS(wxDividedShapeControlPoint, wxControlPoint)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Divided object
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IMPLEMENT_DYNAMIC_CLASS(wxDividedShape, wxRectangleShape)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxDividedShape::wxDividedShape(float w, float h): wxRectangleShape(w, h)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  ClearRegions();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxDividedShape::~wxDividedShape()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShape::OnDraw(wxDC& dc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxRectangleShape::OnDraw(dc);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShape::OnDrawContents(wxDC& dc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float defaultProportion = (float)(GetRegions().Number() > 0 ? (1.0/((float)(GetRegions().Number()))) : 0.0);
 | 
				
			||||||
 | 
					  float currentY = (float)(m_ypos - (m_height / 2.0));
 | 
				
			||||||
 | 
					  float maxY = (float)(m_ypos + (m_height / 2.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float leftX = (float)(m_xpos - (m_width / 2.0));
 | 
				
			||||||
 | 
					  float rightX = (float)(m_xpos + (m_width / 2.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (m_pen) dc.SetPen(m_pen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (m_textColour) dc.SetTextForeground(* m_textColour);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __WXMSW__
 | 
				
			||||||
 | 
					  // For efficiency, don't do this under X - doesn't make
 | 
				
			||||||
 | 
					  // any visible difference for our purposes.
 | 
				
			||||||
 | 
					  if (m_brush)
 | 
				
			||||||
 | 
					    dc.SetTextBackground(m_brush->GetColour());
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					  if (!formatted)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    FormatRegionText();
 | 
				
			||||||
 | 
					    formatted = TRUE;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					  if (GetDisableLabel()) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float xMargin = 2;
 | 
				
			||||||
 | 
					  float yMargin = 2;
 | 
				
			||||||
 | 
					  dc.SetBackgroundMode(wxTRANSPARENT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxNode *node = GetRegions().First();
 | 
				
			||||||
 | 
					  while (node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShapeRegion *region = (wxShapeRegion *)node->Data();
 | 
				
			||||||
 | 
					    dc.SetFont(region->GetFont());
 | 
				
			||||||
 | 
					    dc.SetTextForeground(* region->GetActualColourObject());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float proportion =
 | 
				
			||||||
 | 
					      region->m_regionProportionY < 0.0 ? defaultProportion : region->m_regionProportionY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float y = currentY + m_height*proportion;
 | 
				
			||||||
 | 
					    float actualY = maxY < y ? maxY : y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float centreX = m_xpos;
 | 
				
			||||||
 | 
					    float centreY = (float)(currentY + (actualY - currentY)/2.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DrawFormattedText(dc, ®ion->m_formattedText,
 | 
				
			||||||
 | 
					             (float)(centreX), (float)(centreY), (float)(m_width-2*xMargin), (float)(actualY - currentY - 2*yMargin),
 | 
				
			||||||
 | 
					             region->m_formatMode);
 | 
				
			||||||
 | 
					    if ((y <= maxY) && (node->Next()))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wxPen *regionPen = region->GetActualPen();
 | 
				
			||||||
 | 
					      if (regionPen)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        dc.SetPen(regionPen);
 | 
				
			||||||
 | 
					        dc.DrawLine(leftX, y, rightX, y);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    currentY = actualY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    node = node->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShape::SetSize(float w, float h, bool recursive)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  SetAttachmentSize(w, h);
 | 
				
			||||||
 | 
					  m_width = w;
 | 
				
			||||||
 | 
					  m_height = h;
 | 
				
			||||||
 | 
					  SetRegionSizes();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShape::SetRegionSizes()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (GetRegions().Number() == 0)
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  float defaultProportion = (float)(GetRegions().Number() > 0 ? (1.0/((float)(GetRegions().Number()))) : 0.0);
 | 
				
			||||||
 | 
					  float currentY = (float)(m_ypos - (m_height / 2.0));
 | 
				
			||||||
 | 
					  float maxY = (float)(m_ypos + (m_height / 2.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//  float leftX = (float)(m_xpos - (m_width / 2.0));
 | 
				
			||||||
 | 
					//  float rightX = (float)(m_xpos + (m_width / 2.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxNode *node = GetRegions().First();
 | 
				
			||||||
 | 
					  while (node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShapeRegion *region = (wxShapeRegion *)node->Data();
 | 
				
			||||||
 | 
					    float proportion =
 | 
				
			||||||
 | 
					      region->m_regionProportionY <= 0.0 ? defaultProportion : region->m_regionProportionY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float sizeY = (float)proportion*m_height;
 | 
				
			||||||
 | 
					    float y = currentY + sizeY;
 | 
				
			||||||
 | 
					    float actualY = maxY < y ? maxY : y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float centreY = (float)(currentY + (actualY - currentY)/2.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    region->SetSize(m_width, sizeY);
 | 
				
			||||||
 | 
					    region->SetPosition(0.0, (float)(centreY - m_ypos));
 | 
				
			||||||
 | 
					    currentY = actualY;
 | 
				
			||||||
 | 
					    node = node->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Attachment points correspond to regions in the divided box
 | 
				
			||||||
 | 
					bool wxDividedShape::GetAttachmentPosition(int attachment, float *x, float *y, int nth, int no_arcs,
 | 
				
			||||||
 | 
					  wxLineShape *line)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int totalNumberAttachments = (GetRegions().Number() * 2) + 2;
 | 
				
			||||||
 | 
					  if (!GetAttachmentMode() || (attachment >= totalNumberAttachments))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    return wxShape::GetAttachmentPosition(attachment, x, y, nth, no_arcs);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int n = GetRegions().Number();
 | 
				
			||||||
 | 
					  bool isEnd = (line && line->IsEnd(this));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float left = (float)(m_xpos - m_width/2.0);
 | 
				
			||||||
 | 
					  float right = (float)(m_xpos + m_width/2.0);
 | 
				
			||||||
 | 
					  float top = (float)(m_ypos - m_height/2.0);
 | 
				
			||||||
 | 
					  float bottom = (float)(m_ypos + m_height/2.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Zero is top, n+1 is bottom.
 | 
				
			||||||
 | 
					  if (attachment == 0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    *y = top;
 | 
				
			||||||
 | 
					    if (m_spaceAttachments)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (line && (line->GetAlignmentType(isEnd) == LINE_ALIGNMENT_TO_NEXT_HANDLE))
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        // Align line according to the next handle along
 | 
				
			||||||
 | 
					        wxRealPoint *point = line->GetNextControlPoint(this);
 | 
				
			||||||
 | 
					        if (point->x < left)
 | 
				
			||||||
 | 
					          *x = left;
 | 
				
			||||||
 | 
					        else if (point->x > right)
 | 
				
			||||||
 | 
					          *x = right;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          *x = point->x;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        *x = left + (nth + 1)*m_width/(no_arcs + 1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      *x = m_xpos;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (attachment == (n+1))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    *y = bottom;
 | 
				
			||||||
 | 
					    if (m_spaceAttachments)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (line && (line->GetAlignmentType(isEnd) == LINE_ALIGNMENT_TO_NEXT_HANDLE))
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        // Align line according to the next handle along
 | 
				
			||||||
 | 
					        wxRealPoint *point = line->GetNextControlPoint(this);
 | 
				
			||||||
 | 
					        if (point->x < left)
 | 
				
			||||||
 | 
					          *x = left;
 | 
				
			||||||
 | 
					        else if (point->x > right)
 | 
				
			||||||
 | 
					          *x = right;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          *x = point->x;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        *x = left + (nth + 1)*m_width/(no_arcs + 1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      *x = m_xpos;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  // Left or right.
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    int i = 0;
 | 
				
			||||||
 | 
					    bool isLeft = FALSE;
 | 
				
			||||||
 | 
					    if (attachment < (n+1))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      i = attachment-1;
 | 
				
			||||||
 | 
					      isLeft = FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      i = (totalNumberAttachments - attachment - 1);
 | 
				
			||||||
 | 
					      isLeft = TRUE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    wxNode *node = GetRegions().Nth(i);
 | 
				
			||||||
 | 
					    if (node)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wxShapeRegion *region = (wxShapeRegion *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (isLeft)
 | 
				
			||||||
 | 
					        *x = left;
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        *x = right;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Calculate top and bottom of region
 | 
				
			||||||
 | 
					      top = (float)((m_ypos + region->m_y) - (region->m_height/2.0));
 | 
				
			||||||
 | 
					      bottom = (float)((m_ypos + region->m_y) + (region->m_height/2.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Assuming we can trust the absolute size and
 | 
				
			||||||
 | 
					      // position of these regions...
 | 
				
			||||||
 | 
					      if (m_spaceAttachments)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        if (line && (line->GetAlignmentType(isEnd) == LINE_ALIGNMENT_TO_NEXT_HANDLE))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          // Align line according to the next handle along
 | 
				
			||||||
 | 
					          wxRealPoint *point = line->GetNextControlPoint(this);
 | 
				
			||||||
 | 
					          if (point->y < bottom)
 | 
				
			||||||
 | 
					            *y = bottom;
 | 
				
			||||||
 | 
					          else if (point->y > top)
 | 
				
			||||||
 | 
					            *y = top;
 | 
				
			||||||
 | 
					          else
 | 
				
			||||||
 | 
					            *y = point->y;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					//          *y = (float)(((m_ypos + region->m_y) - (region->m_height/2.0)) + (nth + 1)*region->m_height/(no_arcs+1));
 | 
				
			||||||
 | 
					          *y = (float)(top + (nth + 1)*region->m_height/(no_arcs+1));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        *y = (float)(m_ypos + region->m_y);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      *x = m_xpos;
 | 
				
			||||||
 | 
					      *y = m_ypos;
 | 
				
			||||||
 | 
					      return FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int wxDividedShape::GetNumberOfAttachments()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  // There are two attachments for each region (left and right),
 | 
				
			||||||
 | 
					  // plus one on the top and one on the bottom.
 | 
				
			||||||
 | 
					  int n = (GetRegions().Number() * 2) + 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int maxN = n - 1;
 | 
				
			||||||
 | 
					  wxNode *node = m_attachmentPoints.First();
 | 
				
			||||||
 | 
					  while (node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxAttachmentPoint *point = (wxAttachmentPoint *)node->Data();
 | 
				
			||||||
 | 
					    if (point->m_id > maxN)
 | 
				
			||||||
 | 
					      maxN = point->m_id;
 | 
				
			||||||
 | 
					    node = node->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return maxN + 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool wxDividedShape::AttachmentIsValid(int attachment)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int totalNumberAttachments = (GetRegions().Number() * 2) + 2;
 | 
				
			||||||
 | 
					  if (attachment >= totalNumberAttachments)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    return wxShape::AttachmentIsValid(attachment);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else if (attachment >= 0)
 | 
				
			||||||
 | 
					    return TRUE;
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    return FALSE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShape::Copy(wxDividedShape& copy)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxRectangleShape::Copy(copy);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxShape *wxDividedShape::PrivateCopy()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxDividedShape *obj = new wxDividedShape(m_width, m_height);
 | 
				
			||||||
 | 
					  Copy(*obj);
 | 
				
			||||||
 | 
					  return obj;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Region operations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShape::MakeControlPoints()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxRectangleShape::MakeControlPoints();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  MakeMandatoryControlPoints();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShape::MakeMandatoryControlPoints()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float currentY = (float)(GetY() - (m_height / 2.0));
 | 
				
			||||||
 | 
					  float maxY = (float)(GetY() + (m_height / 2.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxNode *node = GetRegions().First();
 | 
				
			||||||
 | 
					  int i = 0;
 | 
				
			||||||
 | 
					  while (node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShapeRegion *region = (wxShapeRegion *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float proportion = region->m_regionProportionY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float y = currentY + m_height*proportion;
 | 
				
			||||||
 | 
					    float actualY = (float)(maxY < y ? maxY : y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (node->Next())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wxDividedShapeControlPoint *controlPoint =
 | 
				
			||||||
 | 
					        new wxDividedShapeControlPoint(m_canvas, this, i, CONTROL_POINT_SIZE, 0.0, (float)(actualY - GetY()), 0);
 | 
				
			||||||
 | 
					      m_canvas->AddShape(controlPoint);
 | 
				
			||||||
 | 
					      m_controlPoints.Append(controlPoint);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    currentY = actualY;
 | 
				
			||||||
 | 
					    i ++;
 | 
				
			||||||
 | 
					    node = node->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShape::ResetControlPoints()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  // May only have the region handles, (n - 1) of them.
 | 
				
			||||||
 | 
					  if (m_controlPoints.Number() > (GetRegions().Number() - 1))
 | 
				
			||||||
 | 
					    wxRectangleShape::ResetControlPoints();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ResetMandatoryControlPoints();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShape::ResetMandatoryControlPoints()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float currentY = (float)(GetY() - (m_height / 2.0));
 | 
				
			||||||
 | 
					  float maxY = (float)(GetY() + (m_height / 2.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxNode *node = m_controlPoints.First();
 | 
				
			||||||
 | 
					  int i = 0;
 | 
				
			||||||
 | 
					  while (node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxControlPoint *controlPoint = (wxControlPoint *)node->Data();
 | 
				
			||||||
 | 
					    if (controlPoint->IsKindOf(CLASSINFO(wxDividedShapeControlPoint)))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wxNode *node1 = GetRegions().Nth(i);
 | 
				
			||||||
 | 
					      wxShapeRegion *region = (wxShapeRegion *)node1->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      float proportion = region->m_regionProportionY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      float y = currentY + m_height*proportion;
 | 
				
			||||||
 | 
					      float actualY = (float)(maxY < y ? maxY : y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      controlPoint->m_xoffset = 0.0;
 | 
				
			||||||
 | 
					      controlPoint->m_yoffset = (float)(actualY - GetY());
 | 
				
			||||||
 | 
					      currentY = actualY;
 | 
				
			||||||
 | 
					      i ++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    node = node->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					void wxDividedShape::WritePrologAttributes(wxExpr *clause)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxRectangleShape::WritePrologAttributes(clause);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShape::ReadPrologAttributes(wxExpr *clause)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxRectangleShape::ReadPrologAttributes(clause);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Edit the division colour/style
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShape::EditRegions()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxMessageBox("EditRegions() is unimplemented.", "OGL", wxOK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // TODO
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					  if (GetRegions().Number() < 2)
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  wxBeginBusyCursor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  GraphicsForm *form = new GraphicsForm("Divided nodes");
 | 
				
			||||||
 | 
					  // Need an array to store all the style strings,
 | 
				
			||||||
 | 
					  // since they need to be converted to integers
 | 
				
			||||||
 | 
					  char **styleStrings = new char *[GetRegions().Number()];
 | 
				
			||||||
 | 
					  for (int j = 0; j < GetRegions().Number(); j++)
 | 
				
			||||||
 | 
					    styleStrings[j] = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int i = 0;
 | 
				
			||||||
 | 
					  wxNode *node = GetRegions().First();
 | 
				
			||||||
 | 
					  while (node && node->Next())
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShapeRegion *region = (wxShapeRegion *)node->Data();
 | 
				
			||||||
 | 
					    char buf[50];
 | 
				
			||||||
 | 
					    sprintf(buf, "Region %d", (i+1));
 | 
				
			||||||
 | 
					    form->Add(wxMakeFormMessage(buf));
 | 
				
			||||||
 | 
					    form->Add(wxMakeFormNewLine());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    form->Add(wxMakeFormString("Colour", ®ion->penColour, wxFORM_CHOICE,
 | 
				
			||||||
 | 
					              new wxList(wxMakeConstraintStrings(
 | 
				
			||||||
 | 
					    "Invisible"        ,
 | 
				
			||||||
 | 
					    "BLACK"            ,
 | 
				
			||||||
 | 
					    "BLUE"             ,
 | 
				
			||||||
 | 
					    "BROWN"            ,
 | 
				
			||||||
 | 
					    "CORAL"            ,
 | 
				
			||||||
 | 
					    "CYAN"             ,
 | 
				
			||||||
 | 
					    "DARK GREY"        ,
 | 
				
			||||||
 | 
					    "DARK GREEN"       ,
 | 
				
			||||||
 | 
					    "DIM GREY"         ,
 | 
				
			||||||
 | 
					    "GREY"             ,
 | 
				
			||||||
 | 
					    "GREEN"            ,
 | 
				
			||||||
 | 
					    "LIGHT BLUE"       ,
 | 
				
			||||||
 | 
					    "LIGHT GREY"       ,
 | 
				
			||||||
 | 
					    "MAGENTA"          ,
 | 
				
			||||||
 | 
					    "MAROON"           ,
 | 
				
			||||||
 | 
					    "NAVY"             ,
 | 
				
			||||||
 | 
					    "ORANGE"           ,
 | 
				
			||||||
 | 
					    "PURPLE"           ,
 | 
				
			||||||
 | 
					    "RED"              ,
 | 
				
			||||||
 | 
					    "TURQUOISE"        ,
 | 
				
			||||||
 | 
					    "VIOLET"           ,
 | 
				
			||||||
 | 
					    "WHITE"            ,
 | 
				
			||||||
 | 
					    "YELLOW"           ,
 | 
				
			||||||
 | 
					    NULL),
 | 
				
			||||||
 | 
					    NULL), NULL, wxVERTICAL, 150));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    char *styleString = NULL;
 | 
				
			||||||
 | 
					    switch (region->penStyle)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      case wxSHORT_DASH:
 | 
				
			||||||
 | 
					        styleString = "Short Dash";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case wxLONG_DASH:
 | 
				
			||||||
 | 
					        styleString = "Long Dash";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case wxDOT:
 | 
				
			||||||
 | 
					        styleString = "Dot";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case wxDOT_DASH:
 | 
				
			||||||
 | 
					        styleString = "Dot Dash";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case wxSOLID:
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					        styleString = "Solid";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    styleStrings[i] = copystring(styleString);
 | 
				
			||||||
 | 
					    form->Add(wxMakeFormString("Style", &(styleStrings[i]), wxFORM_CHOICE,
 | 
				
			||||||
 | 
					              new wxList(wxMakeConstraintStrings(
 | 
				
			||||||
 | 
					    "Solid"            ,
 | 
				
			||||||
 | 
					    "Short Dash"       ,
 | 
				
			||||||
 | 
					    "Long Dash"        ,
 | 
				
			||||||
 | 
					    "Dot"              ,
 | 
				
			||||||
 | 
					    "Dot Dash"         ,
 | 
				
			||||||
 | 
					    NULL),
 | 
				
			||||||
 | 
					    NULL), NULL, wxVERTICAL, 100));
 | 
				
			||||||
 | 
					    node = node->Next();
 | 
				
			||||||
 | 
					    i ++;
 | 
				
			||||||
 | 
					    if (node && node->Next())
 | 
				
			||||||
 | 
					      form->Add(wxMakeFormNewLine());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  wxDialogBox *dialog = new wxDialogBox(m_canvas->GetParent(), "Divided object properties", 10, 10, 500, 500);
 | 
				
			||||||
 | 
					  if (GraphicsLabelFont)
 | 
				
			||||||
 | 
					    dialog->SetLabelFont(GraphicsLabelFont);
 | 
				
			||||||
 | 
					  if (GraphicsButtonFont)
 | 
				
			||||||
 | 
					    dialog->SetButtonFont(GraphicsButtonFont);
 | 
				
			||||||
 | 
					  form->AssociatePanel(dialog);
 | 
				
			||||||
 | 
					  form->dialog = dialog;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  dialog->Fit();
 | 
				
			||||||
 | 
					  dialog->Centre(wxBOTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxEndBusyCursor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  dialog->Show(TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  node = GetRegions().First();
 | 
				
			||||||
 | 
					  i = 0;
 | 
				
			||||||
 | 
					  while (node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShapeRegion *region = (wxShapeRegion *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (styleStrings[i])
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (strcmp(styleStrings[i], "Solid") == 0)
 | 
				
			||||||
 | 
					        region->penStyle = wxSOLID;
 | 
				
			||||||
 | 
					      else if (strcmp(styleStrings[i], "Dot") == 0)
 | 
				
			||||||
 | 
					        region->penStyle = wxDOT;
 | 
				
			||||||
 | 
					      else if (strcmp(styleStrings[i], "Short Dash") == 0)
 | 
				
			||||||
 | 
					        region->penStyle = wxSHORT_DASH;
 | 
				
			||||||
 | 
					      else if (strcmp(styleStrings[i], "Long Dash") == 0)
 | 
				
			||||||
 | 
					        region->penStyle = wxLONG_DASH;
 | 
				
			||||||
 | 
					      else if (strcmp(styleStrings[i], "Dot Dash") == 0)
 | 
				
			||||||
 | 
					        region->penStyle = wxDOT_DASH;
 | 
				
			||||||
 | 
					      delete[] styleStrings[i];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    region->m_actualPenObject = NULL;
 | 
				
			||||||
 | 
					    node = node->Next();
 | 
				
			||||||
 | 
					    i ++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  delete[] styleStrings;
 | 
				
			||||||
 | 
					  Draw(dc);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShape::OnRightClick(float x, float y, int keys, int attachment)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (keys & KEY_CTRL)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    EditRegions();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxRectangleShape::OnRightClick(x, y, keys, attachment);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxDividedShapeControlPoint::wxDividedShapeControlPoint(wxShapeCanvas *the_canvas, wxShape *object,
 | 
				
			||||||
 | 
					  int region, float size, float the_m_xoffset, float the_m_yoffset, int the_type):
 | 
				
			||||||
 | 
					    wxControlPoint(the_canvas, object, size, the_m_xoffset, the_m_yoffset, the_type)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  regionId = region;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxDividedShapeControlPoint::~wxDividedShapeControlPoint()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Implement resizing of divided object division
 | 
				
			||||||
 | 
					void wxDividedShapeControlPoint::OnDragLeft(bool draw, float x, float y, int keys, int attachment)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    wxClientDC dc(GetCanvas());
 | 
				
			||||||
 | 
					    GetCanvas()->PrepareDC(dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dc.SetLogicalFunction(wxXOR);
 | 
				
			||||||
 | 
					    wxPen dottedPen(wxColour(0, 0, 0), 1, wxDOT);
 | 
				
			||||||
 | 
					    dc.SetPen(dottedPen);
 | 
				
			||||||
 | 
					    dc.SetBrush((* wxTRANSPARENT_BRUSH));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wxDividedShape *dividedObject = (wxDividedShape *)m_shape;
 | 
				
			||||||
 | 
					    float x1 = (float)(dividedObject->GetX() - (dividedObject->GetWidth()/2.0));
 | 
				
			||||||
 | 
					    float y1 = y;
 | 
				
			||||||
 | 
					    float x2 = (float)(dividedObject->GetX() + (dividedObject->GetWidth()/2.0));
 | 
				
			||||||
 | 
					    float y2 = y;
 | 
				
			||||||
 | 
					    dc.DrawLine(x1, y1, x2, y2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShapeControlPoint::OnBeginDragLeft(float x, float y, int keys, int attachment)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    wxClientDC dc(GetCanvas());
 | 
				
			||||||
 | 
					    GetCanvas()->PrepareDC(dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wxDividedShape *dividedObject = (wxDividedShape *)m_shape;
 | 
				
			||||||
 | 
					    dc.SetLogicalFunction(wxXOR);
 | 
				
			||||||
 | 
					    wxPen dottedPen(wxColour(0, 0, 0), 1, wxDOT);
 | 
				
			||||||
 | 
					    dc.SetPen(dottedPen);
 | 
				
			||||||
 | 
					    dc.SetBrush((* wxTRANSPARENT_BRUSH));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float x1 = (float)(dividedObject->GetX() - (dividedObject->GetWidth()/2.0));
 | 
				
			||||||
 | 
					    float y1 = y;
 | 
				
			||||||
 | 
					    float x2 = (float)(dividedObject->GetX() + (dividedObject->GetWidth()/2.0));
 | 
				
			||||||
 | 
					    float y2 = y;
 | 
				
			||||||
 | 
					    dc.DrawLine(x1, y1, x2, y2);
 | 
				
			||||||
 | 
					    m_canvas->CaptureMouse();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDividedShapeControlPoint::OnEndDragLeft(float x, float y, int keys, int attachment)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    wxClientDC dc(GetCanvas());
 | 
				
			||||||
 | 
					    GetCanvas()->PrepareDC(dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wxDividedShape *dividedObject = (wxDividedShape *)m_shape;
 | 
				
			||||||
 | 
					    wxNode *node = dividedObject->GetRegions().Nth(regionId);
 | 
				
			||||||
 | 
					    if (!node)
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    wxShapeRegion *thisRegion = (wxShapeRegion *)node->Data();
 | 
				
			||||||
 | 
					    wxShapeRegion *nextRegion = NULL; // Region below this one
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dc.SetLogicalFunction(wxCOPY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_canvas->ReleaseMouse();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Find the old top and bottom of this region,
 | 
				
			||||||
 | 
					    // and calculate the new proportion for this region
 | 
				
			||||||
 | 
					    // if legal.
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    float currentY = (float)(dividedObject->GetY() - (dividedObject->GetHeight() / 2.0));
 | 
				
			||||||
 | 
					    float maxY = (float)(dividedObject->GetY() + (dividedObject->GetHeight() / 2.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Save values
 | 
				
			||||||
 | 
					    float thisRegionTop = 0.0;
 | 
				
			||||||
 | 
					    float thisRegionBottom = 0.0;
 | 
				
			||||||
 | 
					    float nextRegionBottom = 0.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    node = dividedObject->GetRegions().First();
 | 
				
			||||||
 | 
					    while (node)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wxShapeRegion *region = (wxShapeRegion *)node->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      float proportion = region->m_regionProportionY;
 | 
				
			||||||
 | 
					      float yy = currentY + (dividedObject->GetHeight()*proportion);
 | 
				
			||||||
 | 
					      float actualY = (float)(maxY < yy ? maxY : yy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (region == thisRegion)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        thisRegionTop = currentY;
 | 
				
			||||||
 | 
					        thisRegionBottom = actualY;
 | 
				
			||||||
 | 
					        if (node->Next())
 | 
				
			||||||
 | 
					          nextRegion = (wxShapeRegion *)node->Next()->Data();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (region == nextRegion)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        nextRegionBottom = actualY;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      currentY = actualY;
 | 
				
			||||||
 | 
					      node = node->Next();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!nextRegion)
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Check that we haven't gone above this region or below
 | 
				
			||||||
 | 
					    // next region.
 | 
				
			||||||
 | 
					    if ((y <= thisRegionTop) || (y >= nextRegionBottom))
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dividedObject->EraseLinks(dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Now calculate the new proportions of this region and the next region.
 | 
				
			||||||
 | 
					    float thisProportion = (float)((y - thisRegionTop)/dividedObject->GetHeight());
 | 
				
			||||||
 | 
					    float nextProportion = (float)((nextRegionBottom - y)/dividedObject->GetHeight());
 | 
				
			||||||
 | 
					    thisRegion->SetProportions(0.0, thisProportion);
 | 
				
			||||||
 | 
					    nextRegion->SetProportions(0.0, nextProportion);
 | 
				
			||||||
 | 
					    m_yoffset = (float)(y - dividedObject->GetY());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Now reformat text
 | 
				
			||||||
 | 
					    int i = 0;
 | 
				
			||||||
 | 
					    node = dividedObject->GetRegions().First();
 | 
				
			||||||
 | 
					    while (node)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        wxShapeRegion *region = (wxShapeRegion *)node->Data();
 | 
				
			||||||
 | 
					        if (region->GetText())
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        char *s = copystring(region->GetText());
 | 
				
			||||||
 | 
					        dividedObject->FormatText(dc, s, i);
 | 
				
			||||||
 | 
					        delete[] s;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        node = node->Next();
 | 
				
			||||||
 | 
					        i++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    dividedObject->SetRegionSizes();
 | 
				
			||||||
 | 
					    dividedObject->Draw(dc);
 | 
				
			||||||
 | 
					    dividedObject->GetEventHandler()->OnMoveLinks(dc);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										77
									
								
								utils/ogl/src/divided.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,77 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        divided.h
 | 
				
			||||||
 | 
					// Purpose:     wxDividedShape
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_DIVIDED_H_
 | 
				
			||||||
 | 
					#define _OGL_DIVIDED_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "basic.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Definition of a region
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Box divided into horizontal regions
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern wxFont *g_oglNormalFont;
 | 
				
			||||||
 | 
					class wxDividedShape: public wxRectangleShape
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxDividedShape)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxDividedShape(float w = 0.0, float h = 0.0);
 | 
				
			||||||
 | 
					  ~wxDividedShape();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnDrawContents(wxDC& dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void SetSize(float w, float h, bool recursive = TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void MakeControlPoints();
 | 
				
			||||||
 | 
					  void ResetControlPoints();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void MakeMandatoryControlPoints();
 | 
				
			||||||
 | 
					  void ResetMandatoryControlPoints();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					  // Prolog database stuff
 | 
				
			||||||
 | 
					  void WritePrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					  void ReadPrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void Copy(wxDividedShape ©);
 | 
				
			||||||
 | 
					  wxShape *PrivateCopy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Set all region sizes according to proportions and
 | 
				
			||||||
 | 
					  // this object total size
 | 
				
			||||||
 | 
					  void SetRegionSizes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Edit region colours/styles
 | 
				
			||||||
 | 
					  void EditRegions();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Attachment points correspond to regions in the divided box
 | 
				
			||||||
 | 
					  bool GetAttachmentPosition(int attachment, float *x, float *y,
 | 
				
			||||||
 | 
					                                     int nth = 0, int no_arcs = 1, wxLineShape *line = NULL);
 | 
				
			||||||
 | 
					  bool AttachmentIsValid(int attachment);
 | 
				
			||||||
 | 
					  int GetNumberOfAttachments();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Invoke editor on CTRL-right click
 | 
				
			||||||
 | 
					  void OnRightClick(float x, float y, int keys = 0, int attachment = 0);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    // _OGL_DIVIDED_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										1764
									
								
								utils/ogl/src/drawn.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										119
									
								
								utils/ogl/src/drawn.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,119 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        drawn.h
 | 
				
			||||||
 | 
					// Purpose:     wxDrawnShape
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_DRAWN_H_
 | 
				
			||||||
 | 
					#define _OGL_DRAWN_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "drawn.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "basic.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxPseudoMetaFile: public wxObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxPseudoMetaFile)
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxPseudoMetaFile();
 | 
				
			||||||
 | 
					  wxPseudoMetaFile(wxPseudoMetaFile& mf);
 | 
				
			||||||
 | 
					  ~wxPseudoMetaFile();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void Draw(wxDC& dc, float xoffset, float yoffset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					  void WritePrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					  void ReadPrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void Clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void Copy(wxPseudoMetaFile& copy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void Scale(float sx, float sy);
 | 
				
			||||||
 | 
					  void ScaleTo(float w, float h); // Scale to fit size
 | 
				
			||||||
 | 
					  void Translate(float x, float y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Rotate about the given axis by theta radians from the x axis.
 | 
				
			||||||
 | 
					  void Rotate(float x, float y, float theta);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool LoadFromMetaFile(char *filename, float *width, float *height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void GetBounds(float *minX, float *minY, float *maxX, float *maxY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline wxList& GetOutlineColours() const { return (wxList&) m_outlineColours; }
 | 
				
			||||||
 | 
					  inline wxList& GetFillColours() const { return (wxList&) m_fillColours; }
 | 
				
			||||||
 | 
					  inline void SetRotateable(bool rot) { m_rotateable = rot; }
 | 
				
			||||||
 | 
					  inline bool GetRotateable() const { return m_rotateable; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  bool              m_rotateable;
 | 
				
			||||||
 | 
					  float             m_width;
 | 
				
			||||||
 | 
					  float             m_height;
 | 
				
			||||||
 | 
					  wxList            m_ops; // List of drawing operations (see drawnp.h)
 | 
				
			||||||
 | 
					  wxList            m_gdiObjects; // List of pens, brushes and fonts for this object.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Pen/brush specifying outline/fill colours
 | 
				
			||||||
 | 
					  // to override operations.
 | 
				
			||||||
 | 
					  wxPen*            m_outlinePen;
 | 
				
			||||||
 | 
					  wxBrush*          m_fillBrush;
 | 
				
			||||||
 | 
					  wxList            m_outlineColours; // List of the GDI operations that comprise the outline
 | 
				
			||||||
 | 
					  wxList            m_fillColours; // List of the GDI operations that fill the shape
 | 
				
			||||||
 | 
					  float             m_currentRotation;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxDrawnShape: public wxRectangleShape
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxDrawnShape)
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxDrawnShape();
 | 
				
			||||||
 | 
					  ~wxDrawnShape();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					  // Prolog database stuff
 | 
				
			||||||
 | 
					  char *GetFunctor();
 | 
				
			||||||
 | 
					  void WritePrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					  void ReadPrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Does the copying for this object
 | 
				
			||||||
 | 
					  void Copy(wxDrawnShape& copy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns a new instance, and does the copy for this class. Define for each class.
 | 
				
			||||||
 | 
					  wxShape *PrivateCopy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void Scale(float sx, float sy);
 | 
				
			||||||
 | 
					  void Translate(float x, float y);
 | 
				
			||||||
 | 
					  // Rotate about the given axis by theta radians from the x axis.
 | 
				
			||||||
 | 
					  void Rotate(float x, float y, float theta);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Get current rotation
 | 
				
			||||||
 | 
					  inline float GetRotation() const { return m_rotation; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void SetSize(float w, float h, bool recursive = TRUE);
 | 
				
			||||||
 | 
					  bool LoadFromMetaFile(char *filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline void SetSaveToFile(bool save) { m_saveToFile = save; }
 | 
				
			||||||
 | 
					  inline wxPseudoMetaFile& GetMetaFile() const { return (wxPseudoMetaFile&) m_metafile; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					  wxPseudoMetaFile      m_metafile;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Don't save all wxDrawnShape metafiles to file: sometimes
 | 
				
			||||||
 | 
					  // we take the metafile data from a symbol library.
 | 
				
			||||||
 | 
					  bool                  m_saveToFile;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    // _DRAWN_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										168
									
								
								utils/ogl/src/drawnp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,168 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        drawnp.h
 | 
				
			||||||
 | 
					// Purpose:     Private header for wxDrawnShape
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_DRAWNP_H_
 | 
				
			||||||
 | 
					#define _OGL_DRAWNP_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "drawnp.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "drawn.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Drawing operations
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					#define  DRAWOP_SET_PEN             1
 | 
				
			||||||
 | 
					#define  DRAWOP_SET_BRUSH           2
 | 
				
			||||||
 | 
					#define  DRAWOP_SET_FONT            3
 | 
				
			||||||
 | 
					#define  DRAWOP_SET_TEXT_COLOUR     4
 | 
				
			||||||
 | 
					#define  DRAWOP_SET_BK_COLOUR       5
 | 
				
			||||||
 | 
					#define  DRAWOP_SET_BK_MODE         6
 | 
				
			||||||
 | 
					#define  DRAWOP_SET_CLIPPING_RECT   7
 | 
				
			||||||
 | 
					#define  DRAWOP_DESTROY_CLIPPING_RECT 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					#define  DRAWOP_CREATE_PEN          10
 | 
				
			||||||
 | 
					#define  DRAWOP_CREATE_BRUSH        11
 | 
				
			||||||
 | 
					#define  DRAWOP_CREATE_FONT         12
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define  DRAWOP_DRAW_LINE           20
 | 
				
			||||||
 | 
					#define  DRAWOP_DRAW_POLYLINE       21
 | 
				
			||||||
 | 
					#define  DRAWOP_DRAW_POLYGON        22
 | 
				
			||||||
 | 
					#define  DRAWOP_DRAW_RECT           23
 | 
				
			||||||
 | 
					#define  DRAWOP_DRAW_ROUNDED_RECT   24
 | 
				
			||||||
 | 
					#define  DRAWOP_DRAW_ELLIPSE        25
 | 
				
			||||||
 | 
					#define  DRAWOP_DRAW_POINT          26
 | 
				
			||||||
 | 
					#define  DRAWOP_DRAW_ARC            27
 | 
				
			||||||
 | 
					#define  DRAWOP_DRAW_TEXT           28
 | 
				
			||||||
 | 
					#define  DRAWOP_DRAW_SPLINE         29
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Base, virtual class
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					class wxDrawOp: public wxObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  int op;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline wxDrawOp(int theOp) { op = theOp; }
 | 
				
			||||||
 | 
					  inline ~wxDrawOp() {}
 | 
				
			||||||
 | 
					  inline virtual void Scale(float xScale, float yScale) {};
 | 
				
			||||||
 | 
					  inline virtual void Translate(float x, float y) {};
 | 
				
			||||||
 | 
					  inline virtual void Rotate(float x, float y, float sinTheta, float cosTheta) {};
 | 
				
			||||||
 | 
					  virtual void Do(wxDC& dc, float xoffset, float yoffset) = 0;
 | 
				
			||||||
 | 
					  virtual wxDrawOp *Copy(wxPseudoMetaFile *newImage) = 0;
 | 
				
			||||||
 | 
					  virtual wxExpr *WritewxExpr(wxPseudoMetaFile *image) = 0;
 | 
				
			||||||
 | 
					  virtual void ReadwxExpr(wxPseudoMetaFile *image, wxExpr *expr) = 0;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Set font, brush, text colour
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					class wxOpSetGDI: public wxDrawOp
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  int mode;
 | 
				
			||||||
 | 
					  int gdiIndex;
 | 
				
			||||||
 | 
					  wxPseudoMetaFile *image;
 | 
				
			||||||
 | 
					  unsigned char r;
 | 
				
			||||||
 | 
					  unsigned char g;
 | 
				
			||||||
 | 
					  unsigned char b;
 | 
				
			||||||
 | 
					  wxOpSetGDI(int theOp, wxPseudoMetaFile *theImage, int theGdiIndex, int theMode = 0);
 | 
				
			||||||
 | 
					  void Do(wxDC& dc, float xoffset, float yoffset);
 | 
				
			||||||
 | 
					  wxDrawOp *Copy(wxPseudoMetaFile *newImage);
 | 
				
			||||||
 | 
					  wxExpr *WritewxExpr(wxPseudoMetaFile *image);
 | 
				
			||||||
 | 
					  void ReadwxExpr(wxPseudoMetaFile *image, wxExpr *expr);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Set/destroy clipping
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					class wxOpSetClipping: public wxDrawOp
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  float x1;
 | 
				
			||||||
 | 
					  float y1;
 | 
				
			||||||
 | 
					  float x2;
 | 
				
			||||||
 | 
					  float y2;
 | 
				
			||||||
 | 
					  wxOpSetClipping(int theOp, float theX1, float theY1, float theX2, float theY2);
 | 
				
			||||||
 | 
					  void Do(wxDC& dc, float xoffset, float yoffset);
 | 
				
			||||||
 | 
					  void Scale(float xScale, float yScale);
 | 
				
			||||||
 | 
					  void Translate(float x, float y);
 | 
				
			||||||
 | 
					  wxDrawOp *Copy(wxPseudoMetaFile *newImage);
 | 
				
			||||||
 | 
					  wxExpr *WritewxExpr(wxPseudoMetaFile *image);
 | 
				
			||||||
 | 
					  void ReadwxExpr(wxPseudoMetaFile *image, wxExpr *expr);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Draw line, rectangle, rounded rectangle, ellipse, point, arc, text
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					class wxOpDraw: public wxDrawOp
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  float x1;
 | 
				
			||||||
 | 
					  float y1;
 | 
				
			||||||
 | 
					  float x2;
 | 
				
			||||||
 | 
					  float y2;
 | 
				
			||||||
 | 
					  float x3;
 | 
				
			||||||
 | 
					  float radius;
 | 
				
			||||||
 | 
					  char *textString;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxOpDraw(int theOp, float theX1, float theY1, float theX2, float theY2,
 | 
				
			||||||
 | 
					         float radius = 0.0, char *s = NULL);
 | 
				
			||||||
 | 
					  ~wxOpDraw();
 | 
				
			||||||
 | 
					  void Do(wxDC& dc, float xoffset, float yoffset);
 | 
				
			||||||
 | 
					  void Scale(float scaleX, float scaleY);
 | 
				
			||||||
 | 
					  void Translate(float x, float y);
 | 
				
			||||||
 | 
					  void Rotate(float x, float y, float sinTheta, float cosTheta);
 | 
				
			||||||
 | 
					  wxDrawOp *Copy(wxPseudoMetaFile *newImage);
 | 
				
			||||||
 | 
					  wxExpr *WritewxExpr(wxPseudoMetaFile *image);
 | 
				
			||||||
 | 
					  void ReadwxExpr(wxPseudoMetaFile *image, wxExpr *expr);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Draw polyline, spline, polygon
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxOpPolyDraw: public wxDrawOp
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxRealPoint *points;
 | 
				
			||||||
 | 
					  int noPoints;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  wxOpPolyDraw(int theOp, int n, wxRealPoint *thePoints);
 | 
				
			||||||
 | 
					  ~wxOpPolyDraw();
 | 
				
			||||||
 | 
					  void Do(wxDC& dc, float xoffset, float yoffset);
 | 
				
			||||||
 | 
					  void Scale(float scaleX, float scaleY);
 | 
				
			||||||
 | 
					  void Translate(float x, float y);
 | 
				
			||||||
 | 
					  void Rotate(float x, float y, float sinTheta, float cosTheta);
 | 
				
			||||||
 | 
					  wxDrawOp *Copy(wxPseudoMetaFile *newImage);
 | 
				
			||||||
 | 
					  wxExpr *WritewxExpr(wxPseudoMetaFile *image);
 | 
				
			||||||
 | 
					  void ReadwxExpr(wxPseudoMetaFile *image, wxExpr *expr);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					 // _OGL_DRAWNP_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										2481
									
								
								utils/ogl/src/lines.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										286
									
								
								utils/ogl/src/lines.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,286 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        lines.h
 | 
				
			||||||
 | 
					// Purpose:     wxLineShape
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_LINES_H_
 | 
				
			||||||
 | 
					#define _OGL_LINES_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "lines.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxLabelShape;
 | 
				
			||||||
 | 
					class wxPseudoMetaFile;
 | 
				
			||||||
 | 
					class wxLineControlPoint;
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Arcs with multiple arrowheads
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Types of arrowhead
 | 
				
			||||||
 | 
					// (i) Built-in
 | 
				
			||||||
 | 
					#define ARROW_HOLLOW_CIRCLE   1
 | 
				
			||||||
 | 
					#define ARROW_FILLED_CIRCLE   2
 | 
				
			||||||
 | 
					#define ARROW_ARROW           3
 | 
				
			||||||
 | 
					#define ARROW_SINGLE_OBLIQUE  4
 | 
				
			||||||
 | 
					#define ARROW_DOUBLE_OBLIQUE  5
 | 
				
			||||||
 | 
					// (ii) Custom
 | 
				
			||||||
 | 
					#define ARROW_METAFILE        20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Position of arrow on line
 | 
				
			||||||
 | 
					#define ARROW_POSITION_START  0
 | 
				
			||||||
 | 
					#define ARROW_POSITION_END    1
 | 
				
			||||||
 | 
					#define ARROW_POSITION_MIDDLE 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Line alignment flags
 | 
				
			||||||
 | 
					// Vertical by default
 | 
				
			||||||
 | 
					#define LINE_ALIGNMENT_HORIZ              1
 | 
				
			||||||
 | 
					#define LINE_ALIGNMENT_VERT               0
 | 
				
			||||||
 | 
					#define LINE_ALIGNMENT_TO_NEXT_HANDLE     2
 | 
				
			||||||
 | 
					#define LINE_ALIGNMENT_NONE               0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxArrowHead: public wxObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxArrowHead)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxArrowHead(WXTYPE type = 0, int end = 0, float size = 0.0, float dist = 0.0, const wxString& name = "", wxPseudoMetaFile *mf = NULL,
 | 
				
			||||||
 | 
					            long arrowId = -1);
 | 
				
			||||||
 | 
					  ~wxArrowHead();
 | 
				
			||||||
 | 
					  wxArrowHead(wxArrowHead& toCopy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline WXTYPE _GetType() const { return m_arrowType; }
 | 
				
			||||||
 | 
					  inline int GetPosition() const { return m_arrowEnd; }
 | 
				
			||||||
 | 
					  inline float GetXOffset() const { return m_xOffset; }
 | 
				
			||||||
 | 
					  inline float GetYOffset() const { return m_yOffset; }
 | 
				
			||||||
 | 
					  inline float GetSpacing() const { return m_spacing; }
 | 
				
			||||||
 | 
					  inline float GetSize() const { return m_arrowSize; }
 | 
				
			||||||
 | 
					  inline wxString GetName() const { return m_arrowName; }
 | 
				
			||||||
 | 
					  inline void SetXOffset(float x) { m_xOffset = x; }
 | 
				
			||||||
 | 
					  inline void SetYOffset(float y) { m_yOffset = y; }
 | 
				
			||||||
 | 
					  inline wxPseudoMetaFile *GetMetaFile() const { return m_metaFile; }
 | 
				
			||||||
 | 
					  inline long GetId() const { return m_id; }
 | 
				
			||||||
 | 
					  inline int GetArrowEnd() const { return m_arrowEnd; }
 | 
				
			||||||
 | 
					  inline float GetArrowSize() const { return m_arrowSize; }
 | 
				
			||||||
 | 
					  void SetSize(float size);
 | 
				
			||||||
 | 
					  inline void SetSpacing(float sp) { m_spacing = sp; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 protected:
 | 
				
			||||||
 | 
					  WXTYPE            m_arrowType;
 | 
				
			||||||
 | 
					  int               m_arrowEnd;         // Position on line
 | 
				
			||||||
 | 
					  float             m_xOffset;          // Distance from arc start or end, w.r.t. point on arrowhead
 | 
				
			||||||
 | 
					                                        // nearest start or end. If zero, use default spacing.
 | 
				
			||||||
 | 
					  float             m_yOffset;          // vertical offset (w.r.t. a horizontal line). Normally zero.
 | 
				
			||||||
 | 
					  float             m_spacing;          // Spacing from the last arrowhead
 | 
				
			||||||
 | 
					  float             m_arrowSize;        // Length of arrowhead
 | 
				
			||||||
 | 
					  wxString          m_arrowName;        // Name of arrow
 | 
				
			||||||
 | 
					  bool              m_saveToFile;       // TRUE if we want to save custom arrowheads to file.
 | 
				
			||||||
 | 
					  wxPseudoMetaFile* m_metaFile;         // Pseudo metafile if this is a custom arrowhead
 | 
				
			||||||
 | 
					  long              m_id;               // identifier
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Line object
 | 
				
			||||||
 | 
					class wxLineShape: public wxShape
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxLineShape)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxLineShape();
 | 
				
			||||||
 | 
					  ~wxLineShape();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Called when a connected object has moved, to move the link to
 | 
				
			||||||
 | 
					  // correct position
 | 
				
			||||||
 | 
					  // moveControlPoints must be disabled when a control point is being
 | 
				
			||||||
 | 
					  // dragged.
 | 
				
			||||||
 | 
					  void OnMoveLink(wxDC& dc, bool moveControlPoints = TRUE);
 | 
				
			||||||
 | 
					  bool OnMovePre(wxDC& dc, float x, float y, float old_x, float old_y, bool display = TRUE);
 | 
				
			||||||
 | 
					  void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnDrawContents(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnDrawControlPoints(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnEraseControlPoints(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnErase(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual inline void OnMoveControlPoint(int WXUNUSED(which), float WXUNUSED(x), float WXUNUSED(y)) {}
 | 
				
			||||||
 | 
					  void OnDrawOutline(wxDC& dc, float x, float y, float w, float h);
 | 
				
			||||||
 | 
					  void GetBoundingBoxMin(float *w, float *h);
 | 
				
			||||||
 | 
					  void FormatText(wxDC& dc, const wxString& s, int regionId = 0);
 | 
				
			||||||
 | 
					  virtual void SetEnds(float x1, float y1, float x2, float y2);
 | 
				
			||||||
 | 
					  virtual void GetEnds(float *x1, float *y1, float *x2, float *y2);
 | 
				
			||||||
 | 
					  inline virtual wxShape *GetFrom() { return m_from; }
 | 
				
			||||||
 | 
					  inline virtual wxShape *GetTo() { return m_to; }
 | 
				
			||||||
 | 
					  inline virtual int GetAttachmentFrom() { return m_attachmentFrom; }
 | 
				
			||||||
 | 
					  inline virtual int GetAttachmentTo() { return m_attachmentTo; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void SetFrom(wxShape *object);
 | 
				
			||||||
 | 
					  virtual void SetTo(wxShape *object);
 | 
				
			||||||
 | 
					  virtual void DrawArrows(wxDC& dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Finds the x, y points at the two ends of the line.
 | 
				
			||||||
 | 
					  // This function can be used by e.g. line-routing routines to
 | 
				
			||||||
 | 
					  // get the actual points on the two node images where the lines will be drawn
 | 
				
			||||||
 | 
					  // to/from.
 | 
				
			||||||
 | 
					  void FindLineEndPoints(float *fromX, float *fromY, float *toX, float *toY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Format one region at this position
 | 
				
			||||||
 | 
					  void DrawRegion(wxDC& dc, wxShapeRegion *region, float x, float y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Erase one region at this position
 | 
				
			||||||
 | 
					  void EraseRegion(wxDC& dc, wxShapeRegion *region, float x, float y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Get the reference point for a label. Region x and y
 | 
				
			||||||
 | 
					  // are offsets from this.
 | 
				
			||||||
 | 
					  // position is 0 (middle), 1 (start), 2 (end)
 | 
				
			||||||
 | 
					  void GetLabelPosition(int position, float *x, float *y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Straighten verticals and horizontals
 | 
				
			||||||
 | 
					  virtual void Straighten(wxDC& dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Not implemented
 | 
				
			||||||
 | 
					  inline void SetMaintainStraightLines(bool flag) { m_maintainStraightLines = flag; }
 | 
				
			||||||
 | 
					  inline bool GetMaintainStraightLines() const { return m_maintainStraightLines; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Make handle control points
 | 
				
			||||||
 | 
					  void MakeControlPoints();
 | 
				
			||||||
 | 
					  void ResetControlPoints();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Make a given number of control points
 | 
				
			||||||
 | 
					  virtual void MakeLineControlPoints(int n);
 | 
				
			||||||
 | 
					  virtual wxNode *InsertLineControlPoint(wxDC* dc);
 | 
				
			||||||
 | 
					  virtual bool DeleteLineControlPoint();
 | 
				
			||||||
 | 
					  virtual void Initialise();
 | 
				
			||||||
 | 
					  inline wxList *GetLineControlPoints() { return m_lineControlPoints; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Override dragging behaviour - don't want to be able to drag lines!
 | 
				
			||||||
 | 
					  void OnDragLeft(bool draw, float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnBeginDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnEndDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Override select, to create/delete temporary label-moving objects
 | 
				
			||||||
 | 
					  void Select(bool select = TRUE, wxDC* dc = NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Set to spline (TRUE) or line (FALSE)
 | 
				
			||||||
 | 
					  inline void SetSpline(bool spl) { m_isSpline = spl; }
 | 
				
			||||||
 | 
					  inline bool IsSpline() const { return m_isSpline; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void Unlink();
 | 
				
			||||||
 | 
					  void SetAttachments(int from_attach, int to_attach);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool HitTest(float x, float y, int *attachment, float *distance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					  // Prolog database stuff
 | 
				
			||||||
 | 
					  virtual char *GetFunctor();
 | 
				
			||||||
 | 
					  virtual void WritePrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					  virtual void ReadPrologAttributes(wxExpr *clause);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void FindNth(wxShape *image, int *nth, int *no_arcs, bool incoming);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Find which position we're talking about at this (x, y).
 | 
				
			||||||
 | 
					  // Returns ARROW_POSITION_START, ARROW_POSITION_MIDDLE, ARROW_POSITION_END
 | 
				
			||||||
 | 
					  int FindLinePosition(float x, float y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // This is really to distinguish between lines and other images.
 | 
				
			||||||
 | 
					  // For lines, want to pass drag to canvas, since lines tend to prevent
 | 
				
			||||||
 | 
					  // dragging on a canvas (they get in the way.)
 | 
				
			||||||
 | 
					  virtual bool Draggable() const { return FALSE; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Does the copying for this object
 | 
				
			||||||
 | 
					  void Copy(wxLineShape& copy);
 | 
				
			||||||
 | 
					  wxShape *PrivateCopy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // New OGL stuff
 | 
				
			||||||
 | 
					  wxArrowHead *AddArrow(WXTYPE type, int end = ARROW_POSITION_END,
 | 
				
			||||||
 | 
					                float arrowSize = 10.0, float xOffset = 0.0, const wxString& name = "",
 | 
				
			||||||
 | 
					                wxPseudoMetaFile *mf = NULL, long arrowId = -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Add an arrowhead in the position indicated by the reference
 | 
				
			||||||
 | 
					  // list of arrowheads, which contains all legal arrowheads for this
 | 
				
			||||||
 | 
					  // line, in the correct order.
 | 
				
			||||||
 | 
					  // E.g. reference list:      a b c d e
 | 
				
			||||||
 | 
					  //      Current line list:   a d
 | 
				
			||||||
 | 
					  // Add c, then line list is: a c d
 | 
				
			||||||
 | 
					  // If no legal arrowhead position, return FALSE.
 | 
				
			||||||
 | 
					  // Assume reference list is for one end only, since it potentially defines
 | 
				
			||||||
 | 
					  // the ordering for any one of the 3 positions. So we don't check
 | 
				
			||||||
 | 
					  // the reference list for arrowhead position.
 | 
				
			||||||
 | 
					  bool AddArrowOrdered(wxArrowHead *arrow, wxList& referenceList, int end);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Delete arrowhead(s)
 | 
				
			||||||
 | 
					  void ClearArrowsAtPosition(int end = -1);
 | 
				
			||||||
 | 
					  bool ClearArrow(const wxString& name);
 | 
				
			||||||
 | 
					  wxArrowHead *FindArrowHead(int position, const wxString& name);
 | 
				
			||||||
 | 
					  wxArrowHead *FindArrowHead(long arrowId);
 | 
				
			||||||
 | 
					  bool DeleteArrowHead(int position, const wxString& name);
 | 
				
			||||||
 | 
					  bool DeleteArrowHead(long arrowId);
 | 
				
			||||||
 | 
					  void DrawArrow(wxDC& dc, wxArrowHead *arrow, float xOffset, bool proportionalOffset);
 | 
				
			||||||
 | 
					  inline void SetIgnoreOffsets(bool ignore) { m_ignoreArrowOffsets = ignore; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Find horizontal width for drawing a line with
 | 
				
			||||||
 | 
					  // arrows in minimum space. Assume arrows at
 | 
				
			||||||
 | 
					  // END only
 | 
				
			||||||
 | 
					  float FindMinimumWidth();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Set alignment flags. ALIGNMENT NOT IMPLEMENTED.
 | 
				
			||||||
 | 
					  void SetAlignmentOrientation(bool isEnd, bool isHoriz);
 | 
				
			||||||
 | 
					  void SetAlignmentType(bool isEnd, int alignType);
 | 
				
			||||||
 | 
					  bool GetAlignmentOrientation(bool isEnd);
 | 
				
			||||||
 | 
					  int GetAlignmentType(bool isEnd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Find next control point in line after the start/end point
 | 
				
			||||||
 | 
					  // (depending on whether the node object is at start or end)
 | 
				
			||||||
 | 
					  wxRealPoint *GetNextControlPoint(wxShape *nodeObject);
 | 
				
			||||||
 | 
					  inline bool IsEnd(wxShape *nodeObject) const { return (m_to == nodeObject); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					  bool              m_erasing;              // flag to say whether we're erasing or drawing
 | 
				
			||||||
 | 
					                                            // this line (really so metafiles can draw a
 | 
				
			||||||
 | 
					                                            // blank rectangle)
 | 
				
			||||||
 | 
					  bool              m_ignoreArrowOffsets;   // Don't always want to draw arrowhead offsets
 | 
				
			||||||
 | 
					                                            // because they may not work on tool palettes (for example)
 | 
				
			||||||
 | 
					  bool              m_isSpline;
 | 
				
			||||||
 | 
					  bool              m_maintainStraightLines;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					  // Temporary list of line segment orientations
 | 
				
			||||||
 | 
					  // so we know what direction the line is supposed to be dog-legging
 | 
				
			||||||
 | 
					  // in. The values are integer: 0 for vertical, 1 for horizontal.
 | 
				
			||||||
 | 
					  wxList            m_lineOrientations;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Temporary pointers for start, middle and end label editing objects
 | 
				
			||||||
 | 
					  // (active only when the line is selected)
 | 
				
			||||||
 | 
					  wxLabelShape*     m_labelObjects[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // These define the segmented line - not to be confused with temporary control
 | 
				
			||||||
 | 
					  // points which appear when object is selected (although in this case they'll
 | 
				
			||||||
 | 
					  // probably be the same)
 | 
				
			||||||
 | 
					  wxList*           m_lineControlPoints;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float             m_arrowSpacing; // Separation between adjacent arrows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxShape*          m_to;
 | 
				
			||||||
 | 
					  wxShape*          m_from;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					  float             m_actualTextWidth;  // Space the text takes up
 | 
				
			||||||
 | 
					  float             m_actualTextHeight; // (depends on text content unlike nodes)
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					  int               m_attachmentTo;   // Attachment point at one end
 | 
				
			||||||
 | 
					  int               m_attachmentFrom; // Attachment point at other end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Alignment flags
 | 
				
			||||||
 | 
					  int               m_alignmentStart;
 | 
				
			||||||
 | 
					  int               m_alignmentEnd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxList            m_arcArrows;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    // _OGL_LINES_H_
 | 
				
			||||||
							
								
								
									
										83
									
								
								utils/ogl/src/linesp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,83 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        linesp.h
 | 
				
			||||||
 | 
					// Purpose:     Lines private header file
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_LINESP_H_
 | 
				
			||||||
 | 
					#define _OGL_LINESP_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "linesp.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxLineControlPoint: public wxControlPoint
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  DECLARE_DYNAMIC_CLASS(wxLineControlPoint)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxLineControlPoint(wxShapeCanvas *the_canvas = NULL, wxShape *object = NULL, float size = 0.0,
 | 
				
			||||||
 | 
					     float x = 0.0, float y = 0.0, int the_type = 0);
 | 
				
			||||||
 | 
					  ~wxLineControlPoint();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnDragLeft(bool draw, float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnBeginDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnEndDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnDragRight(bool draw, float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnBeginDragRight(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnEndDragRight(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int           m_type;
 | 
				
			||||||
 | 
					  wxRealPoint*  m_point;  // Line point
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Temporary arc label object
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					class wxLabelShape: public wxRectangleShape
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  DECLARE_DYNAMIC_CLASS(wxLabelShape)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  wxLabelShape(wxLineShape *parent = NULL, wxShapeRegion *region = NULL, float w = 0.0, float h = 0.0);
 | 
				
			||||||
 | 
					  ~wxLabelShape();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void OnDraw(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnDrawContents(wxDC& dc);
 | 
				
			||||||
 | 
					  void OnLeftClick(float x, float y, int keys = 0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnRightClick(float x, float y, int keys = 0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnDragLeft(bool draw, float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnBeginDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  void OnEndDragLeft(float x, float y, int keys=0, int attachment = 0);
 | 
				
			||||||
 | 
					  bool OnMovePre(wxDC& dc, float x, float y, float old_x, float old_y, bool display = TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  wxLineShape*      m_lineShape;
 | 
				
			||||||
 | 
					  wxShapeRegion*    m_shapeRegion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Get the point on the given line (x1, y1) (x2, y2)
 | 
				
			||||||
 | 
					 * distance 'length' along from the end,
 | 
				
			||||||
 | 
					 * returned values in x and y
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GetPointOnLine(float x1, float y1, float x2, float y2,
 | 
				
			||||||
 | 
					                    float length, float *x, float *y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    // _OGL_LINESP_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										106
									
								
								utils/ogl/src/makefile.b32
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,106 @@
 | 
				
			|||||||
 | 
					#
 | 
				
			||||||
 | 
					# File:		makefile.b32
 | 
				
			||||||
 | 
					# Author:	Julian Smart
 | 
				
			||||||
 | 
					# Created:	1996
 | 
				
			||||||
 | 
					# Updated:	
 | 
				
			||||||
 | 
					# Copyright:	(c) 1993, AIAI, University of Edinburgh
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# "%W% %G%"
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Makefile : Builds OGL for BC++, 32-bit.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!if "$(BCCDIR)" == ""
 | 
				
			||||||
 | 
					!error You must define the BCCDIR variable in autoexec.bat, e.g. BCCDIR=d:\bc4
 | 
				
			||||||
 | 
					!endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!if "$(WXWIN)" == ""
 | 
				
			||||||
 | 
					!error You must define the WXWIN variable in autoexec.bat, e.g. WXWIN=c:\wx
 | 
				
			||||||
 | 
					!endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Change WXDIR to wherever wxWindows is found
 | 
				
			||||||
 | 
					WXDIR = $(WXWIN)
 | 
				
			||||||
 | 
					!include $(WXDIR)\src\makeb32.env
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WXLIB = $(WXDIR)\lib\wx32.lib
 | 
				
			||||||
 | 
					WXINC = $(WXDIR)\include
 | 
				
			||||||
 | 
					CFG=$(WXWIN)\src\wxwin32.cfg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OGLDIR = $(WXDIR)\utils\ogl
 | 
				
			||||||
 | 
					OGLLIB = $(WXDIR)\lib\ogl.lib
 | 
				
			||||||
 | 
					DOCDIR = $(OGLDIR)\docs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INC=/DPROLOGIO=1 # /I$(WXDIR)\include\base /I$(WXDIR)\include\msw
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LIBS=$(WXLIB) $(OGLLIB) mathwl cwl import mathwl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!ifndef FINAL
 | 
				
			||||||
 | 
					FINAL=0
 | 
				
			||||||
 | 
					!endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!if "$(FINAL)" == "0"
 | 
				
			||||||
 | 
					LINKFLAGS=/v /Tpe /L$(WXLIBDIR);$(BCCDIR)\lib
 | 
				
			||||||
 | 
					OPT = -Od
 | 
				
			||||||
 | 
					DEBUG_FLAGS= -v -DDEBUG=$(DEBUG)
 | 
				
			||||||
 | 
					!else
 | 
				
			||||||
 | 
					LINKFLAGS=/Tpe /L$(WXLIBDIR);$(BCCDIR)\lib
 | 
				
			||||||
 | 
					OPT = -O2
 | 
				
			||||||
 | 
					DEBUG_FLAGS = -DDEBUG=$(DEBUG)
 | 
				
			||||||
 | 
					!endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CPPFLAGS=$(DEBUG_FLAGS) $(OPT) @$(CFG)
 | 
				
			||||||
 | 
					CFLAGS=$(DEBUG_FLAGS) $(OPT) @$(CFG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OBJECTS = basic.obj basic2.obj canvas.obj ogldiag.obj lines.obj misc.obj divided.obj constrnt.obj\
 | 
				
			||||||
 | 
					 composit.obj drawn.obj bitmap.obj mfutils.obj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all:    $(OGLLIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.$(SRCSUFF).obj:
 | 
				
			||||||
 | 
						bcc32 $(CPPFLAGS) $(INC) -c {$< }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OGLLIB):      $(OBJECTS)
 | 
				
			||||||
 | 
					        erase $(OGLLIB)
 | 
				
			||||||
 | 
					        tlib /P128 @&&!
 | 
				
			||||||
 | 
					$(OGLLIB) &
 | 
				
			||||||
 | 
					+$(OBJECTS:.obj =.obj +)
 | 
				
			||||||
 | 
					!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Making documents
 | 
				
			||||||
 | 
					docs:   hlp
 | 
				
			||||||
 | 
					hlp: $(DOCDIR)/ogl.hlp
 | 
				
			||||||
 | 
					hlp32: $(DOCDIR)/hlp32/ogl.hlp
 | 
				
			||||||
 | 
					rtf:    $(DOCDIR)/ogl.rtf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)/ogl.hlp:         $(DOCDIR)/ogl.rtf $(DOCDIR)/ogl.hpj
 | 
				
			||||||
 | 
					        cd $(DOCDIR)
 | 
				
			||||||
 | 
					        -erase ogl.ph
 | 
				
			||||||
 | 
					        hc ogl
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)/hlp32/ogl.hlp:         $(DOCDIR)/hlp32/ogl.rtf $(DOCDIR)/hlp32/ogl.hpj
 | 
				
			||||||
 | 
					        cd $(DOCDIR)/hlp32
 | 
				
			||||||
 | 
					        -erase ogl.ph
 | 
				
			||||||
 | 
					        start /w hcw /c /e ogl.hpj
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)/ogl.rtf:         $(DOCDIR)/classes.tex $(DOCDIR)/intro.tex $(DOCDIR)/ogl.tex
 | 
				
			||||||
 | 
					        cd $(DOCDIR)
 | 
				
			||||||
 | 
					        start /w tex2rtf $(DOCDIR)/ogl.tex $(DOCDIR)/ogl.rtf -twice -winhelp
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)/hlp32/ogl.rtf:         $(DOCDIR)/classes.tex $(DOCDIR)/intro.tex $(DOCDIR)/ogl.tex
 | 
				
			||||||
 | 
					        cd $(DOCDIR)
 | 
				
			||||||
 | 
					        start /w tex2rtf $(DOCDIR)/ogl.tex $(DOCDIR)/hlp32/ogl.rtf -twice -winhelp -macros $(DOCDIR)/t2rtf32.ini
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wordrtf: 
 | 
				
			||||||
 | 
					        cd $(DOCDIR)
 | 
				
			||||||
 | 
					        -wx /W tex2rtf $(DOCDIR)/ogl.tex $(DOCDIR)/ogl.rtf -twice -rtf
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean:
 | 
				
			||||||
 | 
					        -erase *.obj
 | 
				
			||||||
 | 
					        -erase *.exe
 | 
				
			||||||
 | 
					        -erase *.res
 | 
				
			||||||
 | 
						-erase ..\lib\*.lib $(OGLLIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										105
									
								
								utils/ogl/src/makefile.bcc
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,105 @@
 | 
				
			|||||||
 | 
					#
 | 
				
			||||||
 | 
					# File:		makefile.bcc
 | 
				
			||||||
 | 
					# Author:	Julian Smart
 | 
				
			||||||
 | 
					# Created:	1996
 | 
				
			||||||
 | 
					# Updated:	
 | 
				
			||||||
 | 
					# Copyright:	(c) 1996
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# "%W% %G%"
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Makefile : Builds OGL for BC++, 16-bit.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!if "$(BCCDIR)" == ""
 | 
				
			||||||
 | 
					!error You must define the BCCDIR variable in autoexec.bat, e.g. BCCDIR=d:\bc4
 | 
				
			||||||
 | 
					!endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!if "$(WXWIN)" == ""
 | 
				
			||||||
 | 
					!error You must define the WXWIN variable in autoexec.bat, e.g. WXWIN=c:\wx
 | 
				
			||||||
 | 
					!endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Change WXDIR to wherever wxWindows is found
 | 
				
			||||||
 | 
					WXDIR = $(WXWIN)
 | 
				
			||||||
 | 
					!include $(WXDIR)\src\makebcc.env
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WXLIB = $(WXDIR)\lib\wx.lib
 | 
				
			||||||
 | 
					WXINC = $(WXDIR)\include
 | 
				
			||||||
 | 
					CFG=$(WXWIN)\src\wxwin.cfg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OGLDIR = $(WXDIR)\utils\ogl
 | 
				
			||||||
 | 
					OGLLIB = $(OGLDIR)\lib\ogl.lib
 | 
				
			||||||
 | 
					DOCDIR = $(OGLDIR)\docs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INC=/DPROLOGIO=1 # /I$(WXDIR)\include\base /I$(WXDIR)\include\msw
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LIBS=$(WXLIB) $(OGLLIB) mathwl cwl import mathwl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!ifndef FINAL
 | 
				
			||||||
 | 
					FINAL=0
 | 
				
			||||||
 | 
					!endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!if "$(FINAL)" == "0"
 | 
				
			||||||
 | 
					LINKFLAGS=/v/Vt /Twe /L$(WXDIR)\lib;$(BCCDIR)\lib
 | 
				
			||||||
 | 
					OPT = -Od
 | 
				
			||||||
 | 
					DEBUG_FLAGS= -v
 | 
				
			||||||
 | 
					!else
 | 
				
			||||||
 | 
					LINKFLAGS=/Twe /L$(WXDIR)\lib;$(BCCDIR)\lib
 | 
				
			||||||
 | 
					OPT = -O2
 | 
				
			||||||
 | 
					DEBUG_FLAGS=
 | 
				
			||||||
 | 
					!endif
 | 
				
			||||||
 | 
					CPPFLAGS=$(DEBUG_FLAGS) $(OPT) @$(CFG)
 | 
				
			||||||
 | 
					CFLAGS=$(DEBUG_FLAGS) $(OPT) @$(CFG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OBJECTS = basic.obj basic2.obj canvas.obj ogldiag.obj lines.obj misc.obj divided.obj constrnt.obj\
 | 
				
			||||||
 | 
					 composit.obj drawn.obj bitmap.obj mfutils.obj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all:    $(OGLLIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.$(SRCSUFF).obj:
 | 
				
			||||||
 | 
						bcc $(CPPFLAGS) $(INC) -c {$< }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OGLLIB):      $(OBJECTS)
 | 
				
			||||||
 | 
					        erase $(OGLLIB)
 | 
				
			||||||
 | 
					        tlib /P128 @&&!
 | 
				
			||||||
 | 
					$(OGLLIB) &
 | 
				
			||||||
 | 
					+$(OBJECTS:.obj =.obj +)
 | 
				
			||||||
 | 
					!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Making documents
 | 
				
			||||||
 | 
					docs:   hlp
 | 
				
			||||||
 | 
					hlp: $(DOCDIR)/ogl.hlp
 | 
				
			||||||
 | 
					hlp32: $(DOCDIR)/hlp32/ogl.hlp
 | 
				
			||||||
 | 
					rtf:    $(DOCDIR)/ogl.rtf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)/ogl.hlp:         $(DOCDIR)/ogl.rtf $(DOCDIR)/ogl.hpj
 | 
				
			||||||
 | 
					        cd $(DOCDIR)
 | 
				
			||||||
 | 
					        -erase ogl.ph
 | 
				
			||||||
 | 
					        hc ogl
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)/hlp32/ogl.hlp:         $(DOCDIR)/hlp32/ogl.rtf $(DOCDIR)/hlp32/ogl.hpj
 | 
				
			||||||
 | 
					        cd $(DOCDIR)/hlp32
 | 
				
			||||||
 | 
					        -erase ogl.ph
 | 
				
			||||||
 | 
					        start /w hcw /c /e ogl.hpj
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)/ogl.rtf:         $(DOCDIR)/classes.tex $(DOCDIR)/intro.tex $(DOCDIR)/ogl.tex
 | 
				
			||||||
 | 
					        cd $(DOCDIR)
 | 
				
			||||||
 | 
					        start /w tex2rtf $(DOCDIR)/ogl.tex $(DOCDIR)/ogl.rtf -twice -winhelp
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)/hlp32/ogl.rtf:         $(DOCDIR)/classes.tex $(DOCDIR)/intro.tex $(DOCDIR)/ogl.tex
 | 
				
			||||||
 | 
					        cd $(DOCDIR)
 | 
				
			||||||
 | 
					        start /w tex2rtf $(DOCDIR)/ogl.tex $(DOCDIR)/hlp32/ogl.rtf -twice -winhelp -macros $(DOCDIR)/t2rtf32.ini
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wordrtf: 
 | 
				
			||||||
 | 
					        cd $(DOCDIR)
 | 
				
			||||||
 | 
					        -wx /W tex2rtf $(DOCDIR)/ogl.tex $(DOCDIR)/ogl.rtf -twice -rtf
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean:
 | 
				
			||||||
 | 
					        -erase *.obj
 | 
				
			||||||
 | 
					        -erase *.exe
 | 
				
			||||||
 | 
					        -erase *.res
 | 
				
			||||||
 | 
							-erase ..\lib\*.lib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										161
									
								
								utils/ogl/src/makefile.dos
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,161 @@
 | 
				
			|||||||
 | 
					#
 | 
				
			||||||
 | 
					# File:		makefile.dos
 | 
				
			||||||
 | 
					# Author:	Julian Smart
 | 
				
			||||||
 | 
					# Created:	1993
 | 
				
			||||||
 | 
					# Updated:	
 | 
				
			||||||
 | 
					# Copyright:	(c) 1993, AIAI, University of Edinburgh
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# "%W% %G%"
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Makefile: Builds object graphics library (DOS).
 | 
				
			||||||
 | 
					# Use FINAL=1 argument to nmake to build final version with no debugging
 | 
				
			||||||
 | 
					# info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Set WXDIR for your system
 | 
				
			||||||
 | 
					WXDIR = $(WXWIN)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!include $(WXDIR)\src\makemsc.env
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OGLDIR = $(WXDIR)\utils\ogl
 | 
				
			||||||
 | 
					THISDIR = $(OGLDIR)\src
 | 
				
			||||||
 | 
					DOCDIR = $(OGLDIR)\docs
 | 
				
			||||||
 | 
					WXLIB = $(WXDIR)\lib\wx.lib
 | 
				
			||||||
 | 
					LIBS=$(WXLIB) libw llibcew commdlg shell ctl3dv2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GRAPHICSLIB = $(WXDIR)\lib\ogl.lib
 | 
				
			||||||
 | 
					INC = /I$(WXDIR)\include
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Normally set OPTIONS =
 | 
				
			||||||
 | 
					# to disable PROLOGIO-dependent code
 | 
				
			||||||
 | 
					OPTIONS = -DPROLOGIO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OBJECTS = basic.obj basic2.obj canvas.obj ogldiag.obj lines.obj misc.obj divided.obj constrnt.obj\
 | 
				
			||||||
 | 
					 composit.obj drawn.obj bitmap.obj mfutils.obj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all:    $(GRAPHICSLIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wx:
 | 
				
			||||||
 | 
					        cd $(WXDIR)\src\msw
 | 
				
			||||||
 | 
					        nmake -f makefile.dos $(WXLIB) FINAL=$(FINAL)
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(GRAPHICSLIB):      $(OBJECTS)
 | 
				
			||||||
 | 
					        erase $(GRAPHICSLIB)
 | 
				
			||||||
 | 
					        lib  /PAGESIZE:128 @<<
 | 
				
			||||||
 | 
					$(GRAPHICSLIB)
 | 
				
			||||||
 | 
					y
 | 
				
			||||||
 | 
					$(OBJECTS)
 | 
				
			||||||
 | 
					nul
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# NOTE: This causes a floating point stack error when optimized,
 | 
				
			||||||
 | 
					# so DON'T optimize!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basic.obj:      basic.$(SRCSUFF) basic.h lines.h misc.h canvas.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /Od /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basic2.obj:      basic2.$(SRCSUFF) basic.h lines.h misc.h canvas.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /Od /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					canvas.obj:      canvas.$(SRCSUFF) basic.h misc.h canvas.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ogldiag.obj:      ogldiag.$(SRCSUFF) ogldiag.h canvas.h basic.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					lines.obj:      lines.$(SRCSUFF) basic.h misc.h canvas.h lines.h basicp.h linesp.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					misc.obj:      misc.$(SRCSUFF) basic.h misc.h constrnt.h basicp.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					divided.obj:      divided.$(SRCSUFF) basic.h misc.h canvas.h divided.h basicp.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					constrnt.obj:     constrnt.$(SRCSUFF) basic.h constrnt.h 
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					composit.obj:      composit.$(SRCSUFF) basic.h misc.h canvas.h constrnt.h composit.h basicp.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					drawn.obj:      drawn.$(SRCSUFF) basic.h misc.h canvas.h drawn.h drawnp.h basicp.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bitmap.obj:      bitmap.$(SRCSUFF) basic.h misc.h canvas.h bitmap.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mfutils.obj:      mfutils.$(SRCSUFF) mfutils.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Making documents
 | 
				
			||||||
 | 
					docs:   hlp
 | 
				
			||||||
 | 
					hlp: $(DOCDIR)/ogl.hlp
 | 
				
			||||||
 | 
					hlp32: $(DOCDIR)/hlp32/ogl.hlp
 | 
				
			||||||
 | 
					rtf:    $(DOCDIR)/ogl.rtf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)/ogl.hlp:         $(DOCDIR)/ogl.rtf $(DOCDIR)/ogl.hpj
 | 
				
			||||||
 | 
					        cd $(DOCDIR)
 | 
				
			||||||
 | 
					        -erase ogl.ph
 | 
				
			||||||
 | 
					        hc ogl
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)/hlp32/ogl.hlp:         $(DOCDIR)/hlp32/ogl.rtf $(DOCDIR)/hlp32/ogl.hpj
 | 
				
			||||||
 | 
					        cd $(DOCDIR)/hlp32
 | 
				
			||||||
 | 
					        -erase ogl.ph
 | 
				
			||||||
 | 
					        start /w hcw /c /e ogl.hpj
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)/ogl.rtf:         $(DOCDIR)/classes.tex $(DOCDIR)/intro.tex $(DOCDIR)/ogl.tex
 | 
				
			||||||
 | 
					        cd $(DOCDIR)
 | 
				
			||||||
 | 
					        start /w tex2rtf $(DOCDIR)/ogl.tex $(DOCDIR)/ogl.rtf -twice -winhelp
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)/hlp32/ogl.rtf:         $(DOCDIR)/classes.tex $(DOCDIR)/intro.tex $(DOCDIR)/ogl.tex
 | 
				
			||||||
 | 
					        cd $(DOCDIR)
 | 
				
			||||||
 | 
					        start /w tex2rtf $(DOCDIR)/ogl.tex $(DOCDIR)/hlp32/ogl.rtf -twice -winhelp -macros $(DOCDIR)/t2rtf32.ini
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wordrtf: 
 | 
				
			||||||
 | 
					        cd $(DOCDIR)
 | 
				
			||||||
 | 
					        -wx /W tex2rtf $(DOCDIR)/ogl.tex $(DOCDIR)/ogl.rtf -twice -rtf
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean:
 | 
				
			||||||
 | 
					        -erase *.obj
 | 
				
			||||||
 | 
					        -erase *.sbr
 | 
				
			||||||
 | 
					        -erase *.exe
 | 
				
			||||||
 | 
					        -erase *.res
 | 
				
			||||||
 | 
					        -erase *.map
 | 
				
			||||||
 | 
					        -erase *.pdb
 | 
				
			||||||
 | 
					        -erase *.lib
 | 
				
			||||||
 | 
					        -erase ..\lib\*.lib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxclean:
 | 
				
			||||||
 | 
					        cd $(WXDIR)\src\msw
 | 
				
			||||||
 | 
					        nmake -f makefile.dos clean
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
							
								
								
									
										180
									
								
								utils/ogl/src/makefile.nt
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,180 @@
 | 
				
			|||||||
 | 
					#
 | 
				
			||||||
 | 
					# File:		makefile.nt
 | 
				
			||||||
 | 
					# Author:	Julian Smart
 | 
				
			||||||
 | 
					# Created:	1993
 | 
				
			||||||
 | 
					# Updated:	
 | 
				
			||||||
 | 
					# Copyright:	(c) 1993, AIAI, University of Edinburgh
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# "%W% %G%"
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Makefile : Builds OGL classes library (MS VC++).
 | 
				
			||||||
 | 
					# Use FINAL=1 argument to nmake to build final version with no debugging
 | 
				
			||||||
 | 
					# info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Set WXDIR for your system
 | 
				
			||||||
 | 
					WXDIR = $(WXWIN)
 | 
				
			||||||
 | 
					OBJECTSDIR = $(WXDIR)\utils\ogl
 | 
				
			||||||
 | 
					THISDIR = $(WXDIR)\utils\ogl\src
 | 
				
			||||||
 | 
					EXTRALIBS=$(WXDIR)\lib\ogl.lib $(WXDIR)\lib\mfutils.lib
 | 
				
			||||||
 | 
					EXTRAINC=/I$(WXDIR)\utils\mfutils\src /I$(WXDIR)\utils\prologio\src
 | 
				
			||||||
 | 
					EXTRAFLAGS=/DPROLOGIO=1
 | 
				
			||||||
 | 
					DOCDIR=$(WXDIR)\docs
 | 
				
			||||||
 | 
					LOCALDOCDIR=$(WXDIR)\utils\ogl\docs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!include $(WXDIR)\src\ntwxwin.mak
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PROGRAM=test
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					OBJECTS = basic.obj basic2.obj canvas.obj ogldiag.obj lines.obj misc.obj divided.obj constrnt.obj\
 | 
				
			||||||
 | 
					 composit.obj drawn.obj bitmap.obj mfutils.obj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LIBTARGET=$(WXDIR)\lib\ogl.lib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all:    $(LIBTARGET)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(PROGRAM):    $(PROGRAM).exe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wx:
 | 
				
			||||||
 | 
					        cd $(WXDIR)\src\msw
 | 
				
			||||||
 | 
					        nmake -f makefile.nt FINAL=$(FINAL)
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxclean:
 | 
				
			||||||
 | 
					        cd $(WXDIR)\src\msw
 | 
				
			||||||
 | 
					        nmake -f makefile.nt clean
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(LIBTARGET): $(OBJECTS)
 | 
				
			||||||
 | 
						-erase $(LIBTARGET)
 | 
				
			||||||
 | 
						$(implib) @<<
 | 
				
			||||||
 | 
					-out:$(LIBTARGET)
 | 
				
			||||||
 | 
					-machine:$(CPU)
 | 
				
			||||||
 | 
					$(OBJECTS)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# NOTE: This causes a floating point stack error when optimized,
 | 
				
			||||||
 | 
					# so DON'T optimize!
 | 
				
			||||||
 | 
					basic.obj:      basic.$(SRCSUFF) basic.h lines.h misc.h canvas.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /Od /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basic2.obj:      basic2.$(SRCSUFF) basic.h lines.h misc.h canvas.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /Od /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					canvas.obj:      canvas.$(SRCSUFF) basic.h misc.h canvas.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ogldiag.obj:      ogldiag.$(SRCSUFF) ogldiag.h canvas.h basic.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					lines.obj:      lines.$(SRCSUFF) basic.h misc.h canvas.h lines.h basicp.h linesp.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					misc.obj:      misc.$(SRCSUFF) basic.h misc.h constrnt.h basicp.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					divided.obj:      divided.$(SRCSUFF) basic.h misc.h canvas.h divided.h basicp.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					constrnt.obj:     constrnt.$(SRCSUFF) basic.h constrnt.h 
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					composit.obj:      composit.$(SRCSUFF) basic.h misc.h canvas.h constrnt.h composit.h basicp.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					drawn.obj:      drawn.$(SRCSUFF) basic.h misc.h canvas.h drawn.h drawnp.h basicp.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bitmap.obj:      bitmap.$(SRCSUFF) basic.h misc.h canvas.h bitmap.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mfutils.obj:      mfutils.$(SRCSUFF) mfutils.h
 | 
				
			||||||
 | 
					        cl @<<
 | 
				
			||||||
 | 
					$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 | 
				
			||||||
 | 
					<<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean:
 | 
				
			||||||
 | 
					        -erase *.obj
 | 
				
			||||||
 | 
					        -erase *.sbr
 | 
				
			||||||
 | 
					        -erase *.exe
 | 
				
			||||||
 | 
					        -erase *.res
 | 
				
			||||||
 | 
					        -erase *.map
 | 
				
			||||||
 | 
					        -erase *.pdb
 | 
				
			||||||
 | 
					        -erase $(LIBTARGET)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DOCSOURCES=$(LOCALDOCDIR)\ogl.tex \
 | 
				
			||||||
 | 
					 $(LOCALDOCDIR)\bugs.tex $(LOCALDOCDIR)\changes.tex\
 | 
				
			||||||
 | 
					 $(LOCALDOCDIR)\classes.tex $(LOCALDOCDIR)\intro.tex\
 | 
				
			||||||
 | 
					 $(LOCALDOCDIR)\topics.tex $(LOCALDOCDIR)\sample.tex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					html: $(DOCDIR)\html\ogl\ogl.htm
 | 
				
			||||||
 | 
					hlp: $(DOCDIR)\winhelp\ogl.hlp
 | 
				
			||||||
 | 
					pdfrtf: $(DOCDIR)\pdf\ogl.rtf
 | 
				
			||||||
 | 
					ps: $(DOCDIR)\ps\ogl.ps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)\winhelp\ogl.hlp:         $(LOCALDOCDIR)\ogl.rtf $(LOCALDOCDIR)\ogl.hpj
 | 
				
			||||||
 | 
					        cd $(LOCALDOCDIR)
 | 
				
			||||||
 | 
					        -erase ogl.ph
 | 
				
			||||||
 | 
					        hc ogl
 | 
				
			||||||
 | 
					        move ogl.hlp $(DOCDIR)\winhelp\ogl.hlp
 | 
				
			||||||
 | 
					        move ogl.cnt $(DOCDIR)\winhelp\ogl.cnt
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(LOCALDOCDIR)\ogl.rtf: $(DOCSOURCES)
 | 
				
			||||||
 | 
					        cd $(LOCALDOCDIR)
 | 
				
			||||||
 | 
					        -start /w tex2rtf $(LOCALDOCDIR)\ogl.tex $(LOCALDOCDIR)\ogl.rtf -twice -winhelp
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)\pdf\ogl.rtf: $(DOCSOURCES)
 | 
				
			||||||
 | 
					        cd $(LOCALDOCDIR)
 | 
				
			||||||
 | 
					        -copy *.bmp $(DOCDIR)\pdf
 | 
				
			||||||
 | 
					        -start /w tex2rtf $(LOCALDOCDIR)\ogl.tex $(DOCDIR)\pdf\ogl.rtf -twice -rtf
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DOCDIR)\html\ogl\ogl.htm:         $(DOCSOURCES)
 | 
				
			||||||
 | 
					        cd $(LOCALDOCDIR)
 | 
				
			||||||
 | 
					        -mkdir $(DOCDIR)\html\ogl
 | 
				
			||||||
 | 
					        cp *.gif $(DOCDIR)\html\ogl
 | 
				
			||||||
 | 
					        -start /w tex2rtf $(LOCALDOCDIR)\ogl.tex $(DOCDIR)\html\ogl\ogl.htm -twice -html
 | 
				
			||||||
 | 
					        -erase $(DOCDIR)\html\ogl\*.con
 | 
				
			||||||
 | 
					        -erase $(DOCDIR)\html\ogl\*.ref
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(LOCALDOCDIR)\ogl.dvi:	$(DOCSOURCES)
 | 
				
			||||||
 | 
						cd $(LOCALDOCDIR)
 | 
				
			||||||
 | 
					        -latex ogl
 | 
				
			||||||
 | 
					        -latex ogl
 | 
				
			||||||
 | 
					        -makeindx ogl
 | 
				
			||||||
 | 
					        -bibtex ogl
 | 
				
			||||||
 | 
					        -latex ogl
 | 
				
			||||||
 | 
					        -latex ogl
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(WXDIR)\docs\ps\ogl.ps:	$(LOCALDOCDIR)\ogl.dvi
 | 
				
			||||||
 | 
						cd $(LOCALDOCDIR)
 | 
				
			||||||
 | 
					        -dvips32 -o ogl.ps ogl
 | 
				
			||||||
 | 
					        move ogl.ps $(WXDIR)\docs\ps\ogl.ps
 | 
				
			||||||
 | 
					        cd $(THISDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										125
									
								
								utils/ogl/src/makefile.unx
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,125 @@
 | 
				
			|||||||
 | 
					#
 | 
				
			||||||
 | 
					# File:		makefile.unx
 | 
				
			||||||
 | 
					# Author:	Julian Smart
 | 
				
			||||||
 | 
					# Created:	1996
 | 
				
			||||||
 | 
					# Updated:	
 | 
				
			||||||
 | 
					# Copyright:	(c) 1996 Julian Smart
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# "%W% %G%"
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Makefile for object graphics library (UNIX).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WXDIR = ../../..
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# All common UNIX compiler flags and options are now in
 | 
				
			||||||
 | 
					# this central makefile.
 | 
				
			||||||
 | 
					include $(WXDIR)/src/make.env
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PRODIR = $(WXDIR)/utils/prologio
 | 
				
			||||||
 | 
					PROINC = $(PRODIR)/src
 | 
				
			||||||
 | 
					PROLIB = $(PRODIR)/lib/libproio$(GUISUFFIX).a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MFDIR = $(WXDIR)/utils/mfutils
 | 
				
			||||||
 | 
					MFINC = $(MFDIR)/src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OGLDIR = $(WXDIR)/utils/ogl
 | 
				
			||||||
 | 
					OGLLIB = $(OGLDIR)/lib/libogl$(GUISUFFIX).a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OBJECTS = $(OBJDIR)/basic.o $(OBJDIR)/basic2.o $(OBJDIR)/canvas.o $(OBJDIR)/lines.o $(OBJDIR)/misc.o\
 | 
				
			||||||
 | 
					  $(OBJDIR)/divided.o $(OBJDIR)/constrnt.o $(OBJDIR)/composit.o $(OBJDIR)/drawn.o\
 | 
				
			||||||
 | 
					  $(OBJDIR)/bitmap.o $(OBJDIR)/ogldiag.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CPPFLAGS =  -I$(PROINC) -I$(MFINC) $(XINCLUDE) $(INC) $(GUI) -DDEBUG='$(DEBUG)' $(DEBUGFLAGS) $(WARN) $(OPTIONS) -DPROLOGIO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all:	$(OBJDIR) $(OGLLIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.SUFFIXES:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wx:
 | 
				
			||||||
 | 
						cd $(WXDIR)/src/x; $(MAKE) -f makefile.unx OPT=$(OPT) GUI=$(GUI)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motif:
 | 
				
			||||||
 | 
						$(MAKE) -f makefile.unx GUI=-Dwx_motif OPT=$(OPT) GUISUFFIX=_motif LDLIBS='$(MOTIFLDLIBS)' XVIEW_LINK=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					xview:
 | 
				
			||||||
 | 
						$(MAKE) -f makefile.unx GUI=-Dwx_xview OPT=$(OPT) GUISUFFIX=_ol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hp:
 | 
				
			||||||
 | 
						$(MAKE) -f makefile.unx GUI=-Dwx_motif GUISUFFIX=_hp CC=CC DEBUG='$(DEBUG)' DEBUGFLAGS='-g' OPT='' WARN='-w' \
 | 
				
			||||||
 | 
					           XINCLUDE='$(HPXINCLUDE)' XLIB='$(HPXLIB)' XVIEW_LINK='' \
 | 
				
			||||||
 | 
					           LDLIBS='$(HPLDLIBS)'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OBJDIR):
 | 
				
			||||||
 | 
						mkdir $(OBJDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OGLLIB): $(OBJECTS)
 | 
				
			||||||
 | 
						rm -f $@
 | 
				
			||||||
 | 
						ar $(AROPTIONS) $@ $(OBJECTS)
 | 
				
			||||||
 | 
						$(RANLIB) $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OBJDIR)/basic.o:	basic.$(SRCSUFF) basic.h lines.h misc.h canvas.h
 | 
				
			||||||
 | 
						$(CC) -c $(CPPFLAGS) -o $@ basic.$(SRCSUFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OBJDIR)/basic2.o:	basic2.$(SRCSUFF) basic.h lines.h misc.h canvas.h
 | 
				
			||||||
 | 
						$(CC) -c $(CPPFLAGS) -o $@ basic2.$(SRCSUFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OBJDIR)/canvas.o:	canvas.$(SRCSUFF) basic.h misc.h canvas.h
 | 
				
			||||||
 | 
						$(CC) -c $(CPPFLAGS) -o $@ canvas.$(SRCSUFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OBJDIR)/lines.o:	lines.$(SRCSUFF) basic.h misc.h canvas.h lines.h
 | 
				
			||||||
 | 
						$(CC) -c $(CPPFLAGS) -o $@ lines.$(SRCSUFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OBJDIR)/misc.o: 	misc.$(SRCSUFF) basic.h misc.h constrnt.h
 | 
				
			||||||
 | 
						$(CC) -c $(CPPFLAGS) -o $@ misc.$(SRCSUFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OBJDIR)/divided.o: 	divided.$(SRCSUFF) basic.h misc.h canvas.h divided.h
 | 
				
			||||||
 | 
						$(CC) -c $(CPPFLAGS) -o $@ divided.$(SRCSUFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OBJDIR)/constrnt.o: 	constrnt.$(SRCSUFF) basic.h constrnt.h
 | 
				
			||||||
 | 
						$(CC) -c $(CPPFLAGS) -o $@ constrnt.$(SRCSUFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OBJDIR)/composit.o: 	composit.$(SRCSUFF) basic.h misc.h canvas.h constrnt.h composit.h
 | 
				
			||||||
 | 
						$(CC) -c $(CPPFLAGS) -o $@ composit.$(SRCSUFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OBJDIR)/drawn.o: 	drawn.$(SRCSUFF) basic.h misc.h canvas.h drawn.h drawnp.h
 | 
				
			||||||
 | 
						$(CC) -c $(CPPFLAGS) -o $@ drawn.$(SRCSUFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OBJDIR)/bitmap.o: 	bitmap.$(SRCSUFF) basic.h misc.h canvas.h bitmap.h
 | 
				
			||||||
 | 
						$(CC) -c $(CPPFLAGS) -o $@ bitmap.$(SRCSUFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OBJDIR)/ogldiag.o: 	ogldiag.$(SRCSUFF) basic.h misc.h canvas.h bitmap.h ogldiag.h
 | 
				
			||||||
 | 
						$(CC) -c $(CPPFLAGS) -o $@ ogldiag.$(SRCSUFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					HTMLDIR=/home/hardy/html/wx/manuals
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					docs:	ps xlp
 | 
				
			||||||
 | 
					ps:	$(OGLDIR)/docs/ogl.ps
 | 
				
			||||||
 | 
					xlp:	$(OGLDIR)/docs/ogl.xlp
 | 
				
			||||||
 | 
					html:	$(HTMLDIR)/ogl/ogl_contents.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OGLDIR)/docs/ogl.xlp:	$(OGLDIR)/docs/classes.tex $(OGLDIR)/docs/ogl.tex $(OGLDIR)/docs/topics.tex $(OGLDIR)/docs/changes.tex $(OGLDIR)/docs/intro.tex
 | 
				
			||||||
 | 
						cd ../docs; tex2rtf ogl.tex tmp.xlp -xlp -twice
 | 
				
			||||||
 | 
						sed -e "s/WXHELPCONTENTS/OGL Manual/g" < $(OGLDIR)/docs/tmp.xlp > $(OGLDIR)/docs/ogl.xlp
 | 
				
			||||||
 | 
						/bin/rm -f $(OGLDIR)/docs/tmp.xlp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(HTMLDIR)/ogl/ogl_contents.html:	$(OGLDIR)/docs/classes.tex $(OGLDIR)/docs/ogl.tex $(OGLDIR)/docs/topics.tex $(OGLDIR)/docs/changes.tex $(OGLDIR)/docs/intro.tex
 | 
				
			||||||
 | 
						cd ../docs; tex2rtf ogl.tex $(HTMLDIR)/ogl/ogl -twice -html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OGLDIR)/docs/ogl.dvi:	$(OGLDIR)/docs/ogl.tex $(OGLDIR)/docs/classes.tex $(OGLDIR)/docs/topics.tex $(OGLDIR)/docs/changes.tex $(OGLDIR)/docs/intro.tex
 | 
				
			||||||
 | 
						cd $(OGLDIR)/docs; latex ogl; latex ogl; makeindex ogl; latex ogl; \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OGLDIR)/docs/ogl.ps:	$(OGLDIR)/docs/ogl.dvi
 | 
				
			||||||
 | 
						cd $(OGLDIR)/docs; dvips -f -r < ogl.dvi > ogl.ps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cleaneach:
 | 
				
			||||||
 | 
						rm -f $(OBJECTS) $(OGLLIB) core
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean_motif:
 | 
				
			||||||
 | 
						$(MAKE) -f makefile.unx GUISUFFIX=_motif cleaneach 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean_ol:
 | 
				
			||||||
 | 
						$(MAKE) -f makefile.unx GUISUFFIX=_ol cleaneach 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean_hp:
 | 
				
			||||||
 | 
						$(MAKE) -f makefile.unx GUISUFFIX=_hp cleaneach 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										28
									
								
								utils/ogl/src/makefile.wat
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					# Objects makefile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WXDIR = ..\..\..
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!include $(WXDIR)\src\makewat.env
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EXTRACPPFLAGS=/DPROLOGIO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OBJECTSLIB = $(WXDIR)\utils\objects\lib\graphics.lib
 | 
				
			||||||
 | 
					THISDIR = $(WXDIR)\utils\objects\src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NAME = graphics
 | 
				
			||||||
 | 
					LNK = $(name).lnk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IFLAGS      = -i=$(WXINC) -i=$(WXBASEINC) -i=..\..\mfutils\src -i=..\..\prologio\src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OBJECTS =  basic.obj basic2.obj canvas.obj lines.obj misc.obj divided.obj constrnt.obj composit.obj drawn.obj bitmap.obj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all: $(OBJECTSLIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OBJECTSLIB): $(OBJECTS)
 | 
				
			||||||
 | 
						*wlib /b /c /n /P=256 $(OBJECTSLIB) $(OBJECTS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean:   .SYMBOLIC
 | 
				
			||||||
 | 
					    -erase *.obj *.bak *.err *.pch $(OBJECTSLIB) *.lbc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										1085
									
								
								utils/ogl/src/mfutils.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										211
									
								
								utils/ogl/src/mfutils.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,211 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        mfutils.h
 | 
				
			||||||
 | 
					// Purpose:     Metafile utilities: reading a placeable metafile independently
 | 
				
			||||||
 | 
					//              of Windows.
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _MFUTILS_H_
 | 
				
			||||||
 | 
					#define _MFUTILS_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "mfutils.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <wx/metafile.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __WXMSW__
 | 
				
			||||||
 | 
					#define GetRValue(rgb)	    ((unsigned char)(rgb))
 | 
				
			||||||
 | 
					#define GetGValue(rgb)      ((unsigned char)(((int)(rgb)) >> 8))
 | 
				
			||||||
 | 
					#define GetBValue(rgb)	    ((unsigned char)((rgb)>>16))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Metafile Functions */
 | 
				
			||||||
 | 
					/* Win32s/Borland need these macros, although META_SETBKCOLOR is defined */
 | 
				
			||||||
 | 
					#if !defined(META_SETBKCOLOR) || defined(WIN32)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define META_SETBKCOLOR		     0x0201
 | 
				
			||||||
 | 
					#define META_SETBKMODE		     0x0102
 | 
				
			||||||
 | 
					#define META_SETMAPMODE		     0x0103
 | 
				
			||||||
 | 
					#define META_SETROP2		     0x0104
 | 
				
			||||||
 | 
					#define META_SETRELABS		     0x0105
 | 
				
			||||||
 | 
					#define META_SETPOLYFILLMODE	     0x0106
 | 
				
			||||||
 | 
					#define META_SETSTRETCHBLTMODE	     0x0107
 | 
				
			||||||
 | 
					#define META_SETTEXTCHAREXTRA	     0x0108
 | 
				
			||||||
 | 
					#define META_SETTEXTCOLOR	     0x0209
 | 
				
			||||||
 | 
					#define META_SETTEXTJUSTIFICATION    0x020A
 | 
				
			||||||
 | 
					#define META_SETWINDOWORG	     0x020B
 | 
				
			||||||
 | 
					#define META_SETWINDOWEXT	     0x020C
 | 
				
			||||||
 | 
					#define META_SETVIEWPORTORG	     0x020D
 | 
				
			||||||
 | 
					#define META_SETVIEWPORTEXT	     0x020E
 | 
				
			||||||
 | 
					#define META_OFFSETWINDOWORG	     0x020F
 | 
				
			||||||
 | 
					#define META_SCALEWINDOWEXT	     0x0410
 | 
				
			||||||
 | 
					#define META_OFFSETVIEWPORTORG	     0x0211
 | 
				
			||||||
 | 
					#define META_SCALEVIEWPORTEXT	     0x0412
 | 
				
			||||||
 | 
					#define META_LINETO		     0x0213
 | 
				
			||||||
 | 
					#define META_MOVETO		     0x0214
 | 
				
			||||||
 | 
					#define META_EXCLUDECLIPRECT	     0x0415
 | 
				
			||||||
 | 
					#define META_INTERSECTCLIPRECT	     0x0416
 | 
				
			||||||
 | 
					#define META_ARC		     0x0817
 | 
				
			||||||
 | 
					#define META_ELLIPSE		     0x0418
 | 
				
			||||||
 | 
					#define META_FLOODFILL		     0x0419
 | 
				
			||||||
 | 
					#define META_PIE		     0x081A
 | 
				
			||||||
 | 
					#define META_RECTANGLE		     0x041B
 | 
				
			||||||
 | 
					#define META_ROUNDRECT		     0x061C
 | 
				
			||||||
 | 
					#define META_PATBLT		     0x061D
 | 
				
			||||||
 | 
					#define META_SAVEDC		     0x001E
 | 
				
			||||||
 | 
					#define META_SETPIXEL		     0x041F
 | 
				
			||||||
 | 
					#define META_OFFSETCLIPRGN	     0x0220
 | 
				
			||||||
 | 
					#define META_TEXTOUT		     0x0521
 | 
				
			||||||
 | 
					#define META_BITBLT		     0x0922
 | 
				
			||||||
 | 
					#define META_STRETCHBLT		     0x0B23
 | 
				
			||||||
 | 
					#define META_POLYGON		     0x0324
 | 
				
			||||||
 | 
					#define META_POLYLINE		     0x0325
 | 
				
			||||||
 | 
					#define META_ESCAPE		     0x0626
 | 
				
			||||||
 | 
					#define META_RESTOREDC		     0x0127
 | 
				
			||||||
 | 
					#define META_FILLREGION		     0x0228
 | 
				
			||||||
 | 
					#define META_FRAMEREGION	     0x0429
 | 
				
			||||||
 | 
					#define META_INVERTREGION	     0x012A
 | 
				
			||||||
 | 
					#define META_PAINTREGION	     0x012B
 | 
				
			||||||
 | 
					#define META_SELECTCLIPREGION	     0x012C
 | 
				
			||||||
 | 
					#define META_SELECTOBJECT	     0x012D
 | 
				
			||||||
 | 
					#define META_SETTEXTALIGN	     0x012E
 | 
				
			||||||
 | 
					#define META_DRAWTEXT		     0x062F
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	META_CHORD		     0x0830
 | 
				
			||||||
 | 
					#define	META_SETMAPPERFLAGS	     0x0231
 | 
				
			||||||
 | 
					#define	META_EXTTEXTOUT		     0x0a32
 | 
				
			||||||
 | 
					#define	META_SETDIBTODEV	     0x0d33
 | 
				
			||||||
 | 
					#define	META_SELECTPALETTE	     0x0234
 | 
				
			||||||
 | 
					#define	META_REALIZEPALETTE	     0x0035
 | 
				
			||||||
 | 
					#define	META_ANIMATEPALETTE	     0x0436
 | 
				
			||||||
 | 
					#define	META_SETPALENTRIES	     0x0037
 | 
				
			||||||
 | 
					#define	META_POLYPOLYGON	     0x0538
 | 
				
			||||||
 | 
					#define	META_RESIZEPALETTE	     0x0139
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	META_DIBBITBLT		     0x0940
 | 
				
			||||||
 | 
					#define	META_DIBSTRETCHBLT	     0x0b41
 | 
				
			||||||
 | 
					#define	META_DIBCREATEPATTERNBRUSH   0x0142
 | 
				
			||||||
 | 
					#define	META_STRETCHDIB		     0x0f43
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define META_EXTFLOODFILL	     0x0548
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define META_RESETDC		     0x014C
 | 
				
			||||||
 | 
					#define META_STARTDOC		     0x014D
 | 
				
			||||||
 | 
					#define META_STARTPAGE		     0x004F
 | 
				
			||||||
 | 
					#define META_ENDPAGE		     0x0050
 | 
				
			||||||
 | 
					#define META_ABORTDOC		     0x0052
 | 
				
			||||||
 | 
					#define META_ENDDOC		     0x005E
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	META_DELETEOBJECT	     0x01f0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	META_CREATEPALETTE	     0x00f7
 | 
				
			||||||
 | 
					#define META_CREATEBRUSH	     0x00F8
 | 
				
			||||||
 | 
					#define META_CREATEPATTERNBRUSH	     0x01F9
 | 
				
			||||||
 | 
					#define META_CREATEPENINDIRECT	     0x02FA
 | 
				
			||||||
 | 
					#define META_CREATEFONTINDIRECT	     0x02FB
 | 
				
			||||||
 | 
					#define META_CREATEBRUSHINDIRECT     0x02FC
 | 
				
			||||||
 | 
					#define META_CREATEBITMAPINDIRECT    0x02FD
 | 
				
			||||||
 | 
					#define META_CREATEBITMAP	     0x06FE
 | 
				
			||||||
 | 
					#define META_CREATEREGION	     0x06FF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Background Modes */
 | 
				
			||||||
 | 
					#define TRANSPARENT     1
 | 
				
			||||||
 | 
					#define OPAQUE          2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Pen Styles */
 | 
				
			||||||
 | 
					#define PS_SOLID	    0
 | 
				
			||||||
 | 
					#define PS_DASH             1
 | 
				
			||||||
 | 
					#define PS_DOT              2
 | 
				
			||||||
 | 
					#define PS_DASHDOT          3
 | 
				
			||||||
 | 
					#define PS_DASHDOTDOT       4
 | 
				
			||||||
 | 
					#define PS_NULL 	    5
 | 
				
			||||||
 | 
					#define PS_INSIDEFRAME 	    6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* PitchAndFamily family values (high 4 bits) */
 | 
				
			||||||
 | 
					/* Win32s/Borland don't need this */
 | 
				
			||||||
 | 
					#if !defined(__BORLANDC__) && !defined(WIN32)
 | 
				
			||||||
 | 
					#define FF_DONTCARE         0x00
 | 
				
			||||||
 | 
					#define FF_ROMAN            0x10
 | 
				
			||||||
 | 
					#define FF_SWISS            0x20
 | 
				
			||||||
 | 
					#define FF_MODERN           0x30
 | 
				
			||||||
 | 
					#define FF_SCRIPT           0x40
 | 
				
			||||||
 | 
					#define FF_DECORATIVE       0x50
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Brush Styles */
 | 
				
			||||||
 | 
					#define BS_SOLID	    0
 | 
				
			||||||
 | 
					#define BS_NULL		    1
 | 
				
			||||||
 | 
					#define BS_HOLLOW	    BS_NULL
 | 
				
			||||||
 | 
					#define BS_HATCHED	    2
 | 
				
			||||||
 | 
					#define BS_PATTERN	    3
 | 
				
			||||||
 | 
					#define BS_INDEXED	    4
 | 
				
			||||||
 | 
					#define	BS_DIBPATTERN	    5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Hatch Styles */
 | 
				
			||||||
 | 
					#define HS_HORIZONTAL       0
 | 
				
			||||||
 | 
					#define HS_VERTICAL         1
 | 
				
			||||||
 | 
					#define HS_FDIAGONAL        2
 | 
				
			||||||
 | 
					#define HS_BDIAGONAL        3
 | 
				
			||||||
 | 
					#define HS_CROSS            4
 | 
				
			||||||
 | 
					#define HS_DIAGCROSS        5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // metafile functions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxMetaRecord: public wxObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  public:
 | 
				
			||||||
 | 
					  int metaFunction;
 | 
				
			||||||
 | 
					  long param1;
 | 
				
			||||||
 | 
					  long param2;
 | 
				
			||||||
 | 
					  long param3;
 | 
				
			||||||
 | 
					  long param4;
 | 
				
			||||||
 | 
					  long param5;
 | 
				
			||||||
 | 
					  long param6;
 | 
				
			||||||
 | 
					  long param7;
 | 
				
			||||||
 | 
					  long param8;
 | 
				
			||||||
 | 
					  char *stringParam;
 | 
				
			||||||
 | 
					  wxRealPoint *points;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  wxMetaRecord(int fun)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    metaFunction = fun; points = NULL; stringParam = NULL;
 | 
				
			||||||
 | 
					    param1 = 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  ~wxMetaRecord(void);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxXMetaFile: public wxObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  float lastX;
 | 
				
			||||||
 | 
					  float lastY;
 | 
				
			||||||
 | 
					  bool ok;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float left;
 | 
				
			||||||
 | 
					  float top;
 | 
				
			||||||
 | 
					  float right;
 | 
				
			||||||
 | 
					  float bottom;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  wxList metaRecords;
 | 
				
			||||||
 | 
					  wxList gdiObjects; // List of wxMetaRecord objects created with Create...,
 | 
				
			||||||
 | 
					                     // referenced by position in list by SelectObject
 | 
				
			||||||
 | 
					  wxXMetaFile(char *file = NULL);
 | 
				
			||||||
 | 
					  ~wxXMetaFile(void);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // After this is called, the metafile cannot be used for anything
 | 
				
			||||||
 | 
					  // since it is now owned by the clipboard.
 | 
				
			||||||
 | 
					  bool SetClipboard(int width = 0, int height = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool Play(wxDC *dc);
 | 
				
			||||||
 | 
					  inline bool Ok(void) const { return ok; }
 | 
				
			||||||
 | 
					  bool ReadFile(char *file);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					 // _MFUTILS_H_
 | 
				
			||||||
							
								
								
									
										805
									
								
								utils/ogl/src/misc.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,805 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        misc.cpp
 | 
				
			||||||
 | 
					// Purpose:     Miscellaneous OGL support functions
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma implementation "misc.h"
 | 
				
			||||||
 | 
					#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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					#include <wx/wxexpr.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <wx/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if USE_IOSTREAMH
 | 
				
			||||||
 | 
					#include <iostream.h>
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#include <ctype.h>
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "basic.h"
 | 
				
			||||||
 | 
					#include "basicp.h"
 | 
				
			||||||
 | 
					#include "misc.h"
 | 
				
			||||||
 | 
					#include "constrnt.h"
 | 
				
			||||||
 | 
					#include "composit.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxFont *g_oglNormalFont;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxPen *black_pen;
 | 
				
			||||||
 | 
					wxPen *white_background_pen;
 | 
				
			||||||
 | 
					wxPen *transparent_pen;
 | 
				
			||||||
 | 
					wxBrush *white_background_brush;
 | 
				
			||||||
 | 
					wxPen *black_foreground_pen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char *GraphicsBuffer = NULL;
 | 
				
			||||||
 | 
					wxCursor *GraphicsBullseyeCursor = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxList wxObjectCopyMapping(wxKEY_INTEGER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxOGLInitialize()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  GraphicsBullseyeCursor = new wxCursor(wxCURSOR_BULLSEYE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  g_oglNormalFont = new wxFont(12, wxMODERN, wxNORMAL, wxNORMAL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  black_pen = new wxPen("BLACK", 1, wxSOLID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  white_background_pen = new wxPen("WHITE", 1, wxSOLID);
 | 
				
			||||||
 | 
					  transparent_pen = new wxPen("WHITE", 1, wxTRANSPARENT);
 | 
				
			||||||
 | 
					  white_background_brush = new wxBrush("WHITE", wxSOLID);
 | 
				
			||||||
 | 
					  black_foreground_pen = new wxPen("BLACK", 1, wxSOLID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  OGLInitializeConstraintTypes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Initialize big buffer used when writing images
 | 
				
			||||||
 | 
					  GraphicsBuffer = new char[3000];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!oglPopupDivisionMenu)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    oglPopupDivisionMenu = new wxMenu("", (wxFunction)oglGraphicsDivisionMenuProc);
 | 
				
			||||||
 | 
					    oglPopupDivisionMenu->Append(DIVISION_MENU_SPLIT_HORIZONTALLY, "Split horizontally");
 | 
				
			||||||
 | 
					    oglPopupDivisionMenu->Append(DIVISION_MENU_SPLIT_VERTICALLY, "Split vertically");
 | 
				
			||||||
 | 
					    oglPopupDivisionMenu->AppendSeparator();
 | 
				
			||||||
 | 
					    oglPopupDivisionMenu->Append(DIVISION_MENU_EDIT_LEFT_EDGE, "Edit left edge");
 | 
				
			||||||
 | 
					    oglPopupDivisionMenu->Append(DIVISION_MENU_EDIT_TOP_EDGE, "Edit top edge");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxOGLCleanUp()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (GraphicsBuffer)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    delete[] GraphicsBuffer;
 | 
				
			||||||
 | 
					    GraphicsBuffer = NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  GraphicsBuffer = NULL;
 | 
				
			||||||
 | 
					  if (oglPopupDivisionMenu)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    delete oglPopupDivisionMenu;
 | 
				
			||||||
 | 
					    oglPopupDivisionMenu = NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxFont *MatchFont(int point_size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxFont *font = wxTheFontList->FindOrCreateFont(point_size, wxSWISS, wxNORMAL, wxNORMAL);
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					  switch (point_size)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    case 4:
 | 
				
			||||||
 | 
					      font = swiss_font_4;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case 6:
 | 
				
			||||||
 | 
					      font = swiss_font_6;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case 8:
 | 
				
			||||||
 | 
					      font = swiss_font_8;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case 12:
 | 
				
			||||||
 | 
					      font = swiss_font_12;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case 14:
 | 
				
			||||||
 | 
					      font = swiss_font_14;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case 18:
 | 
				
			||||||
 | 
					      font = swiss_font_18;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case 24:
 | 
				
			||||||
 | 
					      font = swiss_font_24;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					    case 10:
 | 
				
			||||||
 | 
					      font = swiss_font_10;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  return font;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int FontSizeDialog(wxFrame *parent, int old_size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (old_size <= 0)
 | 
				
			||||||
 | 
					    old_size = 10;
 | 
				
			||||||
 | 
					  char buf[40];
 | 
				
			||||||
 | 
					  sprintf(buf, "%d", old_size);
 | 
				
			||||||
 | 
					  wxString ans = wxGetTextFromUser("Enter point size", "Font size", buf, parent);
 | 
				
			||||||
 | 
					  if (ans == "")
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int new_size = atoi(ans);
 | 
				
			||||||
 | 
					  if ((new_size <= 0) || (new_size > 40))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxMessageBox("Invalid point size!", "Error", wxOK);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return new_size;
 | 
				
			||||||
 | 
					/*    
 | 
				
			||||||
 | 
					  char *strings[8];
 | 
				
			||||||
 | 
					  strings[0] = "4";
 | 
				
			||||||
 | 
					  strings[1] = "6";
 | 
				
			||||||
 | 
					  strings[2] = "8";
 | 
				
			||||||
 | 
					  strings[3] = "10";
 | 
				
			||||||
 | 
					  strings[4] = "12";
 | 
				
			||||||
 | 
					  strings[5] = "14";
 | 
				
			||||||
 | 
					  strings[6] = "18";
 | 
				
			||||||
 | 
					  strings[7] = "24";
 | 
				
			||||||
 | 
					  char *ans = wxGetSingleChoice("Choose", "Choose a font size", 8, strings, parent);
 | 
				
			||||||
 | 
					  if (ans)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    int size;
 | 
				
			||||||
 | 
					    sscanf(ans, "%d", &size);
 | 
				
			||||||
 | 
					    return MatchFont(size);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else return NULL;
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Centre a list of strings in the given box. xOffset and yOffset are the
 | 
				
			||||||
 | 
					// the positions that these lines should be relative to, and this might be
 | 
				
			||||||
 | 
					// the same as m_xpos, m_ypos, but might be zero if formatting from left-justifying.
 | 
				
			||||||
 | 
					void CentreText(wxDC& dc, wxList *text_list,
 | 
				
			||||||
 | 
					                float m_xpos, float m_ypos, float width, float height,
 | 
				
			||||||
 | 
					                int formatMode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int n = text_list->Number();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!text_list || (n == 0))
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // First, get maximum dimensions of box enclosing text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float char_height = 0;
 | 
				
			||||||
 | 
					  float max_width = 0;
 | 
				
			||||||
 | 
					  float current_width = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Store text extents for speed
 | 
				
			||||||
 | 
					  float *widths = new float[n];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxNode *current = text_list->First();
 | 
				
			||||||
 | 
					  int i = 0;
 | 
				
			||||||
 | 
					  while (current)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShapeTextLine *line = (wxShapeTextLine *)current->Data();
 | 
				
			||||||
 | 
					    dc.GetTextExtent(line->GetText(), ¤t_width, &char_height);
 | 
				
			||||||
 | 
					    widths[i] = current_width;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (current_width > max_width)
 | 
				
			||||||
 | 
					      max_width = current_width;
 | 
				
			||||||
 | 
					    current = current->Next();
 | 
				
			||||||
 | 
					    i ++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float max_height = n*char_height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float xoffset, yoffset, xOffset, yOffset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (formatMode & FORMAT_CENTRE_VERT)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (max_height < height)
 | 
				
			||||||
 | 
					      yoffset = (float)(m_ypos - (height/2.0) + (height - max_height)/2.0);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      yoffset = (float)(m_ypos - (height/2.0));
 | 
				
			||||||
 | 
					    yOffset = m_ypos;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    yoffset = 0.0;
 | 
				
			||||||
 | 
					    yOffset = 0.0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (formatMode & FORMAT_CENTRE_HORIZ)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    xoffset = (float)(m_xpos - width/2.0);
 | 
				
			||||||
 | 
					    xOffset = m_xpos;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    xoffset = 0.0;
 | 
				
			||||||
 | 
					    xOffset = 0.0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  current = text_list->First();
 | 
				
			||||||
 | 
					  i = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (current)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShapeTextLine *line = (wxShapeTextLine *)current->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float x;
 | 
				
			||||||
 | 
					    if ((formatMode & FORMAT_CENTRE_HORIZ) && (widths[i] < width))
 | 
				
			||||||
 | 
					      x = (float)((width - widths[i])/2.0 + xoffset);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      x = xoffset;
 | 
				
			||||||
 | 
					    float y = (float)(i*char_height + yoffset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    line->SetX( x - xOffset ); line->SetY( y - yOffset );
 | 
				
			||||||
 | 
					    current = current->Next();
 | 
				
			||||||
 | 
					    i ++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  delete widths;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Centre a list of strings in the given box
 | 
				
			||||||
 | 
					void CentreTextNoClipping(wxDC& dc, wxList *text_list,
 | 
				
			||||||
 | 
					                              float m_xpos, float m_ypos, float width, float height)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int n = text_list->Number();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!text_list || (n == 0))
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // First, get maximum dimensions of box enclosing text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float char_height = 0;
 | 
				
			||||||
 | 
					  float max_width = 0;
 | 
				
			||||||
 | 
					  float current_width = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Store text extents for speed
 | 
				
			||||||
 | 
					  float *widths = new float[n];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxNode *current = text_list->First();
 | 
				
			||||||
 | 
					  int i = 0;
 | 
				
			||||||
 | 
					  while (current)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShapeTextLine *line = (wxShapeTextLine *)current->Data();
 | 
				
			||||||
 | 
					    dc.GetTextExtent(line->GetText(), ¤t_width, &char_height);
 | 
				
			||||||
 | 
					    widths[i] = current_width;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (current_width > max_width)
 | 
				
			||||||
 | 
					      max_width = current_width;
 | 
				
			||||||
 | 
					    current = current->Next();
 | 
				
			||||||
 | 
					    i ++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float max_height = n*char_height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float yoffset = (float)(m_ypos - (height/2.0) + (height - max_height)/2.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float xoffset = (float)(m_xpos - width/2.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  current = text_list->First();
 | 
				
			||||||
 | 
					  i = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (current)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShapeTextLine *line = (wxShapeTextLine *)current->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float x = (float)((width - widths[i])/2.0 + xoffset);
 | 
				
			||||||
 | 
					    float y = (float)(i*char_height + yoffset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    line->SetX( x - m_xpos ); line->SetY( y - m_ypos );
 | 
				
			||||||
 | 
					    current = current->Next();
 | 
				
			||||||
 | 
					    i ++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  delete widths;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void GetCentredTextExtent(wxDC& dc, wxList *text_list,
 | 
				
			||||||
 | 
					                              float m_xpos, float m_ypos, float width, float height,
 | 
				
			||||||
 | 
					                              float *actual_width, float *actual_height)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int n = text_list->Number();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!text_list || (n == 0))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    *actual_width = 0;
 | 
				
			||||||
 | 
					    *actual_height = 0;
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // First, get maximum dimensions of box enclosing text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float char_height = 0;
 | 
				
			||||||
 | 
					  float max_width = 0;
 | 
				
			||||||
 | 
					  float current_width = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxNode *current = text_list->First();
 | 
				
			||||||
 | 
					  int i = 0;
 | 
				
			||||||
 | 
					  while (current)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShapeTextLine *line = (wxShapeTextLine *)current->Data();
 | 
				
			||||||
 | 
					    dc.GetTextExtent(line->GetText(), ¤t_width, &char_height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (current_width > max_width)
 | 
				
			||||||
 | 
					      max_width = current_width;
 | 
				
			||||||
 | 
					    current = current->Next();
 | 
				
			||||||
 | 
					    i ++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  *actual_height = n*char_height;
 | 
				
			||||||
 | 
					  *actual_width = max_width;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Format a string to a list of strings that fit in the given box.
 | 
				
			||||||
 | 
					// Interpret %n and 10 or 13 as a new line.
 | 
				
			||||||
 | 
					wxList *FormatText(wxDC& dc, const wxString& text, float width, float height, int formatMode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  // First, parse the string into a list of words
 | 
				
			||||||
 | 
					  wxList word_list;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Make new lines into NULL strings at this point
 | 
				
			||||||
 | 
					  int i = 0; int j = 0; int len = strlen(text);
 | 
				
			||||||
 | 
					  char word[200]; word[0] = 0;
 | 
				
			||||||
 | 
					  bool end_word = FALSE; bool new_line = FALSE;
 | 
				
			||||||
 | 
					  while (i < len)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    switch (text[i])
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      case '%':
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        i ++;
 | 
				
			||||||
 | 
					        if (i == len)
 | 
				
			||||||
 | 
					        { word[j] = '%'; j ++; }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          if (text[i] == 'n')
 | 
				
			||||||
 | 
					          { new_line = TRUE; end_word = TRUE; i++; }
 | 
				
			||||||
 | 
					          else
 | 
				
			||||||
 | 
					          { word[j] = '%'; j ++; word[j] = text[i]; j ++; i ++; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      case 10:
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        new_line = TRUE; end_word = TRUE; i++;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      case 13:
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        new_line = TRUE; end_word = TRUE; i++;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      case ' ':
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        end_word = TRUE;
 | 
				
			||||||
 | 
					        i ++;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        word[j] = text[i];
 | 
				
			||||||
 | 
					        j ++; i ++;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (i == len) end_word = TRUE;
 | 
				
			||||||
 | 
					    if (end_word)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      word[j] = 0;
 | 
				
			||||||
 | 
					      j = 0;
 | 
				
			||||||
 | 
					      word_list.Append((wxObject *)copystring(word));
 | 
				
			||||||
 | 
					      end_word = FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (new_line)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      word_list.Append((wxObject *)NULL);
 | 
				
			||||||
 | 
					      new_line = FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  // Now, make a list of strings which can fit in the box
 | 
				
			||||||
 | 
					  wxList *string_list = new wxList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  char buffer[400];
 | 
				
			||||||
 | 
					  buffer[0] = 0;
 | 
				
			||||||
 | 
					  wxNode *node = word_list.First();
 | 
				
			||||||
 | 
					  float x, y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    char *keep_string = copystring(buffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    char *s = (char *)node->Data();
 | 
				
			||||||
 | 
					    if (!s)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      // FORCE NEW LINE
 | 
				
			||||||
 | 
					      if (strlen(keep_string) > 0)
 | 
				
			||||||
 | 
					        string_list->Append((wxObject *)keep_string);
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        delete[] keep_string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      buffer[0] = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (buffer[0] != 0)
 | 
				
			||||||
 | 
					        strcat(buffer, " ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      strcat(buffer, s);
 | 
				
			||||||
 | 
					      dc.GetTextExtent(buffer, &x, &y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Don't fit within the bounding box if we're fitting shape to contents
 | 
				
			||||||
 | 
					      if ((x > width) && !(formatMode & FORMAT_SIZE_TO_CONTENTS))
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        // Deal with first word being wider than box
 | 
				
			||||||
 | 
					        if (strlen(keep_string) > 0)
 | 
				
			||||||
 | 
					          string_list->Append((wxObject *)keep_string);
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          delete[] keep_string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        buffer[0] = 0;
 | 
				
			||||||
 | 
					        strcat(buffer, s);
 | 
				
			||||||
 | 
					        delete[] s;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        delete[] keep_string;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    node = node->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (buffer[0] != 0)
 | 
				
			||||||
 | 
					    string_list->Append((wxObject *)copystring(buffer));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return string_list;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void DrawFormattedText(wxDC& dc, wxList *text_list,
 | 
				
			||||||
 | 
					                       float m_xpos, float m_ypos, float width, float height,
 | 
				
			||||||
 | 
					                       int formatMode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float xoffset, yoffset;
 | 
				
			||||||
 | 
					  if (formatMode & FORMAT_CENTRE_HORIZ)
 | 
				
			||||||
 | 
					    xoffset = m_xpos;
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    xoffset = (float)(m_xpos - (width / 2.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (formatMode & FORMAT_CENTRE_VERT)
 | 
				
			||||||
 | 
					    yoffset = m_ypos;
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    yoffset = (float)(m_ypos - (height / 2.0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  dc.SetClippingRegion(
 | 
				
			||||||
 | 
					                    (float)(m_xpos - width/2.0), (float)(m_ypos - height/2.0),
 | 
				
			||||||
 | 
					                    (float)width, (float)height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxNode *current = text_list->First();
 | 
				
			||||||
 | 
					  while (current)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShapeTextLine *line = (wxShapeTextLine *)current->Data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dc.DrawText(line->GetText(), xoffset + line->GetX(), yoffset + line->GetY());
 | 
				
			||||||
 | 
					    current = current->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  dc.DestroyClippingRegion();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Find centroid given list of points comprising polyline
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void find_polyline_centroid(wxList *points, float *x, float *y)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float xcount = 0;
 | 
				
			||||||
 | 
					  float ycount = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxNode *node = points->First();
 | 
				
			||||||
 | 
					  while (node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxRealPoint *point = (wxRealPoint *)node->Data();
 | 
				
			||||||
 | 
					    xcount += point->x;
 | 
				
			||||||
 | 
					    ycount += point->y;
 | 
				
			||||||
 | 
					    node = node->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  *x = (xcount/points->Number());
 | 
				
			||||||
 | 
					  *y = (ycount/points->Number());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Check that (x1, y1) -> (x2, y2) hits (x3, y3) -> (x4, y4).
 | 
				
			||||||
 | 
					 * If so, ratio1 gives the proportion along the first line
 | 
				
			||||||
 | 
					 * that the intersection occurs (or something like that).
 | 
				
			||||||
 | 
					 * Used by functions below.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void check_line_intersection(float x1, float y1, float x2, float y2, 
 | 
				
			||||||
 | 
					                             float x3, float y3, float x4, float y4,
 | 
				
			||||||
 | 
					                             float *ratio1, float *ratio2)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float denominator_term = (y4 - y3)*(x2 - x1) - (y2 - y1)*(x4 - x3);
 | 
				
			||||||
 | 
					  float numerator_term = (x3 - x1)*(y4 - y3) + (x4 - x3)*(y1 - y3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float line_constant;
 | 
				
			||||||
 | 
					  float length_ratio = 1.0;
 | 
				
			||||||
 | 
					  float k_line = 1.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Check for parallel lines
 | 
				
			||||||
 | 
					  if ((denominator_term < 0.005) && (denominator_term > -0.005))
 | 
				
			||||||
 | 
					    line_constant = -1.0;
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    line_constant = numerator_term/denominator_term;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Check for intersection
 | 
				
			||||||
 | 
					  if ((line_constant < 1.0) && (line_constant > 0.0))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // Now must check that other line hits 
 | 
				
			||||||
 | 
					    if (((y4 - y3) < 0.005) && ((y4 - y3) > -0.005))
 | 
				
			||||||
 | 
					      k_line = ((x1 - x3) + line_constant*(x2 - x1))/(x4 - x3);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      k_line = ((y1 - y3) + line_constant*(y2 - y1))/(y4 - y3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ((k_line >= 0.0) && (k_line < 1.0))
 | 
				
			||||||
 | 
					      length_ratio = line_constant;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      k_line = 1.0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  *ratio1 = length_ratio;
 | 
				
			||||||
 | 
					  *ratio2 = k_line;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Find where (x1, y1) -> (x2, y2) hits one of the lines in xvec, yvec.
 | 
				
			||||||
 | 
					 * (*x3, *y3) is the point where it hits.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void find_end_for_polyline(float n, float xvec[], float yvec[], 
 | 
				
			||||||
 | 
					                           float x1, float y1, float x2, float y2, float *x3, float *y3)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int i;
 | 
				
			||||||
 | 
					  float lastx = xvec[0];
 | 
				
			||||||
 | 
					  float lasty = yvec[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float min_ratio = 1.0;
 | 
				
			||||||
 | 
					  float line_ratio;
 | 
				
			||||||
 | 
					  float other_ratio;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (i = 1; i < n; i++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    check_line_intersection(x1, y1, x2, y2, lastx, lasty, xvec[i], yvec[i],
 | 
				
			||||||
 | 
					                            &line_ratio, &other_ratio);
 | 
				
			||||||
 | 
					    lastx = xvec[i];
 | 
				
			||||||
 | 
					    lasty = yvec[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (line_ratio < min_ratio)
 | 
				
			||||||
 | 
					      min_ratio = line_ratio;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Do last (implicit) line if last and first floats are not identical
 | 
				
			||||||
 | 
					  if (!(xvec[0] == lastx && yvec[0] == lasty))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    check_line_intersection(x1, y1, x2, y2, lastx, lasty, xvec[0], yvec[0],
 | 
				
			||||||
 | 
					                            &line_ratio, &other_ratio);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (line_ratio < min_ratio)
 | 
				
			||||||
 | 
					      min_ratio = line_ratio;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  *x3 = (x1 + (x2 - x1)*min_ratio);
 | 
				
			||||||
 | 
					  *y3 = (y1 + (y2 - y1)*min_ratio);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Find where the line hits the box.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void find_end_for_box(float width, float height, 
 | 
				
			||||||
 | 
					                      float x1, float y1,         // Centre of box (possibly)
 | 
				
			||||||
 | 
					                      float x2, float y2,         // other end of line
 | 
				
			||||||
 | 
					                      float *x3, float *y3)       // End on box edge
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float xvec[5];
 | 
				
			||||||
 | 
					  float yvec[5];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  xvec[0] = (float)(x1 - width/2.0);
 | 
				
			||||||
 | 
					  yvec[0] = (float)(y1 - height/2.0);
 | 
				
			||||||
 | 
					  xvec[1] = (float)(x1 - width/2.0);
 | 
				
			||||||
 | 
					  yvec[1] = (float)(y1 + height/2.0);
 | 
				
			||||||
 | 
					  xvec[2] = (float)(x1 + width/2.0);
 | 
				
			||||||
 | 
					  yvec[2] = (float)(y1 + height/2.0);
 | 
				
			||||||
 | 
					  xvec[3] = (float)(x1 + width/2.0);
 | 
				
			||||||
 | 
					  yvec[3] = (float)(y1 - height/2.0);
 | 
				
			||||||
 | 
					  xvec[4] = (float)(x1 - width/2.0);
 | 
				
			||||||
 | 
					  yvec[4] = (float)(y1 - height/2.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  find_end_for_polyline(5, xvec, yvec, x2, y2, x1, y1, x3, y3);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Find where the line hits the circle.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void find_end_for_circle(float radius, 
 | 
				
			||||||
 | 
					                         float x1, float y1,  // Centre of circle
 | 
				
			||||||
 | 
					                         float x2, float y2,  // Other end of line
 | 
				
			||||||
 | 
					                         float *x3, float *y3)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float H = (float)sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (H == 0.0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    *x3 = x1;
 | 
				
			||||||
 | 
					    *y3 = y1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					   *y3 = radius * (y2 - y1)/H + y1;
 | 
				
			||||||
 | 
					   *x3 = radius * (x2 - x1)/H + x1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Given the line (x1, y1) -> (x2, y2), and an arrow size of given length and width,
 | 
				
			||||||
 | 
					 * return the position of the tip of the arrow and the left and right vertices of the arrow.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void get_arrow_points(float x1, float y1, float x2, float y2,
 | 
				
			||||||
 | 
					                      float length, float width,
 | 
				
			||||||
 | 
					                      float *tip_x, float *tip_y,
 | 
				
			||||||
 | 
					                      float *side1_x, float *side1_y,
 | 
				
			||||||
 | 
					                      float *side2_x, float *side2_y)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float l = (float)sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (l < 0.01)
 | 
				
			||||||
 | 
					    l = (float) 0.01;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float i_bar = (x2 - x1)/l;
 | 
				
			||||||
 | 
					  float j_bar = (y2 - y1)/l;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float x3 = (- length*i_bar) + x2;
 | 
				
			||||||
 | 
					  float y3 = (- length*j_bar) + y2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  *side1_x = width*(-j_bar) + x3;
 | 
				
			||||||
 | 
					  *side1_y = width*i_bar + y3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  *side2_x = -width*(-j_bar) + x3;
 | 
				
			||||||
 | 
					  *side2_y = -width*i_bar + y3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  *tip_x = x2; *tip_y = y2;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Given an ellipse and endpoints of a line, returns the point at which
 | 
				
			||||||
 | 
					 * the line touches the ellipse in values x4, y4.
 | 
				
			||||||
 | 
					 * This function assumes that the centre of the ellipse is at x1, y1, and the
 | 
				
			||||||
 | 
					 * ellipse has a width of width1 and a height of height1. It also assumes you are
 | 
				
			||||||
 | 
					 * wanting to draw an arc FROM point x2, y2 TOWARDS point x3, y3.
 | 
				
			||||||
 | 
					 * This function calculates the x,y coordinates of the intersection point of 
 | 
				
			||||||
 | 
					 * the arc with the ellipse.
 | 
				
			||||||
 | 
					 * Author: Ian Harrison
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void draw_arc_to_ellipse(float x1, float y1, float width1, float height1, float x2, float y2, float x3, float y3,
 | 
				
			||||||
 | 
					  float *x4, float *y4)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  float a1 = (float)(width1/2.0);
 | 
				
			||||||
 | 
					  float b1 = (float)(height1/2.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // These are required to give top left x and y coordinates for DrawEllipse
 | 
				
			||||||
 | 
					//  float top_left_x1 = (float)(x1 - a1);
 | 
				
			||||||
 | 
					//  float top_left_y1 = (float)(y1 - b1);
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					  // Check for vertical line
 | 
				
			||||||
 | 
					  if (fabs(x2 - x3) < 0.05)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    *x4 = x3;
 | 
				
			||||||
 | 
					    if (y2 < y3)
 | 
				
			||||||
 | 
					      *y4 = (float)(y1 - b1);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      *y4 = (float)(y1 + b1);
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					*/  
 | 
				
			||||||
 | 
					  // Check that x2 != x3
 | 
				
			||||||
 | 
					  if (fabs(x2 - x3) < 0.05)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    *x4 = x2;
 | 
				
			||||||
 | 
					    if (y3 > y2)
 | 
				
			||||||
 | 
					      *y4 = (float)(y1 - sqrt((b1*b1 - (((x2-x1)*(x2-x1))*(b1*b1)/(a1*a1)))));
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      *y4 = (float)(y1 + sqrt((b1*b1 - (((x2-x1)*(x2-x1))*(b1*b1)/(a1*a1)))));
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Calculate the x and y coordinates of the point where arc intersects ellipse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float A, B, C, D, E, F, G, H, K;
 | 
				
			||||||
 | 
					  float ellipse1_x, ellipse1_y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  A = (float)(1/(a1 * a1));
 | 
				
			||||||
 | 
					  B = (float)((y3 - y2) * (y3 - y2)) / ((x3 - x2) * (x3 - x2) * b1 * b1);
 | 
				
			||||||
 | 
					  C = (float)(2 * (y3 - y2) * (y2 - y1)) / ((x3 - x2) * b1 * b1);
 | 
				
			||||||
 | 
					  D = (float)((y2 - y1) * (y2 - y1)) / (b1 * b1);
 | 
				
			||||||
 | 
					  E = (float)(A + B);
 | 
				
			||||||
 | 
					  F = (float)(C - (2 * A * x1) - (2 * B * x2));
 | 
				
			||||||
 | 
					  G = (float)((A * x1 * x1) + (B * x2 * x2) - (C * x2) + D - 1);
 | 
				
			||||||
 | 
					  H = (float)((y3 - y2) / (x3 - x2));
 | 
				
			||||||
 | 
					  K = (float)((F * F) - (4 * E * G));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (K >= 0)
 | 
				
			||||||
 | 
					  // In this case the line intersects the ellipse, so calculate intersection
 | 
				
			||||||
 | 
					  { 
 | 
				
			||||||
 | 
					    if(x2 >= x1)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      ellipse1_x = (float)(((F * -1) + sqrt(K)) / (2 * E));
 | 
				
			||||||
 | 
					      ellipse1_y = (float)((H * (ellipse1_x - x2)) + y2);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      ellipse1_x = (float)(((F * -1) -  sqrt(K)) / (2 * E));
 | 
				
			||||||
 | 
					      ellipse1_y = (float)((H * (ellipse1_x - x2)) + y2);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  // in this case, arc does not intersect ellipse, so just draw arc
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    ellipse1_x = x3;
 | 
				
			||||||
 | 
					    ellipse1_y = y3;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  *x4 = ellipse1_x;
 | 
				
			||||||
 | 
					  *y4 = ellipse1_y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*	    
 | 
				
			||||||
 | 
					  // Draw a little circle (radius = 2) at the end of the arc where it hits
 | 
				
			||||||
 | 
					  // the ellipse .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float circle_x = ellipse1_x - 2.0;
 | 
				
			||||||
 | 
					  float circle_y = ellipse1_y - 2.0;
 | 
				
			||||||
 | 
					  m_canvas->DrawEllipse(circle_x, circle_y, 4.0, 4.0);
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Update a list item from a list of strings
 | 
				
			||||||
 | 
					void UpdateListBox(wxListBox *item, wxList *list)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  item->Clear();
 | 
				
			||||||
 | 
					  if (!list)
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxNode *node = list->First();
 | 
				
			||||||
 | 
					  while (node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    char *s = (char *)node->Data();
 | 
				
			||||||
 | 
					    item->Append(s);
 | 
				
			||||||
 | 
					    node = node->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										107
									
								
								utils/ogl/src/misc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,107 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        misc.h
 | 
				
			||||||
 | 
					// Purpose:     Miscellaneous utilities for OGL
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_MISC_H_
 | 
				
			||||||
 | 
					#define _OGL_MISC_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "misc.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// List to use when copying objects; may need to associate elements of new objects
 | 
				
			||||||
 | 
					// with elements of old objects, e.g. when copying constraint.s
 | 
				
			||||||
 | 
					extern wxList wxObjectCopyMapping;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * TEXT FORMATTING FUNCTIONS
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Centres the given list of wxShapeTextLine strings in the given box
 | 
				
			||||||
 | 
					// (changing the positions in situ). Doesn't actually draw into the DC.
 | 
				
			||||||
 | 
					void CentreText(wxDC& dc, wxList *text, float m_xpos, float m_ypos,
 | 
				
			||||||
 | 
					                float width, float height,
 | 
				
			||||||
 | 
					                int formatMode = FORMAT_CENTRE_HORIZ | FORMAT_CENTRE_VERT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Given a string, returns a list of strings that fit within the given
 | 
				
			||||||
 | 
					// width of box. Height is ignored.
 | 
				
			||||||
 | 
					wxList *FormatText(wxDC& dc, const wxString& text, float width, float height, int formatMode = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Centres the list of wxShapeTextLine strings, doesn't clip.
 | 
				
			||||||
 | 
					// Doesn't actually draw into the DC.
 | 
				
			||||||
 | 
					void CentreTextNoClipping(wxDC& dc, wxList *text_list,
 | 
				
			||||||
 | 
					                              float m_xpos, float m_ypos, float width, float height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Gets the maximum width and height of the given list of wxShapeTextLines.
 | 
				
			||||||
 | 
					void GetCentredTextExtent(wxDC& dc, wxList *text_list,
 | 
				
			||||||
 | 
					                              float m_xpos, float m_ypos, float width, float height,
 | 
				
			||||||
 | 
					                              float *actual_width, float *actual_height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Actually draw the preformatted list of wxShapeTextLines.
 | 
				
			||||||
 | 
					void DrawFormattedText(wxDC& context, wxList *text_list,
 | 
				
			||||||
 | 
					                       float m_xpos, float m_ypos, float width, float height,
 | 
				
			||||||
 | 
					                       int formatMode = FORMAT_CENTRE_HORIZ | FORMAT_CENTRE_VERT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Give it a list of points, finds the centre.
 | 
				
			||||||
 | 
					void find_polyline_centroid(wxList *points, float *x, float *y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void check_line_intersection(float x1, float y1, float x2, float y2, 
 | 
				
			||||||
 | 
					                             float x3, float y3, float x4, float y4,
 | 
				
			||||||
 | 
					                             float *ratio1, float *ratio2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void find_end_for_polyline(float n, float xvec[], float yvec[], 
 | 
				
			||||||
 | 
					                           float x1, float y1, float x2, float y2, float *x3, float *y3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void find_end_for_box(float width, float height, 
 | 
				
			||||||
 | 
					                      float x1, float y1,         // Centre of box (possibly)
 | 
				
			||||||
 | 
					                      float x2, float y2,         // other end of line
 | 
				
			||||||
 | 
					                      float *x3, float *y3);      // End on box edge
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void find_end_for_circle(float radius, 
 | 
				
			||||||
 | 
					                         float x1, float y1,  // Centre of circle
 | 
				
			||||||
 | 
					                         float x2, float y2,  // Other end of line
 | 
				
			||||||
 | 
					                         float *x3, float *y3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void get_arrow_points(float x1, float y1, float x2, float y2,
 | 
				
			||||||
 | 
					                      float length, float width,
 | 
				
			||||||
 | 
					                      float *tip_x, float *tip_y,
 | 
				
			||||||
 | 
					                      float *side1_x, float *side1_y,
 | 
				
			||||||
 | 
					                      float *side2_x, float *side2_y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Given an ellipse and endpoints of a line, returns the point at which
 | 
				
			||||||
 | 
					 * the line touches the ellipse in values x4, y4.
 | 
				
			||||||
 | 
					 * This function assumes that the centre of the ellipse is at x1, y1, and the
 | 
				
			||||||
 | 
					 * ellipse has a width of a1 and a height of b1. It also assumes you are
 | 
				
			||||||
 | 
					 * wanting to draw an arc FROM point x2, y2 TOWARDS point x3, y3.
 | 
				
			||||||
 | 
					 * This function calculates the x,y coordinates of the intersection point of 
 | 
				
			||||||
 | 
					 * the arc with the ellipse.
 | 
				
			||||||
 | 
					 * Author: Ian Harrison
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void draw_arc_to_ellipse(float x1, float y1, float a1, float b1, float x2, float y2, float x3, float y3,
 | 
				
			||||||
 | 
					  float *x4, float *y4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern wxFont *g_oglNormalFont;
 | 
				
			||||||
 | 
					extern wxPen *black_pen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern wxPen *white_background_pen;
 | 
				
			||||||
 | 
					extern wxPen *transparent_pen;
 | 
				
			||||||
 | 
					extern wxBrush *white_background_brush;
 | 
				
			||||||
 | 
					extern wxPen *black_foreground_pen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern wxCursor *GraphicsBullseyeCursor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern wxFont *MatchFont(int point_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					 // _OGL_MISC_H_
 | 
				
			||||||
							
								
								
									
										26
									
								
								utils/ogl/src/ogl.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        ogl.h
 | 
				
			||||||
 | 
					// Purpose:     OGL main include
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_OGL_H_
 | 
				
			||||||
 | 
					#define _OGL_OGL_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "basic.h"      // Basic shapes
 | 
				
			||||||
 | 
					#include "lines.h"      // Lines and splines
 | 
				
			||||||
 | 
					#include "divided.h"    // Vertically-divided rectangle
 | 
				
			||||||
 | 
					#include "composit.h"   // Composite images
 | 
				
			||||||
 | 
					#include "canvas.h"     // wxShapeCanvas for displaying objects
 | 
				
			||||||
 | 
					#include "ogldiag.h"    // wxDiagram
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern void wxOGLInitialize();
 | 
				
			||||||
 | 
					extern void wxOGLCleanUp();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					 // _OGL_OGL_H_
 | 
				
			||||||
							
								
								
									
										580
									
								
								utils/ogl/src/ogldiag.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,580 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        ogldiag.cpp
 | 
				
			||||||
 | 
					// Purpose:     wxDiagram
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma implementation "ogldiag.h"
 | 
				
			||||||
 | 
					#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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					#include <wx/wxexpr.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if USE_IOSTREAMH
 | 
				
			||||||
 | 
					#include <iostream.h>
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <fstream.h>
 | 
				
			||||||
 | 
					#include <ctype.h>
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "basic.h"
 | 
				
			||||||
 | 
					#include "basicp.h"
 | 
				
			||||||
 | 
					#include "canvas.h"
 | 
				
			||||||
 | 
					#include "ogldiag.h"
 | 
				
			||||||
 | 
					#include "lines.h"
 | 
				
			||||||
 | 
					#include "composit.h"
 | 
				
			||||||
 | 
					#include "misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IMPLEMENT_DYNAMIC_CLASS(wxDiagram, wxObject)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Object canvas
 | 
				
			||||||
 | 
					wxDiagram::wxDiagram()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  m_diagramCanvas = NULL;
 | 
				
			||||||
 | 
					  m_quickEditMode = FALSE;
 | 
				
			||||||
 | 
					  m_snapToGrid = TRUE;
 | 
				
			||||||
 | 
					  m_gridSpacing = 5.0;
 | 
				
			||||||
 | 
					  m_shapeList = new wxList;
 | 
				
			||||||
 | 
					  m_mouseTolerance = DEFAULT_MOUSE_TOLERANCE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wxDiagram::~wxDiagram()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (m_shapeList)
 | 
				
			||||||
 | 
					    delete m_shapeList;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDiagram::SetSnapToGrid(bool snap)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  m_snapToGrid = snap;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDiagram::SetGridSpacing(float spacing)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  m_gridSpacing = spacing;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDiagram::Snap(float *x, float *y)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (m_snapToGrid)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    *x = m_gridSpacing * ((int)(*x/m_gridSpacing + 0.5));
 | 
				
			||||||
 | 
					    *y = m_gridSpacing * ((int)(*y/m_gridSpacing + 0.5));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDiagram::Redraw(wxDC& dc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (m_shapeList)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (GetCanvas())
 | 
				
			||||||
 | 
					      GetCanvas()->SetCursor(wxHOURGLASS_CURSOR);
 | 
				
			||||||
 | 
					    wxNode *current = m_shapeList->First();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while (current)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wxShape *object = (wxShape *)current->Data();
 | 
				
			||||||
 | 
					      if (!object->GetParent())
 | 
				
			||||||
 | 
					        object->Draw(dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      current = current->Next();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (GetCanvas())
 | 
				
			||||||
 | 
					      GetCanvas()->SetCursor(wxSTANDARD_CURSOR);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDiagram::Clear(wxDC& dc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  dc.Clear();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Insert object after addAfter, or at end of list.
 | 
				
			||||||
 | 
					void wxDiagram::AddShape(wxShape *object, wxShape *addAfter)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxNode *nodeAfter = NULL;
 | 
				
			||||||
 | 
					  if (addAfter)
 | 
				
			||||||
 | 
					    nodeAfter = m_shapeList->Member(addAfter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!m_shapeList->Member(object))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (nodeAfter)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (nodeAfter->Next())
 | 
				
			||||||
 | 
					        m_shapeList->Insert(nodeAfter->Next(), object);
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        m_shapeList->Append(object);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      m_shapeList->Append(object);
 | 
				
			||||||
 | 
					    object->SetCanvas(GetCanvas());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDiagram::InsertShape(wxShape *object)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  m_shapeList->Insert(object);
 | 
				
			||||||
 | 
					  object->SetCanvas(GetCanvas());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDiagram::RemoveShape(wxShape *object)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  m_shapeList->DeleteObject(object);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Should this delete the actual objects too? I think not.
 | 
				
			||||||
 | 
					void wxDiagram::RemoveAllShapes()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  m_shapeList->Clear();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDiagram::DeleteAllShapes()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxNode *node = m_shapeList->First();
 | 
				
			||||||
 | 
					  while (node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShape *shape = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					    if (!shape->GetParent())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      RemoveShape(shape);
 | 
				
			||||||
 | 
					      delete shape;
 | 
				
			||||||
 | 
					      node = m_shapeList->First();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      node = node->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDiagram::ShowAll(bool show)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxNode *current = m_shapeList->First();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (current)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShape *object = (wxShape *)current->Data();
 | 
				
			||||||
 | 
					    object->Show(show);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    current = current->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDiagram::DrawOutline(wxDC& dc, float x1, float y1, float x2, float y2)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxPen dottedPen(wxColour(0, 0, 0), 1, wxDOT);
 | 
				
			||||||
 | 
					  dc.SetPen(dottedPen);
 | 
				
			||||||
 | 
					  dc.SetBrush((* wxTRANSPARENT_BRUSH));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxPoint points[5];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  points[0].x = x1;
 | 
				
			||||||
 | 
					  points[0].y = y1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  points[1].x = x2;
 | 
				
			||||||
 | 
					  points[1].y = y1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  points[2].x = x2;
 | 
				
			||||||
 | 
					  points[2].y = y2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  points[3].x = x1;
 | 
				
			||||||
 | 
					  points[3].y = y2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  points[4].x = x1;
 | 
				
			||||||
 | 
					  points[4].y = y1;
 | 
				
			||||||
 | 
					  dc.DrawLines(5, points);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Make sure all text that should be centred, is centred.
 | 
				
			||||||
 | 
					void wxDiagram::RecentreAll(wxDC& dc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxNode *object_node = m_shapeList->First();
 | 
				
			||||||
 | 
					  while (object_node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShape *obj = (wxShape *)object_node->Data();
 | 
				
			||||||
 | 
					    obj->Recentre(dc);
 | 
				
			||||||
 | 
					    object_node = object_node->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Input/output
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					bool wxDiagram::SaveFile(const wxString& filename)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxBeginBusyCursor();
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  wxExprDatabase *database = new wxExprDatabase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // First write the diagram type
 | 
				
			||||||
 | 
					  wxExpr *header = new wxExpr("diagram");
 | 
				
			||||||
 | 
					  OnHeaderSave(*database, *header);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  database->Append(header);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  wxNode *node = m_shapeList->First();
 | 
				
			||||||
 | 
					  while (node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShape *shape = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (!shape->IsKindOf(CLASSINFO(wxControlPoint)))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wxExpr *expr = NULL;
 | 
				
			||||||
 | 
					      if (shape->IsKindOf(CLASSINFO(wxLineShape)))
 | 
				
			||||||
 | 
					        expr = new wxExpr("line");
 | 
				
			||||||
 | 
					       else
 | 
				
			||||||
 | 
					        expr = new wxExpr("shape");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      OnShapeSave(*database, *shape, *expr);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    node = node->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  OnDatabaseSave(*database);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  char tempFile[400];
 | 
				
			||||||
 | 
					  wxGetTempFileName("diag", tempFile);
 | 
				
			||||||
 | 
					  ofstream stream(tempFile);
 | 
				
			||||||
 | 
					  if (stream.bad())
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxEndBusyCursor();
 | 
				
			||||||
 | 
					    delete database;
 | 
				
			||||||
 | 
					    return FALSE;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  database->Write(stream);
 | 
				
			||||||
 | 
					  stream.close();
 | 
				
			||||||
 | 
					  delete database;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					  // Save backup
 | 
				
			||||||
 | 
					  if (FileExists(filename))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    char buf[400];
 | 
				
			||||||
 | 
					#ifdef __X__
 | 
				
			||||||
 | 
					    sprintf(buf, "%s.bak", filename);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef __WXMSW__
 | 
				
			||||||
 | 
					    sprintf(buf, "_diagram.bak");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    if (FileExists(buf)) wxRemoveFile(buf);
 | 
				
			||||||
 | 
					    if (!wxRenameFile(filename, buf))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wxCopyFile(filename, buf);
 | 
				
			||||||
 | 
					      wxRemoveFile(filename);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Copy the temporary file to the correct filename
 | 
				
			||||||
 | 
					  if (!wxRenameFile(tempFile, filename))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxCopyFile(tempFile, filename);
 | 
				
			||||||
 | 
					    wxRemoveFile(tempFile);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxEndBusyCursor();
 | 
				
			||||||
 | 
					  return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool wxDiagram::LoadFile(const wxString& filename)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wxBeginBusyCursor();
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  wxExprDatabase database(PrologInteger, "id");
 | 
				
			||||||
 | 
					  if (!database.Read(filename))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxEndBusyCursor();
 | 
				
			||||||
 | 
					    return FALSE;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  DeleteAllShapes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  database.BeginFind();
 | 
				
			||||||
 | 
					  wxExpr *header = database.FindClauseByFunctor("diagram");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (header)
 | 
				
			||||||
 | 
					    OnHeaderLoad(database, *header);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Scan through all clauses and register the ids
 | 
				
			||||||
 | 
					  wxNode *node = database.First();
 | 
				
			||||||
 | 
					  while (node)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxExpr *clause = (wxExpr *)node->Data();
 | 
				
			||||||
 | 
					    long id = -1;
 | 
				
			||||||
 | 
					    clause->GetAttributeValue("id", id);
 | 
				
			||||||
 | 
					    RegisterId(id);
 | 
				
			||||||
 | 
					    node = node->Next();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ReadNodes(database);
 | 
				
			||||||
 | 
					  ReadContainerGeometry(database);
 | 
				
			||||||
 | 
					  ReadLines(database);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  OnDatabaseLoad(database);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxEndBusyCursor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDiagram::ReadNodes(wxExprDatabase& database)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  // Find and create the node images
 | 
				
			||||||
 | 
					  database.BeginFind();
 | 
				
			||||||
 | 
					  wxExpr *clause = database.FindClauseByFunctor("shape");
 | 
				
			||||||
 | 
					  while (clause)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    char *type = NULL;
 | 
				
			||||||
 | 
					    long parentId = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    clause->AssignAttributeValue("type", &type);
 | 
				
			||||||
 | 
					    clause->AssignAttributeValue("parent", &parentId);
 | 
				
			||||||
 | 
					    wxClassInfo *classInfo = wxClassInfo::FindClass(type);
 | 
				
			||||||
 | 
					    if (classInfo)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wxShape *shape = (wxShape *)classInfo->CreateObject();
 | 
				
			||||||
 | 
					      OnShapeLoad(database, *shape, *clause);
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      shape->SetCanvas(GetCanvas());
 | 
				
			||||||
 | 
					      shape->Show(TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      m_shapeList->Append(shape);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // If child of composite, link up
 | 
				
			||||||
 | 
					      if (parentId > -1)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxExpr *parentExpr = database.HashFind("shape", parentId);
 | 
				
			||||||
 | 
					        if (parentExpr && parentExpr->GetClientData())
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          wxShape *parent = (wxShape *)parentExpr->GetClientData();
 | 
				
			||||||
 | 
					          shape->SetParent(parent);
 | 
				
			||||||
 | 
					          parent->GetChildren().Append(shape);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      clause->SetClientData(shape);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (type)
 | 
				
			||||||
 | 
					      delete[] type;
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    clause = database.FindClauseByFunctor("shape");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDiagram::ReadLines(wxExprDatabase& database)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  database.BeginFind();
 | 
				
			||||||
 | 
					  wxExpr *clause = database.FindClauseByFunctor("line");
 | 
				
			||||||
 | 
					  while (clause)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxString type("");
 | 
				
			||||||
 | 
					    long parentId = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    clause->GetAttributeValue("type", type);
 | 
				
			||||||
 | 
					    clause->GetAttributeValue("parent", parentId);
 | 
				
			||||||
 | 
					    wxClassInfo *classInfo = wxClassInfo::FindClass((char*) (const char*) type);
 | 
				
			||||||
 | 
					    if (classInfo)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wxLineShape *shape = (wxLineShape *)classInfo->CreateObject();
 | 
				
			||||||
 | 
					      shape->Show(TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      OnShapeLoad(database, *shape, *clause);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      long image_to = -1; long image_from = -1;
 | 
				
			||||||
 | 
					      clause->GetAttributeValue("to", image_to);
 | 
				
			||||||
 | 
					      clause->GetAttributeValue("from", image_from);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      wxExpr *image_to_expr = database.HashFind("shape", image_to);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (!image_to_expr)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        // Error
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      wxExpr *image_from_expr = database.HashFind("shape", image_from);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (!image_from_expr)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        // Error
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (image_to_expr && image_from_expr)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        wxShape *image_to_object = (wxShape *)image_to_expr->GetClientData();
 | 
				
			||||||
 | 
					        wxShape *image_from_object = (wxShape *)image_from_expr->GetClientData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (image_to_object && image_from_object)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          image_from_object->AddLine(shape, image_to_object, shape->GetAttachmentFrom(), shape->GetAttachmentTo());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      clause->SetClientData(shape);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      m_shapeList->Append(shape);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    clause = database.FindClauseByFunctor("line");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Containers have divisions that reference adjoining divisions,
 | 
				
			||||||
 | 
					// so we need a separate pass to link everything up.
 | 
				
			||||||
 | 
					// Also used by Symbol Library.
 | 
				
			||||||
 | 
					void wxDiagram::ReadContainerGeometry(wxExprDatabase& database)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  database.BeginFind();
 | 
				
			||||||
 | 
					  wxExpr *clause = database.FindClauseByFunctor("shape");
 | 
				
			||||||
 | 
					  while (clause)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxShape *image = (wxShape *)clause->GetClientData();
 | 
				
			||||||
 | 
					    if (image && image->IsKindOf(CLASSINFO(wxCompositeShape)))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wxCompositeShape *composite = (wxCompositeShape *)image;
 | 
				
			||||||
 | 
					      wxExpr *divisionExpr = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Find the list of divisions in the composite
 | 
				
			||||||
 | 
					      clause->GetAttributeValue("divisions", &divisionExpr);
 | 
				
			||||||
 | 
					      if (divisionExpr)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        int i = 0;
 | 
				
			||||||
 | 
					        wxExpr *idExpr = divisionExpr->Nth(i);
 | 
				
			||||||
 | 
					        while (idExpr)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          long divisionId = idExpr->IntegerValue();
 | 
				
			||||||
 | 
					          wxExpr *childExpr = database.HashFind("shape", divisionId);
 | 
				
			||||||
 | 
					          if (childExpr && childExpr->GetClientData())
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            wxDivisionShape *child = (wxDivisionShape *)childExpr->GetClientData();
 | 
				
			||||||
 | 
					            composite->GetDivisions().Append(child);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Find the adjoining shapes
 | 
				
			||||||
 | 
					            long leftSideId = -1;
 | 
				
			||||||
 | 
					            long topSideId = -1;
 | 
				
			||||||
 | 
					            long rightSideId = -1;
 | 
				
			||||||
 | 
					            long bottomSideId = -1;
 | 
				
			||||||
 | 
					            childExpr->GetAttributeValue("left_side", leftSideId);
 | 
				
			||||||
 | 
					            childExpr->GetAttributeValue("top_side", topSideId);
 | 
				
			||||||
 | 
					            childExpr->GetAttributeValue("right_side", rightSideId);
 | 
				
			||||||
 | 
					            childExpr->GetAttributeValue("bottom_side", bottomSideId);
 | 
				
			||||||
 | 
					            if (leftSideId > -1)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              wxExpr *leftExpr = database.HashFind("shape", leftSideId);
 | 
				
			||||||
 | 
					              if (leftExpr && leftExpr->GetClientData())
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                wxDivisionShape *leftSide = (wxDivisionShape *)leftExpr->GetClientData();
 | 
				
			||||||
 | 
					                child->SetLeftSide(leftSide);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (topSideId > -1)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              wxExpr *topExpr = database.HashFind("shape", topSideId);
 | 
				
			||||||
 | 
					              if (topExpr && topExpr->GetClientData())
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                wxDivisionShape *topSide = (wxDivisionShape *)topExpr->GetClientData();
 | 
				
			||||||
 | 
					                child->SetTopSide(topSide);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (rightSideId > -1)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              wxExpr *rightExpr = database.HashFind("shape", rightSideId);
 | 
				
			||||||
 | 
					              if (rightExpr && rightExpr->GetClientData())
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                wxDivisionShape *rightSide = (wxDivisionShape *)rightExpr->GetClientData();
 | 
				
			||||||
 | 
					                child->SetRightSide(rightSide);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (bottomSideId > -1)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              wxExpr *bottomExpr = database.HashFind("shape", bottomSideId);
 | 
				
			||||||
 | 
					              if (bottomExpr && bottomExpr->GetClientData())
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                wxDivisionShape *bottomSide = (wxDivisionShape *)bottomExpr->GetClientData();
 | 
				
			||||||
 | 
					                child->SetBottomSide(bottomSide);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          i ++;
 | 
				
			||||||
 | 
					          idExpr = divisionExpr->Nth(i);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    clause = database.FindClauseByFunctor("shape");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Allow for modifying file
 | 
				
			||||||
 | 
					bool wxDiagram::OnDatabaseLoad(wxExprDatabase& db)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool wxDiagram::OnDatabaseSave(wxExprDatabase& db)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool wxDiagram::OnShapeSave(wxExprDatabase& db, wxShape& shape, wxExpr& expr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  shape.WritePrologAttributes(&expr);
 | 
				
			||||||
 | 
					  db.Append(&expr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (shape.IsKindOf(CLASSINFO(wxCompositeShape)))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    wxNode *node = shape.GetChildren().First();
 | 
				
			||||||
 | 
					    while (node)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      wxShape *childShape = (wxShape *)node->Data();
 | 
				
			||||||
 | 
					      wxExpr *childExpr = new wxExpr("shape");
 | 
				
			||||||
 | 
					      OnShapeSave(db, *childShape, *childExpr);
 | 
				
			||||||
 | 
					      node = node->Next();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool wxDiagram::OnShapeLoad(wxExprDatabase& db, wxShape& shape, wxExpr& expr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  shape.ReadPrologAttributes(&expr);
 | 
				
			||||||
 | 
					  return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool wxDiagram::OnHeaderSave(wxExprDatabase& db, wxExpr& expr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool wxDiagram::OnHeaderLoad(wxExprDatabase& db, wxExpr& expr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wxDiagram::SetCanvas(wxShapeCanvas *can)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  m_diagramCanvas = can;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										94
									
								
								utils/ogl/src/ogldiag.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,94 @@
 | 
				
			|||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Name:        ogldiag.h
 | 
				
			||||||
 | 
					// Purpose:     OGL - wxDiagram class
 | 
				
			||||||
 | 
					// Author:      Julian Smart
 | 
				
			||||||
 | 
					// Modified by:
 | 
				
			||||||
 | 
					// Created:     12/07/98
 | 
				
			||||||
 | 
					// RCS-ID:      $Id$
 | 
				
			||||||
 | 
					// Copyright:   (c) Julian Smart
 | 
				
			||||||
 | 
					// Licence:   	wxWindows licence
 | 
				
			||||||
 | 
					/////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _OGL_OGLDIAG_H_
 | 
				
			||||||
 | 
					#define _OGL_OGLDIAG_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUG__
 | 
				
			||||||
 | 
					#pragma interface "ogldiag.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "basic.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class wxDiagram: public wxObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 DECLARE_DYNAMIC_CLASS(wxDiagram)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wxDiagram();
 | 
				
			||||||
 | 
					  virtual ~wxDiagram();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void SetCanvas(wxShapeCanvas *can);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline wxShapeCanvas *GetCanvas() const { return m_diagramCanvas; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void Redraw(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void Clear(wxDC& dc);
 | 
				
			||||||
 | 
					  virtual void DrawOutline(wxDC& dc, float x1, float y1, float x2, float y2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Add object to end of object list (if addAfter is NULL)
 | 
				
			||||||
 | 
					  // or just after addAfter.
 | 
				
			||||||
 | 
					  virtual void AddShape(wxShape *object, wxShape *addAfter = NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Add object to front of object list
 | 
				
			||||||
 | 
					  virtual void InsertShape(wxShape *object);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void SetSnapToGrid(bool snap);
 | 
				
			||||||
 | 
					  void SetGridSpacing(float spacing);
 | 
				
			||||||
 | 
					  inline float GetGridSpacing() { return m_gridSpacing; }
 | 
				
			||||||
 | 
					  inline bool GetSnapToGrid() const { return m_snapToGrid; }
 | 
				
			||||||
 | 
					  void Snap(float *x, float *y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline void SetQuickEditMode(bool qem) { m_quickEditMode = qem; }
 | 
				
			||||||
 | 
					  inline bool GetQuickEditMode() const { return m_quickEditMode; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void RemoveShape(wxShape *object);
 | 
				
			||||||
 | 
					  virtual void RemoveAllShapes();
 | 
				
			||||||
 | 
					  virtual void DeleteAllShapes();
 | 
				
			||||||
 | 
					  virtual void ShowAll(bool show);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  inline void SetMouseTolerance(int tol) { m_mouseTolerance = tol; }
 | 
				
			||||||
 | 
					  inline int GetMouseTolerance() const { return m_mouseTolerance; }
 | 
				
			||||||
 | 
					  inline wxList *GetShapeList() const { return m_shapeList; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Make sure all text that should be centred, is centred.
 | 
				
			||||||
 | 
					  void RecentreAll(wxDC& dc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef PROLOGIO
 | 
				
			||||||
 | 
					  // Prolog database stuff
 | 
				
			||||||
 | 
					  virtual bool SaveFile(const wxString& filename);
 | 
				
			||||||
 | 
					  virtual bool LoadFile(const wxString& filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void ReadNodes(wxExprDatabase& database);
 | 
				
			||||||
 | 
					  virtual void ReadLines(wxExprDatabase& database);
 | 
				
			||||||
 | 
					  virtual void ReadContainerGeometry(wxExprDatabase& database);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Allow for modifying file
 | 
				
			||||||
 | 
					  virtual bool OnDatabaseLoad(wxExprDatabase& db);
 | 
				
			||||||
 | 
					  virtual bool OnDatabaseSave(wxExprDatabase& db);
 | 
				
			||||||
 | 
					  virtual bool OnShapeSave(wxExprDatabase& db, wxShape& shape, wxExpr& expr);
 | 
				
			||||||
 | 
					  virtual bool OnShapeLoad(wxExprDatabase& db, wxShape& shape, wxExpr& expr);
 | 
				
			||||||
 | 
					  virtual bool OnHeaderSave(wxExprDatabase& db, wxExpr& expr);
 | 
				
			||||||
 | 
					  virtual bool OnHeaderLoad(wxExprDatabase& db, wxExpr& expr);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					  wxShapeCanvas*        m_diagramCanvas;
 | 
				
			||||||
 | 
					  bool                  m_quickEditMode;
 | 
				
			||||||
 | 
					  bool                  m_snapToGrid;
 | 
				
			||||||
 | 
					  float                 m_gridSpacing;
 | 
				
			||||||
 | 
					  int                   m_mouseTolerance;
 | 
				
			||||||
 | 
					  wxList*               m_shapeList;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					 // _OGL_OGLDIAG_H_
 | 
				
			||||||