----------------- The first section is obsolete ----------------- [ Search for '----' for the live stuff at the bottom ] Some thoughts on coding up layout. * Resource compiler (rsc/source/*) + rscdep - dependencies ? + rscpp - pre-processor ? + rsc2 - real compile * Resource reader (tools/source/rc/resmgr) * Current design: + Hierarchical information + None in the resource file + None in the code + Window construction + can pass ResId for toplevel win, but doesn't have to [ only bother fixing up people using ResIds ]. + children instantiated, associated with Window parent (and a ResId). + Resource load (Window -> is a Resource) [ tools/inc/rc.h ] + Window::ImplInitRes( rResId ) + GetRes( rResId ) + Whole resource load process done via cursor state on GetResManager(); + ResManager has an Init/PopContext stack * Hacking + Hierarchical information + Add it to the resource format - tied to Window - do we currently have a list of children even ? [ or is it totally abstract e + Window creation + walk hierarchical information + build a set of layout / peers + associate these at Window::ImplLoadRes time + post-association / on Window show => doLayout first. * Demo + svtools/workben (svdem): hack here ... ? * Suggested Format: #define DLG_TEST 1001 #define BTN_OK 1002 #define BTN_CANCEL 1003 #define DLG_TEST_LAYOUT 1100 ModalDialog DLG_TEST { OutputSize = TRUE ; Moveable = TRUE ; Closeable = TRUE ; Sizeable = TRUE; LayoutId = DLG_TEST_LAYOUT; PushButton BTN_OK { Text = "OK"; }; PushButton BTN_CANCEL { Text = "Cancel"; }; Layout DLG_TEST_LAYOUT { Homogeneous = False; Layout { PeerId = BTN_OK; Expand = True; Fill = True; }; Layout { PeerId = BTN_CANCEL; Expand = False; Fill = False; }; }; }; * Glade2 XML format: True False 0 True False 6 True True E_nable sound server startup True GTK_RELIEF_NORMAL False False True 0 False False ... etc. * Resource compiler class hierarachy: # BiNode * NameNode o IdNode + RefNode # RscTop * RscArray o RscClassArray o RscLangArray * RscBaseCont o RscContWriteSrc + RscCont + RscContExtraData * RscClass o RscMgr o RscSysDepend + RscFirstSysDepend o RscTupel * RscClient * RscConst o RscEnum o RscFlag * RscIdRange * RscLongRange o RscLongEnumRange * RscRange o RscBool o RscBreakRange * RscString + RscInstNode o StringNode + RscDefine + despite all the .cxx, .hxx etc. stuff it seems to compile direct .src -> .rc with no intermediates. + Post parsing we call WriteRc on the nodes, + We can also call WriteSrc - presumably a legacy from the src -> representation / fiddle / -> src round-trip process. + RscCont is a generic container class. + code hidden in rsc/source/prj/gui.cxx flow: rscyacc.y: + everything built into a RscTypeCont *pTC. + all strings munged into HashString: pHS + pHS->Get( HASHID ) returns it to a string. RscTypeCont -> RscTypCont::Init - sets up parser. RscCompiler (pTypeCont)->Start. + CheckSyntax -> ParseOneFile -> parser -> yyparse -> DoClassHeader (rscyacc.cxx) -> GetElement (rsctop.cxx) + Problems + each RscClass has to define it's child properties => we have to define all possible child properties in advance for 'Widget') * VCL Issues + Flow: + Res -> Window -> [ constr. Layout tree ] + We need to associate instances of widgets later; + They do ImplInitRes - and we need to connect them and queue re-draws on the parent etc. + Have a hash of Layout <-> ResId mappings on Window ... + re-flow on re-size etc. 'queue_redraw' ? + Layout -> Widget [ via. Layout tree & peers, toplevel is always a peer ] + Window <-> Layout in all cases ? [ show / hide ? ] cache 'visible' state ? etc. have a Layout ptr. on each Window ... + Need a factory for Layouts ... + We only need to virtualize sizeAllocate on the Layouts, not the widgets - thank goodness. ** Decisions + Totally static layout manipulation - ie. no self-building - too complex anyway. ----------------- Above here is obsolete ----------------- [ This is the current notes: ] ** Form XML format: + from the basic editor: + code to read this & generate UIs is in: + DTD: xmlscript/dtd/dialog.dtd + xmlscript/source/xmldlg_imexp/imp_share.hxx, line 674 + xmlscript/source/misc/unoservices.cxx xmlscript/source/xmlflat_imexp/xmlbas_import.cxx (?) "com.sun.star.comp.xmlscript.XMLBasicImporter" + the dialog piece seems separate ? "importDialogModel" ... + cf. the interesting test code ... + cd xmlscript/test dmake ../unxlngi6.pro/bin/imexp /opt/OOInstall ./test.xml + generates & renders a dialog ... + This code has ~all we need to get a simple impl. + compatibility wrappers [!] // first create model: Reference< container::XNameContainer > xModel( xContext->getServiceManager()->createInstanceWithContext( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialogModel" ) ), xContext ), UNO_QUERY ); // NB. xmldlg_addfunc.cxx not xmldlg_import.cxx [!?] ;-) ::xmlscript::importDialogModel( ::xmlscript::createInputStream( bytes ), xModel, xContext ); // second create view of model: Reference< awt::XControl > xDlg( xMSF->createInstance( OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialog" ) ) ), UNO_QUERY ); xDlg->setModel( Reference< awt::XControlModel >::query( xModel ) ); // third - associate toolkit / peer ... Reference< awt::XToolkit> xToolkit( xMSF->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.ExtToolkit" ) ) ), UNO_QUERY ); xDlg->createPeer( xToolkit, 0 ); // fourth - execute [ nasty ... ] Reference< awt::XDialog > xD( xDlg, UNO_QUERY ); xD->execute(); ** Basic dialog editor: + basctl/source/dlged/dlged.cxx + dialog editor (?) + basctl/source/basicide/basobj3.cxx + basctl/source/basicide/basides3.cxx + BasicIDEShell:CreateDlgWin ... ** AWT interfaces: + offapi/com/sun/star/awt/* - eg. XButton.idl + 'XLayoutConstrains.idl' [ published & mis-named ! ] + We can build 'Layout' into the AWT at the toolkit level + this should be fairly easy, and wouldn't touch VCL much. ** Toolkit (awt) implementation: + toolkit/source/awt/vclxwindows.cxx: + much of the implementation lurks in here ... + The size information is in 'vclxwindows.cxx' ... + toolkit/source/helper/unowrapper.cxx + factories / code to associate UNO peers with VCL windows + pWindow-> ** TODO: + the dialog editor needs containers + we need a hierarchy / tree view there ... + + The sizing logic is in + toolkit/source/awt/vclxtoolkit.cxx (ImplCreateWindow) + the sizing is done on creation [ hmm ... ] + 1st Axiom: + all layout is containment based: with special back-compat 'Fixed' case + perhaps this is: ** How my layout patch worked: + introduce a parallel 'Layout' hierarchy + ie. all windows continue to have flat children + we do the layout in parallel to that, by absolute positioning. + ie. store the UNO peers in a tree; + and simply ensure that the layout entries don't yield widgets. ** A plan: + a) add a few layout XML elements / attributes to a sample XML file. + b) port layout-vcl-layout.diff to use UNO controls + c) populate layout data from XML + d) render dialog. + e) add UI designer work ... --- + f) wrapper API to allow old code to work with new dialogs. + g) porting of lots of dialogs. ** xmlscript/ElementDescriptor - can cope to these. + xml_helper/xml_impctx.cxx - builds lists of m_elements etc. --- How hierarchies should work IMHO --- On-screen: +-------------------+ | Label: [Entry] | | - - - - - - - - - | | | [ Ok ]| +-------------------+ VCL Window hierarcy: Window + Label + Entry + Ok ie. unchanged, and backwards compatible - a flat representation. Toolkit Hierachy WindowContainer [Bin?] + Vbox + HBox + Label + Entry + Alignment + Ok the layout process would happen inside the toolkit code (perhaps eventually genericisd itself), and the result from the (re-)layout process would be a set of SetPosition/SetSize calls made to VCL. * xmlscript + xmldlg_import.cxx - + xml_helper/xml_impctx.cxx - foo ... * plan: + hard-code container hooks into the xmlscript/ parser ... + create a layout object in toolkit/ + populate it with good things ... + coupling to toolkit - widget instantiation: how ... + ComponentInfos + vclxtoolkit.cxx: + has a 'hook function' for 'fnSvtCreateWindow' for SVT widgets :-) [ grotesque ;-] + [ wow - fetched by dlopen! ;-] + A little app - a-la solver: using awt (?) + XMessageBoxFactory ... + XToolkit: + CreateWindow ... + ** how does the xml code generate these guys ? ** + what APIs does the xmlimporter use ? not 'createWindow' seemingly. + existing xml import uses: property bag a -lot-: Reference< beans::XPropertySet > xProps( _pImport->_xDialogModel, UNO_QUERY_THROW ); * we do _xDialogModel->insertByName (new any()) + to build hierarchy ( cf. ~ControlImportContext ) DialogImport: css::uno::Reference< css::container::XNameContainer > _xDialogModel; Reference< container::XNameContainer > xModel( xContext->getServiceManager()->createInstanceWithContext( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialogModel" ) ), xContext ), UNO_QUERY ); toolkit/source/controls/dialogcontrol.cxx + UnoControlButtonModel (eg.) + service 'UnoControlModel' ... + poke at 'titledbox' or 'radiogroup' to see how containment works there ... + how will child widget properties work ? + bug with a 'vbox' inside a 'titledbox' ... + titledbox - acts as a container (interesting) - offsetting child positions + how will pseudo-containers eg. "radiogroup" cope ? + propose new syntax: [ with child properties a-la glade ]: + if 'child' element omitted - default properties used ... + if multiple elements in same 'child' set: all have the same props. + LayoutContainerElement: + should maintain a stack of elements on the context ... + in ~LayoutContainerElement - remove them etc. OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.UnoControlButtonModel") ) ); OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.UnoControlVBoxModel") ) ); + toolkit: + how do we go from an 'UnoControlXYZModel' to an 'UnoControlXYZ' ?