* *
* update copyright headers with new FSF postal address
* COPYING.txt -> LICENSE.txt (rest of repo to be synced)
1250 lines
31 KiB
Plaintext
1250 lines
31 KiB
Plaintext
/*
|
|
* Source file for the Wvg*Classes
|
|
*
|
|
* Copyright 2008-2012 Pritpal Bedi <bedipritpal@hotmail.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; see the file LICENSE.txt. If not, write to
|
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
* Boston, MA 02110-1301 USA (or visit https://www.gnu.org/licenses/).
|
|
*
|
|
* As a special exception, the Harbour Project gives permission for
|
|
* additional uses of the text contained in its release of Harbour.
|
|
*
|
|
* The exception is that, if you link the Harbour libraries with other
|
|
* files to produce an executable, this does not by itself cause the
|
|
* resulting executable to be covered by the GNU General Public License.
|
|
* Your use of that executable is in no way restricted on account of
|
|
* linking the Harbour library code into it.
|
|
*
|
|
* This exception does not however invalidate any other reasons why
|
|
* the executable file might be covered by the GNU General Public License.
|
|
*
|
|
* This exception applies only to the code released by the Harbour
|
|
* Project under the name Harbour. If you copy code from other
|
|
* Harbour Project or Free Software Foundation releases into a copy of
|
|
* Harbour, as the General Public License permits, the exception does
|
|
* not apply to the code that you add in this way. To avoid misleading
|
|
* anyone as to the status of such modified files, you must delete
|
|
* this exception notice from them.
|
|
*
|
|
* If you write modifications of your own for Harbour, it is your choice
|
|
* whether to permit this exception to apply to your modifications.
|
|
* If you do not wish that, delete this exception notice.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* EkOnkar
|
|
* ( The LORD is ONE )
|
|
*
|
|
* Xbase++ Compatible xbpWindow Class
|
|
*
|
|
* Pritpal Bedi <bedipritpal@hotmail.com>
|
|
* 08Nov2008
|
|
*/
|
|
//
|
|
|
|
#include "hbclass.ch"
|
|
#include "inkey.ch"
|
|
#include "hbgtinfo.ch"
|
|
|
|
#include "hbgtwvg.ch"
|
|
#include "wvtwin.ch"
|
|
#include "wvgparts.ch"
|
|
|
|
//
|
|
// To Switch Over from ASCALLBACK() to SET/GET_Prop() calls
|
|
//
|
|
#if 0
|
|
#define __BYASCALLBACK__
|
|
#else
|
|
#define __BYSETPROP__
|
|
#endif
|
|
|
|
CREATE CLASS WvgWindow INHERIT WvgPartHandler
|
|
|
|
/* CONFIGURATION */
|
|
VAR animate INIT .F.
|
|
VAR clipChildren INIT .F.
|
|
VAR clipParent INIT .F.
|
|
VAR clipSiblings INIT .T.
|
|
VAR group INIT 0 /* XBP_NO_GROUP */
|
|
VAR sizeRedraw INIT .F.
|
|
VAR tabStop INIT .F.
|
|
VAR visible INIT .T.
|
|
|
|
VAR pointerFocus INIT .T.
|
|
|
|
/* RUNTIME VAR */
|
|
VAR dropZone INIT .F.
|
|
VAR helpLink
|
|
VAR s_tooltipText INIT ""
|
|
METHOD tooltipText SETGET
|
|
|
|
VAR clr_FG
|
|
VAR clr_BG
|
|
VAR fnt_COMMPOUNDNAME
|
|
VAR fnt_hFont
|
|
|
|
/* CALLBACK SLOTS */
|
|
VAR sl_enter
|
|
VAR sl_leave
|
|
VAR sl_lbClick
|
|
VAR sl_lbDblClick
|
|
VAR sl_lbDown
|
|
VAR sl_lbUp
|
|
VAR sl_mbClick
|
|
VAR sl_mbDblClick
|
|
VAR sl_mbDown
|
|
VAR sl_mbUp
|
|
VAR sl_motion
|
|
VAR sl_rbClick
|
|
VAR sl_rbDblClick
|
|
VAR sl_rbDown
|
|
VAR sl_rbUp
|
|
VAR sl_wheel
|
|
|
|
VAR sl_helpRequest
|
|
VAR sl_keyboard
|
|
VAR sl_killInputFocus
|
|
VAR sl_move
|
|
VAR sl_paint
|
|
VAR sl_quit
|
|
VAR sl_resize
|
|
VAR sl_setInputFocus
|
|
VAR sl_dragEnter
|
|
VAR sl_dragMotion
|
|
VAR sl_dragLeave
|
|
VAR sl_dragDrop
|
|
|
|
VAR sl_close
|
|
VAR sl_setDisplayFocus
|
|
VAR sl_killDisplayFocus
|
|
|
|
VAR hBrushBG
|
|
VAR is_hidden INIT .F.
|
|
VAR is_enabled INIT .T.
|
|
VAR title INIT " "
|
|
VAR icon INIT 0
|
|
VAR closable INIT .T.
|
|
VAR resizable INIT .T.
|
|
VAR resizeMode INIT 0
|
|
VAR style INIT WS_OVERLAPPEDWINDOW
|
|
VAR exStyle INIT 0
|
|
VAR lModal INIT .F.
|
|
VAR pGTp
|
|
VAR pGT
|
|
VAR objType INIT objTypeNone
|
|
VAR className INIT ""
|
|
|
|
VAR hWnd
|
|
VAR pWnd
|
|
VAR aPos INIT { 0, 0 }
|
|
VAR aSize INIT { 0, 0 }
|
|
VAR aPresParams INIT {}
|
|
VAR lHasInputFocus INIT .F.
|
|
VAR nFrameState INIT 0 /* normal */
|
|
|
|
VAR maxCol INIT 79
|
|
VAR maxRow INIT 24
|
|
VAR mouseMode INIT 1
|
|
|
|
VAR nID INIT 0
|
|
VAR nControlID INIT 5000
|
|
VAR nOldProc INIT 0
|
|
|
|
VAR oMenu
|
|
|
|
VAR nTop
|
|
VAR nLeft
|
|
VAR nBottom
|
|
VAR nRight
|
|
|
|
VAR hWndTT
|
|
|
|
METHOD new( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
|
|
METHOD create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
|
|
METHOD configure( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
|
|
METHOD destroy()
|
|
METHOD SetWindowProcCallback()
|
|
|
|
METHOD captureMouse()
|
|
METHOD currentPos()
|
|
METHOD currentSize()
|
|
METHOD disable()
|
|
METHOD enable()
|
|
METHOD getHWND()
|
|
METHOD getModalState()
|
|
METHOD hasInputFocus()
|
|
METHOD hide()
|
|
METHOD invalidateRect( aRect )
|
|
METHOD lockPS()
|
|
METHOD lockUpdate()
|
|
METHOD isDerivedFrom( cClassORoObject )
|
|
METHOD setColorBG( nRGB )
|
|
METHOD setModalState()
|
|
METHOD setPointer()
|
|
METHOD setTrackPointer()
|
|
METHOD setPos( aPos, lPaint )
|
|
METHOD setPosAndSize( aPos, aSize, lPaint )
|
|
METHOD setSize( aSize, lPaint )
|
|
METHOD setFont()
|
|
METHOD setFontCompoundName( xFont )
|
|
METHOD setPresParam()
|
|
METHOD show()
|
|
METHOD toBack()
|
|
METHOD toFront()
|
|
METHOD unlockPS()
|
|
METHOD winDevice()
|
|
|
|
METHOD Initialize( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
|
|
METHOD setFocus()
|
|
METHOD sendMessage( nMessage, nlParam, nwParam )
|
|
METHOD findObjectByHandle( hWnd )
|
|
|
|
METHOD getControlID() INLINE ++::nControlID
|
|
METHOD HandleEvent() INLINE EVENT_UNHANDELLED
|
|
METHOD isEnabled() INLINE ::is_enabled
|
|
METHOD isVisible() INLINE ! ::is_hidden
|
|
METHOD setColorFG( nRGB ) INLINE ::clr_FG := iif( HB_ISSTRING( nRGB ), Wvt_GetRGBColorByString( nRGB, 0 ), nRGB ), ::invalidateRect()
|
|
|
|
METHOD enter( xParam ) SETGET
|
|
METHOD leave( xParam ) SETGET
|
|
METHOD lbClick( xParam ) SETGET
|
|
METHOD lbDblClick( xParam ) SETGET
|
|
METHOD lbDown( xParam ) SETGET
|
|
METHOD lbUp( xParam ) SETGET
|
|
METHOD mbClick( xParam ) SETGET
|
|
METHOD mbDblClick( xParam ) SETGET
|
|
METHOD mbDown( xParam ) SETGET
|
|
METHOD mbUp( xParam ) SETGET
|
|
METHOD motion( xParam ) SETGET
|
|
METHOD rbClick( xParam ) SETGET
|
|
METHOD rbDblClick( xParam ) SETGET
|
|
METHOD rbDown( xParam ) SETGET
|
|
METHOD rbUp( xParam ) SETGET
|
|
METHOD wheel( xParam ) SETGET
|
|
METHOD close( xParam ) SETGET
|
|
METHOD helpRequest( xParam ) SETGET
|
|
METHOD keyboard( xParam ) SETGET
|
|
METHOD killDisplayFocus( xParam ) SETGET
|
|
METHOD killInputFocus( xParam ) SETGET
|
|
METHOD move( xParam ) SETGET
|
|
METHOD paint( xParam ) SETGET
|
|
METHOD quit( xParam, xParam1 ) SETGET
|
|
METHOD resize( xParam, xParam1 ) SETGET
|
|
METHOD setDisplayFocus( xParam ) SETGET
|
|
METHOD setInputFocus( xParam ) SETGET
|
|
METHOD dragEnter( xParam, xParam1 ) SETGET
|
|
METHOD dragMotion( xParam ) SETGET
|
|
METHOD dragLeave( xParam ) SETGET
|
|
METHOD dragDrop( xParam, xParam1 ) SETGET
|
|
|
|
PROTECTED:
|
|
|
|
METHOD getPosAndSize( aPs, aSz )
|
|
METHOD isParentCrt() INLINE ( ::oParent:objType == objTypeCrt )
|
|
METHOD rePosition()
|
|
METHOD createControl()
|
|
|
|
ENDCLASS
|
|
|
|
METHOD WvgWindow:new( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
|
|
|
|
__defaultNIL( @oParent , ::oParent )
|
|
__defaultNIL( @oOwner , ::oOwner )
|
|
__defaultNIL( @aPos , ::aPos )
|
|
__defaultNIL( @aSize , ::aSize )
|
|
__defaultNIL( @aPresParams, ::aPresParams )
|
|
__defaultNIL( @lVisible , ::visible )
|
|
|
|
::oParent := oParent
|
|
::oOwner := oOwner
|
|
::aPos := aPos
|
|
::aSize := aSize
|
|
::aPresParams := aPresParams
|
|
::visible := lVisible
|
|
|
|
::WvgPartHandler:new( oParent, oOwner )
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
|
|
|
|
__defaultNIL( @oParent , ::oParent )
|
|
__defaultNIL( @oOwner , ::oOwner )
|
|
__defaultNIL( @aPos , ::aPos )
|
|
__defaultNIL( @aSize , ::aSize )
|
|
__defaultNIL( @aPresParams, ::aPresParams )
|
|
__defaultNIL( @lVisible , ::visible )
|
|
|
|
::oParent := oParent
|
|
::oOwner := oOwner
|
|
::aPos := aPos
|
|
::aSize := aSize
|
|
::aPresParams := aPresParams
|
|
::visible := lVisible
|
|
|
|
IF Empty( ::oParent )
|
|
IF !( __objGetClsName( Self ) $ "WVGCRT,WVGDIALOG" )
|
|
::oParent := WvgSetAppWindow()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
::WvgPartHandler:create( oParent, oOwner )
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:configure( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
|
|
|
|
__defaultNIL( @oParent , ::oParent )
|
|
__defaultNIL( @oOwner , ::oOwner )
|
|
__defaultNIL( @aPos , ::aPos )
|
|
__defaultNIL( @aSize , ::aSize )
|
|
__defaultNIL( @aPresParams, ::aPresParams )
|
|
__defaultNIL( @lVisible , ::visible )
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:destroy()
|
|
|
|
IF ! Empty( ::oParent )
|
|
::oParent:removeChild( Self )
|
|
ENDIF
|
|
|
|
IF Len( ::aChildren ) > 0
|
|
AEval( ::aChildren, {| o | o:destroy() } )
|
|
::aChildren := {}
|
|
ENDIF
|
|
|
|
Wvg_ReleaseWindowProcBlock( ::pWnd )
|
|
|
|
IF Wvg_IsWindow( ::hWndTT )
|
|
Wvg_DestroyWindow( ::hWndTT )
|
|
ENDIF
|
|
IF Wvg_IsWindow( ::hWnd )
|
|
Wvg_DestroyWindow( ::hWnd )
|
|
ENDIF
|
|
|
|
IF ::hBrushBG != NIL
|
|
Wvg_DeleteObject( ::hBrushBG )
|
|
ENDIF
|
|
|
|
::hWnd := NIL
|
|
::hWndTT := NIL
|
|
::pWnd := NIL
|
|
::aPos := NIL
|
|
::aSize := NIL
|
|
::aPresParams := NIL
|
|
::lHasInputFocus := NIL
|
|
::nFrameState := NIL
|
|
::maxCol := NIL
|
|
::maxRow := NIL
|
|
::mouseMode := NIL
|
|
::nID := NIL
|
|
::nControlID := NIL
|
|
::nOldProc := NIL
|
|
::oMenu := NIL
|
|
::animate := NIL
|
|
::clipChildren := NIL
|
|
::clipParent := NIL
|
|
::clipSiblings := NIL
|
|
::group := NIL
|
|
::sizeRedraw := NIL
|
|
::tabStop := NIL
|
|
::visible := NIL
|
|
::dropZone := NIL
|
|
::helpLink := NIL
|
|
::tooltipText := NIL
|
|
::clr_FG := NIL
|
|
::clr_BG := NIL
|
|
::fnt_COMMPOUNDNAME := NIL
|
|
::fnt_hFont := NIL
|
|
::sl_enter := NIL
|
|
::sl_leave := NIL
|
|
::sl_lbClick := NIL
|
|
::sl_lbDblClick := NIL
|
|
::sl_lbDown := NIL
|
|
::sl_lbUp := NIL
|
|
::sl_mbClick := NIL
|
|
::sl_mbDblClick := NIL
|
|
::sl_mbDown := NIL
|
|
::sl_mbUp := NIL
|
|
::sl_motion := NIL
|
|
::sl_rbClick := NIL
|
|
::sl_rbDblClick := NIL
|
|
::sl_rbDown := NIL
|
|
::sl_rbUp := NIL
|
|
::sl_wheel := NIL
|
|
::sl_helpRequest := NIL
|
|
::sl_keyboard := NIL
|
|
::sl_killInputFocus := NIL
|
|
::sl_move := NIL
|
|
::sl_paint := NIL
|
|
::sl_quit := NIL
|
|
::sl_resize := NIL
|
|
::sl_setInputFocus := NIL
|
|
::sl_dragEnter := NIL
|
|
::sl_dragMotion := NIL
|
|
::sl_dragLeave := NIL
|
|
::sl_dragDrop := NIL
|
|
::sl_close := NIL
|
|
::sl_setDisplayFocus := NIL
|
|
::sl_killDisplayFocus := NIL
|
|
|
|
RETURN NIL
|
|
|
|
METHOD WvgWindow:SetWindowProcCallback()
|
|
|
|
::nOldProc := Wvg_SetWindowProcBlock( ::pWnd, {| h, m, w, l | ::ControlWndProc( h, m, w, l ) } )
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:captureMouse()
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:disable()
|
|
|
|
IF Wvg_EnableWindow( ::hWnd, .F. )
|
|
::is_enabled := .F.
|
|
RETURN .T.
|
|
ENDIF
|
|
|
|
RETURN .F.
|
|
|
|
METHOD WvgWindow:enable()
|
|
|
|
IF Wvg_EnableWindow( ::hWnd, .T. )
|
|
::is_enabled := .T.
|
|
RETURN .T.
|
|
ENDIF
|
|
|
|
RETURN .F.
|
|
|
|
METHOD WvgWindow:hide()
|
|
|
|
IF Wvg_IsWindow( ::hWnd )
|
|
Wvg_ShowWindow( ::hWnd, SW_HIDE )
|
|
::is_hidden := .T.
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:invalidateRect( aRect )
|
|
|
|
RETURN Wvg_InvalidateRect( ::hWnd, aRect )
|
|
|
|
METHOD WvgWindow:lockPS()
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:lockUpdate()
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:setColorBG( nRGB )
|
|
|
|
LOCAL hBrush
|
|
|
|
IF HB_ISSTRING( nRGB )
|
|
nRGB := Wvt_GetRGBColorByString( nRGB, 1 )
|
|
ENDIF
|
|
IF HB_ISNUMERIC( nRGB )
|
|
hBrush := Wvg_CreateBrush( BS_SOLID, nRGB, 0 )
|
|
IF hBrush != 0
|
|
::clr_BG := nRGB
|
|
::hBrushBG := hBrush
|
|
|
|
IF ::className() == "WVGDIALOG" .OR. __objGetClsName( Self ) == "WVGCHECKBOX"
|
|
Wvg_SetCurrentBrush( ::hWnd, ::hBrushBG )
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:setModalState()
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:setPointer()
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:setTrackPointer()
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:setPos( aPos, lPaint )
|
|
|
|
LOCAL aPosSz
|
|
|
|
IF HB_ISARRAY( aPos )
|
|
__defaultNIL( @lPaint, .T. )
|
|
|
|
SWITCH ::objType
|
|
|
|
CASE objTypeCrt
|
|
EXIT
|
|
|
|
OTHERWISE
|
|
aPosSz := ::getPosAndSize( aPos )
|
|
Wvg_SetWindowPosition( ::hWnd, aPosSz[ 1 ], aPosSz[ 2 ], lPaint )
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:rePosition() /* This will always be called from HB_GTE_RESIZED message of WVG engine */
|
|
|
|
RETURN ::setPosAndSize( ::aPos, ::aSize )
|
|
|
|
METHOD WvgWindow:setPosAndSize( aPos, aSize, lPaint )
|
|
|
|
LOCAL aPosSz
|
|
|
|
__defaultNIL( @aPos , ::aPos )
|
|
__defaultNIL( @aSize, ::aSize )
|
|
|
|
IF HB_ISARRAY( aPos ) .AND. HB_ISARRAY( aSize )
|
|
__defaultNIL( @lPaint, .T. )
|
|
|
|
SWITCH ::objType
|
|
|
|
CASE objTypeCrt
|
|
EXIT
|
|
|
|
OTHERWISE
|
|
aPosSz := ::getPosAndSize( aPos, aSize )
|
|
Wvg_SetWindowPosAndSize( ::hWnd, aPosSz[ 1 ], aPosSz[ 2 ], aPosSz[ 3 ], aPosSz[ 4 ], lPaint )
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:setSize( aSize, lPaint )
|
|
|
|
LOCAL aPosSz
|
|
|
|
IF HB_ISARRAY( aSize )
|
|
__defaultNIL( @lPaint, .T. )
|
|
|
|
SWITCH ::objType
|
|
|
|
CASE objTypeCrt
|
|
EXIT
|
|
|
|
OTHERWISE
|
|
aPosSz := ::getPosAndSize( , aSize )
|
|
Wvg_SetWindowSize( ::hWnd, aPosSz[ 3 ], aPosSz[ 4 ], lPaint )
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:isDerivedFrom( cClassORoObject )
|
|
|
|
LOCAL lTrue := .F.
|
|
LOCAL cCls := __objGetClsName( self )
|
|
|
|
/* Compares without Xbp or Wvg prefixes */
|
|
|
|
IF HB_ISSTRING( cClassORoObject )
|
|
IF Upper( SubStr( cClassORoObject, 4 ) ) == Upper( SubStr( cCls, 4 ) )
|
|
lTrue := .T.
|
|
ENDIF
|
|
|
|
ELSEIF HB_ISOBJECT( cClassORoObject )
|
|
IF Upper( SubStr( cClassORoObject:className(), 4 ) ) == Upper( SubStr( cCls, 4 ) )
|
|
lTrue := .T.
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN lTrue
|
|
|
|
METHOD WvgWindow:show()
|
|
|
|
Wvg_ShowWindow( ::hWnd, SW_NORMAL )
|
|
::is_hidden := .F.
|
|
::lHasInputFocus := .T.
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:toBack()
|
|
|
|
RETURN Wvg_SetWindowPosToBack( ::hWnd )
|
|
|
|
METHOD WvgWindow:toFront()
|
|
|
|
/*RETURN Wvg_SetForegroundWindow( ::hWnd ) */
|
|
|
|
RETURN Wvg_SetWindowPosToTop( ::hWnd )
|
|
|
|
METHOD WvgWindow:unlockPS()
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:winDevice()
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:SetFont()
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:setFontCompoundName( xFont )
|
|
|
|
LOCAL cOldFont, s, n, nPoint, cFont, cAttr, cFace
|
|
LOCAL aAttr := { "normal", "italic", "bold" }
|
|
|
|
cOldFont := ::fnt_COMMPOUNDNAME
|
|
|
|
IF HB_ISNUMERIC( cFont )
|
|
|
|
ELSE
|
|
IF ! Empty( xFont )
|
|
cFont := xFont
|
|
s := Lower( cFont )
|
|
n := AScan( aAttr, {| e | At( e, cFont ) > 0 } )
|
|
IF n > 0
|
|
cAttr := aAttr[ n ]
|
|
n := At( cAttr, s )
|
|
cFont := SubStr( cFont, 1, n - 1 )
|
|
ELSE
|
|
cAttr := "normal"
|
|
ENDIF
|
|
|
|
IF ( n := At( ".", cFont ) ) > 0
|
|
nPoint := Val( SubStr( cFont, 1, n - 1 ) )
|
|
cFont := SubStr( cFont, n + 1 )
|
|
ELSE
|
|
nPoint := 0
|
|
ENDIF
|
|
|
|
cFace := AllTrim( cFont )
|
|
|
|
HB_SYMBOL_UNUSED( cFace )
|
|
HB_SYMBOL_UNUSED( cAttr )
|
|
HB_SYMBOL_UNUSED( nPoint )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN cOldFont
|
|
|
|
METHOD WvgWindow:setPresParam()
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:currentPos()
|
|
|
|
LOCAL aRect := Wvg_GetWindowRect( ::hWnd )
|
|
|
|
RETURN { aRect[ 1 ], aRect[ 2 ] }
|
|
|
|
METHOD WvgWindow:currentSize()
|
|
|
|
LOCAL aRect
|
|
|
|
aRect := Wvg_GetClientRect( ::hWnd )
|
|
|
|
RETURN { aRect[ 3 ] - aRect[ 1 ], aRect[ 4 ] - aRect[ 2 ] }
|
|
|
|
METHOD WvgWindow:getHWND()
|
|
|
|
RETURN ::hWnd
|
|
|
|
METHOD WvgWindow:getModalState()
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:hasInputFocus()
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:enter( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_enter )
|
|
Eval( ::sl_enter, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_enter := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:leave( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_leave )
|
|
Eval( ::sl_leave, NIL, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_leave := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:lbClick( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_lbClick )
|
|
Eval( ::sl_lbClick, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_lbClick := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:lbDblClick( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_lbDblClick )
|
|
Eval( ::sl_lbDblClick, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_lbDblClick := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:lbDown( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_lbDown )
|
|
Eval( ::sl_lbDown, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_lbDown := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:lbUp( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_lbUp )
|
|
Eval( ::sl_lbUp, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_lbUp := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:mbClick( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_mbClick )
|
|
Eval( ::sl_mbClick, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_mbClick := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:mbDblClick( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_mbDblClick )
|
|
Eval( ::sl_mbDblClick, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_mbDblClick := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:mbDown( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_mbDown )
|
|
Eval( ::sl_mbDown, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_mbDown := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:mbUp( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_mbUp )
|
|
Eval( ::sl_mbUp, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_mbUp := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:motion( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_motion )
|
|
Eval( ::sl_motion, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_motion := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:rbClick( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_rbClick )
|
|
Eval( ::sl_rbClick, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_rbClick := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:rbDblClick( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_rbDblClick )
|
|
Eval( ::sl_rbDblClick, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_rbDblClick := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:rbDown( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_rbDown )
|
|
Eval( ::sl_rbDown, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_rbDown := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:rbUp( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_rbUp )
|
|
Eval( ::sl_rbUp, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_rbUp := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:wheel( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_wheel )
|
|
Eval( ::sl_wheel, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_wheel := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:close( xParam )
|
|
|
|
if ::objType == objTypeCrt
|
|
IF HB_ISNIL( xParam ) .AND. HB_ISBLOCK( ::sl_close )
|
|
Eval( ::sl_close, NIL, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_close := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:helpRequest( xParam )
|
|
|
|
IF HB_ISNIL( xParam ) .AND. HB_ISBLOCK( ::sl_helpRequest )
|
|
Eval( ::sl_helpRequest, NIL, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_helpRequest := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:keyboard( xParam )
|
|
|
|
IF HB_ISNUMERIC( xParam ) .AND. HB_ISBLOCK( ::sl_keyboard )
|
|
Eval( ::sl_keyboard, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_keyboard := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:killDisplayFocus( xParam )
|
|
|
|
if ::objType == objTypeCrt
|
|
IF HB_ISNIL( xParam ) .AND. HB_ISBLOCK( ::sl_killDisplayFocus )
|
|
Eval( ::sl_killDisplayFocus, NIL, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_killDisplayFocus := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:killInputFocus( xParam )
|
|
|
|
IF HB_ISNIL( xParam ) .AND. HB_ISBLOCK( ::sl_killInputFocus )
|
|
Eval( ::sl_killInputFocus, NIL, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_killInputFocus := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:move( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_move )
|
|
Eval( ::sl_move, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_move := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:paint( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_paint )
|
|
Eval( ::sl_paint, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_paint := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:quit( xParam, xParam1 )
|
|
|
|
IF HB_ISNUMERIC( xParam ) .AND. HB_ISBLOCK( ::sl_quit )
|
|
Eval( ::sl_quit, xParam, xParam1, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_quit := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:resize( xParam, xParam1 )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISARRAY( xParam1 ) .AND. HB_ISBLOCK( ::sl_resize )
|
|
Eval( ::sl_resize, xParam, xParam1, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) /* .OR. HB_ISNIL( xParam )*/
|
|
::sl_resize := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:setDisplayFocus( xParam )
|
|
|
|
if ::objType == objTypeCrt
|
|
IF HB_ISNIL( xParam ) .AND. HB_ISBLOCK( ::setDisplayFocus )
|
|
Eval( ::setDisplayFocus, NIL, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::setDisplayFocus := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:setInputFocus( xParam )
|
|
|
|
IF HB_ISNIL( xParam ) .AND. HB_ISBLOCK( ::sl_setInputFocus )
|
|
Eval( ::sl_setInputFocus, NIL, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_setInputFocus := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:dragEnter( xParam, xParam1 )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_dragEnter )
|
|
Eval( ::sl_dragEnter, xParam, xParam1, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_dragEnter := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:dragMotion( xParam )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_dragMotion )
|
|
Eval( ::sl_dragMotion, xParam, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_dragMotion := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:dragLeave( xParam )
|
|
|
|
IF HB_ISNIL( xParam ) .AND. HB_ISBLOCK( ::sl_dragLeave )
|
|
Eval( ::sl_dragLeave, NIL, NIL, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_dragLeave := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:dragDrop( xParam, xParam1 )
|
|
|
|
IF HB_ISARRAY( xParam ) .AND. HB_ISBLOCK( ::sl_dragDrop )
|
|
Eval( ::sl_dragDrop, xParam, xParam1, Self )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF HB_ISBLOCK( xParam ) .OR. HB_ISNIL( xParam )
|
|
::sl_dragDrop := xParam
|
|
RETURN NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:Initialize( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
|
|
|
|
__defaultNIL( @oParent , ::oParent )
|
|
__defaultNIL( @oOwner , ::oOwner )
|
|
__defaultNIL( @aPos , ::aPos )
|
|
__defaultNIL( @aSize , ::aSize )
|
|
__defaultNIL( @aPresParams, ::aPresParams )
|
|
__defaultNIL( @lVisible , ::visible )
|
|
|
|
::oParent := oParent
|
|
::oOwner := oOwner
|
|
::aPos := aPos
|
|
::aSize := aSize
|
|
::aPresParams := aPresParams
|
|
::visible := lVisible
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:setFocus()
|
|
|
|
Wvg_SetFocus( ::hWnd )
|
|
|
|
RETURN Self
|
|
|
|
METHOD WvgWindow:sendMessage( nMessage, nlParam, nwParam )
|
|
|
|
RETURN Wvg_SendMessage( ::hWnd, nMessage, nlParam, nwParam )
|
|
|
|
METHOD WvgWindow:findObjectByHandle( hWnd )
|
|
|
|
LOCAL nObj
|
|
|
|
IF Len( ::aChildren ) > 0
|
|
IF ( nObj := AScan( ::aChildren, {| o | o:hWnd == hWnd } ) ) > 0
|
|
RETURN ::aChildren[ nObj ]
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN NIL
|
|
|
|
METHOD WvgWindow:getPosAndSize( aPs, aSz )
|
|
|
|
LOCAL nX, nY, nW, nH, aXY
|
|
LOCAL aPos, aSize
|
|
LOCAL nFH, nFW
|
|
|
|
__defaultNIL( @aPs, AClone( ::aPos ) )
|
|
__defaultNIL( @aSz, AClone( ::aSize ) )
|
|
|
|
aPos := AClone( aPs )
|
|
aSize := AClone( aSz )
|
|
|
|
IF ::isParentCrt()
|
|
IF HB_ISBLOCK( aPos[ 1 ] )
|
|
aPos[ 1 ] := Eval( aPos[ 1 ] )
|
|
ENDIF
|
|
IF HB_ISBLOCK( aPos[ 2 ] )
|
|
aPos[ 2 ] := Eval( aPos[ 2 ] )
|
|
ENDIF
|
|
IF HB_ISBLOCK( aSize[ 1 ] )
|
|
aSize[ 1 ] := Eval( aSize[ 1 ] )
|
|
ENDIF
|
|
IF HB_ISBLOCK( aSize[ 2 ] )
|
|
aSize[ 2 ] := Eval( aSize[ 2 ] )
|
|
ENDIF
|
|
|
|
IF aPos[ 1 ] < 0 .AND. aPos[ 2 ] < 0 .AND. aSize[ 1 ] < 0 .AND. aSize[ 2 ] < 0
|
|
nX := Abs( aPos[ 2 ] )
|
|
IF nX < 1
|
|
nX := 0
|
|
ENDIF
|
|
nY := Abs( aPos[ 1 ] )
|
|
IF nY < 1
|
|
nY := 0
|
|
ENDIF
|
|
nW := Abs( aSize[ 2 ] )
|
|
IF nW < 1
|
|
nW := 0
|
|
ENDIF
|
|
nH := Abs( aSize[ 1 ] )
|
|
IF nH < 1
|
|
nH := 0
|
|
ENDIF
|
|
aXY := Wvt_GetXYFromRowCol( nY, nX )
|
|
nFH := Wvt_GetFontInfo()[ 6 ]
|
|
nFW := Wvt_GetFontInfo()[ 7 ]
|
|
RETURN { aXY[ 1 ], aXY[ 2 ], nW * nFW, nH * nFH }
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN { aPos[ 1 ], aPos[ 2 ], aSize[ 1 ], aSize[ 2 ] }
|
|
|
|
METHOD WvgWindow:toolTipText( cText )
|
|
|
|
IF HB_ISSTRING( cText )
|
|
::s_toolTipText := cText
|
|
IF Wvg_IsWindow( ::hWndTT )
|
|
Wvg_SetToolTipText( ::hWnd, ::hWndTT, ::s_toolTipText )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN ::s_toolTipText
|
|
|
|
METHOD WvgWindow:createControl()
|
|
|
|
LOCAL hWnd, aPosSz
|
|
|
|
::nID := ::oParent:GetControlId()
|
|
|
|
aPosSz := ::getPosAndSize( ::aPos, ::aSize )
|
|
|
|
hWnd := Wvg_CreateWindowEx( ;
|
|
::exStyle, ;
|
|
::className(), ;
|
|
"", ; /* window name */
|
|
::style, ;
|
|
aPosSz[ 1 ], aPosSz[ 2 ], ;
|
|
aPosSz[ 3 ], aPosSz[ 4 ], ;
|
|
::oParent:hWnd, ;
|
|
::nID, ; /* hMenu */
|
|
NIL, ; /* hInstance */
|
|
NIL ) /* lParam */
|
|
|
|
IF Wvg_IsWindow( hWnd )
|
|
::hWnd := hWnd
|
|
::pWnd := win_N2P( hWnd )
|
|
::sendMessage( WM_SETFONT, Wvg_GetStockObject( DEFAULT_GUI_FONT ), 1 )
|
|
::hWndTT := Wvg_CreateToolTipWindow( ::hWnd )
|
|
ENDIF
|
|
|
|
RETURN Self
|