// Dialogs designer
#include "FiveWin.ch"
static oDlg, lDesign := .T.
//----------------------------------------------------------------//
function Main()
DEFINE DIALOG oDlg TITLE "Dialog designer" SIZE 500, 300 ;
STYLE nOr( WS_THICKFRAME, WS_SYSMENU )
oDlg:cVarName = "oDlg"
ACTIVATE DIALOG oDlg CENTERED ;
ON INIT PlaceControl( oDlg ) ;
ON PAINT If( lDesign, DrawGrid( oDlg:hWnd, hDC, cPS, 8, 8 ),) ;
ON RIGHT CLICK EditDialog( nRow, nCol, oDlg )
return nil
//----------------------------------------------------------------//
function PlaceControl( oDlg )
local oBtn1, oBtn2
@ 232, 144 BUTTON oBtn1 PROMPT "&Ok" SIZE 80, 25 DESIGN OF oDlg PIXEL
oBtn1:bRClicked = { | nRow, nCol | EditControl( nRow, nCol, oBtn1 ) }
@ 232, 264 BUTTON oBtn2 PROMPT "&Cancel" SIZE 80, 25 DESIGN OF oDlg PIXEL
oBtn2:bRClicked = { | nRow, nCol | EditControl( nRow, nCol, oBtn2 ) }
return nil
//----------------------------------------------------------------//
function CreateSay( oDlg )
local oSay
@ 1, 2 SAY oSay PROMPT "Label:" OF oDlg SIZE 70, 20 DESIGN
oSay:bGet = nil
oSay:lWantClick = .T.
BringWindowToTop( oSay:hWnd )
oSay:SetFocus()
oSay:bRClicked = { | nRow, nCol | EditControl( nRow, nCol, oSay ) }
return nil
//----------------------------------------------------------------//
function EditControl( nRow, nCol, oControl )
local oMenu
MENU oMenu POPUP
MENUITEM "Bring to front" ACTION BringWindowToTop( oControl:hWnd )
SEPARATOR
MENUITEM "Text" ACTION EditTitle( oControl )
SEPARATOR
MENUITEM "Position"
MENU
MENUITEM "nTop" + Chr( 9 ) + LTrim( Str( oControl:nTop ) )
MENUITEM "nLeft" + Chr( 9 ) + LTrim( Str( oControl:nLeft ) )
MENUITEM "Move up" ACTION ( oControl:HideDots(), oControl:nTop--, oControl:ShowDots() )
MENUITEM "Move down" ACTION ( oControl:HideDots(), oControl:nTop++, oControl:ShowDots() )
ENDMENU
MENUITEM "Size"
MENU
MENUITEM "nWidth" + Chr( 9 ) + LTrim( Str( oControl:nWidth ) )
MENUITEM "nHeight" + Chr( 9 ) + LTrim( Str( oControl:nHeight ) )
ENDMENU
ENDMENU
ACTIVATE POPUP oMenu WINDOW oControl AT nRow, nCol
return nil
//----------------------------------------------------------------//
function CreateGet( oDlg )
local oGet, cVar := Space( 20 )
@ 1, 2 GET oGet VAR cVar OF oDlg SIZE 136, 24 DESIGN
BringWindowToTop( oGet:hWnd )
oGet:bRClicked = { | nRow, nCol | EditControl( nRow, nCol, oGet ) }
oGet:SetFocus()
return nil
//----------------------------------------------------------------//
function CreateButton( oDlg )
local oBtn
@ 1, 2 BUTTON oBtn PROMPT "Button" OF oDlg SIZE 80, 25 DESIGN
BringWindowToTop( oBtn:hWnd )
oBtn:bRClicked = { | nRow, nCol | EditControl( nRow, nCol, oBtn ) }
oBtn:SetFocus()
return nil
//----------------------------------------------------------------//
function CreateCheckBox( oDlg )
local oChk, lValue := .F.
@ 1, 2 CHECKBOX oChk VAR lValue PROMPT "&Checkbox" OF oDlg ;
SIZE 100, 15 DESIGN
BringWindowToTop( oChk:hWnd )
oChk:bRClicked = { | nRow, nCol | EditControl( nRow, nCol, oChk ) }
oChk:SetFocus()
return nil
//----------------------------------------------------------------//
function CreateListBox( oDlg )
local oLbx, cItem
@ 1, 2 LISTBOX oLbx VAR cItem ITEMS { "One", "Two", "three" } OF oDlg SIZE 120, 120 DESIGN
BringWindowToTop( oLbx:hWnd )
oLbx:bRClicked = { | nRow, nCol | EditControl( nRow, nCol, oLbx ) }
oLbx:SetFocus()
return nil
//----------------------------------------------------------------//
function CreateComboBox( oDlg )
local oCbx, cItem
@ 1, 2 COMBOBOX oCbx VAR cItem ITEMS { "One", "Two", "three" } OF oDlg SIZE 120, 120 DESIGN
BringWindowToTop( oCbx:hWnd )
oCbx:bRClicked = { | nRow, nCol | EditControl( nRow, nCol, oCbx ) }
oCbx:SetFocus()
return nil
//----------------------------------------------------------------//
function CreateGroup( oDlg )
local oGrp
@ 1, 2 GROUP oGrp PROMPT "Group" OF oDlg SIZE 120, 120 DESIGN
oGrp:bRClicked = { | nRow, nCol | EditControl( nRow, nCol, oGrp ) }
oGrp:SetFocus()
return nil
//----------------------------------------------------------------//
function CreateRadio( oDlg )
local oRad, oRadMenu := TRadMenu():New()
@ 1, 2 RADIOITEM oRad PROMPT "&Radio1" OF oDlg ;
SIZE 60, 15 DESIGN RADIOMENU oRadMenu
BringWindowToTop( oRad:hWnd )
oRad:bRClicked = { | nRow, nCol | EditControl( nRow, nCol, oRad ) }
oRad:SetFocus()
return nil
//----------------------------------------------------------------//
static function EditDialog( nRow, nCol, oDlg )
local oMenu
MENU oMenu POPUP
MENUITEM "Title..." ACTION EditTitle( oDlg )
SEPARATOR
MENUITEM "Add control"
MENU
MENUITEM "Say" ACTION CreateSay( oDlg )
MENUITEM "Get" ACTION CreateGet( oDlg )
MENUITEM "Button" ACTION CreateButton( oDlg )
MENUITEM "CheckBox" ACTION CreateCheckBox( oDlg )
MENUITEM "Radio" ACTION CreateRadio( oDlg )
MENUITEM "ListBox" ACTION CreateListBox( oDlg )
MENUITEM "ComboBox" ACTION CreateComboBox( oDlg )
MENUITEM "GroupBox" ACTION CreateGroup( oDlg )
ENDMENU
SEPARATOR
MENUITEM "PRG code..." ACTION MemoEdit( oDlg:cGenPrg(), "PRG code" )
MENUITEM "RC code..." ACTION MemoEdit( oDlg:SaveToRC(), "RC code" )
SEPARATOR
MENUITEM "Position"
MENU
MENUITEM "nTop" + Chr( 9 ) + LTrim( Str( WndTop( oDlg:hWnd ) ) )
MENUITEM "nLeft" + Chr( 9 ) + LTrim( Str( WndLeft( oDlg:hWnd ) ) )
ENDMENU
MENUITEM "Size"
MENU
MENUITEM "nWidth" + Chr( 9 ) + LTrim( Str( oDlg:nWidth ) )
MENUITEM "nHeight" + Chr( 9 ) + LTrim( Str( oDlg:nHeight ) )
ENDMENU
SEPARATOR
if oDlg:aControls[ 1 ]:lDrag
MENUITEM "&Test mode" ;
ACTION ( AEval( oDlg:aControls, { | o | o:lDrag := .F. } ),;
If( Len( oDlg:aControls ) > 0, oDlg:aControls[ 1 ]:HideDots(),),;
lDesign := .F., oDlg:Refresh() )
else
MENUITEM "&Design mode" ;
ACTION ( AEval( oDlg:aControls, { | o | o:lDrag := .T. } ),;
If( Len( oDlg:aControls ) > 0, oDlg:aControls[ 1 ]:ShowDots(),),;
lDesign := .T., oDlg:Refresh() )
endif
ENDMENU
ACTIVATE POPUP oMenu WINDOW oDlg AT nRow, nCol // SAVE
return nil
//----------------------------------------------------------------//
static function EditTitle( oWnd )
local oDlg, oGet, cOldTitle := PadR( oWnd:cCaption, 100 )
DEFINE DIALOG oDlg TITLE "Dialog title" SIZE 600, 110
oWnd:cCaption = PadR( oWnd:cCaption, 100 )
@ 1, 1 GET oGet VAR oWnd:cCaption OF oDlg SIZE 285, 12 ;
ON CHANGE oWnd:SetText( AllTrim( oGet:GetText() ) )
@ 2, 18 BUTTON "&Ok" OF oDlg ACTION oDlg:End()
@ 2, 25 BUTTON "&Cancel" OF oDlg ACTION ( oWnd:SetText( cOldTitle ), oDlg:End() )
ACTIVATE DIALOG oDlg CENTERED
return nil
//----------------------------------------------------------------//