* src/lang/msghuiso.c
* src/lang/msgskiso.c
* src/lang/msgrukoi.c
* src/lang/msgzhgb.c
* src/lang/msghuwin.c
* src/lang/msgskwin.c
* src/lang/msg_tpl.c
* src/lang/msgruwin.c
* src/lang/msghr646.c
* src/lang/msgsl646.c
* src/lang/msgelwin.c
* src/lang/msgro.c
* src/lang/msgpt.c
* src/lang/msghriso.c
* src/lang/msghrwin.c
* src/lang/msgsliso.c
* src/lang/msgslwin.c
* src/lang/msghe862.c
* src/lang/msgcskam.c
* src/lang/msggl.c
* src/lang/msgtrwin.c
* src/lang/msgbgiso.c
* src/lang/msgeo.c
* src/lang/msgskkam.c
* src/lang/msgbgwin.c
* src/lang/msges.c
* src/lang/msgzhb5.c
* src/lang/msgeu.c
* src/lang/msgpl852.c
* src/lang/msgsr852.c
* src/lang/msgde.c
* src/lang/msgtr857.c
* src/lang/msgru866.c
* src/lang/msgcs852.c
* src/lang/msgfr.c
* src/lang/msgis850.c
* src/lang/msgnl.c
* src/lang/msghu852.c
* src/lang/msgsk852.c
* src/lang/msgca.c
* src/lang/msgplmaz.c
* src/lang/msgpliso.c
* src/lang/msgplwin.c
* src/lang/msgbg866.c
* src/lang/msgid.c
* src/lang/msgltwin.c
* src/lang/msgptiso.c
* src/lang/msgsriso.c
* src/lang/msgel.c
* src/lang/msgdewin.c
* src/lang/msghr852.c
* src/lang/msgko.c
* src/lang/msghewin.c
* src/lang/msgit.c
* src/lang/msgsl852.c
* src/lang/msghucwi.c
* src/lang/msgcsiso.c
* src/lang/msgcswin.c
* src/lang/msgeswin.c
* src/vm/initsymb.c
* src/vm/hashfunc.c
* src/vm/macro.c
* src/vm/evalhb.c
* src/vm/mainwin.c
* src/vm/strapi.c
* src/vm/harbinit.prg
* src/vm/pcount.c
* src/vm/runner.c
* src/vm/estack.c
* src/vm/codebloc.c
* src/vm/hashes.c
* src/vm/maindllp/dllpcode.c
* src/vm/maindllp/dllext.c
* src/vm/dynsym.c
* src/vm/debug.c
* src/vm/maindllh.c
* src/vm/itemapi.c
* src/vm/garbage.c
* src/vm/asort.c
* src/vm/hvm.c
* src/vm/pvalue.c
* src/vm/cmdarg.c
* src/vm/procaddr.c
* src/vm/mainstd.c
* src/vm/arrays.c
* src/vm/task.c
* src/vm/fm.c
* src/vm/extrap.c
* src/vm/proc.c
* src/vm/thread.c
* src/vm/memvars.c
* src/vm/arrayshb.c
* src/vm/memvclip.c
* src/vm/vm.c
* src/vm/hvmall.c
* src/vm/main.c
* src/vm/break.c
* src/vm/eval.c
* src/vm/extend.c
* src/vm/dynlibhb.c
* src/vm/set.c
* src/vm/initexit.c
* src/vm/classes.c
* src/rtl/lennum.c
* src/rtl/scroll.c
* src/rtl/gtdos/gtdos.c
* src/rtl/strxor.c
* src/rtl/setposbs.c
* src/rtl/fscopy.c
* src/rtl/strcase.c
* src/rtl/run.c
* src/rtl/gtwin/gtwin.c
* src/rtl/defpath.c
* src/rtl/gtxwc/gtxwc.h
* src/rtl/gtxwc/gtxwc.c
* src/rtl/tscalars.c
* src/rtl/hbdynhb.c
* src/rtl/substr.c
* src/rtl/round.c
* src/rtl/oldbox.c
* src/rtl/typefile.prg
* src/rtl/tbcolumn.prg
* src/rtl/math.c
* src/rtl/getsys53.prg
* src/rtl/objfunc.prg
* src/rtl/empty.c
* src/rtl/tobject.prg
* src/rtl/gtcrs/gtcrs.h
* src/rtl/hbzlibgz.c
* src/rtl/trim.c
* src/rtl/setpos.c
* src/rtl/fnsplit.c
* src/rtl/gtfunc.c
* src/rtl/base64c.c
* src/rtl/binnum.c
* src/rtl/box.c
* src/rtl/filehb.c
* src/rtl/hbtoken.c
* src/rtl/tscalard.c
* src/rtl/fstemp.c
* src/rtl/gtchrmap.c
* src/rtl/tscalarl.c
* src/rtl/tscalart.c
* src/rtl/radiobhb.prg
* src/rtl/type.c
* src/rtl/tgethb.prg
* src/rtl/strmatch.c
* src/rtl/ampm.c
* src/rtl/base64.prg
* src/rtl/readkey.prg
* src/rtl/hbsha1hm.c
* src/rtl/errsys.prg
* src/rtl/tpopup.prg
* src/rtl/do.c
* src/rtl/einstvau.prg
* src/rtl/gtstd/gtstd.c
* src/rtl/descend.c
* src/rtl/gttrm/gttrm.c
* src/rtl/maxrow.c
* src/rtl/replic.c
* src/rtl/xhelp.c
* src/rtl/setta.prg
* src/rtl/padr.c
* src/rtl/hbstrfmt.c
* src/rtl/listbox.prg
* src/rtl/transfrm.c
* src/rtl/hbntos.c
* src/rtl/gttone.c
* src/rtl/hbadler.c
* src/rtl/at.c
* src/rtl/hbdyn.c
* src/rtl/tone.c
* src/rtl/browse.prg
* src/rtl/tget.prg
* src/rtl/setfunc.prg
* src/rtl/tscalaru.c
* src/rtl/datec.c
* src/rtl/pushbtn.prg
* src/rtl/minmax.c
* src/rtl/hbfeof.c
* src/rtl/readvar.prg
* src/rtl/hbmd5.c
* src/rtl/dates.c
* src/rtl/achoice.prg
* src/rtl/hbascii.c
* src/rtl/fkmax.c
* src/rtl/padc.c
* src/rtl/strzero.c
* src/rtl/memvarbl.prg
* src/rtl/gtcgi/gtcgi.c
* src/rtl/natmsgu.c
* src/rtl/mod.c
* src/rtl/errapi.c
* src/rtl/version.c
* src/rtl/hbregexc.c
* src/rtl/hbrandom.c
* src/rtl/strtran.c
* src/rtl/tscalar.prg
* src/rtl/hbprocfn.c
* src/rtl/hbsocket.c
* src/rtl/errint.c
* src/rtl/treport.prg
* src/rtl/tscalarn.c
* src/rtl/errapiu.c
* src/rtl/hbinet.c
* src/rtl/copyfile.c
* src/rtl/gt.c
* src/rtl/tpersist.prg
* src/rtl/tgetint.prg
* src/rtl/strtoexp.c
* src/rtl/hbsha2hm.c
* src/rtl/errintlo.c
* src/rtl/dbedit.prg
* src/rtl/einstvar.prg
* src/rtl/gtapi.c
* src/rtl/pad.c
* src/rtl/direct.c
* src/rtl/filesys.c
* src/rtl/len.c
* src/rtl/padl.c
* src/rtl/lang.c
* src/rtl/hbregex.c
* src/rtl/einstv52.prg
* src/rtl/hbbit.c
* src/rtl/isprint.c
* src/rtl/altd.prg
* src/rtl/text.prg
* src/rtl/saverest.c
* src/rtl/diskspac.c
* src/rtl/console.c
* src/rtl/mousehb.c
* src/rtl/hbinetz.c
* src/rtl/chrasc.c
* src/rtl/spfiles.c
* src/rtl/dircmd.prg
* src/rtl/memoedit.prg
* src/rtl/gtos2/gtos2.c
* src/rtl/right.c
* src/rtl/hbi18n2.prg
* src/rtl/philes.c
* src/rtl/adir.prg
* src/rtl/oldclear.c
* src/rtl/hbbffnc.c
* src/rtl/gui.prg
* src/rtl/perfuncs.prg
* src/rtl/hbgtcore.c
* src/rtl/cdpapi.c
* src/rtl/cputime.c
* src/rtl/fieldbl.prg
* src/rtl/dirdrive.c
* src/rtl/str.c
* src/rtl/wait.prg
* src/rtl/hbi18n1.c
* src/rtl/dateshb.c
* src/rtl/menuto.prg
* src/rtl/gtclip.c
* src/rtl/mlcfunc.c
* src/rtl/datesx.c
* src/rtl/scrollbr.prg
* src/rtl/hbfile.c
* src/rtl/gtapiu.c
* src/rtl/left.c
* src/rtl/accept.c
* src/rtl/defpathu.c
* src/rtl/tscalarh.c
* src/rtl/tbrowsys.prg
* src/rtl/valtoexp.prg
* src/rtl/tscalarp.c
* src/rtl/is.c
* src/rtl/idle.c
* src/rtl/itemseri.c
* src/rtl/getsys.prg
* src/rtl/hbrunfun.c
* src/rtl/setcolor.c
* src/rtl/oemansi.c
* src/rtl/philes53.c
* src/rtl/xsavescr.c
* src/rtl/hardcr.c
* src/rtl/setkey.c
* src/rtl/tgetlist.prg
* src/rtl/gtsln/keytrans.c
* src/rtl/gtsln/mousesln.c
* src/rtl/gtsln/gtsln.c
* src/rtl/gtsln/kbsln.c
* src/rtl/gtsln/gtsln.h
* src/rtl/disksphb.c
* src/rtl/memvarhb.prg
* src/rtl/tlabel.prg
* src/rtl/hbzlib.c
* src/rtl/strc.c
* src/rtl/gtpca/gtpca.c
* src/rtl/radiogrp.prg
* src/rtl/scrrow.c
* src/rtl/getlist.prg
* src/rtl/valtype.c
* src/rtl/shadow.c
* src/rtl/net.c
* src/rtl/stuff.c
* src/rtl/dirscan.prg
* src/rtl/hbznet.c
* src/rtl/tscalara.c
* src/rtl/space.c
* src/rtl/checkbox.prg
* src/rtl/gtgui/gtgui.c
* src/rtl/hbhex.c
* src/rtl/seconds.c
* src/rtl/trace.c
* src/rtl/samples.c
* src/rtl/abs.c
* src/rtl/input.prg
* src/rtl/hbsha1.c
* src/rtl/gt_tpl/gt_tpl.c
* src/rtl/inkeyapi.c
* src/rtl/filebuf.c
* src/rtl/alert.prg
* src/rtl/inkey.c
* src/rtl/ttopbar.prg
* src/rtl/mtran.c
* src/rtl/gete.c
* src/rtl/browdb.prg
* src/rtl/setcurs.c
* src/rtl/tmenusys.prg
* src/rtl/tsymbol.prg
* src/rtl/tclass.prg
* src/rtl/hbproces.c
* src/rtl/menusys.prg
* src/rtl/cdpapihb.c
* src/rtl/word.c
* src/rtl/langapi.c
* src/rtl/fmhb.c
* src/rtl/ttextlin.prg
* src/rtl/natmsg.c
* src/rtl/gtwvt/gtwvt.h
* src/rtl/gtwvt/gtwvt.c
* src/rtl/tscalarb.c
* src/rtl/mouse53.c
* src/rtl/fssize.c
* src/rtl/hbbfish.c
* src/rtl/hbsha2.c
* src/rtl/colorind.c
* src/rtl/hbbyte.c
* src/rtl/ati.c
* src/rtl/gx.c
* src/rtl/teditor.prg
* src/rtl/mouseapi.c
* src/rtl/soundex.c
* src/rtl/memofile.c
* src/rtl/getsyshb.prg
* src/rtl/radiobtn.prg
* src/rtl/tmenuitm.prg
* src/rtl/gtsys.c
* src/rtl/shadowu.c
* src/rtl/hbstrsh.c
* src/rtl/valtostr.c
* src/rtl/file.c
* src/rtl/strclear.c
* src/rtl/val.c
* src/rtl/gtkbstat.c
* src/rtl/rat.c
* src/rtl/hbcom.c
* src/rtl/tbrowse.prg
* src/rtl/tscalarc.c
* src/rtl/devoutp.prg
* src/codepage/ucmacce.c
* src/codepage/cpno865.c
* src/codepage/uckoi8.c
* src/codepage/cppt850.c
* src/codepage/uc885910.c
* src/codepage/cpit850m.c
* src/codepage/ucmacice.c
* src/codepage/uc885914.c
* src/codepage/uc874.c
* src/codepage/uc857.c
* src/codepage/cpru866.c
* src/codepage/uc1250.c
* src/codepage/uc1254.c
* src/codepage/cpeswinm.c
* src/codepage/cpcs852.c
* src/codepage/cpes850.c
* src/codepage/uc1258.c
* src/codepage/cpis850.c
* src/codepage/cphu852.c
* src/codepage/cpsk852.c
* src/codepage/uckam.c
* src/codepage/cphu852c.c
* src/codepage/uc424.c
* src/codepage/ucmacrom.c
* src/codepage/cpplmaz.c
* src/codepage/uc862.c
* src/codepage/cppliso.c
* src/codepage/uc866.c
* src/codepage/cpplwin.c
* src/codepage/cpbg866.c
* src/codepage/cpltwin.c
* src/codepage/cpptiso.c
* src/codepage/cpel737.c
* src/codepage/cpsrwin.c
* src/codepage/uc8859_3.c
* src/codepage/cpfr850.c
* src/codepage/cpes850c.c
* src/codepage/cphr852.c
* src/codepage/uc8859_7.c
* src/codepage/ucmacgrk.c
* src/codepage/uc037.c
* src/codepage/uc850.c
* src/codepage/cpesiso.c
* src/codepage/uc885911.c
* src/codepage/cpeswin.c
* src/codepage/uc885915.c
* src/codepage/uc875.c
* src/codepage/cprukoi.c
* src/codepage/uc1251.c
* src/codepage/uc1255.c
* src/codepage/cpruiso.c
* src/codepage/cpsv850m.c
* src/codepage/cpde850m.c
* src/codepage/cpruwin.c
* src/codepage/cpsl646.c
* src/codepage/cppt860.c
* src/codepage/cpfriso.c
* src/codepage/cpnl850m.c
* src/codepage/uc863.c
* src/codepage/cpfrwin.c
* src/codepage/cpsliso.c
* src/codepage/ucmaz.c
* src/codepage/cpslwin.c
* src/codepage/uc1026.c
* src/codepage/cpcskam.c
* src/codepage/cpbgiso.c
* src/codepage/uc8859_4.c
* src/codepage/cpnl850.c
* src/codepage/cpbgwin.c
* src/codepage/cpskkam.c
* src/codepage/uc8859_8.c
* src/codepage/cppl852.c
* src/codepage/cpde850.c
* src/codepage/cpsv850.c
* src/codepage/uc855.c
* src/codepage/cptr857.c
* src/codepage/uc885916.c
* src/codepage/cproiso.c
* src/codepage/cpfi850.c
* src/codepage/ucascii.c
* src/codepage/cprowin.c
* src/codepage/uc1252.c
* src/codepage/uc1256.c
* src/codepage/ucatari.c
* src/codepage/cpitisb.c
* src/codepage/uc860.c
* src/codepage/ucmaccyr.c
* src/codepage/uc864.c
* src/codepage/uc1006.c
* src/codepage/cpel437.c
* src/codepage/uc8859_1.c
* src/codepage/cpdeiso.c
* src/codepage/cpsviso.c
* src/codepage/uc88591b.c
* src/codepage/cpdewin.c
* src/codepage/cpsvwin.c
* src/codepage/uc8859_5.c
* src/codepage/cpit850.c
* src/codepage/uc8859_9.c
* src/codepage/cpis861.c
* src/codepage/cpsl852.c
* src/codepage/cpcsiso.c
* src/codepage/cpes850m.c
* src/codepage/ucnext.c
* src/codepage/cpcswin.c
* src/codepage/uc852.c
* src/codepage/uc737.c
* src/codepage/ucmactrk.c
* src/codepage/uc885913.c
* src/codepage/cphuiso.c
* src/codepage/uc775.c
* src/codepage/uc856.c
* src/codepage/cpskiso.c
* src/codepage/cphuwin.c
* src/codepage/cpskwin.c
* src/codepage/cp_tpl.c
* src/codepage/uc1253.c
* src/codepage/uc646_yu.c
* src/codepage/uc1257.c
* src/codepage/uc500.c
* src/codepage/cphr646.c
* src/codepage/cpeliso.c
* src/codepage/cpelwin.c
* src/codepage/cpro852.c
* src/codepage/cpfr850m.c
* src/codepage/uc861.c
* src/codepage/cphriso.c
* src/codepage/uc865.c
* src/codepage/cphrwin.c
* src/codepage/cpitiso.c
* src/codepage/cpsv437c.c
* src/codepage/cpitwin.c
* src/codepage/uc869.c
* src/codepage/cptriso.c
* src/codepage/cpdk865.c
* src/codepage/uc8859_2.c
* src/codepage/cptrwin.c
* src/codepage/uc8859_6.c
* src/rdd/dbfntx/dbfntx1.c
* src/rdd/dbfntx/dbfntx0.prg
* src/rdd/dbsql.c
* src/rdd/dbdelim.prg
* src/rdd/hbdbsort.c
* src/rdd/rddordu.prg
* src/rdd/dbjoin.prg
* src/rdd/workarea.c
* src/rdd/dbnubs.c
* src/rdd/wacore.c
* src/rdd/rddinfo.c
* src/rdd/dbstruxu.prg
* src/rdd/dblist.prg
* src/rdd/dbfuncs.prg
* src/rdd/sdf1.c
* src/rdd/dbdetach.c
* src/rdd/dbtotal.prg
* src/rdd/dbstrux.prg
* src/rdd/dbsort.prg
* src/rdd/dbfnsx/dbfnsx1.c
* src/rdd/dbcmd.c
* src/rdd/dbdrop.c
* src/rdd/delim1.c
* src/rdd/dbf1.c
* src/rdd/dbrename.c
* src/rdd/rddsys.prg
* src/rdd/dbcmd53.c
* src/rdd/usrrdd/usrrdd.c
* src/rdd/usrrdd/rdds/arrayrdd.prg
* src/rdd/usrrdd/rdds/dbtcdx.prg
* src/rdd/usrrdd/rdds/fptcdx.prg
* src/rdd/usrrdd/rdds/hscdx.prg
* src/rdd/usrrdd/rdds/logrdd.prg
* src/rdd/usrrdd/rdds/rlcdx.prg
* src/rdd/usrrdd/rdds/smtcdx.prg
* src/rdd/dbcmdhb.c
* src/rdd/wafunc.c
* src/rdd/rddord.prg
* src/rdd/dbexists.c
* src/rdd/dbsdf.prg
* src/rdd/dbupdat.prg
* src/rdd/ordwldsk.c
* src/rdd/hbsix/sxord.c
* src/rdd/hbsix/sxsem.c
* src/rdd/hbsix/sxini.prg
* src/rdd/hbsix/sxredir.c
* src/rdd/hbsix/sxfname.c
* src/rdd/hbsix/sxtable.c
* src/rdd/hbsix/sxcompat.prg
* src/rdd/hbsix/sxtrig.prg
* src/rdd/hbsix/sxdate.c
* src/rdd/hbsix/sxutil.c
* src/rdd/hbsix/sxcompr.c
* src/rdd/hbsix/sxcrypt.c
* src/rdd/fieldhb.c
* src/rdd/ordcount.c
* Deleted 'www.' from harbour-project.org website name.
(www.harbour-project.org -> harbour-project.org)
655 lines
16 KiB
Plaintext
655 lines
16 KiB
Plaintext
/*
|
|
* $Id$
|
|
*/
|
|
|
|
/*
|
|
* Harbour Project source code:
|
|
* TMENUSYS class
|
|
*
|
|
* Copyright 2002 Larry Sevilla <lsevilla@nddc.edu.ph>
|
|
* www - http://harbour-project.org
|
|
*
|
|
* 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 software; see the file COPYING. If not, write to
|
|
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
|
|
*
|
|
* 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.
|
|
*
|
|
*/
|
|
|
|
#include "hbclass.ch"
|
|
|
|
#include "common.ch"
|
|
#include "getexit.ch"
|
|
#include "inkey.ch"
|
|
#include "setcurs.ch"
|
|
|
|
/* NOTE: Harbour doesn't support CA-Cl*pper 5.3 GUI functionality, but
|
|
it has all related variables and methods. */
|
|
|
|
#ifdef HB_COMPAT_C53
|
|
|
|
/* Some helper contants for the ReadStats() calls. */
|
|
#define SNLASTEXIT 6
|
|
#define SNNEXTGET 12
|
|
|
|
/* Class to simulate menusys.prg of CA-Cl*pper 5.3 */
|
|
|
|
CREATE CLASS HBMenuSys
|
|
|
|
EXPORTED:
|
|
|
|
METHOD Modal( nSelection, nMsgRow, nMsgLeft, nMsgRight, cMsgColor, GetList )
|
|
METHOD New( oMenu )
|
|
|
|
PROTECTED:
|
|
|
|
METHOD PushMenu()
|
|
METHOD PopMenu()
|
|
METHOD PopChild( nNewLevel )
|
|
METHOD PopAll()
|
|
METHOD Execute()
|
|
METHOD MHitTest( oNewMenu, nNewLevel, nNewItem )
|
|
METHOD ShowMsg( lMode )
|
|
METHOD GetMsgArray()
|
|
|
|
VAR oMenu
|
|
VAR lOldMsgFlag
|
|
VAR cOldMessage
|
|
VAR aMenuList
|
|
VAR nMenuLevel
|
|
VAR nOldRow
|
|
VAR nOldCol
|
|
VAR nOldCursor
|
|
VAR lMsgFlag
|
|
VAR nMsgRow
|
|
VAR nMsgLeft
|
|
VAR nMsgRight
|
|
VAR cMsgColor
|
|
VAR cMsgSaveS
|
|
|
|
ENDCLASS
|
|
|
|
/***
|
|
*
|
|
* Standard Menu System Modal handling for Menu Items
|
|
*
|
|
***/
|
|
METHOD Modal( nSelection, nMsgRow, nMsgLeft, nMsgRight, cMsgColor, GetList ) CLASS HBMenuSys
|
|
|
|
LOCAL oTopMenu := ::oMenu
|
|
|
|
LOCAL nReturn := 0
|
|
|
|
LOCAL nKey
|
|
LOCAL nNewItem
|
|
LOCAL lLeftDown
|
|
LOCAL oNewMenu
|
|
LOCAL nNewLevel
|
|
LOCAL oMenuItem
|
|
LOCAL nMenuItem
|
|
LOCAL nTemp
|
|
LOCAL bKeyBlock
|
|
LOCAL lSubMenu
|
|
|
|
::nOldRow := Row()
|
|
::nOldCol := Col()
|
|
::nOldCursor := SetCursor( SC_NONE )
|
|
|
|
::nMsgRow := nMsgRow
|
|
::nMsgLeft := nMsgLeft
|
|
::nMsgRight := nMsgRight
|
|
::cMsgColor := cMsgColor
|
|
|
|
IF ( ::lMsgFlag := ISNUMBER( ::nMsgRow ) .AND. ;
|
|
ISNUMBER( ::nMsgLeft ) .AND. ;
|
|
ISNUMBER( ::nMsgRight ) )
|
|
|
|
IF !ISCHARACTER( ::cMsgColor )
|
|
::cMsgColor := GetClrPair( SetColor(), 1 )
|
|
ENDIF
|
|
|
|
hb_scroll( ::nMsgRow, ::nMsgLeft, ::nMsgRow, ::nMsgRight )
|
|
|
|
::cMsgSaveS := SaveScreen( ::nMsgRow, ::nMsgLeft, ::nMsgRow, ::nMsgRight )
|
|
|
|
ENDIF
|
|
|
|
oTopMenu:select( nSelection )
|
|
|
|
IF !( oTopMenu:ClassName() == "TOPBARMENU" ) .AND. !oTopMenu:isOpen
|
|
oTopMenu:open()
|
|
ELSE
|
|
oTopMenu:display()
|
|
ENDIF
|
|
|
|
IF nSelection <= 0
|
|
|
|
DO WHILE nSelection <= 0
|
|
|
|
nKey := Inkey( 0, INKEY_KEYBOARD + INKEY_LDOWN )
|
|
|
|
IF nKey == K_LBUTTONDOWN .OR. nKey == K_LDBLCLK
|
|
nSelection := oTopMenu:hitTest( MRow(), MCol() )
|
|
|
|
ELSEIF ( nSelection := oTopMenu:getAccel( nKey ) ) != 0
|
|
|
|
ELSEIF IsShortCut( oTopMenu, nKey, @nReturn )
|
|
RETURN nReturn
|
|
|
|
ELSE
|
|
nSelection := 1
|
|
|
|
ENDIF
|
|
|
|
ENDDO
|
|
|
|
oTopMenu:select( nSelection )
|
|
oTopMenu:display()
|
|
|
|
ENDIF
|
|
|
|
IF !oTopMenu:getItem( nSelection ):enabled
|
|
RETURN 0
|
|
ENDIF
|
|
|
|
::aMenuList := Array( 16 )
|
|
::nMenuLevel := 1
|
|
::aMenuList[ 1 ] := ::oMenu
|
|
|
|
lLeftDown := MLeftDown()
|
|
|
|
::ShowMsg( .T. )
|
|
|
|
DO WHILE .T.
|
|
|
|
nKey := Inkey( 0 )
|
|
|
|
IF ( bKeyBlock := SetKey( nKey ) ) != NIL
|
|
Eval( bKeyBlock, ProcName( 1 ), ProcLine( 1 ), "" )
|
|
LOOP
|
|
ENDIF
|
|
|
|
DO CASE
|
|
CASE nKey == K_MOUSEMOVE
|
|
|
|
IF lLeftDown
|
|
|
|
IF !::MHitTest( @oNewMenu, @nNewLevel, @nNewItem ) // ; hit nowhere.
|
|
|
|
ELSEIF nNewLevel != ::nMenuLevel // ; menu level change.
|
|
|
|
IF nNewItem != oNewMenu:current .AND. oNewMenu:GetItem( nNewItem ):enabled
|
|
::oMenu := oNewMenu
|
|
::PopChild( nNewLevel )
|
|
::oMenu:select( nNewItem )
|
|
::oMenu:display()
|
|
::PushMenu()
|
|
::ShowMsg( .T. )
|
|
ENDIF
|
|
|
|
ELSEIF nNewItem != oNewMenu:Current() // ; menu item change.
|
|
|
|
::PopChild( ::nMenuLevel )
|
|
|
|
IF ::oMenu:getItem( nNewItem ):enabled
|
|
::oMenu:select( nNewItem )
|
|
::oMenu:display()
|
|
::PushMenu()
|
|
::ShowMsg( .T. )
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
CASE nKey == K_DOWN
|
|
|
|
IF ::oMenu:ClassName() == "TOPBARMENU"
|
|
IF ::PushMenu()
|
|
::ShowMsg( .T. )
|
|
ENDIF
|
|
ELSE
|
|
nTemp := ::oMenu:getNext()
|
|
IF nTemp == 0
|
|
nTemp := ::oMenu:getFirst()
|
|
ENDIF
|
|
::oMenu:select( nTemp )
|
|
::oMenu:display()
|
|
::ShowMsg( .T. )
|
|
ENDIF
|
|
|
|
CASE nKey == K_UP
|
|
|
|
IF !( ::oMenu:ClassName() == "TOPBARMENU" )
|
|
nTemp := ::oMenu:getPrev()
|
|
IF nTemp == 0
|
|
nTemp := ::oMenu:getLast()
|
|
ENDIF
|
|
::oMenu:select( nTemp )
|
|
::oMenu:display()
|
|
::ShowMsg( .T. )
|
|
|
|
ENDIF
|
|
|
|
CASE nKey == K_LEFT
|
|
|
|
IF ( lSubMenu := ( ::nMenuLevel > 1 ) )
|
|
::PopMenu()
|
|
ENDIF
|
|
IF ::oMenu:ClassName() == "TOPBARMENU"
|
|
nTemp := ::oMenu:getPrev()
|
|
IF nTemp == 0
|
|
nTemp := ::oMenu:getLast()
|
|
ENDIF
|
|
::oMenu:select( nTemp )
|
|
::oMenu:display()
|
|
IF lSubMenu
|
|
::PushMenu()
|
|
ENDIF
|
|
ENDIF
|
|
::ShowMsg( .T. )
|
|
|
|
CASE nKey == K_RIGHT
|
|
|
|
IF ( lSubMenu := ( ::nMenuLevel > 1 ) )
|
|
::PopMenu()
|
|
ENDIF
|
|
|
|
IF ::oMenu:ClassName() == "TOPBARMENU"
|
|
nTemp := ::oMenu:getNext()
|
|
IF nTemp == 0
|
|
nTemp := ::oMenu:getFirst()
|
|
ENDIF
|
|
::oMenu:select( nTemp )
|
|
::oMenu:display()
|
|
IF lSubMenu
|
|
::PushMenu()
|
|
ENDIF
|
|
ENDIF
|
|
::ShowMsg( .T. )
|
|
|
|
CASE nKey == K_ENTER
|
|
|
|
IF ::PushMenu()
|
|
::ShowMsg( .T. )
|
|
ELSE
|
|
::ShowMsg( .F. )
|
|
nReturn := ::execute()
|
|
IF nReturn != 0
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CASE nKey == K_ESC // go to previous menu
|
|
|
|
IF ::PopMenu()
|
|
::oMenu:display()
|
|
::ShowMsg( .T. )
|
|
ELSE
|
|
|
|
IF ::oMenu:ClassName() == "POPUPMENU"
|
|
::oMenu:close()
|
|
ENDIF
|
|
|
|
nReturn := -1 // Bail out if at the top menu item
|
|
EXIT
|
|
|
|
ENDIF
|
|
|
|
CASE nKey == K_LBUTTONDOWN
|
|
|
|
IF !::MHitTest( @oNewMenu, @nNewLevel, @nNewItem )
|
|
|
|
IF GetList != NIL .AND. HitTest( GetList, MRow(), MCol(), ::GetMsgArray() ) != 0
|
|
GetActive():ExitState := GE_MOUSEHIT
|
|
ReadStats( SNLASTEXIT, GE_MOUSEHIT ) // Reset Get System values
|
|
IF ::oMenu:ClassName() == "POPUPMENU"
|
|
::PopMenu()
|
|
ENDIF
|
|
nReturn := -1
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF ::oMenu:ClassName() == "POPUPMENU"
|
|
::PopMenu()
|
|
ENDIF
|
|
|
|
ELSEIF nNewLevel == ::nMenuLevel
|
|
::oMenu:select( nNewItem )
|
|
::oMenu:display()
|
|
::PushMenu()
|
|
::ShowMsg( .T. )
|
|
|
|
ELSE
|
|
::nMenuLevel := nNewLevel
|
|
::oMenu := ::aMenuList[ ::nMenuLevel ]
|
|
|
|
nMenuItem := ::oMenu:current
|
|
IF ( oMenuItem := ::oMenu:getItem( ::oMenu:Current ) ):isPopUp()
|
|
oMenuItem:data:close()
|
|
ENDIF
|
|
|
|
IF nMenuItem != nNewItem
|
|
::oMenu:select( nNewItem )
|
|
::oMenu:display()
|
|
::PushMenu()
|
|
ENDIF
|
|
|
|
::ShowMsg( .T. )
|
|
ENDIF
|
|
|
|
lLeftDown := .T.
|
|
|
|
CASE nKey == K_LBUTTONUP
|
|
|
|
lLeftDown := .F.
|
|
|
|
IF ::MHitTest( @oNewMenu, @nNewLevel, @nNewItem ) .AND. ;
|
|
nNewLevel == ::nMenuLevel
|
|
|
|
IF nNewItem == ::oMenu:current
|
|
::ShowMsg( .F. )
|
|
nReturn := ::execute()
|
|
IF nReturn != 0
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CASE ( nNewItem := ::oMenu:getAccel( nKey ) ) != 0
|
|
|
|
IF ::oMenu:getItem( nNewItem ):enabled
|
|
::oMenu:select( nNewItem )
|
|
::oMenu:display()
|
|
|
|
IF !::PushMenu()
|
|
::ShowMsg( .F. )
|
|
nReturn := ::execute()
|
|
IF nReturn != 0
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
::ShowMsg( .T. )
|
|
|
|
ENDIF
|
|
|
|
CASE IsShortCut( oTopMenu, nKey, @nReturn )
|
|
|
|
IF nReturn != 0
|
|
EXIT
|
|
ENDIF
|
|
|
|
CASE GetList != NIL .AND. ( nNewItem := Accelerator( GetList, nKey, ::GetMsgArray() ) ) != 0
|
|
|
|
GetActive():ExitState := GE_SHORTCUT
|
|
ReadStats( SNNEXTGET, nNewItem ) // Reset Get System values
|
|
IF ::oMenu:ClassName() == "POPUPMENU"
|
|
::PopMenu()
|
|
ENDIF
|
|
|
|
nReturn := -1
|
|
EXIT
|
|
|
|
CASE ( nNewItem := oTopMenu:getAccel( nKey ) ) != 0 // ; check for the top menu item accelerator key
|
|
|
|
IF oTopMenu:getItem( nNewItem ):enabled
|
|
::PopAll()
|
|
::oMenu:select( nNewItem )
|
|
::oMenu:display()
|
|
IF oTopMenu:getItem( nNewItem ):isPopUp()
|
|
::PushMenu()
|
|
ELSE
|
|
::ShowMsg( .F. )
|
|
nReturn := ::execute()
|
|
IF nReturn != 0
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
::ShowMsg( .T. )
|
|
ENDIF
|
|
|
|
ENDCASE
|
|
|
|
ENDDO
|
|
|
|
IF ::lMsgFlag
|
|
RestScreen( ::nMsgRow, ::nMsgLeft, ::nMsgRow, ::nMsgRight, ::cMsgSaveS )
|
|
ENDIF
|
|
|
|
::PopAll()
|
|
|
|
SetPos( ::nOldRow, ::nOldCol )
|
|
SetCursor( ::nOldCursor )
|
|
|
|
RETURN nReturn
|
|
|
|
/***
|
|
*
|
|
* Increment ::nMenuLevel and optionally select first item.
|
|
* If selected MenuItem IsPopUp, assign ::oMenu.
|
|
*
|
|
***/
|
|
METHOD PushMenu() CLASS HBMenuSys
|
|
LOCAL oNewMenu := ::oMenu:getItem( ::oMenu:current )
|
|
|
|
IF ISOBJECT( oNewMenu ) .AND. oNewMenu:IsPopUp
|
|
|
|
::oMenu := oNewMenu:data
|
|
::aMenuList[ ++::nMenuLevel ] := ::oMenu
|
|
::oMenu:select( ::oMenu:getFirst() )
|
|
|
|
IF !::oMenu:isOpen
|
|
::oMenu:open()
|
|
ENDIF
|
|
|
|
RETURN .T.
|
|
|
|
ENDIF
|
|
|
|
RETURN .F.
|
|
|
|
/***
|
|
*
|
|
* Close SubMenuItem and Return to the upper MenuItem level.
|
|
*
|
|
***/
|
|
METHOD PopMenu() CLASS HBMenuSys
|
|
|
|
IF ::nMenuLevel > 1
|
|
::oMenu:select( 0 )
|
|
::oMenu:close( .T. )
|
|
::oMenu := ::aMenuList[ --::nMenuLevel ] // Decrement MenuItem level and assign
|
|
RETURN .T.
|
|
ENDIF
|
|
|
|
RETURN .F.
|
|
|
|
/***
|
|
*
|
|
* Close PopUp Child MenuItem and Return to the upper MenuItem level.
|
|
*
|
|
***/
|
|
METHOD PopChild( nNewLevel ) CLASS HBMenuSys
|
|
LOCAL oOldMenuItem
|
|
LOCAL nCurrent
|
|
|
|
IF ( nCurrent := ::oMenu:current ) != 0
|
|
oOldMenuItem := ::oMenu:getItem( nCurrent )
|
|
IF oOldMenuItem:isPopUp
|
|
oOldMenuItem:data:close()
|
|
::nMenuLevel := nNewLevel
|
|
RETURN .T.
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN .F.
|
|
|
|
/***
|
|
*
|
|
* Close all Menus below Top Menu and Return to upper MenuItem level.
|
|
*
|
|
***/
|
|
METHOD PopAll() CLASS HBMenuSys
|
|
|
|
IF ::aMenuList[ 2 ] != NIL
|
|
::aMenuList[ 2 ]:close()
|
|
ENDIF
|
|
// Set the menu level and position relative to the top menu item:
|
|
::nMenuLevel := 1
|
|
::oMenu := ::aMenuList[ 1 ]
|
|
|
|
RETURN .T.
|
|
|
|
/***
|
|
*
|
|
* Eval() the Data block if selected MenuItem is !IsPopUp.
|
|
*
|
|
***/
|
|
METHOD Execute() CLASS HBMenuSys
|
|
LOCAL oNewMenu := ::oMenu:getItem( ::oMenu:current )
|
|
LOCAL lPas := .T.
|
|
|
|
// Execute the Data block if selected MenuItem is !IsPopUp:
|
|
IF ISOBJECT( oNewMenu ) .AND. !oNewMenu:IsPopUp
|
|
|
|
IF ::oMenu:ClassName() $ "TOPBARMENU|POPUPMENU"
|
|
SetPos( ::nOldRow, ::nOldCol )
|
|
SetCursor( ::nOldCursor )
|
|
Eval( oNewMenu:data, oNewMenu )
|
|
SetCursor( SC_NONE )
|
|
lPas := .F.
|
|
ENDIF
|
|
|
|
// Pop the Menu:
|
|
::oMenu:select( iif( ::PopMenu(), ::oMenu:current, 0 ) )
|
|
|
|
// Display newly selected current menu item:
|
|
IF ::oMenu:ClassName() == "POPUPMENU" .AND. ;
|
|
::nMenuLevel == 1 .AND. ;
|
|
!::oMenu:isOpen
|
|
|
|
::oMenu:open()
|
|
ENDIF
|
|
|
|
IF lPas
|
|
::oMenu:close()
|
|
SetPos( ::nOldRow, ::nOldCol )
|
|
SetCursor( ::nOldCursor )
|
|
Eval( oNewMenu:data, oNewMenu )
|
|
SetCursor( SC_NONE )
|
|
ENDIF
|
|
|
|
RETURN oNewMenu:Id
|
|
|
|
ENDIF
|
|
|
|
RETURN 0
|
|
|
|
/***
|
|
*
|
|
* Test to find the Mouse location.
|
|
* Note: Formal parameters received here were passed by reference.
|
|
*
|
|
***/
|
|
METHOD MHitTest( oNewMenu, nNewLevel, nNewItem ) CLASS HBMenuSys
|
|
|
|
FOR nNewLevel := ::nMenuLevel TO 1 STEP -1
|
|
|
|
oNewMenu := ::aMenuList[ nNewLevel ]
|
|
nNewItem := oNewMenu:hitTest( MRow(), MCol() )
|
|
|
|
IF nNewItem < 0
|
|
RETURN .F. // Test for the mouse on Menu separator or border
|
|
ELSEIF nNewItem > 0 .AND. oNewMenu:getItem( nNewItem ):enabled
|
|
RETURN .T. // Test for the mouse on an enabled item in the menu
|
|
ENDIF
|
|
|
|
NEXT
|
|
|
|
RETURN .F.
|
|
|
|
/***
|
|
*
|
|
* Erase and Show Messages.
|
|
* Erase Message then ::ShowMsg() if lMode is .T.
|
|
* Only erases Menu Message if lMode is .F.
|
|
* SaveScreen()/RestScreen() is used for the
|
|
* Message area in both text or graphics mode.
|
|
*
|
|
***/
|
|
METHOD ShowMsg( lMode ) CLASS HBMenuSys
|
|
LOCAL nCurrent
|
|
LOCAL cMsg
|
|
|
|
IF ISLOGICAL( ::lOldMsgFlag ) .AND. ::lOldMsgFlag
|
|
RestScreen( ::nMsgRow, ::nMsgLeft, ::nMsgRow, ::nMsgRight, ::cMsgSaveS )
|
|
ENDIF
|
|
|
|
IF lMode
|
|
IF !ISCHARACTER( ::cMsgColor )
|
|
::cMsgColor := GetClrPair( SetColor(), 1 )
|
|
ENDIF
|
|
|
|
IF ::lMsgFlag .AND. ;
|
|
( nCurrent := ::oMenu:current ) != 0 .AND. ;
|
|
!Empty( cMsg := ::oMenu:getItem( nCurrent ):message )
|
|
|
|
hb_dispOutAt( ::nMsgRow, ::nMsgLeft, PadC( cMsg, ::nMsgRight - ::nMsgLeft + 1 ), ::cMsgColor )
|
|
ENDIF
|
|
|
|
::cOldMessage := cMsg
|
|
::lOldMsgFlag := ::lMsgFlag
|
|
|
|
ENDIF
|
|
|
|
RETURN .T.
|
|
|
|
/* NOTE: Generates the somewhat internal, yet widely used message line format of CA-Cl*pper 5.3
|
|
This format contradicts the one in the official docs. */
|
|
|
|
METHOD GetMsgArray() CLASS HBMenuSys
|
|
RETURN { , ::nMsgRow, ::nMsgLeft, ::nMsgRight, ::cMsgColor, , , , , }
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
METHOD New( oMenu ) CLASS HBMenuSys
|
|
::oMenu := oMenu
|
|
RETURN Self
|
|
|
|
#endif
|