1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_VCL_ROADMAPWIZARD_HXX
21 #define INCLUDED_VCL_ROADMAPWIZARD_HXX
24 #include <vcl/dllapi.h>
25 #include <vcl/wizardmachine.hxx>
29 struct RoadmapWizardImpl
;
31 namespace RoadmapWizardTypes
33 typedef ::std::vector
< WizardTypes::WizardState
> WizardPath
;
35 enum class PathId
: sal_Int16
38 COMMON_FIRST_STATE
= 0,
39 COMPLETE
= 1, //include settings and fields page
40 NO_SETTINGS
= 2, // exclude settings page
41 NO_FIELDS
= 3, // exclude fields page
42 NO_SETTINGS_NO_FIELDS
= 4, // exclude settings and fields page
49 /** is - no, not a wizard for a roadmap, but the base class for wizards
50 <em>supporting</em> a roadmap.
52 The basic new concept introduced is a <em>path</em>:<br/>
53 A <em>path</em> is a sequence of states, which are to be executed in a linear order.
54 Elements in the path can be skipped, depending on choices the user makes.
56 In the most simple wizards, you will have only one path consisting of <code>n</code> elements,
57 which are to be visited successively.
59 In a slightly more complex wizard, you will have one linear path, were certain
60 steps might be skipped due to user input. For instance, the user may decide to not specify
61 certain aspects of the to-be-created object (e.g. by unchecking a check box),
62 and the wizard then will simply disable the step which corresponds to this step.
64 In a yet more advanced wizards, you will have several paths of length <code>n1</code> and
65 <code>n2</code>, which share at least the first <code>k</code> states (where <code>k</code>
66 is at least 1), and an arbitrary number of other states.
68 class VCL_DLLPUBLIC RoadmapWizardMachine
: public vcl::WizardMachine
71 std::unique_ptr
<RoadmapWizardImpl
> m_pImpl
;
74 RoadmapWizardMachine(weld::Window
* _pParent
);
75 virtual ~RoadmapWizardMachine( ) override
;
77 void SetRoadmapHelpId( const OUString
& _rId
);
79 // returns whether a given state is enabled
80 bool isStateEnabled(WizardTypes::WizardState nState
) const;
82 // WizardDialog overridables
83 virtual bool canAdvance() const override
;
84 virtual void updateTravelUI() override
;
87 /** declares a valid path in the wizard
89 The very first path which is declared is automatically activated.
91 Note that all paths which are declared must have the very first state in
92 common. Also note that due to a restriction of the very base class (WizardDialog),
93 this common first state must be 0.
95 You cannot declare new paths once the wizard started, so it's recommended that
96 you do all declarations within your derivee's constructor.
101 the unique id you wish to give this path. This id can later on be used
102 to refer to the path which you just declared
104 void declarePath( RoadmapWizardTypes::PathId _nPathId
, const RoadmapWizardTypes::WizardPath
& _lWizardStates
);
106 /** activates a path which has previously been declared with <member>declarePath</member>
108 You can only activate paths which share the first <code>k</code> states with the path
109 which is previously active (if any), where <code>k</code> is the index of the
110 current state within the current path.
113 Say you have paths, <code>(0,1,2,5)</code> and <code>(0,1,4,5)</code>. This means that after
114 step <code>1</code>, you either continue with state <code>2</code> or state <code>4</code>,
115 and after this, you finish in state <code>5</code>.<br/>
116 Now if the first path is active, and your current state is <code>1</code>, then you can
117 easily switch to the second path, since both paths start with <code>(0,1)</code>.<br/>
118 However, if your current state is <code>2</code>, then you can not switch to the second
123 the id of the path. The path must have been declared (under this id) with
124 <member>declarePath</member> before it can be activated.
127 If <TRUE/>, the path will be completely activated, even if it is a conflicting path
128 (i.e. there is another path which shares the first <code>k</code> states with
129 the to-be-activated path.)<br/>
130 If <FALSE/>, then the new path is checked for conflicts with other paths. If such
131 conflicts exists, the path is not completely activated, but only up to the point
132 where it does <em>not</em> conflict.<br/>
133 With the paths in the example above, if you activate the second path (when both are
134 already declared), then only steps <code>0</code> and <code>1</code> are activated,
135 since they are common to both paths.
137 void activatePath( RoadmapWizardTypes::PathId _nPathId
, bool _bDecideForIt
= false );
139 /** determine the next state to travel from the given one
141 This method (which is declared in WizardMachine and overwritten here)
142 ensures that traveling happens along the active path.
146 virtual WizardTypes::WizardState
determineNextState(WizardTypes::WizardState nCurrentState
) const override
;
148 /** en- or disables a state
150 In the wizard's roadmap, states to travel to can be freely chosen. To prevent
151 users from selecting a state which is currently not available, you can declare this
152 state as being disabled.
154 A situation where you need this may be when you have a checkbox which, when checked
155 by the user, enables a page with additional settings. As long as this checkbox is
156 not checked, the respective state would be disabled.
158 Note that in theory, you can declare multiple paths, instead of disabling states.
159 For instance, if you have a path where one state can be potentially disabled, then
160 you could declare a second path, which does not contain this state. However, the
161 disadvantage is that then, not the complete path would be visible in the roadmap,
162 but only all steps up to the point where the both paths diverge.<br/>
163 Another disadvantage is that the number of needed paths grows exponentially with
164 the number of states which can be potentially disabled.
168 void enableState(WizardTypes::WizardState nState
, bool _bEnable
= true);
170 /** returns true if and only if the given state is known in at least one declared path
172 bool knowsState(WizardTypes::WizardState nState
) const;
174 // WizardMachine overriables
175 virtual void enterState(WizardTypes::WizardState nState
) override
;
177 /** returns a human readable name for a given state
179 There is a default implementation for this method, which returns the display name
180 as given in a call to describeState. If there is no description for the given state,
181 this is worth an assertion in a non-product build, and then an empty string is
184 virtual OUString
getStateDisplayName(WizardTypes::WizardState nState
) const;
187 DECL_DLLPRIVATE_LINK( OnRoadmapItemSelected
, const OUString
&, bool );
189 /** updates the roadmap control to show the given path, as far as possible
190 (modulo conflicts with other paths)
192 SAL_DLLPRIVATE
void implUpdateRoadmap( );
197 #endif // OOO_ INCLUDED_VCL_ROADMAPWIZARD_HXX
199 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */