form control objects imported by

XclImpTbxControlObj


where 

XclImpControlObjHelper
     /|\ 
      |
XclImpDrawObjBase
     /|\ 
      |
XclImpDrawingObj
     /|\ 
      |
XclImpTbxControlObj

key methods are 
o CreateSdrObject - factory to create the correct 'type' of object
o DoProcessObj -    object specific processing e.g. for shape, control, note etc.

XclImpTbxControlObj::DoProcessSdrObj()  xiescher.cxx:943
XclImpDrawObjBase::ProcessSdrObject () xiescher.cxx:561
XclImpDffManager::ProcessObj() xiescher.cxx:1779 - note: after processing the object t is inserted into the solver container, there is a map between the shapeId and the SdrObject - useful I guess for postprocessing
SvxMSDffManager::ImportShape() msdffimp.cxx:5425 - imports the shape e.g. size, position, font specifics etc. it also calls XclImpDffManager::ProcessObj() at xiescher.cxx:1681
  XclImpDffManager::ProcessObj() calls XclImpDffManager::CreateCustomSdrObject() which calls XclImpDffManager::CreateSdrObject() 
SvxMSDffManager::ImportObj () msdffimp.cxx:4657 - calls appropriate sub processing importShape or importGroup
XclImpDffManager::ProcessShContainer () at xiescher.cxx:1927 - imports the object
XclImpDffManager::ProcessShGrContainer() at xiescher.cxx:1895 this fellow then loops for the DFF_msofbtSpgrContainer reading each record ( shape )
XclImpDffManager::ProcessDgContainer () at xiescher.cxx:1869  - called in a loop, depending on the record ( DFF_msofbtSolverContainer or DFF_msofbtSpgrContainer ) a ProcessSolverContainer or ProcessShGrContainer call is made

XclImpDffManager::ProcessDrawing() - called once per tab

XclImpTbxControlObj ( and other subclasses of XclImpDrawObjBase are created by XclImpDrawObjBase::ReadObjCmo ( static ) called by the objectmanager

The bones of the object ( formcontrol ) specific import happens in XclImpTbxControlObj::ReadSubRecord() where local variables are populated. The next stage is when XclImpTbxControlObj::DoProcessSdrObj is called. At the point the info stored by the local variables ( things like state, control name etc. ) are set on the uno object via the XPropertySet associated with the imported control. Access to the XPropertySet is given by XclImpControlObjHelper:: GetControlPropSet()

Export
======

XclImpTbxControlObj(s) are all created before exporting  ( so there is some chance to tweak them )

#0  XclExpTbxControlObj (this=0x8a2b280, rRoot=@0x8916580, xShape=@0xbfbbcdf4) at /data4/CWS/npower10/src680-m241/sc/source/filter/excel/xeescher.cxx:341
#1  0xb1801e72 in XclExpOcxConverter::CreateCtrlObj (this=0x8916558, xShape=@0xbfbbce4c) at /data4/CWS/npower10/src680-m241/sc/source/filter/excel/xlocx.cxx:335
#2  0xb1817162 in XclEscherEx::StartShape (this=0x89164a8, rShape=@0xbfbbd238) at /data4/CWS/npower10/src680-m241/sc/source/filter/xcl97/xcl97esc.cxx:253
#3  0xb0c521fe in ImplEESdrWriter::ImplWriteShape (this=0x89e0374, rObj=@0xbfbbd238, rSolverContainer=@0x8a28f38, ePageType=NORMAL) at /data4/CWS/npower10/src680-m241/svx/source/msfilter/eschesdo.cxx:255
#4  0xb0c55da2 in ImplEESdrWriter::ImplWritePage (this=0x89e0374, rSolverContainer=@0x8a28f38, ePageType=NORMAL) at /data4/CWS/npower10/src680-m241/svx/source/msfilter/eschesdo.cxx:990
#5  0xb0c55e22 in ImplEscherExSdr::ImplWriteCurrentPage (this=0x89e0370) at /data4/CWS/npower10/src680-m241/svx/source/msfilter/eschesdo.cxx:1082
#6  0xb0c55e62 in EscherEx::AddSdrPage (this=0x89164a8, rPage=@0x86a4aa0) at /data4/CWS/npower10/src680-m241/svx/source/msfilter/eschesdo.cxx:1101
#7  0xb1816a0b in XclEscher::AddSdrPage (this=0x89c7938, rRoot=@0x8a230dc) at /data4/CWS/npower10/src680-m241/sc/source/filter/xcl97/xcl97esc.cxx:409
#8  0xb16802ad in ExcTable::FillAsTable (this=0x8a230d8, nCodeNameIdx=0) at /data4/CWS/npower10/src680-m241/sc/source/filter/excel/excdoc.cxx:377
#9  0xb16821d9 in ExcDocument::ReadDoc (this=0x8928220) at /data4/CWS/npower10/src680-m241/sc/source/filter/excel/excdoc.cxx:488
#10 0xb169dde3 in ExportBiff5::Write (this=0xbfbbd648) at /data4/CWS/npower10/src680-m241/sc/source/filter/excel/expop2.cxx:115
#11 0xb16859fa in ScExportExcel5 (rMedium=@0x8916710, pDocument=0x85fed28, bBiff8=1 '\001', eNach=1) at /data4/CWS/npower10/src680-m241/sc/source/filter/excel/excel.cxx:252

ImplEESdrWriter::ImplWritePage() - write shapes on a page
{
    ImplEESdrWriter::ImplWriteShape() - writes a shape
    {
        strange is seems to have a local shape id ( ahh used when called recusively )
        it also handles (recursively of course ) some group related foo ( that I don't understand )
        ExlEscherEx::StartShape() creates the ExcExpTbxControl object, there seems to be some support for grouping ( via pumping info in pCurrAppData [ XclEscherHostAppData ] & pCurrXclObj [ XclObjAny ] into a stack 
            pCurrAppData is pumped with various data 
               * Anchor data
               * ClientTextbox etc. 
    )

}


saving the subRecords is triggered from

#0  XclExpTbxControlObj::WriteSubRecs (this=0x8aead70, rStrm=@0x8acfa98) at /data4/CWS/npower10/src680-m241/sc/source/filter/excel/xeescher.cxx:588
#1  0xb181dab5 in XclObj::WriteBody (this=0x8aead70, rStrm=@0xbfbbd434) at /data4/CWS/npower10/src680-m241/sc/source/filter/xcl97/xcl97rec.cxx:461
#2  0xb17246df in XclExpRecord::Save (this=0x8aead70, rStrm=@0xbfbbd434) at /data4/CWS/npower10/src680-m241/sc/source/filter/excel/xerecord.cxx:89
#3  0xb1819418 in XclObj::Save (this=0x8aead70, rStrm=@0xbfbbd434) at /data4/CWS/npower10/src680-m241/sc/source/filter/xcl97/xcl97rec.cxx:481
#4  0xb1819a1e in XclObjList::Save (this=0x8ac7c30, rStrm=@0xbfbbd434) at /data4/CWS/npower10/src680-m241/sc/source/filter/xcl97/xcl97rec.cxx:365
#5  0xb1682aee in XclExpRecordList<XclExpRecordBase>::Save (this=0x8ac7bf8, rStrm=@0xbfbbd434) at ../inc/xerecord.hxx:281
#6  0xb167f307 in ExcTable::Write (this=0x8ac7be8, rStr=@0xbfbbd434) at /data4/CWS/npower10/src680-m241/sc/source/filter/excel/excdoc.cxx:452
#7  0xb167f46c in ExcDocument::Write (this=0x8ad30b8, rSvStrm=@0x8ab39f0) at /data4/CWS/npower10/src680-m241/sc/source/filter/excel/excdoc.cxx:534
#8  0xb169ddfb in ExportBiff5::Write (this=0xbfbbd648) at /data4/CWS/npower10/src680-m241/sc/source/filter/excel/expop2.cxx:116
#9  0xb16859fa in ScExportExcel5 (rMedium=@0x8ab2458, pDocument=0x8818bc8, bBiff8=1 '\001', eNach=1) at /data4/CWS/npower10/src680-m241/sc/source/filter/excel/excel.cxx:252
#10 0xb10bbbf2 in ScDocShell::ConvertTo (this=0x8818b90, rMed=@0x8ab2458) at


basically ExcDocument has member maTableList which stores Table ( sheet ) records, e.g.

maTableList.GetRecord( nTab )->Write( aXclStrm );

where each ExcTable has a list of (objects) to write XclExpTbxControlObj(s) are all created before exporting  ( so there is some chance to tweak them )

these tables are filled ( as per where the XclExpTbxControlObj(s) are all created above ) e.g. from 
ExcDocument::ReadDoc ()
   creates a ExcTable for each tab, and calls ExcTable::FillAsTable for each of those
ExcTable::FillAsTable ()

