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 "MasterPageContainerFiller.hxx"
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include "MasterPageDescriptor.hxx"
27*b1cdbd2cSJim Jagielski #include "MasterPageContainerProviders.hxx"
28*b1cdbd2cSJim Jagielski #include "TemplateScanner.hxx"
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
31*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski namespace sd { namespace sidebar {
35*b1cdbd2cSJim Jagielski 
MasterPageContainerFiller(ContainerAdapter & rpAdapter)36*b1cdbd2cSJim Jagielski MasterPageContainerFiller::MasterPageContainerFiller (ContainerAdapter& rpAdapter)
37*b1cdbd2cSJim Jagielski     : mrContainerAdapter(rpAdapter),
38*b1cdbd2cSJim Jagielski       meState(INITIALIZE_TEMPLATE_SCANNER),
39*b1cdbd2cSJim Jagielski       mpScannerTask(),
40*b1cdbd2cSJim Jagielski       mpLastAddedEntry(NULL),
41*b1cdbd2cSJim Jagielski       mnIndex(1)
42*b1cdbd2cSJim Jagielski {
43*b1cdbd2cSJim Jagielski     // Add one entry for the default master page.  We use temporarily the
44*b1cdbd2cSJim Jagielski     // DefaultPagePreviewProvider to prevent the rendering (and the
45*b1cdbd2cSJim Jagielski     // expensive creation) of the default page.  It is replaced later on by
46*b1cdbd2cSJim Jagielski     // another.
47*b1cdbd2cSJim Jagielski     SharedMasterPageDescriptor pDescriptor (new MasterPageDescriptor(
48*b1cdbd2cSJim Jagielski         MasterPageContainer::DEFAULT,
49*b1cdbd2cSJim Jagielski         0,
50*b1cdbd2cSJim Jagielski         String(),
51*b1cdbd2cSJim Jagielski         String(),
52*b1cdbd2cSJim Jagielski         String(),
53*b1cdbd2cSJim Jagielski         false,
54*b1cdbd2cSJim Jagielski         ::boost::shared_ptr<PageObjectProvider>(new DefaultPageObjectProvider()),
55*b1cdbd2cSJim Jagielski         ::boost::shared_ptr<PreviewProvider>(new PagePreviewProvider())));
56*b1cdbd2cSJim Jagielski     mrContainerAdapter.PutMasterPage(pDescriptor);
57*b1cdbd2cSJim Jagielski }
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski 
~MasterPageContainerFiller(void)62*b1cdbd2cSJim Jagielski MasterPageContainerFiller::~MasterPageContainerFiller (void)
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski }
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski 
RunNextStep(void)69*b1cdbd2cSJim Jagielski void MasterPageContainerFiller::RunNextStep (void)
70*b1cdbd2cSJim Jagielski {
71*b1cdbd2cSJim Jagielski     switch (meState)
72*b1cdbd2cSJim Jagielski     {
73*b1cdbd2cSJim Jagielski         case INITIALIZE_TEMPLATE_SCANNER:
74*b1cdbd2cSJim Jagielski             mpScannerTask.reset(new TemplateScanner());
75*b1cdbd2cSJim Jagielski             meState = SCAN_TEMPLATE;
76*b1cdbd2cSJim Jagielski             break;
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski         case SCAN_TEMPLATE:
79*b1cdbd2cSJim Jagielski             meState = ScanTemplate();
80*b1cdbd2cSJim Jagielski             break;
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski         case ADD_TEMPLATE:
83*b1cdbd2cSJim Jagielski             meState = AddTemplate();
84*b1cdbd2cSJim Jagielski             break;
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski         case DONE:
87*b1cdbd2cSJim Jagielski         case ERROR:
88*b1cdbd2cSJim Jagielski         default:
89*b1cdbd2cSJim Jagielski             break;
90*b1cdbd2cSJim Jagielski     }
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski     // When the state has just been set to DONE or ERROR then tell the
93*b1cdbd2cSJim Jagielski     // container that no more templates will be coming and stop the
94*b1cdbd2cSJim Jagielski     // scanning.
95*b1cdbd2cSJim Jagielski     switch (meState)
96*b1cdbd2cSJim Jagielski     {
97*b1cdbd2cSJim Jagielski         case DONE:
98*b1cdbd2cSJim Jagielski         case ERROR:
99*b1cdbd2cSJim Jagielski             if (mpScannerTask.get() != NULL)
100*b1cdbd2cSJim Jagielski             {
101*b1cdbd2cSJim Jagielski                 mrContainerAdapter.FillingDone();
102*b1cdbd2cSJim Jagielski                 mpScannerTask.reset();
103*b1cdbd2cSJim Jagielski             }
104*b1cdbd2cSJim Jagielski 		default:
105*b1cdbd2cSJim Jagielski 			break;
106*b1cdbd2cSJim Jagielski     }
107*b1cdbd2cSJim Jagielski }
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 
HasNextStep(void)112*b1cdbd2cSJim Jagielski bool MasterPageContainerFiller::HasNextStep (void)
113*b1cdbd2cSJim Jagielski {
114*b1cdbd2cSJim Jagielski     switch (meState)
115*b1cdbd2cSJim Jagielski     {
116*b1cdbd2cSJim Jagielski         case DONE:
117*b1cdbd2cSJim Jagielski         case ERROR:
118*b1cdbd2cSJim Jagielski             return false;
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski         default:
121*b1cdbd2cSJim Jagielski             return true;
122*b1cdbd2cSJim Jagielski     }
123*b1cdbd2cSJim Jagielski }
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski 
ScanTemplate(void)128*b1cdbd2cSJim Jagielski MasterPageContainerFiller::State MasterPageContainerFiller::ScanTemplate (void)
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski     State eState (ERROR);
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski     if (mpScannerTask.get() != NULL)
133*b1cdbd2cSJim Jagielski     {
134*b1cdbd2cSJim Jagielski         if (mpScannerTask->HasNextStep())
135*b1cdbd2cSJim Jagielski         {
136*b1cdbd2cSJim Jagielski             mpScannerTask->RunNextStep();
137*b1cdbd2cSJim Jagielski             if (mpScannerTask->GetLastAddedEntry() != mpLastAddedEntry)
138*b1cdbd2cSJim Jagielski             {
139*b1cdbd2cSJim Jagielski                 mpLastAddedEntry = mpScannerTask->GetLastAddedEntry();
140*b1cdbd2cSJim Jagielski                 if (mpLastAddedEntry != NULL)
141*b1cdbd2cSJim Jagielski                     eState = ADD_TEMPLATE;
142*b1cdbd2cSJim Jagielski                 else
143*b1cdbd2cSJim Jagielski                     eState = SCAN_TEMPLATE;
144*b1cdbd2cSJim Jagielski             }
145*b1cdbd2cSJim Jagielski             else
146*b1cdbd2cSJim Jagielski                 eState = SCAN_TEMPLATE;
147*b1cdbd2cSJim Jagielski         }
148*b1cdbd2cSJim Jagielski         else
149*b1cdbd2cSJim Jagielski             eState = DONE;
150*b1cdbd2cSJim Jagielski     }
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski     return eState;
153*b1cdbd2cSJim Jagielski }
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 
AddTemplate(void)158*b1cdbd2cSJim Jagielski MasterPageContainerFiller::State MasterPageContainerFiller::AddTemplate (void)
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski     if (mpLastAddedEntry != NULL)
161*b1cdbd2cSJim Jagielski     {
162*b1cdbd2cSJim Jagielski         SharedMasterPageDescriptor pDescriptor (new MasterPageDescriptor(
163*b1cdbd2cSJim Jagielski             MasterPageContainer::TEMPLATE,
164*b1cdbd2cSJim Jagielski             mnIndex,
165*b1cdbd2cSJim Jagielski             mpLastAddedEntry->msPath,
166*b1cdbd2cSJim Jagielski             mpLastAddedEntry->msTitle,
167*b1cdbd2cSJim Jagielski             String(),
168*b1cdbd2cSJim Jagielski             false,
169*b1cdbd2cSJim Jagielski             ::boost::shared_ptr<PageObjectProvider>(
170*b1cdbd2cSJim Jagielski                 new TemplatePageObjectProvider(mpLastAddedEntry->msPath)),
171*b1cdbd2cSJim Jagielski             ::boost::shared_ptr<PreviewProvider>(
172*b1cdbd2cSJim Jagielski                 new TemplatePreviewProvider(mpLastAddedEntry->msPath))));
173*b1cdbd2cSJim Jagielski         // For user supplied templates we use a different preview provider:
174*b1cdbd2cSJim Jagielski         // The preview in the document shows not only shapes on the master
175*b1cdbd2cSJim Jagielski         // page but also shapes on the foreground.  This is misleading and
176*b1cdbd2cSJim Jagielski         // therefore these previews are discarded and created directly from
177*b1cdbd2cSJim Jagielski         // the page objects.
178*b1cdbd2cSJim Jagielski         if (pDescriptor->GetURLClassification() == MasterPageDescriptor::URLCLASS_USER)
179*b1cdbd2cSJim Jagielski             pDescriptor->mpPreviewProvider = ::boost::shared_ptr<PreviewProvider>(
180*b1cdbd2cSJim Jagielski                 new PagePreviewProvider());
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski         mrContainerAdapter.PutMasterPage(pDescriptor);
183*b1cdbd2cSJim Jagielski         ++mnIndex;
184*b1cdbd2cSJim Jagielski     }
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski     return SCAN_TEMPLATE;
187*b1cdbd2cSJim Jagielski }
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski } } // end of namespace sd::sidebar
192