2010-06-28 01:12 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)

* contrib/hbide/hbide.hbp

  * contrib/hbide/hbide.prg
  * contrib/hbide/ideactions.prg
  + contrib/hbide/idebrowse.prg
  * contrib/hbide/idedocks.prg
  * contrib/hbide/ideeditor.prg
  * contrib/hbide/ideobject.prg
  * contrib/hbxbp/xbpbrowse.prg

    + Implemented: database tables manager ( dbu ). 
      A work-in-progress but you can have a feel of it.
        1. "View"->"Browser Widget"->Select a Table.
        2. Hide the widget and repeat process 1, select another table.
        3. The widget will now contain both browsers. 

    NOTE: many surprises may be there, just bear with me, 
          it is a quick commit. Refinements are scheduled for 
          this whole week.
This commit is contained in:
Pritpal Bedi
2010-06-28 08:19:55 +00:00
parent 580ed68ee0
commit 83cd26eed4
9 changed files with 579 additions and 8 deletions

View File

@@ -16,6 +16,27 @@
The license applies to all entries newer than 2009-04-28.
*/
2010-06-28 01:12 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbide/hbide.hbp
* contrib/hbide/hbide.prg
* contrib/hbide/ideactions.prg
+ contrib/hbide/idebrowse.prg
* contrib/hbide/idedocks.prg
* contrib/hbide/ideeditor.prg
* contrib/hbide/ideobject.prg
* contrib/hbxbp/xbpbrowse.prg
+ Implemented: database tables manager ( dbu ).
A work-in-progress but you can have a feel of it.
1. "View"->"Browser Widget"->Select a Table.
2. Hide the widget and repeat process 1, select another table.
3. The widget will now contain both browsers.
NOTE: many surprises may be there, just bear with me,
it is a quick commit. Refinements are scheduled for
this whole week.
2010-06-27 19:34 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbide/toolsutilities.ui
+ Added "Plugin" "Init at startup" slots.

View File

@@ -48,6 +48,7 @@ ideshortcuts.prg
ideedit.prg
ideplugins.prg
idedict.prg
idebrowse.prg
-pi=*.ui
-plugin=resources/hbmk2_plugin_ui.prg

View File

@@ -85,6 +85,9 @@
REQUEST HB_QT
REQUEST DBFCDX
REQUEST DBFNTX
STATIC s_resPath
STATIC s_pathSep
@@ -130,6 +133,7 @@ CLASS HbIde
DATA cProjIni
DATA oAC /* Actions Manager */
DATA oBM /* Database Browser Manager */
DATA oDK /* Main Window Components Manager */
DATA oDW /* Document Writer Manager */
DATA oEM /* Editor Tabs Manager */
@@ -466,6 +470,9 @@ METHOD HbIde:create( aParams )
/* Home Implementation */
::oHM := IdeHome():new():create( Self )
/* Browser Manager */
::oBM := IdeBrowseManager():new():create( Self )
/* Fill various elements of the IDE */
::oPM:populate()
::oSM:loadSources()

View File

@@ -547,9 +547,8 @@ METHOD IdeActions:buildMainMenu()
oSubMenu:oWidget:addAction_4( ::oThemesDock:oWidget:toggleViewAction() )
oSubMenu:oWidget:addAction_4( ::oFindDock:oWidget:toggleViewAction() )
oSubMenu:oWidget:addAction_4( ::oSourceThumbnailDock:oWidget:toggleViewAction() )
#ifdef QT_WITH_SCINTILLA
oSubMenu:oWidget:addAction_4( ::oQScintillaDock:oWidget:toggleViewAction() )
#endif
oSubMenu:oWidget:addSeparator()
oSubMenu:oWidget:addAction_4( ::oDockB2:oWidget:toggleViewAction() )
* oSubMenu:oWidget:addAction_4( ::oDockB1:oWidget:toggleViewAction() )

View File

@@ -0,0 +1,537 @@
/*
* $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 <pritpal@vouchcac.com>
* 27Jun2010
*/
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
#include "common.ch"
#include "hbclass.ch"
#include "hbqt.ch"
#include "hbide.ch"
#include "xbp.ch"
/*----------------------------------------------------------------------*/
#define BRW_TYPE_DBF 1
#define BRW_TYPE_ARRAY 2
/*----------------------------------------------------------------------*/
STATIC FUNCTION hbide_getNewAlias( cTable )
LOCAL cFile
STATIC n := 0
n++
hb_fNameSplit( cTable, , @cFile )
RETURN cFile + "_" + hb_ntos( n )
/*----------------------------------------------------------------------*/
FUNCTION hbide_browseSome( oIde )
LOCAL cTable, cPath
IF !empty( cTable := hbide_fetchAFile( oIde:oDlg, "Select a Table", { { "Database File", "*.dbf" } }, oIde:cWrkFolderLast ) )
hb_fNameSplit( cTable, @cPath )
oIde:cWrkFolderLast := cPath
oIde:oBM:addTable( cTable )
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
CLASS IdeBrowseManager INHERIT IdeObject
DATA aItems INIT {}
DATA oPanel
DATA qLayout
METHOD new( oIde )
METHOD create( oIde )
METHOD destroy()
METHOD addTable( cFileDBF, cAlias, nRow, nCol )
METHOD addArray( aData, aAttr, nRow, nCol )
ENDCLASS
/*----------------------------------------------------------------------*/
METHOD IdeBrowseManager:new( oIde )
::oIde := oIde
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeBrowseManager:create( oIde )
DEFAULT oIde TO ::oIde
::oIde := oIde
::oPanel := QWidget():new()
::oIde:oEM:oQScintillaDock:oWidget:setWidget( ::oPanel )
::qLayout := QVBoxLayout():new()
::oPanel:setLayout( ::qLayout )
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeBrowseManager:destroy()
LOCAL oBrw
// Close tables and clear variables
FOR EACH oBrw IN ::aItems
Select( oBrw:cAlias )
DbCloseArea()
NEXT
::aItems := {}
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeBrowseManager:addArray( aData, aAttr, nRow, nCol )
HB_SYMBOL_UNUSED( aData )
HB_SYMBOL_UNUSED( aAttr )
HB_SYMBOL_UNUSED( nRow )
HB_SYMBOL_UNUSED( nCol )
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeBrowseManager:addTable( cFileDBF, cAlias, nRow, nCol )
LOCAL oBrw
HB_SYMBOL_UNUSED( nRow )
HB_SYMBOL_UNUSED( nCol )
oBrw := IdeBrowse():new()
oBrw:cTable := cFileDBF
oBrw:cAlias := cAlias
oBrw:create()
::qLayout:addWidget( oBrw:oWnd:oWidget )
aadd( ::aItems, oBrw )
RETURN Self
/*----------------------------------------------------------------------*/
//
// Class IdeBrowse
//
/*----------------------------------------------------------------------*/
CLASS IdeBrowse INHERIT IdeObject
DATA oWnd
DATA oBrw
DATA qLayout
DATA nType INIT BRW_TYPE_DBF
DATA cAlias INIT ""
DATA cTable INIT ""
DATA aData INIT {}
DATA aStruct INIT {}
DATA aAttr INIT {}
DATA nIndex INIT 0
DATA cDriver INIT "DBFCDX"
DATA cIndex INIT ""
DATA nOrder INIT 0
DATA nArea INIT 0
DATA nCursorType INIT XBPBRW_CURSOR_CELL
METHOD new( oIde )
METHOD create( oIde )
METHOD destroy()
METHOD buildBrowser()
METHOD buildColumns()
METHOD dataLink( nField )
METHOD getPP( aStruct )
METHOD skipBlock( nHowMany )
METHOD goTop()
METHOD goBottom()
METHOD goTo( nRec )
METHOD recNo()
METHOD lastRec()
METHOD next()
METHOD previous()
ENDCLASS
/*----------------------------------------------------------------------*/
METHOD IdeBrowse:new( oIde )
::oIde := oIde
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeBrowse:create( oIde )
LOCAL xVrb, cT
LOCAL lMissing := .t.
DEFAULT oIde TO ::oIde
::oIde := oIde
IF !empty( ::aData )
::nType := BRW_TYPE_ARRAY
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 empty( ::cAlias )
USE ( ::cTable ) SHARED NEW VIA ( ::cDriver )
ELSE
USE ( ::cTable ) SHARED NEW ALIAS ( ::cAlias ) VIA ( ::cDriver )
ENDIF
IF NetErr()
MsgBox( ::cTable, "Could not been opened!" )
RETURN Self
ENDIF
IF empty( ::cAlias )
::cAlias := alias()
ENDIF
ENDIF
::aStruct := 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()
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeBrowse:buildBrowser()
LOCAL qLayout, oWnd, oXbpBrowse
oWnd := XbpWindow():new()
oWnd:oWidget := QWidget():new()
//oWnd:oWidget:resize( 600,300 )
//oWnd:oWidget:setWindowFlags( Qt_Sheet )
qLayout := QVBoxLayout():new()
oWnd:oWidget:setLayout( qLayout )
oXbpBrowse := XbpBrowse():new():create( oWnd, , { 0,0 }, oWnd:currentSize() )
oXbpBrowse:setFontCompoundName( "10.Courier" )
qLayout:addWidget( oXbpBrowse:oWidget )
oXbpBrowse:cursorMode := ::nCursorType
oXbpBrowse:skipBlock := {|n| ::skipBlock( n ) }
oXbpBrowse:goTopBlock := {| | ::goTop() }
oXbpBrowse:goBottomBlock := {| | ::goBottom() }
//
oXbpBrowse:firstPosBlock := {| | 1 }
oXbpBrowse:lastPosBlock := {| | ::lastRec() }
oXbpBrowse:posBlock := {| | ::recNo() }
oXbpBrowse:goPosBlock := {|n| ::goto( n ) }
oXbpBrowse:phyPosBlock := {| | ::recNo() }
::qLayout := qLayout
::oWnd := oWnd
::oBrw := oXbpBrowse
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeBrowse:dataLink( nField )
LOCAL bBlock
IF ::nType == BRW_TYPE_DBF
bBlock := {|| (::cAlias)->( fieldget( nField ) ) }
ELSE
bBlock := {|| ::aData[ ::nIndex, nField ] }
ENDIF
RETURN bBlock
/*----------------------------------------------------------------------*/
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: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:destroy()
IF !empty( ::oWnd )
::oWnd:destroy()
ENDIF
RETURN Self
/*----------------------------------------------------------------------*/
METHOD IdeBrowse:skipBlock( nHowMany )
LOCAL nRecs, nCurPos
LOCAL nSkipped := 0
IF ::nType == BRW_TYPE_DBF
IF nHowMany == 0
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:goTop()
IF ::nType == BRW_TYPE_DBF
DbGotop()
ELSE
::nIndex := 1
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD IdeBrowse:goBottom()
IF ::nType == BRW_TYPE_DBF
DbGoBottom()
ELSE
::nIndex := len( ::aData )
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD IdeBrowse:recNo()
IF ::nType == BRW_TYPE_DBF
RETURN RecNo()
ELSE
RETURN ::nIndex
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD IdeBrowse:lastRec()
IF ::nType == BRW_TYPE_DBF
RETURN LastRec()
ELSE
RETURN len( ::aData )
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD IdeBrowse:goTo( nRec )
IF ::nType == BRW_TYPE_DBF
DbGoto( nRec )
ELSE
::nIndex := nRec
ENDIF
RETURN NIL
/*----------------------------------------------------------------------*/
METHOD IdeBrowse:next()
LOCAL nSaveRecNum := recno()
LOCAL lMoved := .T.
IF Eof()
lMoved := .F.
ELSE
DBSkip( 1 )
IF Eof()
lMoved := .F.
DBGoTo( nSaveRecNum )
ENDIF
ENDIF
RETURN lMoved
/*----------------------------------------------------------------------*/
METHOD IdeBrowse:previous()
LOCAL nSaveRecNum := Recno()
LOCAL lMoved := .T.
DBSkip( -1 )
IF Bof()
DBGoTo( nSaveRecNum )
lMoved := .F.
ENDIF
RETURN lMoved
/*----------------------------------------------------------------------*/

View File

@@ -326,7 +326,11 @@ METHOD IdeDocks:execEvent( nMode, p )
hbide_popupBrwContextMenu( ::qHelpBrw, p )
CASE nMode == dockQScintilla_visibilityChanged
IF p; ::oEM:qscintilla(); ENDIF
IF p
::oEM:qscintilla()
ELSE
::oBM:destroy()
ENDIF
CASE nMode == dockSourceThumbnail_visibilityChanged
IF p; ::oEM:showThumbnail(); ENDIF
@@ -1167,7 +1171,7 @@ METHOD IdeDocks:buildSourceThumbnail()
METHOD IdeDocks:buildQScintilla()
LOCAL nAreas := Qt_LeftDockWidgetArea + Qt_RightDockWidgetArea + Qt_TopDockWidgetArea + Qt_BottomDockWidgetArea
::oIde:oQScintillaDock := ::getADockWidget( nAreas, "dockQScintilla", "QScintilla Widget", QDockWidget_DockWidgetFloatable )
::oIde:oQScintillaDock := ::getADockWidget( nAreas, "dockQScintilla", "Browser Widget", QDockWidget_DockWidgetFloatable )
::oDlg:oWidget:addDockWidget_1( Qt_RightDockWidgetArea, ::oQScintillaDock:oWidget, Qt_Horizontal )
::connect( ::oQScintillaDock:oWidget, "visibilityChanged(bool)", {|p| ::execEvent( dockQScintilla_visibilityChanged, p ) } )

View File

@@ -1640,15 +1640,14 @@ METHOD IdeEditor:scrollThumbnail()
RETURN Self
/*----------------------------------------------------------------------*/
// QScintilla Test
// Generic Tests
/*----------------------------------------------------------------------*/
METHOD IdeEditor:qscintilla()
// hbide_browseSome( Self )
// hbide_qtDesigner()
hbide_browseSome( ::oIde )
// hbide_qtDesigner()
#ifdef HB_WITH_QSCINTILLA
#include "hbqscintilla.ch"

View File

@@ -84,6 +84,7 @@ CLASS IdeObject
DATA qContextMenu
ACCESS oFR INLINE ::oIde:oFR
ACCESS oBM INLINE ::oIde:oBM
ACCESS oEM INLINE ::oIde:oEM
ACCESS oPM INLINE ::oIde:oPM
ACCESS oDK INLINE ::oIde:oDK

View File

@@ -663,6 +663,8 @@ METHOD XbpBrowse:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
/* Viewport */
::oViewport:configure( ::oTableView:viewport() )
::oFooterView:hide()
RETURN Self
/*----------------------------------------------------------------------*/