sfx2/inc/sfx2/basedlgs.hxx | 2 sfx2/source/dialog/basedlgs.cxx | 71 +++++++++++++--------- tools/inc/tools/resmgr.hxx | 3 tools/source/rc/resmgr.cxx | 5 + vcl/inc/vcl/builder.hxx | 11 +++ vcl/inc/vcl/button.hxx | 4 + vcl/inc/vcl/dialog.hxx | 5 + vcl/inc/vcl/window.hxx | 7 ++ vcl/source/control/button.cxx | 18 +++++ vcl/source/control/edit.cxx | 3 vcl/source/control/field.cxx | 7 ++ vcl/source/control/fixed.cxx | 7 ++ vcl/source/control/lstbox.cxx | 4 + vcl/source/window/builder.cxx | 98 ++++++++++++++++++++++++++++++- vcl/source/window/dialog.cxx | 35 ++++++++++- vcl/source/window/window.cxx | 124 ++++++++++++++++++++++++++++++++++++++++ 16 files changed, 370 insertions(+), 34 deletions(-)
New commits: commit 6423055e0762a102ad82978989e378c03d553e51 Author: Caolán McNamara <[email protected]> Date: Tue May 22 12:33:28 2012 +0100 Implement conversion scheme for dialogs without changing their code This supports a scheme where we can change over a dialog to GtkBuilder xml without touching its code by the presence of a .ui file in the right place e.g. share/config/soffice.cfg/cui/10000.ui for the zoom dialog diff --git a/sfx2/inc/sfx2/basedlgs.hxx b/sfx2/inc/sfx2/basedlgs.hxx index d1dc5b7..cfd1288 100644 --- a/sfx2/inc/sfx2/basedlgs.hxx +++ b/sfx2/inc/sfx2/basedlgs.hxx @@ -79,8 +79,6 @@ private: SAL_DLLPRIVATE void init(); protected: - VclBuilder *m_pUIBuilder; - SfxModalDialog(Window *pParent, const ResId& ); SfxModalDialog(Window *pParent, const rtl::OString& rID, const rtl::OUString& rUIXMLDescription ); SfxModalDialog(Window* pParent, sal_uInt32 nUniqueId, WinBits nWinStyle = WB_STDMODAL ); diff --git a/sfx2/source/dialog/basedlgs.cxx b/sfx2/source/dialog/basedlgs.cxx index 9b9d510..5a7529a 100644 --- a/sfx2/source/dialog/basedlgs.cxx +++ b/sfx2/source/dialog/basedlgs.cxx @@ -31,6 +31,7 @@ #include <stdlib.h> #include <comphelper/processfactory.hxx> +#include <osl/file.hxx> #include <vcl/fixed.hxx> #include <vcl/help.hxx> #include <vcl/msgbox.hxx> @@ -162,34 +163,11 @@ void SfxModalDialog::init() GetDialogData_Impl(); } -// ----------------------------------------------------------------------- - -SfxModalDialog::SfxModalDialog(Window* pParent, const ResId &rResId ) - -/* [Description] - - Constructor of the general base class for modal Dialoge; - ResId is used as ID in ini-file. The saved position from there is set. -*/ - -: ModalDialog(pParent, rResId), - nUniqId(rResId.GetId()), - pInputSet(0), - pOutputSet(0), - m_pUIBuilder(0) -{ - init(); -} - #define BASEPATH_SHARE_LAYER rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UIConfig")) #define RELPATH_SHARE_LAYER rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("soffice.cfg")) #define SERVICENAME_PATHSETTINGS rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.util.PathSettings")) -SfxModalDialog::SfxModalDialog(Window *pParent, const rtl::OString& rID, const rtl::OUString& rUIXMLDescription ) -: ModalDialog(pParent, 0), //todo - nUniqId(0), //todo - pInputSet(0), - pOutputSet(0) +rtl::OUString getUIRootDir() { namespace css = ::com::sun::star; @@ -214,8 +192,47 @@ SfxModalDialog::SfxModalDialog(Window *pParent, const rtl::OString& rID, const r sShareLayer += RELPATH_SHARE_LAYER; // folder sShareLayer += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); /*to-do, can we merge all this foo with existing soffice.cfg finding code, etc*/ + return sShareLayer; +} + +// ----------------------------------------------------------------------- + +SfxModalDialog::SfxModalDialog(Window* pParent, const ResId &rResId ) + +/* [Description] + + Constructor of the general base class for modal Dialoge; + ResId is used as ID in ini-file. The saved position from there is set. +*/ + +: ModalDialog(pParent, rResId), + nUniqId(rResId.GetId()), + pInputSet(0), + pOutputSet(0) +{ + sal_Int32 nUIid = static_cast<sal_Int32>(nUniqId); + rtl::OUString sPath = rtl::OUStringBuffer(getUIRootDir()). + append(rResId.GetResMgr()->getPrefixName()). + append('/'). + append(nUIid). + appendAscii(".ui"). + makeStringAndClear(); + fprintf(stderr, "path %s id %d\n", rtl::OUStringToOString(sPath, RTL_TEXTENCODING_UTF8).getStr(), nUniqId); + + osl::File aUIFile(sPath); + osl::File::RC error = aUIFile.open(osl_File_OpenFlag_Read); + if (error == osl::File::E_None) + m_pUIBuilder = new VclBuilder(this, sPath, rtl::OString::valueOf(nUIid)); + init(); +} - m_pUIBuilder = new VclBuilder(this, sShareLayer + rUIXMLDescription, rID); +SfxModalDialog::SfxModalDialog(Window *pParent, const rtl::OString& rID, const rtl::OUString& rUIXMLDescription ) +: ModalDialog(pParent, 0), //todo + nUniqId(0), //todo + pInputSet(0), + pOutputSet(0) +{ + m_pUIBuilder = new VclBuilder(this, getUIRootDir() + rUIXMLDescription, rID); init(); } @@ -234,8 +251,7 @@ SfxModalDialog::SfxModalDialog(Window* pParent, ModalDialog(pParent, nWinStyle), nUniqId(nUniqueId), pInputSet(0), - pOutputSet(0), - m_pUIBuilder(0) + pOutputSet(0) { init(); } @@ -252,7 +268,6 @@ SfxModalDialog::~SfxModalDialog() { SetDialogData_Impl(); delete pOutputSet; - delete m_pUIBuilder; } void SfxModalDialog::CreateOutputItemSet( SfxItemPool& rPool ) diff --git a/tools/inc/tools/resmgr.hxx b/tools/inc/tools/resmgr.hxx index bb81d0d..d9b92f8 100644 --- a/tools/inc/tools/resmgr.hxx +++ b/tools/inc/tools/resmgr.hxx @@ -201,7 +201,8 @@ public: // Gibt die verbleibende Groesse zurueck sal_uInt32 GetRemainSize(); - const rtl::OUString&GetFileName() const; + const rtl::OUString& GetFileName() const; + rtl::OUString getPrefixName() const; sal_Int16 ReadShort(); sal_Int32 ReadLong(); diff --git a/tools/source/rc/resmgr.cxx b/tools/source/rc/resmgr.cxx index bc4e4ad..f55c242 100644 --- a/tools/source/rc/resmgr.cxx +++ b/tools/source/rc/resmgr.cxx @@ -1681,6 +1681,11 @@ ResMgr* ResMgr::CreateResMgr( const sal_Char* pPrefixName, return pImp ? new ResMgr( pImp ) : NULL; } +rtl::OUString ResMgr::getPrefixName() const +{ + return pImpRes->aPrefix; +} + // ----------------------------------------------------------------------- ResMgr* ResMgr::SearchCreateResMgr( diff --git a/vcl/inc/vcl/builder.hxx b/vcl/inc/vcl/builder.hxx index 730fd34..6839a79 100644 --- a/vcl/inc/vcl/builder.hxx +++ b/vcl/inc/vcl/builder.hxx @@ -42,9 +42,11 @@ private: { rtl::OString m_sID; Window *m_pWindow; + bool m_bOwned; WinAndId(const rtl::OString &rId, Window *pWindow) : m_sID(rId) , m_pWindow(pWindow) + , m_bOwned(true) { } }; @@ -69,6 +71,11 @@ public: ~VclBuilder(); Window *get_widget_root(); Window *get_by_name(rtl::OString sID); + //for the purposes of retrofitting this to the existing code + //look up sID, clone its properties into replacement and + //splice replacement into the tree instead of it, without + //taking ownership of it + bool replace(rtl::OString sID, Window &rReplacement); typedef std::map<rtl::OString, rtl::OString> stringmap; private: @@ -81,6 +88,10 @@ private: void handlePacking(Window *pCurrent, xmlreader::XmlReader &reader); void applyPackingProperty(Window *pCurrent, xmlreader::XmlReader &reader); void collectProperty(xmlreader::XmlReader &reader, stringmap &rVec); + + //Helpers to retrofit all the existing code the the builder + static void swapGuts(Window &rOrig, Window &rReplacement); + static sal_uInt16 getPositionWithinParent(Window &rWindow); }; #endif diff --git a/vcl/inc/vcl/button.hxx b/vcl/inc/vcl/button.hxx index 3fc5dc7..c775240 100644 --- a/vcl/inc/vcl/button.hxx +++ b/vcl/inc/vcl/button.hxx @@ -398,6 +398,10 @@ public: std::vector<RadioButton*> GetRadioButtonGroup(bool bIncludeThis = true) const; virtual bool set_property(const rtl::OString &rKey, const rtl::OString &rValue); + + /* + * Group this RadioButton with another + */ void group(RadioButton &rOther); }; diff --git a/vcl/inc/vcl/dialog.hxx b/vcl/inc/vcl/dialog.hxx index 39e50e5..7f2670a 100644 --- a/vcl/inc/vcl/dialog.hxx +++ b/vcl/inc/vcl/dialog.hxx @@ -42,6 +42,7 @@ // - Dialog - // ---------- struct DialogImpl; +class VclBuilder; class VCL_DLLPUBLIC Dialog : public SystemWindow { @@ -72,6 +73,8 @@ protected: SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); SAL_DLLPRIVATE void ImplDialogRes( const ResId& rResId ); + VclBuilder *m_pUIBuilder; + public: SAL_DLLPRIVATE sal_Bool IsInClose() const { return mbInClose; } SAL_DLLPRIVATE bool hasPendingLayout() const { return maLayoutTimer.IsActive(); } @@ -137,6 +140,8 @@ public: sal_Bool IsModalInputMode() const { return mbModalMode; } void GrabFocusToFirstControl(); + + static bool replace_buildable(Window *pParent, sal_Int32 nID, Window &rReplacement); }; // ------------------ diff --git a/vcl/inc/vcl/window.hxx b/vcl/inc/vcl/window.hxx index ccd4fd2..3bd7816 100644 --- a/vcl/inc/vcl/window.hxx +++ b/vcl/inc/vcl/window.hxx @@ -345,6 +345,7 @@ const char* ImplDbgCheckWindow( const void* pObj ); class Dialog; class WindowImpl; +class VclBuilder; class VCL_DLLPUBLIC Window : public OutputDevice { @@ -362,6 +363,7 @@ class VCL_DLLPUBLIC Window : public OutputDevice friend class RadioButton; friend class SystemChildWindow; friend class ImplBorderWindow; + friend class VclBuilder; // TODO: improve missing functionality // only required because of SetFloatingMode() @@ -1100,6 +1102,11 @@ public: */ virtual bool set_property(const rtl::OString &rKey, const rtl::OString &rValue); + /* + * Takes ownership of the rOther properties + */ + void take_properties(Window &rOther); + virtual void setChildAnyProperty(const rtl::OString &rString, const ::com::sun::star::uno::Any &rValue); virtual ::com::sun::star::uno::Any getWidgetAnyProperty(const rtl::OString &rString) const; diff --git a/vcl/source/control/button.cxx b/vcl/source/control/button.cxx index b070115..d76f09b 100644 --- a/vcl/source/control/button.cxx +++ b/vcl/source/control/button.cxx @@ -1207,6 +1207,9 @@ PushButton::PushButton( Window* pParent, WinBits nStyle ) : PushButton::PushButton( Window* pParent, const ResId& rResId ) : Button( WINDOW_PUSHBUTTON ) { + if (Dialog::replace_buildable(pParent, rResId.GetId(), *this)) + return; + ImplInitPushButtonData(); rResId.SetRT( RSC_PUSHBUTTON ); WinBits nStyle = ImplInitRes( rResId ); @@ -1748,6 +1751,9 @@ OKButton::OKButton( Window* pParent, WinBits nStyle ) : OKButton::OKButton( Window* pParent, const ResId& rResId ) : PushButton( WINDOW_OKBUTTON ) { + if (Dialog::replace_buildable(pParent, rResId.GetId(), *this)) + return; + rResId.SetRT( RSC_OKBUTTON ); WinBits nStyle = ImplInitRes( rResId ); ImplInit( pParent, nStyle ); @@ -1815,6 +1821,9 @@ CancelButton::CancelButton( Window* pParent, WinBits nStyle ) : CancelButton::CancelButton( Window* pParent, const ResId& rResId ) : PushButton( WINDOW_CANCELBUTTON ) { + if (Dialog::replace_buildable(pParent, rResId.GetId(), *this)) + return; + rResId.SetRT( RSC_CANCELBUTTON ); WinBits nStyle = ImplInitRes( rResId ); ImplInit( pParent, nStyle ); @@ -1882,6 +1891,9 @@ HelpButton::HelpButton( Window* pParent, WinBits nStyle ) : HelpButton::HelpButton( Window* pParent, const ResId& rResId ) : PushButton( WINDOW_HELPBUTTON ) { + if (Dialog::replace_buildable(pParent, rResId.GetId(), *this)) + return; + rResId.SetRT( RSC_HELPBUTTON ); WinBits nStyle = ImplInitRes( rResId ); ImplInit( pParent, nStyle ); @@ -2428,6 +2440,9 @@ RadioButton::RadioButton( Window* pParent, WinBits nStyle ) : RadioButton::RadioButton( Window* pParent, const ResId& rResId ) : Button( WINDOW_RADIOBUTTON ) { + if (Dialog::replace_buildable(pParent, rResId.GetId(), *this)) + return; + ImplInitRadioButtonData(); rResId.SetRT( RSC_RADIOBUTTON ); WinBits nStyle = ImplInitRes( rResId ); @@ -3372,6 +3387,9 @@ CheckBox::CheckBox( Window* pParent, WinBits nStyle ) : CheckBox::CheckBox( Window* pParent, const ResId& rResId ) : Button( WINDOW_CHECKBOX ) { + if (Dialog::replace_buildable(pParent, rResId.GetId(), *this)) + return; + ImplInitCheckBoxData(); rResId.SetRT( RSC_CHECKBOX ); WinBits nStyle = ImplInitRes( rResId ); diff --git a/vcl/source/control/edit.cxx b/vcl/source/control/edit.cxx index 7d03316..2bb7ae2 100644 --- a/vcl/source/control/edit.cxx +++ b/vcl/source/control/edit.cxx @@ -207,6 +207,9 @@ Edit::Edit( Window* pParent, WinBits nStyle ) : Edit::Edit( Window* pParent, const ResId& rResId ) : Control( WINDOW_EDIT ) { + if (Dialog::replace_buildable(pParent, rResId.GetId(), *this)) + return; + ImplInitEditData(); rResId.SetRT( RSC_EDIT ); WinBits nStyle = ImplInitRes( rResId ); diff --git a/vcl/source/control/field.cxx b/vcl/source/control/field.cxx index 1a880eb..2f8bcd6 100644 --- a/vcl/source/control/field.cxx +++ b/vcl/source/control/field.cxx @@ -33,6 +33,7 @@ #include "tools/rc.h" +#include "vcl/dialog.hxx" #include "vcl/field.hxx" #include "vcl/event.hxx" #include "vcl/svapp.hxx" @@ -788,6 +789,9 @@ NumericField::NumericField( Window* pParent, WinBits nWinStyle ) : NumericField::NumericField( Window* pParent, const ResId& rResId ) : SpinField( WINDOW_NUMERICFIELD ) { + if (Dialog::replace_buildable(pParent, rResId.GetId(), *this)) + return; + rResId.SetRT( RSC_NUMERICFIELD ); WinBits nStyle = ImplInitRes( rResId ) ; SpinField::ImplInit( pParent, nStyle ); @@ -1657,6 +1661,9 @@ MetricField::MetricField( Window* pParent, WinBits nWinStyle ) : MetricField::MetricField( Window* pParent, const ResId& rResId ) : SpinField( WINDOW_METRICFIELD ) { + if (Dialog::replace_buildable(pParent, rResId.GetId(), *this)) + return; + rResId.SetRT( RSC_METRICFIELD ); WinBits nStyle = ImplInitRes( rResId ) ; SpinField::ImplInit( pParent, nStyle ); diff --git a/vcl/source/control/fixed.cxx b/vcl/source/control/fixed.cxx index 0606073..03ee12e 100644 --- a/vcl/source/control/fixed.cxx +++ b/vcl/source/control/fixed.cxx @@ -30,6 +30,7 @@ #include "tools/rc.h" #include "vcl/decoview.hxx" +#include "vcl/dialog.hxx" #include "vcl/event.hxx" #include "vcl/fixed.hxx" @@ -164,6 +165,9 @@ FixedText::FixedText( Window* pParent, WinBits nStyle ) : FixedText::FixedText( Window* pParent, const ResId& rResId ) : Control( WINDOW_FIXEDTEXT ) { + if (Dialog::replace_buildable(pParent, rResId.GetId(), *this)) + return; + rResId.SetRT( RSC_TEXT ); WinBits nStyle = ImplInitRes( rResId ); ImplInit( pParent, nStyle ); @@ -580,6 +584,9 @@ FixedLine::FixedLine( Window* pParent, WinBits nStyle ) : FixedLine::FixedLine( Window* pParent, const ResId& rResId ) : Control( WINDOW_FIXEDLINE ) { + if (Dialog::replace_buildable(pParent, rResId.GetId(), *this)) + return; + rResId.SetRT( RSC_FIXEDLINE ); WinBits nStyle = ImplInitRes( rResId ); ImplInit( pParent, nStyle ); diff --git a/vcl/source/control/lstbox.cxx b/vcl/source/control/lstbox.cxx index 951c3e9..2adf61c 100644 --- a/vcl/source/control/lstbox.cxx +++ b/vcl/source/control/lstbox.cxx @@ -32,6 +32,7 @@ #include "vcl/decoview.hxx" +#include "vcl/dialog.hxx" #include "vcl/event.hxx" #include "vcl/scrbar.hxx" #include "vcl/button.hxx" @@ -67,6 +68,9 @@ ListBox::ListBox( Window* pParent, WinBits nStyle ) : Control( WINDOW_LISTBOX ) ListBox::ListBox( Window* pParent, const ResId& rResId ) : Control( WINDOW_LISTBOX ) { + if (Dialog::replace_buildable(pParent, rResId.GetId(), *this)) + return; + ImplInitListBoxData(); rResId.SetRT( RSC_LISTBOX ); WinBits nStyle = ImplInitRes( rResId ); diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 32829ee..e978d7d 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -34,6 +34,7 @@ #include <vcl/fixed.hxx> #include <vcl/layout.hxx> #include <vcl/lstbox.hxx> +#include <window.h> VclBuilder::VclBuilder(Window *pParent, rtl::OUString sUri, rtl::OString sID) : m_sID(sID) @@ -73,8 +74,8 @@ VclBuilder::~VclBuilder() for (std::vector<WinAndId>::reverse_iterator aI = m_aChildren.rbegin(), aEnd = m_aChildren.rend(); aI != aEnd; ++aI) { - Window *pWindow = aI->m_pWindow; - delete pWindow; + if (aI->m_bOwned) + delete aI->m_pWindow; } } @@ -268,6 +269,20 @@ void VclBuilder::handleChild(Window *pParent, xmlreader::XmlReader &reader) continue; aChilds[i]->reorderWithinParent(nPosition); } + +#if TODO +//sort by ltr ttb + rtl::OString sLeftAttach(RTL_CONSTASCII_STRINGPARAM("left-attach")); + rtl::OString sTopAttach(RTL_CONSTASCII_STRINGPARAM("top-attach")); + for (size_t i = 0; i < aChilds.size(); ++i) + { + sal_uInt16 nPosition = aChilds[i]->getWidgetProperty<sal_uInt16>(sPosition, 0xFFFF); + if (nPosition == 0xFFFF) + continue; + aChilds[i]->reorderWithinParent(nPosition); + } +#endif + } } else if (name.equals(RTL_CONSTASCII_STRINGPARAM("packing"))) @@ -483,4 +498,83 @@ Window *VclBuilder::get_by_name(rtl::OString sID) return NULL; } +sal_uInt16 VclBuilder::getPositionWithinParent(Window &rWindow) +{ + sal_uInt16 nPosition = 0; + Window* pChild = rWindow.GetParent()->mpWindowImpl->mpFirstChild; + while (pChild) + { + if (pChild == &rWindow) + break; + pChild = pChild->mpWindowImpl->mpNext; + ++nPosition; + } + return nPosition; +} + +void VclBuilder::swapGuts(Window &rOrig, Window &rReplacement) +{ +#if 1 + sal_uInt16 nPosition = getPositionWithinParent(rOrig); + + rReplacement.ImplInit(rOrig.GetParent(), rOrig.GetStyle(), NULL); + + rReplacement.take_properties(rOrig); + + rReplacement.reorderWithinParent(nPosition); + + assert(nPosition == getPositionWithinParent(rReplacement)); +#else + //rReplacement is intended to be not inserted into + //anything yet + assert(!rReplacement.mpWindowImpl->mpParent); + + rReplacement.ImplInit(rOrig.GetParent(), rOrig.GetStyle(), NULL); + assert(rReplacement.GetParent() == rOrig.GetParent()); + + rReplacement.ImplRemoveWindow(false); + + Window *pParent = rOrig.mpWindowImpl->mpParent; + Window *pOrigsNext = rOrig.mpWindowImpl->mpNext; + Window *pOrigsPrev = rOrig.mpWindowImpl->mpPrev; + std::swap(rOrig.mpWindowImpl, rReplacement.mpWindowImpl); + std::swap(rOrig.m_aWidgetProperties, rReplacement.m_aWidgetProperties); + assert(rReplacement.mpWindowImpl->mpPrev == pOrigsPrev); + assert(rReplacement.mpWindowImpl->mpNext == pOrigsNext); + if (pOrigsNext) + pOrigsNext->mpWindowImpl->mpPrev = &rReplacement; + else + pParent->mpWindowImpl->mpLastChild = &rReplacement; + if (pOrigsPrev) + pOrigsPrev->mpWindowImpl->mpNext = &rReplacement; + else + pParent->mpWindowImpl->mpFirstChild = &rReplacement; + assert(!rOrig.mpWindowImpl->mpNext && !rOrig.mpWindowImpl->mpPrev); + + //now put this at the end of the window list + rOrig.ImplInsertWindow(pParent); +#endif + fprintf(stderr, "swapped %p for %p (%d)\n", &rReplacement, &rOrig); +} + +bool VclBuilder::replace(rtl::OString sID, Window &rReplacement) +{ + for (std::vector<WinAndId>::iterator aI = m_aChildren.begin(), + aEnd = m_aChildren.end(); aI != aEnd; ++aI) + { + if (aI->m_sID.equals(sID)) + { + Window *pOrig = aI->m_pWindow; + swapGuts(*pOrig, rReplacement); + delete pOrig; + + aI->m_pWindow = &rReplacement; + aI->m_bOwned = false; + return true; + } + } + fprintf(stderr, "no sign of %s\n", sID.getStr()); + return false; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index 4ffa8ba..79cb5df 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -36,6 +36,7 @@ #include <rtl/strbuf.hxx> #include <sal/log.hxx> +#include <vcl/builder.hxx> #include <vcl/layout.hxx> #include <vcl/svapp.hxx> #include <vcl/event.hxx> @@ -349,6 +350,7 @@ void Dialog::ImplInitDialogData() mnMousePositioned = 0; m_nBorderWidth = 0; mpDialogImpl = new DialogImpl; + m_pUIBuilder = NULL; //To-Do, reuse maResizeTimer maLayoutTimer.SetTimeout(50); @@ -1081,7 +1083,9 @@ void Dialog::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal bool Dialog::isLayoutEnabled() const { //Child is a container => we're layout enabled - return dynamic_cast<const VclContainer*>(GetWindow(WINDOW_FIRSTCHILD)); + bool bRet = dynamic_cast<const VclContainer*>(GetWindow(WINDOW_FIRSTCHILD)); + fprintf(stderr, "isLayoutEnabled is %d\n", bRet); + return bRet; } Size Dialog::GetOptimalSize(WindowSizeType eType) const @@ -1098,6 +1102,11 @@ Size Dialog::GetOptimalSize(WindowSizeType eType) const IMPL_LINK( Dialog, ImplHandleLayoutTimerHdl, void*, EMPTYARG ) { VclBox *pBox = dynamic_cast<VclBox*>(GetWindow(WINDOW_FIRSTCHILD)); + if (!pBox) + { + fprintf(stderr, "WTF!\n"); + return 0; + } Size aSize = GetSizePixel(); aSize.Width() -= mpWindowImpl->mnLeftBorder + mpWindowImpl->mnRightBorder + 2 * m_nBorderWidth; @@ -1142,6 +1151,30 @@ bool Dialog::set_property(const rtl::OString &rKey, const rtl::OString &rValue) return true; } +bool Dialog::replace_buildable(Window *pParent, sal_Int32 nID, Window &rReplacement) +{ + if (!pParent) + return false; + if (!pParent->IsDialog()) + return false; + Dialog *pDialog = static_cast<Dialog*>(pParent); + VclBuilder *pUIBuilder = pDialog->m_pUIBuilder; + if (!pUIBuilder) + return false; + bool bFound = pUIBuilder->replace(rtl::OString::valueOf(nID), rReplacement); + if (!bFound) + { + fprintf(stderr, "%d %p not found, hiding\n", nID, &rReplacement); + //move "missing" elements into the action area (just to have + //a known container as an owner) and hide it + VclButtonBox* pActionArea = getActionArea(pDialog); + rReplacement.ImplInit(pActionArea, 0, NULL); + rReplacement.Hide(); + } + assert(rReplacement.mpWindowImpl); + return true; +} + // ----------------------------------------------------------------------- ModelessDialog::ModelessDialog( Window* pParent, const ResId& rResId ) : diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index 9c0b8c9..c1e8b87 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -6469,6 +6469,12 @@ void Window::Show( sal_Bool bVisible, sal_uInt16 nFlags ) Size Window::GetSizePixel() const { + if (!mpWindowImpl) + { + fprintf(stderr, "WTF\n"); + return Size(0,0); + } + // #i43257# trigger pending resize handler to assure correct window sizes if( mpWindowImpl->mpFrameData->maResizeTimer.IsActive() ) { @@ -9672,6 +9678,124 @@ Size Window::get_preferred_size() const return aRet; } +void Window::take_properties(Window &rOther) +{ + WindowImpl *pWindowImpl = rOther.mpWindowImpl; + std::swap(mpWindowImpl->mpUserData, pWindowImpl->mpUserData); + std::swap(mpWindowImpl->mpExtImpl, pWindowImpl->mpExtImpl); + std::swap(mpWindowImpl->mpCursor, pWindowImpl->mpCursor); + std::swap(mpWindowImpl->maPointer, pWindowImpl->maPointer); + mpWindowImpl->maZoom = pWindowImpl->maZoom; + mpWindowImpl->maText = pWindowImpl->maText; + std::swap(mpWindowImpl->mpControlFont, pWindowImpl->mpControlFont); + mpWindowImpl->maControlForeground = pWindowImpl->maControlForeground; + mpWindowImpl->maControlBackground = pWindowImpl->maControlBackground; + mpWindowImpl->mnLeftBorder = pWindowImpl->mnLeftBorder; + mpWindowImpl->mnTopBorder = pWindowImpl->mnTopBorder; + mpWindowImpl->mnRightBorder = pWindowImpl->mnRightBorder; + mpWindowImpl->mnBottomBorder = pWindowImpl->mnBottomBorder; + mpWindowImpl->mnX = pWindowImpl->mnX; + mpWindowImpl->mnY = pWindowImpl->mnY; + mpWindowImpl->mnAbsScreenX = pWindowImpl->mnAbsScreenX; + mpWindowImpl->maPos = pWindowImpl->maPos; + mpWindowImpl->maHelpId = pWindowImpl->maHelpId; + mpWindowImpl->maUniqId = pWindowImpl->maUniqId; + mpWindowImpl->maHelpText = pWindowImpl->maHelpText; + mpWindowImpl->maQuickHelpText = pWindowImpl->maQuickHelpText; + std::swap(mpWindowImpl->maInputContext, pWindowImpl->maInputContext); + mpWindowImpl->mnStyle = pWindowImpl->mnStyle; + mpWindowImpl->mnPrevStyle = pWindowImpl->mnPrevStyle; + mpWindowImpl->mnExtendedStyle = pWindowImpl->mnExtendedStyle; + mpWindowImpl->mnPrevExtendedStyle = pWindowImpl->mnPrevExtendedStyle; + mpWindowImpl->mnType = pWindowImpl->mnType; + mpWindowImpl->mnNativeBackground = pWindowImpl->mnNativeBackground; + mpWindowImpl->mnWaitCount = pWindowImpl->mnWaitCount; + mpWindowImpl->mnPaintFlags = pWindowImpl->mnPaintFlags; + mpWindowImpl->mnGetFocusFlags = pWindowImpl->mnGetFocusFlags; + mpWindowImpl->mnParentClipMode = pWindowImpl->mnParentClipMode; + mpWindowImpl->mnActivateMode = pWindowImpl->mnActivateMode; + mpWindowImpl->mnDlgCtrlFlags = pWindowImpl->mnDlgCtrlFlags; + mpWindowImpl->mnLockCount = pWindowImpl->mnLockCount; + mpWindowImpl->meAlwaysInputMode = pWindowImpl->meAlwaysInputMode; + mpWindowImpl->mbFrame = pWindowImpl->mbFrame; + mpWindowImpl->mbBorderWin = pWindowImpl->mbBorderWin; + mpWindowImpl->mbOverlapWin = pWindowImpl->mbOverlapWin; + mpWindowImpl->mbSysWin = pWindowImpl->mbSysWin; + mpWindowImpl->mbDialog = pWindowImpl->mbDialog; + mpWindowImpl->mbDockWin = pWindowImpl->mbDockWin; + mpWindowImpl->mbFloatWin = pWindowImpl->mbFloatWin; + mpWindowImpl->mbPushButton = pWindowImpl->mbPushButton; + mpWindowImpl->mbVisible = pWindowImpl->mbVisible; + mpWindowImpl->mbDisabled = pWindowImpl->mbDisabled; + mpWindowImpl->mbInputDisabled = pWindowImpl->mbInputDisabled; + mpWindowImpl->mbDropDisabled = pWindowImpl->mbDropDisabled; + mpWindowImpl->mbNoUpdate = pWindowImpl->mbNoUpdate; + mpWindowImpl->mbNoParentUpdate = pWindowImpl->mbNoParentUpdate; + mpWindowImpl->mbActive = pWindowImpl->mbActive; + mpWindowImpl->mbParentActive = pWindowImpl->mbParentActive; + mpWindowImpl->mbReallyVisible = pWindowImpl->mbReallyVisible; + mpWindowImpl->mbReallyShown = pWindowImpl->mbReallyShown; + mpWindowImpl->mbInInitShow = pWindowImpl->mbInInitShow; + mpWindowImpl->mbChildNotify = pWindowImpl->mbChildNotify; + mpWindowImpl->mbChildPtrOverwrite = pWindowImpl->mbChildPtrOverwrite; + mpWindowImpl->mbNoPtrVisible = pWindowImpl->mbNoPtrVisible; + mpWindowImpl->mbPaintFrame = pWindowImpl->mbPaintFrame; + mpWindowImpl->mbInPaint = pWindowImpl->mbInPaint; + mpWindowImpl->mbMouseMove = pWindowImpl->mbMouseMove; + mpWindowImpl->mbMouseButtonDown = pWindowImpl->mbMouseButtonDown; + mpWindowImpl->mbMouseButtonUp = pWindowImpl->mbMouseButtonUp; + mpWindowImpl->mbKeyInput = pWindowImpl->mbKeyInput; + mpWindowImpl->mbKeyUp = pWindowImpl->mbKeyUp; + mpWindowImpl->mbCommand = pWindowImpl->mbCommand; + mpWindowImpl->mbDefPos = pWindowImpl->mbDefPos; + mpWindowImpl->mbDefSize = pWindowImpl->mbDefSize; + mpWindowImpl->mbCallMove = pWindowImpl->mbCallMove; + mpWindowImpl->mbCallResize = pWindowImpl->mbCallResize; + mpWindowImpl->mbWaitSystemResize = pWindowImpl->mbWaitSystemResize; + mpWindowImpl->mbInitWinClipRegion = pWindowImpl->mbInitWinClipRegion; + mpWindowImpl->mbInitChildRegion = pWindowImpl->mbInitChildRegion; + mpWindowImpl->mbWinRegion = pWindowImpl->mbWinRegion; + mpWindowImpl->mbClipChildren = pWindowImpl->mbClipChildren; + mpWindowImpl->mbClipSiblings = pWindowImpl->mbClipSiblings; + mpWindowImpl->mbChildTransparent = pWindowImpl->mbChildTransparent; + mpWindowImpl->mbPaintTransparent = pWindowImpl->mbPaintTransparent; + mpWindowImpl->mbMouseTransparent = pWindowImpl->mbMouseTransparent; + mpWindowImpl->mbDlgCtrlStart = pWindowImpl->mbDlgCtrlStart; + mpWindowImpl->mbFocusVisible = pWindowImpl->mbFocusVisible; + mpWindowImpl->mbTrackVisible = pWindowImpl->mbTrackVisible; + mpWindowImpl->mbUseNativeFocus = pWindowImpl->mbUseNativeFocus; + mpWindowImpl->mbNativeFocusVisible = pWindowImpl->mbNativeFocusVisible; + mpWindowImpl->mbInShowFocus = pWindowImpl->mbInShowFocus; + mpWindowImpl->mbInHideFocus = pWindowImpl->mbInHideFocus; + mpWindowImpl->mbControlForeground = pWindowImpl->mbControlForeground; + mpWindowImpl->mbControlBackground = pWindowImpl->mbControlBackground; + mpWindowImpl->mbAlwaysOnTop = pWindowImpl->mbAlwaysOnTop; + mpWindowImpl->mbCompoundControl = pWindowImpl->mbCompoundControl; + mpWindowImpl->mbCompoundControlHasFocus = pWindowImpl->mbCompoundControlHasFocus; + mpWindowImpl->mbPaintDisabled = pWindowImpl->mbPaintDisabled; + mpWindowImpl->mbAllResize = pWindowImpl->mbAllResize; + mpWindowImpl->mbInDtor = pWindowImpl->mbInDtor; + mpWindowImpl->mbExtTextInput = pWindowImpl->mbExtTextInput; + mpWindowImpl->mbInFocusHdl = pWindowImpl->mbInFocusHdl; + mpWindowImpl->mbOverlapVisible = pWindowImpl->mbOverlapVisible; + mpWindowImpl->mbCreatedWithToolkit = pWindowImpl->mbCreatedWithToolkit; + mpWindowImpl->mbToolBox = pWindowImpl->mbToolBox; + mpWindowImpl->mbSplitter = pWindowImpl->mbSplitter; + mpWindowImpl->mbSuppressAccessibilityEvents = pWindowImpl->mbSuppressAccessibilityEvents; + mpWindowImpl->mbMenuFloatingWindow = pWindowImpl->mbMenuFloatingWindow; + mpWindowImpl->mbDrawSelectionBackground = pWindowImpl->mbDrawSelectionBackground; + mpWindowImpl->mbIsInTaskPaneList = pWindowImpl->mbIsInTaskPaneList; + mpWindowImpl->mbToolbarFloatingWindow = pWindowImpl->mbToolbarFloatingWindow; + mpWindowImpl->mbCallHandlersDuringInputDisabled = pWindowImpl->mbCallHandlersDuringInputDisabled; + mpWindowImpl->mbDisableAccessibleLabelForRelation = pWindowImpl->mbDisableAccessibleLabelForRelation; + mpWindowImpl->mbDisableAccessibleLabeledByRelation = pWindowImpl->mbDisableAccessibleLabeledByRelation; + mpWindowImpl->mbHelpTextDynamic = pWindowImpl->mbHelpTextDynamic; + mpWindowImpl->mbFakeFocusSet = pWindowImpl->mbFakeFocusSet; + mpWindowImpl->mbInterceptChildWindowKeyDown = pWindowImpl->mbInterceptChildWindowKeyDown; + + std::swap(m_aWidgetProperties, rOther.m_aWidgetProperties); +} + bool Window::set_property(const rtl::OString &rKey, const rtl::OString &rValue) { if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("label")))
_______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
