--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: multicell.h
+// Purpose: provide two new classes for layout, wxMultiCellSizer and wxMultiCellCanvas
+// Author: Jonathan Bayer
+// Modified by:
+// Created:
+// RCS-ID: $Id:
+// Copyright: (c) Jonathan Bayer
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// This was inspired by the gbsizer class written by Alex Andruschak
+
+
+#ifndef __WX_MULTICELL_H__
+#define __WX_MULTICELL_H__
+
+#ifdef __GNUG__
+ #pragma interface "multicell.h"
+#endif
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+// The classes are derived from wxSizer
+#include "wx/sizer.h"
+
+
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+enum wxResizable
+{
+ wxNOT_RESIZABLE = 0x00,
+ wxHORIZENTAL_RESIZABLE = 0x01,
+ wxVERTICAL_RESIZABLE = 0x10,
+ wxRESIZABLE = 0x11
+};
+
+//---------------------------------------------------------------------------
+// classes
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+// wxMultiCellItemHandle
+//---------------------------------------------------------------------------
+
+class WXDLLEXPORT wxMultiCellItemHandle: public wxObject
+{
+ DECLARE_CLASS(wxMultiCellItemHandle);
+protected:
+ int m_column;
+ int m_row;
+ int m_width;
+ int m_height;
+ wxResizable m_style;
+ wxSize m_fixedSize;
+ int m_alignment;
+ wxSize m_weight;
+
+public:
+ wxMultiCellItemHandle( int row, int column, int height = 1, int width = 1, wxSize size = wxDefaultSize, wxResizable style = wxNOT_RESIZABLE, wxSize weight = wxSize(1,1), int align = wxALIGN_NOT);
+ wxMultiCellItemHandle( int row, int column, wxSize size, wxResizable style = wxNOT_RESIZABLE, wxSize weight = wxSize(1,1), int align = wxALIGN_NOT);
+ wxMultiCellItemHandle( int row, int column, wxResizable style, wxSize weight = wxSize(1,1), int align = wxALIGN_NOT);
+ wxMultiCellItemHandle( int row, int column, int align);
+ int GetColumn();
+ int GetRow();
+ int GetWidth();
+ int GetHeight();
+ wxResizable GetStyle();
+ wxSize GetLocalSize();
+ int GetAlignment();
+ wxSize GetWeight();
+
+private:
+ void Initialize( int row, int column, int height = 1, int width = 1, wxSize size = wxDefaultSize, wxResizable style = wxNOT_RESIZABLE, wxSize weight = wxSize(1,1), int align = wxALIGN_NOT);
+
+};
+
+//---------------------------------------------------------------------------
+// wxMultiCellSizer
+//---------------------------------------------------------------------------
+
+class WXDLLEXPORT wxMultiCellSizer : virtual public wxSizer
+{
+ DECLARE_CLASS(wxMultiCellSizer);
+
+protected:
+ wxSize m_cell_count;
+
+public:
+ wxMultiCellSizer(wxSize & size);
+ wxMultiCellSizer(int rows, int cols);
+ ~wxMultiCellSizer();
+
+ virtual void RecalcSizes();
+ virtual wxSize CalcMin();
+ bool SetDefaultCellSize(wxSize size);
+ bool SetColumnWidth(int column, int colSize = 5, bool expandable = FALSE);
+ bool SetRowHeight(int row, int rowSize = 5, bool expandable = FALSE);
+ bool EnableGridLines(wxWindow *win);
+ bool SetGridPen(wxPen *pen);
+ void OnPaint(wxDC& dc);
+
+private:
+ void GetMinimums();
+ int Sum(int *array, int x);
+
+private:
+ int *m_maxHeight;
+ int *m_maxWidth;
+ int *m_rowStretch;
+ int *m_colStretch;
+ wxSize **m_weights;
+ wxSize **m_minSizes;
+ int m_maxWeights;
+ wxSize m_defaultCellSize;
+ wxWindow *m_win; // usually used for debugging
+ wxPen *m_pen;
+
+ void DrawGridLines(wxDC& dc);
+ void Initialize(wxSize size);
+};
+
+
+// wxCell is used internally, so we don't need to declare it here
+
+class wxCell;
+
+//---------------------------------------------------------------------------
+// wxMultiCellCanvas
+//---------------------------------------------------------------------------
+
+class wxMultiCellCanvas : public wxFlexGridSizer
+{
+public:
+ wxMultiCellCanvas(wxWindow *parent, int numRows = 2, int numCols = 2);
+ void Add(wxWindow *win, unsigned int row, unsigned int col);
+
+ void Resize(int numRows, int numCols);
+ int MaxRows()
+ {
+ return m_maxRows;
+ };
+ int MaxCols()
+ {
+ return m_maxCols;
+ };
+ void CalculateConstraints();
+ void SetMinCellSize(const wxSize size)
+ {
+ m_minCellSize = size;
+ };
+
+private:
+ wxWindow *m_parent;
+ unsigned int m_maxRows, m_maxCols;
+
+ wxSize m_minCellSize;
+ wxCell **m_cells;
+};
+
+#endif
+
+
+
+/*** End of File ***/
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: splittree.h
+// Purpose: Classes to achieve a remotely-scrolled tree in a splitter
+// window that can be scrolled by a scrolled window higher in the
+// hierarchy
+// Author: Julian Smart
+// Modified by:
+// Created: 8/7/2000
+// RCS-ID: $Id$
+// Copyright: (c) Julian Smart
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_SPLITTREE_H_
+#define _WX_SPLITTREE_H_
+
+#ifdef __GNUG__
+ #pragma interface "splittree.h"
+#endif
+
+// Set this to 1 to use generic tree control (doesn't yet work properly)
+#define USE_GENERIC_TREECTRL 0
+
+#include "wx/wx.h"
+#include "wx/treectrl.h"
+#include "wx/splitter.h"
+#include "wx/scrolwin.h"
+
+#if USE_GENERIC_TREECTRL
+#include "wx/generic/treectlg.h"
+#ifndef wxTreeCtrl
+#define wxTreeCtrl wxGenericTreeCtrl
+#define sm_classwxTreeCtrl sm_classwxGenericTreeCtrl
+#endif
+#endif
+
+class wxRemotelyScrolledTreeCtrl;
+class wxThinSplitterWindow;
+class wxSplitterScrolledWindow;
+
+/*
+ * wxRemotelyScrolledTreeCtrl
+ *
+ * This tree control disables its vertical scrollbar and catches scroll
+ * events passed by a scrolled window higher in the hierarchy.
+ * It also updates the scrolled window vertical scrollbar as appropriate.
+ */
+
+class wxRemotelyScrolledTreeCtrl: public wxTreeCtrl
+{
+ DECLARE_CLASS(wxRemotelyScrolledTreeCtrl)
+public:
+ wxRemotelyScrolledTreeCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pt = wxDefaultPosition,
+ const wxSize& sz = wxDefaultSize, long style = wxTR_HAS_BUTTONS);
+ ~wxRemotelyScrolledTreeCtrl();
+
+//// Events
+ void OnSize(wxSizeEvent& event);
+ void OnPaint(wxPaintEvent& event);
+ void OnExpand(wxTreeEvent& event);
+ void OnScroll(wxScrollWinEvent& event);
+
+//// Overrides
+ // Override this in case we're using the generic tree control.
+ // Calls to this should disable the vertical scrollbar.
+
+ // Number of pixels per user unit (0 or -1 for no scrollbar)
+ // Length of virtual canvas in user units
+ // Length of page in user units
+ virtual void SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY,
+ int noUnitsX, int noUnitsY,
+ int xPos = 0, int yPos = 0,
+ bool noRefresh = FALSE );
+
+ // In case we're using the generic tree control.
+ // Get the view start
+ virtual void GetViewStart(int *x, int *y) const;
+
+ // In case we're using the generic tree control.
+ virtual void PrepareDC(wxDC& dc);
+
+//// Helpers
+ void HideVScrollbar();
+
+ // Calculate the tree overall size so we can set the scrollbar
+ // correctly
+ void CalcTreeSize(wxRect& rect);
+ void CalcTreeSize(wxTreeItemId& id, wxRect& rect);
+
+ // Adjust the containing wxScrolledWindow's scrollbars appropriately
+ void AdjustRemoteScrollbars();
+
+ // Find the scrolled window that contains this control
+ wxScrolledWindow* GetScrolledWindow() const;
+
+ // Scroll to the given line (in scroll units where each unit is
+ // the height of an item)
+ void ScrollToLine(int posHoriz, int posVert);
+
+ DECLARE_EVENT_TABLE()
+protected:
+};
+
+/*
+ * wxThinSplitterWindow
+ *
+ * Implements a splitter with a less obvious sash
+ * than the usual one.
+ */
+
+class wxThinSplitterWindow: public wxSplitterWindow
+{
+public:
+ DECLARE_DYNAMIC_CLASS(wxThinSplitterWindow)
+
+ wxThinSplitterWindow(wxWindow* parent, wxWindowID id = -1,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& sz = wxDefaultSize,
+ long style = wxSP_3D | wxCLIP_CHILDREN);
+
+//// Overrides
+
+ void SizeWindows();
+ // Tests for x, y over sash. Overriding this allows us to increase
+ // the tolerance.
+ bool SashHitTest(int x, int y, int tolerance = 2);
+ void DrawSash(wxDC& dc);
+
+//// Events
+
+ void OnSize(wxSizeEvent& event);
+
+//// Operations
+
+//// Accessors
+
+//// Data members
+protected:
+ DECLARE_EVENT_TABLE()
+};
+
+/*
+ * wxSplitterScrolledWindow
+ *
+ * This scrolled window is aware of the fact that one of its
+ * children is a splitter window. It passes on its scroll events
+ * (after some processing) to both splitter children for them
+ * scroll appropriately.
+ */
+
+class wxSplitterScrolledWindow: public wxScrolledWindow
+{
+public:
+ DECLARE_DYNAMIC_CLASS(wxSplitterScrolledWindow)
+
+ wxSplitterScrolledWindow(wxWindow* parent, wxWindowID id = -1,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& sz = wxDefaultSize,
+ long style = 0);
+
+//// Overrides
+
+//// Events
+
+ void OnScroll(wxScrollWinEvent& event);
+ void OnSize(wxSizeEvent& event);
+
+//// Operations
+
+//// Accessors
+
+//// Data members
+public:
+ DECLARE_EVENT_TABLE()
+};
+
+#endif
+ // _SPLITTREE_H_
--- /dev/null
+# Purpose: makefile for multicell example (BC++ 32bit)
+# Created 2000-07-28
+
+WXDIR = $(WXWIN)
+
+TARGET=mtest
+OBJECTS = $(TARGET).obj
+
+!include $(WXDIR)\src\makeprog.b32
+
--- /dev/null
+# Purpose: makefile for multicell example (BC++ 16bit)
+# Created 2000-07-28
+
+!if "$(WXWIN)" == ""
+!error You must define the WXWIN variable in autoexec.bat, e.g. WXWIN=c:\wx
+!endif
+
+WXDIR = $(WXWIN)
+
+TARGET=mtest
+OBJECTS=$(TARGET).obj ..\src\multicell.obj
+EXTRAINC=-I..\include
+
+!include $(WXDIR)\src\makeprog.bcc
+
--- /dev/null
+# Purpose: makefile for multicell example (VC++ 1.5x)
+# Created 2000-07-28
+
+WXDIR = $(WXWIN)
+
+TARGET=mtest
+OBJECTS = $(TARGET).obj ..\src\multicell.obj
+EXTRAINC=-I..\include
+
+!include $(WXDIR)\src\makeprog.msc
+
--- /dev/null
+# Purpose: makefile for multicell example (Cygwin/Mingw32)
+# Created 2000-07-28
+
+WXDIR = ../../../..
+
+TARGET=mtest
+OBJECTS = $(TARGET).o
+EXTRALIBS=$(WXDIR)/lib/libgizmos.lib
+
+include $(WXDIR)/src/makeprog.g95
+
--- /dev/null
+# Purpose: makefile for multicell example (Symantec C++)
+# Created 2000-07-28
+
+WXDIR = $(WXWIN)
+WXLIB = $(WXDIR)\lib\wx.lib
+INCDIR = $(WXDIR)\include
+INCLUDE=$(INCDIR)
+TARGET=mtest
+OBJECTS = $(TARGET).obj ..\src\multicell.obj
+EXTRAINC=-I..\include
+
+include $(WXDIR)\src\makesc.env
+
+mtest.exe: $(OBJECTS) $(DEFFILE) mtest.res
+ *$(CC) $(LDFLAGS) -o$@ $** $(LIBS)
+ *$(RC) -k mtest.res
+
+sc32.def:
+ echo EXETYPE NT > sc32.def
+ echo SUBSYSTEM WINDOWS >> sc32.def
+
+sc16.def:
+ echo NAME $(TARGET) > sc16.def
+ echo EXETYPE WINDOWS >> sc16.def
+ echo STUB 'WINSTUB.EXE' >> sc16.def
+ echo CODE PRELOAD MOVEABLE DISCARDABLE >> sc16.def
+ echo DATA PRELOAD MOVEABLE MULTIPLE >> sc16.def
+ echo HEAPSIZE 1024 >> sc16.def
+ echo STACKSIZE 8192 >> sc16.def
+
+clean:
+ -del *.obj
+ -del *.exe
+ -del *.res
+ -del *.map
+ -del *.rws
+ -del sc32.def
+ -del sc16.def
+
--- /dev/null
+# Purpose: makefile for multicell example (Salford C++)
+# Created 2000-07-28
+
+PROGRAM = mtest
+OBJECTS = $(PROGRAM).obj ..\src\multicell.obj
+EXTRAINC=-I..\include
+
+include ..\..\src\makeprog.sl
+
+all: wx $(TARGET)
+
+wx:
+ cd $(WXDIR)\src\msw ^ mk32 -f makefile.sl all
+ cd $(WXDIR)\samples\notebook
+
--- /dev/null
+# Purpose: makefile for multicell example (TWIN)
+# Created 2000-07-28
+
+WXDIR = ../..
+
+# All common UNIX compiler flags and options are now in
+# this central makefile.
+include $(WXDIR)/src/maketwin.env
+
+OBJECTS = $(OBJDIR)/mtest.$(OBJSUFF) $(OBJDIR)/multicell.$(OBJSUFF)
+EXTRAINC=-I../include
+
+all: $(OBJDIR) mtest$(GUISUFFIX)$(EXESUFF)
+
+wx:
+
+$(OBJDIR):
+ mkdir $(OBJDIR)
+
+mtest$(GUISUFFIX)$(EXESUFF): $(OBJECTS) $(WXLIB)
+ $(CC) $(LDFLAGS) -o mtest$(GUISUFFIX)$(EXESUFF) $(OBJECTS) $(LDLIBS)
+
+$(OBJDIR)/mtest.$(OBJSUFF): mtest.$(SRCSUFF)
+ $(CC) -c $(CPPFLAGS) -o $@ mtest.$(SRCSUFF)
+
+$(OBJDIR)/multicell.$(OBJSUFF): multicell.$(SRCSUFF)
+ $(CC) -c $(CPPFLAGS) -o $@ multicell.$(SRCSUFF)
+
+mtest.c: mtest.rc
+ $(RESCOMP) $(RCINPUTSWITCH) mtest.rc $(RCOUTPUTSWITCH) mtest.c $(RESFLAGS)
+
+$(OBJDIR)/mtest.$(OBJSUFF): mtest.c
+ $(CC) -c $(CPPFLAGS) -o $@ mtest.c
+
+#$(OBJDIR)/mtest.o: mtest.rc
+# $(RESCOMP) $(RCINPUTSWITCH) mtest.rc $(RCOUTPUTSWITCH) $(OBJDIR)/mtest.o $(RESFLAGS)
+
+clean:
+ rm -f $(OBJECTS) mtest$(GUISUFFIX).exe core *.rsc *.res
--- /dev/null
+# Purpose: makefile for multicell example (Unix)
+# Created 2000-07-28
+
+CC = gcc
+
+PROGRAM = mtest
+
+OBJECTS = $(PROGRAM).o ../src/multicell.o
+EXTRAINC=-I../include
+
+# implementation
+
+.SUFFIXES: .o .cpp
+
+.cpp.o :
+ $(CC) -c `wx-config --cflags` -o $@ $<
+
+all: $(PROGRAM)
+
+$(PROGRAM): $(OBJECTS)
+ $(CC) -o $(PROGRAM) $(OBJECTS) `wx-config --libs`
+
+clean:
+ rm -f *.o $(PROGRAM)
--- /dev/null
+# Makefile : Builds sample (VC++, WIN32)
+# Use FINAL=1 argument to nmake to build final version with no debug info.
+# Created 2000-07-28
+
+# Set WXDIR for your system
+WXDIR = $(WXWIN)
+FINAL=0
+PROGRAM=mtest
+OBJECTS = $(PROGRAM).obj
+
+!if "$(FINAL)" == "0"
+EXTRALIBS=$(WXDIR)\lib\gizmosd.lib
+!else
+EXTRALIBS=$(WXDIR)\lib\gizmos.lib
+!endif
+
+!include $(WXDIR)\src\makeprog.vc
+
+
--- /dev/null
+# Purpose: makefile for multicell example (Watcom)
+# Created 2000-07-28
+
+WXDIR = $(%WXWIN)
+
+PROGRAM = mtest
+OBJECTS = $(PROGRAM).obj ..\src\multicell.obj
+EXTRAINC=-I..\include
+
+!include $(WXDIR)\src\makeprog.wat
+
+
--- /dev/null
+/*
+ * File: mtest.cpp
+ * Purpose: wxMultiCellSizer and wxMultiCellCanvas test
+ * Author: Alex Andruschak
+ * Created: 2000
+ * Updated:
+ * Copyright:
+ */
+
+static const char sccsid[] = "%W% %G%";
+
+#ifdef __GNUG__
+ #pragma implementation
+ #pragma interface
+#endif
+
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+ #include "wx/wx.h"
+#endif
+
+#include "wx/gizmos/multicell.h"
+
+class MyApp: public wxApp
+{public:
+ bool OnInit(void);
+};
+
+class MyFrame: public wxFrame
+{
+
+public:
+ MyFrame(int type, wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size);
+
+ void OnCloseWindow(wxCloseEvent& event);
+ void OnPaint(wxPaintEvent& event);
+ wxMultiCellSizer *sizer;
+
+ DECLARE_EVENT_TABLE()
+};
+
+IMPLEMENT_APP(MyApp)
+
+bool MyApp::OnInit(void)
+{
+ MyFrame *frame = new MyFrame(1, (wxFrame *) NULL, (char *) "wxMultiCellSizer Sample", wxPoint(50, 50), wxDefaultSize); //, wxSize(600, 500));
+
+ frame->Show(TRUE);
+
+ SetTopWindow(frame);
+ frame = new MyFrame(2, (wxFrame *) NULL, (char *) "wxMultiCellCanvas Sample", wxPoint(100, 100), wxSize(600, 500));
+
+ frame->Show(TRUE);
+
+ SetTopWindow(frame);
+ return TRUE;
+}
+
+
+
+MyFrame::MyFrame(int type, wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size):
+wxFrame(frame, -1, title, pos, size, wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL)
+{
+ CreateStatusBar(1);
+ sizer = NULL;
+ if (type == 1)
+ {
+ // create sizer 4 columns 5 rows
+ wxSize aa(4,9);
+ sizer = new wxMultiCellSizer(aa);
+ sizer->SetDefaultCellSize(wxSize(15,15));
+ sizer->SetRowHeight(7,5,TRUE);
+ sizer->SetRowHeight(8,5,FALSE);
+ // add first row
+ sizer->Add(
+ new wxButton( this, -1, "B1 - 0,0, horizontal resizable" ),
+ 0, 0, 0, new wxMultiCellItemHandle(0,0,1,1, wxDefaultSize, wxHORIZENTAL_RESIZABLE, wxSize(2,2)));
+ sizer->Add(
+ new wxButton( this, -1, "B2 - 0,1, vertical resizable" ),
+ 0, 0, 0, new wxMultiCellItemHandle(0,1,1,1, wxDefaultSize, wxVERTICAL_RESIZABLE, wxSize(2, 2)));
+ sizer->Add(
+ new wxButton( this, -1, "B3 - 0,2" ),
+ 0, 0, 0, new wxMultiCellItemHandle(0,2,1,1, wxDefaultSize, wxNOT_RESIZABLE, wxSize(1,1), wxALIGN_CENTER_HORIZONTAL)); //, wxALIGN_CENTER));
+ sizer->Add(
+ new wxStaticText(this, -1, "jbb 0,3, lower-right"),
+ 0, 0, 0, new wxMultiCellItemHandle(0,3,1,1, wxDefaultSize, wxNOT_RESIZABLE, wxSize(1,1), wxALIGN_BOTTOM | wxALIGN_RIGHT));
+
+ // add button for secord row
+ sizer->Add(
+ new wxTextCtrl(this, -1, "Text control - 1,0, 4 cols wide"),
+ 0, 0, 0, new wxMultiCellItemHandle(1,0,1,4));
+
+ // add buttons for next row
+ sizer->Add(
+ new wxButton( this, -1, "B6 - 2,0, 2 cols wide" ),
+ 0, 0, 0, new wxMultiCellItemHandle(2,0,1,2));
+ sizer->Add(
+ new wxButton( this, -1, "B7 - 2,3" ),
+ 0, 0, 0, new wxMultiCellItemHandle(2,3,1,1));
+
+ // and last additions
+ sizer->Add(
+ new wxButton( this, -1, "B8 - 3,0, 4 rows high, vert resizable" ),
+ 0, 0, 0, new wxMultiCellItemHandle(3,0,4,1,wxDefaultSize, wxVERTICAL_RESIZABLE));
+ sizer->Add(
+ new wxButton( this, -1, "B9 - 3,2, 2 cols wide, vert resizable" ),
+ 0, 0, 0, new wxMultiCellItemHandle(3,2,1,2,wxDefaultSize, wxVERTICAL_RESIZABLE));
+ sizer->Add(
+ new wxButton( this, -1, "B10 - 4,1, 3 cols wide, vert resizable" ),
+ 0, 0, 0, new wxMultiCellItemHandle(4,1,1,3,wxDefaultSize, wxVERTICAL_RESIZABLE));
+
+ sizer->Add(
+ new wxButton( this, -1, "B11 - 5,1, 3 cols wide" ),
+ 0, 0, 0, new wxMultiCellItemHandle(5,1,1,3));
+
+ sizer->Add(
+ new wxButton( this, -1, "B12 - 6,1, 3 cols wide" ),
+ 0, 0, 0, new wxMultiCellItemHandle(6,1,1,3));
+
+ sizer->Add(
+ new wxButton( this, -1, "B13 - 7,1, 2 cols wide" ),
+ 0, 0, 0, new wxMultiCellItemHandle(7,1,1,2));
+
+ sizer->Add(
+ new wxButton( this, -1, "B14 - 8,1, 3 cols wide" ),
+ 0, 0, 0, new wxMultiCellItemHandle(8,1,1,3));
+
+ SetAutoLayout( TRUE );
+// sizer->SetMinSize(sizer->CalcMin());
+ SetSizer( sizer );
+ wxSize s = sizer->CalcMin();
+ wxSize c = GetSize() - GetClientSize();
+ SetSizeHints(s.GetWidth() + c.GetWidth() , s.GetHeight() + c.GetHeight());
+ sizer->EnableGridLines(this);
+ }
+ else
+ {
+ // create sizer 4 columns 5 rows
+ wxMultiCellCanvas *sizer = new wxMultiCellCanvas(this, 5,5);
+
+ // add first row
+ sizer->Add(
+ new wxButton( this, -1, "Button 1" ),
+ 0, 0);
+ sizer->Add(
+ new wxButton( this, -1, "Button 2" ),
+ 0, 1);
+ sizer->Add(
+ new wxButton( this, -1, "Button 3" ),
+ 0, 2);
+ sizer->Add(
+ new wxStaticText(this, -1, "jbb test"),
+ 0, 3);
+
+ sizer->Add(
+ new wxStaticText(this, -1, "jbb test 2"),
+ 0, 4);
+
+ // add button for secord row
+ sizer->Add(
+ new wxTextCtrl(this, -1, "Text control"),
+ 1, 0);
+
+ // add buttons for next row
+ sizer->Add(
+ new wxButton( this, -1, "Button 6" ),
+ 2, 0);
+ sizer->Add(
+ new wxButton( this, -1, "Button 7" ),
+ 2, 3);
+
+ // and last additions
+ sizer->Add(
+ new wxButton( this, -1, "Button 8" ),
+ 3, 0);
+ sizer->Add(
+ new wxButton( this, -1, "Button 9" ),
+ 3, 1);
+ sizer->Add(
+ new wxButton( this, -1, "Button 10" ),
+ 4, 1);
+
+ sizer->CalculateConstraints();
+ SetSizer( sizer );
+ SetAutoLayout( TRUE );
+ }
+}
+// Define the repainting behaviour
+
+
+BEGIN_EVENT_TABLE(MyFrame, wxFrame)
+ EVT_PAINT(MyFrame::OnPaint)
+ EVT_CLOSE(MyFrame::OnCloseWindow)
+ END_EVENT_TABLE()
+
+void MyFrame::OnPaint(wxPaintEvent& WXUNUSED(event) )
+{
+ wxPaintDC dc(this);
+
+ if (sizer)
+ {
+ sizer->OnPaint(dc);
+ }
+}
+
+void MyFrame::OnCloseWindow(wxCloseEvent& event)
+{
+ Destroy();
+}
+
--- /dev/null
+#include "wx/msw/wx.rc"
+
+
--- /dev/null
+[COMPILER]
+version=5.0b
+compile=concur|capture|:Compile:&Compile,gcc
+make=concur|capture|:Build:&Build,make
+rebuild=concur|capture|:Rebuild:&Rebuild,
+debug=:Debug:&Debug,gdb
+execute=:Execute:E&xecute,
+user1=hide|:User 1:User 1,
+user2=hide|:User 2:User 2,
+workingdir=.
+includedirs=
+reffile=
+MACRO=\n
+[FILES]
+mtest.cpp
+multicell.cpp
+multicell.h
+[ASSOCIATION]
--- /dev/null
+#
+# File: makefile.unx
+# Author: Julian Smart
+# Created: 1998
+# Updated:
+# Copyright: (c) 1998 Julian Smart
+#
+# "%W% %G%"
+#
+# Makefile for minimal example (UNIX).
+
+top_srcdir = @top_srcdir@/..
+top_builddir = ../..
+program_dir = samples/minimal
+
+PROGRAM=minimal
+
+OBJECTS=$(PROGRAM).o
+
+include ../../src/makeprog.env
+
--- /dev/null
+# Microsoft Developer Studio Project File - Name="TreeVC" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=TreeVC - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "TreeVC.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "TreeVC.mak" CFG="TreeVC - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "TreeVC - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "TreeVC - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE "TreeVC - Win32 Debug DLL" (based on "Win32 (x86) Application")
+!MESSAGE "TreeVC - Win32 Release DLL" (based on "Win32 (x86) Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "TreeVC - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O1 /Ob2 /I "..\..\..\..\include" /I "..\..\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "__WXMSW__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib winmm.lib /nologo /subsystem:windows /machine:I386
+# ADD LINK32 wx.lib xpm.lib png.lib zlib.lib jpeg.lib tiff.lib gizmos.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib winmm.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libc.lib" /nodefaultlib:"libci.lib" /nodefaultlib:"msvcrtd.lib" /out:"Release/tree.exe" /libpath:"d:\wx2\wxWindows\lib"
+
+!ELSEIF "$(CFG)" == "TreeVC - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\..\include" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D "__WXMSW__" /D DEBUG=1 /D "__WXDEBUG__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /Yu"wx/wxprec.h" /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib winmm.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 wxd.lib xpmd.lib pngd.lib zlibd.lib jpegd.lib tiffd.lib gizmosd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib winmm.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcid.lib" /nodefaultlib:"msvcrt.lib" /out:"Debug/tree.exe" /pdbtype:sept /libpath:"d:\wx2\wxWindows\lib"
+
+!ELSEIF "$(CFG)" == "TreeVC - Win32 Debug DLL"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "DebugDLL"
+# PROP BASE Intermediate_Dir "DebugDLL"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "DebugDLL"
+# PROP Intermediate_Dir "DebugDLL"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\..\include" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D "__WXMSW__" /D DEBUG=1 /D "__WXDEBUG__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /D WXUSINGDLL=1 /Yu"wx/wxprec.h" /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib winmm.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 wxdlld.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib winmm.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd.lib" /nodefaultlib:"libcid.lib" /out:"DebugDLL/tree.exe" /pdbtype:sept /libpath:"../../lib" /libpath:"../../contrib/lib"
+
+!ELSEIF "$(CFG)" == "TreeVC - Win32 Release DLL"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "ReleaseDLL"
+# PROP BASE Intermediate_Dir "ReleaseDLL"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "ReleaseDLL"
+# PROP Intermediate_Dir "ReleaseDLL"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O1 /Ob2 /I "..\..\..\..\include" /I "..\..\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "__WXMSW__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /D WXUSINGDLL=1 /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib winmm.lib /nologo /subsystem:windows /machine:I386
+# ADD LINK32 wxdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib winmm.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libc.lib" /nodefaultlib:"libci.lib" /out:"ReleaseDLL/tree.exe" /libpath:"../../lib" /libpath:"../../contrib/lib"
+
+!ENDIF
+
+# Begin Target
+
+# Name "TreeVC - Win32 Release"
+# Name "TreeVC - Win32 Debug"
+# Name "TreeVC - Win32 Debug DLL"
+# Name "TreeVC - Win32 Release DLL"
+# Begin Source File
+
+SOURCE=.\tree.cpp
+
+!IF "$(CFG)" == "TreeVC - Win32 Release"
+
+# ADD CPP /I "..\..\..\include"
+# SUBTRACT CPP /I "..\..\include"
+
+!ELSEIF "$(CFG)" == "TreeVC - Win32 Debug"
+
+# ADD CPP /I "..\..\..\include"
+# SUBTRACT CPP /I "..\..\include" /YX /Yc /Yu
+
+!ELSEIF "$(CFG)" == "TreeVC - Win32 Debug DLL"
+
+# SUBTRACT BASE CPP /YX /Yc /Yu
+# ADD CPP /I "..\..\..\include"
+# SUBTRACT CPP /I "..\..\include" /YX /Yc /Yu
+
+!ELSEIF "$(CFG)" == "TreeVC - Win32 Release DLL"
+
+# ADD CPP /I "..\..\..\include"
+# SUBTRACT CPP /I "..\..\include"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\tree.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\tree.rc
+# ADD BASE RSC /l 0x809
+# ADD RSC /l 0x809 /i "d:\wx2\wxWindows\include"
+# End Source File
+# End Target
+# End Project
--- /dev/null
+Microsoft Developer Studio Workspace File, Format Version 5.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "TreeVC"=.\TreeVC.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
--- /dev/null
+#
+# File: makefile.b32
+# Author: Julian Smart
+# Created: 1999
+# Updated:
+# Copyright:
+#
+# Makefile : Builds sample for 32-bit BC++
+
+WXDIR = $(WXWIN)
+
+TARGET=minimal
+OBJECTS = $(TARGET).obj
+
+!include $(WXDIR)\src\makeprog.b32
+
--- /dev/null
+#
+# File: makefile.bcc
+# Author: Julian Smart
+# Created: 1998
+# Updated:
+#
+# Builds a BC++ 16-bit sample
+
+!if "$(WXWIN)" == ""
+!error You must define the WXWIN variable in autoexec.bat, e.g. WXWIN=c:\wx
+!endif
+
+WXDIR = $(WXWIN)
+
+TARGET=minimal
+OBJECTS=$(TARGET).obj
+
+!include $(WXDIR)\src\makeprog.bcc
+
--- /dev/null
+#
+# File: makefile.dos
+# Author: Julian Smart
+# Created: 1998
+# Updated:
+#
+# Makefile : Builds 16-bit sample, VC++ 1.5
+# Use FINAL=1 argument to nmake to build final version with no debugging
+# info
+
+WXDIR = $(WXWIN)
+
+TARGET=minimal
+OBJECTS=$(TARGET).obj
+
+!include $(WXDIR)\src\makeprog.msc
+
--- /dev/null
+#
+# File: makefile.g95
+# Author: Julian Smart
+# Created: 1999
+# Updated:
+# Copyright: (c) Julian Smart, 1999
+#
+# Makefile for wxWindows sample (Cygwin/Mingw32).
+
+WXDIR = ../..
+
+TARGET=minimal
+OBJECTS = $(TARGET).o
+
+include $(WXDIR)/src/makeprog.g95
+
--- /dev/null
+# Symantec C++ makefile
+
+WXDIR = $(WXWIN)
+WXLIB = $(WXDIR)\lib\wx.lib
+INCDIR = $(WXDIR)\include
+INCLUDE=$(INCDIR)
+TARGET=minimal
+
+include $(WXDIR)\src\makesc.env
+
+minimal.exe: minimal.obj $(DEFFILE) minimal.res
+ *$(CC) $(LDFLAGS) -o$@ $** $(LIBS)
+ *$(RC) -k minimal.res
+
+sc32.def:
+ echo EXETYPE NT > sc32.def
+ echo SUBSYSTEM WINDOWS >> sc32.def
+
+sc16.def:
+ echo NAME $(TARGET) > sc16.def
+ echo EXETYPE WINDOWS >> sc16.def
+ echo STUB 'WINSTUB.EXE' >> sc16.def
+ echo CODE PRELOAD MOVEABLE DISCARDABLE >> sc16.def
+ echo DATA PRELOAD MOVEABLE MULTIPLE >> sc16.def
+ echo HEAPSIZE 1024 >> sc16.def
+ echo STACKSIZE 8192 >> sc16.def
+
+clean:
+ -del *.obj
+ -del *.exe
+ -del *.res
+ -del *.map
+ -del *.rws
+ -del sc32.def
+ -del sc16.def
+
--- /dev/null
+#
+# File: makefile.sl
+# Author: Julian Smart
+# Created: 1998
+#
+# Makefile : Builds a wxWindows sample for Salford C++, WIN32
+
+PROGRAM = minimal
+OBJECTS = $(PROGRAM).obj
+
+include ..\..\src\makeprog.sl
+
+all: wx $(TARGET)
+
+wx:
+ cd $(WXDIR)\src\msw ^ mk32 -f makefile.sl all
+ cd $(WXDIR)\samples\minimal
+
--- /dev/null
+#
+# File: makefile.unx
+# Author: Julian Smart
+# Created: 1993
+# Updated:
+# Copyright: (c) 1993, AIAI, University of Edinburgh
+#
+# "%W% %G%"
+#
+# Makefile for minimal example (UNIX).
+
+WXDIR = ../..
+
+# All common UNIX compiler flags and options are now in
+# this central makefile.
+include $(WXDIR)/src/maketwin.env
+
+OBJECTS = $(OBJDIR)/minimal.$(OBJSUFF) $(OBJDIR)/minimal_resources.$(OBJSUFF)
+
+all: $(OBJDIR) minimal$(GUISUFFIX)$(EXESUFF)
+
+wx:
+
+$(OBJDIR):
+ mkdir $(OBJDIR)
+
+minimal$(GUISUFFIX)$(EXESUFF): $(OBJECTS) $(WXLIB)
+ $(CC) $(LDFLAGS) -o minimal$(GUISUFFIX)$(EXESUFF) $(OBJECTS) $(LDLIBS)
+
+$(OBJDIR)/minimal.$(OBJSUFF): minimal.$(SRCSUFF)
+ $(CC) -c $(CPPFLAGS) -o $@ minimal.$(SRCSUFF)
+
+minimal_resources.c: minimal.rc
+ $(RESCOMP) $(RCINPUTSWITCH) minimal.rc $(RCOUTPUTSWITCH) minimal_resources.c $(RESFLAGS)
+
+$(OBJDIR)/minimal_resources.$(OBJSUFF): minimal_resources.c
+ $(CC) -c $(CPPFLAGS) -o $@ minimal_resources.c
+
+#$(OBJDIR)/minimal_resources.o: minimal.rc
+# $(RESCOMP) $(RCINPUTSWITCH) minimal.rc $(RCOUTPUTSWITCH) $(OBJDIR)/minimal_resources.o $(RESFLAGS)
+
+clean:
+ rm -f $(OBJECTS) minimal$(GUISUFFIX).exe core *.rsc *.res
--- /dev/null
+#
+# 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 = minimal
+
+OBJECTS = $(PROGRAM).o
+
+# implementation
+
+.SUFFIXES: .o .cpp
+
+.cpp.o :
+ $(CC) -c `wx-config --cflags` -o $@ $<
+
+all: $(PROGRAM)
+
+$(PROGRAM): $(OBJECTS)
+ $(CC) -o $(PROGRAM) $(OBJECTS) `wx-config --libs`
+
+clean:
+ rm -f *.o $(PROGRAM)
--- /dev/null
+#
+# File: makefile.va
+# Author: David Webster
+# Created: 1999
+# Updated:
+# Copyright: (c) David Webster
+#
+# Makefile : Builds sample (VisualAgeC++ V3.0, OS/2 PM)
+# Use FINAL=1 argument to nmake to build final version with no debug info.
+
+# Set WXDIR for your system
+WXDIR = $(WXWIN)
+
+WXUSINGDLL=0
+
+!include $(WXDIR)\src\makeva.env
+
+PROGRAM=$D\minimal
+OBJECTS = $(PROGRAM).obj
+
+!if [md $D]
+!endif
+
+!include $(WXDIR)\src\makeprog.va
+
--- /dev/null
+# Makefile : Builds sample (VC++, WIN32)
+# Use FINAL=1 argument to nmake to build final version with no debug info.
+# Created 2000-07-28
+
+# Set WXDIR for your system
+WXDIR = $(WXWIN)
+FINAL=0
+PROGRAM=tree
+OBJECTS = $(PROGRAM).obj
+
+!if "$(FINAL)" == "0"
+EXTRALIBS=$(WXDIR)\lib\gizmosd.lib
+!else
+EXTRALIBS=$(WXDIR)\lib\gizmos.lib
+!endif
+
+!include $(WXDIR)\src\makeprog.vc
+
+
--- /dev/null
+#
+# Makefile for WATCOM
+#
+# Created by Julian Smart, January 1999
+#
+#
+
+WXDIR = $(%WXWIN)
+
+PROGRAM = minimal
+OBJECTS = $(PROGRAM).obj
+
+!include $(WXDIR)\src\makeprog.wat
+
+
--- /dev/null
+/* XPM */
+static char *mondrian_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 6 1",
+" c Black",
+". c Blue",
+"X c #00bf00",
+"o c Red",
+"O c Yellow",
+"+ c Gray100",
+/* pixels */
+" ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" "
+};
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: tree.cpp
+// Purpose: Minimal wxWindows sample
+// Author: Julian Smart
+// Modified by:
+// Created: 04/01/98
+// RCS-ID: $Id$
+// Copyright: (c) Julian Smart
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+#ifdef __GNUG__
+ #pragma implementation "tree.cpp"
+ #pragma interface "tree.cpp"
+#endif
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+// for all others, include the necessary headers (this file is usually all you
+// need because it includes almost all "standard" wxWindows headers)
+#ifndef WX_PRECOMP
+ #include "wx/wx.h"
+#endif
+
+#include "wx/imaglist.h"
+#include "tree.h"
+
+// ----------------------------------------------------------------------------
+// resources
+// ----------------------------------------------------------------------------
+// the application icon
+#if defined(__WXGTK__) || defined(__WXMOTIF__)
+ #include "mondrian.xpm"
+#endif
+
+// ----------------------------------------------------------------------------
+// event tables and other macros for wxWindows
+// ----------------------------------------------------------------------------
+
+// the event tables connect the wxWindows events with the functions (event
+// handlers) which process them. It can be also done at run-time, but for the
+// simple menu events like this the static method is much simpler.
+BEGIN_EVENT_TABLE(MyFrame, wxFrame)
+ EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
+ EVT_MENU(Minimal_About, MyFrame::OnAbout)
+END_EVENT_TABLE()
+
+// Create a new application object: this macro will allow wxWindows to create
+// the application object during program execution (it's better than using a
+// static object for many reasons) and also declares the accessor function
+// wxGetApp() which will return the reference of the right type (i.e. MyApp and
+// not wxApp)
+IMPLEMENT_APP(MyApp)
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// the application class
+// ----------------------------------------------------------------------------
+
+// 'Main program' equivalent: the program execution "starts" here
+bool MyApp::OnInit()
+{
+ // create the main application window
+ MyFrame *frame = new MyFrame("Tree Testing",
+ wxPoint(50, 50), wxSize(450, 340));
+
+ // and show it (the frames, unlike simple controls, are not shown when
+ // created initially)
+ frame->Show(TRUE);
+
+ // success: wxApp::OnRun() will be called which will enter the main message
+ // loop and the application will run. If we returned FALSE here, the
+ // application would exit immediately.
+ return TRUE;
+}
+
+// ----------------------------------------------------------------------------
+// main frame
+// ----------------------------------------------------------------------------
+
+// frame constructor
+MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
+ : wxFrame((wxFrame *)NULL, idMAIN_FRAME, title, pos, size)
+{
+ m_splitter = NULL;
+ m_scrolledWindow = NULL;
+ m_tree = NULL;
+ m_valueWindow = NULL;
+#ifdef __WXMAC__
+ // we need this in order to allow the about menu relocation, since ABOUT is
+ // not the default id of the about menu
+ wxApp::s_macAboutMenuItemId = Minimal_About;
+#endif
+
+ m_scrolledWindow = new wxSplitterScrolledWindow(this, idSCROLLED_WINDOW, wxDefaultPosition,
+ wxDefaultSize, wxNO_BORDER | wxCLIP_CHILDREN | wxVSCROLL);
+ m_splitter = new wxThinSplitterWindow(m_scrolledWindow, idSPLITTER_WINDOW, wxDefaultPosition,
+ wxDefaultSize, wxSP_3DBORDER | wxCLIP_CHILDREN /* | wxSP_LIVE_UPDATE */);
+ m_splitter->SetSashSize(2);
+ m_tree = new TestTree(m_splitter, idTREE_CTRL, wxDefaultPosition,
+ wxDefaultSize, wxTR_HAS_BUTTONS | wxTR_NO_LINES | wxNO_BORDER );
+ m_valueWindow = new TestValueWindow(m_splitter, idVALUE_WINDOW, wxDefaultPosition,
+ wxDefaultSize, wxNO_BORDER);
+ m_splitter->SplitVertically(m_tree, m_valueWindow);
+ //m_splitter->AdjustScrollbars();
+ m_splitter->SetSashPosition(200);
+ m_scrolledWindow->SetTargetWindow(m_tree);
+
+ m_scrolledWindow->EnableScrolling(FALSE, FALSE);
+
+ // set the frame icon
+ SetIcon(wxICON(mondrian));
+
+ // create a menu bar
+ wxMenu *menuFile = new wxMenu("", wxMENU_TEAROFF);
+
+ // the "About" item should be in the help menu
+ wxMenu *helpMenu = new wxMenu;
+ helpMenu->Append(Minimal_About, "&About...\tCtrl-A", "Show about dialog");
+
+ menuFile->Append(Minimal_Quit, "E&xit\tAlt-X", "Quit this program");
+
+ // now append the freshly created menu to the menu bar...
+ wxMenuBar *menuBar = new wxMenuBar();
+ menuBar->Append(menuFile, "&File");
+ menuBar->Append(helpMenu, "&Help");
+
+ // ... and attach this menu bar to the frame
+ SetMenuBar(menuBar);
+}
+
+
+// event handlers
+
+void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
+{
+ // TRUE is to force the frame to close
+ Close(TRUE);
+}
+
+void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
+{
+ wxString msg;
+ msg.Printf( _T("This is the about dialog of tree sample.\n")
+ _T("Welcome to %s"), wxVERSION_STRING);
+
+ wxMessageBox(msg, "About Tree Test", wxOK | wxICON_INFORMATION, this);
+}
+
+/*
+ * TesTree
+ */
+
+IMPLEMENT_CLASS(TestTree, wxRemotelyScrolledTreeCtrl)
+
+BEGIN_EVENT_TABLE(TestTree, wxRemotelyScrolledTreeCtrl)
+END_EVENT_TABLE()
+
+TestTree::TestTree(wxWindow* parent, wxWindowID id, const wxPoint& pt,
+ const wxSize& sz, long style):
+ wxRemotelyScrolledTreeCtrl(parent, id, pt, sz, style)
+{
+ m_imageList = new wxImageList(16, 16, TRUE);
+#if !defined(__WXMSW__) // || wxUSE_XPM_IN_MSW
+ m_imageList->Add(wxIcon(icon1_xpm));
+ m_imageList->Add(wxIcon(icon2_xpm));
+ m_imageList->Add(wxIcon(icon3_xpm));
+ m_imageList->Add(wxIcon(icon4_xpm));
+ m_imageList->Add(wxIcon(icon5_xpm));
+ m_imageList->Add(wxIcon(icon6_xpm));
+ m_imageList->Add(wxIcon(icon7_xpm));
+ m_imageList->Add(wxIcon(icon8_xpm));
+#elif defined(__WXMSW__)
+ m_imageList->Add(wxIcon(wxT("wxICON_SMALL_CLOSED_FOLDER"), wxBITMAP_TYPE_ICO_RESOURCE));
+ m_imageList->Add(wxIcon(wxT("wxICON_SMALL_OPEN_FOLDER"), wxBITMAP_TYPE_ICO_RESOURCE));
+ m_imageList->Add(wxIcon(wxT("wxICON_SMALL_FILE"), wxBITMAP_TYPE_ICO_RESOURCE));
+ m_imageList->Add(wxIcon(wxT("wxICON_SMALL_COMPUTER"), wxBITMAP_TYPE_ICO_RESOURCE));
+ m_imageList->Add(wxIcon(wxT("wxICON_SMALL_DRIVE"), wxBITMAP_TYPE_ICO_RESOURCE));
+ m_imageList->Add(wxIcon(wxT("wxICON_SMALL_CDROM"), wxBITMAP_TYPE_ICO_RESOURCE));
+ m_imageList->Add(wxIcon(wxT("wxICON_SMALL_FLOPPY"), wxBITMAP_TYPE_ICO_RESOURCE));
+ m_imageList->Add(wxIcon(wxT("wxICON_SMALL_REMOVEABLE"), wxBITMAP_TYPE_ICO_RESOURCE));
+#else
+#error "Sorry, we don't have icons available for this platforms."
+#endif
+ SetImageList(m_imageList);
+
+
+ // Add some dummy items
+ wxTreeItemId rootId = AddRoot(_("Root"), 3, -1);
+ int i;
+ for (i = 1; i <= 20; i++)
+ {
+ wxString label;
+ label.Printf(wxT("Item %d"), i);
+ wxTreeItemId id = AppendItem(rootId, label, 0);
+ SetItemImage( id, 1, wxTreeItemIcon_Expanded );
+
+ int j;
+ for (j = 0; j < 10; j++)
+ AppendItem(id, _("Child"), 2);
+ }
+ Expand(rootId);
+}
+
+TestTree::~TestTree()
+{
+ SetImageList(NULL);
+ delete m_imageList;
+}
+
+/*
+ * TestValueWindow
+ */
+
+//IMPLEMENT_CLASS(TestValueWindow, wxWindow)
+
+BEGIN_EVENT_TABLE(TestValueWindow, wxWindow)
+ EVT_SIZE(TestValueWindow::OnSize)
+END_EVENT_TABLE()
+
+TestValueWindow::TestValueWindow(wxWindow* parent, wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& sz,
+ long style):
+ wxWindow(parent, id, pos, sz, style)
+{
+ SetBackgroundColour(* wxWHITE);
+}
+
+void TestValueWindow::OnSize(wxSizeEvent& event)
+{
+}
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: tree.h
+// Purpose: Testing tree functionality
+// Author: Julian Smart
+// Modified by:
+// Created: 04/01/98
+// RCS-ID: $Id$
+// Copyright: (c) Julian Smart
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _TREE_H_
+#define _TREE_H_
+
+#include "wx/wx.h"
+#include "wx/gizmos/splittree.h"
+
+class TestValueWindow;
+
+// Define a new application type, each program should derive a class from wxApp
+class MyApp : public wxApp
+{
+public:
+ // override base class virtuals
+ // ----------------------------
+
+ // this one is called on application startup and is a good place for the app
+ // initialization (doing it here and not in the ctor allows to have an error
+ // return: if OnInit() returns false, the application terminates)
+ virtual bool OnInit();
+};
+
+// Define a new frame type: this is going to be our main frame
+class MyFrame : public wxFrame
+{
+public:
+ // ctor(s)
+ MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
+
+ // event handlers (these functions should _not_ be virtual)
+ void OnQuit(wxCommandEvent& event);
+ void OnAbout(wxCommandEvent& event);
+
+protected:
+ wxRemotelyScrolledTreeCtrl* m_tree;
+ wxThinSplitterWindow* m_splitter;
+ wxSplitterScrolledWindow* m_scrolledWindow;
+ TestValueWindow* m_valueWindow;
+
+private:
+ // any class wishing to process wxWindows events must use this macro
+ DECLARE_EVENT_TABLE()
+};
+
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+// IDs for the controls and the menu commands
+enum
+{
+ // menu items
+ Minimal_Quit = 100,
+ Minimal_About
+};
+
+#define idTREE_CTRL 2000
+#define idSPLITTER_WINDOW 2001
+#define idVALUE_WINDOW 2002
+#define idMAIN_FRAME 2003
+#define idSCROLLED_WINDOW 2004
+
+class TestTree: public wxRemotelyScrolledTreeCtrl
+{
+ DECLARE_CLASS(TestTree)
+public:
+ TestTree(wxWindow* parent, wxWindowID id, const wxPoint& pt = wxDefaultPosition,
+ const wxSize& sz = wxDefaultSize, long style = wxTR_HAS_BUTTONS);
+ ~TestTree();
+ DECLARE_EVENT_TABLE()
+protected:
+ wxImageList* m_imageList;
+};
+
+class TestValueWindow: public wxWindow
+{
+public:
+ TestValueWindow(wxWindow* parent, wxWindowID id = -1,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& sz = wxDefaultSize,
+ long style = 0);
+
+//// Overrides
+
+//// Events
+ void OnSize(wxSizeEvent& event);
+
+//// Data members
+protected:
+
+ DECLARE_EVENT_TABLE()
+};
+
+
+
+#endif
+ // _TREE_H_
--- /dev/null
+# Microsoft Developer Studio Project File - Name="GizmosVC" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Static Library" 0x0104
+
+CFG=GizmosVC - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "GizmosVC.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "GizmosVC.mak" CFG="GizmosVC - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "GizmosVC - Win32 Release" (based on "Win32 (x86) Static Library")
+!MESSAGE "GizmosVC - Win32 Debug" (based on "Win32 (x86) Static Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "GizmosVC - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O1 /Ob2 /I "../../../include" /I "../../include" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "__WXMSW__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x809
+# ADD RSC /l 0x809
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo /out:"..\..\lib\gizmos.lib"
+
+!ELSEIF "$(CFG)" == "GizmosVC - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /GX /Z7 /Od /I "../../../include" /I "../../include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D "__WXMSW__" /D DEBUG=1 /D "__WXDEBUG__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x809
+# ADD RSC /l 0x809
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo /out:"..\..\lib\gizmosd.lib"
+
+!ENDIF
+
+# Begin Target
+
+# Name "GizmosVC - Win32 Release"
+# Name "GizmosVC - Win32 Debug"
+# Begin Group "Headers"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\include\wx\gizmos\multicell.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\wx\gizmos\splittree.h
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=.\multicell.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\splittree.cpp
+# End Source File
+# End Target
+# End Project
--- /dev/null
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "GizmosVC"=.\GizmosVC.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
--- /dev/null
+# $Id$
+
+top_srcdir = @top_srcdir@/..
+top_builddir = ../../..
+libsrc_dir = contrib/src/gizmos
+
+TARGET_LIBNAME=libgizmos
+
+LIBVERSION_CURRENT=1
+LIBVERSION_REVISION=0
+LIBVERSION_AGE=0
+
+HEADER_PATH=$(top_srcdir)/contrib/include/wx
+HEADER_SUBDIR=gizmos
+
+HEADERS=multicell.h gizmos.h
+
+OBJECTS=multicell.o gizmos.o
+
+APPEXTRADEFS=-I$(top_srcdir)/contrib/include
+
+include $(top_builddir)/src/makelib.env
+
--- /dev/null
+#
+# File: makefile.b32
+# Author: Julian Smart
+# Created: 1999
+# Updated:
+# Copyright:
+#
+# Makefile : Builds Gizmos library for 32-bit BC++
+
+WXDIR = $(WXWIN)
+
+LIBTARGET=$(WXDIR)\lib\gizmos.lib
+
+OBJECTS = multicell.obj splittree.obj
+
+!include $(WXDIR)\src\makelib.b32
+
--- /dev/null
+#
+# File: makefile.bcc
+# Author: Julian Smart
+# Created: 1998
+# Updated:
+#
+# Builds Gizmos library for BC++, 16-bit
+
+!if "$(WXWIN)" == ""
+!error You must define the WXWIN variable in autoexec.bat, e.g. WXWIN=c:\wx
+!endif
+
+WXDIR = $(WXWIN)
+
+LIBTARGET=$(WXDIR)\lib\gizmos.lib
+
+OBJECTS = basic.obj basic2.obj canvas.obj ogldiag.obj lines.obj misc.obj divided.obj constrnt.obj\
+ composit.obj drawn.obj bmpshape.obj mfutils.obj
+
+!include $(WXDIR)\src\makelib.bcc
+
--- /dev/null
+#
+# File: makefile.g95
+# Author: Julian Smart
+# Created: 1999
+# Updated:
+# Copyright: (c) Julian Smart, 1999
+#
+# Makefile for wxWindows Gizmos library Cygwin/Mingw32).
+
+WXDIR = ../../..
+
+LIBTARGET=$(WXDIR)/lib/libgizmos.a
+OBJECTS = multicell.o splittree.o
+
+include $(WXDIR)/src/makelib.g95
+
--- /dev/null
+#
+# File: makefile.unx
+# Author: Julian Smart
+# Created: 1998
+# Updated:
+# Copyright: (c) 1998
+#
+#
+# Makefile for Gizmos library, Unix
+
+include ../../src/make.env
+
+GIZMOSLIB=$(WXDIR)/lib/libgizmos$(GUISUFFIX).a
+
+LIB_CPP_SRC=\
+\
+ multicell.o\
+ splittree.o
+
+all: $(GIZMOSLIB)
+
+# Define library objects
+OBJECTS=\
+ $(LIB_CPP_SRC:.cpp=.o)
+
+$(GIZMOSLIB) : $(OBJECTS)
+ ar $(AROPTIONS) $@ $(OBJECTS)
+ $(RANLIB) $@
+
+clean:
+ rm -f $(OBJECTS) $(GIZMOSLIB)
+
--- /dev/null
+
+# File: makefile.vc
+# 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)
+GIZMOSDIR = $(WXDIR)\contrib\src\gizmos
+GIZMOSINC = $(WXDIR)\contrib\include\wx\gizmos
+THISDIR = $(WXDIR)\contrib\src\gizmos
+EXTRAFLAGS=/DPROLOGIO=1
+DOCDIR=$(WXDIR)\contrib\docs
+LOCALDOCDIR=$(WXDIR)\contrib\docs\latex\gizmos
+
+!include $(WXDIR)\src\makevc.env
+
+OBJECTS = $(D)\multicell.obj $(D)\splittree.obj
+
+LIBTARGET=$(WXDIR)\lib\gizmos$(LIBEXT).lib
+
+all: $(D) $(LIBTARGET)
+
+$(D) :
+ mkdir $(D)
+
+wx:
+ cd $(WXDIR)\src\msw
+ nmake -f makefile.vc FINAL=$(FINAL)
+ cd $(THISDIR)
+
+wxclean:
+ cd $(WXDIR)\src\msw
+ nmake -f makefile.vc clean
+ cd $(THISDIR)
+
+$(LIBTARGET): $(OBJECTS)
+ -erase $(LIBTARGET)
+ $(implib) @<<
+-out:$(LIBTARGET)
+-machine:$(CPU)
+$(OBJECTS)
+<<
+
+$(D)\multicell.obj: multicell.$(SRCSUFF)
+ cl @<<
+$(CPPFLAGS) /c /Fo$@ /Tp $(*B).$(SRCSUFF)
+<<
+
+$(D)\splittree.obj: splittree.$(SRCSUFF)
+ cl @<<
+$(CPPFLAGS) /c /Fo$@ /Tp $(*B).$(SRCSUFF)
+<<
+
+clean:
+ -erase $(D)\*.obj
+ -erase *.sbr
+ -erase *.exe
+ -erase *.res
+ -erase *.map
+ -erase *.pdb
+ -erase $(LIBTARGET)
+
+DOCSOURCES=$(LOCALDOCDIR)\gizmos.tex \
+ $(LOCALDOCDIR)\bugs.tex $(LOCALDOCDIR)\changes.tex\
+ $(LOCALDOCDIR)\classes.tex $(LOCALDOCDIR)\intro.tex\
+ $(LOCALDOCDIR)\topics.tex $(LOCALDOCDIR)\sample.tex
+
+html: $(DOCDIR)\html\gizmos\gizmos.htm
+htmlhelp: $(DOCDIR)\htmlhelp\gizmos.chm
+htb: $(DOCDIR)\htb\gizmos.htb
+hlp: $(DOCDIR)\winhelp\gizmos.hlp
+pdfrtf: $(DOCDIR)\pdf\gizmos.rtf
+ps: $(DOCDIR)\ps\gizmos.ps
+
+touchmanual:
+ touch $(LOCALDOCDIR)\gizmos.tex
+
+
+$(DOCDIR)\winhelp\gizmos.hlp: $(LOCALDOCDIR)\gizmos.rtf $(LOCALDOCDIR)\gizmos.hpj
+ cd $(LOCALDOCDIR)
+ -erase gizmos.ph
+ hc gizmos
+ move gizmos.hlp $(DOCDIR)\winhelp\gizmos.hlp
+ move gizmos.cnt $(DOCDIR)\winhelp\gizmos.cnt
+ cd $(THISDIR)
+
+$(LOCALDOCDIR)\gizmos.rtf: $(DOCSOURCES)
+ cd $(LOCALDOCDIR)
+ -start $(WAITFLAG) tex2rtf $(LOCALDOCDIR)\gizmos.tex $(LOCALDOCDIR)\gizmos.rtf -twice -winhelp
+ cd $(THISDIR)
+
+$(DOCDIR)\pdf\gizmos.rtf: $(DOCSOURCES)
+ cd $(LOCALDOCDIR)
+ -copy *.bmp $(DOCDIR)\pdf
+ -start $(WAITFLAG) tex2rtf $(LOCALDOCDIR)\gizmos.tex $(DOCDIR)\pdf\gizmos.rtf -twice -rtf
+ cd $(THISDIR)
+
+$(DOCDIR)\html\gizmos\gizmos.htm: $(DOCSOURCES)
+ cd $(LOCALDOCDIR)
+ -mkdir $(DOCDIR)\html\gizmos
+ copy *.gif $(DOCDIR)\html\gizmos
+ -start $(WAITFLAG) tex2rtf $(LOCALDOCDIR)\gizmos.tex $(DOCDIR)\html\gizmos\gizmos.htm -twice -html
+ -erase $(DOCDIR)\html\gizmos\*.con
+ -erase *.con
+ -erase $(DOCDIR)\html\gizmos\*.ref
+ cd $(THISDIR)
+
+$(DOCDIR)\htmlhelp\gizmos.chm: $(DOCDIR)\html\gizmos\gizmos.htm $(DOCDIR)\html\gizmos\gizmos.hhp
+ cd $(DOCDIR)\html\gizmos
+ -hhc gizmos.hhp
+ move gizmos.chm $(DOCDIR)\htmlhelp\gizmos.chm
+ cd $(THISDIR)
+
+# An htb file is a zip file containing the .htm, .gif, .hhp, .hhc and .hhk
+# files, renamed to htb.
+# This can then be used with e.g. helpview.
+# Optionally, a cached version of the .hhp file can be generated with hhp2cached.
+$(DOCDIR)\htb\gizmos.htb: $(DOCDIR)\html\gizmos\gizmos.htm
+ cd $(DOCDIR)\html\gizmos
+ -erase /Y gizmos.zip gizmos.htb
+ zip32 gizmos.zip *.htm *.gif *.hhp *.hhc *.hhk
+ -mkdir $(DOCDIR)\htb
+ move gizmos.zip $(DOCDIR)\htb\gizmos.htb
+ cd $(THISDIR)
+
+$(LOCALDOCDIR)\gizmos.dvi: $(DOCSOURCES)
+ cd $(LOCALDOCDIR)
+ -latex gizmos
+ -latex gizmos
+ -makeindx gizmos
+ -bibtex gizmos
+ -latex gizmos
+ -latex gizmos
+ cd $(THISDIR)
+
+$(WXDIR)\docs\ps\gizmos.ps: $(LOCALDOCDIR)\gizmos.dvi
+ cd $(LOCALDOCDIR)
+ -dvips32 -o gizmos.ps gizmos
+ move gizmos.ps $(WXDIR)\docs\ps\gizmos.ps
+ cd $(THISDIR)
+
--- /dev/null
+# Gizmos makefile for Watcom C++
+
+WXDIR = ..\..\..
+
+!include $(WXDIR)\src\makewat.env
+
+GIZMOSLIB = $(WXDIR)\lib\gizmos.lib
+THISDIR = $(WXDIR)\contrib\src\gizmos
+
+NAME = gizmos
+LNK = $(name).lnk
+
+OBJECTS = multicell.obj splittree.obj
+
+all: $(GIZMOSLIB)
+
+$(GIZMOSLIB): $(OBJECTS)
+ *wlib /b /c /n /P=256 $(GIZMOSLIB) $(OBJECTS)
+
+clean: .SYMBOLIC
+ -erase *.obj *.bak *.err *.pch $(GIZMOSLIB) *.lbc
+
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: multicell.cpp
+// Purpose: provide two new classes for layout, wxMultiCellSizer and wxMultiCellCanvas
+// Author: Jonathan Bayer
+// Modified by:
+// Created:
+// RCS-ID: $Id:
+// Copyright: (c) Jonathan Bayer
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// This was inspired by the gbsizer class written by Alex Andruschak
+
+#ifdef __GNUG__
+ #pragma implementation "multicell.h"
+#endif
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+#ifndef WX_PRECOMP
+ #include "wx/wx.h"
+#endif
+
+#include "wx/gizmos/multicell.h"
+
+
+
+
+//---------------------------------------------------------------------------
+
+IMPLEMENT_ABSTRACT_CLASS(wxMultiCellSizer, wxSizer);
+IMPLEMENT_ABSTRACT_CLASS(wxMultiCellItemHandle, wxRect);
+
+//---------------------------------------------------------------------------
+// wxMultiCellItemHandle
+//---------------------------------------------------------------------------
+/*
+ *Function Name: wxMultiCellItemHandle :: wxMultiCellItemHandle
+ *
+ *Parameters: int row
+ * int column
+ * int height
+ * int width
+ * wxSize size
+ * wxResizable Style
+ * wxSize weight
+ * int align
+ *
+ *Description: This is the constructor for the class.
+ *
+ */
+
+void wxMultiCellItemHandle :: Initialize( int row, int column, int height, int width, wxSize size, wxResizable Style, wxSize weight, int align)
+{
+ m_column = column;
+ m_row = row;
+ m_width = width;
+ m_height = height;
+
+ m_style = Style;
+ m_fixedSize = size;
+ m_alignment = align;
+ m_weight = weight;
+}
+//---------------------------------------------------------------------------
+wxMultiCellItemHandle :: wxMultiCellItemHandle( int row, int column, int height, int width, wxSize size, wxResizable Style, wxSize weight, int align)
+{
+ Initialize(row, column,height, width, size, Style, weight, align);
+}
+//---------------------------------------------------------------------------
+wxMultiCellItemHandle :: wxMultiCellItemHandle( int row, int column, wxSize size, wxResizable style, wxSize weight, int align)
+{
+ Initialize(row, column,1, 1, size, style, weight, align);
+}
+//---------------------------------------------------------------------------
+wxMultiCellItemHandle :: wxMultiCellItemHandle( int row, int column, wxResizable style, wxSize weight, int align)
+{
+ Initialize(row, column, 1, 1, wxSize(1, 1), style, weight, align);
+}
+//---------------------------------------------------------------------------
+wxMultiCellItemHandle :: wxMultiCellItemHandle( int row, int column, int align)
+{
+ Initialize(row, column, 1, 1, wxSize(1,1), wxNOT_RESIZABLE, wxSize(1, 1), align);
+}
+
+//---------------------------------------------------------------------------
+int wxMultiCellItemHandle::GetColumn()
+{
+ return m_column;
+}
+//---------------------------------------------------------------------------
+int wxMultiCellItemHandle::GetRow()
+{
+ return m_row;
+}
+//---------------------------------------------------------------------------
+int wxMultiCellItemHandle::GetWidth()
+{
+ return m_width;
+}
+//---------------------------------------------------------------------------
+int wxMultiCellItemHandle::GetHeight()
+{
+ return m_height;
+}
+//---------------------------------------------------------------------------
+wxResizable wxMultiCellItemHandle :: GetStyle()
+{
+ return m_style;
+};
+//---------------------------------------------------------------------------
+wxSize wxMultiCellItemHandle :: GetLocalSize()
+{
+ return m_fixedSize;
+};
+//---------------------------------------------------------------------------
+int wxMultiCellItemHandle :: GetAlignment()
+{
+ return m_alignment;
+};
+//---------------------------------------------------------------------------
+wxSize wxMultiCellItemHandle :: GetWeight()
+{
+ return m_weight;
+};
+
+
+
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+// wxMultiCellSizer
+//---------------------------------------------------------------------------
+
+/*
+ *Function Name: wxMultiCellSizer::Initialize
+ *
+ *Parameters: wxsize Initial size of sizer
+ *
+ *Description: This is a common function to initialize all the members of
+ * this class. It is only called from the constructors
+ *
+ */
+
+void wxMultiCellSizer::Initialize( wxSize size )
+{
+ m_cell_count = size;
+ m_maxHeight = (int *)malloc((1 + m_cell_count.GetHeight()) * sizeof(int));
+ m_maxWidth = (int *)malloc( (1 + m_cell_count.GetWidth()) * sizeof(int));
+ m_rowStretch = (int *)malloc( (1 + m_cell_count.GetHeight()) * sizeof(int));
+ m_colStretch = (int *)malloc((1 + m_cell_count.GetWidth()) * sizeof(int));
+
+ m_weights = (wxSize **)malloc((1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth())) * sizeof(wxSize *));
+ m_minSizes = (wxSize **)malloc((1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth())) * sizeof(wxSize *));
+ for (int x = 0; x < 1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth()); x++)
+ {
+ m_weights[x] = new wxSize(0,0);
+ m_minSizes[x] = new wxSize(0,0);
+ }
+
+ m_maxWeights = 1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth());
+ m_defaultCellSize = wxSize(5, 5);
+ m_win = NULL;
+ m_pen = wxRED_PEN;
+}
+//---------------------------------------------------------------------------
+wxMultiCellSizer::wxMultiCellSizer( wxSize & size )
+{
+ Initialize(size);
+}
+//---------------------------------------------------------------------------
+wxMultiCellSizer::wxMultiCellSizer( int rows, int cols)
+{
+ wxSize size(cols, rows);
+ Initialize(size);
+}
+//---------------------------------------------------------------------------
+wxMultiCellSizer::~wxMultiCellSizer()
+{
+ m_children.DeleteContents(TRUE);
+
+ free(m_maxHeight);
+ free(m_maxWidth);
+ free(m_rowStretch);
+ free(m_colStretch);
+
+ for (int x = 0; x < 1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth()); x++)
+ {
+ delete m_weights[x];
+ delete m_minSizes[x];
+ }
+ free(m_weights);
+ free(m_minSizes);
+}
+//---------------------------------------------------------------------------
+bool wxMultiCellSizer::EnableGridLines(wxWindow *win)
+{
+ m_win = win;
+ return TRUE;
+}
+//---------------------------------------------------------------------------
+bool wxMultiCellSizer::SetGridPen(wxPen *pen)
+{
+ m_pen = pen;
+ return TRUE;
+}
+
+//---------------------------------------------------------------------------
+bool wxMultiCellSizer::SetDefaultCellSize(wxSize size)
+{
+ m_defaultCellSize = size;
+ return TRUE;
+}
+//---------------------------------------------------------------------------
+bool wxMultiCellSizer::SetColumnWidth(int column, int colSize, bool expandable)
+{
+ if (expandable)
+ {
+ m_minSizes[column]->SetWidth(-colSize);
+ }
+ else
+ {
+ m_minSizes[column]->SetWidth(colSize);
+ }
+ return TRUE;
+}
+//---------------------------------------------------------------------------
+bool wxMultiCellSizer::SetRowHeight(int row, int rowSize, bool expandable)
+{
+ if (expandable)
+ {
+ m_minSizes[row]->SetHeight(-rowSize);
+ }
+ else
+ {
+ m_minSizes[row]->SetHeight(rowSize);
+ }
+ return TRUE;
+}
+//---------------------------------------------------------------------------
+void wxMultiCellSizer::RecalcSizes()
+{
+ if (m_children.GetCount() == 0)
+ return;
+ wxSize size = GetSize();
+ wxPoint pos = GetPosition();
+
+ GetMinimums();
+
+ // We need to take the unused space and equally give it out to all the rows/columns
+ // which are stretchable
+
+ int unUsedWidth = size.GetWidth() - Sum(m_maxWidth, m_cell_count.GetWidth());
+ int unUsedHeight = size.GetHeight() - Sum(m_maxHeight, m_cell_count.GetHeight());
+ int totalWidthWeight = 0;
+ int totalHeightWeight = 0;
+ int x;
+
+ for (x = 0; x < wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth()); x++)
+ {
+ if (m_rowStretch[x])
+ {
+ totalHeightWeight += m_weights[x]->GetHeight();
+ }
+ if (x < m_cell_count.GetWidth() && m_colStretch[x])
+ {
+ totalWidthWeight += m_weights[x]->GetWidth();
+ }
+ }
+ for (x = 0; x < wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth()); x++)
+ {
+ if (x < m_cell_count.GetHeight() && m_rowStretch[x])
+ {
+ m_maxHeight[x] += unUsedHeight * m_weights[x]->GetHeight() / totalHeightWeight;
+ }
+ if (x < m_cell_count.GetWidth() && m_colStretch[x])
+ {
+ m_maxWidth[x] += unUsedWidth * m_weights[x]->GetWidth() / totalWidthWeight;
+ }
+ }
+ // We now have everything we need to figure each cell position and size
+ // The arrays m_maxHeight and m_maxWidth now contain the final widths and height of
+ // each row and column.
+
+ double cell_width = (double)size.GetWidth() / (double)m_cell_count.GetWidth();
+ double cell_height = (double)size.GetHeight() / (double)m_cell_count.GetHeight();
+ wxPoint c_point;
+ wxSize c_size;
+
+ wxNode *current;
+ current = m_children.GetFirst();
+ while (current != NULL)
+ {
+ wxSizerItem *item = (wxSizerItem*) current->Data();
+
+ wxMultiCellItemHandle *rect;
+ if (item != NULL &&
+ (rect = (wxMultiCellItemHandle *)item->GetUserData()) != NULL)
+ {
+ c_point.x = pos.x + (int)(rect->GetColumn() * cell_width);
+ c_point.y = pos.y + (int)(rect->GetRow() * cell_height);
+
+ c_point.x = pos.x + Sum(m_maxWidth, rect->GetColumn());
+ c_point.y = pos.y + Sum(m_maxHeight, rect->GetRow());
+
+
+ c_size = rect->GetLocalSize();
+ wxSize minSize( item->CalcMin() );
+ if (c_size.GetHeight() != wxDefaultSize.GetHeight() ||
+ c_size.GetWidth() != wxDefaultSize.GetWidth())
+ {
+ minSize.SetHeight(wxMax(minSize.GetHeight(), c_size.GetHeight()));
+ minSize.SetWidth(wxMax(minSize.GetWidth(), c_size.GetWidth()));
+ }
+ if (rect->GetStyle() & wxHORIZENTAL_RESIZABLE ||
+ rect->GetWidth() > 1
+ || m_minSizes[rect->GetColumn()]->GetWidth() < 0)
+ {
+ int w = 0;
+ for (int x = 0; x < rect->GetWidth(); x++)
+ {
+ w += m_maxWidth[rect->GetColumn() + x];
+ }
+ c_size.SetWidth(w);
+ }
+ else
+ {
+ c_size.SetWidth(minSize.GetWidth() );
+ }
+ if (rect->GetStyle() & wxVERTICAL_RESIZABLE ||
+ rect->GetHeight() > 1 ||
+ m_minSizes[rect->GetRow()]->GetHeight() < 0)
+ {
+ int h = 0;
+ for (int x = 0; x < rect->GetHeight(); x++)
+ {
+ h += m_maxHeight[rect->GetRow() + x];
+ }
+ c_size.SetHeight(h);
+ }
+ else
+ {
+ c_size.SetHeight(minSize.GetHeight());
+ }
+ int extraHeight = (m_maxHeight[rect->GetRow()] - c_size.GetHeight());
+ int extraWidth = (m_maxWidth[rect->GetColumn()] - c_size.GetWidth());
+
+ if (rect->GetWidth() == 1 && rect->GetAlignment() & wxALIGN_CENTER_HORIZONTAL)
+ {
+ c_point.x += extraWidth / 2;
+ }
+ if (rect->GetWidth() == 1 && rect->GetAlignment() & wxALIGN_RIGHT)
+ {
+ c_point.x += extraWidth;
+ }
+ if (rect->GetHeight() == 1 && rect->GetAlignment() & wxALIGN_CENTER_VERTICAL)
+ {
+ c_point.y += extraHeight / 2;
+ }
+ if (rect->GetHeight() == 1 && rect->GetAlignment() & wxALIGN_BOTTOM)
+ {
+ c_point.y += extraHeight;
+ }
+ item->SetDimension(c_point, c_size);
+ }
+ current = current->Next();
+ }
+}
+//---------------------------------------------------------------------------
+wxSize wxMultiCellSizer::CalcMin()
+{
+ if (m_children.GetCount() == 0)
+ return wxSize(10,10);
+
+ int m_minWidth = 0;
+ int m_minHeight = 0;
+
+ GetMinimums();
+ m_minWidth = Sum(m_maxWidth, m_cell_count.GetWidth());
+ m_minHeight = Sum(m_maxHeight, m_cell_count.GetHeight());
+ return wxSize( m_minWidth, m_minHeight );
+}
+//---------------------------------------------------------------------------
+void wxMultiCellSizer :: GetMinimums()
+{
+ // We first initial all the arrays EXCEPT for the m_minsizes array.
+
+ memset(m_maxHeight, 0, sizeof(int) * m_cell_count.GetHeight());
+ memset(m_maxWidth, 0, sizeof(int) * m_cell_count.GetWidth());
+ memset(m_rowStretch, 0, sizeof(int) * m_cell_count.GetHeight());
+ memset(m_colStretch, 0, sizeof(int) * m_cell_count.GetWidth());
+ for (int x = 0; x < 1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth()); x++)
+ {
+ m_weights[x]->SetHeight(0);
+ m_weights[x]->SetWidth(0);
+ }
+
+ wxNode *node = m_children.GetFirst();
+ while (node)
+ {
+ wxSizerItem *item = (wxSizerItem*) node->Data();
+ wxMultiCellItemHandle *rect;
+ if (item != NULL &&
+ (rect = (wxMultiCellItemHandle *)item->GetUserData()) != NULL)
+ {
+ int row = rect->GetRow();
+ int col = rect->GetColumn();
+
+ // First make sure that the control knows about the max rows and columns
+
+ int changed = FALSE;
+ if (row + 1 > m_cell_count.GetHeight())
+ {
+ changed++;
+ m_maxHeight = (int *)realloc(m_maxHeight, (1 + row) * sizeof(int));
+ m_rowStretch = (int *)realloc(m_rowStretch, (1 + row) * sizeof(int));
+ for (int x = m_cell_count.GetHeight(); x < row + 1; x++)
+ {
+ m_maxHeight[x - 1] = 0;
+ m_rowStretch[x - 1] = 0;
+ }
+ m_cell_count.SetHeight(row + 1);
+ }
+ if (col + 1 > m_cell_count.GetWidth())
+ {
+ changed++;
+ m_maxWidth = (int *)realloc(m_maxWidth, (1 + col) * sizeof(int));
+ m_colStretch = (int *)realloc(m_colStretch, ( 1 + col) * sizeof(int));
+ for (int x = m_cell_count.GetWidth(); x < col + 1; x++)
+ {
+ m_maxWidth[x - 1] = 0;
+ m_colStretch[x - 1] = 0;
+ }
+ m_cell_count.SetWidth(col + 1);
+ }
+ if (changed)
+ {
+ m_weights = (wxSize **)realloc(m_weights, (1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth())) * sizeof(wxSize *));
+ m_minSizes = (wxSize **)realloc(m_minSizes, (1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth())) * sizeof(wxSize *));
+ for (int x = m_maxWeights; x < 1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth()); x++)
+ {
+ m_weights[x - 1] = new wxSize(0,0);
+ m_minSizes[x - 1] = new wxSize(0,0);
+ }
+ m_maxWeights = 1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth());
+ }
+
+ // Sum the m_weights for each row/column, but only if they are resizable
+
+ wxSize minSize( item->CalcMin() );
+ wxSize c_size = rect->GetLocalSize();
+ if (c_size.GetHeight() != wxDefaultSize.GetHeight() ||
+ c_size.GetWidth() != wxDefaultSize.GetWidth())
+ {
+ minSize.SetHeight(wxMax(minSize.GetHeight(), c_size.GetHeight()));
+ minSize.SetWidth(wxMax(minSize.GetWidth(), c_size.GetWidth()));
+ }
+
+ // For each row, calculate the max height for those fields which are not
+ // resizable in the vertical pane
+
+ if (!(rect->GetStyle() & wxVERTICAL_RESIZABLE || m_minSizes[row]->GetHeight() < 0))
+ {
+ m_maxHeight[row] = wxMax(m_maxHeight[row], minSize.GetHeight() / rect->GetHeight());
+ }
+ else
+ {
+ m_rowStretch[row] = 1;
+ if (m_minSizes[row]->GetHeight())
+ {
+ m_maxHeight[row] = abs(m_minSizes[row]->GetHeight());
+ }
+ else
+ {
+ m_maxHeight[row] = wxMax(m_maxHeight[row], m_defaultCellSize.GetHeight());
+ }
+ m_weights[row]->SetHeight(wxMax(m_weights[row]->GetHeight(), rect->GetWeight().GetHeight()));
+ }
+
+ // For each column, calculate the max width for those fields which are not
+ // resizable in the horizontal pane
+
+ if (!(rect->GetStyle() & wxHORIZENTAL_RESIZABLE || m_minSizes[col]->GetWidth() < 0))
+ {
+ if (m_minSizes[col]->GetWidth())
+ {
+ m_maxWidth[col] = abs(m_minSizes[col]->GetWidth());
+ }
+ else
+ {
+ m_maxWidth[col] = wxMax(m_maxWidth[col], minSize.GetWidth() / rect->GetWidth());
+ }
+ }
+ else
+ {
+ m_colStretch[col] = 1;
+ m_maxWidth[col] = wxMax(m_maxWidth[col], m_defaultCellSize.GetWidth());
+ m_weights[col]->SetWidth(wxMax(m_weights[col]->GetWidth(), rect->GetWeight().GetWidth()));
+ }
+ node = node->Next();
+ }
+ }
+} // wxMultiCellSizer :: GetMinimums
+//---------------------------------------------------------------------------
+/*
+ *Function Name: wxMultiCellSizer :: Sum
+ *
+ *Parameters: int * pointer to array of ints
+ * int Number of cells to sum up
+ *
+ *Description: This member function sums up all the elements of the array which
+ * preceed the specified cell.
+ *
+ *Returns: int Sum
+ *
+ */
+
+int wxMultiCellSizer :: Sum(int *array, int x)
+{
+ int sum = 0;
+ while (x--)
+ {
+ sum += array[x];
+ }
+ return sum;
+}
+//---------------------------------------------------------------------------
+/*
+ *Function Name: wxMultiCellSizer :: DrawGridLines
+ *
+ *Parameters: wxDC Device context
+ *
+ *Description: This function draws the grid lines in the specified device context.
+ *
+ */
+
+void wxMultiCellSizer :: DrawGridLines(wxDC& dc)
+{
+ RecalcSizes();
+ int maxW = Sum(m_maxWidth, m_cell_count.GetWidth());
+ int maxH = Sum(m_maxHeight, m_cell_count.GetHeight());
+ int x;
+
+ // Draw the columns
+ dc.SetPen(* m_pen);
+ for (x = 1; x < m_cell_count.GetWidth(); x++)
+ {
+ int colPos = Sum(m_maxWidth, x) ;
+ dc.DrawLine(colPos, 0, colPos, maxH);
+ }
+
+ // Draw the rows
+ for (x = 1; x < m_cell_count.GetHeight(); x++)
+ {
+ int rowPos = Sum(m_maxHeight, x);
+ dc.DrawLine(0, rowPos, maxW, rowPos);
+ }
+}
+//---------------------------------------------------------------------------
+// Define the repainting behaviour
+/*
+ *Function Name: wxMultiCellSizer::OnPaint
+ *
+ *Parameters: wxDC Device context
+ *
+ *Description: This function calls the DrawGridLines() member if a window
+ * has been previously specified. This functions MUST be called
+ * from an OnPaint member belonging to the window which the sizer
+ * is attached to.
+ *
+ */
+
+void wxMultiCellSizer::OnPaint(wxDC& dc )
+{
+ if (m_win)
+ {
+ DrawGridLines(dc);
+ }
+}
+
+
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+
+
+
+
+#define CELL_LOC(row, col) ((row) * m_maxCols + col)
+
+//---------------------------------------------------------------------------
+// wxCell
+//---------------------------------------------------------------------------
+/*
+ *Function Name: wxCell : wxLayoutConstraints
+ *
+ *Description: This class is used by wxMultiCellCanvas for internal storage
+ *
+ */
+
+class wxCell : public wxLayoutConstraints
+{
+public:
+ wxCell(wxWindow *win)
+ {
+ m_window = win;
+ };
+
+ wxWindow *m_window;
+};
+
+
+
+//---------------------------------------------------------------------------
+// wxMultiCellCanvas
+//---------------------------------------------------------------------------
+wxMultiCellCanvas :: wxMultiCellCanvas(wxWindow *par, int numRows, int numCols)
+ : wxFlexGridSizer(numRows, numCols, 0, 0)
+{
+ m_cells = (wxCell **)calloc(numRows * numCols, sizeof(wxCell *));
+
+ m_parent = par;
+ m_maxRows = numRows;
+ m_maxCols = numCols;
+ m_minCellSize = wxSize(5, 5);
+}
+//---------------------------------------------------------------------------
+wxString itoa(int x)
+{
+ char bfr[255];
+ sprintf(bfr, "%d", x);
+ return bfr;
+}
+//---------------------------------------------------------------------------
+void wxMultiCellCanvas :: Add(wxWindow *win, unsigned int row, unsigned int col)
+{
+ wxASSERT_MSG(row >= 0 && row < m_maxRows, wxString("Row ") + itoa(row) + " out of bounds (" + itoa(m_maxRows) + ")");
+ wxASSERT_MSG(col >= 0 && col < m_maxCols, wxString("Column ") + itoa(col) + " out of bounds (" + itoa(m_maxCols) + ")");
+ wxASSERT_MSG(m_cells[CELL_LOC(row, col)] == NULL, "Cell already occupied");
+
+ wxCell *newCell = new wxCell(win);
+ m_cells[CELL_LOC(row,col)] = newCell;
+}
+//---------------------------------------------------------------------------
+void wxMultiCellCanvas :: CalculateConstraints()
+{
+ unsigned int row, col;
+ for (row = 0; row < m_maxRows; row++)
+ {
+ for (col = 0; col < m_maxCols; col++)
+ {
+ if (!m_cells[CELL_LOC(row, col)])
+ {
+ // Create an empty static text field as a placeholder
+ m_cells[CELL_LOC(row, col)] = new wxCell(new wxStaticText(m_parent, -1, ""));
+ }
+ wxFlexGridSizer::Add(m_cells[CELL_LOC(row, col)]->m_window);
+ }
+ }
+}
+
+/*** End of File ***/
--- /dev/null
+These two classes make it easier to lay objects out on a screen. The
+first class is the wxMultiCellCanvas, which uses the wxFlexGridSizer
+control, so it is subject to the same limitations of that control. Among
+them is the fact that if the window is resized smaller than the control,
+then some of the objects will be obscured by the window edge.
+
+The second class is the wxMultiCellSizer, which is significantly more
+powerful than the wxMultiCell Canvas. This control supports resizing of
+objects on the fly, objects spanning cells, etc.
+
+Use the wxMultiCellCanvas when you have a simple layout which won't resize
+and doesn't have any unusual requirements. Use the wxMultiCellSizer when
+your needs are greater
+
+
+wxMultiCellCanvas
+=================
+
+The wxMultiCellCanvas class allows you to add objects to a wxFlexGridSizer
+by specifying a row and a column location. When all objects have been
+added, you need to call a member function CalculateConstraints(), which
+will insert the objects into the wxFlexGridSizer. If there are empty
+cells the canvas will insert empty wxStaticText objects as placeholders.
+
+Upon creation of the canvas the size of the canvas needs to be specified.
+Attempting to insert a cell outside those limits will cause an assertion
+error.
+
+When adding cells, the cell locations are specified as a row,column
+location, both being zero-based. 0,0 is the upper left corner of the
+canvas.
+
+
+wxMultiCellSizer
+================
+
+The wxMultiCellSizer class manages a collection of child windows in a way
+similar to that of data stored in a spreadsheet. A multicell canvas is a
+two-dimensional array of cells with an origin of (0,0) in the upper-left
+corner. Windows are added to a multicell sizer by first creating a
+wxMultiCellItemHandle object which specifies a starting cell and,
+optionally, a number of contiguous columns, rows, or a combination
+thereof, and then adding it to the sizer.
+
+This class bases the initial cell sizes on the minimum sizes returned by
+each child window of the sizer. You can override the minimum sizes
+provided by the wxWindows Class Library by doing either of the following:
+
+ o Specifying the size when creating the wxMultiCellItemHandle object
+ o Creating a derived class and implementing a CalcMin function
+
+The wxMultiCellItemHandle must be passed the row and column of the item,
+at a minimum. Optionally, more information can be passed:
+
+ int row Row position, zero based
+ int column Column position, zero based
+ int height Number of rows this cell will occupy, default is 1
+ int width Number of columns this cell will occupy, default is 1
+
+ Note that if the height or width is greater than one that
+ dimension is assumed to be resizable because it is spanning
+ multiple cells.
+
+ wxSize minSize Minimum size of the object.
+ wxResizable Style Is this object resizable, and if so, how. Allowable styles are:
+ wxNOT_RESIZABLE
+ wxHORIZENTAL_RESIZABLE
+ wxVERTICAL_RESIZABLE
+ wxRESIZABLE
+ wxSize weight If this is a resizable object, the weight applied to the specific dimension.
+ This is useful if you have several resizable rows and/or columns, and you want
+ one to get more of the available space than the others.
+ int align This is a wxAlignment value, it is an integer so you can 'or multiple
+ values together. The acceptable values are:
+ wxALIGN_NOT
+ wxALIGN_CENTER_HORIZONTAL
+ wxALIGN_CENTRE_HORIZONTAL
+ wxALIGN_LEFT
+ wxALIGN_TOP
+ wxALIGN_RIGHT
+ wxALIGN_BOTTOM
+ wxALIGN_CENTER_VERTICAL
+ wxALIGN_CENTRE_VERTICAL
+ wxALIGN_CENTER
+ wxALIGN_CENTRE
+ Note that some combinations of these make no sense, for example wxALIGN_LEFT | wxALIGN_RIGHT.
+ See the definition of wxAlignment for more information
+
+
+Other functions are:
+
+void RecalcSizes() Should not be called by the user, needed by the wxSizer class
+wxSize CalcMin() Should not be called by the user, needed by the wxSizer class
+bool SetDefaultCellSize Set the default cell size of an empty cell
+bool SetColumnWidth Set the width of a column, optionally specifying it as resizable
+bool SetRowHeight Set the height of a row, optionally specifying it as resizable
+
+Sometimes it can be very confusing to determine the relationship between rows, columns, and
+which ones are resizable or not. Three functions are supplied to make this easier:
+
+bool EnableGridLines(wxWindow *win); Call this to either enable or disable the grid lines.
+ Pass the window the sizer is on, or NULL to disable.
+ Currently the window is not used, but it may be in the
+ future.
+bool SetGridPen(wxPen *pen); Set the pen color, the default pen color is red
+void OnPaint(wxDC& dc); Call this from an OnPaint function associated with the
+ window the sizer is attached to. See the example program
+ mtest.cpp for specific details on how to do this.
+
+
+Files Description
+===== ===========
+docs.txt This file
+
+// wxMultiCellCanvas and wxMultiCellSizer
+makefile Makefile for the MingW32 compiler
+multicell.cpp Class source code file
+multicell.h Class header file
+
+//Sample
+mtest.cpp Example program, demonstrates both classes
+mtest.rc
+mtest.gif
+makefile
+
+Acknowledgments
+===============
+This was inspired by the gbsizer class written by Alex Andruschak, and the IMultiCellCanvas
+class in the IBM Class Libraries in the VisualeAge C++ compilers.
+
--- /dev/null
+2. Documentation
+
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: splittree.cpp
+// Purpose: Classes to achieve a remotely-scrolled tree in a splitter
+// window that can be scrolled by a scrolled window higher in the
+// hierarchy
+// Author: Julian Smart
+// Modified by:
+// Created: 8/7/2000
+// RCS-ID: $Id$
+// Copyright: (c) Julian Smart
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+#ifdef __GNUG__
+ #pragma interface "splittree.cpp"
+#endif
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+// for all others, include the necessary headers (this file is usually all you
+// need because it includes almost all "standard" wxWindows headers)
+#ifndef WX_PRECOMP
+ #include "wx/wx.h"
+#endif
+
+#include "wx/generic/treectlg.h"
+
+#include "wx/gizmos/splittree.h"
+
+/*
+ * wxRemotelyScrolledTreeCtrl
+ */
+
+#if USE_GENERIC_TREECTRL
+IMPLEMENT_CLASS(wxRemotelyScrolledTreeCtrl, wxGenericTreeCtrl)
+#else
+IMPLEMENT_CLASS(wxRemotelyScrolledTreeCtrl, wxTreeCtrl)
+#endif
+
+#if USE_GENERIC_TREECTRL
+BEGIN_EVENT_TABLE(wxRemotelyScrolledTreeCtrl, wxGenericTreeCtrl)
+#else
+BEGIN_EVENT_TABLE(wxRemotelyScrolledTreeCtrl, wxTreeCtrl)
+#endif
+ EVT_SIZE(wxRemotelyScrolledTreeCtrl::OnSize)
+ EVT_PAINT(wxRemotelyScrolledTreeCtrl::OnPaint)
+ EVT_TREE_ITEM_EXPANDED(-1, wxRemotelyScrolledTreeCtrl::OnExpand)
+ EVT_TREE_ITEM_COLLAPSED(-1, wxRemotelyScrolledTreeCtrl::OnExpand)
+ EVT_SCROLLWIN(wxRemotelyScrolledTreeCtrl::OnScroll)
+END_EVENT_TABLE()
+
+wxRemotelyScrolledTreeCtrl::wxRemotelyScrolledTreeCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pt,
+ const wxSize& sz, long style):
+ wxTreeCtrl(parent, id, pt, sz, style)
+{
+}
+
+wxRemotelyScrolledTreeCtrl::~wxRemotelyScrolledTreeCtrl()
+{
+}
+
+void wxRemotelyScrolledTreeCtrl::HideVScrollbar()
+{
+#ifdef __WXMSW__
+ if (!IsKindOf(CLASSINFO(wxGenericTreeCtrl)))
+ {
+ ::ShowScrollBar((HWND) GetHWND(), SB_VERT, FALSE);
+ }
+ else
+#endif
+ {
+ // Implicit in overriding SetScrollbars
+ }
+}
+
+// Number of pixels per user unit (0 or -1 for no scrollbar)
+// Length of virtual canvas in user units
+// Length of page in user units
+void wxRemotelyScrolledTreeCtrl::SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY,
+ int noUnitsX, int noUnitsY,
+ int xPos, int yPos,
+ bool noRefresh)
+{
+ if (IsKindOf(CLASSINFO(wxGenericTreeCtrl)))
+ {
+ wxGenericTreeCtrl* win = (wxGenericTreeCtrl*) this;
+ win->wxGenericTreeCtrl::SetScrollbars(pixelsPerUnitX, 0, noUnitsX, 0, xPos, 0, noRefresh);
+
+ wxScrolledWindow* scrolledWindow = GetScrolledWindow();
+ if (scrolledWindow)
+ {
+ scrolledWindow->SetScrollbars(0, pixelsPerUnitY, 0, noUnitsY, 0, yPos, noRefresh);
+ }
+ }
+}
+
+// In case we're using the generic tree control.
+// Get the view start
+void wxRemotelyScrolledTreeCtrl::GetViewStart(int *x, int *y) const
+{
+ if (IsKindOf(CLASSINFO(wxGenericTreeCtrl)))
+ {
+ wxScrolledWindow* scrolledWindow = GetScrolledWindow();
+
+ wxGenericTreeCtrl* win = (wxGenericTreeCtrl*) this;
+ int x1, y1, x2, y2;
+ win->wxGenericTreeCtrl::GetViewStart(& x1, & y1);
+ * x = x1; * y = y1;
+ if (!scrolledWindow)
+ return;
+
+ scrolledWindow->GetViewStart(& x2, & y2);
+ * y = y2;
+ }
+}
+
+// In case we're using the generic tree control.
+void wxRemotelyScrolledTreeCtrl::PrepareDC(wxDC& dc)
+{
+ if (IsKindOf(CLASSINFO(wxGenericTreeCtrl)))
+ {
+ wxScrolledWindow* scrolledWindow = GetScrolledWindow();
+
+ wxGenericTreeCtrl* win = (wxGenericTreeCtrl*) this;
+
+ int startX, startY;
+ GetViewStart(& startX, & startY);
+
+ int xppu1, yppu1, xppu2, yppu2;
+ win->wxGenericTreeCtrl::GetScrollPixelsPerUnit(& xppu1, & yppu1);
+ scrolledWindow->GetScrollPixelsPerUnit(& xppu2, & yppu2);
+
+ dc.SetDeviceOrigin( -startX * xppu1, -startY * yppu2 );
+ dc.SetUserScale( m_scaleX, m_scaleY );
+ }
+}
+
+// Scroll to the given line (in scroll units where each unit is
+// the height of an item)
+void wxRemotelyScrolledTreeCtrl::ScrollToLine(int posHoriz, int posVert)
+{
+#ifdef __WXMSW__
+ if (!IsKindOf(CLASSINFO(wxGenericTreeCtrl)))
+ {
+ UINT sbCode = SB_THUMBPOSITION;
+ HWND vertScrollBar = 0;
+ MSWDefWindowProc((WXUINT) WM_VSCROLL, MAKELONG(sbCode, posVert), (WXHWND) vertScrollBar);
+ }
+ else
+#endif
+ {
+ wxGenericTreeCtrl* win = (wxGenericTreeCtrl*) this;
+ win->Refresh();
+ /* Doesn't work yet because scrolling is ignored by Scroll
+ int xppu, yppu;
+ wxScrolledWindow* scrolledWindow = GetScrolledWindow();
+ if (scrolledWindow)
+ {
+ scrolledWindow->GetScrollPixelsPerUnit(& xppu, & yppu);
+ win->Scroll(-1, posVert*yppu);
+ }
+ */
+ }
+}
+
+void wxRemotelyScrolledTreeCtrl::OnSize(wxSizeEvent& event)
+{
+ HideVScrollbar();
+ AdjustRemoteScrollbars();
+ event.Skip();
+}
+
+void wxRemotelyScrolledTreeCtrl::OnExpand(wxTreeEvent& event)
+{
+ AdjustRemoteScrollbars();
+ event.Skip();
+
+ // If we don't have this, we get some bits of lines still remaining
+ if (event.GetEventType() == wxEVT_COMMAND_TREE_ITEM_COLLAPSED)
+ Refresh();
+}
+
+// Adjust the containing wxScrolledWindow's scrollbars appropriately
+void wxRemotelyScrolledTreeCtrl::AdjustRemoteScrollbars()
+{
+ // WILL THIS BE DONE AUTOMATICALLY BY THE GENERIC TREE CONTROL?
+/*
+
+Problem with remote-scrolling the generic tree control. It relies
+on PrepareDC for adjusting the device origin, which in turn takes
+values from wxScrolledWindow: which we've turned off in order to use
+a different scrollbar :-( So we could override PrepareDC and use
+the _other_ scrolled window's position instead.
+Note also ViewStart would need to be overridden.
+Plus, wxGenericTreeCtrl::OnPaint will reset the device origin.
+
+*/
+
+ // Assumption: wxGenericTreeCtrl will adjust the scrollbars automatically,
+ // since it'll call SetScrollbars and we've defined this to Do The Right Thing.
+ if (!IsKindOf(CLASSINFO(wxGenericTreeCtrl)))
+ return;
+
+ wxScrolledWindow* scrolledWindow = GetScrolledWindow();
+ if (scrolledWindow)
+ {
+ wxRect itemRect;
+ if (GetBoundingRect(GetRootItem(), itemRect))
+ {
+ int itemHeight = itemRect.GetHeight();
+
+ int w, h;
+ GetClientSize(&w, &h);
+
+ wxRect rect(0, 0, 0, 0);
+ CalcTreeSize(rect);
+ int treeViewHeight = rect.GetHeight()/itemHeight;
+
+ int scrollPixelsPerLine = itemHeight;
+ int scrollPos = - (itemRect.y / itemHeight);
+
+ scrolledWindow->SetScrollbars(0, scrollPixelsPerLine, 0, treeViewHeight, 0, scrollPos);
+
+ // Ensure that when a scrollbar becomes hidden or visible,
+ // the contained window sizes are right.
+ // Problem: this is called too early (?)
+ wxSizeEvent event(scrolledWindow->GetSize(), scrolledWindow->GetId());
+ scrolledWindow->GetEventHandler()->ProcessEvent(event);
+ }
+ }
+}
+
+
+// Calculate the area that contains both rectangles
+static wxRect CombineRectangles(const wxRect& rect1, const wxRect& rect2)
+{
+ wxRect rect;
+
+ int right1 = rect1.GetRight();
+ int bottom1 = rect1.GetBottom();
+ int right2 = rect2.GetRight();
+ int bottom2 = rect2.GetBottom();
+
+ wxPoint topLeft = wxPoint(wxMin(rect1.x, rect2.x), wxMin(rect1.y, rect2.y));
+ wxPoint bottomRight = wxPoint(wxMax(right1, right2), wxMax(bottom1, bottom2));
+
+ rect.x = topLeft.x; rect.y = topLeft.y;
+ rect.SetRight(bottomRight.x);
+ rect.SetBottom(bottomRight.y);
+
+ return rect;
+}
+
+
+// Calculate the tree overall size so we can set the scrollbar
+// correctly
+void wxRemotelyScrolledTreeCtrl::CalcTreeSize(wxRect& rect)
+{
+ CalcTreeSize(GetRootItem(), rect);
+}
+
+void wxRemotelyScrolledTreeCtrl::CalcTreeSize(wxTreeItemId& id, wxRect& rect)
+{
+ // TODO: implement GetFirst/NextVisibleItem
+ // for wxGenericTreeCtrl, plus GetBoundingRect.
+
+ // More efficient implementation would be to find the last item (but how?)
+ // Q: is the bounding rect relative to the top of the virtual tree workspace
+ // or the top of the window? How would we convert?
+ wxRect itemSize;
+ if (GetBoundingRect(id, itemSize))
+ {
+ rect = CombineRectangles(rect, itemSize);
+ }
+
+ long cookie;
+ wxTreeItemId childId = GetFirstChild(id, cookie);
+ while (childId != 0)
+ {
+ CalcTreeSize(childId, rect);
+ childId = GetNextChild(childId, cookie);
+ }
+}
+
+// Find the scrolled window that contains this control
+wxScrolledWindow* wxRemotelyScrolledTreeCtrl::GetScrolledWindow() const
+{
+ wxWindow* parent = wxWindow::GetParent();
+ while (parent)
+ {
+ if (parent->IsKindOf(CLASSINFO(wxScrolledWindow)))
+ return (wxScrolledWindow*) parent;
+ parent = parent->GetParent();
+ }
+ return NULL;
+}
+
+void wxRemotelyScrolledTreeCtrl::OnPaint(wxPaintEvent& event)
+{
+ wxPaintDC dc(this);
+
+ wxTreeCtrl::OnPaint(event);
+
+ // Reset the device origin since it may have been set
+ dc.SetDeviceOrigin(0, 0);
+
+ wxSize sz = GetClientSize();
+
+ wxPen pen(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DLIGHT), 1, wxSOLID);
+ dc.SetPen(pen);
+ dc.SetBrush(* wxTRANSPARENT_BRUSH);
+
+ wxRect itemRect;
+ if (GetBoundingRect(GetRootItem(), itemRect))
+ {
+ int itemHeight = itemRect.GetHeight();
+ wxRect rcClient = GetRect();
+ int cy=0;
+ wxTreeItemId h;
+ for(h=GetFirstVisibleItem();h;h=GetNextVisible(h))
+ {
+ dc.DrawLine(rcClient.x, cy, rcClient.x + rcClient.width, cy);
+ cy += itemHeight;
+ }
+ dc.DrawLine(rcClient.x, cy, rcClient.x + rcClient.width, cy);
+ }
+}
+
+void wxRemotelyScrolledTreeCtrl::OnScroll(wxScrollWinEvent& event)
+{
+ int orient = event.GetOrientation();
+ if (orient == wxHORIZONTAL)
+ {
+ // Don't 'skip' or we'd get into infinite recursion
+ return;
+ }
+ wxScrolledWindow* scrollWin = GetScrolledWindow();
+ if (!scrollWin)
+ return;
+
+ int x, y;
+ scrollWin->GetViewStart(& x, & y);
+
+ ScrollToLine(-1, y);
+}
+
+/*
+ * wxThinSplitterWindow
+ */
+
+IMPLEMENT_CLASS(wxThinSplitterWindow, wxSplitterWindow)
+
+BEGIN_EVENT_TABLE(wxThinSplitterWindow, wxSplitterWindow)
+ EVT_SIZE(wxThinSplitterWindow::OnSize)
+END_EVENT_TABLE()
+
+wxThinSplitterWindow::wxThinSplitterWindow(wxWindow* parent, wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& sz,
+ long style):
+ wxSplitterWindow(parent, id, pos, sz, style)
+{
+}
+
+void wxThinSplitterWindow::SizeWindows()
+{
+ // The client size may have changed inbetween
+ // the sizing of the first window and the sizing of
+ // the second. So repeat SizeWindows.
+ wxSplitterWindow::SizeWindows();
+ wxSplitterWindow::SizeWindows();
+}
+
+// Tests for x, y over sash
+bool wxThinSplitterWindow::SashHitTest(int x, int y, int tolerance)
+{
+ return wxSplitterWindow::SashHitTest(x, y, 4);
+}
+
+void wxThinSplitterWindow::DrawSash(wxDC& dc)
+{
+ if ( m_sashPosition == 0 || !m_windowTwo)
+ return;
+ if (GetWindowStyle() & wxSP_NOSASH)
+ return;
+
+ int w, h;
+ GetClientSize(&w, &h);
+
+ if ( m_splitMode == wxSPLIT_VERTICAL )
+ {
+ dc.SetPen(* m_facePen);
+ dc.SetBrush(* m_faceBrush);
+ int h1 = h-1;
+ int y1 = 0;
+ if ( (GetWindowStyleFlag() & wxSP_BORDER) != wxSP_BORDER && (GetWindowStyleFlag() & wxSP_3DBORDER) != wxSP_3DBORDER )
+ h1 += 1; // Not sure why this is necessary...
+ if ( (GetWindowStyleFlag() & wxSP_3DBORDER) == wxSP_3DBORDER)
+ {
+ y1 = 2; h1 -= 3;
+ }
+ dc.DrawRectangle(m_sashPosition, y1, m_sashSize, h1);
+ }
+ else
+ {
+ dc.SetPen(* m_facePen);
+ dc.SetBrush(* m_faceBrush);
+ int w1 = w-1;
+ int x1 = 0;
+ if ( (GetWindowStyleFlag() & wxSP_BORDER) != wxSP_BORDER && (GetWindowStyleFlag() & wxSP_3DBORDER) != wxSP_3DBORDER )
+ w1 ++;
+ if ( (GetWindowStyleFlag() & wxSP_3DBORDER) == wxSP_3DBORDER)
+ {
+ x1 = 2; w1 -= 3;
+ }
+ dc.DrawRectangle(x1, m_sashPosition, w1, m_sashSize);
+ }
+
+ dc.SetPen(wxNullPen);
+ dc.SetBrush(wxNullBrush);
+}
+
+void wxThinSplitterWindow::OnSize(wxSizeEvent& event)
+{
+ wxSplitterWindow::OnSize(event);
+}
+
+/*
+ * wxSplitterScrolledWindow
+ */
+
+IMPLEMENT_CLASS(wxSplitterScrolledWindow, wxScrolledWindow)
+
+BEGIN_EVENT_TABLE(wxSplitterScrolledWindow, wxScrolledWindow)
+ EVT_SCROLLWIN(wxSplitterScrolledWindow::OnScroll)
+ EVT_SIZE(wxSplitterScrolledWindow::OnSize)
+END_EVENT_TABLE()
+
+wxSplitterScrolledWindow::wxSplitterScrolledWindow(wxWindow* parent, wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& sz,
+ long style):
+ wxScrolledWindow(parent, id, pos, sz, style)
+{
+}
+
+void wxSplitterScrolledWindow::OnSize(wxSizeEvent& event)
+{
+ wxSize sz = GetClientSize();
+ if (GetChildren().First())
+ {
+ ((wxWindow*) GetChildren().First()->Data())->SetSize(0, 0, sz.x, sz.y);
+ }
+}
+
+void wxSplitterScrolledWindow::OnScroll(wxScrollWinEvent& event)
+{
+ // Ensure that events being propagated back up the window hierarchy
+ // don't cause an infinite loop
+ static bool inOnScroll = FALSE;
+ if (inOnScroll)
+ return;
+ inOnScroll = TRUE;
+
+ int orient = event.GetOrientation();
+
+ int nScrollInc = CalcScrollInc(event);
+ if (nScrollInc == 0)
+ {
+ inOnScroll = FALSE;
+ return;
+ }
+
+ if (orient == wxHORIZONTAL)
+ {
+ int newPos = m_xScrollPosition + nScrollInc;
+ SetScrollPos(wxHORIZONTAL, newPos, TRUE );
+ }
+ else
+ {
+ int newPos = m_yScrollPosition + nScrollInc;
+ SetScrollPos(wxVERTICAL, newPos, TRUE );
+ }
+
+ if (orient == wxHORIZONTAL)
+ {
+ m_xScrollPosition += nScrollInc;
+ }
+ else
+ {
+ m_yScrollPosition += nScrollInc;
+ }
+
+ // Find targets in splitter window and send the event to them
+ wxNode* node = GetChildren().First();
+ while (node)
+ {
+ wxWindow* child = (wxWindow*) node->Data();
+ if (child->IsKindOf(CLASSINFO(wxSplitterWindow)))
+ {
+ wxSplitterWindow* splitter = (wxSplitterWindow*) child;
+ if (splitter->GetWindow1())
+ splitter->GetWindow1()->ProcessEvent(event);
+ if (splitter->GetWindow2())
+ splitter->GetWindow2()->ProcessEvent(event);
+ break;
+ }
+ node = node->Next();
+ }
+
+#ifdef __WXMAC__
+ m_targetWindow->MacUpdateImmediately() ;
+#endif
+
+ inOnScroll = FALSE;
+}
+