1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski #include "precompiled_sd.hxx"
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #include "AllMasterPagesSelector.hxx"
25*b1cdbd2cSJim Jagielski #include "PreviewValueSet.hxx"
26*b1cdbd2cSJim Jagielski #include "ViewShellBase.hxx"
27*b1cdbd2cSJim Jagielski #include "SidebarShellManager.hxx"
28*b1cdbd2cSJim Jagielski #include "MasterPageContainer.hxx"
29*b1cdbd2cSJim Jagielski #include "MasterPageDescriptor.hxx"
30*b1cdbd2cSJim Jagielski #include "app.hrc"
31*b1cdbd2cSJim Jagielski #include "helpids.h"
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <tools/link.hxx>
34*b1cdbd2cSJim Jagielski #include <set>
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski namespace {
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski using namespace sd::sidebar;
39*b1cdbd2cSJim Jagielski 
GetURLPriority(const SharedMasterPageDescriptor & rpDescriptor)40*b1cdbd2cSJim Jagielski int GetURLPriority (const SharedMasterPageDescriptor& rpDescriptor)
41*b1cdbd2cSJim Jagielski {
42*b1cdbd2cSJim Jagielski     int nPriority (0);
43*b1cdbd2cSJim Jagielski     switch (rpDescriptor->GetURLClassification())
44*b1cdbd2cSJim Jagielski     {
45*b1cdbd2cSJim Jagielski         case MasterPageDescriptor::URLCLASS_USER:         nPriority = 0; break;
46*b1cdbd2cSJim Jagielski         case MasterPageDescriptor::URLCLASS_LAYOUT:       nPriority = 1; break;
47*b1cdbd2cSJim Jagielski         case MasterPageDescriptor::URLCLASS_PRESENTATION: nPriority = 2; break;
48*b1cdbd2cSJim Jagielski         case MasterPageDescriptor::URLCLASS_OTHER:        nPriority = 3; break;
49*b1cdbd2cSJim Jagielski         case MasterPageDescriptor::URLCLASS_UNKNOWN:      nPriority = 4; break;
50*b1cdbd2cSJim Jagielski         default:
51*b1cdbd2cSJim Jagielski         case MasterPageDescriptor::URLCLASS_UNDETERMINED: nPriority = 5; break;
52*b1cdbd2cSJim Jagielski     }
53*b1cdbd2cSJim Jagielski     return nPriority;
54*b1cdbd2cSJim Jagielski }
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski class MasterPageDescriptorOrder
58*b1cdbd2cSJim Jagielski {
59*b1cdbd2cSJim Jagielski public:
operator ()(const SharedMasterPageDescriptor & rp1,const SharedMasterPageDescriptor & rp2)60*b1cdbd2cSJim Jagielski     bool operator() (
61*b1cdbd2cSJim Jagielski         const SharedMasterPageDescriptor& rp1,
62*b1cdbd2cSJim Jagielski         const SharedMasterPageDescriptor& rp2)
63*b1cdbd2cSJim Jagielski     {
64*b1cdbd2cSJim Jagielski         if (rp1->meOrigin == MasterPageContainer::DEFAULT)
65*b1cdbd2cSJim Jagielski             return true;
66*b1cdbd2cSJim Jagielski         else if (rp2->meOrigin == MasterPageContainer::DEFAULT)
67*b1cdbd2cSJim Jagielski             return false;
68*b1cdbd2cSJim Jagielski         else if (rp1->GetURLClassification() == rp2->GetURLClassification())
69*b1cdbd2cSJim Jagielski             return rp1->mnTemplateIndex < rp2->mnTemplateIndex;
70*b1cdbd2cSJim Jagielski         else
71*b1cdbd2cSJim Jagielski             return GetURLPriority(rp1) < GetURLPriority(rp2);
72*b1cdbd2cSJim Jagielski     }
73*b1cdbd2cSJim Jagielski };
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski } // end of anonymous namespace
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski namespace sd { namespace sidebar {
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski class AllMasterPagesSelector::SortedMasterPageDescriptorList
82*b1cdbd2cSJim Jagielski     : public ::std::set<SharedMasterPageDescriptor,MasterPageDescriptorOrder>
83*b1cdbd2cSJim Jagielski {
84*b1cdbd2cSJim Jagielski public:
SortedMasterPageDescriptorList(void)85*b1cdbd2cSJim Jagielski     SortedMasterPageDescriptorList (void) {}
86*b1cdbd2cSJim Jagielski };
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski 
Create(::Window * pParent,ViewShellBase & rViewShellBase,const cssu::Reference<css::ui::XSidebar> & rxSidebar)91*b1cdbd2cSJim Jagielski MasterPagesSelector* AllMasterPagesSelector::Create (
92*b1cdbd2cSJim Jagielski     ::Window* pParent,
93*b1cdbd2cSJim Jagielski     ViewShellBase& rViewShellBase,
94*b1cdbd2cSJim Jagielski     const cssu::Reference<css::ui::XSidebar>& rxSidebar)
95*b1cdbd2cSJim Jagielski {
96*b1cdbd2cSJim Jagielski     SdDrawDocument* pDocument = rViewShellBase.GetDocument();
97*b1cdbd2cSJim Jagielski     if (pDocument == NULL)
98*b1cdbd2cSJim Jagielski         return NULL;
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski     ::boost::shared_ptr<MasterPageContainer> pContainer (new MasterPageContainer());
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski     MasterPagesSelector* pSelector(
103*b1cdbd2cSJim Jagielski         new AllMasterPagesSelector (
104*b1cdbd2cSJim Jagielski             pParent,
105*b1cdbd2cSJim Jagielski             *pDocument,
106*b1cdbd2cSJim Jagielski             rViewShellBase,
107*b1cdbd2cSJim Jagielski             pContainer,
108*b1cdbd2cSJim Jagielski             rxSidebar));
109*b1cdbd2cSJim Jagielski     pSelector->LateInit();
110*b1cdbd2cSJim Jagielski     pSelector->SetHelpId(HID_SD_TASK_PANE_PREVIEW_ALL);
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski     return pSelector;
113*b1cdbd2cSJim Jagielski }
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 
AllMasterPagesSelector(::Window * pParent,SdDrawDocument & rDocument,ViewShellBase & rBase,const::boost::shared_ptr<MasterPageContainer> & rpContainer,const cssu::Reference<css::ui::XSidebar> & rxSidebar)118*b1cdbd2cSJim Jagielski AllMasterPagesSelector::AllMasterPagesSelector (
119*b1cdbd2cSJim Jagielski     ::Window* pParent,
120*b1cdbd2cSJim Jagielski     SdDrawDocument& rDocument,
121*b1cdbd2cSJim Jagielski     ViewShellBase& rBase,
122*b1cdbd2cSJim Jagielski     const ::boost::shared_ptr<MasterPageContainer>& rpContainer,
123*b1cdbd2cSJim Jagielski     const cssu::Reference<css::ui::XSidebar>& rxSidebar)
124*b1cdbd2cSJim Jagielski     : MasterPagesSelector(pParent, rDocument, rBase, rpContainer, rxSidebar),
125*b1cdbd2cSJim Jagielski       mpSortedMasterPages(new SortedMasterPageDescriptorList())
126*b1cdbd2cSJim Jagielski {
127*b1cdbd2cSJim Jagielski     MasterPagesSelector::Fill();
128*b1cdbd2cSJim Jagielski }
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski 
~AllMasterPagesSelector(void)133*b1cdbd2cSJim Jagielski AllMasterPagesSelector::~AllMasterPagesSelector (void)
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski }
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 
Fill(ItemList & rItemList)140*b1cdbd2cSJim Jagielski void AllMasterPagesSelector::Fill (ItemList& rItemList)
141*b1cdbd2cSJim Jagielski {
142*b1cdbd2cSJim Jagielski     if (mpSortedMasterPages->empty())
143*b1cdbd2cSJim Jagielski         UpdateMasterPageList();
144*b1cdbd2cSJim Jagielski     UpdatePageSet(rItemList);
145*b1cdbd2cSJim Jagielski }
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 
NotifyContainerChangeEvent(const MasterPageContainerChangeEvent & rEvent)150*b1cdbd2cSJim Jagielski void AllMasterPagesSelector::NotifyContainerChangeEvent (
151*b1cdbd2cSJim Jagielski     const MasterPageContainerChangeEvent& rEvent)
152*b1cdbd2cSJim Jagielski {
153*b1cdbd2cSJim Jagielski     switch (rEvent.meEventType)
154*b1cdbd2cSJim Jagielski     {
155*b1cdbd2cSJim Jagielski         case MasterPageContainerChangeEvent::CHILD_ADDED:
156*b1cdbd2cSJim Jagielski             AddItem(rEvent.maChildToken);
157*b1cdbd2cSJim Jagielski             MasterPagesSelector::Fill();
158*b1cdbd2cSJim Jagielski             break;
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski         case MasterPageContainerChangeEvent::INDEX_CHANGED:
161*b1cdbd2cSJim Jagielski         case MasterPageContainerChangeEvent::INDEXES_CHANGED:
162*b1cdbd2cSJim Jagielski             mpSortedMasterPages->clear();
163*b1cdbd2cSJim Jagielski             MasterPagesSelector::Fill();
164*b1cdbd2cSJim Jagielski             break;
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski         default:
167*b1cdbd2cSJim Jagielski             MasterPagesSelector::NotifyContainerChangeEvent(rEvent);
168*b1cdbd2cSJim Jagielski             break;
169*b1cdbd2cSJim Jagielski     }
170*b1cdbd2cSJim Jagielski }
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 
UpdateMasterPageList(void)175*b1cdbd2cSJim Jagielski void AllMasterPagesSelector::UpdateMasterPageList (void)
176*b1cdbd2cSJim Jagielski {
177*b1cdbd2cSJim Jagielski     mpSortedMasterPages->clear();
178*b1cdbd2cSJim Jagielski     int nTokenCount = mpContainer->GetTokenCount();
179*b1cdbd2cSJim Jagielski     for (int i=0; i<nTokenCount; i++)
180*b1cdbd2cSJim Jagielski         AddItem(mpContainer->GetTokenForIndex(i));
181*b1cdbd2cSJim Jagielski }
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski 
AddItem(MasterPageContainer::Token aToken)186*b1cdbd2cSJim Jagielski void AllMasterPagesSelector::AddItem (MasterPageContainer::Token aToken)
187*b1cdbd2cSJim Jagielski {
188*b1cdbd2cSJim Jagielski     switch (mpContainer->GetOriginForToken(aToken))
189*b1cdbd2cSJim Jagielski     {
190*b1cdbd2cSJim Jagielski         case MasterPageContainer::DEFAULT:
191*b1cdbd2cSJim Jagielski         case MasterPageContainer::TEMPLATE:
192*b1cdbd2cSJim Jagielski             // Templates are added only when coming from the
193*b1cdbd2cSJim Jagielski             // MasterPageContainerFiller so that they have an id which
194*b1cdbd2cSJim Jagielski             // defines their place in the list.  Templates (pre) loaded from
195*b1cdbd2cSJim Jagielski             // RecentlyUsedMasterPages are ignored (they will be loaded
196*b1cdbd2cSJim Jagielski             // later by the MasterPageContainerFiller.)
197*b1cdbd2cSJim Jagielski             if (mpContainer->GetTemplateIndexForToken(aToken) >= 0)
198*b1cdbd2cSJim Jagielski                 mpSortedMasterPages->insert(mpContainer->GetDescriptorForToken(aToken));
199*b1cdbd2cSJim Jagielski             break;
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski         default:
202*b1cdbd2cSJim Jagielski             break;
203*b1cdbd2cSJim Jagielski     }
204*b1cdbd2cSJim Jagielski }
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski 
UpdatePageSet(ItemList & rItemList)209*b1cdbd2cSJim Jagielski void AllMasterPagesSelector::UpdatePageSet (ItemList& rItemList)
210*b1cdbd2cSJim Jagielski {
211*b1cdbd2cSJim Jagielski     SortedMasterPageDescriptorList::const_iterator iDescriptor;
212*b1cdbd2cSJim Jagielski     SortedMasterPageDescriptorList::const_iterator iEnd (mpSortedMasterPages->end());
213*b1cdbd2cSJim Jagielski     for (iDescriptor=mpSortedMasterPages->begin(); iDescriptor!=iEnd; ++iDescriptor)
214*b1cdbd2cSJim Jagielski         rItemList.push_back((*iDescriptor)->maToken);
215*b1cdbd2cSJim Jagielski }
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski 
GetState(SfxItemSet & rItemSet)220*b1cdbd2cSJim Jagielski void AllMasterPagesSelector::GetState (SfxItemSet& rItemSet)
221*b1cdbd2cSJim Jagielski {
222*b1cdbd2cSJim Jagielski     //    MasterPagesSelector::GetState(rItemSet);
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski 	if (rItemSet.GetItemState(SID_TP_EDIT_MASTER) == SFX_ITEM_AVAILABLE)
225*b1cdbd2cSJim Jagielski         rItemSet.DisableItem(SID_TP_EDIT_MASTER);
226*b1cdbd2cSJim Jagielski }
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski } } // end of namespace sd::sidebar
232