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:
Robert Roebling
2000-01-17 19:56:42 +00:00
parent cf214c358c
commit 981b25083e
8 changed files with 611 additions and 1 deletions

View File

@@ -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 \

View File

@@ -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
View 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
View 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
View 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
View 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
View 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
View 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 );
}