summaryrefslogtreecommitdiff
path: root/include/svtools/wizdlg.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'include/svtools/wizdlg.hxx')
-rw-r--r--include/svtools/wizdlg.hxx301
1 files changed, 301 insertions, 0 deletions
diff --git a/include/svtools/wizdlg.hxx b/include/svtools/wizdlg.hxx
new file mode 100644
index 000000000000..f161b7339ff7
--- /dev/null
+++ b/include/svtools/wizdlg.hxx
@@ -0,0 +1,301 @@
+/* -*- 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 .
+ */
+
+#ifndef _SVT_WIZDLG_HXX
+#define _SVT_WIZDLG_HXX
+
+#include "svtools/svtdllapi.h"
+
+#include <vcl/dialog.hxx>
+
+class TabPage;
+class Button;
+class PushButton;
+class FixedLine;
+struct ImplWizPageData;
+struct ImplWizButtonData;
+
+/*************************************************************************
+
+Beschreibung
+============
+
+class WizardDialog
+
+Diese Klasse dient als Basis fuer einen WizardDialog. Als
+Basisfunktionalitaet wird das Anordnen der Controls angeboten und
+Hilfesmethoden fuer das Umschalten von TabPages. Der Dialog
+ordnet bei einer Groessenanderung die Controls auch wieder
+entsprechend an.
+
+--------------------------------------------------------------------------
+
+Mit SetPageSizePixel() kann als Groesse die Groesse der groessten
+TabPage vorgegeben werden. Wenn der Dialog angezeigt wird, wird
+zu dem Zeitpunkt wenn noch keine Groesse gesetzt wurde, dafuer
+die entsprechende Dialoggroesse berechnet und gesetzt. Wenn mit
+SetPageSizePixel() keine Groesse gesetzt wurde, wird als Groesse
+die maximale Groesse der zu diesem Zeitpunkt zugewiesenen TabPages
+berechnet und genommen.
+
+ShowPrevPage()/ShowNextPage() zeigt die vorherige/naechste TabPage
+an. Dazu wird zuerst der Deactivate-Handler vom Dialog gerufen und
+wenn dieser sal_True zurueckgegeben hat, wird der Acivate-Handler
+vom Dialog gerufen und die entsprechende TabPage angezeigt.
+Finnsh() kann gerufen werden, wenn der Finnish-Button betaetigt
+wird. Dort wird dann auch noch der Deactivate-Page-Handler vom
+Dialog und der aktuellen TabPage gerufen und dann der Dialog
+beendet (Close() oder EndDialog()).
+
+Mit AddPage()/RemovePage()/SetPage() koennen die TabPages dem Wizard
+bekannt gemacht werden. Es wird immer die TabPage des aktuellen Levels
+angezeigt, wenn fuer den aktuellen Level keine TabPage zugewiesen
+ist, wird die TabPages des hoechsten Levels angezeigt. Somit kann auch
+immer die aktuelle TabPage ausgetauscht werden, wobei zu
+beruecksichtigen ist, das im Activate-Handler die aktuelle TabPage
+nicht zerstoert werden darf.
+
+Mit SetPrevButton()/SetNextButton() werden der Prev-Button und der
+Next-Button dem Dialog bekannt gemacht. In dem Fall loest der
+Dialog bei Ctr+Tab, Shift+Ctrl+Tab den entsprechenden Click-Handler
+am zugewiesenen Button aus. Die Button werden nicht vom WizardDialog
+disablte. Eine entsprechende Steuerung muss der Benutzer dieses
+Dialoges selber programieren.
+
+Mit AddButton()/RemoveButton() koennen Buttons dem Wizard bekannt
+gemacht werden, die in der Reihenfolge der Hinzufuegung angeordnet
+werden. Die Buttons werden unabhengig von ihrem sichtbarkeitsstatus
+angeordnet, so das auch spaeter ein entsprechender Button angezeigt/
+gehidet werden kann. Der Offset wird in Pixeln angegeben und bezieht
+sich immer auf den nachfolgenden Button. Damit der Abstand zwischen
+den Buttons bei allen Dialogen gleich ist, gibt es das Define
+WIZARDDIALOG_BUTTON_STDOFFSET_X, welches als Standard-Offset genommen
+werden sollte.
+
+Mit ShowButtonFixedLine() kann gesteuert werden, ob die zwischen den
+Buttons und der TabPage eine Trennlinie angezeigt werden soll.
+
+Mit SetViewWindow() und SetViewAlign() kann ein Control gesetzt werden,
+welches als PreView-Window oder fuer die Anzeige von schoenen Bitmaps
+genutzt werden kann.
+
+--------------------------------------------------------------------------
+
+Der ActivatePage()-Handler wird gerufen, wenn eine neue TabPages
+angezeigt wird. In diesem Handler kann beispielsweise die neue
+TabPage erzeugt werden, wenn diese zu diesem Zeitpunkt noch nicht
+erzeugt wurde. Der Handler kann auch als Link gesetzt werden. Mit
+GetCurLevel() kann die aktuelle ebene abgefragt werden, wobei
+Level 0 die erste Seite ist.
+
+Der DeactivatePage()-Handler wird gerufen, wenn eine neue TabPage
+angezeigt werden soll. In diesem Handler kann noch eine Fehler-
+ueberprufung stattfinden und das Umschalten gegebenenfalls verhindert
+werden, indem sal_False zurueckgegeben wird. Der Handler kann auch als
+Link gesetzt werden. Die Defaultimplementierung ruft den Link und
+gibt den Rueckgabewert des Links zurueck und wenn kein Link gesetzt
+ist, wird sal_True zurueckgegeben.
+
+--------------------------------------------------------------------------
+
+Beispiel:
+
+MyWizardDlg-Ctor
+----------------
+
+// add buttons
+AddButton( &maHelpBtn, WIZARDDIALOG_BUTTON_STDOFFSET_X );
+AddButton( &maCancelBtn, WIZARDDIALOG_BUTTON_STDOFFSET_X );
+AddButton( &maPrevBtn );
+AddButton( &maNextBtn, WIZARDDIALOG_BUTTON_STDOFFSET_X );
+AddButton( &maFinnishBtn );
+SetPrevButton( &maPrevBtn );
+SetNextButton( &maNextBtn );
+
+// SetHandler
+maPrevBtn.SetClickHdl( LINK( this, MyWizardDlg, ImplPrevHdl ) );
+maNextBtn.SetClickHdl( LINK( this, MyWizardDlg, ImplNextHdl ) );
+
+// Set PreviewWindow
+SetViewWindow( &maPreview );
+
+// Show line between Buttons and Page
+ShowButtonFixedLine( sal_True );
+
+// Call ActivatePage, because the first page should be created an activated
+ActivatePage();
+
+
+MyWizardDlg-ActivatePage-Handler
+--------------------------------
+
+void MyWizardDlg::ActivatePage()
+{
+ WizardDialog::ActivatePage();
+
+ // Test, if Page is created already
+ if ( !GetPage( GetCurLevel() ) )
+ {
+ // Create and add new page
+ TabPage* pNewTabPage;
+ switch ( GetCurLevel() )
+ {
+ case 0:
+ pNewTabPage = CreateIntroPage();
+ break;
+ case 1:
+ pNewTabPage = CreateSecondPage();
+ break;
+ case 2:
+ pNewTabPage = CreateThirdPage();
+ break;
+ case 3:
+ pNewTabPage = CreateFinnishedPage();
+ break;
+
+ }
+ AddPage( pNewTabPage );
+ }
+}
+
+
+MyWizardDlg-Prev/Next-Handler
+-----------------------------
+
+IMPL_LINK( MyWizardDlg, ImplPrevHdl, PushButton*, pBtn )
+{
+ ShowPrevPage();
+ if ( !GetCurLevel() )
+ pBtn->Disable();
+ return 0;
+}
+
+IMPL_LINK( MyWizardDlg, ImplNextHdl, PushButton*, pBtn )
+{
+ ShowNextPage();
+ if ( GetCurLevel() < 3 )
+ pBtn->Disable();
+ return 0;
+}
+
+*************************************************************************/
+
+// ----------------------
+// - WizardDialog-Types -
+// ----------------------
+
+#define WIZARDDIALOG_BUTTON_STDOFFSET_X 6
+#define WIZARDDIALOG_BUTTON_SMALLSTDOFFSET_X 3
+
+// ----------------
+// - WizardDialog -
+// ----------------
+
+class SVT_DLLPUBLIC WizardDialog : public ModalDialog
+{
+private:
+ Size maPageSize;
+ ImplWizPageData* mpFirstPage;
+ ImplWizButtonData* mpFirstBtn;
+ FixedLine* mpFixedLine;
+ TabPage* mpCurTabPage;
+ PushButton* mpPrevBtn;
+ PushButton* mpNextBtn;
+ Window* mpViewWindow;
+ sal_uInt16 mnCurLevel;
+ WindowAlign meViewAlign;
+ Link maActivateHdl;
+ Link maDeactivateHdl;
+ sal_Int16 mnLeftAlignCount;
+ bool mbEmptyViewMargin;
+
+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();
+
+#ifdef _SVT_WIZDLG_CXX
+private:
+ SVT_DLLPRIVATE void ImplInitData();
+ SVT_DLLPRIVATE void ImplCalcSize( Size& rSize );
+ SVT_DLLPRIVATE void ImplPosCtrls();
+ SVT_DLLPRIVATE void ImplPosTabPage();
+ SVT_DLLPRIVATE void ImplShowTabPage( TabPage* pPage );
+ SVT_DLLPRIVATE TabPage* ImplGetPage( sal_uInt16 nLevel ) const;
+#endif
+
+public:
+ WizardDialog( Window* pParent, WinBits nStyle = WB_STDTABDIALOG );
+ WizardDialog( Window* pParent, const ResId& rResId );
+ ~WizardDialog();
+
+ virtual void Resize();
+ virtual void StateChanged( StateChangedType nStateChange );
+ virtual long Notify( NotifyEvent& rNEvt );
+
+ virtual void ActivatePage();
+ virtual long DeactivatePage();
+
+ sal_Bool ShowPrevPage();
+ sal_Bool ShowNextPage();
+ sal_Bool ShowPage( sal_uInt16 nLevel );
+ sal_Bool Finnish( 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; }
+ PushButton* GetPrevButton() const { return mpPrevBtn; }
+ void SetNextButton( PushButton* pButton ) { mpNextBtn = pButton; }
+ PushButton* GetNextButton() const { return mpNextBtn; }
+
+ void ShowButtonFixedLine( sal_Bool bVisible );
+
+ void SetViewWindow( Window* pWindow ) { mpViewWindow = pWindow; }
+ Window* GetViewWindow() const { return mpViewWindow; }
+ void SetViewAlign( WindowAlign eAlign ) { meViewAlign = eAlign; }
+ WindowAlign GetViewAlign() const { return meViewAlign; }
+
+ void SetPageSizePixel( const Size& rSize ) { maPageSize = rSize; }
+ const Size& GetPageSizePixel() const { return maPageSize; }
+
+ void SetActivatePageHdl( const Link& rLink ) { maActivateHdl = rLink; }
+ const Link& GetActivatePageHdl() const { return maActivateHdl; }
+ void SetDeactivatePageHdl( const Link& rLink ) { maDeactivateHdl = rLink; }
+ const Link& GetDeactivatePageHdl() const { return maDeactivateHdl; }
+};
+
+#endif // _SVT_WIZDLG_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */