include/vcl/wizardmachine.hxx | 94 ++++- include/vcl/wizdlg.hxx | 92 ---- solenv/clang-format/blacklist | 2 vcl/Library_vcl.mk | 1 vcl/source/control/wizardmachine.cxx | 579 ++++++++++++++++++++++++++++++- vcl/source/control/wizdlg.cxx | 646 ----------------------------------- 6 files changed, 654 insertions(+), 760 deletions(-)
New commits: commit 166dc8778d79c2932800ee26a8e18994b5a6b884 Author: Caolán McNamara <[email protected]> AuthorDate: Thu Sep 12 15:29:17 2019 +0100 Commit: Caolán McNamara <[email protected]> CommitDate: Thu Sep 12 20:28:33 2019 +0200 merge OWizardMachine and WizardDialog Change-Id: I9d8aa49eb4394b630197cac97777231ed87f7a75 Reviewed-on: https://gerrit.libreoffice.org/78834 Tested-by: Jenkins Reviewed-by: Caolán McNamara <[email protected]> Tested-by: Caolán McNamara <[email protected]> diff --git a/include/vcl/wizardmachine.hxx b/include/vcl/wizardmachine.hxx index 04fb2d1f6602..c61009494ad9 100644 --- a/include/vcl/wizardmachine.hxx +++ b/include/vcl/wizardmachine.hxx @@ -21,8 +21,9 @@ #include <memory> #include <vcl/dllapi.h> -#include <vcl/wizdlg.hxx> #include <vcl/button.hxx> +#include <vcl/dialog.hxx> +#include <vcl/idle.hxx> #include <vcl/tabpage.hxx> namespace weld { @@ -30,6 +31,9 @@ namespace weld { class Container; } +struct ImplWizPageData; +struct ImplWizButtonData; + namespace vcl { @@ -134,10 +138,26 @@ namespace vcl they can implement non-linear traveling this way. */ - class VCL_DLLPUBLIC OWizardMachine : public WizardDialog, public WizardTypes + class VCL_DLLPUBLIC OWizardMachine : public ModalDialog, public WizardTypes { private: - // TabPage* GetPage( sal_uInt16 nLevel ) const { return WizardDialog::GetPage(nLevel); } + Idle maWizardLayoutIdle; + Size maPageSize; + ImplWizPageData* mpFirstPage; + ImplWizButtonData* mpFirstBtn; + VclPtr<TabPage> mpCurTabPage; + VclPtr<PushButton> mpPrevBtn; + VclPtr<PushButton> mpNextBtn; + VclPtr<vcl::Window> mpViewWindow; + sal_uInt16 mnCurLevel; + WindowAlign meViewAlign; + Link<OWizardMachine*,void> maActivateHdl; + sal_Int16 mnLeftAlignCount; + bool mbEmptyViewMargin; + + DECL_DLLPRIVATE_LINK( ImplHandleWizardLayoutTimerHdl, Timer*, void ); + + // TabPage* GetPage( sal_uInt16 nLevel ) const { return OWizardMachine::GetPage(nLevel); } // TODO: probably the complete page handling (next, previous etc.) should be prohibited ... // IMPORTANT: @@ -145,6 +165,23 @@ namespace vcl // here (e.g. committing page data) depend on having full control over page traveling. // So use the travelXXX methods if you need to travel + protected: + long LogicalCoordinateToPixel(int iCoordinate); + /**sets the number of buttons which should be left-aligned. Normally, buttons are right-aligned. + + only to be used during construction, before any layouting happened + */ + void SetLeftAlignedButtonCount( sal_Int16 _nCount ); + /** declares the view area to have an empty margin + + Normally, the view area has a certain margin to the top/left/bottom/right of the + dialog. By calling this method, you can reduce this margin to 0. + */ + void SetEmptyViewMargin(); + + void CalcAndSetSize(); + + public: VclPtr<OKButton> m_pFinish; VclPtr<CancelButton> m_pCancel; @@ -161,6 +198,40 @@ namespace vcl virtual ~OWizardMachine() override; virtual void dispose() override; + virtual void Resize() override; + virtual void StateChanged( StateChangedType nStateChange ) override; + virtual bool EventNotify( NotifyEvent& rNEvt ) override; + + virtual void ActivatePage(); + virtual bool DeactivatePage(); + + virtual void queue_resize(StateChangedType eReason = StateChangedType::Layout) override; + + bool ShowPrevPage(); + bool ShowNextPage(); + bool ShowPage( sal_uInt16 nLevel ); + bool Finish( long nResult = 0 ); + sal_uInt16 GetCurLevel() const { return mnCurLevel; } + + void AddPage( TabPage* pPage ); + void RemovePage( TabPage* pPage ); + void SetPage( sal_uInt16 nLevel, TabPage* pPage ); + TabPage* GetPage( sal_uInt16 nLevel ) const; + + void AddButton( Button* pButton, long nOffset = 0 ); + void RemoveButton( Button* pButton ); + + void SetPrevButton( PushButton* pButton ) { mpPrevBtn = pButton; } + void SetNextButton( PushButton* pButton ) { mpNextBtn = pButton; } + + void SetViewWindow( vcl::Window* pWindow ) { mpViewWindow = pWindow; } + void SetViewAlign( WindowAlign eAlign ) { meViewAlign = eAlign; } + + void SetPageSizePixel( const Size& rSize ) { maPageSize = rSize; } + const Size& GetPageSizePixel() const { return maPageSize; } + + void SetActivatePageHdl( const Link<OWizardMachine*,void>& rLink ) { maActivateHdl = rLink; } + /// enable (or disable) buttons void enableButtons(WizardButtonFlags _nWizardButtonFlags, bool _bEnable); /// set the default style for a button @@ -183,10 +254,6 @@ namespace vcl virtual void updateTravelUI(); protected: - // WizardDialog overridables - virtual void ActivatePage() override; - virtual bool DeactivatePage() override; - // our own overridables /// to override to create new pages @@ -306,7 +373,7 @@ namespace vcl Vulgo, this is the identifier of the current tab page :) */ - WizardState getCurrentState() const { return WizardDialog::GetCurLevel(); } + WizardState getCurrentState() const { return GetCurLevel(); } virtual IWizardPageController* getPageController( TabPage* _pCurrentPage ) const; @@ -331,6 +398,14 @@ namespace vcl TabPage* GetOrCreatePage( const WizardState i_nState ); private: + VCL_DLLPRIVATE void ImplInitData(); + VCL_DLLPRIVATE void ImplCalcSize( Size& rSize ); + VCL_DLLPRIVATE void ImplPosCtrls(); + VCL_DLLPRIVATE void ImplPosTabPage(); + VCL_DLLPRIVATE void ImplShowTabPage( TabPage* pPage ); + VCL_DLLPRIVATE TabPage* ImplGetPage( sal_uInt16 nLevel ) const; + + DECL_DLLPRIVATE_LINK(OnNextPage, Button*, void); DECL_DLLPRIVATE_LINK(OnPrevPage, Button*, void); DECL_DLLPRIVATE_LINK(OnFinish, Button*, void); @@ -396,7 +471,6 @@ namespace vcl virtual void updateTravelUI(); protected: - // WizardDialog overridables virtual void ActivatePage(); virtual bool DeactivatePage(); @@ -588,6 +662,8 @@ namespace vcl } // namespace vcl +#define WIZARDDIALOG_BUTTON_STDOFFSET_X 6 +#define WIZARDDIALOG_BUTTON_SMALLSTDOFFSET_X 3 #endif // INCLUDED_SVTOOLS_WIZARDMACHINE_HXX diff --git a/include/vcl/wizdlg.hxx b/include/vcl/wizdlg.hxx index 338816904ca0..3e87bff37c5b 100644 --- a/include/vcl/wizdlg.hxx +++ b/include/vcl/wizdlg.hxx @@ -21,13 +21,8 @@ #define INCLUDED_VCL_WIZDLG_HXX #include <vcl/dllapi.h> -#include <vcl/button.hxx> -#include <vcl/dialog.hxx> -#include <vcl/idle.hxx> class TabPage; -struct ImplWizPageData; -struct ImplWizButtonData; /* @@ -170,93 +165,6 @@ IMPL_LINK( MyWizardDlg, ImplNextHdl, PushButton*, pBtn, void ) */ -#define WIZARDDIALOG_BUTTON_STDOFFSET_X 6 -#define WIZARDDIALOG_BUTTON_SMALLSTDOFFSET_X 3 - - -class VCL_DLLPUBLIC WizardDialog : public ModalDialog -{ -private: - Idle maWizardLayoutIdle; - Size maPageSize; - ImplWizPageData* mpFirstPage; - ImplWizButtonData* mpFirstBtn; - VclPtr<TabPage> mpCurTabPage; - VclPtr<PushButton> mpPrevBtn; - VclPtr<PushButton> mpNextBtn; - VclPtr<vcl::Window> mpViewWindow; - sal_uInt16 mnCurLevel; - WindowAlign meViewAlign; - Link<WizardDialog*,void> maActivateHdl; - sal_Int16 mnLeftAlignCount; - bool mbEmptyViewMargin; - - DECL_DLLPRIVATE_LINK( ImplHandleWizardLayoutTimerHdl, Timer*, void ); - -protected: - long LogicalCoordinateToPixel(int iCoordinate); - /**sets the number of buttons which should be left-aligned. Normally, buttons are right-aligned. - - only to be used during construction, before any layouting happened - */ - void SetLeftAlignedButtonCount( sal_Int16 _nCount ); - /** declares the view area to have an empty margin - - Normally, the view area has a certain margin to the top/left/bottom/right of the - dialog. By calling this method, you can reduce this margin to 0. - */ - void SetEmptyViewMargin(); - - void CalcAndSetSize(); - -private: - VCL_DLLPRIVATE void ImplInitData(); - VCL_DLLPRIVATE void ImplCalcSize( Size& rSize ); - VCL_DLLPRIVATE void ImplPosCtrls(); - VCL_DLLPRIVATE void ImplPosTabPage(); - VCL_DLLPRIVATE void ImplShowTabPage( TabPage* pPage ); - VCL_DLLPRIVATE TabPage* ImplGetPage( sal_uInt16 nLevel ) const; - -public: - WizardDialog( vcl::Window* pParent, const OUString& rID, const OUString& rUIXMLDescription ); - virtual ~WizardDialog() override; - virtual void dispose() override; - - virtual void Resize() override; - virtual void StateChanged( StateChangedType nStateChange ) override; - virtual bool EventNotify( NotifyEvent& rNEvt ) override; - - virtual void ActivatePage(); - virtual bool DeactivatePage(); - - virtual void queue_resize(StateChangedType eReason = StateChangedType::Layout) override; - - bool ShowPrevPage(); - bool ShowNextPage(); - bool ShowPage( sal_uInt16 nLevel ); - bool Finish( long nResult = 0 ); - sal_uInt16 GetCurLevel() const { return mnCurLevel; } - - void AddPage( TabPage* pPage ); - void RemovePage( TabPage* pPage ); - void SetPage( sal_uInt16 nLevel, TabPage* pPage ); - TabPage* GetPage( sal_uInt16 nLevel ) const; - - void AddButton( Button* pButton, long nOffset = 0 ); - void RemoveButton( Button* pButton ); - - void SetPrevButton( PushButton* pButton ) { mpPrevBtn = pButton; } - void SetNextButton( PushButton* pButton ) { mpNextBtn = pButton; } - - void SetViewWindow( vcl::Window* pWindow ) { mpViewWindow = pWindow; } - void SetViewAlign( WindowAlign eAlign ) { meViewAlign = eAlign; } - - void SetPageSizePixel( const Size& rSize ) { maPageSize = rSize; } - const Size& GetPageSizePixel() const { return maPageSize; } - - void SetActivatePageHdl( const Link<WizardDialog*,void>& rLink ) { maActivateHdl = rLink; } -}; - #endif // INCLUDED_VCL_WIZDLG_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/solenv/clang-format/blacklist b/solenv/clang-format/blacklist index 258d31436ff6..0bf27165bfe1 100644 --- a/solenv/clang-format/blacklist +++ b/solenv/clang-format/blacklist @@ -7946,7 +7946,6 @@ include/vcl/waitobj.hxx include/vcl/wall.hxx include/vcl/window.hxx include/vcl/wizardmachine.hxx -include/vcl/wizdlg.hxx include/vcl/wmf.hxx include/vcl/wmfexternal.hxx include/vcl/wrkwin.hxx @@ -17765,7 +17764,6 @@ vcl/source/control/tabctrl.cxx vcl/source/control/throbber.cxx vcl/source/control/thumbpos.hxx vcl/source/control/wizardmachine.cxx -vcl/source/control/wizdlg.cxx vcl/source/edit/textdat2.hxx vcl/source/edit/textdata.cxx vcl/source/edit/textdoc.cxx diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index c8e4aa75dccb..c33dfbdbd987 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -213,7 +213,6 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/source/control/tabctrl \ vcl/source/control/throbber \ vcl/source/control/wizardmachine \ - vcl/source/control/wizdlg \ vcl/source/edit/vclmedit \ vcl/source/edit/textdata \ vcl/source/edit/textdoc \ diff --git a/vcl/source/control/wizardmachine.cxx b/vcl/source/control/wizardmachine.cxx index fb309c46f8ec..823b20f69d7e 100644 --- a/vcl/source/control/wizardmachine.cxx +++ b/vcl/source/control/wizardmachine.cxx @@ -17,10 +17,11 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include <vcl/event.hxx> +#include <vcl/svapp.hxx> #include <vcl/wizardmachine.hxx> #include <tools/debug.hxx> #include <tools/diagnose_ex.h> -#include <vcl/svapp.hxx> #include <strings.hrc> #include <svdata.hxx> #include <stack> @@ -28,12 +29,24 @@ #define HID_WIZARD_NEXT "SVT_HID_WIZARD_NEXT" #define HID_WIZARD_PREVIOUS "SVT_HID_WIZARD_PREVIOUS" +#define WIZARDDIALOG_BUTTON_OFFSET_Y 6 +#define WIZARDDIALOG_BUTTON_DLGOFFSET_X 6 +#define WIZARDDIALOG_VIEW_DLGOFFSET_X 6 +#define WIZARDDIALOG_VIEW_DLGOFFSET_Y 6 + struct ImplWizPageData { ImplWizPageData* mpNext; VclPtr<TabPage> mpPage; }; +struct ImplWizButtonData +{ + ImplWizButtonData* mpNext; + VclPtr<Button> mpButton; + long mnOffset; +}; + namespace vcl { //= WizardPageImplData @@ -110,8 +123,288 @@ namespace vcl } }; - OWizardMachine::OWizardMachine(vcl::Window* _pParent, WizardButtonFlags _nButtonFlags ) - :WizardDialog( _pParent, "WizardDialog", "svt/ui/wizarddialog.ui" ) + void OWizardMachine::ImplInitData() + { + mpFirstPage = nullptr; + mpFirstBtn = nullptr; + mpCurTabPage = nullptr; + mpPrevBtn = nullptr; + mpNextBtn = nullptr; + mpViewWindow = nullptr; + mnCurLevel = 0; + meViewAlign = WindowAlign::Left; + mbEmptyViewMargin = false; + mnLeftAlignCount = 0; + + maWizardLayoutIdle.SetPriority(TaskPriority::RESIZE); + maWizardLayoutIdle.SetInvokeHandler( LINK( this, OWizardMachine, ImplHandleWizardLayoutTimerHdl ) ); + } + + void OWizardMachine::SetLeftAlignedButtonCount( sal_Int16 _nCount ) + { + mnLeftAlignCount = _nCount; + } + + void OWizardMachine::SetEmptyViewMargin() + { + mbEmptyViewMargin = true; + } + + void OWizardMachine::ImplCalcSize( Size& rSize ) + { + // calculate ButtonBar height + long nMaxHeight = 0; + ImplWizButtonData* pBtnData = mpFirstBtn; + while ( pBtnData ) + { + long nBtnHeight = pBtnData->mpButton->GetSizePixel().Height(); + if ( nBtnHeight > nMaxHeight ) + nMaxHeight = nBtnHeight; + pBtnData = pBtnData->mpNext; + } + if ( nMaxHeight ) + nMaxHeight += WIZARDDIALOG_BUTTON_OFFSET_Y*2; + rSize.AdjustHeight(nMaxHeight ); + + // add in the view window size + if ( mpViewWindow && mpViewWindow->IsVisible() ) + { + Size aViewSize = mpViewWindow->GetSizePixel(); + if ( meViewAlign == WindowAlign::Top ) + rSize.AdjustHeight(aViewSize.Height() ); + else if ( meViewAlign == WindowAlign::Left ) + rSize.AdjustWidth(aViewSize.Width() ); + else if ( meViewAlign == WindowAlign::Bottom ) + rSize.AdjustHeight(aViewSize.Height() ); + else if ( meViewAlign == WindowAlign::Right ) + rSize.AdjustWidth(aViewSize.Width() ); + } + } + + void OWizardMachine::queue_resize(StateChangedType /*eReason*/) + { + if (maWizardLayoutIdle.IsActive()) + return; + if (IsInClose()) + return; + maWizardLayoutIdle.Start(); + } + + IMPL_LINK_NOARG(OWizardMachine, ImplHandleWizardLayoutTimerHdl, Timer*, void) + { + ImplPosCtrls(); + ImplPosTabPage(); + } + + void OWizardMachine::ImplPosCtrls() + { + Size aDlgSize = GetOutputSizePixel(); + long nBtnWidth = 0; + long nMaxHeight = 0; + long nOffY = aDlgSize.Height(); + + ImplWizButtonData* pBtnData = mpFirstBtn; + int j = 0; + while ( pBtnData ) + { + if (j >= mnLeftAlignCount) + { + Size aBtnSize = pBtnData->mpButton->GetSizePixel(); + long nBtnHeight = aBtnSize.Height(); + if ( nBtnHeight > nMaxHeight ) + nMaxHeight = nBtnHeight; + nBtnWidth += aBtnSize.Width(); + nBtnWidth += pBtnData->mnOffset; + } + pBtnData = pBtnData->mpNext; + j++; + } + + if ( nMaxHeight ) + { + long nOffX = aDlgSize.Width()-nBtnWidth-WIZARDDIALOG_BUTTON_DLGOFFSET_X; + long nOffLeftAlignX = LogicalCoordinateToPixel(6); + nOffY -= WIZARDDIALOG_BUTTON_OFFSET_Y+nMaxHeight; + + pBtnData = mpFirstBtn; + int i = 0; + while ( pBtnData ) + { + Size aBtnSize = pBtnData->mpButton->GetSizePixel(); + if (i >= mnLeftAlignCount) + { + Point aPos( nOffX, nOffY+((nMaxHeight-aBtnSize.Height())/2) ); + pBtnData->mpButton->SetPosPixel( aPos ); + nOffX += aBtnSize.Width(); + nOffX += pBtnData->mnOffset; + } + else + { + Point aPos( nOffLeftAlignX, nOffY+((nMaxHeight-aBtnSize.Height())/2) ); + pBtnData->mpButton->SetPosPixel( aPos ); + nOffLeftAlignX += aBtnSize.Width(); + nOffLeftAlignX += pBtnData->mnOffset; + } + + pBtnData = pBtnData->mpNext; + i++; + } + + nOffY -= WIZARDDIALOG_BUTTON_OFFSET_Y; + } + + if ( !(mpViewWindow && mpViewWindow->IsVisible()) ) + return; + + long nViewOffX = 0; + long nViewOffY = 0; + long nViewWidth = 0; + long nViewHeight = 0; + long nDlgHeight = nOffY; + PosSizeFlags nViewPosFlags = PosSizeFlags::Pos; + if ( meViewAlign == WindowAlign::Top ) + { + nViewOffX = WIZARDDIALOG_VIEW_DLGOFFSET_X; + nViewOffY = WIZARDDIALOG_VIEW_DLGOFFSET_Y; + nViewWidth = aDlgSize.Width()-(WIZARDDIALOG_VIEW_DLGOFFSET_X*2); + nViewPosFlags |= PosSizeFlags::Width; + } + else if ( meViewAlign == WindowAlign::Left ) + { + if ( mbEmptyViewMargin ) + { + nViewOffX = 0; + nViewOffY = 0; + nViewHeight = nDlgHeight; + } + else + { + nViewOffX = WIZARDDIALOG_VIEW_DLGOFFSET_X; + nViewOffY = WIZARDDIALOG_VIEW_DLGOFFSET_Y; + nViewHeight = nDlgHeight-(WIZARDDIALOG_VIEW_DLGOFFSET_Y*2); + } + nViewPosFlags |= PosSizeFlags::Height; + } + else if ( meViewAlign == WindowAlign::Bottom ) + { + nViewOffX = WIZARDDIALOG_VIEW_DLGOFFSET_X; + nViewOffY = nDlgHeight-mpViewWindow->GetSizePixel().Height()-WIZARDDIALOG_VIEW_DLGOFFSET_Y; + nViewWidth = aDlgSize.Width()-(WIZARDDIALOG_VIEW_DLGOFFSET_X*2); + nViewPosFlags |= PosSizeFlags::Width; + } + else if ( meViewAlign == WindowAlign::Right ) + { + nViewOffX = aDlgSize.Width()-mpViewWindow->GetSizePixel().Width()-WIZARDDIALOG_VIEW_DLGOFFSET_X; + nViewOffY = WIZARDDIALOG_VIEW_DLGOFFSET_Y; + nViewHeight = nDlgHeight-(WIZARDDIALOG_VIEW_DLGOFFSET_Y*2); + nViewPosFlags |= PosSizeFlags::Height; + } + mpViewWindow->setPosSizePixel( nViewOffX, nViewOffY, + nViewWidth, nViewHeight, + nViewPosFlags ); + } + + long OWizardMachine::LogicalCoordinateToPixel(int iCoordinate){ + Size aLocSize = LogicToPixel(Size(iCoordinate, 0), MapMode(MapUnit::MapAppFont)); + int iPixelCoordinate = aLocSize.Width(); + return iPixelCoordinate; + } + + void OWizardMachine::ImplPosTabPage() + { + if ( !mpCurTabPage ) + return; + + if ( !IsInInitShow() ) + { + // #100199# - On Unix initial size is equal to screen size, on Windows + // it's 0,0. One cannot calculate the size unless dialog is visible. + if ( !IsReallyVisible() ) + return; + } + + // calculate height of ButtonBar + long nMaxHeight = 0; + ImplWizButtonData* pBtnData = mpFirstBtn; + while ( pBtnData ) + { + long nBtnHeight = pBtnData->mpButton->GetSizePixel().Height(); + if ( nBtnHeight > nMaxHeight ) + nMaxHeight = nBtnHeight; + pBtnData = pBtnData->mpNext; + } + if ( nMaxHeight ) + nMaxHeight += WIZARDDIALOG_BUTTON_OFFSET_Y*2; + + // position TabPage + Size aDlgSize = GetOutputSizePixel(); + aDlgSize.AdjustHeight( -nMaxHeight ); + long nOffX = 0; + long nOffY = 0; + if ( mpViewWindow && mpViewWindow->IsVisible() ) + { + Size aViewSize = mpViewWindow->GetSizePixel(); + if ( meViewAlign == WindowAlign::Top ) + { + nOffY += aViewSize.Height()+WIZARDDIALOG_VIEW_DLGOFFSET_Y; + aDlgSize.AdjustHeight( -(aViewSize.Height()+WIZARDDIALOG_VIEW_DLGOFFSET_Y) ); + } + else if ( meViewAlign == WindowAlign::Left ) + { + long nViewOffset = mbEmptyViewMargin ? 0 : WIZARDDIALOG_VIEW_DLGOFFSET_X; + nOffX += aViewSize.Width() + nViewOffset; + aDlgSize.AdjustWidth( -nOffX ); + } + else if ( meViewAlign == WindowAlign::Bottom ) + aDlgSize.AdjustHeight( -(aViewSize.Height()+WIZARDDIALOG_VIEW_DLGOFFSET_Y) ); + else if ( meViewAlign == WindowAlign::Right ) + aDlgSize.AdjustWidth( -(aViewSize.Width()+WIZARDDIALOG_VIEW_DLGOFFSET_X) ); + } + Point aPos( nOffX, nOffY ); + mpCurTabPage->SetPosSizePixel( aPos, aDlgSize ); + } + + void OWizardMachine::ImplShowTabPage( TabPage* pTabPage ) + { + if ( mpCurTabPage == pTabPage ) + return; + + TabPage* pOldTabPage = mpCurTabPage; + if ( pOldTabPage ) + pOldTabPage->DeactivatePage(); + + mpCurTabPage = pTabPage; + if ( pTabPage ) + { + ImplPosTabPage(); + pTabPage->ActivatePage(); + pTabPage->Show(); + } + + if ( pOldTabPage ) + pOldTabPage->Hide(); + } + + TabPage* OWizardMachine::ImplGetPage( sal_uInt16 nLevel ) const + { + sal_uInt16 nTempLevel = 0; + ImplWizPageData* pPageData = mpFirstPage; + while ( pPageData ) + { + if ( (nTempLevel == nLevel) || !pPageData->mpNext ) + break; + + nTempLevel++; + pPageData = pPageData->mpNext; + } + + if ( pPageData ) + return pPageData->mpPage; + return nullptr; + } + + OWizardMachine::OWizardMachine(vcl::Window* pParent, WizardButtonFlags _nButtonFlags) + :ModalDialog(pParent, "WizardDialog", "svt/ui/wizarddialog.ui") ,m_pFinish(nullptr) ,m_pCancel(nullptr) ,m_pNextPage(nullptr) @@ -119,10 +412,11 @@ namespace vcl ,m_pHelp(nullptr) ,m_pImpl( new WizardMachineImplData ) { + ImplInitData(); + implConstruct( _nButtonFlags ); } - void OWizardMachine::implConstruct( const WizardButtonFlags _nButtonFlags ) { m_pImpl->sTitleBase = GetText(); @@ -219,9 +513,33 @@ namespace vcl m_pImpl.reset(); } - WizardDialog::dispose(); + maWizardLayoutIdle.Stop(); + + // Remove all buttons + while ( mpFirstBtn ) + RemoveButton( mpFirstBtn->mpButton ); + + // Remove all pages + while ( mpFirstPage ) + RemovePage( mpFirstPage->mpPage ); + + mpCurTabPage.clear(); + mpPrevBtn.clear(); + mpNextBtn.clear(); + mpViewWindow.clear(); + ModalDialog::dispose(); } + void OWizardMachine::Resize() + { + if ( IsReallyShown() && !IsInInitShow() ) + { + ImplPosCtrls(); + ImplPosTabPage(); + } + + ModalDialog::Resize(); + } void OWizardMachine::implUpdateTitle() { @@ -237,6 +555,90 @@ namespace vcl SetText(sCompleteTitle); } + void OWizardMachine::CalcAndSetSize() + { + Size aDlgSize = GetPageSizePixel(); + if ( !aDlgSize.Width() || !aDlgSize.Height() ) + { + ImplWizPageData* pPageData = mpFirstPage; + while ( pPageData ) + { + if ( pPageData->mpPage ) + { + Size aPageSize = pPageData->mpPage->GetSizePixel(); + if ( aPageSize.Width() > aDlgSize.Width() ) + aDlgSize.setWidth( aPageSize.Width() ); + if ( aPageSize.Height() > aDlgSize.Height() ) + aDlgSize.setHeight( aPageSize.Height() ); + } + + pPageData = pPageData->mpNext; + } + } + ImplCalcSize( aDlgSize ); + SetOutputSizePixel( aDlgSize ); + } + + void OWizardMachine::StateChanged( StateChangedType nType ) + { + if ( nType == StateChangedType::InitShow ) + { + if ( IsDefaultSize() ) + { + CalcAndSetSize(); + } + + ImplPosCtrls(); + ImplPosTabPage(); + ImplShowTabPage( ImplGetPage( mnCurLevel ) ); + } + + ModalDialog::StateChanged( nType ); + } + + bool OWizardMachine::EventNotify( NotifyEvent& rNEvt ) + { + if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && mpPrevBtn && mpNextBtn ) + { + const KeyEvent* pKEvt = rNEvt.GetKeyEvent(); + vcl::KeyCode aKeyCode = pKEvt->GetKeyCode(); + sal_uInt16 nKeyCode = aKeyCode.GetCode(); + + if ( aKeyCode.IsMod1() ) + { + if ( aKeyCode.IsShift() || (nKeyCode == KEY_PAGEUP) ) + { + if ( (nKeyCode == KEY_TAB) || (nKeyCode == KEY_PAGEUP) ) + { + if ( mpPrevBtn->IsVisible() && + mpPrevBtn->IsEnabled() && mpPrevBtn->IsInputEnabled() ) + { + mpPrevBtn->SetPressed( true ); + mpPrevBtn->SetPressed( false ); + mpPrevBtn->Click(); + } + return true; + } + } + else + { + if ( (nKeyCode == KEY_TAB) || (nKeyCode == KEY_PAGEDOWN) ) + { + if ( mpNextBtn->IsVisible() && + mpNextBtn->IsEnabled() && mpNextBtn->IsInputEnabled() ) + { + mpNextBtn->SetPressed( true ); + mpNextBtn->SetPressed( false ); + mpNextBtn->Click(); + } + return true; + } + } + } + } + + return ModalDialog::EventNotify( rNEvt ); + } void OWizardMachine::setTitleBase(const OUString& _rTitleBase) { @@ -272,10 +674,9 @@ namespace vcl return GetPage( i_nState ); } - void OWizardMachine::ActivatePage() { - WizardDialog::ActivatePage(); + maActivateHdl.Call( this ); WizardState nCurrentLevel = GetCurLevel(); GetOrCreatePage( nCurrentLevel ); @@ -283,14 +684,12 @@ namespace vcl enterState( nCurrentLevel ); } - bool OWizardMachine::DeactivatePage() { WizardState nCurrentState = getCurrentState(); - return leaveState(nCurrentState) && WizardDialog::DeactivatePage(); + return leaveState(nCurrentState); } - void OWizardMachine::defaultButton(WizardButtonFlags _nWizardButtonFlags) { // the new default button @@ -312,6 +711,166 @@ namespace vcl implResetDefault( this ); } + bool OWizardMachine::ShowNextPage() + { + return ShowPage( mnCurLevel+1 ); + } + + bool OWizardMachine::ShowPrevPage() + { + if ( !mnCurLevel ) + return false; + return ShowPage( mnCurLevel-1 ); + } + + bool OWizardMachine::ShowPage( sal_uInt16 nLevel ) + { + if ( DeactivatePage() ) + { + mnCurLevel = nLevel; + ActivatePage(); + ImplShowTabPage( ImplGetPage( mnCurLevel ) ); + return true; + } + else + return false; + } + + bool OWizardMachine::Finish( long nResult ) + { + if ( DeactivatePage() ) + { + if ( mpCurTabPage ) + mpCurTabPage->DeactivatePage(); + + if ( IsInExecute() ) + EndDialog( nResult ); + else if ( GetStyle() & WB_CLOSEABLE ) + Close(); + return true; + } + else + return false; + } + + void OWizardMachine::AddPage( TabPage* pPage ) + { + ImplWizPageData* pNewPageData = new ImplWizPageData; + pNewPageData->mpNext = nullptr; + pNewPageData->mpPage = pPage; + + if ( !mpFirstPage ) + mpFirstPage = pNewPageData; + else + { + ImplWizPageData* pPageData = mpFirstPage; + while ( pPageData->mpNext ) + pPageData = pPageData->mpNext; + pPageData->mpNext = pNewPageData; + } + } + + void OWizardMachine::RemovePage( TabPage* pPage ) + { + ImplWizPageData* pPrevPageData = nullptr; + ImplWizPageData* pPageData = mpFirstPage; + while ( pPageData ) + { + if ( pPageData->mpPage == pPage ) + { + if ( pPrevPageData ) + pPrevPageData->mpNext = pPageData->mpNext; + else + mpFirstPage = pPageData->mpNext; + if ( pPage == mpCurTabPage ) + mpCurTabPage = nullptr; + delete pPageData; + return; + } + + pPrevPageData = pPageData; + pPageData = pPageData->mpNext; + } + + OSL_FAIL( "OWizardMachine::RemovePage() - Page not in list" ); + } + + void OWizardMachine::SetPage( sal_uInt16 nLevel, TabPage* pPage ) + { + sal_uInt16 nTempLevel = 0; + ImplWizPageData* pPageData = mpFirstPage; + while ( pPageData ) + { + if ( (nTempLevel == nLevel) || !pPageData->mpNext ) + break; + + nTempLevel++; + pPageData = pPageData->mpNext; + } + + if ( pPageData ) + { + if ( pPageData->mpPage == mpCurTabPage ) + mpCurTabPage = nullptr; + pPageData->mpPage = pPage; + } + } + + TabPage* OWizardMachine::GetPage( sal_uInt16 nLevel ) const + { + sal_uInt16 nTempLevel = 0; + + for (ImplWizPageData* pPageData = mpFirstPage; pPageData; + pPageData = pPageData->mpNext) + { + if ( nTempLevel == nLevel ) + return pPageData->mpPage; + nTempLevel++; + } + + return nullptr; + } + + void OWizardMachine::AddButton( Button* pButton, long nOffset ) + { + ImplWizButtonData* pNewBtnData = new ImplWizButtonData; + pNewBtnData->mpNext = nullptr; + pNewBtnData->mpButton = pButton; + pNewBtnData->mnOffset = nOffset; + + if ( !mpFirstBtn ) + mpFirstBtn = pNewBtnData; + else + { + ImplWizButtonData* pBtnData = mpFirstBtn; + while ( pBtnData->mpNext ) + pBtnData = pBtnData->mpNext; + pBtnData->mpNext = pNewBtnData; + } + } + + void OWizardMachine::RemoveButton( Button* pButton ) + { + ImplWizButtonData* pPrevBtnData = nullptr; + ImplWizButtonData* pBtnData = mpFirstBtn; + while ( pBtnData ) + { + if ( pBtnData->mpButton == pButton ) + { + if ( pPrevBtnData ) + pPrevBtnData->mpNext = pBtnData->mpNext; + else + mpFirstBtn = pBtnData->mpNext; + delete pBtnData; + return; + } + + pPrevBtnData = pBtnData; + pBtnData = pBtnData->mpNext; + } + + OSL_FAIL( "OWizardMachine::RemoveButton() - Button not in list" ); + } void OWizardMachine::implResetDefault(vcl::Window const * _pWindow) { diff --git a/vcl/source/control/wizdlg.cxx b/vcl/source/control/wizdlg.cxx deleted file mode 100644 index 54b0e1f3df8a..000000000000 --- a/vcl/source/control/wizdlg.cxx +++ /dev/null @@ -1,646 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#include <osl/diagnose.h> -#include <vcl/event.hxx> -#include <vcl/button.hxx> -#include <vcl/tabpage.hxx> -#include <vcl/wizdlg.hxx> - - -#define WIZARDDIALOG_BUTTON_OFFSET_Y 6 -#define WIZARDDIALOG_BUTTON_DLGOFFSET_X 6 -#define WIZARDDIALOG_VIEW_DLGOFFSET_X 6 -#define WIZARDDIALOG_VIEW_DLGOFFSET_Y 6 - - -struct ImplWizPageData -{ - ImplWizPageData* mpNext; - VclPtr<TabPage> mpPage; -}; - - -struct ImplWizButtonData -{ - ImplWizButtonData* mpNext; - VclPtr<Button> mpButton; - long mnOffset; -}; - - -void WizardDialog::ImplInitData() -{ - mpFirstPage = nullptr; - mpFirstBtn = nullptr; - mpCurTabPage = nullptr; - mpPrevBtn = nullptr; - mpNextBtn = nullptr; - mpViewWindow = nullptr; - mnCurLevel = 0; - meViewAlign = WindowAlign::Left; - mbEmptyViewMargin = false; - mnLeftAlignCount = 0; - - maWizardLayoutIdle.SetPriority(TaskPriority::RESIZE); - maWizardLayoutIdle.SetInvokeHandler( LINK( this, WizardDialog, ImplHandleWizardLayoutTimerHdl ) ); -} - - -void WizardDialog::SetLeftAlignedButtonCount( sal_Int16 _nCount ) -{ - mnLeftAlignCount = _nCount; -} - - -void WizardDialog::SetEmptyViewMargin() -{ - mbEmptyViewMargin = true; -} - - -void WizardDialog::ImplCalcSize( Size& rSize ) -{ - // calculate ButtonBar height - long nMaxHeight = 0; - ImplWizButtonData* pBtnData = mpFirstBtn; - while ( pBtnData ) - { - long nBtnHeight = pBtnData->mpButton->GetSizePixel().Height(); - if ( nBtnHeight > nMaxHeight ) - nMaxHeight = nBtnHeight; - pBtnData = pBtnData->mpNext; - } - if ( nMaxHeight ) - nMaxHeight += WIZARDDIALOG_BUTTON_OFFSET_Y*2; - rSize.AdjustHeight(nMaxHeight ); - - // add in the view window size - if ( mpViewWindow && mpViewWindow->IsVisible() ) - { - Size aViewSize = mpViewWindow->GetSizePixel(); - if ( meViewAlign == WindowAlign::Top ) - rSize.AdjustHeight(aViewSize.Height() ); - else if ( meViewAlign == WindowAlign::Left ) - rSize.AdjustWidth(aViewSize.Width() ); - else if ( meViewAlign == WindowAlign::Bottom ) - rSize.AdjustHeight(aViewSize.Height() ); - else if ( meViewAlign == WindowAlign::Right ) - rSize.AdjustWidth(aViewSize.Width() ); - } -} - -void WizardDialog::queue_resize(StateChangedType /*eReason*/) -{ - if (maWizardLayoutIdle.IsActive()) - return; - if (IsInClose()) - return; - maWizardLayoutIdle.Start(); -} - -IMPL_LINK_NOARG( WizardDialog, ImplHandleWizardLayoutTimerHdl, Timer*, void ) -{ - ImplPosCtrls(); - ImplPosTabPage(); -} - -void WizardDialog::ImplPosCtrls() -{ - Size aDlgSize = GetOutputSizePixel(); - long nBtnWidth = 0; - long nMaxHeight = 0; - long nOffY = aDlgSize.Height(); - - ImplWizButtonData* pBtnData = mpFirstBtn; - int j = 0; - while ( pBtnData ) - { - if (j >= mnLeftAlignCount) - { - Size aBtnSize = pBtnData->mpButton->GetSizePixel(); - long nBtnHeight = aBtnSize.Height(); - if ( nBtnHeight > nMaxHeight ) - nMaxHeight = nBtnHeight; - nBtnWidth += aBtnSize.Width(); - nBtnWidth += pBtnData->mnOffset; - } - pBtnData = pBtnData->mpNext; - j++; - } - - if ( nMaxHeight ) - { - long nOffX = aDlgSize.Width()-nBtnWidth-WIZARDDIALOG_BUTTON_DLGOFFSET_X; - long nOffLeftAlignX = LogicalCoordinateToPixel(6); - nOffY -= WIZARDDIALOG_BUTTON_OFFSET_Y+nMaxHeight; - - pBtnData = mpFirstBtn; - int i = 0; - while ( pBtnData ) - { - Size aBtnSize = pBtnData->mpButton->GetSizePixel(); - if (i >= mnLeftAlignCount) - { - Point aPos( nOffX, nOffY+((nMaxHeight-aBtnSize.Height())/2) ); - pBtnData->mpButton->SetPosPixel( aPos ); - nOffX += aBtnSize.Width(); - nOffX += pBtnData->mnOffset; - } - else - { - Point aPos( nOffLeftAlignX, nOffY+((nMaxHeight-aBtnSize.Height())/2) ); - pBtnData->mpButton->SetPosPixel( aPos ); - nOffLeftAlignX += aBtnSize.Width(); - nOffLeftAlignX += pBtnData->mnOffset; - } - - pBtnData = pBtnData->mpNext; - i++; - } - - nOffY -= WIZARDDIALOG_BUTTON_OFFSET_Y; - } - - if ( !(mpViewWindow && mpViewWindow->IsVisible()) ) - return; - - long nViewOffX = 0; - long nViewOffY = 0; - long nViewWidth = 0; - long nViewHeight = 0; - long nDlgHeight = nOffY; - PosSizeFlags nViewPosFlags = PosSizeFlags::Pos; - if ( meViewAlign == WindowAlign::Top ) - { - nViewOffX = WIZARDDIALOG_VIEW_DLGOFFSET_X; - nViewOffY = WIZARDDIALOG_VIEW_DLGOFFSET_Y; - nViewWidth = aDlgSize.Width()-(WIZARDDIALOG_VIEW_DLGOFFSET_X*2); - nViewPosFlags |= PosSizeFlags::Width; - } - else if ( meViewAlign == WindowAlign::Left ) - { - if ( mbEmptyViewMargin ) - { - nViewOffX = 0; - nViewOffY = 0; - nViewHeight = nDlgHeight; - } - else - { - nViewOffX = WIZARDDIALOG_VIEW_DLGOFFSET_X; - nViewOffY = WIZARDDIALOG_VIEW_DLGOFFSET_Y; - nViewHeight = nDlgHeight-(WIZARDDIALOG_VIEW_DLGOFFSET_Y*2); - } - nViewPosFlags |= PosSizeFlags::Height; - } - else if ( meViewAlign == WindowAlign::Bottom ) - { - nViewOffX = WIZARDDIALOG_VIEW_DLGOFFSET_X; - nViewOffY = nDlgHeight-mpViewWindow->GetSizePixel().Height()-WIZARDDIALOG_VIEW_DLGOFFSET_Y; - nViewWidth = aDlgSize.Width()-(WIZARDDIALOG_VIEW_DLGOFFSET_X*2); - nViewPosFlags |= PosSizeFlags::Width; - } - else if ( meViewAlign == WindowAlign::Right ) - { - nViewOffX = aDlgSize.Width()-mpViewWindow->GetSizePixel().Width()-WIZARDDIALOG_VIEW_DLGOFFSET_X; - nViewOffY = WIZARDDIALOG_VIEW_DLGOFFSET_Y; - nViewHeight = nDlgHeight-(WIZARDDIALOG_VIEW_DLGOFFSET_Y*2); - nViewPosFlags |= PosSizeFlags::Height; - } - mpViewWindow->setPosSizePixel( nViewOffX, nViewOffY, - nViewWidth, nViewHeight, - nViewPosFlags ); -} - - -long WizardDialog::LogicalCoordinateToPixel(int iCoordinate){ - Size aLocSize = LogicToPixel(Size(iCoordinate, 0), MapMode(MapUnit::MapAppFont)); - int iPixelCoordinate = aLocSize.Width(); - return iPixelCoordinate; -} - - -void WizardDialog::ImplPosTabPage() -{ - if ( !mpCurTabPage ) - return; - - if ( !IsInInitShow() ) - { - // #100199# - On Unix initial size is equal to screen size, on Windows - // it's 0,0. One cannot calculate the size unless dialog is visible. - if ( !IsReallyVisible() ) - return; - } - - // calculate height of ButtonBar - long nMaxHeight = 0; - ImplWizButtonData* pBtnData = mpFirstBtn; - while ( pBtnData ) - { - long nBtnHeight = pBtnData->mpButton->GetSizePixel().Height(); - if ( nBtnHeight > nMaxHeight ) - nMaxHeight = nBtnHeight; - pBtnData = pBtnData->mpNext; - } - if ( nMaxHeight ) - nMaxHeight += WIZARDDIALOG_BUTTON_OFFSET_Y*2; - - // position TabPage - Size aDlgSize = GetOutputSizePixel(); - aDlgSize.AdjustHeight( -nMaxHeight ); - long nOffX = 0; - long nOffY = 0; - if ( mpViewWindow && mpViewWindow->IsVisible() ) - { - Size aViewSize = mpViewWindow->GetSizePixel(); - if ( meViewAlign == WindowAlign::Top ) - { - nOffY += aViewSize.Height()+WIZARDDIALOG_VIEW_DLGOFFSET_Y; - aDlgSize.AdjustHeight( -(aViewSize.Height()+WIZARDDIALOG_VIEW_DLGOFFSET_Y) ); - } - else if ( meViewAlign == WindowAlign::Left ) - { - long nViewOffset = mbEmptyViewMargin ? 0 : WIZARDDIALOG_VIEW_DLGOFFSET_X; - nOffX += aViewSize.Width() + nViewOffset; - aDlgSize.AdjustWidth( -nOffX ); - } - else if ( meViewAlign == WindowAlign::Bottom ) - aDlgSize.AdjustHeight( -(aViewSize.Height()+WIZARDDIALOG_VIEW_DLGOFFSET_Y) ); - else if ( meViewAlign == WindowAlign::Right ) - aDlgSize.AdjustWidth( -(aViewSize.Width()+WIZARDDIALOG_VIEW_DLGOFFSET_X) ); - } - Point aPos( nOffX, nOffY ); - mpCurTabPage->SetPosSizePixel( aPos, aDlgSize ); -} - - -void WizardDialog::ImplShowTabPage( TabPage* pTabPage ) -{ - if ( mpCurTabPage == pTabPage ) - return; - - TabPage* pOldTabPage = mpCurTabPage; - if ( pOldTabPage ) - pOldTabPage->DeactivatePage(); - - mpCurTabPage = pTabPage; - if ( pTabPage ) - { - ImplPosTabPage(); - pTabPage->ActivatePage(); - pTabPage->Show(); - } - - if ( pOldTabPage ) - pOldTabPage->Hide(); -} - - -TabPage* WizardDialog::ImplGetPage( sal_uInt16 nLevel ) const -{ - sal_uInt16 nTempLevel = 0; - ImplWizPageData* pPageData = mpFirstPage; - while ( pPageData ) - { - if ( (nTempLevel == nLevel) || !pPageData->mpNext ) - break; - - nTempLevel++; - pPageData = pPageData->mpNext; - } - - if ( pPageData ) - return pPageData->mpPage; - return nullptr; -} - -WizardDialog::WizardDialog( vcl::Window* pParent, const OUString& rID, const OUString& rUIXMLDescription ) : - ModalDialog( pParent, rID, rUIXMLDescription ) -{ - ImplInitData(); -} - -WizardDialog::~WizardDialog() -{ - disposeOnce(); -} - -void WizardDialog::dispose() -{ - maWizardLayoutIdle.Stop(); - - // Remove all buttons - while ( mpFirstBtn ) - RemoveButton( mpFirstBtn->mpButton ); - - // Remove all pages - while ( mpFirstPage ) - RemovePage( mpFirstPage->mpPage ); - - mpCurTabPage.clear(); - mpPrevBtn.clear(); - mpNextBtn.clear(); - mpViewWindow.clear(); - ModalDialog::dispose(); -} - - -void WizardDialog::Resize() -{ - if ( IsReallyShown() && !IsInInitShow() ) - { - ImplPosCtrls(); - ImplPosTabPage(); - } - - Dialog::Resize(); -} - -void WizardDialog::CalcAndSetSize() -{ - Size aDlgSize = GetPageSizePixel(); - if ( !aDlgSize.Width() || !aDlgSize.Height() ) - { - ImplWizPageData* pPageData = mpFirstPage; - while ( pPageData ) - { - if ( pPageData->mpPage ) - { - Size aPageSize = pPageData->mpPage->GetSizePixel(); - if ( aPageSize.Width() > aDlgSize.Width() ) - aDlgSize.setWidth( aPageSize.Width() ); - if ( aPageSize.Height() > aDlgSize.Height() ) - aDlgSize.setHeight( aPageSize.Height() ); - } - - pPageData = pPageData->mpNext; - } - } - ImplCalcSize( aDlgSize ); - SetOutputSizePixel( aDlgSize ); -} - -void WizardDialog::StateChanged( StateChangedType nType ) -{ - if ( nType == StateChangedType::InitShow ) - { - if ( IsDefaultSize() ) - { - CalcAndSetSize(); - } - - ImplPosCtrls(); - ImplPosTabPage(); - ImplShowTabPage( ImplGetPage( mnCurLevel ) ); - } - - Dialog::StateChanged( nType ); -} - - -bool WizardDialog::EventNotify( NotifyEvent& rNEvt ) -{ - if ( (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT) && mpPrevBtn && mpNextBtn ) - { - const KeyEvent* pKEvt = rNEvt.GetKeyEvent(); - vcl::KeyCode aKeyCode = pKEvt->GetKeyCode(); - sal_uInt16 nKeyCode = aKeyCode.GetCode(); - - if ( aKeyCode.IsMod1() ) - { - if ( aKeyCode.IsShift() || (nKeyCode == KEY_PAGEUP) ) - { - if ( (nKeyCode == KEY_TAB) || (nKeyCode == KEY_PAGEUP) ) - { - if ( mpPrevBtn->IsVisible() && - mpPrevBtn->IsEnabled() && mpPrevBtn->IsInputEnabled() ) - { - mpPrevBtn->SetPressed( true ); - mpPrevBtn->SetPressed( false ); - mpPrevBtn->Click(); - } - return true; - } - } - else - { - if ( (nKeyCode == KEY_TAB) || (nKeyCode == KEY_PAGEDOWN) ) - { - if ( mpNextBtn->IsVisible() && - mpNextBtn->IsEnabled() && mpNextBtn->IsInputEnabled() ) - { - mpNextBtn->SetPressed( true ); - mpNextBtn->SetPressed( false ); - mpNextBtn->Click(); - } - return true; - } - } - } - } - - return Dialog::EventNotify( rNEvt ); -} - - -void WizardDialog::ActivatePage() -{ - maActivateHdl.Call( this ); -} - - -bool WizardDialog::DeactivatePage() -{ - return true; -} - - -bool WizardDialog::ShowNextPage() -{ - return ShowPage( mnCurLevel+1 ); -} - - -bool WizardDialog::ShowPrevPage() -{ - if ( !mnCurLevel ) - return false; - return ShowPage( mnCurLevel-1 ); -} - - -bool WizardDialog::ShowPage( sal_uInt16 nLevel ) -{ - if ( DeactivatePage() ) - { - mnCurLevel = nLevel; - ActivatePage(); - ImplShowTabPage( ImplGetPage( mnCurLevel ) ); - return true; - } - else - return false; -} - - -bool WizardDialog::Finish( long nResult ) -{ - if ( DeactivatePage() ) - { - if ( mpCurTabPage ) - mpCurTabPage->DeactivatePage(); - - if ( IsInExecute() ) - EndDialog( nResult ); - else if ( GetStyle() & WB_CLOSEABLE ) - Close(); - return true; - } - else - return false; -} - - -void WizardDialog::AddPage( TabPage* pPage ) -{ - ImplWizPageData* pNewPageData = new ImplWizPageData; - pNewPageData->mpNext = nullptr; - pNewPageData->mpPage = pPage; - - if ( !mpFirstPage ) - mpFirstPage = pNewPageData; - else - { - ImplWizPageData* pPageData = mpFirstPage; - while ( pPageData->mpNext ) - pPageData = pPageData->mpNext; - pPageData->mpNext = pNewPageData; - } -} - - -void WizardDialog::RemovePage( TabPage* pPage ) -{ - ImplWizPageData* pPrevPageData = nullptr; - ImplWizPageData* pPageData = mpFirstPage; - while ( pPageData ) - { - if ( pPageData->mpPage == pPage ) - { - if ( pPrevPageData ) - pPrevPageData->mpNext = pPageData->mpNext; - else - mpFirstPage = pPageData->mpNext; - if ( pPage == mpCurTabPage ) - mpCurTabPage = nullptr; - delete pPageData; - return; - } - - pPrevPageData = pPageData; - pPageData = pPageData->mpNext; - } - - OSL_FAIL( "WizardDialog::RemovePage() - Page not in list" ); -} - - -void WizardDialog::SetPage( sal_uInt16 nLevel, TabPage* pPage ) -{ - sal_uInt16 nTempLevel = 0; - ImplWizPageData* pPageData = mpFirstPage; - while ( pPageData ) - { - if ( (nTempLevel == nLevel) || !pPageData->mpNext ) - break; - - nTempLevel++; - pPageData = pPageData->mpNext; - } - - if ( pPageData ) - { - if ( pPageData->mpPage == mpCurTabPage ) - mpCurTabPage = nullptr; - pPageData->mpPage = pPage; - } -} - - -TabPage* WizardDialog::GetPage( sal_uInt16 nLevel ) const -{ - sal_uInt16 nTempLevel = 0; - - for (ImplWizPageData* pPageData = mpFirstPage; pPageData; - pPageData = pPageData->mpNext) - { - if ( nTempLevel == nLevel ) - return pPageData->mpPage; - nTempLevel++; - } - - return nullptr; -} - - -void WizardDialog::AddButton( Button* pButton, long nOffset ) -{ - ImplWizButtonData* pNewBtnData = new ImplWizButtonData; - pNewBtnData->mpNext = nullptr; - pNewBtnData->mpButton = pButton; - pNewBtnData->mnOffset = nOffset; - - if ( !mpFirstBtn ) - mpFirstBtn = pNewBtnData; - else - { - ImplWizButtonData* pBtnData = mpFirstBtn; - while ( pBtnData->mpNext ) - pBtnData = pBtnData->mpNext; - pBtnData->mpNext = pNewBtnData; - } -} - - -void WizardDialog::RemoveButton( Button* pButton ) -{ - ImplWizButtonData* pPrevBtnData = nullptr; - ImplWizButtonData* pBtnData = mpFirstBtn; - while ( pBtnData ) - { - if ( pBtnData->mpButton == pButton ) - { - if ( pPrevBtnData ) - pPrevBtnData->mpNext = pBtnData->mpNext; - else - mpFirstBtn = pBtnData->mpNext; - delete pBtnData; - return; - } - - pPrevBtnData = pBtnData; - pBtnData = pBtnData->mpNext; - } - - OSL_FAIL( "WizardDialog::RemoveButton() - Button not in list" ); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
