Hi all,
This is my first post to the list, so forgive me if this was discussed
before.
Reflecting the Win32 API, Win32::GUI::TreeView has a GetParent method to
get the parent node (HTREEITEM) of a node, nothing related with the
GetParent common method of Win32::GUI.
The common call
my $parentWin = $SomeControl->GetParent();
simply don't work when $SomeContros isa TreeView, so right now when I
need the parent window of the TV control we must use an ugly workaround:
my $parentWin = Win32::GUI::GetParent($TreeView);
The following patch cures that, properly subclassing the TreeView with
only minimal semantic changes IMHO:
When called without NODE or with NODE equal zero (NULL, an invalid
HTREEITEM value anyway) now TreeView::GetParent() returns the parent
window, if any, or undef as Win32::GUI::GetParent() does.
Any other value for NODE returns the handler of the parent NODE (or NULL
at the root NODE) as documented.
So the following works as spected:
sub TV_NodeClick { # Click on a node, OEM form
my($TreeView, $node) = @_;
my $parentWin = $TreeView->GetParent();
my $parentNode = $TreeView->GetParent($node);
...
Comments?
========= CUT ==========
--- Win32-GUI/TreeView.xs 2006-04-13 17:17:07.000000000 -0500
+++ /home/sog/dosdir/work/Win32-GUI-1.05_01/TreeView.xs 2007-06-22
00:59:20.000000000 -0500
@@ -583,15 +583,32 @@
###########################################################################
# (@)METHOD:GetParent(NODE)
- # Returns the handle of the parent node for the given B<NODE>.
-HTREEITEM
-GetParent(handle,item)
+ # Returns the handle of the parent node for the B<NODE>, if given
+ # or the parent window of the TV control if not.
+void
+GetParent(handle,item = 0)
HWND handle
HTREEITEM item
-CODE:
- RETVAL = TreeView_GetParent(handle, item);
-OUTPUT:
- RETVAL
+PREINIT:
+ HWND parentHandle;
+ SV* SvParent;
+PPCODE:
+ if (item) {
+ XSRETURN_IV((long) TreeView_GetParent(handle, item));
+ } else {
+ parentHandle = GetParent(handle);
+ if (parentHandle != NULL) {
+ SvParent = SV_SELF_FROM_WINDOW(parentHandle);
+ if (SvParent != NULL && SvROK(SvParent)) {
+ XPUSHs(SvParent);
+ } else {
+ XSRETURN_UNDEF;
+ }
+ } else {
+ XSRETURN_UNDEF;
+ }
+ }
+
###########################################################################
# (@)METHOD:GetPrevSibling(NODE)
=========== CUT ==============
Bests Regards.
--
Salvador Ortiz.