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