* 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" // Defines used with the GetSystemMetrics()-API, see XbpGetSystemMetrics() #define SM_CXDLGFRAME 7 #define SM_CYDLGFRAME 8 #define SM_CYMENU 15 #define SM_CYCAPTION 4 ********************************** CLASS XbpMainDialog FROM XbpDialog ********************************** * Main Dialog EXPORTED: // Dialog components VAR oToolBar VAR oStatusBar VAR oInfoLine VAR oResizeIcon // Lifecyle METHOD Init, Create // layout Management METHOD Resize METHOD Cascade ENDCLASS ************************* METHOD XbpMainDialog:init(oParent, oOwner, aPos, aSize, aPP, lVisible) ************************* * Initialization of the dialog object ::XbpDialog:init(oParent, oOwner, aPos, aSize, aPP, lVisible) ::drawingArea:ClipChildren:=.T. ::drawingArea:ClipSiblings:=.T. ::ClipChildren:=.T. Return Self ************************** METHOD XbpMainDialog:Create(oParent, oOwner, aPos, aSize, aPP, lVisible) ************************** * Create the dialog object ::XbpDialog:Create(oParent, oOwner, aPos, aSize, aPP, .F., lVisible) ::drawingArea:SetColorBG(XBPSYSCLR_APPWORKSPACE) // Resize drawingArea (create space on top and bottom) aSize:=::drawingArea:CurrentSize() ::drawingArea:setSize({aSize[1],aSize[2]-59}) ::drawingArea:setPos({0,20}) // create toolbar ::oToolBar:=XbpStatic():new(Self,,{0,aSize[2]-39},{aSize[1],39}) ::oToolBar:type:=XBPSTATIC_TYPE_RECESSEDBOX ::oToolBar:create() // create status bar ::oStatusBar:=XbpStatic():new(Self,,{0,0},{aSize[1],20}) ::oStatusBar:type:=XBPSTATIC_TYPE_RECESSEDBOX ::oStatusBar:create() // add infoline to statusbar ::oInfoLine:=XbpStatic():new(::oStatusBar,,{5,2},{aSize[1]-16,16}, {{XBP_PP_FGCLR,GRA_CLR_DARKBLUE}}) ::oInfoLine:type:=XBPSTATIC_TYPE_TEXT ::oInfoLine:options:=XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT ::oInfoLine:create() // add resize icon to statusbar ::oResizeIcon:=XbpStatic():new(::oStatusBar,,{aSize[1]-16,2},{16,16}, {{XBP_PP_COMPOUNDNAME,"10.Marlett"}, {XBP_PP_FGCLR,XBPSYSCLR_SHADOW}}) ::oResizeIcon:type:=XBPSTATIC_TYPE_TEXT ::oResizeIcon:options:=XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT ::oResizeIcon:create() ::oResizeIcon:setCaption(Chr(112)) Return Self *************************** METHOD XbpMainDialog:Resize(aSizeOld, aSizeNew) *************************** * Resize the dialog object; this also adjusts the size of the embedded * components Local aSize :=::CurrentSize() Local aSizeDA :=::drawingArea:CurrentSize() Local nHeightTitlebar:=xbpGetSystemMetrics(SM_CYCAPTION) Local nHeightMenubar:=xbpGetSystemMetrics(SM_CYMENU) Local nWidthBorder :=xbpGetSystemMetrics(SM_CXDLGFRAME) Local nHeightBorder :=xbpGetSystemMetrics(SM_CYDLGFRAME) // resize dialog ::XbpDialog:Resize(aSizeOld, aSizeNew) // Compute space occupied by dialog's titlebar, border and menubar aSizeDA[1]:=aSize[1]-(nWidthBorder*2) aSizeDA[2]:=aSize[2]-(nHeightTitlebar+nHeightMenubar+nHeightBorder*2) ::drawingArea:setSize({aSizeDA[1],aSizeDA[2]-59}) ::drawingArea:setPos({0,20}) ::drawingArea:resize:={ |mp1,mp2,obj| ReposChildList(mp1,mp2,obj:ChildList() ) } // resize toolbar ::oToolBar:setSize({aSizeDA[1],39}) ::oToolBar:setPos({0,aSizeDA[2]-41}) // resize status bar ::oStatusBar:setSize({aSizeDA[1],20}) ::oStatusBar:setPos({0,0}) // resize infoline ::oInfoLine:setSize({aSizeDA[1]-16,16}) ::oInfoLine:setPos({5,2}) // resize icon ::oResizeIcon:setSize({16,16}) ::oResizeIcon:setPos({aSizeDA[1]-16,2}) ::oResizeIcon:setCaption(Chr(112)) /* resize browse windows * * not working as supposed to do, title bars of child windows where * positioned outside of the drawingarea, now handled in resize slot of window * * ::cascade() * */ Return Self /* * Cascade child windows in parent */ METHOD XbpMainDialog:cascade Local i, aPos, aSize, oMenu:=WinMenu() If !oFocusBrowse==Nil aSize :=::drawingArea:currentSize() aSize[1]*=0.90 aSize[2]*=0.90 oMenu:windowStack[1]:setSize(aSize) oMenu:windowStack[1]:setFrameState(XBPDLG_FRAMESTAT_NORMALIZED) oMenu:windowStack[1]:toFront() oMenu:setChildWin(1) For i:=1 To oMenu:winCount oMenu:windowStack[i]:setFrameState(XBPDLG_FRAMESTAT_NORMALIZED) If i==1 aPos:={0,::drawingArea:currentSize()[2]-oMenu:currentWin:currentSize()[2]} Else aPos:=oMenu:currentWin:currentPos() aPos:={aPos[1]+24, aPos[2]-24} EndIf oMenu:windowStack[i]:setSize(aSize) oMenu:windowStack[i]:setPos(aPos) oMenu:windowStack[i]:toFront() oMenu:setChildWin(i) Next EndIf Return self FUNCTION ReposChildList(aOldSize,aNewSize,aChildList) LOCAL nI, nYDiff, aPos IF LEN(aChildList) > 0 nYDiff := aNewSize[2] - aOldSize[2] FOR nI := 1 TO LEN(aChildList) IF aChildList[nI]:GetFrameState() != XBPDLG_FRAMESTAT_NORMALIZED LOOP ENDIF aPos := aChildList[nI]:CurrentPos() aPos[2] := aPos[2] + nYDiff aChildList[nI]:SetPos(aPos) NEXT ENDIF RETURN NIL ************************************ CLASS XbpBrowseDialog FROM XbpDialog ************************************ * Browse Dialog EXPORTED: // Dialog components VAR oStatusBar VAR oInfoLine VAR oResizeIcon VAR area READONLY // 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 METHOD Init METHOD Create METHOD Notify METHOD SetDisplayFocus // layout Management METHOD Resize ENDCLASS *************************** METHOD XbpBrowseDialog:init(oParent, oOwner, aPos, aSize, aPP, lVisible) *************************** * Initialization of the dialog object ::XbpDialog:init(oParent, oOwner, aPos, aSize, aPP, lVisible) ::drawingArea:ClipChildren:=.T. ::drawingArea:ClipSiblings:=.T. ::ClipChildren:=.T. ::area:=0 Return Self ***************************** METHOD XbpBrowseDialog:Create(oParent, oOwner, aPos, aSize, aPP, lVisible) ***************************** * Create the dialog object ::XbpDialog:Create(oParent, oOwner, aPos, aSize, aPP, .F., lVisible) ::drawingArea:SetColorBG(XBPSYSCLR_APPWORKSPACE) ::area:=Select() ::read_only:=.F. DbRegisterClient(self) // Resize drawingArea (create space on top and bottom) aSize:=::drawingArea:CurrentSize() ::drawingArea:setPos({0,20}) // create status bar ::oStatusBar:=XbpStatic():new(Self,,{0,0},{aSize[1],20}) ::oStatusBar:type:=XBPSTATIC_TYPE_RECESSEDBOX ::oStatusBar:create() // add infoline to toolbar ::oInfoLine:=XbpStatic():new(::oStatusBar,,{5,2},{aSize[1]-16,16}, {{ XBP_PP_BGCLR, XBPSYSCLR_DIALOGBACKGROUND }, {XBP_PP_FGCLR,GRA_CLR_DARKBLUE}}) ::oInfoLine:type:=XBPSTATIC_TYPE_TEXT ::oInfoLine:options:=XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_LEFT ::oInfoLine:create() ::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())) // add resize icon info to toolbar ::oResizeIcon:=XbpStatic():new(::oStatusBar,,{aSize[1]-16,2},{16,16}, {{XBP_PP_COMPOUNDNAME,"10.Marlett"}, {XBP_PP_FGCLR,XBPSYSCLR_SHADOW}, {XBP_PP_BGCLR,XBPSYSCLR_DIALOGBACKGROUND}}) ::oResizeIcon:type:=XBPSTATIC_TYPE_TEXT ::oResizeIcon:options:=XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT ::oResizeIcon:create() ::oResizeIcon:setCaption(Chr(112)) Return Self ***************************** METHOD XbpBrowseDialog:Resize(aSizeOld, aSizeNew) ***************************** * Resize the dialog object; this also adjusts the size of the embedded * components Local aSize :=::CurrentSize() Local aSizeDA :=::drawingArea:CurrentSize() Local nHeightTitlebar:=xbpGetSystemMetrics(SM_CYCAPTION) Local nHeightMenubar :=xbpGetSystemMetrics(SM_CYMENU) Local nWidthBorder :=xbpGetSystemMetrics(SM_CXDLGFRAME) Local nHeightBorder :=xbpGetSystemMetrics(SM_CYDLGFRAME) // resize dialog ::XbpDialog:Resize(aSizeOld, aSizeNew) // Compute space occupied by dialog's titlebar, border and menubar aSizeDA[1]:=aSize[1]-(nWidthBorder*2)-1 aSizeDA[2]:=aSize[2]-(nHeightTitlebar+nHeightMenubar+nHeightBorder*2) ::drawingArea:setSize({aSizeDA[1],aSizeDA[2]}) ::drawingArea:setPos({0,20}) ::drawingArea:resize:={ |mp1,mp2,obj| IIf(Len(obj:childList())>0,obj:childList()[1]:setSize(mp2),Nil) } // resize status bar ::oStatusBar:setSize({aSizeDA[1],20}) ::oStatusBar:setPos({0,0}) // resize infoline ::oInfoLine:setSize({aSizeDA[1]-16,16}) ::oInfoLine:setPos({5,2}) // resize resize icon ::oResizeIcon:setSize({16,16}) ::oResizeIcon:setPos({aSizeDA[1]-16,2}) ::oResizeIcon:setCaption(Chr(112)) Return Self ***************************** METHOD XbpBrowseDialog:notify(nEvent, mp1, mp2) ***************************** mp2:=Nil; mp1:=Nil // stops compile warning Begin Sequence If nEvent<>xbeDBO_Notify Break EndIf ::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())) End Return Self ************************************** METHOD XbpBrowseDialog:setDisplayFocus() ************************************** Local x, aChilds:=::drawingArea:childList() For x:=1 To Len(aChilds) If aChilds[x]:isDerivedFrom("XbpBrowse") oFocusBrowse:=aChilds[x] Exit EndIf Next cPath:=::path cFile:=::file aRelations:=::relations Select(::area) Return Self ************************ Func XbpGetSystemMetrics(nValue) ************************ Return DllCall("USER32.DLL", DLL_STDCALL, "GetSystemMetrics", nValue) *********************** Func CreateBrowseWindow(oDlg, lNoShow) *********************** * Owned windows have the same parent as the owner window Local oWin, oWinMenu, oParent, oOwner, aPos[2], aSize Default(@lNoShow,.F.) oParent :=; oOwner :=oDlg:drawingArea /* * Get the WindowMenu object */ oWinMenu :=oDlg:childFromName(WindowMenu():ID) aSize :=oDlg:drawingArea:currentSize() aSize[1]*=0.90 aSize[2]*=0.90 /* * Let WindowMenu calculate the initial position for the child window */ aPos:=oWinMenu:nextWinPos(aSize) /* * Create the child window and tell it how to close itself */ oWin :=DialogWindow(oParent, oOwner, aPos, aSize, DbInfo(DBO_FILENAME)) oWin:close:={|mp1,mp2,obj| CloseBrowseWindow(obj) } oWin:DrawingArea:SetColorBG(XBPSYSCLR_APPWORKSPACE) oWin:resize() If !lNoShow oWin:show() SetAppFocus(oWin) EndIf Return oWin ********************** Proc CloseBrowseWindow(oDlg) ********************** * Close an owned window oFocusBrowse:=Nil WinMenuDel(oDlg) CloseWindow(oDlg) Return ***************** Func DialogWindow(oParent, oOwner, aPos, aSize, cTitle, lModal) ***************** * The function creates all kinds of dialog windows used in this program Local oDlg Default(@oOwner,oParent) Default(@lModal,.F.) oDlg :=XbpBrowseDialog():new(oParent, oOwner, aPos, aSize,, .F.) oDlg:icon:=ICON_MAIN oDlg:title :=cTitle oDlg:taskList :=.F. oDlg:clipSiblings:=.T. oDlg:cargo :={} oDlg:create() oDlg:drawingArea:setFontCompoundName("8.Helv") If !oParent==AppDesktop() WinMenuAdd(oDlg) EndIf If Valtype(oOwner:cargo)=="A" AAdd(oOwner:cargo, oDlg) EndIf Return oDlg **************** Proc CloseWindow(oDlg) **************** * Close a window Local oOwner:=oDlg:setOwner() Local i If !oDlg:area=Nil (oDlg:Area)->(DbCloseArea()) EndIf /* * :cargo is used in this program to manage a list of owned windows */ If Valtype(oOwner:cargo)=="A" .And. (i:=AScan(oOwner:cargo, oDlg)) > 0 ADel (oOwner:cargo, i) ASize(oOwner:cargo, Len(oOwner:cargo) - 1) EndIf oDlg:hide() oDlg:destroy() If Valtype(oDlg:cargo)=="A" AEval(oDlg:cargo, {|oSlave| IIf(oSlave:moveWithOwner, WinMenuDel(oSlave), NIL) }) EndIf Return