class WXDLLEXPORT wxPlotCurve: public wxObject
{
public:
- wxPlotCurve( int offsetY );
+ wxPlotCurve( int offsetY, double startY, double endY );
virtual wxInt32 GetStartX() = 0;
virtual wxInt32 GetEndX() = 0;
-
+
+ virtual double GetY( wxInt32 x ) = 0;
+
+ void SetStartY( double startY )
+ { m_startY = startY; }
+ double GetStartY()
+ { return m_startY; }
+ void SetEndY( double endY )
+ { m_endY = endY; }
+ double GetEndY()
+ { return m_endY; }
+ void SetOffsetY( int offsetY )
+ { m_offsetY = offsetY; }
int GetOffsetY()
{ return m_offsetY; }
- virtual double GetY( wxInt32 x ) = 0;
-
private:
int m_offsetY;
+ double m_startY;
+ double m_endY;
DECLARE_ABSTRACT_CLASS(wxPlotCurve)
};
GtkAdjustment *m_adjust;
float m_oldPos;
- bool m_isScrolling;
private:
DECLARE_DYNAMIC_CLASS(wxScrollBar)
bool m_isRadioButton:1; /* faster than IS_KIND_OF */
bool m_isFrame:1; /* faster than IS_KIND_OF */
bool m_acceptsFocus:1; /* not wxStaticBox, not wxStaticBitmap etc. */
+ bool m_isScrolling;
// these are true if the style were set before the widget was realized
// (typcally in the constructor) but the actual GTK style must not be set
GtkAdjustment *m_adjust;
float m_oldPos;
- bool m_isScrolling;
private:
DECLARE_DYNAMIC_CLASS(wxScrollBar)
bool m_isRadioButton:1; /* faster than IS_KIND_OF */
bool m_isFrame:1; /* faster than IS_KIND_OF */
bool m_acceptsFocus:1; /* not wxStaticBox, not wxStaticBitmap etc. */
+ bool m_isScrolling;
// these are true if the style were set before the widget was realized
// (typcally in the constructor) but the actual GTK style must not be set
{
// GetParent()->Move(100, 100);
+ if (event.GetInt() == -1)
+ {
+ m_text->AppendText( "ListBox has no selections anymore\n" );
+ return;
+ }
+
wxListBox *listbox = event.GetId() == ID_LISTBOX ? m_listbox
: m_listboxSorted;
class MyPlotCurve: public wxPlotCurve
{
public:
- MyPlotCurve( int offsetY ) :
- wxPlotCurve( offsetY ) {}
+ MyPlotCurve( int offsetY, double startY, double endY ) :
+ wxPlotCurve( offsetY, startY, endY ) {}
virtual wxInt32 GetStartX()
{ return 0; }
{
double dx = x;
dx /= 100;
- return sin( dx )+1;
+ return sin( dx );
}
};
END_EVENT_TABLE()
MyFrame::MyFrame()
- : wxFrame( (wxFrame *)NULL, -1, "wxScrolledWindow sample",
+ : wxFrame( (wxFrame *)NULL, -1, "wxPlotWindow sample",
wxPoint(20,20), wxSize(470,500) )
{
wxMenu *file_menu = new wxMenu();
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_plot->Add( new MyPlotCurve( 0, -1.5, 1.5 ) );
+ m_plot->Add( new MyPlotCurve( 50, -1.5, 1.5 ) );
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 ) );
void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
{
- (void)wxMessageBox( "wxScroll demo II\n"
- "Robert Roebling (c) 1998",
- "About wxScroll II Demo", wxICON_INFORMATION | wxOK );
+ (void)wxMessageBox( "wxPlotWindow Demo\n"
+ "Robert Roebling (c) 1999,2000",
+ "About wxPlotWindow Demo", wxICON_INFORMATION | wxOK );
}
//-----------------------------------------------------------------------------
#elif defined(HAVE_SHL_LOAD)
# define wxDllOpen(lib) shl_load(lib.fn_str(), BIND_DEFERRED, 0)
# define wxDllClose shl_unload
+
static inline void *wxDllGetSymbol(shl_t handle, const wxString& name)
{
void *sym;
#include "wx/generic/plot.h"
+#include <math.h>
+
//-----------------------------------------------------------------------------
// wxPlotCurve
//-----------------------------------------------------------------------------
IMPLEMENT_ABSTRACT_CLASS(wxPlotCurve, wxObject)
-wxPlotCurve::wxPlotCurve( int offsetY )
+wxPlotCurve::wxPlotCurve( int offsetY, double startY, double endY )
{
m_offsetY = offsetY;
+ m_startY = startY;
+ m_endY = endY;
}
//-----------------------------------------------------------------------------
{
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;
+ double double_client_height = (double)client_height;
+ double range = curve->GetEndY() - curve->GetStartY();
+ double end = curve->GetEndY();
+ wxCoord offset_y = curve->GetOffsetY();
+
+ double dy = (end - curve->GetY( x )) / range;
+ wxCoord curve_y = (wxCoord)(dy * double_client_height) - offset_y - 1;
+
if ((y-curve_y < 4) && (y-curve_y > -4))
{
m_owner->SetCurrent( curve );
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)
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() );
+ double double_client_height = (double)client_height;
+ double range = curve->GetEndY() - curve->GetStartY();
+ double end = curve->GetEndY();
+ wxCoord offset_y = curve->GetOffsetY();
+
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;
+ double dy = (end - curve->GetY( x )) / range;
+ y = (wxCoord)(dy * double_client_height) - offset_y - 1;
if (x != start_x)
dc.DrawLine( x-1, last_y, x, y );
void wxPlotWindow::SetCurrent( wxPlotCurve* current )
{
m_current = current;
- m_area->Refresh( TRUE );
+ m_area->Refresh( FALSE );
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);
+ wxRect rect(pos.x-45,0,45,client_height);
Refresh(TRUE,&rect);
}
wxPoint pos( m_area->GetPosition() );
+ double range = m_current->GetEndY() - m_current->GetStartY();
+ double offset = ((double) m_current->GetOffsetY() / (double)client_height ) * range;
+ double start = m_current->GetStartY() - offset;
+ double end = m_current->GetEndY() - offset;
+ int int_log_range = (int)floor( log10( range ) );
+ double step = 1.0;
+ if (int_log_range > 0)
+ {
+ for (int i = 0; i < int_log_range; i++)
+ step *= 10;
+ }
+ if (int_log_range < 0)
+ {
+ for (int i = 0; i < -int_log_range; i++)
+ step /= 10;
+ }
+ double lower = ceil(start / step) * step;
+ double upper = floor(end / step) * step;
+ int steps = (int)ceil((upper-lower)/step);
+ if (steps < 3)
+ {
+ step /= 2;
+ if (lower-step > start) lower -= step;
+ }
+
+ double current = lower;
+ while (current < upper+(step/2))
+ {
+ int y = (int)((m_current->GetEndY()-current) / range * (double)client_height) - 1;
+ y -= m_current->GetOffsetY();
+ if ((y > 10) && (y < client_height-7))
+ {
+ dc.DrawLine( pos.x-15, y, pos.x-7, y );
+ wxString label;
+ label.Printf( "%.1f", current );
+ dc.DrawText( label, pos.x-45, y-7 );
+ }
+
+ current += step;
+ }
+
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 );
}
if (!listbox->m_hasVMT) return;
if (g_blockEventsOnDrag) return;
-
+
wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() );
event.SetEventObject( listbox );
static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget),
GdkEventButton *WXUNUSED(gdk_event),
- wxWindow *WXUNUSED(win))
+ wxWindow *win)
{
DEBUG_MAIN_THREAD
// if (gdk_event->window != widget->slider) return FALSE;
g_blockEventsOnScroll = TRUE;
+ win->m_isScrolling = TRUE;
return FALSE;
}
static gint gtk_scrollbar_button_release_callback( GtkRange *WXUNUSED(widget),
GdkEventButton *WXUNUSED(gdk_event),
- wxWindow *WXUNUSED(win))
+ wxWindow *win)
{
DEBUG_MAIN_THREAD
// if (gdk_event->window != widget->slider) return FALSE;
g_blockEventsOnScroll = FALSE;
+ win->m_isScrolling = FALSE;
return FALSE;
}
m_nativeSizeEvent = FALSE;
m_hasScrolling = FALSE;
+ m_isScrolling = FALSE;
m_hAdjust = (GtkAdjustment*) NULL;
m_vAdjust = (GtkAdjustment*) NULL;
if (!listbox->m_hasVMT) return;
if (g_blockEventsOnDrag) return;
-
+
wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() );
event.SetEventObject( listbox );
static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget),
GdkEventButton *WXUNUSED(gdk_event),
- wxWindow *WXUNUSED(win))
+ wxWindow *win)
{
DEBUG_MAIN_THREAD
// if (gdk_event->window != widget->slider) return FALSE;
g_blockEventsOnScroll = TRUE;
+ win->m_isScrolling = TRUE;
return FALSE;
}
static gint gtk_scrollbar_button_release_callback( GtkRange *WXUNUSED(widget),
GdkEventButton *WXUNUSED(gdk_event),
- wxWindow *WXUNUSED(win))
+ wxWindow *win)
{
DEBUG_MAIN_THREAD
// if (gdk_event->window != widget->slider) return FALSE;
g_blockEventsOnScroll = FALSE;
+ win->m_isScrolling = FALSE;
return FALSE;
}
m_nativeSizeEvent = FALSE;
m_hasScrolling = FALSE;
+ m_isScrolling = FALSE;
m_hAdjust = (GtkAdjustment*) NULL;
m_vAdjust = (GtkAdjustment*) NULL;