* src/rtl/gtwvt/gtwvt.c
% Deleted unnecessary cast.
* utils/hbmk2/hbmk2.pt_BR.po
+ Uploaded new version received from Vailton Renato. Thanks!
* utils/hbmk2/hbmk2.hu_HU.po
+ Updated.
+ Added some new translations.
* utils/hbmk2/hbmk2.prg
* Minor formatting.
! Fixed typo in one of the displayed texts.
+ examples/gtwvw
+ examples/gtwvw/Makefile
+ examples/gtwvw/hbgtwvw.h
+ examples/gtwvw/hbole.h
+ examples/gtwvw/gtwvw.c
+ examples/gtwvw/wvwdraw.c
+ examples/gtwvw/wvwmenu.c
+ examples/gtwvw/wvwstbar.c
+ examples/gtwvw/wvwcheck.c
+ examples/gtwvw/wvwfuncs.c
+ examples/gtwvw/wvwpush.c
+ examples/gtwvw/wvwedit.c
+ examples/gtwvw/wvwtbar.c
+ examples/gtwvw/gtwvw.hbc
+ examples/gtwvw/gtwvw.hbp
+ examples/gtwvw/readme.txt
+ examples/gtwvw/tests
+ examples/gtwvw/tests/wvwtest9.rc
+ examples/gtwvw/tests/prog1.prg
+ examples/gtwvw/tests/prog2.prg
+ examples/gtwvw/tests/dia_excl.ico
+ examples/gtwvw/tests/drawimg.prg
+ examples/gtwvw/tests/vouch1.bmp
+ examples/gtwvw/tests/wvwmouse.prg
+ examples/gtwvw/tests/wvwtest9.hbp
+ examples/gtwvw/tests/hbmk.hbm
+ examples/gtwvw/tests/cbtest1.prg
+ examples/gtwvw/tests/def2.bmp
+ examples/gtwvw/tests/maincoor.prg
+ examples/gtwvw/tests/wvt2wvw.ch
+ examples/gtwvw/tests/cbtest6.prg
+ examples/gtwvw/tests/wvwtest9.prg
+ examples/gtwvw/tests/ebtest7.prg
+ examples/gtwvw/tests/vouch1.gif
+ examples/gtwvw/tests/maximize.prg
+ examples/gtwvw/tests/readme.txt
+ examples/gtwvw/tests/wvwtest9.xml
+ examples/gtwvw/tests/inpfocus.prg
+ examples/gtwvw/tests/prog0.prg
+ examples/gtwvw/docs
+ examples/gtwvw/docs/funclist.txt
+ examples/gtwvw/docs/gtwvw.txt
+ examples/gtwvw/docs/whatsnew.txt
+ Added rudimentary port of GTWVW to Harbour.
(The source was current xhb CVS repository.)
The port is very very (very) far from anything else
than can be found in Harbour, this port involved making
all the minimum required steps to build and link under
Harbour, plus some extra cleanups.
! Lots of cleanups and fixes.
+ Added Harbour make files (both GNU make and hbmk2)
+ Cleaned tests to avoid multiple symbols and much simpler
interdependencies.
! Removed extra test.dbf and what32 dependency.
; TOFIX: Due to public symbol collisions, this GTWVW it's
probably not possible to use it with gtwin lib.
; NOTE: GTWVW is limited to non-UNICODE, non-C++, 32-bit
Windows (no WinCE) builds, and for a clean compiler
I had to suppress Harbour standard warning levels.
Anyway, not basic tests program seems to work,
although I didn't dig into them very deeply.
We will see if this contrib turns out to be useful
or not, and we can decide to drop it or maybe
moving it to contrib once it has been brought up
to Harbour standards. Although the code is huge,
so don't expect to happen this very soon.
552 lines
16 KiB
Plaintext
552 lines
16 KiB
Plaintext
/*
|
|
* $Id$
|
|
*/
|
|
|
|
/*
|
|
Pseudo mouse object in GTWVW GUI
|
|
copyright 2004 Budyanto Dj. <budyanto@centrin.net.id>
|
|
|
|
This is a sample of implementation of a pseudo GUI object in GTWVW,
|
|
using GTWVW GUI primitives.
|
|
|
|
Example on how to use it is given in WVWTEST9.PRG.
|
|
eg. WVWMouseObject():New("Button1", maxrow()-1, 10, , , {|| tone(660,3) } )
|
|
|
|
NOTES:
|
|
This is just a sample. You may not want to see it as a 'model'.
|
|
There are many other ways to handle pseudo GUI objects in GTWVW, just
|
|
use your imagination :-)
|
|
*/
|
|
|
|
#include "inkey.ch"
|
|
#include "common.ch"
|
|
#include "hbclass.ch"
|
|
|
|
static s_amouseobjlist := {}
|
|
static s_ncurkey := 0
|
|
static s_nkeyrepeater := NIL
|
|
static s_nrepeatrate := 0.1
|
|
static s_nrepeatdelay := 0.5
|
|
|
|
#DEFINE _DEFAULT_CAPTION_FONT "Tahoma"
|
|
#DEFINE _DEFAULT_CAPTION_HEIGHT 16
|
|
|
|
* CLIPPER COLOR CONSTANTS
|
|
#DEFINE _IDX_BLACK 0
|
|
#DEFINE _IDX_BLUE 1
|
|
#DEFINE _IDX_GREEN 2
|
|
#DEFINE _IDX_CYAN 3
|
|
#DEFINE _IDX_RED 4
|
|
#DEFINE _IDX_MAGENTA 5
|
|
#DEFINE _IDX_BROWN 6
|
|
#DEFINE _IDX_WHITE 7
|
|
#DEFINE _IDX_LIGHT_GRAY 8
|
|
#DEFINE _IDX_BRIGHT_BLUE 9
|
|
#DEFINE _IDX_BRIGHT_GREEN 10
|
|
#DEFINE _IDX_BRIGHT_CYAN 11
|
|
#DEFINE _IDX_BRIGHT_RED 12
|
|
#DEFINE _IDX_BRIGHT_MAGENTA 13
|
|
#DEFINE _IDX_YELLOW 14
|
|
#DEFINE _IDX_BRIGHT_WHITE 15
|
|
|
|
|
|
* mouse object types
|
|
#DEFINE _MOBJECT_BUTTON 0 //mouse button
|
|
#DEFINE _MOBJECT_HSCROLL 1 //horiz scrollbar: OBSOLETE, NOT USED HERE
|
|
#DEFINE _MOBJECT_VSCROLL 2 //horiz scrollbar: OBSOLETE, NOT USED HERE
|
|
|
|
* for Button Types:
|
|
#DEFINE _BUTTON_NORMAL 0 //normal button
|
|
#DEFINE _BUTTON_FLAT 1 //'transparent', raised when mouseover
|
|
#DEFINE _BUTTON_NONE 2 //no sign even when mouseover or clicked
|
|
#DEFINE _BUTTON_HARD 3 //no recessed when pressed
|
|
|
|
***************************************************************
|
|
* WVWMouseButton
|
|
***************************************************************
|
|
|
|
CLASS WVWMouseButton
|
|
//DATA nId /* TODO */ //mouse object id
|
|
//DATA nHotKey /* TODO */ //hotkey associated with this object
|
|
DATA nWinId //20040303, parent window's number
|
|
DATA lVisible //is the object visible
|
|
DATA lEnable //20040303, is the object enable
|
|
DATA lTight //allow tight neighboring
|
|
DATA nType //20040303, appearance of this button
|
|
DATA nRow1, nCol1, nRow2, nCol2 //mouse object region
|
|
|
|
DATA bClickBlock //executed on Left Click
|
|
DATA bPressBlock //executed on Left Press
|
|
|
|
DATA lRepeatPress //repeat Left Press when pressed during mouse over?
|
|
|
|
DATA cCaption
|
|
DATA cCaptionFont //font name for caption
|
|
DATA nCaptionHeight //height of font for caption, if NIL use current wvw_getfontinfo()
|
|
DATA cImage //20040325, image file name
|
|
|
|
DATA cNormalColor //button normal color, pls use single color, eg "W"
|
|
DATA cPressedColor //button pressed color, pls use single color, eg "B"
|
|
|
|
* private DATA, should be protected
|
|
DATA lPressed //is it being pressed by Left Button?
|
|
DATA lHover //20040303, is mouse over the button?
|
|
|
|
* METHODS
|
|
METHOD New( cCaption, nRow1, nCol1, nRow2, nCol2, bClickBlock, nType, lDraw, nWinId)
|
|
|
|
//METHOD nGetId() INLINE ::nId /* TODO */
|
|
//METHOD SetHotKey(nKey) /* TODO */
|
|
//METHOD nGetHotKey() INLINE ::nHotKey /* TODO */
|
|
|
|
METHOD Enable(lEnable)
|
|
|
|
METHOD SetClickBlock(bBlock)
|
|
METHOD GetClickBlock() INLINE ::bClickBlock
|
|
|
|
METHOD SetPressBlock(bBlock)
|
|
METHOD GetPressBlock() INLINE ::bPressBlock
|
|
|
|
METHOD SetRepeatPress(lRepeat)
|
|
METHOD GetRepeatPress() INLINE ::lRepeatPress
|
|
|
|
METHOD SetCaption(cCaption)
|
|
|
|
METHOD OnClick()
|
|
METHOD OnPress() //K_LBUTTONDOWN occurs over this mouse object
|
|
METHOD OnRelease() //K_LBUTTONUP occurs over this mouse object
|
|
METHOD OnReleaseOut() //K_LBUTTONUP occurs outside of this mouse object
|
|
METHOD OnMouseOut() //mouse is moved from over the button outside
|
|
METHOD OnMouseOver() //TODO
|
|
|
|
METHOD Draw(nWinNum)
|
|
|
|
ENDCLASS //WVWMouseButton
|
|
|
|
METHOD New(cCaption, nRow1, nCol1, nRow2, nCol2, bClickBlock, nType, lDraw, nWinId) CLASS WVWMouseButton
|
|
default cCaption to "" //20040325,was: "Button"
|
|
default nRow1 to 0
|
|
default nCol1 to 0
|
|
default nRow2 to nRow1
|
|
default nCol2 to nCol1 + max(10, len(cCaption) + 2) -1
|
|
default nType to _BUTTON_NORMAL //20040303
|
|
default lDraw to .t.
|
|
default nWinId to wvw_nNumWindows()-1 //20040303
|
|
|
|
//TODO: ::nId := iif(empty(s_amouseobjlist), 1, s_amouseobjlist[len(s_amouseobjlist)]:nGetId()+1)
|
|
//TODO: ::nHotKey := NIL
|
|
::nWinId := nWinId //20040303
|
|
|
|
::nRow1 := nRow1
|
|
::nCol1 := nCol1
|
|
::nRow2 := nRow2
|
|
::nCol2 := nCol2
|
|
|
|
::bClickBlock := iif(valtype(bClickBlock)=="B", bClickBlock, NIL)
|
|
::bPressBlock := NIL
|
|
|
|
::lRepeatPress := .f.
|
|
|
|
::lPressed := .f.
|
|
::lHover := .f. //20040303
|
|
::cCaption := cCaption
|
|
::cCaptionFont := _DEFAULT_CAPTION_FONT
|
|
::nCaptionHeight := _DEFAULT_CAPTION_HEIGHT
|
|
|
|
::cImage := NIL //20040325
|
|
|
|
//TODO: pls use current color
|
|
::cNormalColor := "W"
|
|
::cPressedColor := "W"
|
|
|
|
::lVisible := .t.
|
|
::lEnable := .t.
|
|
::lTight := .f.
|
|
::nType := nType
|
|
|
|
if lDraw //20040304
|
|
::Draw(::nWinId)
|
|
endif
|
|
|
|
return Self //WVWMouseButton
|
|
|
|
METHOD Enable(lEnable) CLASS WVWMouseButton
|
|
::lEnable := lEnable
|
|
::draw()
|
|
return Self
|
|
|
|
METHOD SetClickBlock(bBlock) CLASS WVWMouseButton
|
|
::bClickBlock := bBlock
|
|
return Self
|
|
|
|
METHOD SetPressBlock(bBlock) CLASS WVWMouseButton
|
|
::bPressBlock := bBlock
|
|
return Self
|
|
|
|
METHOD SetRepeatPress(lRepeat) CLASS WVWMouseButton
|
|
::lRepeatPress := lRepeat
|
|
return Self
|
|
|
|
METHOD SetCaption(cCaption) CLASS WVWMouseButton
|
|
::cCaption := cCaption
|
|
return Self
|
|
|
|
METHOD OnPress() CLASS WVWMouseButton
|
|
* this is called when LEFT mouse button is pressed on the object
|
|
local lWasPressed
|
|
if !::lEnable //20040303
|
|
return Self
|
|
endif
|
|
|
|
lWasPressed := ::lPressed
|
|
::lPressed := .t.
|
|
::Draw()
|
|
|
|
if ::lRepeatPress //.and. ::lPressed
|
|
if !lWasPressed
|
|
xKeyRepeater(.t.) //init it
|
|
endif
|
|
wvwm_SetKeyRepeater( .t. ) //activate key repeater
|
|
endif
|
|
|
|
if valtype(::bPressBlock) == "B"
|
|
eval(::bPressBlock)
|
|
endif
|
|
return Self
|
|
|
|
METHOD OnClick() CLASS WVWMouseButton
|
|
* this is called when LEFT mouse button is clicked on the object
|
|
* normally (or should it be restricted to be?) called from ::OnRelease()
|
|
if !::lEnable //20040303
|
|
return Self
|
|
endif
|
|
|
|
if valtype(::bClickBlock) == "B"
|
|
eval(::bClickBlock)
|
|
endif
|
|
return Self
|
|
|
|
METHOD OnRelease() CLASS WVWMouseButton
|
|
local lWasPressed := ::lPressed
|
|
if !::lEnable //20040303
|
|
return Self
|
|
endif
|
|
|
|
::lPressed := .f.
|
|
::Draw()
|
|
|
|
if ::lRepeatPress //.and. ::lPressed
|
|
wvwm_SetKeyRepeater( .f. ) //deactivate key repeater
|
|
endif
|
|
|
|
if lWasPressed
|
|
::OnClick()
|
|
endif
|
|
return Self
|
|
|
|
METHOD OnReleaseOut() CLASS WVWMouseButton
|
|
* left button is released outside of mouse region
|
|
if !::lEnable //20040303
|
|
return Self
|
|
endif
|
|
|
|
::lPressed := .f.
|
|
::Draw()
|
|
|
|
//NOTE: no need to do SetKeyRepeater( .f. ),
|
|
// because it was already handled by onMouseOut
|
|
return Self
|
|
|
|
//20040303
|
|
METHOD OnMouseOut() CLASS WVWMouseButton
|
|
* mouse is moved from over the button outside
|
|
if !::lEnable //20040303
|
|
return Self
|
|
endif
|
|
|
|
if ::lRepeatPress .and. ::lPressed
|
|
wvwm_SetKeyRepeater( .f. ) //stop key repeater
|
|
endif
|
|
|
|
::lHover := .f.
|
|
::Draw()
|
|
return Self
|
|
|
|
//20040303
|
|
METHOD OnMouseOver() CLASS WVWMouseButton
|
|
* mouse is moved to over the button from outside
|
|
if !::lEnable //20040303
|
|
return Self
|
|
endif
|
|
|
|
if ::lRepeatPress .and. ::lPressed
|
|
wvwm_SetKeyRepeater( .t. ) //activate key repeater
|
|
endif
|
|
|
|
::lHover := .t.
|
|
::Draw()
|
|
return Self
|
|
|
|
METHOD DRAW(nWinNum) CLASS WVWMouseButton
|
|
local nROw := row(), nCol := col()
|
|
local nOldCursor := setcursor(0)
|
|
local lMouseOver := ::lHover //20040303,was: ( mrow()>=::nrow1 .and. mrow()<=::nrow2 .and. mcol()>=::ncol1 .and. mcol()<=::ncol2 )
|
|
local lPressed := ::lPressed .and. lMouseOver
|
|
local aFontInfo := iif(::nCaptionHeight==NIL,wvw_getFontInfo(nWinNum),NIL)
|
|
local nLabelColor := iif(!lPressed, rgb(0,0,0), rgb(96,96,96))
|
|
local lUseImage := (valtype(::cImage)=="C") //20040325
|
|
|
|
if !::lVisible .or. (::nType == _BUTTON_NONE)
|
|
setcursor(nOldCursor) //20040303
|
|
return Self
|
|
endif
|
|
|
|
if ::nrow1>::nrow2 .or. ::ncol1>::ncol2
|
|
setcursor(nOldCursor) //20040303
|
|
return Self
|
|
endif
|
|
|
|
default nWinNum to ::nWinId
|
|
|
|
if lPressed //::lPressed
|
|
if !(::nType==_BUTTON_HARD)
|
|
WVW_FillRectangle( nWinNum, ::nrow1, ::nCol1, ::nrow2, ::nCol2, WVW_GetRGBcolor( HB_ColorToN(::cPressedColor) ), ::lTight)
|
|
Wvw_DrawBoxRecessed( nWinNum, ::nRow1, ::nCol1, ::nRow2, ::nCol2, ::lTight ) //wvw
|
|
else
|
|
WVW_FillRectangle( nWinNum, ::nrow1, ::nCol1, ::nrow2, ::nCol2, WVW_GetRGBcolor( HB_ColorToN(::cNormalColor) ), ::lTight)
|
|
Wvw_DrawBoxRaised( nWinNum, ::nRow1, ::nCol1, ::nRow2, ::nCol2, ::lTight )
|
|
endif
|
|
|
|
if lUseImage .and. !(::nType==_BUTTON_NONE)
|
|
if !Wvw_DrawImage( nWinNum, ::nRow1, ::nCol1, ::nRow2, ::nCol2, ::cImage, ::lTight )
|
|
win_messagebox(NIL, "Button Failed Wvw_DrawImage(" + ::cImage + ")")
|
|
endif
|
|
endif
|
|
|
|
if !empty(::cCaption)
|
|
Wvw_DrawLabel(nWinNum, ::nRow1, nCeiling((::nCol2+::nCol1)/2), ::cCaption, 6,, nLabelColor, rgb(198,198,198), ::cCaptionFont, iif(valtype(afontinfo)=="A",afontinfo[2],::nCaptionHeight), 0, , , , .f., .f. )
|
|
endif
|
|
else
|
|
if lMouseOver .or. (::nType==_BUTTON_NORMAL) .or. (::nType==_BUTTON_HARD)
|
|
WVW_FillRectangle( nWinNum, ::nrow1, ::nCol1, ::nrow2, ::nCol2, WVW_GetRGBcolor( HB_ColorToN(::cNormalColor) ), ::lTight)
|
|
Wvw_DrawBoxRaised(nWinNum, ::nRow1, ::nCol1, ::nRow2, ::nCol2, ::lTight )
|
|
else
|
|
* must undraw the box. ideally GTWVW has this function
|
|
Wvw_DrawBoxGroup(nWinNum, ::nRow1, ::nCol1, ::nRow2, ::nCol2 )
|
|
endif
|
|
|
|
if lUseImage .and. !(::nType==_BUTTON_NONE)
|
|
if !Wvw_DrawImage( nWinNum, ::nRow1, ::nCol1, ::nRow2, ::nCol2, ::cImage, ::lTight )
|
|
win_messagebox(NIL, "Button Failed Wvw_DrawImage(" + ::cImage + ")")
|
|
endif
|
|
endif
|
|
|
|
if !::lEnable
|
|
nLabelColor := rgb(96,96,96)
|
|
elseif lMouseOver
|
|
nLabelColor := rgb(255,0,0)
|
|
endif
|
|
|
|
if !empty(::cCaption)
|
|
Wvw_DrawLabel(nWinNum, ::nRow1, nCeiling((::nCol2+::nCol1)/2), ::cCaption, 6,, nLabelColor, rgb(198,198,198), ::cCaptionFont, iif(valtype(afontinfo)=="A",afontinfo[2],::nCaptionHeight), 0, , , , .f., .f. )
|
|
endif
|
|
endif
|
|
setcursor(nOldCursor)
|
|
return Self
|
|
|
|
//*******************************************************
|
|
* interface functions
|
|
|
|
function wvwm_paint( nWinNum )
|
|
* normally called by WVW_Paint()
|
|
* redraw every mouse object in window nWinNum
|
|
if len(s_amouseobjlist) >= nWinNum+1
|
|
aeval( s_amouseobjlist[nWinNum+1], {|o| o[2]:draw(nWinNum)} )
|
|
endif
|
|
return NIL
|
|
|
|
function wvwm_ResetMouseObjects( nWinNum )
|
|
* clears all mouse objects from window nWinNum
|
|
do while len(s_amouseobjlist) < nWinNum+1
|
|
aadd( s_amouseobjlist, {} )
|
|
enddo
|
|
s_amouseobjlist[ nWinNum+1 ] := {}
|
|
return .t.
|
|
|
|
function wvwm_AddMouseObjects( nWinNum, oMouse, nObjType )
|
|
* adds a mouse object oMouse into window nWinNum
|
|
default nObjType to _MOBJECT_BUTTON
|
|
aadd( s_amouseobjlist[ nWinNum+1 ], {nObjType, oMouse} )
|
|
return .t.
|
|
|
|
function wvwm_nNumMouseObjects( nWinNum )
|
|
* returns number of mouse objects in window nWinNum
|
|
return len(s_amouseobjlist[ nWinNum+1 ])
|
|
|
|
function wvwm_nObjectType( nWinNum, nObjNum )
|
|
* returns type of mouse objects number nObjNum in window nWinNum
|
|
return s_amouseobjlist[ nWinNum+1 ][nObjNum][1]
|
|
|
|
function wvwm_SetKeyRepeater( lSet )
|
|
* returns .t. if KeyRepeater is active
|
|
* if lSet is supplied, KeyRepeater is enable/disable accordingly
|
|
local lWasSet := (s_nkeyrepeater <> NIL)
|
|
if !(lSet==NIL)
|
|
if lSet
|
|
if !lWasSet
|
|
s_nkeyrepeater := hb_idleadd( {|| xKeyRepeater() } )
|
|
endif
|
|
else
|
|
if lWasSet
|
|
hb_idledel( s_nkeyrepeater )
|
|
s_nkeyrepeater := NIL
|
|
endif
|
|
endif
|
|
endif
|
|
return lWasSet
|
|
|
|
|
|
static function nButtonChecker(nkey, oMouseObj)
|
|
local nrow := mrow(), ncol := mcol()
|
|
local lMouseOver
|
|
local i
|
|
|
|
lMouseOver := ( nrow>=oMouseObj:nrow1 .and. nrow<=oMouseObj:nrow2 .and. ncol>=oMouseObj:ncol1 .and. ncol<=oMouseObj:ncol2 )
|
|
if !lMouseOver
|
|
* cursor is somewhere outside of current mouse object area
|
|
|
|
if oMouseObj:lHover
|
|
* user has just moved the cursor out of this button
|
|
oMouseObj:OnMouseOut()
|
|
else
|
|
do case
|
|
case nkey == K_LBUTTONUP
|
|
if oMouseObj:lPressed
|
|
oMouseObj:OnReleaseOut()
|
|
endif
|
|
endcase
|
|
endif
|
|
|
|
else
|
|
* cursor is over current mouse object area
|
|
|
|
if !oMouseObj:lHover
|
|
* user has just moved the cursor into over this button
|
|
oMouseObj:OnMouseOver()
|
|
else
|
|
do case
|
|
case nkey == K_LDBLCLK
|
|
* currently button not handle this events,
|
|
* so we will treat it as single key press
|
|
oMouseObj:OnPress()
|
|
case nkey == K_LBUTTONDOWN
|
|
oMouseObj:OnPress()
|
|
case nkey == K_LBUTTONUP
|
|
oMouseObj:OnRelease()
|
|
endcase
|
|
endif
|
|
|
|
endif
|
|
|
|
return nkey //nButtonChecker(nkey)
|
|
|
|
static function nScrollChecker(nkey, cType, oMouseObj)
|
|
* cType == "H" or "V"
|
|
|
|
nButtonChecker(nkey, oMouseObj:oFirstButton)
|
|
nButtonChecker(nkey, oMouseObj:oRail1Button)
|
|
nButtonChecker(nkey, oMouseObj:oMidButton)
|
|
nButtonChecker(nkey, oMouseObj:oRail2Button)
|
|
nButtonChecker(nkey, oMouseObj:oSecondButton)
|
|
|
|
return nkey //nHScrollChecker(nkey)
|
|
|
|
/* HANDLING MULTIPLE MOUSE OBJECTS */
|
|
/* called by SETKEYAFTERBLOCK() function */
|
|
function wvwm_nMouseChecker(nkey)
|
|
* check mouse events in relations with registered mouse objects
|
|
* always return inkey codes as if nothing happens here
|
|
* (so as to allow GET do something about it)
|
|
* NOTE: only cares about current (last) window
|
|
local i, oMouseObj
|
|
local nCurWindow
|
|
|
|
nCurWindow := WVW_nNumWindows()-1
|
|
|
|
if len(s_amouseobjlist) < nCurWindow+1
|
|
return nkey
|
|
endif
|
|
|
|
s_ncurkey := nkey //20040303
|
|
|
|
for i := 1 to len(s_amouseobjlist[nCurWindow+1])
|
|
oMouseObj := s_amouseobjlist[nCurWindow+1][i][2]
|
|
|
|
do case
|
|
case (s_amouseobjlist[nCurWindow+1][i][1]==_MOBJECT_BUTTON)
|
|
nButtonChecker(nkey, oMouseObj)
|
|
case (s_amouseobjlist[nCurWindow+1][i][1]==_MOBJECT_HSCROLL)
|
|
nScrollChecker(nkey, "H", oMouseObj)
|
|
case (s_amouseobjlist[nCurWindow+1][i][1]==_MOBJECT_VSCROLL)
|
|
nScrollChecker(nkey, "V", oMouseObj)
|
|
otherwise
|
|
* runtime error!
|
|
endcase
|
|
|
|
next
|
|
|
|
s_ncurkey := 0 //20040303
|
|
return nKey //wvwm_nMouseChecker(nkey)
|
|
|
|
|
|
static procedure xKeyRepeater(lInit)
|
|
static nLastValidCheck := 0
|
|
static lFirstRepeat := .t.
|
|
local nNow
|
|
local nRepeatInterval
|
|
|
|
default lInit to .f.
|
|
if lInit
|
|
* simply init the locally static var
|
|
lFirstRepeat := .t.
|
|
nLastValidCheck := seconds()
|
|
return
|
|
endif
|
|
|
|
nRepeatInterval := iif(lFirstRepeat, s_nrepeatdelay, s_nrepeatrate)
|
|
|
|
nNow := seconds()
|
|
if nNow - nLastValidCheck < nRepeatInterval //s_nrepeatrate
|
|
* not yet
|
|
return
|
|
endif
|
|
|
|
if !MLEFTDOWN()
|
|
* mouse is not pressed
|
|
return
|
|
endif
|
|
|
|
* mouse is down long enough since last valid check
|
|
* let's repeat it
|
|
__keyboard( K_LBUTTONDOWN )
|
|
|
|
* to be more precise
|
|
nLastValidCheck := seconds() //nNow
|
|
|
|
* next repeat will be quicker
|
|
lFirstRepeat := .f.
|
|
|
|
return //xKeyRepeater()
|
|
|
|
**************************** supporters
|
|
|
|
static function nCeiling(nNumber)
|
|
local nTemp
|
|
nTemp := nNumber - INT(nNumber) //right of dec point
|
|
if nTemp>0
|
|
nNumber := INT(nNumber) + 1
|
|
else
|
|
nNumber := INT(nNumber)
|
|
endif
|
|
return nNumber
|