Add draft wxPlotWindow
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5483 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
12
Makefile.in
12
Makefile.in
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# This file was automatically generated by tmake at 21:14, 2000/01/16
|
# This file was automatically generated by tmake at 20:27, 2000/01/17
|
||||||
# DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE UNX.T!
|
# DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE UNX.T!
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -304,6 +304,7 @@ WX_HEADERS = \
|
|||||||
panel.h \
|
panel.h \
|
||||||
paper.h \
|
paper.h \
|
||||||
pen.h \
|
pen.h \
|
||||||
|
plot.h \
|
||||||
print.h \
|
print.h \
|
||||||
printdlg.h \
|
printdlg.h \
|
||||||
prntbase.h \
|
prntbase.h \
|
||||||
@@ -691,6 +692,7 @@ GENERIC_HEADERS = \
|
|||||||
generic/msgdlgg.h \
|
generic/msgdlgg.h \
|
||||||
generic/notebook.h \
|
generic/notebook.h \
|
||||||
generic/panelg.h \
|
generic/panelg.h \
|
||||||
|
generic/plot.h \
|
||||||
generic/printps.h \
|
generic/printps.h \
|
||||||
generic/prntdlgg.h \
|
generic/prntdlgg.h \
|
||||||
generic/progdlgg.h \
|
generic/progdlgg.h \
|
||||||
@@ -744,6 +746,7 @@ GTK_GENERICOBJS = \
|
|||||||
msgdlgg.o \
|
msgdlgg.o \
|
||||||
numdlgg.o \
|
numdlgg.o \
|
||||||
panelg.o \
|
panelg.o \
|
||||||
|
plot.o \
|
||||||
printps.o \
|
printps.o \
|
||||||
prntdlgg.o \
|
prntdlgg.o \
|
||||||
progdlgg.o \
|
progdlgg.o \
|
||||||
@@ -781,6 +784,7 @@ GTK_GENERICDEPS = \
|
|||||||
msgdlgg.d \
|
msgdlgg.d \
|
||||||
numdlgg.d \
|
numdlgg.d \
|
||||||
panelg.d \
|
panelg.d \
|
||||||
|
plot.d \
|
||||||
printps.d \
|
printps.d \
|
||||||
prntdlgg.d \
|
prntdlgg.d \
|
||||||
progdlgg.d \
|
progdlgg.d \
|
||||||
@@ -1136,6 +1140,7 @@ MOTIF_GENERICOBJS = \
|
|||||||
notebook.o \
|
notebook.o \
|
||||||
numdlgg.o \
|
numdlgg.o \
|
||||||
panelg.o \
|
panelg.o \
|
||||||
|
plot.o \
|
||||||
printps.o \
|
printps.o \
|
||||||
prntdlgg.o \
|
prntdlgg.o \
|
||||||
progdlgg.o \
|
progdlgg.o \
|
||||||
@@ -1176,6 +1181,7 @@ MOTIF_GENERICDEPS = \
|
|||||||
notebook.d \
|
notebook.d \
|
||||||
numdlgg.d \
|
numdlgg.d \
|
||||||
panelg.d \
|
panelg.d \
|
||||||
|
plot.d \
|
||||||
printps.d \
|
printps.d \
|
||||||
prntdlgg.d \
|
prntdlgg.d \
|
||||||
progdlgg.d \
|
progdlgg.d \
|
||||||
@@ -1510,6 +1516,7 @@ MSW_GENERICOBJS = \
|
|||||||
logg.o \
|
logg.o \
|
||||||
numdlgg.o \
|
numdlgg.o \
|
||||||
panelg.o \
|
panelg.o \
|
||||||
|
plot.o \
|
||||||
progdlgg.o \
|
progdlgg.o \
|
||||||
prop.o \
|
prop.o \
|
||||||
propform.o \
|
propform.o \
|
||||||
@@ -1533,6 +1540,7 @@ MSW_GENERICDEPS = \
|
|||||||
logg.d \
|
logg.d \
|
||||||
numdlgg.d \
|
numdlgg.d \
|
||||||
panelg.d \
|
panelg.d \
|
||||||
|
plot.d \
|
||||||
progdlgg.d \
|
progdlgg.d \
|
||||||
prop.d \
|
prop.d \
|
||||||
propform.d \
|
propform.d \
|
||||||
@@ -1947,6 +1955,7 @@ PM_GENERICOBJS = \
|
|||||||
msgdlgg.o \
|
msgdlgg.o \
|
||||||
numdlgg.o \
|
numdlgg.o \
|
||||||
panelg.o \
|
panelg.o \
|
||||||
|
plot.o \
|
||||||
printps.o \
|
printps.o \
|
||||||
prntdlgg.o \
|
prntdlgg.o \
|
||||||
progdlgg.o \
|
progdlgg.o \
|
||||||
@@ -1982,6 +1991,7 @@ PM_GENERICDEPS = \
|
|||||||
msgdlgg.d \
|
msgdlgg.d \
|
||||||
numdlgg.d \
|
numdlgg.d \
|
||||||
panelg.d \
|
panelg.d \
|
||||||
|
plot.d \
|
||||||
printps.d \
|
printps.d \
|
||||||
prntdlgg.d \
|
prntdlgg.d \
|
||||||
progdlgg.d \
|
progdlgg.d \
|
||||||
|
@@ -80,6 +80,7 @@ logg.cpp G
|
|||||||
msgdlgg.cpp G G
|
msgdlgg.cpp G G
|
||||||
notebook.cpp G 16,R,P
|
notebook.cpp G 16,R,P
|
||||||
panelg.cpp G
|
panelg.cpp G
|
||||||
|
plot.cpp G
|
||||||
printps.cpp G PS
|
printps.cpp G PS
|
||||||
prntdlgg.cpp G PS,U
|
prntdlgg.cpp G PS,U
|
||||||
progdlgg.cpp G
|
progdlgg.cpp G
|
||||||
@@ -639,6 +640,7 @@ palette.h W
|
|||||||
panel.h W
|
panel.h W
|
||||||
paper.h W
|
paper.h W
|
||||||
pen.h W
|
pen.h W
|
||||||
|
plot.h W
|
||||||
print.h W
|
print.h W
|
||||||
printdlg.h W
|
printdlg.h W
|
||||||
prntbase.h W
|
prntbase.h W
|
||||||
@@ -1064,6 +1066,7 @@ listctrl.h N 16
|
|||||||
msgdlgg.h N
|
msgdlgg.h N
|
||||||
notebook.h N
|
notebook.h N
|
||||||
panelg.h N
|
panelg.h N
|
||||||
|
plot.h N
|
||||||
printps.h N
|
printps.h N
|
||||||
prntdlgg.h N
|
prntdlgg.h N
|
||||||
progdlgg.h N
|
progdlgg.h N
|
||||||
|
104
include/wx/generic/plot.h
Normal file
104
include/wx/generic/plot.h
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: plot.h
|
||||||
|
// Purpose: wxPlotWindow
|
||||||
|
// Author: Robert Roebling
|
||||||
|
// Modified by:
|
||||||
|
// Created: 12/1/2000
|
||||||
|
// Copyright: (c) Robert Roebling
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef _WX_PLOT_H_
|
||||||
|
#define _WX_PLOT_H_
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma interface "plot.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/scrolwin.h"
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// classes
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class wxPlotCurve;
|
||||||
|
class wxPlotArea;
|
||||||
|
class wxPlotWindow;
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxPlotCurve
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class WXDLLEXPORT wxPlotCurve: public wxObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxPlotCurve( int offsetY );
|
||||||
|
|
||||||
|
virtual wxInt32 GetStartX() = 0;
|
||||||
|
virtual wxInt32 GetEndX() = 0;
|
||||||
|
|
||||||
|
int GetOffsetY()
|
||||||
|
{ return m_offsetY; }
|
||||||
|
|
||||||
|
virtual double GetY( wxInt32 x ) = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_offsetY;
|
||||||
|
|
||||||
|
DECLARE_ABSTRACT_CLASS(wxPlotCurve)
|
||||||
|
};
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxPlotArea
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class WXDLLEXPORT wxPlotArea: public wxWindow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxPlotArea() {}
|
||||||
|
wxPlotArea( wxPlotWindow *parent );
|
||||||
|
|
||||||
|
void OnPaint( wxPaintEvent &event );
|
||||||
|
void OnMouse( wxMouseEvent &event );
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxPlotWindow *m_owner;
|
||||||
|
|
||||||
|
DECLARE_CLASS(wxPlotArea)
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
};
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxPlotWindow
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class WXDLLEXPORT wxPlotWindow: public wxScrolledWindow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxPlotWindow() {}
|
||||||
|
wxPlotWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flags );
|
||||||
|
~wxPlotWindow();
|
||||||
|
|
||||||
|
void Add( wxPlotCurve *curve );
|
||||||
|
size_t GetCount();
|
||||||
|
wxPlotCurve *GetAt( size_t n );
|
||||||
|
|
||||||
|
void SetCurrent( wxPlotCurve* current );
|
||||||
|
wxPlotCurve *GetCurrent();
|
||||||
|
|
||||||
|
void OnPaint( wxPaintEvent &event );
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend wxPlotArea;
|
||||||
|
|
||||||
|
wxList m_curves;
|
||||||
|
wxPlotArea *m_area;
|
||||||
|
wxPlotCurve *m_current;
|
||||||
|
|
||||||
|
DECLARE_CLASS(wxPlotWindow)
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
// _WX_PLOT_H_
|
7
include/wx/plot.h
Normal file
7
include/wx/plot.h
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#ifndef _WX_PLOT_H_BASE_
|
||||||
|
#define _WX_PLOT_H_BASE_
|
||||||
|
|
||||||
|
#include "wx/generic/plot.h"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
// _WX_PLOT_H_BASE_
|
21
samples/plot/Makefile.in
Normal file
21
samples/plot/Makefile.in
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#
|
||||||
|
# File: Makefile.in
|
||||||
|
# Author: Julian Smart
|
||||||
|
# Created: 1998
|
||||||
|
# Updated:
|
||||||
|
# Copyright: (c) 1998 Julian Smart
|
||||||
|
#
|
||||||
|
# "%W% %G%"
|
||||||
|
#
|
||||||
|
# Makefile for plot example (UNIX).
|
||||||
|
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
top_builddir = ../..
|
||||||
|
program_dir = samples/plot
|
||||||
|
|
||||||
|
PROGRAM=plot
|
||||||
|
|
||||||
|
OBJECTS=$(PROGRAM).o
|
||||||
|
|
||||||
|
include ../../src/makeprog.env
|
||||||
|
|
27
samples/plot/makefile.unx
Normal file
27
samples/plot/makefile.unx
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#
|
||||||
|
# File: Makefile for samples
|
||||||
|
# Author: Robert Roebling
|
||||||
|
# Created: 1999
|
||||||
|
# Updated:
|
||||||
|
# Copyright: (c) 1998 Robert Roebling
|
||||||
|
#
|
||||||
|
# This makefile requires a Unix version of wxWindows
|
||||||
|
# to be installed on your system. This is most often
|
||||||
|
# done typing "make install" when using the complete
|
||||||
|
# sources of wxWindows or by installing the two
|
||||||
|
# RPM packages wxGTK.XXX.rpm and wxGTK-devel.XXX.rpm
|
||||||
|
# under Linux.
|
||||||
|
#
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
|
||||||
|
PROGRAM = plot
|
||||||
|
|
||||||
|
$(PROGRAM): $(PROGRAM).o
|
||||||
|
$(CC) -o $(PROGRAM) $(PROGRAM).o `wx-config --libs`
|
||||||
|
|
||||||
|
$(PROGRAM).o: $(PROGRAM).cpp
|
||||||
|
$(CC) `wx-config --cflags` -c $(PROGRAM).cpp
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o $(PROGRAM)
|
160
samples/plot/plot.cpp
Normal file
160
samples/plot/plot.cpp
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
/*
|
||||||
|
* Program: wxPlotWindow
|
||||||
|
*
|
||||||
|
* Author: Robert Roebling
|
||||||
|
*
|
||||||
|
* Copyright: (C) 1999, Robert Roebling
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx/wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/wx.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/plot.h"
|
||||||
|
|
||||||
|
#include "wx/image.h"
|
||||||
|
#include "wx/listctrl.h"
|
||||||
|
#include "wx/sizer.h"
|
||||||
|
#include "wx/log.h"
|
||||||
|
#include "wx/intl.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
// derived classes
|
||||||
|
|
||||||
|
class MyPlotCurve;
|
||||||
|
class MyFrame;
|
||||||
|
class MyApp;
|
||||||
|
|
||||||
|
// MyPlotCurve
|
||||||
|
|
||||||
|
class MyPlotCurve: public wxPlotCurve
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MyPlotCurve( int offsetY ) :
|
||||||
|
wxPlotCurve( offsetY ) {}
|
||||||
|
|
||||||
|
virtual wxInt32 GetStartX()
|
||||||
|
{ return 0; }
|
||||||
|
virtual wxInt32 GetEndX()
|
||||||
|
{ return 10000; }
|
||||||
|
|
||||||
|
virtual double GetY( wxInt32 x )
|
||||||
|
{
|
||||||
|
double dx = x;
|
||||||
|
dx /= 100;
|
||||||
|
return sin( dx )+1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// MyFrame
|
||||||
|
|
||||||
|
class MyFrame: public wxFrame
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MyFrame();
|
||||||
|
|
||||||
|
void OnAbout( wxCommandEvent &event );
|
||||||
|
void OnQuit( wxCommandEvent &event );
|
||||||
|
|
||||||
|
wxPlotWindow *m_plot;
|
||||||
|
wxTextCtrl *m_log;
|
||||||
|
|
||||||
|
private:
|
||||||
|
DECLARE_DYNAMIC_CLASS(MyFrame)
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
};
|
||||||
|
|
||||||
|
// MyApp
|
||||||
|
|
||||||
|
class MyApp: public wxApp
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual bool OnInit();
|
||||||
|
};
|
||||||
|
|
||||||
|
// main program
|
||||||
|
|
||||||
|
IMPLEMENT_APP(MyApp)
|
||||||
|
|
||||||
|
// MyFrame
|
||||||
|
|
||||||
|
const int ID_QUIT = 108;
|
||||||
|
const int ID_ABOUT = 109;
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(MyFrame,wxFrame)
|
||||||
|
EVT_MENU (ID_ABOUT, MyFrame::OnAbout)
|
||||||
|
EVT_MENU (ID_QUIT, MyFrame::OnQuit)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
MyFrame::MyFrame()
|
||||||
|
: wxFrame( (wxFrame *)NULL, -1, "wxScrolledWindow sample",
|
||||||
|
wxPoint(20,20), wxSize(470,500) )
|
||||||
|
{
|
||||||
|
wxMenu *file_menu = new wxMenu();
|
||||||
|
file_menu->Append( ID_ABOUT, "&About..");
|
||||||
|
file_menu->Append( ID_QUIT, "E&xit\tAlt-X");
|
||||||
|
|
||||||
|
wxMenuBar *menu_bar = new wxMenuBar();
|
||||||
|
menu_bar->Append(file_menu, "&File");
|
||||||
|
|
||||||
|
SetMenuBar( menu_bar );
|
||||||
|
|
||||||
|
CreateStatusBar(2);
|
||||||
|
int widths[] = { -1, 100 };
|
||||||
|
SetStatusWidths( 2, widths );
|
||||||
|
|
||||||
|
m_plot = new wxPlotWindow( this, -1, wxPoint(0,0), wxSize(100,100), wxSUNKEN_BORDER );
|
||||||
|
m_plot->SetScrollbars( 10, 10, 500, 0 );
|
||||||
|
|
||||||
|
m_plot->Add( new MyPlotCurve(100) );
|
||||||
|
m_plot->Add( new MyPlotCurve(40) );
|
||||||
|
m_plot->Add( new MyPlotCurve(30) );
|
||||||
|
|
||||||
|
m_log = new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(0,0), wxSize(100,100), wxTE_MULTILINE );
|
||||||
|
wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
|
||||||
|
delete old_log;
|
||||||
|
|
||||||
|
wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
|
topsizer->Add( m_plot, 1, wxEXPAND );
|
||||||
|
topsizer->Add( m_log, 0, wxEXPAND );
|
||||||
|
|
||||||
|
SetAutoLayout( TRUE );
|
||||||
|
SetSizer( topsizer );
|
||||||
|
}
|
||||||
|
|
||||||
|
void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
|
||||||
|
{
|
||||||
|
Close( TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
|
||||||
|
{
|
||||||
|
(void)wxMessageBox( "wxScroll demo II\n"
|
||||||
|
"Robert Roebling (c) 1998",
|
||||||
|
"About wxScroll II Demo", wxICON_INFORMATION | wxOK );
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// MyApp
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool MyApp::OnInit()
|
||||||
|
{
|
||||||
|
wxFrame *frame = new MyFrame();
|
||||||
|
frame->Show( TRUE );
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
278
src/generic/plot.cpp
Normal file
278
src/generic/plot.cpp
Normal file
@@ -0,0 +1,278 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: plot.cpp
|
||||||
|
// Purpose: wxPlotWindow
|
||||||
|
// Author: Robert Roebling
|
||||||
|
// Modified by:
|
||||||
|
// Created: 12/01/2000
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Robert Roebling
|
||||||
|
// Licence: wxWindows license
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma implementation "plot.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma hdrstop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef WX_PRECOMP
|
||||||
|
#include "wx/object.h"
|
||||||
|
#include "wx/font.h"
|
||||||
|
#include "wx/colour.h"
|
||||||
|
#include "wx/settings.h"
|
||||||
|
#include "wx/sizer.h"
|
||||||
|
#include "wx/log.h"
|
||||||
|
#include "wx/intl.h"
|
||||||
|
#include "wx/dcclient.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/generic/plot.h"
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxPlotCurve
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
IMPLEMENT_ABSTRACT_CLASS(wxPlotCurve, wxObject)
|
||||||
|
|
||||||
|
wxPlotCurve::wxPlotCurve( int offsetY )
|
||||||
|
{
|
||||||
|
m_offsetY = offsetY;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxPlotArea
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxPlotArea, wxWindow)
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxPlotArea, wxWindow)
|
||||||
|
EVT_PAINT( wxPlotArea::OnPaint)
|
||||||
|
EVT_LEFT_DOWN( wxPlotArea::OnMouse)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
wxPlotArea::wxPlotArea( wxPlotWindow *parent )
|
||||||
|
: wxWindow( parent, -1, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER, "plotarea" )
|
||||||
|
{
|
||||||
|
m_owner = parent;
|
||||||
|
|
||||||
|
SetBackgroundColour( *wxWHITE );
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPlotArea::OnMouse( wxMouseEvent &event )
|
||||||
|
{
|
||||||
|
int client_width;
|
||||||
|
int client_height;
|
||||||
|
GetClientSize( &client_width, &client_height);
|
||||||
|
int view_x;
|
||||||
|
int view_y;
|
||||||
|
m_owner->GetViewStart( &view_x, &view_y );
|
||||||
|
view_x *= 10;
|
||||||
|
view_y *= 10;
|
||||||
|
|
||||||
|
int x = event.GetX();
|
||||||
|
int y = event.GetY();
|
||||||
|
x += view_x;
|
||||||
|
y += view_y;
|
||||||
|
|
||||||
|
wxNode *node = m_owner->m_curves.First();
|
||||||
|
while (node)
|
||||||
|
{
|
||||||
|
wxPlotCurve *curve = (wxPlotCurve*)node->Data();
|
||||||
|
|
||||||
|
wxCoord offset_y = client_height - curve->GetOffsetY();
|
||||||
|
|
||||||
|
double dy = curve->GetY( x );
|
||||||
|
int curve_y = (wxCoord)(-dy * 100) + offset_y - 1;
|
||||||
|
if ((y-curve_y < 4) && (y-curve_y > -4))
|
||||||
|
{
|
||||||
|
m_owner->SetCurrent( curve );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = node->Next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPlotArea::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
||||||
|
{
|
||||||
|
int client_width;
|
||||||
|
int client_height;
|
||||||
|
GetClientSize( &client_width, &client_height);
|
||||||
|
int view_x;
|
||||||
|
int view_y;
|
||||||
|
m_owner->GetViewStart( &view_x, &view_y );
|
||||||
|
view_x *= 10;
|
||||||
|
view_y *= 10;
|
||||||
|
|
||||||
|
wxPaintDC dc( this );
|
||||||
|
m_owner->PrepareDC( dc );
|
||||||
|
|
||||||
|
wxRegionIterator upd( GetUpdateRegion() );
|
||||||
|
|
||||||
|
while (upd)
|
||||||
|
{
|
||||||
|
int update_x = upd.GetX();
|
||||||
|
int update_y = upd.GetY();
|
||||||
|
int update_width = upd.GetWidth();
|
||||||
|
|
||||||
|
update_x += view_x;
|
||||||
|
update_y += view_y;
|
||||||
|
|
||||||
|
if (m_owner->m_current)
|
||||||
|
{
|
||||||
|
dc.SetPen( *wxLIGHT_GREY_PEN );
|
||||||
|
int base_line = client_height - m_owner->m_current->GetOffsetY();
|
||||||
|
dc.DrawLine( update_x-1, base_line-1, update_x+update_width+2, base_line-1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxNode *node = m_owner->m_curves.First();
|
||||||
|
while (node)
|
||||||
|
{
|
||||||
|
wxPlotCurve *curve = (wxPlotCurve*)node->Data();
|
||||||
|
|
||||||
|
if (curve == m_owner->GetCurrent())
|
||||||
|
dc.SetPen( *wxBLACK_PEN );
|
||||||
|
else
|
||||||
|
dc.SetPen( *wxLIGHT_GREY_PEN );
|
||||||
|
wxCoord offset_y = client_height - curve->GetOffsetY();
|
||||||
|
|
||||||
|
int start_x = wxMax( update_x-1, curve->GetStartX() );
|
||||||
|
int end_x = wxMin( update_x+update_width+2, curve->GetEndX() );
|
||||||
|
|
||||||
|
wxCoord y=0,last_y=0;
|
||||||
|
for (int x = start_x; x < end_x; x++)
|
||||||
|
{
|
||||||
|
double dy = curve->GetY( x );
|
||||||
|
y = (wxCoord)(-dy * 100) + offset_y - 1;
|
||||||
|
|
||||||
|
if (x != start_x)
|
||||||
|
dc.DrawLine( x-1, last_y, x, y );
|
||||||
|
|
||||||
|
last_y = y;
|
||||||
|
}
|
||||||
|
node = node->Next();
|
||||||
|
}
|
||||||
|
upd ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// wxPlotWindow
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define ID_ENLARGE_100 1000
|
||||||
|
#define ID_ENLARGE_50 1001
|
||||||
|
#define ID_SHRINK_33 1002
|
||||||
|
#define ID_SHRINK_50 1003
|
||||||
|
|
||||||
|
#define ID_MOVE_UP 1006
|
||||||
|
#define ID_MOVE_DOWN 1007
|
||||||
|
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxPlotWindow, wxScrolledWindow)
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(wxPlotWindow, wxScrolledWindow)
|
||||||
|
EVT_PAINT( wxPlotWindow::OnPaint)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
wxPlotWindow::wxPlotWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag )
|
||||||
|
: wxScrolledWindow( parent, id, pos, size, flag, "plotcanvas" )
|
||||||
|
{
|
||||||
|
m_area = new wxPlotArea( this );
|
||||||
|
|
||||||
|
wxBoxSizer *mainsizer = new wxBoxSizer( wxHORIZONTAL );
|
||||||
|
|
||||||
|
wxBoxSizer *buttonlist = new wxBoxSizer( wxVERTICAL );
|
||||||
|
buttonlist->Add( new wxButton( this, ID_ENLARGE_100, _("+ 100%") ), 0, wxEXPAND|wxALL, 5 );
|
||||||
|
buttonlist->Add( new wxButton( this, ID_ENLARGE_50, _("+ 50%") ), 0, wxEXPAND|wxALL, 5 );
|
||||||
|
buttonlist->Add( new wxButton( this, ID_SHRINK_33, _("- 33%") ), 0, wxEXPAND|wxALL, 5 );
|
||||||
|
buttonlist->Add( new wxButton( this, ID_SHRINK_50, _("- 50%") ), 0, wxEXPAND|wxALL, 5 );
|
||||||
|
buttonlist->Add( 20,20, 0 );
|
||||||
|
buttonlist->Add( new wxButton( this, ID_MOVE_UP, _("Up") ), 0, wxEXPAND|wxALL, 5 );
|
||||||
|
buttonlist->Add( new wxButton( this, ID_MOVE_DOWN, _("Down") ), 0, wxEXPAND|wxALL, 5 );
|
||||||
|
buttonlist->Add( 20,20, 1 );
|
||||||
|
|
||||||
|
mainsizer->Add( buttonlist, 0, wxEXPAND );
|
||||||
|
|
||||||
|
mainsizer->Add( m_area, 1, wxEXPAND|wxLEFT, 50 );
|
||||||
|
|
||||||
|
SetAutoLayout( TRUE );
|
||||||
|
SetSizer( mainsizer );
|
||||||
|
|
||||||
|
SetTargetWindow( m_area );
|
||||||
|
|
||||||
|
SetBackgroundColour( *wxWHITE );
|
||||||
|
|
||||||
|
m_current = (wxPlotCurve*) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPlotWindow::~wxPlotWindow()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPlotWindow::Add( wxPlotCurve *curve )
|
||||||
|
{
|
||||||
|
m_curves.Append( curve );
|
||||||
|
if (!m_current) m_current = curve;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t wxPlotWindow::GetCount()
|
||||||
|
{
|
||||||
|
return m_curves.GetCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPlotCurve *wxPlotWindow::GetAt( size_t n )
|
||||||
|
{
|
||||||
|
wxNode *node = m_curves.Nth( n );
|
||||||
|
if (!node)
|
||||||
|
return (wxPlotCurve*) NULL;
|
||||||
|
|
||||||
|
return (wxPlotCurve*) node->Data();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPlotWindow::SetCurrent( wxPlotCurve* current )
|
||||||
|
{
|
||||||
|
m_current = current;
|
||||||
|
m_area->Refresh( TRUE );
|
||||||
|
|
||||||
|
wxPoint pos( m_area->GetPosition() );
|
||||||
|
|
||||||
|
int client_width;
|
||||||
|
int client_height;
|
||||||
|
GetClientSize( &client_width, &client_height);
|
||||||
|
wxRect rect(pos.x-40,0,40,client_height);
|
||||||
|
Refresh(TRUE,&rect);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPlotCurve *wxPlotWindow::GetCurrent()
|
||||||
|
{
|
||||||
|
return m_current;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxPlotWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
||||||
|
{
|
||||||
|
wxPaintDC dc( this );
|
||||||
|
|
||||||
|
if (!m_current) return;
|
||||||
|
|
||||||
|
int client_width;
|
||||||
|
int client_height;
|
||||||
|
GetClientSize( &client_width, &client_height);
|
||||||
|
|
||||||
|
dc.SetPen( *wxBLACK_PEN );
|
||||||
|
|
||||||
|
wxPoint pos( m_area->GetPosition() );
|
||||||
|
|
||||||
|
dc.DrawLine( pos.x-15, 5, pos.x-15, client_height-5 );
|
||||||
|
dc.DrawLine( pos.x-19, 9, pos.x-15, 5 );
|
||||||
|
dc.DrawLine( pos.x-10, 10, pos.x-15, 5 );
|
||||||
|
|
||||||
|
int y = client_height - m_current->GetOffsetY() - 1;
|
||||||
|
dc.DrawLine( pos.x-15, y, pos.x-7, y );
|
||||||
|
}
|
||||||
|
|
Reference in New Issue
Block a user