+ contrib/hbide/actions.prg
+ contrib/hbide/browse.prg
+ contrib/hbide/changelog.prg
+ contrib/hbide/console.prg
+ contrib/hbide/dict.prg
+ contrib/hbide/docks.prg
+ contrib/hbide/docwriter.prg
+ contrib/hbide/edit.prg
+ contrib/hbide/editor.prg
+ contrib/hbide/environ.prg
+ contrib/hbide/findreplace.prg
+ contrib/hbide/format.prg
+ contrib/hbide/functions.prg
+ contrib/hbide/harbourhelp.prg
+ contrib/hbide/home.prg
+ contrib/hbide/main.prg
+ contrib/hbide/misc.prg
+ contrib/hbide/object.prg
+ contrib/hbide/parseexpr.c
+ contrib/hbide/plugins.prg
+ contrib/hbide/projectwizard.prg
+ contrib/hbide/projmanager.prg
+ contrib/hbide/saveload.prg
+ contrib/hbide/shortcuts.prg
+ contrib/hbide/skeletons.prg
+ contrib/hbide/sources.prg
+ contrib/hbide/stylesheets.prg
+ contrib/hbide/tags.prg
+ contrib/hbide/themes.prg
+ contrib/hbide/tools.prg
+ contrib/hbide/uisrcmanager.prg
+ contrib/hbide/wizard.prg
- contrib/hbide/ideactions.prg
- contrib/hbide/idebrowse.prg
- contrib/hbide/idechangelog.prg
- contrib/hbide/ideconsole.prg
- contrib/hbide/idedict.prg
- contrib/hbide/idedocks.prg
- contrib/hbide/idedocwriter.prg
- contrib/hbide/ideedit.prg
- contrib/hbide/ideeditor.prg
- contrib/hbide/ideenviron.prg
- contrib/hbide/idefindreplace.prg
- contrib/hbide/ideformat.prg
- contrib/hbide/idefunctions.prg
- contrib/hbide/ideharbourhelp.prg
- contrib/hbide/idehome.prg
- contrib/hbide/idemain.prg
- contrib/hbide/idemisc.prg
- contrib/hbide/ideobject.prg
- contrib/hbide/ideparseexpr.c
- contrib/hbide/ideplugins.prg
- contrib/hbide/ideprojectwizard.prg
- contrib/hbide/ideprojmanager.prg
- contrib/hbide/idesaveload.prg
- contrib/hbide/ideshortcuts.prg
- contrib/hbide/ideskeletons.prg
- contrib/hbide/idesources.prg
- contrib/hbide/idestylesheets.prg
- contrib/hbide/idetags.prg
- contrib/hbide/idethemes.prg
- contrib/hbide/idetools.prg
- contrib/hbide/ideuisrcmanager.prg
- contrib/hbide/idewizard.prg
* contrib/hbide/hbide.hbp
* deleted 'ide' prefix from all source files
2819 lines
82 KiB
Plaintext
2819 lines
82 KiB
Plaintext
/*
|
|
* $Id$
|
|
*/
|
|
|
|
/*
|
|
* Harbour Project source code:
|
|
*
|
|
* Copyright 2009-2010 Pritpal Bedi <bedipritpal@hotmail.com>
|
|
* 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.
|
|
*
|
|
*/
|
|
/*----------------------------------------------------------------------*/
|
|
/*----------------------------------------------------------------------*/
|
|
/*----------------------------------------------------------------------*/
|
|
/*
|
|
* EkOnkar
|
|
* ( The LORD is ONE )
|
|
*
|
|
* Harbour-Qt IDE
|
|
*
|
|
* Pritpal Bedi <bedipritpal@hotmail.com>
|
|
* 27Jun2010
|
|
*/
|
|
/*----------------------------------------------------------------------*/
|
|
/*----------------------------------------------------------------------*/
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
#include "common.ch"
|
|
#include "hbclass.ch"
|
|
#include "hbqtgui.ch"
|
|
#include "hbide.ch"
|
|
#include "xbp.ch"
|
|
#include "appevent.ch"
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
#define __dockDbu_dragEnterEvent__ 2011
|
|
#define __dockDbu_dropEvent__ 2012
|
|
#define __dbStruct_closeEvent__ 2013
|
|
#define __fieldsTable_itemSelectionChanged__ 2014
|
|
#define __buttonCopyStruct_clicked__ 2015
|
|
#define __buttonOpen_clicked__ 2016
|
|
#define __buttonShowForm_clicked__ 2017
|
|
#define __buttonDbStruct_clicked__ 2018
|
|
#define __buttonFind_clicked__ 2019
|
|
#define __buttonGoto_clicked__ 2020
|
|
#define __buttonClose_clicked__ 2021
|
|
#define __buttonViewTabbed_clicked__ 2022
|
|
#define __buttonViewOrganized_clicked__ 2023
|
|
#define __buttonSaveLayout_clicked__ 2024
|
|
#define __buttonViewCascaded_clicked__ 2025
|
|
#define __buttonViewTiled_clicked__ 2026
|
|
#define __buttonViewMaximized_clicked__ 2027
|
|
#define __buttonViewStackedVert_clicked__ 2028
|
|
#define __buttonViewStackedHorz_clicked__ 2029
|
|
#define __buttonViewZoomedIn_clicked__ 2030
|
|
#define __buttonViewZoomedOut_clicked__ 2031
|
|
#define __buttonAppendRecord_clicked__ 2032
|
|
#define __buttonDelRecord_clicked__ 2033
|
|
#define __buttonLockRecord_clicked__ 2034
|
|
#define __buttonGoTop_clicked__ 2035
|
|
#define __buttonGoBottom_clicked__ 2036
|
|
#define __buttonScrollToFirst_clicked__ 2037
|
|
#define __buttonScrollToLast_clicked__ 2038
|
|
#define __buttonSearchInTable_clicked__ 2039
|
|
#define __buttonZaptable_clicked__ 2040
|
|
#define __qPanelsButton_clicked__ 2041
|
|
#define __buttonTables_clicked__ 2042
|
|
#define __buttonIndex_clicked__ 2043
|
|
#define __mdiArea_subWindowActivated__ 2044
|
|
#define __browse_navigate__ 2045
|
|
#define __browse_keyboard__ 2046
|
|
#define __timer_timeout__ 2047
|
|
#define __browser_contextMenu__ 2048
|
|
#define __mdiSubWindow_windowStateChanged__ 2049
|
|
#define __mdiSubWindow_buttonXclicked__ 2050
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
#define BRW_TYPE_DBF 1
|
|
#define BRW_TYPE_ARRAY 2
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
#define TBL_PANEL 1
|
|
#define TBL_NAME 2
|
|
#define TBL_ALIAS 3
|
|
#define TBL_DRIVER 4
|
|
#define TBL_INDEX 5
|
|
#define TBL_RECORD 6
|
|
#define TBL_CURSOR 7
|
|
#define TBL_GEOMETRY 8
|
|
#define TBL_ROWPOS 9
|
|
#define TBL_COLPOS 10
|
|
#define TBL_HZSCROLL 11
|
|
#define TBL_CONXN 12
|
|
#define TBL_NEXT 13
|
|
|
|
#define TBL_VRBLS 13
|
|
|
|
#define SUB_ID 1
|
|
#define SUB_WINDOW 2
|
|
#define SUB_GEOMETRY 3
|
|
#define SUB_BROWSER 4
|
|
#define SUB_NIL 5
|
|
|
|
#define PNL_PANELS 1
|
|
#define PNL_TABLES 2
|
|
#define PNL_MISC 3
|
|
#define PNL_READY 4
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
CLASS IdeBrowseManager INHERIT IdeObject
|
|
|
|
DATA qDbu
|
|
DATA qStack
|
|
DATA qLayout
|
|
DATA qVSplitter
|
|
DATA qToolBar
|
|
DATA qToolBarL
|
|
DATA qStruct
|
|
DATA qRddCombo
|
|
DATA qConxnCombo
|
|
DATA qStatus
|
|
DATA qTimer
|
|
|
|
DATA aStatusPnls INIT {}
|
|
DATA aPanels INIT {}
|
|
DATA aIndexAct INIT {}
|
|
DATA aRdds INIT { "DBFCDX", "DBFNTX", "DBFNSX" }
|
|
DATA aConxns INIT {}
|
|
|
|
DATA oCurBrw
|
|
DATA oCurPanel
|
|
|
|
DATA qPanelsMenu
|
|
DATA qIndexMenu
|
|
DATA qTablesMenu
|
|
DATA qPanelsButton
|
|
DATA qIndexButton
|
|
DATA qTablesButton
|
|
DATA aPanelsAct INIT {}
|
|
|
|
DATA lStructOpen INIT .f.
|
|
DATA lDeletedOn INIT .t.
|
|
DATA qComboAction
|
|
DATA sp0,sp1,sp2,sp3
|
|
|
|
METHOD new( oIde )
|
|
METHOD create( oIde )
|
|
METHOD show()
|
|
METHOD open( aDbfs )
|
|
METHOD destroy()
|
|
METHOD buildToolbar()
|
|
METHOD execEvent( nEvent, p, p1 )
|
|
METHOD addArray( aData, aAttr )
|
|
METHOD getPanelNames()
|
|
METHOD getPanelsInfo()
|
|
METHOD addPanels()
|
|
METHOD addPanel( cPanel )
|
|
METHOD setPanel( cPanel )
|
|
METHOD isPanel( cPanel )
|
|
METHOD loadTables()
|
|
METHOD buildPanelsButton()
|
|
METHOD buildIndexButton()
|
|
METHOD addPanelsMenu( cPanel )
|
|
METHOD setStyleSheet( nMode )
|
|
METHOD showStruct()
|
|
METHOD buildUiStruct()
|
|
METHOD populateUiStruct()
|
|
METHOD populateFieldData()
|
|
METHOD updateIndexMenu( oBrw )
|
|
METHOD buildRddsCombo()
|
|
METHOD buildConxnCombo()
|
|
METHOD loadConxnCombo( cDriver )
|
|
ACCESS currentDriver() INLINE ::qRddCombo:currentText()
|
|
ACCESS currentConxn() INLINE ::qConxnCombo:currentText()
|
|
METHOD buildStatusPanels()
|
|
METHOD dispStatusInfo()
|
|
METHOD buildLeftToolbar()
|
|
METHOD buildTablesButton()
|
|
METHOD showTablesTree()
|
|
METHOD fetchFldsList( cAlias )
|
|
METHOD getBrowserByAlias( cAlias )
|
|
|
|
ENDCLASS
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:new( oIde )
|
|
::oIde := oIde
|
|
|
|
IF hbide_setAdsAvailable()
|
|
aadd( ::aRdds, "ADS" )
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:create( oIde )
|
|
LOCAL qDock
|
|
|
|
SET DELETED ( ::lDeletedOn )
|
|
|
|
DEFAULT oIde TO ::oIde
|
|
::oIde := oIde
|
|
|
|
qDock := ::oIde:oEM:oQScintillaDock:oWidget
|
|
|
|
::qDbu := QWidget()
|
|
|
|
qDock:setWidget( ::qDbu )
|
|
|
|
qDock:setAcceptDrops( .t. )
|
|
qDock:connect( QEvent_DragEnter, {|p| ::execEvent( __dockDbu_dragEnterEvent__, p ) } )
|
|
qDock:connect( QEvent_Drop , {|p| ::execEvent( __dockDbu_dropEvent__ , p ) } )
|
|
|
|
/* Layout applied to dbu widget */
|
|
::qLayout := QGridLayout()
|
|
::qLayout:setContentsMargins( 0,0,0,0 )
|
|
::qLayout:setSpacing( 0 )
|
|
|
|
::qDbu:setLayout( ::qLayout )
|
|
|
|
/* Toolbar */
|
|
::buildToolbar()
|
|
::qLayout:addWidget( ::qToolbar:oWidget, 0, 0, 1, 2 )
|
|
|
|
/* Toolbar left */
|
|
::buildLeftToolbar()
|
|
::qLayout:addWidget( ::qToolbarL:oWidget, 1, 0, 1, 1 )
|
|
|
|
/* Stacked widget */
|
|
::qStack := QStackedWidget()
|
|
::qLayout:addWidget( ::qStack , 1, 1, 1, 1 )
|
|
|
|
/* StatusBar */
|
|
::qStatus := QStatusBar()
|
|
::qStatus:setSizeGripEnabled( .f. )
|
|
::qLayout:addWidget( ::qStatus , 2, 0, 1, 2 )
|
|
|
|
/* */
|
|
::buildStatusPanels()
|
|
|
|
/* Panels on the stacked widget */
|
|
::addPanels()
|
|
|
|
/* Spread tables onto panels */
|
|
::loadTables()
|
|
|
|
/* Switch to the default panel */
|
|
::setPanel( "Main" )
|
|
|
|
/* Timer to update ststus bar */
|
|
::qTimer := QTimer()
|
|
::qTimer:setInterval( 2000 )
|
|
::qTimer:connect( "timeout()", {|| ::dispStatusInfo() } )
|
|
::qTimer:start()
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:destroy()
|
|
LOCAL oPanel, qDock, qAct
|
|
|
|
::qRddCombo:disconnect( "currentIndexChanged(QString)" )
|
|
::qTablesButton:disconnect( "clicked()" )
|
|
::qIndexButton:disconnect( "clicked()" )
|
|
::qPanelsButton:disconnect( "clicked()" )
|
|
|
|
IF !empty( ::qTimer )
|
|
::qTimer:disconnect( "timeout()" )
|
|
::qTimer:stop()
|
|
::qTimer := nil
|
|
ENDIF
|
|
|
|
qDock := ::oIde:oEM:oQScintillaDock:oWidget
|
|
qDock:setWidget( QWidget() )
|
|
qDock:disconnect( QEvent_DragEnter )
|
|
qDock:disconnect( QEvent_Drop )
|
|
|
|
IF !empty( ::qStruct )
|
|
::qStruct:disconnect( QEvent_Close )
|
|
|
|
::qStruct:tableFields:disconnect( "itemSelectionChanged()" )
|
|
::qStruct:buttonCopyStruct:disconnect( "clicked()" )
|
|
|
|
::qStruct:tableFields:clearContents()
|
|
|
|
::qStruct:destroy()
|
|
::qStruct := NIL
|
|
ENDIF
|
|
|
|
FOR EACH qAct IN ::aIndexAct
|
|
qAct:disconnect( "triggered(bool)" )
|
|
qAct := NIL
|
|
NEXT
|
|
FOR EACH qAct IN ::aPanelsAct
|
|
qAct:disconnect( "triggered(bool)" )
|
|
qAct := NIL
|
|
NEXT
|
|
|
|
FOR EACH oPanel IN ::aPanels
|
|
oPanel:destroy()
|
|
NEXT
|
|
::aPanels := NIL
|
|
|
|
::qDbu := NIL
|
|
::qStack := NIL
|
|
::qLayout := NIL
|
|
::qVSplitter := NIL
|
|
::qToolBar := NIL
|
|
::qToolBarL := NIL
|
|
::qStruct := NIL
|
|
::qRddCombo := NIL
|
|
::qConxnCombo := NIL
|
|
::qStatus := NIL
|
|
::qTimer := NIL
|
|
::aStatusPnls := NIL
|
|
::aPanels := NIL
|
|
::aIndexAct := NIL
|
|
::aRdds := NIL
|
|
::aConxns := NIL
|
|
::oCurBrw := NIL
|
|
::oCurPanel := NIL
|
|
::qPanelsMenu := NIL
|
|
::qIndexMenu := NIL
|
|
::qTablesMenu := NIL
|
|
::qPanelsButton := NIL
|
|
::qIndexButton := NIL
|
|
::qTablesButton := NIL
|
|
::aPanelsAct := NIL
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:show()
|
|
|
|
::qToolbar:setStyleSheet( GetStyleSheet( "QToolBar", ::nAnimantionMode ) )
|
|
::oQScintillaDock:oWidget:raise()
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:getPanelNames()
|
|
LOCAL oPanel, aNames := {}, aAttr
|
|
|
|
FOR EACH oPanel IN ::aPanels
|
|
aAttr := {}
|
|
|
|
aadd( aAttr, oPanel:cPanel )
|
|
aadd( aAttr, hb_ntos( oPanel:viewMode() ) )
|
|
aadd( aAttr, hb_ntos( oPanel:nViewStyle ) )
|
|
|
|
aadd( aNames, hbide_array2String( aAttr, "," ) )
|
|
NEXT
|
|
RETURN aNames
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:getPanelsInfo()
|
|
LOCAL oBrw, oPanel, aSub
|
|
LOCAL aInfo := {}, aAttr
|
|
|
|
FOR EACH oPanel IN ::aPanels
|
|
FOR EACH aSub IN oPanel:subWindows()
|
|
aAttr := array( TBL_VRBLS )
|
|
aAttr[ TBL_PANEL ] := oPanel:cPanel
|
|
|
|
oBrw := aSub[ 4 ]
|
|
|
|
IF oBrw:nType == BRW_TYPE_DBF
|
|
aAttr[ TBL_NAME ] := oBrw:cTable
|
|
aAttr[ TBL_ALIAS ] := oBrw:cAlias
|
|
aAttr[ TBL_DRIVER ] := oBrw:cDriver
|
|
aAttr[ TBL_INDEX ] := hb_ntos( oBrw:indexOrd() )
|
|
aAttr[ TBL_RECORD ] := hb_ntos( oBrw:recNo() )
|
|
aAttr[ TBL_CURSOR ] := hb_ntos( oBrw:nCursorType )
|
|
IF !HB_ISOBJECT( aSub[ SUB_GEOMETRY ] )
|
|
aSub[ SUB_GEOMETRY ] := aSub[ SUB_WINDOW ]:geometry()
|
|
ENDIF
|
|
aAttr[ TBL_GEOMETRY ] := hb_ntos( aSub[ SUB_GEOMETRY ]:x() ) + " " + hb_ntos( aSub[ SUB_GEOMETRY ]:y() ) + " " + ;
|
|
hb_ntos( aSub[ SUB_GEOMETRY ]:width() ) + " " + hb_ntos( aSub[ SUB_GEOMETRY ]:height() )
|
|
aAttr[ TBL_ROWPOS ] := hb_ntos( oBrw:oBrw:rowPos() )
|
|
aAttr[ TBL_COLPOS ] := hb_ntos( oBrw:oBrw:colPos() )
|
|
aAttr[ TBL_HZSCROLL ] := ""
|
|
aAttr[ TBL_CONXN ] := oBrw:cConxnFull
|
|
aAttr[ TBL_NEXT ] := ""
|
|
|
|
ELSEIF oBrw:nType == BRW_TYPE_ARRAY
|
|
//
|
|
ENDIF
|
|
|
|
aadd( aInfo, hbide_array2String( aAttr, "," ) )
|
|
NEXT
|
|
NEXT
|
|
|
|
RETURN aInfo
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:setStyleSheet( nMode )
|
|
|
|
::qToolbar:setStyleSheet( GetStyleSheet( "QToolBar", nMode ) )
|
|
::qToolbarL:setStyleSheet( GetStyleSheet( "QToolBarLR5", nMode ) )
|
|
::qStatus:setStyleSheet( GetStyleSheet( "QStatusBar", nMode ) )
|
|
#if 0
|
|
::qPanelsMenu:setStyleSheet( GetStyleSheet( "QMenuPop", nMode ) )
|
|
::qIndexMenu:setStyleSheet( GetStyleSheet( "QMenuPop", nMode ) )
|
|
::qTablesMenu:setStyleSheet( GetStyleSheet( "QMenuPop", nMode ) )
|
|
#endif
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:fetchFldsList( cAlias )
|
|
LOCAL aFlds := {}, cA, oBrw, a_, oPanel, aBrw
|
|
|
|
cA := upper( cAlias )
|
|
|
|
SWITCH cA
|
|
CASE "FIELD"
|
|
FOR EACH oPanel IN ::aPanels
|
|
FOR EACH aBrw IN oPanel:aBrowsers
|
|
oBrw := aBrw[ SUB_BROWSER ]
|
|
FOR EACH a_ IN oBrw:aStruct
|
|
aadd( aFlds, pad( a_[ 1 ], 10 ) + " (" + padc( oBrw:cTableOnly, 12 ) + ")" + str( a_:__enumIndex(),3,0 ) + ", " + a_[ 2 ] + ", " + str( a_[ 3 ],3,0 ) + ", " + hb_ntos( a_[ 4 ] ) + " [f]" )
|
|
NEXT
|
|
NEXT
|
|
NEXT
|
|
EXIT
|
|
OTHERWISE
|
|
IF ! empty( oBrw := ::getBrowserByAlias( cA ) )
|
|
FOR EACH a_ IN oBrw:aStruct
|
|
aadd( aFlds, pad( a_[ 1 ], 10 ) + " ( " + str( a_:__enumIndex(),3,0 ) + ", " + a_[ 2 ] + ", " + str( a_[ 3 ],3,0 ) + ", " + hb_ntos( a_[ 4 ] ) + " )" + " [f]" )
|
|
NEXT
|
|
ENDIF
|
|
EXIT
|
|
ENDSWITCH
|
|
|
|
RETURN aFlds
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:getBrowserByAlias( cAlias )
|
|
LOCAL oPanel, aBrw
|
|
|
|
FOR EACH oPanel IN ::aPanels
|
|
FOR EACH aBrw IN oPanel:aBrowsers
|
|
IF aBrw[ SUB_BROWSER ]:cAlias == cAlias
|
|
RETURN aBrw[ SUB_BROWSER ]
|
|
ENDIF
|
|
NEXT
|
|
NEXT
|
|
RETURN NIL
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:dispStatusInfo()
|
|
|
|
::aStatusPnls[ PNL_PANELS ]:setText( "Panels: " + hb_ntos( Len( ::aPanels ) ) + ":" + ::oCurPanel:cPanel )
|
|
::aStatusPnls[ PNL_TABLES ]:setText( "Tables: " + hb_ntos( Len( ::oCurPanel:aBrowsers ) ) )
|
|
|
|
::aStatusPnls[ PNL_MISC ]:setText( "M:" )
|
|
::aStatusPnls[ PNL_READY ]:setText( "Ready" )
|
|
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:buildStatusPanels()
|
|
LOCAL qLabel
|
|
|
|
qLabel := QLabel(); qLabel:setMinimumWidth( 40 )
|
|
::qStatus:addPermanentWidget( qLabel, 0 )
|
|
aadd( ::aStatusPnls, qLabel )
|
|
|
|
qLabel := QLabel(); qLabel:setMinimumWidth( 40 )
|
|
::qStatus:addPermanentWidget( qLabel, 0 )
|
|
aadd( ::aStatusPnls, qLabel )
|
|
|
|
qLabel := QLabel(); qLabel:setMinimumWidth( 40 )
|
|
::qStatus:addPermanentWidget( qLabel, 0 )
|
|
aadd( ::aStatusPnls, qLabel )
|
|
|
|
qLabel := QLabel(); qLabel:setMinimumWidth( 40 )
|
|
::qStatus:addPermanentWidget( qLabel, 1 )
|
|
aadd( ::aStatusPnls, qLabel )
|
|
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:addPanels()
|
|
LOCAL cPanel, aPnl
|
|
|
|
::addPanel( "Main", .t. ) /* The default one */
|
|
|
|
FOR EACH cPanel IN ::oINI:aDbuPanelNames
|
|
aPnl := hb_aTokens( cPanel, "," )
|
|
aSize( aPnl, 2 )
|
|
IF empty( aPnl[ 2 ] )
|
|
aPnl[ 2 ] := "NO"
|
|
ENDIF
|
|
IF !( aPnl[ 1 ] == "Main" )
|
|
::addPanel( aPnl[ 1 ], aPnl[ 2 ] == "YES" )
|
|
ENDIF
|
|
NEXT
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:addPanel( cPanel )
|
|
LOCAL qPanel
|
|
|
|
qPanel := IdeBrowsePanel():new( ::oIde, cPanel, self )
|
|
::qStack:addWidget( qPanel:qWidget )
|
|
aadd( ::aPanels, qPanel )
|
|
::addPanelsMenu( cPanel )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:addPanelsMenu( cPanel )
|
|
LOCAL qAct
|
|
IF HB_ISOBJECT( ::qPanelsMenu )
|
|
qAct := ::qPanelsMenu:addAction( cPanel )
|
|
qAct:setIcon( QIcon( hbide_image( "panel_7" ) ) )
|
|
qAct:connect( "triggered(bool)", {|| ::setPanel( cPanel ) } )
|
|
aadd( ::aPanelsAct, qAct )
|
|
ENDIF
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:isPanel( cPanel )
|
|
RETURN ascan( ::aPanels, {|o| o:qWidget:objectName() == cPanel } ) > 0
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:setPanel( cPanel )
|
|
LOCAL n
|
|
|
|
IF ( n := ascan( ::aPanels, {|o| o:qWidget:objectName() == cPanel } ) ) > 0
|
|
::qStack:setCurrentWidget( ::aPanels[ n ]:qWidget )
|
|
::oCurPanel := ::aPanels[ n ]
|
|
::oCurPanel:prepare()
|
|
::oCurPanel:activateBrowser()
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:execEvent( nEvent, p, p1 )
|
|
LOCAL cTable, cPath, cPanel, qMime, qList, i, cExt, qUrl, aStruct, cTmp
|
|
|
|
HB_SYMBOL_UNUSED( p )
|
|
HB_SYMBOL_UNUSED( p1 )
|
|
|
|
IF ::lQuitting
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
SWITCH nEvent
|
|
CASE __dockDbu_dragEnterEvent__
|
|
p:acceptProposedAction()
|
|
EXIT
|
|
|
|
CASE __dockDbu_dropEvent__
|
|
qMime := p:mimeData()
|
|
IF qMime:hasUrls()
|
|
qList := qMime:urls()
|
|
FOR i := 0 TO qList:size() - 1
|
|
qUrl := qList:at( i )
|
|
hb_fNameSplit( qUrl:toLocalFile(), @cPath, @cTable, @cExt )
|
|
IF lower( cExt ) == ".dbf"
|
|
::oCurPanel:addBrowser( { NIL, hbide_pathToOSPath( cPath + cTable + cExt ), NIL, ;
|
|
iif( ! ( ::qRddCombo:currentText() $ "DBFCDX.DBFNTX,DBFNSX,ADS" ), "DBFCDX", ::qRddCombo:currentText() ) } )
|
|
ENDIF
|
|
NEXT
|
|
ENDIF
|
|
EXIT
|
|
|
|
CASE __buttonShowForm_clicked__
|
|
IF !empty( ::oCurBrw )
|
|
IF ::oCurBrw:qScrollArea:isHidden()
|
|
::oCurBrw:qScrollArea:show()
|
|
::qToolBar:setItemChecked( "Toggle", .t. )
|
|
ELSE
|
|
::oCurBrw:qScrollArea:hide()
|
|
::qToolBar:setItemChecked( "Toggle", .f. )
|
|
ENDIF
|
|
ENDIF
|
|
EXIT
|
|
|
|
CASE __buttonClose_clicked__
|
|
IF !empty( ::oCurBrw )
|
|
::oCurPanel:destroyBrw( ::oCurBrw )
|
|
ENDIF
|
|
EXIT
|
|
|
|
CASE __buttonOpen_clicked__
|
|
IF ::currentDriver() $ "DBFCDX,DBFNTX,DBFNSX,ADS"
|
|
IF !empty( cTable := hbide_fetchAFile( ::oIde:oDlg, "Select a Table", { { "Database File", "*.dbf" } }, ::oIde:cWrkFolderLast ) )
|
|
hb_fNameSplit( cTable, @cPath )
|
|
::oIde:cWrkFolderLast := cPath
|
|
::oCurPanel:addBrowser( { NIL, cTable } )
|
|
ENDIF
|
|
ELSE
|
|
IF ! empty( cTable := hbide_execScriptFunction( "tableSelect", ::currentDriver(), ::currentConxn() ) )
|
|
::oCurPanel:addBrowser( { NIL, cTable } )
|
|
ENDIF
|
|
ENDIF
|
|
EXIT
|
|
|
|
CASE __qPanelsButton_clicked__
|
|
cPanel := hbide_fetchAString( ::qToolbar, "New...", "Name the Panel", "New Panel" )
|
|
IF !( cPanel == "New..." ) .AND. !( cPanel == "Main" )
|
|
IF ::isPanel( cPanel )
|
|
MsgBox( "Panel: " + cPanel + ", already exists" )
|
|
ELSE
|
|
::addPanel( cPanel )
|
|
::setPanel( cPanel )
|
|
ENDIF
|
|
ENDIF
|
|
EXIT
|
|
|
|
/* Left-toolbar actions */
|
|
CASE __buttonViewTabbed_clicked__
|
|
::oCurPanel:setViewMode( iif( ::oCurPanel:viewMode() == QMdiArea_TabbedView, QMdiArea_SubWindowView, QMdiArea_TabbedView ) )
|
|
EXIT
|
|
CASE __buttonViewOrganized_clicked__
|
|
::oCurPanel:setViewStyle( HBPMDI_STYLE_ORGANIZED )
|
|
EXIT
|
|
CASE __buttonSaveLayout_clicked__
|
|
::oCurPanel:saveGeometry()
|
|
EXIT
|
|
CASE __buttonViewCascaded_clicked__
|
|
::oCurPanel:setViewStyle( HBPMDI_STYLE_CASCADED )
|
|
EXIT
|
|
CASE __buttonViewTiled_clicked__
|
|
::oCurPanel:setViewStyle( HBPMDI_STYLE_TILED )
|
|
EXIT
|
|
CASE __buttonViewMaximized_clicked__
|
|
::oCurPanel:setViewStyle( HBPMDI_STYLE_MAXIMIZED )
|
|
EXIT
|
|
CASE __buttonViewStackedVert_clicked__
|
|
::oCurPanel:setViewStyle( HBPMDI_STYLE_TILEDVERT )
|
|
EXIT
|
|
CASE __buttonViewStackedHorz_clicked__
|
|
::oCurPanel:setViewStyle( HBPMDI_STYLE_TILEDHORZ )
|
|
EXIT
|
|
CASE __buttonViewZoomedIn_clicked__
|
|
::oCurPanel:tilesZoom( +1 )
|
|
EXIT
|
|
CASE __buttonViewZoomedOut_clicked__
|
|
::oCurPanel:tilesZoom( -1 )
|
|
EXIT
|
|
|
|
/* Left-toolbar Table Manipulation Actions */
|
|
CASE __buttonDbStruct_clicked__
|
|
IF !empty( ::oCurBrw )
|
|
::showStruct()
|
|
ENDIF
|
|
EXIT
|
|
|
|
CASE __buttonTables_clicked__
|
|
::showTablesTree()
|
|
EXIT
|
|
|
|
CASE __buttonIndex_clicked__
|
|
EXIT
|
|
|
|
CASE __dbStruct_closeEvent__
|
|
::oIde:oINI:cDbStructDialogGeometry := hbide_posAndSize( ::qStruct:oWidget )
|
|
::qStruct:close()
|
|
::lStructOpen := .f.
|
|
EXIT
|
|
|
|
CASE __fieldsTable_itemSelectionChanged__
|
|
::populateFieldData()
|
|
EXIT
|
|
|
|
CASE __buttonFind_clicked__
|
|
IF !empty( ::oCurBrw )
|
|
::oCurBrw:searchAsk()
|
|
ENDIF
|
|
EXIT
|
|
|
|
CASE __buttonGoto_clicked__
|
|
IF !empty( ::oCurBrw )
|
|
::oCurBrw:gotoAsk()
|
|
ENDIF
|
|
EXIT
|
|
|
|
CASE __buttonAppendRecord_clicked__
|
|
IF !empty( ::oCurBrw )
|
|
::oCurBrw:append()
|
|
ENDIF
|
|
EXIT
|
|
CASE __buttonDelRecord_clicked__
|
|
IF !empty( ::oCurBrw )
|
|
::oCurBrw:delete( .t. )
|
|
ENDIF
|
|
EXIT
|
|
CASE __buttonLockRecord_clicked__
|
|
IF !empty( ::oCurBrw )
|
|
::oCurBrw:lock()
|
|
ENDIF
|
|
EXIT
|
|
CASE __buttonGoTop_clicked__
|
|
IF !empty( ::oCurBrw )
|
|
::oCurBrw:goTop()
|
|
ENDIF
|
|
EXIT
|
|
CASE __buttonGoBottom_clicked__
|
|
IF !empty( ::oCurBrw )
|
|
::oCurBrw:goBottom()
|
|
ENDIF
|
|
EXIT
|
|
CASE __buttonScrollToFirst_clicked__
|
|
IF !empty( ::oCurBrw )
|
|
::oCurBrw:toColumn( 1 )
|
|
ENDIF
|
|
EXIT
|
|
CASE __buttonScrollToLast_clicked__
|
|
IF !empty( ::oCurBrw )
|
|
::oCurBrw:toColumn( Len( ::oCurBrw:aStruct ) )
|
|
ENDIF
|
|
EXIT
|
|
CASE __buttonSearchInTable_clicked__
|
|
IF !empty( ::oCurBrw )
|
|
::oCurBrw:searchAsk()
|
|
ENDIF
|
|
EXIT
|
|
CASE __buttonZaptable_clicked__
|
|
EXIT
|
|
CASE __buttonCopyStruct_clicked__
|
|
IF !empty( aStruct := ::oCurBrw:dbStruct() )
|
|
i := 0
|
|
aeval( aStruct, {|e_| iif( Len( e_[ 1 ] ) > i, i := len( e_[ 1 ] ), NIL ) } )
|
|
i += 2
|
|
|
|
cTmp := " LOCAL aStruct := {"
|
|
aeval( aStruct, {|e_,n| cTmp += iif( n == 1, ' { ', space( 20 ) + ' { ' ) + ;
|
|
pad( '"' + e_[ 1 ] + '"', i ) + ', "' + e_[ 2 ] + '", ' + ;
|
|
str( e_[ 3 ], 4, 0 ) + ', ' + ;
|
|
str( e_[ 4 ], 2, 0 ) + ' }' + ;
|
|
iif( Len( aStruct ) == n, " }", ",;" ) + hb_eol() } )
|
|
|
|
QClipboard():setText( cTmp )
|
|
ENDIF
|
|
EXIT
|
|
/* End - left-toolbar actions */
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:showTablesTree()
|
|
LOCAL oUI, qTree, qParent, oPanel, qItm, aBrowser, q, aFld, qFont, nMax, nSz, oBrw
|
|
LOCAL a_:={}
|
|
|
|
oUI := hbide_getUI( "tables", ::oCurPanel:qWidget )
|
|
|
|
qFont := QFont( "Courier New", 8 )
|
|
qTree := oUI:treeTables
|
|
qTree:setFont( qFont )
|
|
|
|
FOR EACH oPanel IN ::aPanels
|
|
qParent := QTreeWidgetItem()
|
|
qParent:setText( 0, oPanel:cPanel )
|
|
qTree:addTopLevelItem( qParent )
|
|
aadd( a_, qParent )
|
|
FOR EACH aBrowser IN oPanel:aBrowsers
|
|
oBrw := aBrowser[ SUB_BROWSER ]
|
|
|
|
qItm := QTreeWidgetItem()
|
|
qItm:setText( 0, oBrw:cTable )
|
|
|
|
qItm:setToolTip( 0, oBrw:cTableOnly + " [ " + oBrw:cDriver + " " + ;
|
|
hb_ntos( oBrw:indexOrd() ) + "/" + hb_ntos( oBrw:numIndexes() ) + iif( oBrw:indexOrd() > 0, ":" + oBrw:ordName(), "" ) + ;
|
|
" " + hb_ntos( oBrw:recno() ) + "/" + hb_ntos( oBrw:lastRec() ) + " ] " )
|
|
|
|
qParent:addChild( qItm )
|
|
nSz := 0 ; aeval( aBrowser[ SUB_BROWSER ]:aStruct, {|e_| nSz += e_[ 3 ] } )
|
|
nMax := 12
|
|
FOR EACH aFld IN aBrowser[ SUB_BROWSER ]:aStruct
|
|
q := QTreeWidgetItem()
|
|
q:setText( 0, pad( aFld[ 1 ], nMax ) + aFld[ 2 ] + str( aFld[ 3 ], 4, 0 ) + str( aFld[ 4 ], 2, 0 ) )
|
|
q:setToolTip( 0, "" )
|
|
qItm:addChild( q )
|
|
NEXT
|
|
q := QTreeWidgetItem()
|
|
q:setText( 0, pad( "T", nMax - 2 ) + str( nSz, 7, 0 ) )
|
|
qItm:addChild( q )
|
|
NEXT
|
|
qParent:setExpanded( .t. )
|
|
NEXT
|
|
::oIde:setPosAndSizeByIniEx( oUI:oWidget, ::oINI:cTablesDialogGeometry )
|
|
oUI:buttonOk:connect( "clicked()", {|| oUI:done( 1 ) } )
|
|
oUI:exec()
|
|
oUI:buttonOk:disconnect( "clicked()" )
|
|
::oIde:oINI:cTablesDialogGeometry := hbide_posAndSize( oUI:oWidget )
|
|
oUI:destroy()
|
|
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:showStruct()
|
|
|
|
IF empty( ::qStruct )
|
|
::buildUiStruct()
|
|
ENDIF
|
|
|
|
IF ! ::lStructOpen
|
|
::lStructOpen := .t.
|
|
::populateUiStruct()
|
|
::oIde:setPosAndSizeByIniEx( ::qStruct:oWidget, ::oINI:cDbStructDialogGeometry )
|
|
::qStruct:show()
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
FUNCTION hbide_fldType2Desc( cType )
|
|
|
|
SWITCH cType
|
|
CASE "C" ; RETURN "Character"
|
|
CASE "N" ; RETURN "Numeric"
|
|
CASE "D" ; RETURN "Date"
|
|
CASE "L" ; RETURN "Logical"
|
|
ENDSWITCH
|
|
|
|
RETURN ""
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:populateFieldData()
|
|
LOCAL nRow, qItm
|
|
|
|
IF ( nRow := ::qStruct:tableFields:currentRow() ) >= 0
|
|
qItm := ::qStruct:tableFields:item( nRow, 1 )
|
|
::qStruct:editName:setText( qItm:text() )
|
|
qItm := ::qStruct:tableFields:item( nRow, 2 )
|
|
::qStruct:comboType:setCurrentIndex( ascan( { "Character", "Numeric", "Date", "Logical" }, qItm:text() ) - 1 )
|
|
qItm := ::qStruct:tableFields:item( nRow, 3 )
|
|
::qStruct:editSize:setText( qItm:text() )
|
|
qItm := ::qStruct:tableFields:item( nRow, 4 )
|
|
::qStruct:editDec:setText( qItm:text() )
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:populateUiStruct()
|
|
LOCAL qItm, fld_, n
|
|
LOCAL oTbl := ::qStruct:tableFields
|
|
LOCAL aStruct := ::oCurBrw:dbStruct()
|
|
|
|
::qStruct:tableFields:clearContents()
|
|
|
|
oTbl:setRowCount( Len( aStruct ) )
|
|
|
|
n := 0
|
|
FOR EACH fld_ IN aStruct
|
|
qItm := QTableWidgetItem()
|
|
qItm:setText( hb_ntos( n+1 ) )
|
|
oTbl:setItem( n, 0, qItm )
|
|
|
|
qItm := QTableWidgetItem()
|
|
qItm:setText( fld_[ 1 ] )
|
|
oTbl:setItem( n, 1, qItm )
|
|
|
|
qItm := QTableWidgetItem()
|
|
qItm:setText( hbide_fldType2Desc( fld_[ 2 ] ) )
|
|
oTbl:setItem( n, 2, qItm )
|
|
|
|
qItm := QTableWidgetItem()
|
|
qItm:setText( hb_ntos( fld_[ 3 ] ) )
|
|
oTbl:setItem( n, 3, qItm )
|
|
|
|
qItm := QTableWidgetItem()
|
|
qItm:setText( hb_ntos( fld_[ 4 ] ) )
|
|
oTbl:setItem( n, 4, qItm )
|
|
|
|
oTbl:setRowHeight( n, 20 )
|
|
n++
|
|
NEXT
|
|
|
|
n := 0
|
|
aeval( aStruct, {|e_| n += e_[ 3 ] } )
|
|
|
|
::qStruct:labelRecSize:setText( hb_ntos( n + 1 ) )
|
|
|
|
oTbl:setCurrentCell( 0,0 )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:buildUiStruct()
|
|
LOCAL oTbl, n, qItm
|
|
LOCAL hdr_:= { { "", 50 }, { "Field Name",200 }, { "Type", 100 }, { "Len", 50 }, { "Dec", 70 } }
|
|
|
|
::qStruct := hbide_getUI( "dbstruct", ::qDbu )
|
|
|
|
::qStruct:setWindowFlags( Qt_Dialog )
|
|
::qStruct:setMaximumHeight( ::qStruct:height() )
|
|
::qStruct:setMinimumHeight( ::qStruct:height() )
|
|
::qStruct:setMinimumWidth( ::qStruct:width() )
|
|
::qStruct:setMaximumWidth( ::qStruct:width() )
|
|
|
|
::qStruct:connect( QEvent_Close, {|| ::execEvent( __dbStruct_closeEvent__ ) } )
|
|
|
|
oTbl := ::qStruct:tableFields
|
|
oTbl:verticalHeader():hide()
|
|
oTbl:horizontalHeader():setStretchLastSection( .t. )
|
|
oTbl:setAlternatingRowColors( .t. )
|
|
oTbl:setColumnCount( Len( hdr_ ) )
|
|
oTbl:setShowGrid( .t. )
|
|
oTbl:setSelectionMode( QAbstractItemView_SingleSelection )
|
|
oTbl:setSelectionBehavior( QAbstractItemView_SelectRows )
|
|
FOR n := 1 TO Len( hdr_ )
|
|
qItm := QTableWidgetItem()
|
|
qItm:setText( hdr_[ n,1 ] )
|
|
oTbl:setHorizontalHeaderItem( n-1, qItm )
|
|
oTbl:setColumnWidth( n-1, hdr_[ n,2 ] )
|
|
NEXT
|
|
|
|
::qStruct:comboType:addItem( "Character" )
|
|
::qStruct:comboType:addItem( "Numeric" )
|
|
::qStruct:comboType:addItem( "Date" )
|
|
::qStruct:comboType:addItem( "Logical" )
|
|
|
|
oTbl:connect( "itemSelectionChanged()", {|| ::execEvent( __fieldsTable_itemSelectionChanged__ ) } )
|
|
|
|
::qStruct:buttonCopyStruct:connect( "clicked()", {|| ::execEvent( __buttonCopyStruct_clicked__ ) } )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:open( aDbfs )
|
|
LOCAL aInfo, cTable, oRect, oRec := ::oDlg:geometry()
|
|
LOCAL nX := 0, nY := 0
|
|
|
|
FOR EACH cTable IN aDbfs
|
|
nX += 20; nY += 20
|
|
// Main,C:\harbour\tests\test.dbf,TEST,DBFCDX,0,500,2,0 0 300 504,21,1,,,,
|
|
aInfo := array( TBL_VRBLS )
|
|
aInfo[ TBL_PANEL ] := "Main"
|
|
aInfo[ TBL_NAME ] := cTable
|
|
aInfo[ TBL_GEOMETRY ] := hb_ntos( nX ) + " " + hb_ntos( nY ) + " 500 300"
|
|
|
|
::oCurPanel:addBrowser( aInfo )
|
|
NEXT
|
|
oRect := ::oQScintillaDock:oWidget:geometry()
|
|
oRect:setWidth( oRec:width() - iif( empty( ::oIde:aSrcOnCmdLine() ), 50, 300 ) )
|
|
::oQScintillaDock:oWidget:setMinimumWidth( oRect:width() )
|
|
::oQScintillaDock:oWidget:show()
|
|
::oQScintillaDock:oWidget:setMinimumWidth( 300 )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:loadTables()
|
|
LOCAL cInfo, aInfo, oCurPanel
|
|
|
|
oCurPanel := ::oCurPanel
|
|
|
|
FOR EACH cInfo IN ::oINI:aDbuPanelsInfo
|
|
aInfo := hb_aTokens( cInfo, "," )
|
|
IF ::isPanel( aInfo[ 1 ] )
|
|
::setPanel( aInfo[ 1 ] )
|
|
::oCurPanel:addBrowser( aInfo )
|
|
ENDIF
|
|
NEXT
|
|
|
|
IF HB_ISOBJECT( oCurPanel )
|
|
::qStack:setCurrentWidget( oCurPanel )
|
|
ENDIF
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:addArray( aData, aAttr )
|
|
|
|
HB_SYMBOL_UNUSED( aData )
|
|
HB_SYMBOL_UNUSED( aAttr )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:buildToolbar()
|
|
LOCAL nW := 25
|
|
LOCAL qTBar
|
|
|
|
::sp0 := QLabel(); ::sp0:setMinimumWidth( nW )
|
|
::sp1 := QLabel(); ::sp1:setMinimumWidth( nW )
|
|
::sp2 := QLabel(); ::sp2:setMinimumWidth( nW )
|
|
::sp3 := QLabel(); ::sp3:setMinimumWidth( nW )
|
|
|
|
qTBar := HbqToolbar():new()
|
|
qTBar:orientation := Qt_Horizontal
|
|
qTBar:size := QSize( 16,16 )
|
|
qTBar:create()
|
|
|
|
::qToolbar := qTBar
|
|
|
|
::buildPanelsButton()
|
|
qTBar:addWidget( , ::sp0 )
|
|
::buildRddsCombo()
|
|
::buildConxnCombo()
|
|
qTBar:addToolButton( "Open" , "Open a table" , app_image( "open3" ), {|| ::execEvent( __buttonOpen_clicked__ ) }, .f. )
|
|
qTBar:addWidget( , ::sp1 )
|
|
qTBar:addToolButton( "Toggle" , "Show/hide form view", app_image( "formview" ), {|| ::execEvent( __buttonShowForm_clicked__ ) }, .t. )
|
|
qTBar:addSeparator()
|
|
qTBar:addToolButton( "Structure", "Table Structure" , app_image( "dbstruct" ), {|| ::execEvent( __buttonDbStruct_clicked__ ) }, .f. )
|
|
qTBar:addSeparator()
|
|
::buildIndexButton()
|
|
qTBar:addToolButton( "Search" , "Search in table" , app_image( "find" ), {|| ::execEvent( __buttonFind_clicked__ ) }, .f. )
|
|
qTBar:addToolButton( "Goto" , "Goto record" , app_image( "gotoline3" ), {|| ::execEvent( __buttonGoto_clicked__ ) }, .f. )
|
|
qTBar:addSeparator()
|
|
qTBar:addToolButton( "Close" , "Close current table", app_image( "dc_delete" ), {|| ::execEvent( __buttonClose_clicked__ ) }, .f. )
|
|
qTBar:addWidget( , ::sp2 )
|
|
::buildTablesButton()
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:buildLeftToolbar()
|
|
LOCAL qTBar
|
|
|
|
qTBar := HBQToolbar():new()
|
|
qTBar:size := QSize( 16,16 )
|
|
qTBar:orientation := Qt_Vertical
|
|
qTBar:create()
|
|
|
|
::qToolbarL := qTBar
|
|
|
|
qTBar:setMaximumWidth( 24 )
|
|
qTBar:setStyleSheet( GetStyleSheet( "QToolBar", ::nAnimantionMode ) )
|
|
|
|
qTBar:addToolButton( "view_tabbed" , "Toggle tabbed view" , app_image( "view_tabbed" ), {|| ::execEvent( __buttonViewTabbed_clicked__ ) }, .f. )
|
|
qTBar:addSeparator()
|
|
qTBar:addToolButton( "view_organized" , "View as arranged" , app_image( "view_organized" ), {|| ::execEvent( __buttonViewOrganized_clicked__ ) }, .f. )
|
|
qTBar:addToolButton( "save3" , "Save layout" , app_image( "save3" ), {|| ::execEvent( __buttonSaveLayout_clicked__ ) }, .f. )
|
|
qTBar:addSeparator()
|
|
qTBar:addToolButton( "view_cascaded" , "View as cascaded" , app_image( "view_cascaded" ), {|| ::execEvent( __buttonViewCascaded_clicked__ ) }, .f. )
|
|
qTBar:addToolButton( "view_tiled" , "View as tiled" , app_image( "view_tiled" ), {|| ::execEvent( __buttonViewTiled_clicked__ ) }, .f. )
|
|
qTBar:addToolButton( "fullscreen" , "View Maximized" , app_image( "fullscreen" ), {|| ::execEvent( __buttonViewMaximized_clicked__ ) }, .f. )
|
|
qTBar:addToolButton( "view_vertstacked", "View Vertically Tiled" , app_image( "view_vertstacked" ), {|| ::execEvent( __buttonViewStackedVert_clicked__ ) }, .f. )
|
|
qTBar:addToolButton( "view_horzstacked", "View Horizontally Tiled" , app_image( "view_horzstacked" ), {|| ::execEvent( __buttonViewStackedHorz_clicked__ ) }, .f. )
|
|
qTBar:addToolButton( "view_zoomin" , "View Zoom In" , app_image( "view_zoomin" ), {|| ::execEvent( __buttonViewZoomedIn_clicked__ ) }, .f. )
|
|
qTBar:addToolButton( "view_zoomout" , "View Zoom Out" , app_image( "view_zoomout" ), {|| ::execEvent( __buttonViewZoomedOut_clicked__ ) }, .f. )
|
|
qTBar:addSeparator()
|
|
|
|
qTBar:addToolButton( "database_add" , "Append a record" , app_image( "database_add" ), {|| ::execEvent( __buttonAppendRecord_clicked__ ) }, .f. )
|
|
qTBar:addToolButton( "database_remove" , "Delete a record" , app_image( "database_remove" ), {|| ::execEvent( __buttonDelRecord_clicked__ ) }, .f. )
|
|
qTBar:addToolButton( "database_lock" , "Lock/Unlock Record" , app_image( "database_lock" ), {|| ::execEvent( __buttonLockRecord_clicked__ ) }, .f. )
|
|
qTBar:addSeparator()
|
|
qTBar:addToolButton( "database_up" , "Goto Top" , app_image( "database_up" ), {|| ::execEvent( __buttonGoTop_clicked__ ) }, .f. )
|
|
qTBar:addToolButton( "database_down" , "Goto Bottom" , app_image( "database_down" ), {|| ::execEvent( __buttonGoBottom_clicked__ ) }, .f. )
|
|
qTBar:addToolButton( "database_previous", "Scroll to First Column" , app_image( "database_previous" ), {|| ::execEvent( __buttonScrollToFirst_clicked__ ) }, .f. )
|
|
qTBar:addToolButton( "database_next" , "Scroll to Last Column" , app_image( "database_next" ), {|| ::execEvent( __buttonScrollToLast_clicked__ ) }, .f. )
|
|
qTBar:addSeparator()
|
|
qTBar:addToolButton( "database_search" , "Search in Table" , app_image( "database_search" ), {|| ::execEvent( __buttonSearchInTable_clicked__ ) }, .f. )
|
|
qTBar:addSeparator()
|
|
qTBar:addToolButton( "database_process" , "Zap Table" , app_image( "database_process" ), {|| ::execEvent( __buttonZaptable_clicked__ ) }, .f. )
|
|
|
|
RETURN NIL
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:buildPanelsButton()
|
|
|
|
::qPanelsMenu := QMenu()
|
|
::qPanelsMenu:setStyleSheet( GetStyleSheet( "QMenuPop", ::nAnimantionMode ) )
|
|
|
|
::qPanelsButton := QToolButton()
|
|
::qPanelsButton:setTooltip( "ideDBU Panels" )
|
|
::qPanelsButton:setIcon( QIcon( hbide_image( "panel_8" ) ) )
|
|
::qPanelsButton:setPopupMode( QToolButton_MenuButtonPopup )
|
|
::qPanelsButton:setMenu( ::qPanelsMenu )
|
|
|
|
::qPanelsButton:connect( "clicked()", {|| ::execEvent( __qPanelsButton_clicked__ ) } )
|
|
|
|
::qToolbar:addWidget( , ::qPanelsButton )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:buildConxnCombo()
|
|
|
|
::qConxnCombo := QComboBox()
|
|
::qConxnCombo:setToolTip( "Connection to open next table" )
|
|
::qToolBar:addWidget( , ::qConxnCombo )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:buildRddsCombo()
|
|
LOCAL aRdds, cRdd
|
|
|
|
IF !empty( aRdds := hbide_execScriptFunction( "rdds" ) )
|
|
aeval( aRdds, {|e| aadd( ::aRdds, e ) } )
|
|
ENDIF
|
|
|
|
::qRddCombo := QComboBox()
|
|
::qRddCombo:setToolTip( "Rdd to open next table" )
|
|
FOR EACH cRdd IN ::aRdds
|
|
cRdd := alltrim( cRdd )
|
|
::qRddCombo:addItem( cRdd )
|
|
NEXT
|
|
::qRddCombo:connect( "currentIndexChanged(QString)", {|p| ::loadConxnCombo( p ) } )
|
|
::qToolBar:addWidget( , ::qRddCombo )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:buildTablesButton()
|
|
|
|
::qTablesMenu := QMenu()
|
|
::qTablesMenu:setStyleSheet( GetStyleSheet( "QMenuPop", ::nAnimantionMode ) )
|
|
|
|
::qTablesButton := QToolButton()
|
|
::qTablesButton:setTooltip( "Tables" )
|
|
::qTablesButton:setIcon( QIcon( hbide_image( "database" ) ) )
|
|
::qTablesButton:setPopupMode( QToolButton_MenuButtonPopup )
|
|
::qTablesButton:setMenu( ::qTablesMenu )
|
|
|
|
::qTablesButton:connect( "clicked()", {|| ::execEvent( __buttonTables_clicked__ ) } )
|
|
|
|
::qToolbar:addWidget( , ::qTablesButton )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:buildIndexButton()
|
|
|
|
::qIndexMenu := QMenu()
|
|
::qIndexMenu:setStyleSheet( GetStyleSheet( "QMenuPop", ::nAnimantionMode ) )
|
|
|
|
::qIndexButton := QToolButton()
|
|
::qIndexButton:setTooltip( "Indexes" )
|
|
::qIndexButton:setIcon( QIcon( hbide_image( "sort" ) ) )
|
|
::qIndexButton:setPopupMode( QToolButton_MenuButtonPopup )
|
|
::qIndexButton:setMenu( ::qIndexMenu )
|
|
|
|
::qIndexButton:connect( "clicked()", {|| ::execEvent( __buttonIndex_clicked__ ) } )
|
|
|
|
::qToolbar:addWidget( , ::qIndexButton )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:loadConxnCombo( cDriver )
|
|
LOCAL aConxns, cConxn, a_
|
|
|
|
DEFAULT cDriver TO ::currentDriver()
|
|
|
|
::aConxns := {}
|
|
|
|
IF !empty( aConxns := hbide_execScriptFunction( "connections", cDriver ) )
|
|
aeval( aConxns, {|e| aadd( ::aConxns, e ) } )
|
|
ENDIF
|
|
|
|
::qConxnCombo:clear()
|
|
FOR EACH cConxn IN ::aConxns
|
|
a_:= hb_aTokens( cConxn, ";" )
|
|
::qConxnCombo:addItem( alltrim( a_[ 1 ] ) )
|
|
NEXT
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
STATIC FUNCTION hbide_getMenuBlock( oPanel, oBrw, cIndex )
|
|
RETURN {|| oPanel:setIndex( oBrw, cIndex ) }
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowseManager:updateIndexMenu( oBrw )
|
|
LOCAL qAct, aIndex, cIndex
|
|
|
|
FOR EACH qAct IN ::aIndexAct
|
|
qAct:disconnect( "triggered(bool)" )
|
|
qAct := NIL
|
|
NEXT
|
|
::aIndexAct := {}
|
|
|
|
::qIndexMenu:clear()
|
|
|
|
aIndex := ::oCurPanel:getIndexInfo( oBrw )
|
|
FOR EACH cIndex IN aIndex
|
|
qAct := ::qIndexMenu:addAction( cIndex )
|
|
qAct:connect( "triggered(bool)", hbide_getMenuBlock( ::oCurPanel, oBrw, cIndex ) )
|
|
aadd( ::aIndexAct, qAct )
|
|
NEXT
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
//
|
|
// Class IdeBrowsePanel
|
|
//
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
CLASS IdeBrowsePanel INHERIT IdeObject
|
|
|
|
DATA oManager
|
|
|
|
DATA qWidget
|
|
DATA qMenuWindows
|
|
DATA qStruct
|
|
|
|
DATA cPanel INIT ""
|
|
DATA nViewStyle INIT 0 /* 0=asWindows 1=tabbed */
|
|
DATA lLayoutLocked INIT .f.
|
|
|
|
DATA aBrowsers INIT {}
|
|
ACCESS subWindows() INLINE ::aBrowsers
|
|
|
|
METHOD new( oIde, cPanel, oManager )
|
|
METHOD destroy()
|
|
METHOD destroyBrw( oBrw )
|
|
METHOD execEvent( nEvent, p )
|
|
METHOD setCurrentBrowser( oBrw )
|
|
METHOD getIndexInfo( oBrw )
|
|
METHOD setIndex( oBrw, cIndex )
|
|
|
|
METHOD addBrowser( aInfo )
|
|
METHOD prepare()
|
|
METHOD saveGeometry()
|
|
METHOD restGeometry()
|
|
METHOD activateBrowser()
|
|
METHOD setViewStyle( nStyle )
|
|
METHOD tileVertically()
|
|
METHOD tileHorizontally()
|
|
METHOD tilesZoom( nMode )
|
|
|
|
ERROR HANDLER OnError( ... )
|
|
|
|
ENDCLASS
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:new( oIde, cPanel, oManager )
|
|
|
|
::oIde := oIde
|
|
::cPanel := cPanel
|
|
::oManager := oManager
|
|
|
|
::qWidget := QMdiArea()
|
|
::qWidget:setObjectName( ::cPanel )
|
|
::qWidget:setDocumentMode( .t. )
|
|
::qWidget:setOption( QMdiArea_DontMaximizeSubWindowOnActivation, .t. )
|
|
::qWidget:setVerticalScrollBarPolicy( Qt_ScrollBarAsNeeded )
|
|
::qWidget:setHorizontalScrollBarPolicy( Qt_ScrollBarAsNeeded )
|
|
::qWidget:setDocumentMode( .t. )
|
|
::qWidget:setTabShape( QTabWidget_Triangular )
|
|
::qWidget:setViewMode( QMdiArea_TabbedView )
|
|
|
|
::qWidget:connect( "subWindowActivated(QMdiSubWindow*)", {|p| ::execEvent( __mdiArea_subWindowActivated__, p ) } )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:destroy()
|
|
LOCAL aBrw, oSub
|
|
|
|
::qWidget:disconnect( "subWindowActivated(QMdiSubWindow*)" )
|
|
|
|
FOR EACH aBrw IN ::aBrowsers
|
|
oSub := aBrw[ SUB_WINDOW ]
|
|
::qWidget:removeSubWindow( oSub )
|
|
aBrw[ SUB_BROWSER ]:destroy()
|
|
oSub := NIL
|
|
aBrw := NIL
|
|
NEXT
|
|
::aBrowsers := NIL
|
|
|
|
::qMenuWindows := NIL
|
|
::qStruct := NIL
|
|
::qWidget := NIL
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:onError( ... )
|
|
LOCAL cMsg
|
|
|
|
cMsg := __GetMessage()
|
|
IF SubStr( cMsg, 1, 1 ) == "_"
|
|
cMsg := SubStr( cMsg, 2 )
|
|
ENDIF
|
|
|
|
RETURN ::qWidget:&cMsg( ... )
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:setViewStyle( nStyle )
|
|
LOCAL qObj, a_
|
|
LOCAL nOldStyle := ::nViewStyle
|
|
|
|
IF HB_ISNUMERIC( nStyle )
|
|
IF nStyle != ::nViewStyle
|
|
IF ::nViewStyle == HBPMDI_STYLE_ORGANIZED
|
|
::saveGeometry()
|
|
ENDIF
|
|
|
|
IF ::nViewStyle == HBPMDI_STYLE_MAXIMIZED
|
|
qObj := ::qWidget:activeSubWindow()
|
|
FOR EACH a_ IN ::aBrowsers
|
|
a_[ 2 ]:setWindowState( Qt_WindowNoState )
|
|
NEXT
|
|
::qWidget:setActiveSubWindow( qObj )
|
|
ENDIF
|
|
|
|
SWITCH nStyle
|
|
CASE HBPMDI_STYLE_ORGANIZED
|
|
::restGeometry()
|
|
EXIT
|
|
CASE HBPMDI_STYLE_CASCADED
|
|
::qWidget:cascadeSubWindows()
|
|
EXIT
|
|
CASE HBPMDI_STYLE_TILED
|
|
::qWidget:tileSubWindows()
|
|
EXIT
|
|
CASE HBPMDI_STYLE_MAXIMIZED
|
|
qObj := ::activeSubWindow()
|
|
FOR EACH a_ IN ::aBrowsers
|
|
a_[ 2 ]:setWindowState( Qt_WindowMaximized )
|
|
NEXT
|
|
::setActiveSubWindow( qObj )
|
|
EXIT
|
|
CASE HBPMDI_STYLE_TILEDVERT
|
|
::tileVertically()
|
|
EXIT
|
|
CASE HBPMDI_STYLE_TILEDHORZ
|
|
::tileHorizontally()
|
|
EXIT
|
|
ENDSWITCH
|
|
|
|
::nViewStyle := nStyle
|
|
::prepare()
|
|
ENDIF
|
|
ENDIF
|
|
RETURN nOldStyle
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:tileVertically()
|
|
LOCAL qObj, qVPort, nH, nT, nW, a_
|
|
|
|
qObj := ::activeSubWindow()
|
|
qVPort := ::viewport()
|
|
nH := qVPort:height() / Len( ::aBrowsers )
|
|
nW := qVPort:width()
|
|
nT := 0
|
|
FOR EACH a_ IN ::aBrowsers
|
|
a_[ 2 ]:setGeometry( QRect( 0, nT, nW, nH ) )
|
|
nT += nH
|
|
NEXT
|
|
::setActiveSubWindow( qObj )
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:tileHorizontally()
|
|
LOCAL qObj, qVPort, nH, nT, nW, nL, a_
|
|
|
|
qObj := ::activeSubWindow()
|
|
qVPort := ::viewport()
|
|
nH := qVPort:height()
|
|
nW := qVPort:width() / Len( ::aBrowsers )
|
|
nT := 0
|
|
nL := 0
|
|
FOR EACH a_ IN ::aBrowsers
|
|
a_[ 2 ]:setGeometry( QRect( nL, nT, nW, nH ) )
|
|
nL += nW
|
|
NEXT
|
|
::setActiveSubWindow( qObj )
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:tilesZoom( nMode )
|
|
LOCAL qMdi, nT, nL, nH, nW, qRect, a_
|
|
|
|
IF ::nViewStyle == HBPMDI_STYLE_TILEDVERT .OR. ::nViewStyle == HBPMDI_STYLE_TILEDHORZ
|
|
IF ::nViewStyle == HBPMDI_STYLE_TILEDVERT
|
|
nT := 0
|
|
FOR EACH a_ IN ::aBrowsers
|
|
qMdi := a_[ 2 ]
|
|
qRect := qMdi:geometry()
|
|
nH := qRect:height() + ( nMode * ( qRect:height() / 4 ) )
|
|
qMdi:setGeometry( QRect( 0, nT, qRect:width(), nH ) )
|
|
nT += nH
|
|
NEXT
|
|
ELSE
|
|
nL := 0
|
|
FOR EACH a_ IN ::aBrowsers
|
|
qMdi := a_[ 2 ]
|
|
qRect := qMdi:geometry()
|
|
nW := qRect:width() + ( nMode * ( qRect:width() / 4 ) )
|
|
qMdi:setGeometry( QRect( nL, 0, nW, qRect:height() ) )
|
|
nL += nW
|
|
NEXT
|
|
ENDIF
|
|
|
|
::prepare()
|
|
ENDIF
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:saveGeometry()
|
|
LOCAL a_
|
|
IF ::nViewStyle == HBPMDI_STYLE_ORGANIZED
|
|
FOR EACH a_ IN ::aBrowsers
|
|
a_[ SUB_GEOMETRY ] := a_[ SUB_WINDOW ]:geometry()
|
|
NEXT
|
|
ENDIF
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:restGeometry()
|
|
LOCAL a_
|
|
FOR EACH a_ IN ::aBrowsers
|
|
IF HB_ISOBJECT( a_[ SUB_GEOMETRY ] )
|
|
a_[ SUB_WINDOW ]:setGeometry( a_[ SUB_GEOMETRY ] )
|
|
ENDIF
|
|
NEXT
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:destroyBrw( oBrw )
|
|
LOCAL n, oSub
|
|
|
|
IF ( n := ascan( ::aBrowsers, {|e_| e_[ SUB_BROWSER ] == oBrw } ) ) > 0
|
|
oSub := ::aBrowsers[ n, SUB_WINDOW ]
|
|
hb_adel( ::aBrowsers, n, .t. )
|
|
|
|
::qWidget:removeSubWindow( oSub )
|
|
#if 1
|
|
oSub:setParent( QWidget() ) /* This alone releases all Windows down its hirarchy, right at this line */
|
|
/* Without it GPFing when a single browser was being closed via X button */
|
|
#endif
|
|
oBrw:destroy() /* this is almost non-effective */
|
|
oBrw := NIL
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:execEvent( nEvent, p )
|
|
LOCAL n, oBrw
|
|
|
|
SWITCH nEvent
|
|
CASE __mdiArea_subWindowActivated__
|
|
IF ! empty( ::aBrowsers )
|
|
IF ( n := ascan( ::aBrowsers, {|e_| hbqt_IsEqual( e_[ SUB_WINDOW ], p ) } ) ) > 0
|
|
oBrw := ::aBrowsers[ n, SUB_BROWSER ]
|
|
|
|
oBrw:configure()
|
|
oBrw:oBrw:setCurrentIndex( .t. )
|
|
oBrw:oBrw:setFocus()
|
|
|
|
::oManager:updateIndexMenu( oBrw )
|
|
ENDIF
|
|
ENDIF
|
|
EXIT
|
|
ENDSWITCH
|
|
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:setIndex( oBrw, cIndex )
|
|
IF ascan( ::aBrowsers, {|e_| e_[ SUB_BROWSER ] == oBrw } ) > 0
|
|
RETURN oBrw:setIndex( cIndex )
|
|
ENDIF
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:getIndexInfo( oBrw )
|
|
IF ascan( ::aBrowsers, {|e_| e_[ SUB_BROWSER ] == oBrw } ) > 0
|
|
RETURN oBrw:getIndexInfo()
|
|
ENDIF
|
|
RETURN {}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:setCurrentBrowser( oBrw )
|
|
IF ascan( ::aBrowsers, {|e_| e_[ SUB_BROWSER ] == oBrw } ) > 0
|
|
::oManager:oCurBrw := oBrw
|
|
ENDIF
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:prepare()
|
|
LOCAL aSub
|
|
FOR EACH aSub IN ::aBrowsers
|
|
aSub[ SUB_BROWSER ]:configure()
|
|
NEXT
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:addBrowser( aInfo )
|
|
LOCAL oBrw
|
|
oBrw := IdeBrowse():new( ::oIde, ::oManager, Self, aInfo ):create()
|
|
IF empty( oBrw:oBrw )
|
|
RETURN Self
|
|
ENDIF
|
|
aadd( ::aBrowsers, { oBrw:nID, oBrw:qMdi, oBrw:qMdi:geometry(), oBrw, NIL } )
|
|
::oManager:updateIndexMenu( oBrw )
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowsePanel:activateBrowser()
|
|
IF Len( ::aBrowsers ) > 0
|
|
::qWidget:setActiveSubWindow( ::aBrowsers[ 1, SUB_WINDOW ] )
|
|
ENDIF
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
//
|
|
// Class IdeBrowse
|
|
//
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
CLASS IdeBrowse INHERIT IdeObject
|
|
|
|
DATA oWnd
|
|
DATA oBrw
|
|
DATA qLayout
|
|
DATA qForm
|
|
DATA qFLayout
|
|
DATA qSplitter
|
|
DATA qTimer
|
|
DATA qStatus
|
|
DATA qScrollArea
|
|
|
|
DATA nID INIT 0
|
|
|
|
DATA aForm INIT {}
|
|
DATA oManager
|
|
DATA oPanel
|
|
DATA qMDI
|
|
DATA aInfo INIT {}
|
|
|
|
DATA nType INIT BRW_TYPE_DBF
|
|
DATA cAlias INIT ""
|
|
DATA cTable INIT ""
|
|
DATA cTableOnly INIT ""
|
|
DATA aData INIT {}
|
|
DATA aStruct INIT {}
|
|
DATA aAttr INIT {}
|
|
DATA nIndex INIT 0
|
|
DATA cDriver INIT "DBFCDX"
|
|
DATA cConxn INIT ""
|
|
DATA cConxnFull INIT ""
|
|
DATA cIndex INIT ""
|
|
DATA nOrder INIT 0
|
|
DATA nArea INIT 0
|
|
DATA nCursorType INIT XBPBRW_CURSOR_CELL
|
|
DATA lOpened INIT .f.
|
|
|
|
DATA qVerSpl
|
|
DATA qClose
|
|
DATA aIndex INIT {}
|
|
|
|
DATA xSearch
|
|
DATA lInSearch INIT .f.
|
|
|
|
DATA aMenu INIT {}
|
|
DATA aIdx INIT {}
|
|
DATA aFlds INIT {}
|
|
DATA aSeek INIT {}
|
|
DATA aToFld INIT {}
|
|
|
|
CLASSDATA nIdentity INIT 0
|
|
|
|
METHOD new( oIde, oManager, oPanel, aInfo )
|
|
METHOD create( oIde, oManager, oPanel, aInfo )
|
|
METHOD configure()
|
|
METHOD destroy()
|
|
METHOD execEvent( nEvent, p, p1 )
|
|
METHOD buildBrowser()
|
|
METHOD buildColumns()
|
|
METHOD buildMdiWindow()
|
|
METHOD dataLink( nField )
|
|
METHOD getPP( aStruct )
|
|
|
|
METHOD skipBlock( nHowMany )
|
|
|
|
METHOD use()
|
|
METHOD exists()
|
|
METHOD goTop()
|
|
METHOD goBottom()
|
|
METHOD goTo( nRec )
|
|
METHOD lock()
|
|
METHOD goToAsk()
|
|
METHOD append()
|
|
METHOD delete( lAsk )
|
|
METHOD recall()
|
|
METHOD recNo()
|
|
METHOD lastRec()
|
|
METHOD ordKeyCount()
|
|
METHOD ordKeyNo()
|
|
METHOD ordKeyGoto( nRec )
|
|
ACCESS dbStruct() INLINE ::aStruct
|
|
METHOD indexOrd()
|
|
METHOD ordName( nOrder )
|
|
METHOD IndexKey( nOrder )
|
|
METHOD IndexKeyValue( nOrder )
|
|
METHOD refreshAll()
|
|
METHOD getIndexInfo()
|
|
METHOD setIndex( cIndex )
|
|
METHOD setOrder( nOrder )
|
|
ACCESS numIndexes() INLINE Len( ::aIndex )
|
|
|
|
METHOD dispInfo()
|
|
METHOD search( cSearch, lSoft, lLast, nMode )
|
|
METHOD searchAsk( nMode )
|
|
METHOD seekAsk( nMode )
|
|
METHOD next()
|
|
METHOD previous()
|
|
METHOD buildForm()
|
|
METHOD populateForm()
|
|
METHOD fetchAlias( cTable )
|
|
METHOD saveField( nField, x )
|
|
METHOD toColumn( ncIndex )
|
|
METHOD getSome( cType, cFor )
|
|
METHOD buildContextMenu()
|
|
|
|
ENDCLASS
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:new( oIde, oManager, oPanel, aInfo )
|
|
|
|
::oIde := oIde
|
|
::oManager := oManager
|
|
::oPanel := oPanel
|
|
::aInfo := aInfo
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:destroy()
|
|
|
|
IF ::lOpened
|
|
( ::cAlias )->( dbCloseArea() )
|
|
ENDIF
|
|
|
|
IF !empty( ::qTimer )
|
|
::qTimer:disconnect( "timeout()" )
|
|
ENDIF
|
|
|
|
::QTimer := NIL
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:create( oIde, oManager, oPanel, aInfo )
|
|
LOCAL xVrb, cT, cName, n
|
|
LOCAL lMissing := .t.
|
|
|
|
DEFAULT oIde TO ::oIde
|
|
DEFAULT oManager TO ::oManager
|
|
DEFAULT oPanel TO ::oPanel
|
|
DEFAULT aInfo TO ::aInfo
|
|
::oIde := oIde
|
|
::oManager := oManager
|
|
::oPanel := oPanel
|
|
::aInfo := aInfo
|
|
|
|
aSize( ::aInfo, TBL_VRBLS )
|
|
|
|
DEFAULT ::aInfo[ TBL_PANEL ] TO ::oPanel:cPanel
|
|
DEFAULT ::aInfo[ TBL_NAME ] TO ""
|
|
DEFAULT ::aInfo[ TBL_ALIAS ] TO ""
|
|
DEFAULT ::aInfo[ TBL_DRIVER ] TO ::oManager:currentDriver()
|
|
DEFAULT ::aInfo[ TBL_INDEX ] TO ""
|
|
DEFAULT ::aInfo[ TBL_RECORD ] TO ""
|
|
DEFAULT ::aInfo[ TBL_CURSOR ] TO ""
|
|
DEFAULT ::aInfo[ TBL_GEOMETRY ] TO ""
|
|
DEFAULT ::aInfo[ TBL_ROWPOS ] TO "1"
|
|
DEFAULT ::aInfo[ TBL_COLPOS ] TO "1"
|
|
DEFAULT ::aInfo[ TBL_HZSCROLL ] TO ""
|
|
DEFAULT ::aInfo[ TBL_CONXN ] TO ::oManager:currentConxn()
|
|
DEFAULT ::aInfo[ TBL_NEXT ] TO ""
|
|
|
|
::cTable := hbide_pathToOSPath( ::aInfo[ TBL_NAME ] )
|
|
hb_fNameSplit( ::cTable, , @cName )
|
|
::cTableOnly := cName
|
|
::cAlias := ::aInfo[ TBL_ALIAS ]
|
|
::cDriver := ::aInfo[ TBL_DRIVER ]
|
|
::cConxn := ::aInfo[ TBL_CONXN ]
|
|
|
|
IF ! ::exists()
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
IF !empty( ::oManager:aConxns )
|
|
n := ascan( ::oManager:aConxns, {|e| e == ::cConxn } )
|
|
::cConxnFull := ::oManager:aConxns[ n ]
|
|
ENDIF
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
IF !empty( ::cAlias ) .AND. empty( ::cTable )
|
|
IF select( ::cAlias ) > 0
|
|
lMissing := .f.
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF lMissing .AND. !empty( ::cTable )
|
|
IF ! ( ::lOpened := ::use() )
|
|
RETURN Self
|
|
ENDIF
|
|
ENDIF
|
|
|
|
::aStruct := ( ::cAlias )->( DbStruct() )
|
|
ELSE
|
|
FOR EACH xVrb IN ::aData[ 1 ]
|
|
cT := valtype( xVrb )
|
|
aadd( ::aStruct, "Fld_" + hb_ntos( xVrb:__enumIndex() ) )
|
|
aadd( ::aStruct, cT )
|
|
IF cT == "N"
|
|
aadd( ::aStruct, 12 )
|
|
aadd( ::aStruct, 2 )
|
|
ELSEIF cT == "D"
|
|
aadd( ::aStruct, 8 )
|
|
aadd( ::aStruct, 0 )
|
|
ELSEIF cT == "L"
|
|
aadd( ::aStruct, 1 )
|
|
aadd( ::aStruct, 0 )
|
|
ELSE
|
|
aadd( ::aStruct, Len( xVrb ) )
|
|
aadd( ::aStruct, 0 )
|
|
ENDIF
|
|
NEXT
|
|
ENDIF
|
|
|
|
::buildBrowser()
|
|
::buildColumns()
|
|
::buildForm()
|
|
::buildMdiWindow()
|
|
|
|
::oManager:oCurBrw := Self
|
|
|
|
::oBrw:configure()
|
|
::oBrw:forceStable()
|
|
::oBrw:rowPos := max( 1, val( aInfo[ TBL_ROWPOS ] ) )
|
|
::oBrw:colPos := max( 1, val( aInfo[ TBL_COLPOS ] ) )
|
|
::oBrw:forceStable()
|
|
::setOrder( val( aInfo[ TBL_INDEX ] ) )
|
|
::goto( max( 1, val( aInfo[ TBL_RECORD ] ) ) )
|
|
::oBrw:setCurrentIndex( .t. )
|
|
|
|
::oBrw:navigate := {|mp1,mp2| ::execEvent( __browse_navigate__, mp1, mp2 ) }
|
|
::oBrw:keyboard := {|mp1,mp2| ::execEvent( __browse_keyboard__, mp1, mp2 ) }
|
|
|
|
::qTimer := QTimer()
|
|
::qTimer:setInterval( 5 )
|
|
::qTimer:connect( "timeout()", {|| ::execEvent( __timer_timeout__ ) } )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:buildBrowser()
|
|
LOCAL qLayout, oWnd, oXbpBrowse
|
|
|
|
oWnd := XbpWindow():new()
|
|
oWnd:oWidget := QWidget()
|
|
|
|
qLayout := QHBoxLayout()
|
|
oWnd:oWidget:setLayout( qLayout )
|
|
qLayout:setContentsMargins( 0,0,0,0 )
|
|
qLayout:setSpacing( 2 )
|
|
|
|
::qSplitter := QSplitter()
|
|
::qSplitter:setOrientation( Qt_Horizontal )
|
|
|
|
qLayout:addWidget( ::qSplitter )
|
|
|
|
/* Browse View */
|
|
oXbpBrowse := XbpBrowse():new():create( oWnd, , { 0,0 }, oWnd:currentSize() )
|
|
oXbpBrowse:setFontCompoundName( "10.Courier" )
|
|
|
|
::qSplitter:addWidget( oXbpBrowse:oWidget )
|
|
|
|
oXbpBrowse:cursorMode := ::nCursorType
|
|
|
|
oXbpBrowse:skipBlock := {|n| ::skipBlock( n ) }
|
|
oXbpBrowse:goTopBlock := {| | ::goTop() }
|
|
oXbpBrowse:goBottomBlock := {| | ::goBottom() }
|
|
//
|
|
oXbpBrowse:firstPosBlock := {| | 1 }
|
|
#if 0
|
|
oXbpBrowse:lastPosBlock := {| | ::lastRec() }
|
|
oXbpBrowse:posBlock := {| | ::recNo() }
|
|
oXbpBrowse:goPosBlock := {|n| ::goto( n ) }
|
|
oXbpBrowse:phyPosBlock := {| | ::recNo() }
|
|
#endif
|
|
oXbpBrowse:lastPosBlock := {| | ::ordKeyCount() }
|
|
oXbpBrowse:posBlock := {| | ::ordKeyNo() }
|
|
oXbpBrowse:goPosBlock := {|n| ::ordKeyGoto( n ) }
|
|
oXbpBrowse:phyPosBlock := {| | ::ordKeyNo() }
|
|
|
|
|
|
oXbpBrowse:hbContextMenu := {|mp1| ::execEvent( __browser_contextMenu__, mp1 ) }
|
|
|
|
/* Form View */
|
|
::qForm := QWidget()
|
|
::qForm:setMinimumSize( QSize( 300 , Len( ::aStruct ) * 34 ) )
|
|
::qForm:setMaximumSize( QSize( 12000, 48000 ) )
|
|
|
|
::qFLayout := QFormLayout()
|
|
::qForm:setLayout( ::qFLayout )
|
|
|
|
::qScrollArea := QScrollArea()
|
|
::qScrollArea:setWidget( ::qForm )
|
|
::qScrollArea:hide()
|
|
|
|
::qSplitter:addWidget( ::qScrollArea )
|
|
|
|
::qLayout := qLayout
|
|
::oWnd := oWnd
|
|
::oBrw := oXbpBrowse
|
|
|
|
#if 0
|
|
::qVerSpl := QSplitter( Qt_Vertical )
|
|
::qSplitter:addWidget( ::qVerSpl )
|
|
|
|
::qVerSpl:addWidget( ::qForm )
|
|
|
|
::qClose := QToolButton()
|
|
::qClose:setIcon( QIcon( hbide_image( "closetab" ) ) )
|
|
::qClose:hide()
|
|
|
|
::qVerSpl:addWidget( ::qClose )
|
|
#endif
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:buildColumns()
|
|
LOCAL oXbpColumn, aPresParam, a_
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
FOR EACH a_ IN ::aStruct
|
|
aPresParam := ::getPP( a_ )
|
|
|
|
oXbpColumn := XbpColumn():new()
|
|
oXbpColumn:dataLink := ::dataLink( a_:__enumIndex() )
|
|
oXbpColumn:create( , , , , aPresParam )
|
|
|
|
::oBrw:addColumn( oXbpColumn )
|
|
NEXT
|
|
ELSE
|
|
FOR EACH a_ IN ::aStruct
|
|
::getPP( a_, a_:__enumIndex() )
|
|
|
|
oXbpColumn := XbpColumn():new()
|
|
oXbpColumn:dataLink := ::dataLink( a_:__enumIndex() )
|
|
oXbpColumn:create( , , , , aPresParam )
|
|
|
|
::oBrw:addColumn( oXbpColumn )
|
|
NEXT
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:buildForm()
|
|
LOCAL a_, qLbl, qEdit
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
FOR EACH a_ IN ::aStruct
|
|
qLbl := QLabel(); qLbl:setText( a_[ 1 ] )
|
|
qEdit := QLineEdit()
|
|
::qFLayout:addRow( qLbl, qEdit )
|
|
aadd( ::aForm, { qLbl, qEdit } )
|
|
NEXT
|
|
ELSE
|
|
ENDIF
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:buildMdiWindow()
|
|
LOCAL qRect, cR
|
|
|
|
STATIC nID := 0
|
|
|
|
::nID := ++nID
|
|
|
|
::qMdi := QMdiSubWindow()
|
|
//
|
|
::qMdi:setWidget( ::oWnd:oWidget )
|
|
::oPanel:qWidget:addSubWindow( ::qMdi )
|
|
|
|
::oWnd:oWidget:show()
|
|
::qMdi:show()
|
|
|
|
::qMdi:setWindowTitle( ::cTable )
|
|
::qMdi:setObjectName( hb_ntos( nID ) )
|
|
::qMdi:setWindowIcon( QIcon( hbide_image( "dbf_p" + hb_ntos( ::nID ) ) ) )
|
|
|
|
IF ! empty( ::aInfo[ TBL_GEOMETRY ] )
|
|
qRect := hb_aTokens( ::aInfo[ TBL_GEOMETRY ], " " )
|
|
FOR EACH cR IN qRect
|
|
cR := val( cR )
|
|
NEXT
|
|
qRect := QRect( qRect[ 1 ], qRect[ 2 ], qRect[ 3 ], qRect[ 4 ] )
|
|
::qMdi:setGeometry( qRect )
|
|
::qMdi:resize( ::qMdi:width()+1, ::qMdi:height()+1 )
|
|
::qMdi:resize( ::qMdi:width()-1, ::qMdi:height()-1 )
|
|
ELSE
|
|
::qMdi:resize( 300, 200 )
|
|
ENDIF
|
|
::dispInfo()
|
|
|
|
* ::qMdi:connect( "aboutToActivate()", {|| ::execEvent( "mdiSubWindow_aboutToActivate" ) } )
|
|
::qMdi:connect( "windowStateChanged(Qt::WindowStates,Qt::WindowStates)", ;
|
|
{|p,p1| ::execEvent( __mdiSubWindow_windowStateChanged__, p, p1 ) } )
|
|
::qMdi:connect( QEvent_Close, {|oEvent| oEvent:accept(), ::execEvent( __mdiSubWindow_buttonXclicked__ ) } )
|
|
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:configure()
|
|
LOCAL nOff
|
|
LOCAL nRowPos := ::oBrw:rowPos()
|
|
LOCAL nColPos := ::oBrw:colPos()
|
|
|
|
::oBrw:configure()
|
|
|
|
IF nRowPos > ::oBrw:rowCount()
|
|
nOff := nRowPos - ::oBrw:rowCount()
|
|
::oBrw:rowPos := ::oBrw:rowCount()
|
|
ELSE
|
|
nOff := 0
|
|
ENDIF
|
|
::oBrw:colPos := nColPos
|
|
|
|
::oBrw:refreshAll()
|
|
::oBrw:forceStable()
|
|
::oBrw:setCurrentIndex( nRowPos > ::oBrw:rowCount() )
|
|
IF nOff > 0
|
|
SetAppEvent( xbeBRW_Navigate, XBPBRW_Navigate_Skip, nOff, ::oBrw )
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:execEvent( nEvent, p, p1 )
|
|
|
|
HB_SYMBOL_UNUSED( p )
|
|
HB_SYMBOL_UNUSED( p1 )
|
|
|
|
SWITCH nEvent
|
|
CASE __browse_navigate__
|
|
::dispInfo()
|
|
::populateForm()
|
|
::oManager:oCurBrw := Self
|
|
::oManager:qToolbar:setItemChecked( "Toggle", ! ::qForm:isHidden() )
|
|
EXIT
|
|
CASE __browse_keyboard__
|
|
IF p == xbeK_CTRL_F
|
|
::searchAsk()
|
|
ELSEIF p == xbeK_CTRL_G
|
|
::gotoAsk()
|
|
ELSEIF p == xbeK_CTRL_E
|
|
::oBrw:oTableView:edit( ::oBrw:getCurrentIndex() )
|
|
ENDIF
|
|
EXIT
|
|
CASE __timer_timeout__
|
|
::oBrw:down()
|
|
IF ::oBrw:hitBottom
|
|
::qTimer:stop()
|
|
::dispInfo()
|
|
ELSEIF Left( eval( ::oBrw:getColumn( ::oBrw:colPos ):block ), Len( ::xSearch ) ) == ::xSearch
|
|
::qTimer:stop()
|
|
::dispInfo()
|
|
ENDIF
|
|
EXIT
|
|
CASE __mdiSubWindow_buttonXclicked__
|
|
::oPanel:destroyBrw( Self )
|
|
EXIT
|
|
#if 0
|
|
CASE __browser_ScrollToColumn__
|
|
CASE __mdiSubWindow_aboutToActivate__
|
|
::oBrw:configure()
|
|
::oBrw:setCurrentIndex( .t. )
|
|
EXIT
|
|
#endif
|
|
CASE __mdiSubWindow_windowStateChanged__
|
|
IF p1 == 8
|
|
::oPanel:setCurrentBrowser( Self )
|
|
ENDIF
|
|
EXIT
|
|
CASE __browser_contextMenu__
|
|
IF empty( ::aMenu )
|
|
::buildContextMenu()
|
|
ENDIF
|
|
hbide_execPopup( ::aMenu, p, ::qMdi )
|
|
EXIT
|
|
ENDSWITCH
|
|
|
|
#if 0
|
|
activateNextSubWindow()
|
|
activatePreviousSubWindow()
|
|
closeActiveSubWindow()
|
|
closeAllSubWindows()
|
|
setActiveSubWindow( QMdiSubWindow * )
|
|
#endif
|
|
|
|
RETURN NIL
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:buildContextMenu()
|
|
LOCAL a_, cPmt, nZeros, cIndex
|
|
|
|
::qMdi:setFocus( 0 )
|
|
|
|
IF Len( ::aIndex ) > 0
|
|
aadd( ::aMenu, { "Set to Natural Order", {|| ::setOrder( 0 ) } } )
|
|
aadd( ::aMenu, { "" } )
|
|
ENDIF
|
|
|
|
/* Indexed Order */
|
|
::getIndexInfo()
|
|
FOR EACH cIndex IN ::aIndex
|
|
aadd( ::aIdx, hbide_indexArray( Self, cIndex, cIndex:__enumIndex() ) )
|
|
NEXT
|
|
IF ! empty( ::aIdx )
|
|
aadd( ::aMenu, { ::aIdx, "Set to Indexed Order" } )
|
|
aadd( ::aMenu, { "" } )
|
|
ENDIF
|
|
|
|
/* Column Scrolling */
|
|
nZeros := iif( Len( ::aStruct ) < 10, 1, iif( len( ::aStruct ) < 100, 2, 3 ) )
|
|
FOR EACH a_ IN ::aStruct
|
|
cPmt := strzero( a_:__enumIndex(), nZeros ) + " " + a_[ 2 ] + " . " + a_[ 1 ]
|
|
aadd( ::aFlds, hbide_fieldsArray( Self, cPmt, a_:__enumIndex() ) )
|
|
NEXT
|
|
aadd( ::aMenu, { ::aFlds, "Scroll to Column" } )
|
|
aadd( ::aMenu, { "Scroll to ..." , {|v| v := QInputDialog():getText( ::qMdi, "Field Name", "" ), ::toColumn( v ) } } )
|
|
aadd( ::aMenu, { "" } )
|
|
|
|
/* Seeks */
|
|
aadd( ::aSeek, { "Seek" , {|| ::seekAsk( 0 ) } } )
|
|
aadd( ::aSeek, { "Seek Soft" , {|| ::seekAsk( 1 ) } } )
|
|
aadd( ::aSeek, { "Seek Last" , {|| ::seekAsk( 2 ) } } )
|
|
aadd( ::aMenu, { ::aSeek , "Seek..." } )
|
|
aadd( ::aMenu, { "Search in Field", {|| ::searchAsk( 1 ) } } )
|
|
aadd( ::aMenu, { "" } )
|
|
|
|
/* Navigation */
|
|
aadd( ::aMenu, { "Go Top" , {|| ::goTop() } } )
|
|
aadd( ::aMenu, { "Go Bottom" , {|| ::goBottom() } } )
|
|
aadd( ::aMenu, { "Goto Record" , {|| ::gotoAsk() } } )
|
|
aadd( ::aMenu, { "" } )
|
|
|
|
/* Manipulation */
|
|
aadd( ::aMenu, { "Append Blank" , {|| ::append() } } )
|
|
aadd( ::aMenu, { "Delete Record" , {|| ::delete( .t. ) } } )
|
|
aadd( ::aMenu, { "Recall Deleted" , {|| ::recall() } } )
|
|
aadd( ::aMenu, { "" } )
|
|
|
|
/* Miscellaneous */
|
|
aadd( ::aMenu, { "Form View" , {|| ::oManager:execEvent( __buttonShowForm_clicked__ ) } } )
|
|
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
STATIC FUNCTION hbide_fieldsArray( obj, cPmt, nIndex )
|
|
RETURN { cPmt, {|| obj:toColumn( nIndex ) } }
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
STATIC FUNCTION hbide_indexArray( obj, cIndex, nOrder )
|
|
RETURN { cIndex, {|| obj:setOrder( nOrder ) } }
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:dispInfo()
|
|
LOCAL cTitle
|
|
|
|
IF !empty( ::qMdi )
|
|
::qMdi:setTooltip( ::cTable )
|
|
#if 1
|
|
cTitle := "[ " + ::cDriver + " " + ;
|
|
hb_ntos( ::indexOrd() ) + "/" + hb_ntos( ::numIndexes() ) + iif( ::indexOrd() > 0, ":" + ::ordName(), "" ) + ;
|
|
" " + hb_ntos( ::recNo() ) + "/" + hb_ntos( ::lastRec() ) + " ] " + ;
|
|
::cTableOnly
|
|
#else
|
|
//cTitle := HBQString( hb_ntos( ::recNo() ) )
|
|
cTitle := hb_ntos( ::recNo() )
|
|
#endif
|
|
|
|
::qMdi:setWindowTitle( cTitle )
|
|
ENDIF
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:fetchAlias( cTable )
|
|
LOCAL cFile
|
|
|
|
STATIC n := 0
|
|
n++
|
|
|
|
hb_fNameSplit( cTable, , @cFile )
|
|
|
|
RETURN upper( "C" + cFile + hb_ntos( n ) )
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
STATIC FUNCTION hbide_xtosForForm( xVrb )
|
|
LOCAL cType := valtype( xVrb )
|
|
|
|
DO CASE
|
|
CASE cType == "N" ; RETURN ltrim( str( xVrb ) )
|
|
CASE cType == "L" ; RETURN iif( xVrb, "YES", "NO" )
|
|
CASE cType == "D" ; RETURN dtos( xVrb )
|
|
CASE cType == "C" ; RETURN trim( xVrb )
|
|
ENDCASE
|
|
|
|
RETURN ""
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:populateForm()
|
|
LOCAL a_, oCol
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
IF ::qForm:isVisible()
|
|
FOR EACH a_ IN ::aForm
|
|
oCol := ::oBrw:getColumn( a_:__enumIndex() )
|
|
::aForm[ a_:__enumIndex(), 2 ]:setText( hbide_xtosForForm( eval( oCol:block ) ) )
|
|
NEXT
|
|
ENDIF
|
|
ELSE
|
|
|
|
ENDIF
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:saveField( nField, x )
|
|
IF ( ::cAlias )->( DbrLock() )
|
|
( ::cAlias )->( FieldPut( nField, x ) )
|
|
( ::cAlias )->( DbCommit() )
|
|
( ::cAlias )->( DbrUnlock() )
|
|
::oBrw:refreshCurrent()
|
|
::oBrw:forceStable()
|
|
::oBrw:SetCurrentIndex( .f. )
|
|
ENDIF
|
|
RETURN x
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:dataLink( nField )
|
|
LOCAL bBlock
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
bBlock := {|x| iif( x == NIL, ( ::cAlias )->( fieldget( nField ) ), ::saveField( nField, x ) ) }
|
|
ELSE
|
|
bBlock := {|| ::aData[ ::nIndex, nField ] }
|
|
ENDIF
|
|
|
|
RETURN bBlock
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:getPP( aStruct )
|
|
LOCAL aPresParam := {}
|
|
|
|
aadd( aPresParam, { XBP_PP_COL_HA_CAPTION , aStruct[ 1 ] } )
|
|
aadd( aPresParam, { XBP_PP_COL_DA_ROWHEIGHT , 20 } )
|
|
|
|
RETURN aPresParam
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:skipBlock( nHowMany )
|
|
LOCAL nRecs, nCurPos
|
|
LOCAL nSkipped := 0
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
IF nHowMany == 0
|
|
( ::cAlias )->( DBSkip( 0 ) )
|
|
|
|
ELSEIF nHowMany > 0
|
|
DO WHILE nSkipped != nHowMany .AND. ::next()
|
|
nSkipped++
|
|
ENDDO
|
|
ELSE
|
|
DO WHILE nSkipped != nHowMany .AND. ::previous()
|
|
nSkipped--
|
|
ENDDO
|
|
ENDIF
|
|
|
|
ELSE
|
|
nRecs := Len( ::aData )
|
|
nCurPos := ::nIndex
|
|
|
|
IF nHowMany >= 0
|
|
IF ( nCurpos + nHowMany ) > nRecs
|
|
nSkipped := nRecs - nCurpos
|
|
::nIndex := nRecs
|
|
ELSE
|
|
nSkipped := nHowMany
|
|
::nIndex += nHowMany
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF ( nCurpos + nHowMany ) < 1
|
|
nSkipped := 1 - nCurpos
|
|
::nIndex := 1
|
|
ELSE
|
|
nSkipped := nHowMany
|
|
::nIndex += nHowMany
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN nSkipped
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:next()
|
|
LOCAL nSaveRecNum := ( ::cAlias )->( recno() )
|
|
LOCAL lMoved := .T.
|
|
|
|
IF ( ::cAlias )->( Eof() )
|
|
lMoved := .F.
|
|
ELSE
|
|
( ::cAlias )->( DbSkip( 1 ) )
|
|
IF ( ::cAlias )->( Eof() )
|
|
lMoved := .F.
|
|
( ::cAlias )->( DbGoTo( nSaveRecNum ) )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN lMoved
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:previous()
|
|
LOCAL nSaveRecNum := ( ::cAlias )->( recno() )
|
|
LOCAL lMoved := .T.
|
|
|
|
( ::cAlias )->( DbSkip( -1 ) )
|
|
|
|
IF ( ::cAlias )->( Bof() )
|
|
( ::cAlias )->( DbGoTo( nSaveRecNum ) )
|
|
lMoved := .F.
|
|
ENDIF
|
|
|
|
RETURN lMoved
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:getSome( cType, cFor )
|
|
LOCAL nOrd := ::indexOrd()
|
|
LOCAL qWidget := QApplication():focusWidget() // ::oWnd:oWidget
|
|
|
|
SWITCH cType
|
|
CASE "N"
|
|
RETURN QInputDialog():getDouble( qWidget, "Search for?", cFor, ;
|
|
0, -2147483647, 2147483647, iif( nOrd > 0, 3, ::aStruct[ ::oBrw:colPos, 4 ] ) )
|
|
CASE "D"
|
|
RETURN hbide_fetchADate( qWidget, "Search for?", cFor )
|
|
CASE "C"
|
|
DEFAULT cFor TO ""
|
|
RETURN QInputDialog():getText( qWidget, "Search for?", cFor )
|
|
ENDSWITCH
|
|
|
|
RETURN ""
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:seekAsk( nMode )
|
|
|
|
IF ::indexOrd() == 0
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
::search( ::getSome( valtype( ::indexKeyValue() ) ), nMode == 1, nMode == 2 )
|
|
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:searchAsk( nMode )
|
|
LOCAL xValue, cFor
|
|
|
|
DEFAULT nMode TO 0
|
|
|
|
IF nMode == 0
|
|
xValue := iif( ::indexOrd() > 0, ::indexKeyValue(), eval( ::oBrw:getColumn( ::oBrw:colPos ):block ) )
|
|
cFor := iif( ::indexOrd() > 0, "Indexed: " + ::indexKey(), ::aStruct[ ::oBrw:colPos, 1 ] )
|
|
ELSEIF nMode == 1
|
|
xValue := eval( ::oBrw:getColumn( ::oBrw:colPos ):block )
|
|
cFor := ::aStruct[ ::oBrw:colPos, 1 ]
|
|
ENDIF
|
|
|
|
::search( ::getSome( valtype( xValue ), cFor ), .f., .f., nMode )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:search( cSearch, lSoft, lLast, nMode )
|
|
LOCAL nRec
|
|
|
|
DEFAULT nMode TO 0
|
|
|
|
IF ::lInSearch
|
|
::qTimer:stop()
|
|
::lInSearch := .f.
|
|
ENDIF
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
IF nMode == 0
|
|
IF ( ::cAlias )->( IndexOrd() ) > 0
|
|
|
|
DEFAULT lLast TO .f.
|
|
DEFAULT lSoft TO .f.
|
|
|
|
nRec := ::recNo()
|
|
IF ( ::cAlias )->( DbSeek( cSearch, lSoft, lLast ) )
|
|
::refreshAll()
|
|
::dispInfo()
|
|
ELSEIF ! lSoft
|
|
::goto( nRec )
|
|
MsgBox( "Could not find: " + cSearch )
|
|
ENDIF
|
|
ELSE
|
|
::xSearch := cSearch
|
|
::lInSearch := .t.
|
|
::qTimer:start()
|
|
ENDIF
|
|
ELSE
|
|
::xSearch := cSearch
|
|
::lInSearch := .t.
|
|
::qTimer:start()
|
|
ENDIF
|
|
ELSE
|
|
// Ascan
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:refreshAll()
|
|
LOCAL qRect
|
|
|
|
::oBrw:refreshAll()
|
|
::oBrw:forceStable()
|
|
::oBrw:setCurrentIndex( .t. )
|
|
qRect := ::qMdi:geometry()
|
|
qRect:setHeight( qRect:height() + 3 )
|
|
::qMdi:setGeometry( qRect)
|
|
qRect:setHeight( qRect:height() - 3 )
|
|
::qMdi:setGeometry( qRect)
|
|
|
|
::dispInfo()
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:toColumn( ncIndex )
|
|
LOCAL nIndex
|
|
|
|
IF valtype( ncIndex ) == "C"
|
|
ncIndex := upper( ncIndex )
|
|
nIndex := ascan( ::aStruct, {|e_| Left( e_[ 1 ], Len( ncIndex ) ) == ncIndex } )
|
|
ELSE
|
|
nIndex := ncIndex
|
|
ENDIF
|
|
|
|
IF empty( nIndex )
|
|
RETURN Self
|
|
ENDIF
|
|
|
|
::oBrw:colPos := nIndex
|
|
::oBrw:refreshAll()
|
|
::oBrw:forceStable()
|
|
::oBrw:setCurrentIndex( .t. )
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:lock()
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
IF ! ( ::cAlias )->( DbrLock() )
|
|
MsgBox( "Record could not been locked" )
|
|
ENDIF
|
|
ELSE
|
|
MsgBox( "Record can not be locked" )
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:goToAsk()
|
|
LOCAL nRec
|
|
|
|
IF ! empty( nRec := ( QInputDialog() ):getInt( ::qMdi, "Goto", "Record_# ?", ::recno(), 1, ::lastrec() ) )
|
|
::goto( nRec )
|
|
::refreshAll()
|
|
ENDIF
|
|
|
|
RETURN NIL
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:ordKeyGoto( nRec )
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
( ::cAlias )->( OrdKeyGoto( nRec ) )
|
|
::refreshAll()
|
|
ELSE
|
|
IF nRec > 0 .AND. nRec <= Len( ::aData )
|
|
::nIndex := nRec
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:goto( nRec )
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
( ::cAlias )->( DbGoto( nRec ) )
|
|
::refreshAll()
|
|
ELSE
|
|
IF nRec > 0 .AND. nRec <= Len( ::aData )
|
|
::nIndex := nRec
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:goTop()
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
( ::cAlias )->( DbGotop() )
|
|
::refreshAll()
|
|
ELSE
|
|
::nIndex := 1
|
|
ENDIF
|
|
RETURN NIL
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:goBottom()
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
( ::cAlias )->( DbGoBottom() )
|
|
::refreshAll()
|
|
ELSE
|
|
::nIndex := Len( ::aData )
|
|
ENDIF
|
|
|
|
RETURN NIL
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:setOrder( nOrder )
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
( ::cAlias )->( DbSetOrder( nOrder ) )
|
|
::refreshAll()
|
|
ENDIF
|
|
|
|
RETURN NIL
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:indexOrd()
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
RETURN ( ::cAlias )->( IndexOrd() )
|
|
ENDIF
|
|
|
|
RETURN 0
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:ordKeyNo()
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
RETURN ( ::cAlias )->( OrdKeyNo() )
|
|
ELSE
|
|
RETURN ::nIndex
|
|
ENDIF
|
|
|
|
RETURN 0
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:recNo()
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
RETURN ( ::cAlias )->( RecNo() )
|
|
ELSE
|
|
RETURN ::nIndex
|
|
ENDIF
|
|
|
|
RETURN 0
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:ordKeyCount()
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
RETURN ( ::cAlias )->( ordKeyCount() )
|
|
ELSE
|
|
RETURN Len( ::aData )
|
|
ENDIF
|
|
|
|
RETURN 0
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:lastRec()
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
RETURN ( ::cAlias )->( LastRec() )
|
|
ELSE
|
|
RETURN Len( ::aData )
|
|
ENDIF
|
|
|
|
RETURN 0
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:setIndex( cIndex )
|
|
LOCAL n
|
|
|
|
IF ( n := ascan( ::aIndex, cIndex ) ) > 0
|
|
( ::cAlias )->( DbSetOrder( n ) )
|
|
::oBrw:refreshAll()
|
|
::oBrw:forceStable()
|
|
::oBrw:setCurrentIndex( .t. )
|
|
|
|
::dispInfo()
|
|
ENDIF
|
|
|
|
RETURN Self
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:getIndexInfo()
|
|
LOCAL a_:= {}, i, cKey
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
FOR i := 1 to 50
|
|
IF ( cKey := ( ::cAlias )->( IndexKey( i ) ) ) == ''
|
|
EXIT
|
|
ENDIF
|
|
aadd( a_, ( ::cAlias )->( OrdName( i ) ) + ' : ' + cKey )
|
|
NEXT
|
|
ENDIF
|
|
|
|
::aIndex := a_
|
|
|
|
RETURN ::aIndex
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:ordName( nOrder )
|
|
DEFAULT nOrder TO ::indexOrd()
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
RETURN ( ::cAlias )->( OrdName( nOrder ) )
|
|
ENDIF
|
|
|
|
RETURN ""
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:indexKeyValue( nOrder )
|
|
LOCAL xValue
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
xValue := ( ::cAlias )->( &( IndexKey( nOrder ) ) )
|
|
ENDIF
|
|
|
|
RETURN xValue
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:indexKey( nOrder )
|
|
DEFAULT nOrder TO ::indexOrd()
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
RETURN ( ::cAlias )->( IndexKey( nOrder ) )
|
|
ENDIF
|
|
|
|
RETURN ""
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:append()
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
( ::cAlias )->( DbAppend() )
|
|
IF ! NetErr()
|
|
( ::cAlias )->( DbCommit() )
|
|
( ::cAlias )->( DbrUnlock() )
|
|
::refreshAll()
|
|
ENDIF
|
|
ELSE
|
|
|
|
ENDIF
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:delete( lAsk )
|
|
|
|
DEFAULT lAsk TO .t.
|
|
|
|
IF lAsk
|
|
IF ! hbide_getYesNo( "Delete Record ?", , "Deletion Process" )
|
|
RETURN Self
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
IF ( ::cAlias )->( DbRLock() )
|
|
( ::cAlias )->( DbDelete() )
|
|
( ::cAlias )->( DbCommit() )
|
|
( ::cAlias )->( DbRUnlock() )
|
|
::refreshAll()
|
|
ENDIF
|
|
ELSE
|
|
|
|
ENDIF
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:recall()
|
|
|
|
IF ::nType == BRW_TYPE_DBF
|
|
IF ( ::cAlias )->( Deleted() )
|
|
IF ( ::cAlias )->( DbRLock() )
|
|
( ::cAlias )->( DbRecall() )
|
|
( ::cAlias )->( DbCommit() )
|
|
( ::cAlias )->( DbRUnlock() )
|
|
::refreshAll()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
|
|
ENDIF
|
|
RETURN Self
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:use()
|
|
LOCAL bError, oErr
|
|
LOCAL lErr := .f.
|
|
|
|
SWITCH ::cDriver
|
|
CASE "DBFCDX"
|
|
CASE "DBFNTX"
|
|
CASE "DBFNSX"
|
|
CASE "ADS"
|
|
bError := ErrorBlock( {|o| break( o ) } )
|
|
BEGIN SEQUENCE
|
|
IF empty( ::cAlias )
|
|
USE ( ::cTable ) SHARED NEW VIA ( ::cDriver )
|
|
ELSE
|
|
USE ( ::cTable ) ALIAS ( ::cAlias ) SHARED NEW VIA ( ::cDriver )
|
|
ENDIF
|
|
IF NetErr()
|
|
MsgBox( ::cTable, "Could not been opened!" )
|
|
lErr := .t.
|
|
ENDIF
|
|
RECOVER USING oErr
|
|
MsgBox( oErr:description, "Error Opening Table" )
|
|
RETURN Self
|
|
ENDSEQUENCE
|
|
ErrorBlock( bError )
|
|
|
|
EXIT
|
|
OTHERWISE
|
|
lErr := hbide_execScriptFunction( "tableUse", ::cTable, ::cAlias, ::cDriver, ::cConxn ) /* cTable holds the information about connection */
|
|
EXIT
|
|
ENDSWITCH
|
|
|
|
IF lErr
|
|
RETURN .f.
|
|
ENDIF
|
|
|
|
IF empty( ::cAlias )
|
|
::cAlias := alias()
|
|
ENDIF
|
|
|
|
RETURN .t.
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
METHOD IdeBrowse:exists()
|
|
|
|
SWITCH ::cDriver
|
|
CASE "DBFCDX"
|
|
CASE "DBFNSX"
|
|
CASE "DBFNTX"
|
|
CASE "ADS"
|
|
RETURN hb_fileExists( ::cTable )
|
|
OTHERWISE
|
|
RETURN hbide_execScriptFunction( "tableExists", ::cTable, ::cDriver, ::cConxn )
|
|
ENDSWITCH
|
|
|
|
RETURN .f.
|
|
|
|
/*----------------------------------------------------------------------*/
|