Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * The Contents of this file are made available subject to the terms of
5 : : * either of the following licenses
6 : : *
7 : : * - GNU Lesser General Public License Version 2.1
8 : : * - Sun Industry Standards Source License Version 1.1
9 : : *
10 : : * Sun Microsystems Inc., October, 2000
11 : : *
12 : : * GNU Lesser General Public License Version 2.1
13 : : * =============================================
14 : : * Copyright 2000 by Sun Microsystems, Inc.
15 : : * 901 San Antonio Road, Palo Alto, CA 94303, USA
16 : : *
17 : : * This library is free software; you can redistribute it and/or
18 : : * modify it under the terms of the GNU Lesser General Public
19 : : * License version 2.1, as published by the Free Software Foundation.
20 : : *
21 : : * This library is distributed in the hope that it will be useful,
22 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 : : * Lesser General Public License for more details.
25 : : *
26 : : * You should have received a copy of the GNU Lesser General Public
27 : : * License along with this library; if not, write to the Free Software
28 : : * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
29 : : * MA 02111-1307 USA
30 : : *
31 : : *
32 : : * Sun Industry Standards Source License Version 1.1
33 : : * =================================================
34 : : * The contents of this file are subject to the Sun Industry Standards
35 : : * Source License Version 1.1 (the "License"); You may not use this file
36 : : * except in compliance with the License. You may obtain a copy of the
37 : : * License at http://www.openoffice.org/license.html.
38 : : *
39 : : * Software provided under this License is provided on an "AS IS" basis,
40 : : * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
41 : : * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
42 : : * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
43 : : * See the License for the specific provisions governing your rights and
44 : : * obligations concerning the Software.
45 : : *
46 : : * The Initial Developer of the Original Code is: IBM Corporation
47 : : *
48 : : * Copyright: 2008 by IBM Corporation
49 : : *
50 : : * All Rights Reserved.
51 : : *
52 : : * Contributor(s): _______________________________________
53 : : *
54 : : *
55 : : ************************************************************************/
56 : : /**
57 : : * @file
58 : : * For LWP filter architecture prototype - TOC related object
59 : : */
60 : : /*************************************************************************
61 : : * Change History
62 : : April 2005 Created
63 : : April 2005 Modified
64 : : April 2005 Modified - add LwpTocLevelData class
65 : : ************************************************************************/
66 : : #include "lwptoc.hxx"
67 : : #include "lwpfoundry.hxx"
68 : : #include "lwpdoc.hxx"
69 : : #include "lwpframelayout.hxx"
70 : : #include "lwpglobalmgr.hxx"
71 : :
72 : : #include "xfilter/xffont.hxx"
73 : : #include "xfilter/xftextstyle.hxx"
74 : : #include "xfilter/xfstylemanager.hxx"
75 : : #include "xfilter/xfparagraph.hxx"
76 : : #include "xfilter/xfparastyle.hxx"
77 : : #include "xfilter/xfindex.hxx"
78 : : #include "xfilter/xffloatframe.hxx"
79 : : #include "xfilter/xfframestyle.hxx"
80 : : #include "xfilter/xfframe.hxx"
81 : : #include "xfilter/xftable.hxx"
82 : :
83 : 0 : LwpTocSuperLayout::LwpTocSuperLayout(LwpObjectHeader &objHdr, LwpSvStream* pStrm)
84 [ # # ][ # # ]: 0 : : LwpSuperTableLayout(objHdr, pStrm)
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # # #
# # # # ]
85 [ # # # # : 0 : {}
# # # # ]
86 : :
87 [ # # ][ # # ]: 0 : LwpTocSuperLayout::~LwpTocSuperLayout()
[ # # ][ # # ]
[ # # ][ # # ]
88 [ # # ][ # # ]: 0 : {}
[ # # ][ # # ]
[ # # ]
[ # # # # ]
89 : : /**
90 : : * @short Read TOCSUPERTABLELAYOUT object
91 : : * @return none
92 : : */
93 : 0 : void LwpTocSuperLayout::Read()
94 : : {
95 : 0 : LwpSuperTableLayout::Read();
96 : 0 : m_TextMarker.Read(m_pObjStrm);
97 : 0 : m_ParentName.Read(m_pObjStrm);
98 : 0 : m_DivisionName.Read(m_pObjStrm);
99 : 0 : m_SectionName.Read(m_pObjStrm);
100 : 0 : m_nFrom = m_pObjStrm->QuickReaduInt16();
101 : :
102 : 0 : m_SearchItems.Read(m_pObjStrm);
103 : :
104 : : sal_uInt16 i;
105 : 0 : sal_uInt16 count = m_pObjStrm->QuickReaduInt16();
106 [ # # ][ # # ]: 0 : for (i = 0; (i < MAX_LEVELS) && (count > 0); i++, count--)
[ # # ]
107 : 0 : m_DestName[i].Read(m_pObjStrm);
108 : :
109 : 0 : count = m_pObjStrm->QuickReaduInt16();
110 [ # # ][ # # ]: 0 : for (i = 0; (i < MAX_LEVELS) && (count > 0); i++, count--)
[ # # ]
111 : 0 : m_DestPGName[i].Read(m_pObjStrm);
112 : :
113 : 0 : count = m_pObjStrm->QuickReaduInt16();
114 [ # # ]: 0 : for (i = 0; i < count; i++)
115 : 0 : m_nFlags[i] = m_pObjStrm->QuickReaduInt32();
116 : :
117 : 0 : m_pObjStrm->SkipExtra();
118 : 0 : }
119 : : /**
120 : : * @short Register style of TOC
121 : : * @return none
122 : : */
123 : 0 : void LwpTocSuperLayout::RegisterStyle()
124 : : {
125 : 0 : LwpSuperTableLayout::RegisterStyle();
126 : :
127 : : // Get font info of default text style and set into tab style
128 : 0 : XFParaStyle* pBaseStyle = static_cast<XFParaStyle*>(m_pFoundry->GetStyleManager()->GetStyle(*m_pFoundry->GetDefaultTextStyle()));
129 [ # # ]: 0 : XFTextStyle*pTextStyle = new XFTextStyle;
130 : 0 : pTextStyle->SetFont(pBaseStyle->GetFont()); // who delete this font?????
131 : 0 : XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager();
132 : 0 : m_TabStyleName = pXFStyleManager->AddStyle(pTextStyle)->GetStyleName();
133 : :
134 : 0 : }
135 : : /**
136 : : * @short Convert TOC
137 : : * @param pCont - container
138 : : * @return none
139 : : */
140 : 0 : void LwpTocSuperLayout::XFConvert(XFContentContainer* pCont)
141 : : {
142 [ # # ]: 0 : XFIndex* pToc = new XFIndex();
143 : :
144 : 0 : pToc->SetProtected(sal_False);
145 : 0 : pToc->SetIndexType(enumXFIndexTOC);
146 : :
147 : : // add TOC template
148 [ # # ]: 0 : for (sal_uInt16 i = 1; i<= MAX_LEVELS; i++)
149 : : {
150 : 0 : LwpTocLevelData * pLevel = GetSearchLevelPtr(i);
151 [ # # ]: 0 : XFIndexTemplate * pTemplate = new XFIndexTemplate();
152 : :
153 [ # # ]: 0 : if(!pLevel)
154 : : {
155 : : // add an blank template so that SODC won't add default style to this level
156 [ # # ][ # # ]: 0 : pToc->AddTemplate(Int32ToOUString(i), rtl::OUString(), pTemplate);
157 : 0 : continue;
158 : : }
159 : :
160 : 0 : sal_Bool bInserted = sal_False;
161 [ # # ]: 0 : do
162 : : {
163 : : // One level has 1 template
164 [ # # ]: 0 : if (!bInserted)
165 : : {
166 : 0 : pTemplate->SetLevel(Int32ToOUString(i));
167 [ # # ]: 0 : if(pLevel->GetUseLeadingText())
168 : : {
169 [ # # ]: 0 : pTemplate->AddEntry(enumXFIndexTemplateChapter, pLevel->GetSearchStyle());
170 : : }
171 [ # # ]: 0 : if(pLevel->GetUseText())
172 : : {
173 [ # # ]: 0 : pTemplate->AddEntry(enumXFIndexTemplateText, pLevel->GetSearchStyle());
174 : : }
175 [ # # ]: 0 : if(GetUsePageNumber(i))
176 : : {
177 : 0 : sal_uInt16 nLeaderType = GetSeparatorType(i);
178 [ # # ]: 0 : if (GetRightAlignPageNumber(i))
179 : : {
180 : 0 : char cSep = ' ';
181 [ # # # # ]: 0 : switch(nLeaderType)
182 : : {
183 : : default: // go through
184 : : case NONE: // no leaders
185 : 0 : cSep = ' ';
186 : 0 : break;
187 : : case LEADERDOTS:
188 : 0 : cSep = '.';
189 : 0 : break;
190 : : case LEADERDASHES:
191 : 0 : cSep = '-';
192 : 0 : break;
193 : : case LEADERUNDERLINE:
194 : 0 : cSep = '_';
195 : 0 : break;
196 : : }
197 : :
198 [ # # ]: 0 : pTemplate->AddTabEntry(enumXFTabRight, 0, cSep, 'd', m_TabStyleName);
199 : : }
200 : : else
201 : : {
202 : : char sSep[8];
203 [ # # # ]: 0 : switch(nLeaderType)
204 : : {
205 : : default: // go through
206 : : case NONE: // no leaders
207 : 0 : strcpy(sSep, " ");
208 : 0 : break;
209 : : case SEPARATORCOMMA:
210 : 0 : strcpy(sSep, ", ");
211 : 0 : break;
212 : : case SEPARATORDOTS:
213 : 0 : strcpy(sSep, "...");
214 : 0 : break;
215 : : }
216 [ # # ]: 0 : pTemplate->AddTextEntry(A2OUSTR(sSep), m_TabStyleName);
217 : : }
218 : : //"TOC Page Number Text Style" style always exists in Word Pro file
219 [ # # ]: 0 : pTemplate->AddEntry(enumXFIndexTemplatePage, A2OUSTR("TOC Page Number Text Style"));
220 : : }
221 : :
222 [ # # ][ # # ]: 0 : pToc->AddTemplate(Int16ToOUString(i), m_pFoundry->FindActuralStyleName(pLevel->GetSearchStyle()), pTemplate);
[ # # ]
223 : 0 : bInserted = sal_True;
224 : : }
225 : :
226 : : // 1 style in WordPro may be mapped to several styles in SODC
227 : 0 : LwpDocument * pDocument = m_pFoundry->GetDocument()->GetRootDocument();
228 : 0 : AddSourceStyle(pToc, pLevel, pDocument->GetFoundry());
229 : :
230 : : // one level may have several corresponding Styles
231 : 0 : pLevel = GetNextSearchLevelPtr(i, pLevel); // find next LwpTocLevelData which is same index
232 : : }while (pLevel != NULL);
233 : : }
234 : :
235 : 0 : m_pCont = pCont;
236 : : // add TOC content
237 : 0 : LwpSuperTableLayout::XFConvert(pToc);
238 : :
239 : : // if current TOC is located in a cell, we must add a frame between upper level container and TOC
240 [ # # ]: 0 : if ( !GetContainerLayout()->IsCell() )
241 : : {
242 : 0 : pCont->Add(pToc);
243 : : }
244 : 0 : }
245 : :
246 : : /**
247 : : * @short convert frame which anchor to page
248 : : * @param pCont -
249 : : * @return
250 : : */
251 : 0 : void LwpTocSuperLayout::XFConvertFrame(XFContentContainer* pCont, sal_Int32 nStart , sal_Int32 nEnd , sal_Bool bAll)
252 : : {
253 [ # # ]: 0 : if(m_pFrame)
254 : : {
255 : 0 : XFFrame* pXFFrame = NULL;
256 [ # # ]: 0 : if(nEnd < nStart)
257 : : {
258 [ # # ]: 0 : pXFFrame = new XFFrame();
259 : : }
260 : : else
261 : : {
262 [ # # ]: 0 : pXFFrame = new XFFloatFrame(nStart, nEnd, bAll);
263 : : }
264 : :
265 : 0 : m_pFrame->Parse(pXFFrame, static_cast<sal_uInt16>(nStart));
266 : :
267 : : //parse table, and add table to frame or TOC
268 : 0 : LwpTableLayout * pTableLayout = GetTableLayout();
269 [ # # ]: 0 : if (pTableLayout)
270 : : {
271 : 0 : XFContentContainer * pTableContainer = pXFFrame;
272 : : // if *this is a TOCSuperTableLayout and it's located in a cell
273 : : // add the frame to upper level and add TOCSuperTableLayout into the frame
274 [ # # ]: 0 : if ( GetContainerLayout()->IsCell() )
275 : : {
276 : 0 : pTableContainer = pCont; // TOC contain table directly
277 : 0 : pXFFrame->Add(pCont);
278 : 0 : m_pCont->Add(pXFFrame);
279 : : }
280 : : else
281 : : {
282 : : //add frame to the container
283 : 0 : pCont ->Add(pXFFrame);
284 : : }
285 : 0 : pTableLayout->XFConvert(pTableContainer);
286 : : }
287 : : }
288 : :
289 : 0 : }
290 : :
291 : : /**
292 : : * @short Add source style into TOC
293 : : * @param pToc - TOC pointer
294 : : * @param pLevel - TOC level data
295 : : * @param pFoundry - foundry pointer
296 : : * @return sal_Bool
297 : : */
298 : 0 : void LwpTocSuperLayout::AddSourceStyle(XFIndex* pToc, LwpTocLevelData * pLevel, LwpFoundry * pFoundry)
299 : : {
300 [ # # ]: 0 : if (!pLevel)
301 : : {
302 : 0 : return;
303 : : }
304 : :
305 : 0 : OUString sLwpStyleName = pLevel->GetSearchStyle();
306 : :
307 [ # # ]: 0 : if (pFoundry)
308 : : {
309 : 0 : LwpDocument * pDoc = pFoundry->GetDocument();
310 [ # # ][ # # ]: 0 : if (pDoc && pDoc->IsChildDoc())
[ # # ]
311 : : {
312 [ # # ]: 0 : OUString sSodcStyleName = pFoundry->FindActuralStyleName(sLwpStyleName);
313 [ # # ]: 0 : pToc->AddTocSource(pLevel->GetLevel(), sSodcStyleName);
314 : : }
315 : : else
316 : : {
317 [ # # ]: 0 : pDoc = pDoc->GetFirstDivision();
318 [ # # ]: 0 : while (pDoc)
319 : : {
320 [ # # ]: 0 : AddSourceStyle(pToc, pLevel, pDoc->GetFoundry() );
321 [ # # ]: 0 : pDoc = pDoc->GetNextDivision();
322 : : }
323 : : }
324 : 0 : }
325 : : }
326 : :
327 : : /**
328 : : * @short Get whether page number is right alignment
329 : : * @param index - TOC level
330 : : * @return sal_Bool
331 : : */
332 : 0 : sal_Bool LwpTocSuperLayout::GetRightAlignPageNumber(sal_uInt16 index)
333 : : {
334 [ # # ]: 0 : if (index < MAX_LEVELS)
335 [ # # ]: 0 : return (m_nFlags[index] & TS_RIGHTALIGN) ? sal_True : sal_False;
336 : 0 : return sal_False;
337 : : }
338 : : /**
339 : : * @short Get whether page number is used in TOC entries
340 : : * @param index - TOC level
341 : : * @return sal_Bool
342 : : */
343 : 0 : sal_Bool LwpTocSuperLayout::GetUsePageNumber(sal_uInt16 index)
344 : : {
345 [ # # ]: 0 : if (index < MAX_LEVELS)
346 [ # # ]: 0 : return (m_nFlags[index] & TS_PAGENUMBER) ? sal_True : sal_False;
347 : 0 : return sal_False;
348 : : }
349 : : /**
350 : : * @short Get what is used for separater
351 : : * @param index - TOC level
352 : : * @return sal_uInt16 - separator type
353 : : */
354 : 0 : sal_uInt16 LwpTocSuperLayout::GetSeparatorType(sal_uInt16 index)
355 : : {
356 : 0 : sal_uInt16 Flag = (sal_uInt16)m_nFlags[index];
357 : :
358 [ # # ]: 0 : if (Flag & TS_LEADERDOTS)
359 : 0 : return LEADERDOTS;
360 [ # # ]: 0 : else if (Flag & TS_LEADERDASHES)
361 : 0 : return LEADERDASHES;
362 [ # # ]: 0 : else if (Flag & TS_LEADERUNDERLINE)
363 : 0 : return LEADERUNDERLINE;
364 [ # # ]: 0 : else if (Flag & TS_SEPARATORCOMMA)
365 : 0 : return SEPARATORCOMMA;
366 [ # # ]: 0 : else if (Flag & TS_SEPARATORDOTS)
367 : 0 : return SEPARATORDOTS;
368 : : else
369 : 0 : return NONE;
370 : : }
371 : :
372 : : /**
373 : : * @short Get TOCLEVELDATA obj
374 : : * @param index - TOC level
375 : : * @return LwpTocLevelData * - pointer to TOCLEVELDATA obj
376 : : */
377 : 0 : LwpTocLevelData * LwpTocSuperLayout::GetSearchLevelPtr(sal_uInt16 index)
378 : : {
379 : 0 : LwpObjectID * pID = m_SearchItems.GetHead(); // not necessary to check pID NULL or not
380 [ # # ]: 0 : LwpTocLevelData * pObj = dynamic_cast<LwpTocLevelData *>(pID->obj());
381 : :
382 [ # # ]: 0 : while(pObj)
383 : : {
384 [ # # ]: 0 : if(pObj->GetLevel()== index)
385 : : {
386 : 0 : return pObj;
387 : : }
388 : :
389 : 0 : pID = pObj->GetNext(); // not necessary to check pID NULL or not
390 [ # # ]: 0 : pObj = dynamic_cast<LwpTocLevelData *>(pID->obj());
391 : : }
392 : :
393 : 0 : return NULL;
394 : : }
395 : : /**
396 : : * @short Get next TOCLEVELDATA obj from current position
397 : : * @param index - TOC level
398 : : * @param pCurData - current LwpTocLevelData
399 : : * @return LwpTocLevelData * - pointer to TOCLEVELDATA obj
400 : : */
401 : 0 : LwpTocLevelData * LwpTocSuperLayout::GetNextSearchLevelPtr(sal_uInt16 index, LwpTocLevelData * pCurData)
402 : : {
403 : 0 : LwpObjectID * pID = pCurData->GetNext();
404 [ # # ]: 0 : LwpTocLevelData * pObj = dynamic_cast<LwpTocLevelData *>(pID->obj());
405 : :
406 [ # # ]: 0 : while(pObj)
407 : : {
408 [ # # ]: 0 : if(pObj->GetLevel()== index)
409 : : {
410 : 0 : return pObj;
411 : : }
412 : :
413 : 0 : pID = pObj->GetNext(); // not necessary to check pID NULL or not
414 [ # # ]: 0 : pObj = dynamic_cast<LwpTocLevelData *>(pID->obj());
415 : : }
416 : :
417 : 0 : return NULL;
418 : : }
419 : :
420 [ # # ]: 0 : LwpTocLevelData::LwpTocLevelData(LwpObjectHeader &objHdr, LwpSvStream* pStrm):LwpDLVList(objHdr, pStrm)
421 : : {
422 : 0 : m_nFlags = 0;
423 : 0 : m_nLevel = 0;
424 : 0 : }
425 [ # # ]: 0 : LwpTocLevelData::~LwpTocLevelData()
426 : : {
427 [ # # ]: 0 : }
428 : : /**
429 : : * @short Register style
430 : : * @param
431 : : * @return
432 : : */
433 : 0 : void LwpTocLevelData::RegisterStyle()
434 : : {
435 : 0 : }
436 : : /**
437 : : * @short Convert
438 : : * @param pCont - container
439 : : * @return none
440 : : */
441 : 0 : void LwpTocLevelData::XFConvert(XFContentContainer* /*pCont*/)
442 : : {
443 : 0 : }
444 : : /**
445 : : * @short Read TOCLEVELDATA obj
446 : : * @param
447 : : * @return
448 : : */
449 : 0 : void LwpTocLevelData::Read()
450 : : {
451 : 0 : LwpDLVList::Read();
452 : 0 : m_nFlags = m_pObjStrm->QuickReaduInt16();
453 : 0 : m_nLevel = m_pObjStrm->QuickReaduInt16();
454 : 0 : m_SearchName.Read(m_pObjStrm);
455 : :
456 : 0 : m_pObjStrm->SkipExtra();
457 : 0 : }
458 : :
459 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|