Add libwx-perl
[pkg-perl] / deb-src / libwx-perl / libwx-perl-0.96 / cpp / controls.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        cpp/controls.cpp
3 // Purpose:     implementation for controls.h
4 // Author:      Mattia Barbon
5 // Modified by:
6 // Created:     29/10/2000
7 // RCS-ID:      $Id: controls.cpp 2442 2008-08-12 22:35:24Z mbarbon $
8 // Copyright:   (c) 2000-2008 Mattia Barbon
9 // Licence:     This program is free software; you can redistribute it and/or
10 //              modify it under the same terms as Perl itself
11 /////////////////////////////////////////////////////////////////////////////
12
13 #include "cpp/constants.h"
14
15 //
16 // Wx::ListCtrl implementation
17 //
18
19 WXPLI_IMPLEMENT_DYNAMIC_CLASS( wxPliListCtrl, wxListCtrl );
20
21 double listctrl_constant( const char* name, int arg )
22 {
23   // !package: Wx
24   // !parser: sub { $_[0] =~ m<^\s*r\w*\(\s*(\w+)\s*\);\s*(?://(.*))?$> }
25   // !tag:
26 #define r( n ) \
27     if( strEQ( name, #n ) ) \
28         return n;
29
30   WX_PL_CONSTANT_INIT();
31
32   switch( fl )
33   {
34   case 'E':
35       r( wxEVT_COMMAND_LIST_BEGIN_DRAG );
36       r( wxEVT_COMMAND_LIST_BEGIN_RDRAG );
37       r( wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT );
38       r( wxEVT_COMMAND_LIST_CACHE_HINT );
39       r( wxEVT_COMMAND_LIST_COL_RIGHT_CLICK );
40       r( wxEVT_COMMAND_LIST_COL_BEGIN_DRAG );
41       r( wxEVT_COMMAND_LIST_COL_DRAGGING );
42       r( wxEVT_COMMAND_LIST_COL_END_DRAG );
43       r( wxEVT_COMMAND_LIST_END_LABEL_EDIT );
44       r( wxEVT_COMMAND_LIST_DELETE_ITEM );
45       r( wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS );
46 #if WXPERL_W_VERSION_LE( 2, 5, 2 )
47       r( wxEVT_COMMAND_LIST_SET_INFO );
48       r( wxEVT_COMMAND_LIST_GET_INFO );
49 #endif
50       r( wxEVT_COMMAND_LIST_ITEM_SELECTED );
51       r( wxEVT_COMMAND_LIST_ITEM_DESELECTED );
52       r( wxEVT_COMMAND_LIST_KEY_DOWN );
53       r( wxEVT_COMMAND_LIST_INSERT_ITEM );
54       r( wxEVT_COMMAND_LIST_COL_CLICK );
55       r( wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK );
56       r( wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK );
57       r( wxEVT_COMMAND_LIST_ITEM_ACTIVATED );
58       r( wxEVT_COMMAND_LIST_ITEM_FOCUSED );
59       break;
60   case 'I':
61       r( wxIMAGE_LIST_NORMAL );         // listctrl
62       r( wxIMAGE_LIST_SMALL );          // listctrl
63       r( wxIMAGE_LIST_STATE );          // listctrl
64       break;
65   case 'L':
66       r( wxLIST_AUTOSIZE );             // listctrl
67       r( wxLIST_AUTOSIZE_USEHEADER );   // listctrl
68
69       r( wxLIST_ALIGN_DEFAULT );        // listctrl
70       r( wxLIST_ALIGN_LEFT );           // listctrl
71       r( wxLIST_ALIGN_TOP );            // listctrl
72       r( wxLIST_ALIGN_SNAP_TO_GRID );   // listctrl
73
74       r( wxLIST_FIND_UP );              // listctrl
75       r( wxLIST_FIND_DOWN );            // listctrl
76       r( wxLIST_FIND_LEFT );            // listctrl
77       r( wxLIST_FIND_RIGHT );           // listctrl
78
79       r( wxLIST_FORMAT_LEFT );          // listctrl
80       r( wxLIST_FORMAT_RIGHT );         // listctrl
81       r( wxLIST_FORMAT_CENTRE );        // listctrl
82       r( wxLIST_FORMAT_CENTER );        // listctrl
83
84       r( wxLIST_HITTEST_ABOVE );        // listctrl
85       r( wxLIST_HITTEST_BELOW );        // listctrl
86       r( wxLIST_HITTEST_NOWHERE );      // listctrl
87       r( wxLIST_HITTEST_ONITEMICON );   // listctrl
88       r( wxLIST_HITTEST_ONITEMLABEL );  // listctrl
89       r( wxLIST_HITTEST_ONITEMRIGHT );  // listctrl
90       r( wxLIST_HITTEST_ONITEMSTATEICON );// listctrl
91       r( wxLIST_HITTEST_TOLEFT );       // listctrl
92       r( wxLIST_HITTEST_TORIGHT );      // listctrl
93       r( wxLIST_HITTEST_ONITEM );       // listctrl
94
95 #if WXPERL_W_VERSION_GE( 2, 7, 2 )
96       r( wxLIST_GETSUBITEMRECT_WHOLEITEM ); // listctrl
97 #endif
98
99       r( wxLIST_MASK_STATE );           // listctrl
100       r( wxLIST_MASK_TEXT );            // listctrl
101       r( wxLIST_MASK_IMAGE );           // listctrl
102       r( wxLIST_MASK_DATA );            // listctrl
103       r( wxLIST_MASK_WIDTH );           // listctrl
104       r( wxLIST_MASK_FORMAT );          // listctrl
105
106       r( wxLIST_NEXT_ABOVE );           // listctrl
107       r( wxLIST_NEXT_ALL );             // listctrl
108       r( wxLIST_NEXT_BELOW );           // listctrl
109       r( wxLIST_NEXT_LEFT );            // listctrl
110       r( wxLIST_NEXT_RIGHT );           // listctrl
111
112       r( wxLIST_RECT_BOUNDS );          // listctrl
113       r( wxLIST_RECT_ICON );            // listctrl
114       r( wxLIST_RECT_LABEL );           // listctrl
115
116       r( wxLIST_STATE_DONTCARE );       // listctrl
117       r( wxLIST_STATE_DROPHILITED );    // listctrl
118       r( wxLIST_STATE_FOCUSED );        // listctrl
119       r( wxLIST_STATE_SELECTED );       // listctrl
120       r( wxLIST_STATE_CUT );            // listctrl
121
122       r( wxLIST_SET_ITEM );             // listctrl
123       r( wxLC_VRULES );                 // listctrl
124       r( wxLC_HRULES );                 // listctrl
125       r( wxLC_ICON );                   // listctrl
126       r( wxLC_SMALL_ICON );             // listctrl
127       r( wxLC_LIST );                   // listctrl
128       r( wxLC_REPORT );                 // listctrl
129       r( wxLC_ALIGN_TOP );              // listctrl
130       r( wxLC_ALIGN_LEFT );             // listctrl
131       r( wxLC_AUTOARRANGE );            // listctrl
132       r( wxLC_USER_TEXT );              // listctrl
133       r( wxLC_EDIT_LABELS );            // listctrl
134       r( wxLC_NO_HEADER );              // listctrl
135       r( wxLC_NO_SORT_HEADER );         // listctrl
136       r( wxLC_SINGLE_SEL );             // listctrl
137       r( wxLC_SORT_ASCENDING );         // listctrl
138       r( wxLC_SORT_DESCENDING );        // listctrl
139       r( wxLC_VIRTUAL );                // listctrl
140       break;
141   }
142 #undef r
143
144   WX_PL_CONSTANT_CLEANUP();
145 }
146
147 wxPlConstants listctrl_module( &listctrl_constant );
148
149 wxString wxPliListCtrl::OnGetItemText( long item, long column ) const
150 {
151     dTHX;
152     wxPliVirtualCallback* cb = (wxPliVirtualCallback*)&m_callback;
153     if( wxPliVirtualCallback_FindCallback( aTHX_ cb, "OnGetItemText" ) )
154     {                                                                         
155         SV* ret = wxPliVirtualCallback_CallCallback( aTHX_ cb, G_SCALAR,
156                                                      "ll", item, column );
157         wxString val;
158         WXSTRING_INPUT( val, char*, ret );
159         SvREFCNT_dec( ret );
160         return val;
161     }
162
163     return wxListCtrl::OnGetItemText( item, column );
164 }
165
166 int wxPliListCtrl::OnGetItemImage( long item ) const
167 {
168     dTHX;
169     wxPliVirtualCallback* cb = (wxPliVirtualCallback*)&m_callback;
170     if( wxPliVirtualCallback_FindCallback( aTHX_ cb, "OnGetItemImage" ) )           
171     {                                                                         
172         SV* ret = wxPliVirtualCallback_CallCallback( aTHX_ cb,
173                                                      G_SCALAR, "l", item );
174         int val = SvIV( ret );
175         SvREFCNT_dec( ret );
176         return val;
177     }
178
179     return wxListCtrl::OnGetItemImage( item );
180 }
181
182 wxListItemAttr* wxPliListCtrl::OnGetItemAttr( long item ) const
183 {
184     dTHX;
185     wxPliVirtualCallback* cb = (wxPliVirtualCallback*)&m_callback;
186     if( wxPliVirtualCallback_FindCallback( aTHX_ cb, "OnGetItemAttr" ) )
187     {                                                                         
188         SV* ret = wxPliVirtualCallback_CallCallback( aTHX_ cb,
189                                                      G_SCALAR, "l", item );
190         wxListItemAttr* val = (wxListItemAttr*)
191             wxPli_sv_2_object( aTHX_ ret, "Wx::ListItemAttr" );
192         val = val ? new wxListItemAttr( *val ) : NULL;
193         SvREFCNT_dec( ret );
194         return val;
195     }
196
197     return wxListCtrl::OnGetItemAttr( item );
198 }
199
200 #if WXPERL_W_VERSION_GE( 2, 7, 2 )
201 DEF_V_CBACK_INT__LONG_LONG_const( wxPliListCtrl, wxListCtrl, OnGetItemColumnImage );
202 #endif
203
204 //
205 // Wx::TreeCtrl implementation
206 //
207
208 WXPLI_IMPLEMENT_DYNAMIC_CLASS( wxPliTreeCtrl, wxTreeCtrl );
209
210 double treectrl_constant( const char* name, int arg )
211 {
212   // !package: Wx
213   // !parser: sub { $_[0] =~ m<^\s*r\w*\(\s*(\w+)\s*\);\s*(?://(.*))?$> }
214   // !tag:
215 #define r( n ) \
216     if( strEQ( name, #n ) ) \
217         return n;
218
219   WX_PL_CONSTANT_INIT();
220
221   switch( fl ) {
222   case 'E':
223       r( wxEVT_COMMAND_TREE_BEGIN_DRAG );
224       r( wxEVT_COMMAND_TREE_BEGIN_RDRAG );
225       r( wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT );
226       r( wxEVT_COMMAND_TREE_END_LABEL_EDIT );
227       r( wxEVT_COMMAND_TREE_DELETE_ITEM );
228       r( wxEVT_COMMAND_TREE_GET_INFO );
229       r( wxEVT_COMMAND_TREE_SET_INFO );
230       r( wxEVT_COMMAND_TREE_ITEM_EXPANDED );
231       r( wxEVT_COMMAND_TREE_ITEM_EXPANDING );
232       r( wxEVT_COMMAND_TREE_ITEM_COLLAPSED );
233       r( wxEVT_COMMAND_TREE_ITEM_COLLAPSING );
234       r( wxEVT_COMMAND_TREE_SEL_CHANGED );
235       r( wxEVT_COMMAND_TREE_SEL_CHANGING );
236       r( wxEVT_COMMAND_TREE_KEY_DOWN );
237       r( wxEVT_COMMAND_TREE_ITEM_ACTIVATED );
238 #if WXPERL_W_VERSION_GE( 2, 6, 0 )
239       r( wxEVT_COMMAND_TREE_ITEM_MENU );
240 #endif
241       r( wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK );
242       r( wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK );
243       r( wxEVT_COMMAND_TREE_END_DRAG );
244 #if defined(__WXMSW__)
245       r( wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK );
246       r( wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP );
247 #endif
248
249       break;
250   case 'T':
251     r( wxTR_DEFAULT_STYLE );            // treectrl
252     r( wxTR_EDIT_LABELS );              // treectrl
253 #if WXPERL_W_VERSION_LT( 2, 9, 0 ) || WXWIN_COMPATIBILITY_2_8
254     r( wxTR_EXTENDED );                 // treectrl
255 #endif
256     r( wxTR_FULL_ROW_HIGHLIGHT );       // treectrl
257     r( wxTR_HAS_BUTTONS );              // treectrl
258     r( wxTR_HAS_VARIABLE_ROW_HEIGHT );  // treectrl
259     r( wxTR_HIDE_ROOT );                // treectrl
260     r( wxTR_LINES_AT_ROOT );            // treectrl
261     r( wxTR_MULTIPLE );                 // treectrl
262     r( wxTR_NO_BUTTONS );               // treectrl
263     r( wxTR_NO_LINES );                 // treectrl
264     r( wxTR_ROW_LINES );                // treectrl
265     r( wxTR_SINGLE );                   // treectrl
266     r( wxTR_TWIST_BUTTONS );            // treectrl
267
268     r( wxTreeItemIcon_Normal );         // treectrl
269     r( wxTreeItemIcon_Selected );       // treectrl
270     r( wxTreeItemIcon_Expanded );       // treectrl
271     r( wxTreeItemIcon_SelectedExpanded ); // treectrl
272
273     r( wxTREE_HITTEST_ABOVE );          // treectrl
274     r( wxTREE_HITTEST_BELOW );          // treectrl
275     r( wxTREE_HITTEST_NOWHERE );        // treectrl
276     r( wxTREE_HITTEST_ONITEMBUTTON );   // treectrl
277     r( wxTREE_HITTEST_ONITEMICON );     // treectrl
278     r( wxTREE_HITTEST_ONITEMINDENT );   // treectrl
279     r( wxTREE_HITTEST_ONITEMLABEL );    // treectrl
280     r( wxTREE_HITTEST_ONITEMRIGHT );    // treectrl
281     r( wxTREE_HITTEST_ONITEMSTATEICON ); // treectrl
282     r( wxTREE_HITTEST_TOLEFT );         // treectrl
283     r( wxTREE_HITTEST_TORIGHT );        // treectrl
284     r( wxTREE_HITTEST_ONITEMUPPERPART ); // treectrl
285     r( wxTREE_HITTEST_ONITEMLOWERPART ); // treectrl
286     r( wxTREE_HITTEST_ONITEM );         // treectrl
287     break;
288   default:
289     break;
290   }
291 #undef r
292
293   WX_PL_CONSTANT_CLEANUP();
294 }
295
296 wxPlConstants tree_module( &treectrl_constant );
297
298 int wxPliTreeCtrl::OnCompareItems( const wxTreeItemId& item1,
299                                    const wxTreeItemId& item2 )
300 {
301     dTHX;
302     if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback,
303                                            "OnCompareItems" ) )
304     {
305         SV* t1 = wxPli_non_object_2_sv( aTHX_ newSViv( 0 ),
306                                         (void*)&item1, "Wx::TreeItemId" );
307         SV* t2 = wxPli_non_object_2_sv( aTHX_ newSViv( 0 ),
308                                         (void*)&item2, "Wx::TreeItemId" );
309         SV* ret = wxPliVirtualCallback_CallCallback
310             ( aTHX_ &m_callback, G_SCALAR, "SS", t1, t2 );
311
312         sv_setiv( SvRV( t1 ), 0 );
313         sv_setiv( SvRV( t2 ), 0 );
314         int val = SvIV( ret );
315         SvREFCNT_dec( ret );
316         SvREFCNT_dec( t1 );
317         SvREFCNT_dec( t2 );
318
319         return val;
320     }
321     else
322         return wxTreeCtrl::OnCompareItems( item1, item2 );
323 }
324
325 // Local variables: //
326 // mode: c++ //
327 // End: //