#############################################################################
## Name: ActiveX.pm
## Purpose: Wx::ActiveX
## Author: Graciliano M. P.
## Modified by:
## Created: 25/08/2002
## RCS-ID:
## Copyright: (c) 2002 Graciliano M. P.
## Licence: This program is free software; you can redistribute it and/or
## modify it under the same terms as Perl itself
#############################################################################
package Wx::ActiveX;
use Wx;
use strict;
use vars qw(@ISA $VERSION $XS_NEW $AUTOLOAD);
############
# AUTOLOAD #
############
sub AUTOLOAD {
my ($method) = ( $AUTOLOAD =~ /:(\w+)$/gs ) ;
if ($method =~ /^DESTROY$/) { return ;}
my $activex = shift ;
return( $activex->Invoke($method,@_) ) ;
}
#########
# BEGIN #
#########
sub BEGIN {
@ISA = qw(Wx::Window);
$VERSION = '0.05';
Wx::wx_boot( 'Wx::ActiveX', $VERSION ) ;
$XS_NEW = \&new ;
*new = \&PLnew ;
}
#######
# NEW #
#######
sub PLnew {
my $class = shift ;
my $parent = shift ;
my $id = shift ;
my $activex ;
if ($id =~ /^\s*(\{[\w-]+\})\s*$/s) {
$id = $1 ;
$activex = Wx::ActiveX::newID($class,$parent,$id,@_) ;
}
else { $activex = &$XS_NEW($class,$parent,$id,@_) ;}
$activex = hash_ref($activex,$class) ;
return( $activex ) ;
}
###########
# PROPSET #
###########
sub PropSet {
my ( $activex , $name , $val ) = @_ ;
my $pt = $activex->PropType($name) ;
if ($pt eq 'bool') { $activex->PropSetBool($name , $val) ;}
elsif ($pt eq 'long'||$pt eq 'int') { $activex->PropSetInt($name , $val) ;}
else { $activex->PropSetString($name , $val) ;}
}
##############
# LISTEVENTS #
##############
sub ListEvents {
my $this = shift ;
my @events ;
for my $i (0..($this->GetEventCount-1)) {
my $evt_name = $this->GetEventName($i) ;
push(@events , $evt_name) if $evt_name ne '' ;
}
return( @events ) ;
}
#############
# LISTPROPS #
#############
sub ListProps {
my $this = shift ;
my @props ;
for my $i (0..($this->GetPropCount-1)) {
my $name = $this->GetPropName($i) ;
push(@props , $name) if $name ne '' ;
}
return( @props ) ;
}
###############
# LISTMETHODS #
###############
sub ListMethods {
my $this = shift ;
my @methods ;
for my $i (0..($this->GetMethodCount-1)) {
my $method = $this->GetMethodName($i) ;
push(@methods , $method) if $method ne '' ;
}
return( @methods ) ;
}
########################
# LISTMETHODS_AND_ARGS #
########################
sub ListMethods_and_Args {
my $this = shift ;
my @methods ;
for my $i (0..($this->GetMethodCount-1)) {
my $method = $this->GetMethodName($i) ;
my @args ;
for my $j (0..($this->GetMethodArgCount($i)-1)) {
my $arg = $this->GetMethodArgName($i,$j) ;
push(@args , $arg) if $arg ne '' ;
}
push(@methods , "$method(". join(" , ", @args) .")") if $method ne '' ;
}
return( @methods ) ;
}
#############################
# LISTMETHODS_AND_ARGS_HASH #
#############################
sub ListMethods_and_Args_Hash {
my $this = shift ;
my @methods ;
for my $i (0..($this->GetMethodCount-1)) {
my $method = $this->GetMethodName($i) ;
my @args ;
for my $j (0..($this->GetMethodArgCount($i)-1)) {
my $arg = $this->GetMethodArgName($i,$j) ;
push(@args , $arg) if $arg ne '' ;
}
push(@methods , $method , [$method]) if $method ne '' ;
}
return( @methods ) ;
}
################
# ACTIVEXINFOS #
################
sub ActivexInfos {
my $this = shift ;
my @evts = $this->ListEvents ;
my @props = $this->ListProps ;
my @methods = $this->ListMethods_and_Args ;
my $ret ;
$ret .= "\n" ;
foreach my $i ( @evts ) { $ret .= " $i\n" ;}
$ret .= "\n" ;
$ret .= "\n\n" ;
foreach my $i ( @props ) { $ret .= " $i\n" ;}
$ret .= "\n" ;
$ret .= "\n\n" ;
foreach my $i ( @methods ) { $ret .= " $i\n" ;}
$ret .= "\n" ;
return( $ret ) ;
}
############
# HASH_REF #
############
sub hash_ref {
return XS_hash_ref($_[0], ref($_[1]) || $_[1]);
}
####################
# WX::ACTIVEXEVENT #
####################
package Wx::ActiveXEvent;
use vars qw(@ISA);
@ISA = qw(Wx::CommandEvent Wx::EvtHandler);
my (%EVT_HANDLES) ;
no strict ;
############
# PARAMSET #
############
sub ParamSet {
my ( $evt , $idx , $val ) = @_ ;
my $pt = $evt->ParamType($idx) ;
if ($pt eq 'bool') { $evt->ParamSetBool($idx , $val) ;}
elsif ($pt eq 'long'||$pt eq 'int') { $evt->ParamSetInt($idx , $val) ;}
else { $evt->ParamSetString($idx , $val) ;}
}
###################
# ACTIVEXEVENTSUB #
###################
sub ActiveXEventSub {
my ( $sub ) = @_ ;
return( sub {
my $evt = $_[1] ;
$evt = Wx::ActiveX::hash_ref($evt,"Wx::ActiveXEvent") ;
for(0..($evt->ParamCount)-1) {
my $pn = $evt->ParamName($_);
my $pv = $evt->ParamVal($_);
$evt->{$pn} = $pv ;
$evt->{ParamID}{$pn} = $_ ;
}
my @ret = &$sub( $_[0] , $evt ) ;
for(0..($evt->ParamCount)-1) {
my $pn = $evt->ParamName($_);
my $pv = $evt->ParamVal($_);
if ($pv ne $evt->{$pn}) { $evt->ParamSet($_, $evt->{$pn} ) ;}
}
return( @ret ) ;
}) ;
}
###########
# DESTROY #
###########
sub DESTROY { 1 ;}
#######
# END #
#######
1;
__END__
=head1 NAME
Wx::ActiveX - ActiveX interface.
=head1 DESCRIPTION
Load ActiveX controls for wxWindows.
=head1 SYNOPSIS
use Wx::ActiveX ;
my $activex = Wx::ActiveX->new( $this , "ShockwaveFlash.ShockwaveFlash" , 101 , wxDefaultPosition , wxDefaultSize ) ;
$activex->Invoke("LoadMovie",'0',"file:///F:/swf/test.swf") ;
$activex->PropSet("Quality",'Best') ;
my $frames_n = $activex->PropVal("TotalFrames") ;
$activex->Invoke("Play") ;
... or ...
$activex->Play ;
=head1 METHODS
=head2 new ( PARENT , CONTROL_ID , ID , POS , SIZE )
Create the ActiveX control.
PARENT need to be a Wx::Window object.
CONTROL_ID The control ID (PROGID/string).
=head2 PropVal ( PROP_NAME )
Get the value of a propriety of the control.
=head2 PropSet ( PROP_NAME , VALUE )
Set a propriety of the control.
PROP_NAME The propriety name.
VALUE The value(s).
=head2 PropType ( PROP_NAME )
Return the type of the propriety.
=head2 GetEventCount
Returnt the number of events that the control have.
=head2 GetPropCount
Returnt the number of proprieties.
=head2 GetMethodCount
Returnt the number of control methods.
=head2 GetEventName( X )
Returnt the name of the event X, where X is a integer.
=head2 GetPropName( X )
Returnt the name of the propriety X, where X is a integer.
=head2 GetMethodName( X )
Returnt the name of the method X, where X is a integer.
=head2 GetMethodArgCount( MethodX )
Returnt the number of arguments of the MethodX.
=head2 GetMethodArgName( MethodX , ArgX )
Returnt the name of the ArgX of MethodX.
=head2 ListEvents()
Return an ARRAY with all the events names.
=head2 ListProps()
Return an ARRAY with all the proprieties names.
=head2 ListMethods()
Return an ARRAY with all the methods names.
=head2 ListMethods_and_Args()
Return an ARRAY with all the methods names and arguments. like:
foo(argx, argy)
=head2 ListMethods_and_Args_Hash()
Return a HASH with all the methods names (keys) and arguments (values). The arguments are inside a ARRAY ref:
my %methods = $activex->ListMethods_and_Args_Hash ;
my @args = @{ $methods{foo} } ;
=head2 ActivexInfos()
Return a string with all the informations about the ActiveX Control:
MouseUp
MouseMove
MouseDown
FileName
Close()
Load(file)
=head1 Win32::OLE
From version 0.5 Wx::ActiveX is compatible with Win32::OLE objects:
use Wx::ActiveX ;
use Win32::OLE ;
my $activex = Wx::ActiveX->new( $this , "ShockwaveFlash.ShockwaveFlash" , 101 , wxDefaultPosition , wxDefaultSize ) ;
my $OLE = $activex->GetOLE() ;
$OLE->LoadMovie('0' , "file:///F:/swf/test.swf") ;
$OLE->Play() ;
=head1 EVENTS
All the events use EVT_ACTIVEX.
EVT_ACTIVEX($parent , $activex , "EventName" , sub{...} ) ;
** You can get the list of ActiveX events using ListEvents():
Eache ActiveX event has their own argument list (hash), and the Key 'Cancel' can be used to ignore the event. In this example any new window will be canceled, seting $evt->{Cancel} to true:
EVT_ACTIVEX($this,$activex, "EventX" , sub{
my ( $obj , $evt ) = @_ ;
$evt->{Cancel} = 1 ;
}) ;
=head1 NOTE
This package only works for Win32, since it use ActiveX.
=head1 SEE ALSO
L, L, L, L
=head1 AUTHOR
Graciliano M. P.
Thanks to Simon Flack , for the compatibility of Wx::ActiveX objetc with Win32::OLE and MingW tests.
Thanks to wxWindows peoples and Mattia Barbon for wxPerl! ;-P
Thanks to Justin Bradford and Lindsay Mathieson , that wrote the original C++ classes for wxActiveX and wxIEHtmlWin.
=head1 COPYRIGHT
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
=cut
# Local variables: #
# mode: cperl #
# End: #