* Program..: Dialog.prg * Author...: Jeremy Suiter * Date.....: 07/04/2003 * * Notice...: Copyright (c) 2003, Jeremy Suiter, All Rights Reserved * Notes....: Visual DbEditor dialog functions #Include "Gra.ch" #Include "Xbp.ch" #Include "Appevent.ch" #Include "DbEditor.ch" #Include "Resources.ch" #Include "Dll.ch" #Include "Font.ch" #Include "FoxDbe.ch" #Include "CdxDbe.ch" #Include "Dmlb.ch" ********************************** CLASS XbpMainDialog FROM XbpDialog ********************************** * Main Dialog EXPORTED: CLASS VAR nHeightTitleBar CLASS VAR nDoubleWidthYBorder CLASS VAR nToolBarPosY // Dialog components VAR oToolBar VAR oShowTip VAR oStatusBar VAR oInfoLine VAR oResizeIcon // Lifecyle CLASS METHOD InitClass METHOD init METHOD create METHOD destroy // layout Management METHOD resize METHOD cascade METHOD closeBrowse METHOD enableUtils METHOD disableUtils METHOD rePosChildList ENDCLASS ************************* CLASS METHOD XbpMainDialog:initClass() ************************* ::nHeightTitlebar := (XbpGetSystemMetrics(SM_CYSIZE) +; XbpGetSystemMetrics(SM_CXSIZEFRAME)) ::nDoubleWidthYBorder := (XbpGetSystemMetrics(SM_CYSIZEFRAME) * 2) ::nToolBarPosY := (::nHeightTitleBar +; XbpGetSystemMetrics(SM_CYSIZEFRAME) +; XbpGetSystemMetrics(SM_CYMENU) +; 4 +; 39) RETURN Self ************************* METHOD XbpMainDialog:init(oParent, oOwner, aPos, aSize, aPP, lVisible) ************************* * Initialization of the dialog object ::XbpDialog:init(oParent, oOwner, aPos, aSize, aPP, lVisible) ::XbpDialog:border := XBPDLG_RAISEDBORDERTHIN ::XbpDialog:icon := ICON_MAIN ::XbpDialog:title := TITLE ::XbpDialog:maxButton := .T. ::XbpDialog:minButton := .T. ::XbpDialog:taskList := .T. ::XbpDialog:ClipChildren := .t. ::XbpDialog:drawingArea:ClipChildren := .T. ::XbpDialog:drawingArea:ClipSiblings := .T. ::XbpDialog:close := {|mp1,mp2,obj| AppQuit() } Return Self ************************** METHOD XbpMainDialog:create() ************************** * Create the dialog object * LOCAL oHelp, aSize, aDrawSize aSize := AppDesktop():currentSize() aSize[1] := aSize[1]*0.80 aSize[2] := aSize[2]*0.80 ::XbpDialog:Create(NIL, NIL, NIL, aSize) ::XbpDialog:drawingArea:setColorBG(::XbpDialog:setColorBG()) ::XbpDialog:drawingArea:SetFont(::XbpDialog:setFont()) // disponibilize Self for further usage MainWindow(Self) // Create menu system MenuCreate(::XbpDialog, ::XbpDialog:menuBar()) oHelp := XbpHelpLabel():new():create() oHelp:helpObject := HelpObject("Visual DbEditor.hlp", "Help For Visual DbEditor") ::XbpDialog:helpLink := oHelp // create object for showing "tips" // it will to be started in ::oShowTip:showTip() ::oShowTip := MagicHelp():new() aDrawSize := ::XbpDialog:drawingArea:currentSize() // create toolbar. ::oToolBar := XbpStatic():new(::XbpDialog, , {0, (aSize[02] - ::nToolBarPosY)},; {aSize[1], 39},; {{XBP_PP_BGCLR, GraMakeRGBColor({153, 255, 255})}}, .t.) ::oToolBar:type := XBPSTATIC_TYPE_RAISEDBOX ::oToolBar:create() // Add toolbar AddToolBar(::XbpDialog, ::oToolBar) // create status bar/ // Its parent is Self for it does not to be cvered by XbpBrowseDialog() when minimized ::oStatusBar := XbpStatic():new(::XbpDialog,,{0,0},{aDrawSize[01],20}, NIL, .t.) ::oStatusBar:type := XBPSTATIC_TYPE_RAISEDBOX ::oStatusBar:create() // add infoline to statusbar ::oInfoLine := XbpStatic():new(::oStatusBar,,{2,2},{(aDrawSize[01] - 18),16}, {{XBP_PP_FGCLR,GRA_CLR_DARKBLUE}}, .t.) ::oInfoLine:type := XBPSTATIC_TYPE_TEXT ::oInfoLine:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT ::oInfoLine:create() // add resize icon to statusbar ::oResizeIcon :=XbpStatic():new(::oStatusBar,,{(aDrawSize[01] - 18),3},{16,15},; {{XBP_PP_COMPOUNDNAME,"11.Marlett"},; {XBP_PP_FGCLR,XBPSYSCLR_SHADOW}}, .t.) ::oResizeIcon:type :=XBPSTATIC_TYPE_TEXT ::oResizeIcon:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT ::oResizeIcon:create() ::oResizeIcon:setCaption(Chr(112)) // Resize ::drawingArea aDrawSize[02] -= (39 +; // ::oToolBar:currentSize()[02] 4 +; // Lines 20) // ::oStatusBar:currentsize()[02] ::XbpDialog:drawingArea:setPosAndSize({0, 20}, aDrawSize) ::disableUtils() CenterControl(Self) Return Self *************************** METHOD XbpMainDialog:destroy() *************************** ::oToolBar:destroy() ::oStatusBar:destroy() ::oShowTip:hideTip() ::oShowTip:setInterval(NIL) ::oShowTip:synchronize(0) aEval(::XbpDialog:drawingarea:childlist(), {|x| x:destroy()}) RETURN ::XbpDialog:destroy() *************************** METHOD XbpMainDialog:enableUtils() *************************** LOCAL oTip, oChild ::XbpDialog:childFromName(ID_UTILS_OPTIONS):enable() oTip := MainWindow():oShowTip oChild := ::XbpDialog:childFromName(ID_DELETE_BTN) oChild:activate := {|| DelRecord() } oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp,TT_DELETE)} oChild:setPointer(,POINTER_HAND) oChild := ::XbpDialog:childFromName(ID_UNDELETE_BTN) oChild:activate := {|| RestRecord() } oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp,TT_RECALL)} oChild:setPointer(,POINTER_HAND) oChild := ::XbpDialog:childFromName(ID_INDEX_BTN) oChild:activate := {|| SetIndex() } oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp,TT_INDEXOPT)} oChild:setPointer(,POINTER_HAND) oChild := ::XbpDialog:childFromName(ID_SCOPE_BTN) oChild:activate := {|| SetScope() } oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp,TT_SCOPE)} oChild:setPointer(,POINTER_HAND) oChild := ::XbpDialog:childFromName(ID_STRUCTURE_BTN) oChild:activate := {|| Structure(.F.) } oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp,TT_STRUCT)} oChild:setPointer(,POINTER_HAND) oChild := ::XbpDialog:childFromName(ID_REPORTS_BTN) oChild:activate := {|| PreviewTable() } oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp,TT_REPORTS)} oChild:setPointer(,POINTER_HAND) oChild := ::XbpDialog:childFromName(ID_CASCADE_BTN) oChild:activate := {|| MainWindow():cascade() } oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp,TT_CASCADE)} oChild:setPointer(,POINTER_HAND) RETURN Self *************************** METHOD XbpMainDialog:disableUtils() *************************** LOCAL oTip, oChild ::XbpDialog:childFromName(ID_UTILS_OPTIONS):disable() oTip := MainWindow():oShowTip oChild := ::XbpDialog:childFromName(ID_DELETE_BTN) oChild:activate := {|| Tone(1000, 15)} oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp, 'Unavailable')} oChild:setPointer(,POINTER_UNAVAIL) oChild := ::XbpDialog:childFromName(ID_UNDELETE_BTN) oChild:activate := {|| Tone(1000, 15)} oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp, 'Unavailable')} oChild:setPointer(,POINTER_UNAVAIL) oChild := ::XbpDialog:childFromName(ID_INDEX_BTN) oChild:activate := {|| Tone(1000, 15)} oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp, 'Unavailable')} oChild:setPointer(,POINTER_UNAVAIL) oChild := ::XbpDialog:childFromName(ID_SCOPE_BTN) oChild:activate := {|| Tone(1000, 15)} oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp, 'Unavailable')} oChild:setPointer(,POINTER_UNAVAIL) oChild := ::XbpDialog:childFromName(ID_STRUCTURE_BTN) oChild:activate := {|| Tone(1000, 15)} oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp, 'Unavailable')} oChild:setPointer(,POINTER_UNAVAIL) oChild := ::XbpDialog:childFromName(ID_REPORTS_BTN) oChild:activate := {|| Tone(1000, 15)} oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp, 'Unavailable')} oChild:setPointer(,POINTER_UNAVAIL) oChild := ::XbpDialog:childFromName(ID_CASCADE_BTN) oChild:activate := {|| Tone(1000, 15)} oChild:motion := {|aPos, uNil, oXbp| oTip:showTip(aPos, oXbp, 'Unavailable')} oChild:setPointer(,POINTER_UNAVAIL) RETURN Self *************************** METHOD XbpMainDialog:reSize(aSizeOld, aSizeNew) *************************** * Resize the dialog object; this also adjusts the size of the embedded * components LOCAL nToolBarPos, aDrawSize[02] ::XbpDialog:reSize(aSizeOld, aSizeNew) nToolBarPos := (aSizeNew[02] - ::nToolBarPosY) aDrawSize[01] := (aSizeNew[01] - ::nDoubleWidthYBorder) aDrawSize[02] := (nToolBarPos -; 2 -; 20) // ::oStatusBar:height ::XbpDialog:drawingArea:setPosAndSize({0, 20}, aDrawSize) // The call back slot is not in the :init() method because :childList() is dynamic ::XbpDialog:drawingArea:reSize:={ |mp1,mp2,obj| ::rePosChildList(mp1,mp2,obj:childList() ) } ::oToolBar:setPosAndSize({0, nToolBarPos}, {aDrawSize[01], 39}) ::oStatusBar:setPosAndSize({0, 0},{aDrawSize[01],20}) aDrawSize[01] -= 18 ::oInfoLine:setPosAndSize({2, 2}, {aDrawSize[01],16}) ::oResizeIcon:setPos({aDrawSize[1], 3}) Return Self *************************** METHOD XbpMainDialog:cascade() *************************** * Arranje XbpBrowseDialog windows in "cascade" LOCAL aPos := {0, 0},; aChild, nDrawHeight, nInd, nLen, oXbp, nLast aChild := ::XbpDialog:drawingArea:childList() // Parent of the xbpBrowseDialog windows nLast := NIL nLen := Len(aChild) for nInd := 1 to nLen oXbp := aChild[nInd] if oXbp:isDerivedFrom('XbpBrowseDialog') if nLast == NIL ::XbpDialog:lockUpdate(.t.) nDrawHeight := ::XbpDialog:drawingArea:currentSize()[02] endif nLast := nInd aPos[02] := (nDrawHeight - oXbp:currentSize()[02]) oXbp:setFrameState(XBPDLG_FRAMESTAT_NORMALIZED) oXbp:setPos(aPos) aPos[01] += ::nDoubleWidthYBorder nDrawHeight -= ::nHeightTitleBar endif next if nLast == NIL oFocusBrowse := NIL else oXbp := aChild[nLast] //(ak) CenterControl(oxbp, ::XbpDialog:drawingArea) oXbp:oEditBrowse:show() oXbp:toFront() ::enableUtils() ::XbpDialog:lockUpdate(.f.) ::XbpDialog:invalidateRect() SetAppFocus(oXbp:oEditBrowse) endif RETURN Self *************************** METHOD XbpMainDialog:closeBrowse(oBrowse) *************************** * Delete XbpBrowseDialog window oBrowse:destroy() ::disableUtils() RETURN ::cascade() RETURN Self *************************** METHOD XbpMainDialog:rePosChildList(aOldSize, aNewSize, aChildList) *************************** LOCAL nLen, nInd, nYDif, oXbp, aPos nLen := Len(aChildList) if nLen > 0 nYDif := aNewSize[02] - aOldSize[02] for nInd := 1 to nLen oXbp := aChildList[nInd] if !IsMethod(oXbp, 'GetFrameState') .or.; oXbp:getFrameState() == XBPDLG_FRAMESTAT_NORMALIZED aPos := oXbp:currentPos() aPos[02] += nYDif oXbp:SetPos(aPos) endif next endif RETURN NIL ************************************ CLASS XbpBrowseDialog FROM XbpDialog ************************************ * Browse Dialog CLASS VAR nHeightTitleBar CLASS VAR nDoubleWidthYBorder EXPORTED: // Dialog components VAR oStatusBar VAR oInfoLine VAR oResizeIcon VAR oEditBrowse VAR area // current work area VAR file // current work area filename VAR path // current work area path VAR relations // current work area relations VAR read_only // current work area readonly // Lifecyle CLASS METHOD initClass METHOD init METHOD create METHOD destroy METHOD killDisplayFocus METHOD setDisplayFocus METHOD showInfo // layout Management METHOD Resize ENDCLASS *************************** CLASS METHOD XbpBrowseDialog:initClass() *************************** ::nHeightTitlebar := (XbpGetSystemMetrics(SM_CYSIZE) +; XbpGetSystemMetrics(SM_CXSIZEFRAME) +; 4) ::nDoubleWidthYBorder := (XbpGetSystemMetrics(SM_CYSIZEFRAME) * 2) RETURN Self *************************** METHOD XbpBrowseDialog:init(oParent, oOwner, aPos, aSize, aPP, lVisible) *************************** * Initialization of the dialog object ::XbpDialog:init(oParent, oOwner, aPos, aSize, aPP, lVisible) ::XbpDialog:icon := ICON_MAIN ::XbpDialog:tasklist := .f. ::XbpDialog:drawingArea:clipChildren := .t. ::XbpDialog:drawingArea:clipSiblings := .t. ::XbpDialog:close := {|mp1,mp2,obj| MainWindow():closeBrowse(obj)} ::oEditBrowse := NIL ::area := 0 Return Self ***************************** METHOD XbpBrowseDialog:create(oParent, oOwner, aPos, aSize, aPP, lVisible) ***************************** * Create the dialog object * LOCAL aDrawSize ::XbpDialog:Create(oParent, oOwner, aPos, aSize, aPP, lVisible) ::XbpDialog:drawingArea:setColorBG(::XbpDialog:setColorBG()) ::XbpDialog:drawingArea:SetFont(::XbpDialog:setFont()) aDrawSize := ::XbpDialog:drawingArea:currentSize() // create status bar ::oStatusBar := XbpStatic():new(::XbpDialog,,{0,0},{aDrawSize[01],20}, NIL, .t.) ::oStatusBar:type := XBPSTATIC_TYPE_RECESSEDBOX ::oStatusBar:create() // add infoline to statusbar ::oInfoLine := XbpStatic():new(::oStatusBar,,{2,2},{(aDrawSize[01] - 18),16}, {{XBP_PP_FGCLR,GRA_CLR_DARKBLUE}}, .t.) ::oInfoLine:type := XBPSTATIC_TYPE_TEXT ::oInfoLine:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT ::oInfoLine:create() // add resize icon to statusbar ::oResizeIcon :=XbpStatic():new(::oStatusBar,,{(aDrawSize[01] - 18),3},{16,15},; {{XBP_PP_COMPOUNDNAME,"11.Marlett"},; {XBP_PP_FGCLR,XBPSYSCLR_SHADOW}}, .t.) ::oResizeIcon:type :=XBPSTATIC_TYPE_TEXT ::oResizeIcon:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT ::oResizeIcon:create() ::oResizeIcon:setCaption(Chr(112)) // Resize ::drawingArea aDrawSize[02] -= 20 ::XbpDialog:drawingArea:setPosAndSize({0, 20}, aDrawSize) Return Self ***************************** METHOD XbpBrowseDialog:destroy() ***************************** if !Empty(::area) (::area)->(DbCloseArea()) endif RETURN ::XbpDialog:destroy() ***************************** METHOD XbpBrowseDialog:reSize(aSizeOld, aSizeNew) ***************************** * Resize the dialog object; this also adjusts the size of the embedded * components // resize dialog LOCAL aDrawSize[02] ::XbpDialog:reSize(aSizeOld, aSizeNew) aDrawSize[01] := (aSizeNew[01] - ::nDoubleWidthYBorder - 1) aDrawSize[02] := (aSizeNew[02] - ::nHeightTitlebar - 20) // ::oStatusBar:height ::XbpDialog:drawingArea:setPosAndSize({0, 20}, aDrawSize) if ::oEditBrowse <> NIL ::oEditBrowse:setPosAndSize({0, 0}, aDrawSize) endif ::oStatusBar:setPosAndSize({0, 0},{aDrawSize[01],20}) aDrawSize[01] -= 18 ::oInfoLine:setPosAndSize({2, 2}, {aDrawSize[01],16}) ::oResizeIcon:setPos({aDrawSize[1], 3}) Return Self ***************************** METHOD XbpBrowseDialog:showInfo() ***************************** ::oInfoLine:setCaption("TAG: " + IIf(Empty(OrdName()), "NONE", OrdName()) +; ", KEY: " + IIf(Empty(OrdKey()), "NONE", OrdKey()) + ", " +; IIf(::read_only,"READONLY",IIf(DbInfo(DBO_SHARED),"SHARED","EXCLUSIVE")) +; ", DBE: " + DbInfo(DBO_DBENAME) +; ", RECORDS: " + Ntrim(LastRec())) Return Self ************************************** METHOD XbpBrowseDialog:setDisplayFocus() ************************************** ::XbpDialog:setFrameState(XBPDLG_FRAMESTAT_NORMALIZED) ::XbpDialog:setDisplayFocus() oFocusBrowse := ::oEditBrowse cPath := ::path aRelations := ::relations Select(::area) MainWindow():enableUtils() ::showInfo() SetAppFocus(oFocusBrowse) Return Self ************************************** METHOD XbpBrowseDialog:killDisplayFocus() ************************************** MainWindow():disableUtils() RETURN ::XbpDialog:killDisplayFocus() ************************ FUNCTION MainWindow(oMain) ************************ STATIC oMainWindow if oMain <> NIL oMainWindow := oMain endif Return oMainWindow ************************ Func XbpGetSystemMetrics(nValue) ************************ Return DllCall("USER32.DLL", DLL_STDCALL, "GetSystemMetrics", nValue)