1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_scui.hxx"
26 
27 
28 
29 
30 //------------------------------------------------------------------
31 
32 #define _TPHFEDIT_CXX
33 #include "scitems.hxx"
34 #include <editeng/eeitem.hxx>
35 
36 //CHINA001 #include <svx/chardlg.hxx>
37 #include <editeng/editobj.hxx>
38 #include <editeng/editstat.hxx>
39 #include <editeng/editview.hxx>
40 #include <editeng/flditem.hxx>
41 #include <sfx2/basedlgs.hxx>
42 #include <sfx2/objsh.hxx>
43 #include <vcl/msgbox.hxx>
44 #include <vcl/svapp.hxx>
45 #include <unotools/useroptions.hxx>
46 #define _SVSTDARR_USHORTS
47 #include <svl/svstdarr.hxx>
48 
49 //CHINA001 #include "tphfedit.hxx"
50 #include "editutil.hxx"
51 #include "global.hxx"
52 #include "attrib.hxx"
53 #include "patattr.hxx"
54 #include "scresid.hxx"
55 #include "sc.hrc"
56 #include "globstr.hrc"
57 #include "tabvwsh.hxx"
58 #include "prevwsh.hxx"
59 #include "hfedtdlg.hrc"
60 #include "textdlgs.hxx"
61 #include "AccessibleEditObject.hxx"
62 
63 #include "scuitphfedit.hxx" //CHINA001
64 #include <memory> // header file for auto_ptr
65 
66 // STATIC DATA -----------------------------------------------------------
67 
68 static sal_uInt16 pPageRightHeaderRanges[] = { SID_SCATTR_PAGE_HEADERRIGHT,
69 										   SID_SCATTR_PAGE_HEADERRIGHT,
70 										   0 };
71 
72 static sal_uInt16 pPageRightFooterRanges[] = { SID_SCATTR_PAGE_FOOTERRIGHT,
73 										   SID_SCATTR_PAGE_FOOTERRIGHT,
74 										   0 };
75 
76 static sal_uInt16 pPageLeftHeaderRanges[] =  { SID_SCATTR_PAGE_HEADERLEFT,
77 										   SID_SCATTR_PAGE_HEADERLEFT,
78 										   0 };
79 
80 static sal_uInt16 pPageLeftFooterRanges[] =  { SID_SCATTR_PAGE_FOOTERLEFT,
81 										   SID_SCATTR_PAGE_FOOTERLEFT,
82 										   0 };
83 
84 
85 static ScEditWindow* pActiveEdWnd = NULL;
86 
87 
88 //========================================================================
89 // class ScHFEditPage
90 //
91 
ScHFEditPage(Window * pParent,sal_uInt16 nResId,const SfxItemSet & rCoreAttrs,sal_uInt16 nWhichId,bool bHeader)92 ScHFEditPage::ScHFEditPage( Window* 			pParent,
93 							sal_uInt16				nResId,
94 							const SfxItemSet&	rCoreAttrs,
95 							sal_uInt16				nWhichId,
96 							bool bHeader  )
97 
98 	:	SfxTabPage		( pParent, ScResId( nResId ), rCoreAttrs ),
99 
100 		aFtLeft 		( this, ScResId( FT_LEFT ) ),
101 		aWndLeft		( this, ScResId( WND_LEFT ), Left ),
102 		aFtCenter		( this, ScResId( FT_CENTER ) ),
103 		aWndCenter		( this, ScResId( WND_CENTER ), Center ),
104 		aFtRight		( this, ScResId( FT_RIGHT ) ),
105 		aWndRight		( this, ScResId( WND_RIGHT ), Right ),
106 		maFtDefinedHF		( this, ScResId( FT_HF_DEFINED ) ),
107 		maLbDefined		( this, ScResId( LB_DEFINED ) ),
108 		maFtCustomHF		( this, ScResId( FT_HF_CUSTOM ) ),
109 		aBtnText		( this, ScResId( BTN_TEXT ) ),
110 		aBtnFile		( this, ScResId( BTN_FILE ) ),
111 		aBtnTable		( this, ScResId( BTN_TABLE ) ),
112 		aBtnPage		( this, ScResId( BTN_PAGE ) ),
113 		aBtnLastPage	( this, ScResId( BTN_PAGES ) ),
114 		aBtnDate		( this, ScResId( BTN_DATE ) ),
115 		aBtnTime		( this, ScResId( BTN_TIME ) ),
116 		aFlInfo 		( this, ScResId( FL_INFO ) ),
117 		aFtInfo 		( this, ScResId( FT_INFO ) ),
118 		aPopUpFile		( ScResId( RID_POPUP_FCOMMAND) ),
119 		nWhich			( nWhichId )
120 {
121 	//!	use default style from current document?
122 	//!	if font color is used, header/footer background color must be set
123 
124 	ScPatternAttr	aPatAttr( rCoreAttrs.GetPool() );
125 
126 
127 	aBtnFile.SetPopupMenu(&aPopUpFile);
128 
129 	maLbDefined.SetSelectHdl( LINK( this, ScHFEditPage, ListHdl_Impl ) );
130 	aBtnFile.SetMenuHdl( LINK( this, ScHFEditPage, MenuHdl ) );
131 	aBtnText	.SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
132 	aBtnPage	.SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
133 	aBtnLastPage.SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
134 	aBtnDate	.SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
135 	aBtnTime	.SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
136 	aBtnFile	.SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
137 	aBtnTable	.SetClickHdl( LINK( this, ScHFEditPage, ClickHdl ) );
138 
139     aBtnText    .SetModeImage( Image( ScResId( IMG_TEXT_H  ) ), BMP_COLOR_HIGHCONTRAST );
140     aBtnFile    .SetModeImage( Image( ScResId( IMG_FILE_H  ) ), BMP_COLOR_HIGHCONTRAST );
141     aBtnTable   .SetModeImage( Image( ScResId( IMG_TABLE_H ) ), BMP_COLOR_HIGHCONTRAST );
142     aBtnPage    .SetModeImage( Image( ScResId( IMG_PAGE_H  ) ), BMP_COLOR_HIGHCONTRAST );
143     aBtnLastPage.SetModeImage( Image( ScResId( IMG_PAGES_H ) ), BMP_COLOR_HIGHCONTRAST );
144     aBtnDate    .SetModeImage( Image( ScResId( IMG_DATE_H  ) ), BMP_COLOR_HIGHCONTRAST );
145     aBtnTime    .SetModeImage( Image( ScResId( IMG_TIME_H  ) ), BMP_COLOR_HIGHCONTRAST );
146 
147     if(!bHeader)
148     {
149         maFtDefinedHF.SetText(ScGlobal::GetRscString( STR_FOOTER ));
150         maFtCustomHF.SetText(ScGlobal::GetRscString( STR_HF_CUSTOM_FOOTER ));
151     }
152 	if( Application::GetSettings().GetLayoutRTL() )
153 	{
154 		Point pt1 = aWndLeft.GetPosPixel();
155 		Point pt2 = aWndRight.GetPosPixel();
156 		aWndLeft.SetPosPixel(pt2);
157 		aWndRight.SetPosPixel(pt1);
158 
159 		pt1 = aFtLeft.GetPosPixel();
160 		pt2 = aFtRight.GetPosPixel();
161 		aFtLeft.SetPosPixel(pt2);
162 		aFtRight.SetPosPixel(pt1);
163 	}
164 	aWndLeft.	SetFont( aPatAttr );
165 	aWndCenter. SetFont( aPatAttr );
166 	aWndRight.	SetFont( aPatAttr );
167 
168 	aWndLeft.SetObjectSelectHdl( LINK(this,ScHFEditPage,ObjectSelectHdl) );
169 	aWndCenter.SetObjectSelectHdl( LINK(this,ScHFEditPage,ObjectSelectHdl) );
170 	aWndRight.SetObjectSelectHdl( LINK(this,ScHFEditPage,ObjectSelectHdl) );
171 	aBtnText.SetAccessibleRelationMemberOf( &maFtCustomHF );
172 	aBtnFile.SetAccessibleRelationMemberOf( &maFtCustomHF );
173 	aBtnTable.SetAccessibleRelationMemberOf( &maFtCustomHF );
174 	aBtnPage.SetAccessibleRelationMemberOf( &maFtCustomHF );
175 	aBtnLastPage.SetAccessibleRelationMemberOf( &maFtCustomHF );
176 	aBtnDate.SetAccessibleRelationMemberOf( &maFtCustomHF );
177 	aBtnTime.SetAccessibleRelationMemberOf( &maFtCustomHF );
178 	FillCmdArr();
179 
180 	aWndLeft.GrabFocus();
181 
182 	InitPreDefinedList();
183 
184 	FreeResource();
185 }
IMPL_LINK(ScHFEditPage,ObjectSelectHdl,ScEditWindow *,pEdit)186     IMPL_LINK( ScHFEditPage, ObjectSelectHdl, ScEditWindow*, pEdit )
187 	{
188 		(void)pEdit;
189 	    aBtnText.GrabFocus();
190 	    return NULL;
191 	}
192 
193 // -----------------------------------------------------------------------
194 
~ScHFEditPage()195 __EXPORT ScHFEditPage::~ScHFEditPage()
196 {
197 }
198 
SetNumType(SvxNumType eNumType)199 void ScHFEditPage::SetNumType(SvxNumType eNumType)
200 {
201 	aWndLeft.SetNumType(eNumType);
202 	aWndCenter.SetNumType(eNumType);
203 	aWndRight.SetNumType(eNumType);
204 }
205 
206 // -----------------------------------------------------------------------
207 
208 #define IS_AVAILABLE(w)(rCoreSet.GetItemState( (w) ) >= SFX_ITEM_AVAILABLE)
209 
Reset(const SfxItemSet & rCoreSet)210 void __EXPORT ScHFEditPage::Reset( const SfxItemSet& rCoreSet )
211 {
212 	if ( IS_AVAILABLE( nWhich ) )
213 	{
214 		const ScPageHFItem& rItem = (const ScPageHFItem&)(rCoreSet.Get( nWhich ));
215 
216         if( const EditTextObject* pLeft = rItem.GetLeftArea() )
217             aWndLeft.SetText( *pLeft );
218         if( const EditTextObject* pCenter = rItem.GetCenterArea() )
219             aWndCenter.SetText( *pCenter );
220         if( const EditTextObject* pRight = rItem.GetRightArea() )
221             aWndRight.SetText( *pRight );
222 
223 		SetSelectDefinedList();
224 	}
225 }
226 
227 #undef IS_AVAILABLE
228 
229 // -----------------------------------------------------------------------
230 
FillItemSet(SfxItemSet & rCoreSet)231 sal_Bool __EXPORT ScHFEditPage::FillItemSet( SfxItemSet& rCoreSet )
232 {
233 	ScPageHFItem	aItem( nWhich );
234 	EditTextObject* pLeft	= aWndLeft	.CreateTextObject();
235 	EditTextObject* pCenter = aWndCenter.CreateTextObject();
236 	EditTextObject* pRight	= aWndRight .CreateTextObject();
237 
238 	aItem.SetLeftArea  ( *pLeft );
239 	aItem.SetCenterArea( *pCenter );
240 	aItem.SetRightArea ( *pRight );
241 	delete pLeft;
242 	delete pCenter;
243 	delete pRight;
244 
245 	rCoreSet.Put( aItem );
246 
247 	return sal_True;
248 }
249 
250 // -----------------------------------------------------------------------
251 
252 #define SET_CMD(i,id) \
253 	aCmd  = aDel;							\
254 	aCmd += ScGlobal::GetRscString( id );	\
255 	aCmd += aDel;							\
256 	aCmdArr[i] = aCmd;
257 
258 // -----------------------------------------------------------------------
259 
FillCmdArr()260 void ScHFEditPage::FillCmdArr()
261 {
262 	String aDel( ScGlobal::GetRscString( STR_HFCMD_DELIMITER ) );
263 	String aCmd;
264 
265 	SET_CMD( 0, STR_HFCMD_PAGE )
266 	SET_CMD( 1, STR_HFCMD_PAGES )
267 	SET_CMD( 2, STR_HFCMD_DATE )
268 	SET_CMD( 3, STR_HFCMD_TIME )
269 	SET_CMD( 4, STR_HFCMD_FILE )
270 	SET_CMD( 5, STR_HFCMD_TABLE )
271 }
272 
273 #undef SET_CMD
274 
InitPreDefinedList()275 void ScHFEditPage::InitPreDefinedList()
276 {
277     SvtUserOptions aUserOpt;
278 
279     Color* pTxtColour = NULL;
280     Color* pFldColour = NULL;
281 
282     // Get the all field values at the outset.
283     String aPageFieldValue(aWndLeft.GetEditEngine()->CalcFieldValue(SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD), 0,0, pTxtColour, pFldColour));
284     String aSheetFieldValue(aWndLeft.GetEditEngine()->CalcFieldValue(SvxFieldItem(SvxTableField(), EE_FEATURE_FIELD), 0,0, pTxtColour, pFldColour));
285     String aFileFieldValue(aWndLeft.GetEditEngine()->CalcFieldValue(SvxFieldItem(SvxFileField(), EE_FEATURE_FIELD), 0,0, pTxtColour, pFldColour));
286     String aExtFileFieldValue(aWndLeft.GetEditEngine()->CalcFieldValue(SvxFieldItem(SvxExtFileField(), EE_FEATURE_FIELD), 0,0, pTxtColour, pFldColour));
287     String aDateFieldValue(aWndLeft.GetEditEngine()->CalcFieldValue(SvxFieldItem(SvxDateField(), EE_FEATURE_FIELD), 0,0, pTxtColour, pFldColour));
288 
289     maLbDefined.Clear();
290 
291     maLbDefined.InsertEntry( ScGlobal::GetRscString( STR_HF_NONE_IN_BRACKETS ));
292 
293     String aPageEntry(ScGlobal::GetRscString( STR_PAGE ) );
294     aPageEntry += ' ';
295     aPageEntry += aPageFieldValue;
296     maLbDefined.InsertEntry(aPageEntry);
297 
298     String aPageOfEntry(aPageEntry);
299     aPageOfEntry += ' ';
300     aPageOfEntry += ScGlobal::GetRscString( STR_HF_OF_QUESTION );
301     maLbDefined.InsertEntry( aPageOfEntry);
302 
303     maLbDefined.InsertEntry(aSheetFieldValue);
304 
305     String aConfidentialEntry(aUserOpt.GetCompany());
306     aConfidentialEntry += ' ';
307     aConfidentialEntry += ScGlobal::GetRscString( STR_HF_CONFIDENTIAL );
308     aConfidentialEntry.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
309     aConfidentialEntry += aDateFieldValue;
310     aConfidentialEntry.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
311     aConfidentialEntry += aPageEntry;
312     maLbDefined.InsertEntry( aConfidentialEntry);
313 
314     String aFileNamePageEntry(aFileFieldValue);
315     aFileNamePageEntry.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
316     aFileNamePageEntry += aPageEntry;
317     maLbDefined.InsertEntry( aFileNamePageEntry);
318 
319     maLbDefined.InsertEntry( aExtFileFieldValue);
320 
321     String aPageSheetNameEntry(aPageEntry);
322     aPageSheetNameEntry.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
323     aPageSheetNameEntry += aSheetFieldValue;
324     maLbDefined.InsertEntry( aPageSheetNameEntry);
325 
326     String aPageFileNameEntry(aPageEntry);
327     aPageFileNameEntry.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
328     aPageFileNameEntry += aFileFieldValue;
329     maLbDefined.InsertEntry( aPageFileNameEntry);
330 
331     String aPagePathNameEntry(aPageEntry);
332     aPagePathNameEntry.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
333     aPagePathNameEntry += aExtFileFieldValue;
334     maLbDefined.InsertEntry( aPagePathNameEntry);
335 
336     String aUserNameEntry(aUserOpt.GetFirstName());
337     aUserNameEntry += ' ';
338     aUserNameEntry += (String)aUserOpt.GetLastName();
339     aUserNameEntry.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
340     aUserNameEntry += aPageEntry;
341     aUserNameEntry.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
342     aUserNameEntry += aDateFieldValue;
343     maLbDefined.InsertEntry( aUserNameEntry);
344 
345     String aCreatedByEntry(ScGlobal::GetRscString( STR_HF_CREATED_BY ) );
346     aCreatedByEntry += ' ';
347     aCreatedByEntry += (String)aUserOpt.GetFirstName();
348     aCreatedByEntry += ' ';
349     aCreatedByEntry += (String)aUserOpt.GetLastName();
350     aCreatedByEntry.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
351     aCreatedByEntry += aDateFieldValue;
352     aCreatedByEntry.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
353     aCreatedByEntry += aPageEntry;
354     maLbDefined.InsertEntry( aCreatedByEntry);
355 }
356 
InsertToDefinedList()357 void ScHFEditPage::InsertToDefinedList()
358 {
359     sal_uInt16 nCount =  maLbDefined.GetEntryCount();
360     if(nCount == eEntryCount)
361     {
362         String aCustomizedEntry(ScGlobal::GetRscString( STR_HF_CUSTOMIZED ) );
363         maLbDefined.InsertEntry( aCustomizedEntry);
364         maLbDefined.SelectEntryPos(eEntryCount);
365     }
366 }
367 
RemoveFromDefinedList()368 void ScHFEditPage::RemoveFromDefinedList()
369 {
370     sal_uInt16 nCount =  maLbDefined.GetEntryCount();
371     if(nCount > eEntryCount )
372         maLbDefined.RemoveEntry( nCount-1);
373 }
374 
375 // determine if the header/footer exists in our predefined list and set select to it.
SetSelectDefinedList()376 void ScHFEditPage::SetSelectDefinedList()
377 {
378     SvtUserOptions aUserOpt;
379 
380     // default to customized
381     ScHFEntryId eSelectEntry = eEntryCount;
382 
383     ::std::auto_ptr< EditTextObject > pLeftObj;
384     ::std::auto_ptr< EditTextObject > pCenterObj;
385     ::std::auto_ptr< EditTextObject > pRightObj;
386 
387     XubString aLeftEntry;
388     XubString aCenterEntry;
389     XubString aRightEntry;
390 
391     pLeftObj.reset(aWndLeft.GetEditEngine()->CreateTextObject());
392     pCenterObj.reset(aWndCenter.GetEditEngine()->CreateTextObject());
393     pRightObj.reset(aWndRight.GetEditEngine()->CreateTextObject());
394 
395     bool bFound = false;
396 
397     sal_uInt16 i;
398     sal_uInt16 nCount =  maLbDefined.GetEntryCount();
399     for(i = 0; i < nCount && !bFound; i++)
400     {
401         switch(static_cast<ScHFEntryId>(i))
402         {
403             case eNoneEntry:
404             {
405                 aLeftEntry = pLeftObj->GetText(0);
406                 aCenterEntry = pCenterObj->GetText(0);
407                 aRightEntry = pRightObj->GetText(0);
408                 if(aLeftEntry == EMPTY_STRING && aCenterEntry == EMPTY_STRING
409                     && aRightEntry == EMPTY_STRING)
410                 {
411                     eSelectEntry = eNoneEntry;
412                     bFound = true;
413                 }
414             }
415             break;
416 
417             case ePageEntry:
418             {
419                 aLeftEntry = pLeftObj->GetText(0);
420                 aRightEntry = pRightObj->GetText(0);
421                 if(aLeftEntry == EMPTY_STRING && aRightEntry == EMPTY_STRING)
422                 {
423                     if(IsPageEntry(aWndCenter.GetEditEngine(), pCenterObj.get()))
424                     {
425                         eSelectEntry = ePageEntry;
426                         bFound = true;
427                     }
428                 }
429             }
430             break;
431 
432 
433             //TODO
434             case ePagesEntry:
435             {
436             }
437             break;
438 
439             case eSheetEntry:
440             {
441                 aLeftEntry = pLeftObj->GetText(0);
442                 aRightEntry = pRightObj->GetText(0);
443                 if(aLeftEntry == EMPTY_STRING && aRightEntry == EMPTY_STRING)
444                 {
445                     if(pCenterObj->IsFieldObject())
446                     {
447                         const SvxFieldItem* pFieldItem = pCenterObj->GetField();
448                         if(pFieldItem)
449                         {
450                             const SvxFieldData* pField = pFieldItem->GetField();
451                             if(pField && pField->ISA(SvxTableField))
452                             {
453                                 eSelectEntry = eSheetEntry;
454                                 bFound = true;
455                             }
456                         }
457                     }
458                 }
459             }
460             break;
461 
462             case eConfidentialEntry:
463             {
464                 if(IsDateEntry(pCenterObj.get()) && IsPageEntry(aWndRight.GetEditEngine(), pRightObj.get()))
465                 {
466                     String aConfidentialEntry(aUserOpt.GetCompany());
467                     aConfidentialEntry += ' ';
468                     aConfidentialEntry += ScGlobal::GetRscString( STR_HF_CONFIDENTIAL );
469                     if(aConfidentialEntry == aWndLeft.GetEditEngine()->GetText(0))
470                     {
471                         eSelectEntry = eConfidentialEntry;
472                         bFound = true;
473                     }
474                 }
475             }
476             break;
477 
478             //TODO
479             case eFileNamePageEntry:
480             {
481             }
482             break;
483 
484             case eExtFileNameEntry:
485             {
486                 aLeftEntry = pLeftObj->GetText(0);
487                 aRightEntry = pRightObj->GetText(0);
488                 if(IsExtFileNameEntry(pCenterObj.get()) && aLeftEntry == EMPTY_STRING
489                     && aRightEntry == EMPTY_STRING)
490                 {
491                     eSelectEntry = eExtFileNameEntry;
492                     bFound = true;
493                 }
494             }
495             break;
496 
497             //TODO
498             case ePageSheetEntry:
499             {
500             }
501             break;
502 
503             //TODO
504             case ePageFileNameEntry:
505             {
506             }
507             break;
508 
509             case ePageExtFileNameEntry:
510             {
511                 aLeftEntry = pLeftObj->GetText(0);
512                 if(IsPageEntry(aWndCenter.GetEditEngine(), pCenterObj.get()) &&
513                     IsExtFileNameEntry(pRightObj.get()) && aLeftEntry == EMPTY_STRING)
514                 {
515                     eSelectEntry = ePageExtFileNameEntry;
516                     bFound = true;
517                 }
518             }
519             break;
520 
521             case eUserNameEntry:
522             {
523                 if(IsDateEntry(pRightObj.get()) && IsPageEntry(aWndCenter.GetEditEngine(), pCenterObj.get()))
524                 {
525                     String aUserNameEntry(aUserOpt.GetFirstName());
526                     aUserNameEntry += ' ';
527                     aUserNameEntry += (String)aUserOpt.GetLastName();
528                     if(aUserNameEntry == aWndLeft.GetEditEngine()->GetText(0))
529                     {
530                         eSelectEntry = eUserNameEntry;
531                         bFound = true;
532                     }
533                 }
534             }
535             break;
536 
537             case eCreatedByEntry:
538             {
539                 if(IsDateEntry(pCenterObj.get()) && IsPageEntry(aWndRight.GetEditEngine(), pRightObj.get()))
540                 {
541                     String aCreatedByEntry(ScGlobal::GetRscString( STR_HF_CREATED_BY ) );
542                     aCreatedByEntry += ' ';
543                     aCreatedByEntry += (String)aUserOpt.GetFirstName();
544                     aCreatedByEntry += ' ';
545                     aCreatedByEntry += (String)aUserOpt.GetLastName();
546                     if(aCreatedByEntry == aWndLeft.GetEditEngine()->GetText(0))
547                     {
548                         eSelectEntry = eCreatedByEntry;
549                         bFound = true;
550                     }
551                 }
552             }
553             break;
554 
555             default:
556             {
557                 // added to avoid warnings
558             }
559         }
560     }
561 
562     if(eSelectEntry == eEntryCount)
563         InsertToDefinedList();
564 
565     maLbDefined.SelectEntryPos( sal::static_int_cast<sal_uInt16>( eSelectEntry ) );
566 }
567 
IsPageEntry(EditEngine * pEngine,EditTextObject * pTextObj)568 bool ScHFEditPage::IsPageEntry(EditEngine*pEngine, EditTextObject* pTextObj)
569 {
570     if(!pEngine && !pTextObj)
571         return false;
572 
573     bool bReturn = false;
574 
575     if(!pTextObj->IsFieldObject())
576     {
577         SvUShorts aPosList;
578         pEngine->GetPortions(0,aPosList);
579         if(aPosList.Count() == 2)
580         {
581             String aPageEntry(ScGlobal::GetRscString( STR_PAGE ) );
582             aPageEntry += ' ';
583             ESelection aSel(0,0,0,0);
584             aSel.nEndPos = aPageEntry.Len();
585             if(aPageEntry == pEngine->GetText(aSel))
586             {
587                 aSel.nStartPos = aSel.nEndPos;
588                 aSel.nEndPos++;
589                 ::std::auto_ptr< EditTextObject > pPageObj;
590                 pPageObj.reset(pEngine->CreateTextObject(aSel));
591                 if(pPageObj.get() && pPageObj->IsFieldObject() )
592                 {
593                     const SvxFieldItem* pFieldItem = pPageObj->GetField();
594                     if(pFieldItem)
595                     {
596                         const SvxFieldData* pField = pFieldItem->GetField();
597                         if(pField && pField->ISA(SvxPageField))
598                             bReturn = true;
599                     }
600                 }
601             }
602         }
603     }
604     return bReturn;
605 }
606 
IsDateEntry(EditTextObject * pTextObj)607 bool ScHFEditPage::IsDateEntry(EditTextObject* pTextObj)
608 {
609     if(!pTextObj)
610         return false;
611 
612     bool bReturn = false;
613     if(pTextObj->IsFieldObject())
614     {
615         const SvxFieldItem* pFieldItem = pTextObj->GetField();
616         if(pFieldItem)
617         {
618             const SvxFieldData* pField = pFieldItem->GetField();
619             if(pField && pField->ISA(SvxDateField))
620                 bReturn = true;
621         }
622     }
623     return bReturn;
624 }
625 
IsExtFileNameEntry(EditTextObject * pTextObj)626 bool ScHFEditPage::IsExtFileNameEntry(EditTextObject* pTextObj)
627 {
628     if(!pTextObj)
629         return false;
630     bool bReturn = false;
631     if(pTextObj->IsFieldObject())
632     {
633         const SvxFieldItem* pFieldItem = pTextObj->GetField();
634         if(pFieldItem)
635 	{
636             const SvxFieldData* pField = pFieldItem->GetField();
637             if(pField && pField->ISA(SvxExtFileField))
638                 bReturn = true;
639         }
640     }
641     return bReturn;
642 }
643 
ProcessDefinedListSel(ScHFEntryId eSel,bool bTravelling)644 void ScHFEditPage::ProcessDefinedListSel(ScHFEntryId eSel, bool bTravelling)
645 {
646     SvtUserOptions aUserOpt;
647     ::std::auto_ptr< EditTextObject > pTextObj;
648 
649     switch(eSel)
650     {
651         case eNoneEntry:
652             ClearTextAreas();
653             if(!bTravelling)
654                 aWndLeft.GrabFocus();
655         break;
656 
657         case ePageEntry:
658         {
659             ClearTextAreas();
660             String aPageEntry(ScGlobal::GetRscString( STR_PAGE ) );
661             aPageEntry += ' ';
662             aWndCenter.GetEditEngine()->SetText(aPageEntry);
663             aWndCenter.InsertField( SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD) );
664             if(!bTravelling)
665                 aWndCenter.GrabFocus();
666         }
667         break;
668 
669         case ePagesEntry:
670         {
671             ClearTextAreas();
672             ESelection aSel(0,0,0,0);
673             String aPageEntry(ScGlobal::GetRscString( STR_PAGE ) );
674             aPageEntry += ' ';
675             aWndCenter.GetEditEngine()->SetText(aPageEntry);
676             aSel.nEndPos = aPageEntry.Len();
677             aWndCenter.GetEditEngine()->QuickInsertField(SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
678             ++aSel.nEndPos;
679             String aPageOfEntry = ' ';
680             aPageOfEntry += ScGlobal::GetRscString( STR_HF_OF );
681             aPageOfEntry += ' ';
682             aWndCenter.GetEditEngine()->QuickInsertText(aPageOfEntry,ESelection(aSel.nEndPara,aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
683             aSel.nEndPos = sal::static_int_cast<xub_StrLen>( aSel.nEndPos + aPageOfEntry.Len() );
684             aWndCenter.GetEditEngine()->QuickInsertField(SvxFieldItem(SvxPagesField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara,aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
685             pTextObj.reset(aWndCenter.GetEditEngine()->CreateTextObject());
686             aWndCenter.SetText(*pTextObj);
687             XubString aEntry(pTextObj.get()->GetText(0));
688             if(!bTravelling)
689                 aWndCenter.GrabFocus();
690         }
691         break;
692 
693         case eSheetEntry:
694             ClearTextAreas();
695             aWndCenter.InsertField( SvxFieldItem(SvxTableField(), EE_FEATURE_FIELD) );
696             if(!bTravelling)
697                 aWndCenter.GrabFocus();
698         break;
699 
700         case eConfidentialEntry:
701         {
702             ClearTextAreas();
703             String aConfidentialEntry(aUserOpt.GetCompany());
704             aConfidentialEntry += ' ';
705             aConfidentialEntry += ScGlobal::GetRscString( STR_HF_CONFIDENTIAL );
706             aWndLeft.GetEditEngine()->SetText(aConfidentialEntry);
707             aWndCenter.InsertField( SvxFieldItem(SvxDateField(Date(),SVXDATETYPE_VAR), EE_FEATURE_FIELD) );
708             String aPageEntry(ScGlobal::GetRscString( STR_PAGE ) );
709             aPageEntry += ' ';
710             aWndRight.GetEditEngine()->SetText(aPageEntry);
711             aWndRight.InsertField( SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD) );
712             if(!bTravelling)
713                 aWndRight.GrabFocus();
714         }
715         break;
716 
717         case eFileNamePageEntry:
718         {
719             ClearTextAreas();
720             ESelection aSel(0,0,0,0);
721             aWndCenter.GetEditEngine()->QuickInsertField(SvxFieldItem( SvxFileField(), EE_FEATURE_FIELD ), aSel );
722             ++aSel.nEndPos;
723             String aPageEntry(RTL_CONSTASCII_STRINGPARAM(", "));
724             aPageEntry += ScGlobal::GetRscString( STR_PAGE ) ;
725             aPageEntry += ' ';
726             aWndCenter.GetEditEngine()->QuickInsertText(aPageEntry, ESelection(aSel.nEndPara,aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
727             aSel.nStartPos = aSel.nEndPos;
728             aSel.nEndPos = sal::static_int_cast<xub_StrLen>( aSel.nEndPos + aPageEntry.Len() );
729             aWndCenter.GetEditEngine()->QuickInsertField(SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara,aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
730             pTextObj.reset(aWndCenter.GetEditEngine()->CreateTextObject());
731             aWndCenter.SetText(*pTextObj);
732             XubString aEntry2(pTextObj.get()->GetText(0));
733             if(!bTravelling)
734                 aWndCenter.GrabFocus();
735         }
736         break;
737 
738         case eExtFileNameEntry:
739             ClearTextAreas();
740             aWndCenter.InsertField( SvxFieldItem( SvxExtFileField(
741                 EMPTY_STRING, SVXFILETYPE_VAR, SVXFILEFORMAT_FULLPATH ), EE_FEATURE_FIELD ) );
742             if(!bTravelling)
743                 aWndCenter.GrabFocus();
744         break;
745 
746         case ePageSheetEntry:
747         {
748             ClearTextAreas();
749             ESelection aSel(0,0,0,0);
750             String aPageEntry(ScGlobal::GetRscString( STR_PAGE ) );
751             aPageEntry += ' ';
752             aWndCenter.GetEditEngine()->SetText(aPageEntry);
753             aSel.nEndPos = aPageEntry.Len();
754             aWndCenter.GetEditEngine()->QuickInsertField(SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
755             ++aSel.nEndPos;
756             String aCommaSpace(RTL_CONSTASCII_STRINGPARAM(", "));
757             aWndCenter.GetEditEngine()->QuickInsertText(aCommaSpace,ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
758             aSel.nEndPos = sal::static_int_cast<xub_StrLen>( aSel.nEndPos + aCommaSpace.Len() );
759             aWndCenter.GetEditEngine()->QuickInsertField( SvxFieldItem(SvxTableField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
760             pTextObj.reset(aWndCenter.GetEditEngine()->CreateTextObject());
761             aWndCenter.SetText(*pTextObj);
762             if(!bTravelling)
763                 aWndCenter.GrabFocus();
764         }
765         break;
766 
767         case ePageFileNameEntry:
768         {
769             ClearTextAreas();
770             ESelection aSel(0,0,0,0);
771             String aPageEntry(ScGlobal::GetRscString( STR_PAGE ) );
772             aPageEntry += ' ';
773             aWndCenter.GetEditEngine()->SetText(aPageEntry);
774             aSel.nEndPos = aPageEntry.Len();
775             aWndCenter.GetEditEngine()->QuickInsertField(SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
776             ++aSel.nEndPos;
777             String aCommaSpace(RTL_CONSTASCII_STRINGPARAM(", "));
778             aWndCenter.GetEditEngine()->QuickInsertText(aCommaSpace,ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
779             aSel.nEndPos = sal::static_int_cast<xub_StrLen>( aSel.nEndPos + aCommaSpace.Len() );
780             aWndCenter.GetEditEngine()->QuickInsertField( SvxFieldItem(SvxFileField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
781             pTextObj.reset(aWndCenter.GetEditEngine()->CreateTextObject());
782             aWndCenter.SetText(*pTextObj);
783             if(!bTravelling)
784                 aWndCenter.GrabFocus();
785         }
786         break;
787 
788         case ePageExtFileNameEntry:
789         {
790             ClearTextAreas();
791             String aPageEntry(ScGlobal::GetRscString( STR_PAGE ) );
792             aPageEntry += ' ';
793             aWndCenter.GetEditEngine()->SetText(aPageEntry);
794             aWndCenter.InsertField( SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD) );
795             aWndRight.InsertField( SvxFieldItem( SvxExtFileField(
796                 EMPTY_STRING, SVXFILETYPE_VAR, SVXFILEFORMAT_FULLPATH ), EE_FEATURE_FIELD ) );
797             if(!bTravelling)
798                 aWndRight.GrabFocus();
799         }
800         break;
801 
802         case eUserNameEntry:
803         {
804             ClearTextAreas();
805             String aUserNameEntry(aUserOpt.GetFirstName());
806             aUserNameEntry += ' ';
807             aUserNameEntry += (String)aUserOpt.GetLastName();
808             aWndLeft.GetEditEngine()->SetText(aUserNameEntry);
809             String aPageEntry(ScGlobal::GetRscString( STR_PAGE ) );
810             aPageEntry += ' ';
811             aWndCenter.GetEditEngine()->SetText(aPageEntry);
812             aWndCenter.InsertField( SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD) );
813             aWndRight.InsertField( SvxFieldItem(SvxDateField(Date(),SVXDATETYPE_VAR), EE_FEATURE_FIELD) );
814             if(!bTravelling)
815                 aWndRight.GrabFocus();
816         }
817         break;
818 
819         case eCreatedByEntry:
820         {
821             ClearTextAreas();
822             String aCreatedByEntry(ScGlobal::GetRscString( STR_HF_CREATED_BY ) );
823             aCreatedByEntry += ' ';
824             aCreatedByEntry += (String)aUserOpt.GetFirstName();
825             aCreatedByEntry += ' ';
826             aCreatedByEntry += (String)aUserOpt.GetLastName();
827             aWndLeft.GetEditEngine()->SetText(aCreatedByEntry);
828             aWndCenter.InsertField( SvxFieldItem(SvxDateField(Date(),SVXDATETYPE_VAR), EE_FEATURE_FIELD) );
829             String aPageEntry(ScGlobal::GetRscString( STR_PAGE ) );
830             aPageEntry += ' ';
831             aWndRight.GetEditEngine()->SetText(aPageEntry);
832             aWndRight.InsertField( SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD) );
833             if(!bTravelling)
834                 aWndRight.GrabFocus();
835         }
836         break;
837 
838         default :
839             break;
840     }
841 }
842 
ClearTextAreas()843 void ScHFEditPage::ClearTextAreas()
844 {
845     aWndLeft.GetEditEngine()->SetText(EMPTY_STRING);
846     aWndLeft.Invalidate();
847     aWndCenter.GetEditEngine()->SetText(EMPTY_STRING);
848     aWndCenter.Invalidate();
849     aWndRight.GetEditEngine()->SetText(EMPTY_STRING);
850     aWndRight.Invalidate();
851 }
852 
853 //-----------------------------------------------------------------------
854 // Handler:
855 //-----------------------------------------------------------------------
856 
IMPL_LINK(ScHFEditPage,ListHdl_Impl,ListBox *,pList)857 IMPL_LINK( ScHFEditPage, ListHdl_Impl, ListBox*, pList )
858 {
859     if ( pList && pList == &maLbDefined )
860     {
861         ScHFEntryId eSel = static_cast<ScHFEntryId>(maLbDefined.GetSelectEntryPos());
862         if(!maLbDefined.IsTravelSelect())
863         {
864             ProcessDefinedListSel(eSel);
865 
866             // check if we need to remove the customized entry.
867             if(eSel < eEntryCount)
868                 RemoveFromDefinedList();
869         }
870         else
871         {
872             ProcessDefinedListSel(eSel, true);
873         }
874     }
875     return 0;
876 }
877 
IMPL_LINK(ScHFEditPage,ClickHdl,ImageButton *,pBtn)878 IMPL_LINK( ScHFEditPage, ClickHdl, ImageButton*, pBtn )
879 {
880 	pActiveEdWnd = ::GetScEditWindow(); //CHINA001
881 	if ( !pActiveEdWnd )
882 		return 0;
883 
884 	if ( pBtn == &aBtnText )
885 	{
886 		pActiveEdWnd->SetCharAttriutes();
887 	}
888 	else
889 	{
890 		if ( pBtn == &aBtnPage )
891             pActiveEdWnd->InsertField( SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD) );
892 		else if ( pBtn == &aBtnLastPage )
893             pActiveEdWnd->InsertField( SvxFieldItem(SvxPagesField(), EE_FEATURE_FIELD) );
894 		else if ( pBtn == &aBtnDate )
895             pActiveEdWnd->InsertField( SvxFieldItem(SvxDateField(Date(),SVXDATETYPE_VAR), EE_FEATURE_FIELD) );
896 		else if ( pBtn == &aBtnTime )
897             pActiveEdWnd->InsertField( SvxFieldItem(SvxTimeField(), EE_FEATURE_FIELD) );
898 		else if ( pBtn == &aBtnFile )
899 		{
900             pActiveEdWnd->InsertField( SvxFieldItem( SvxFileField(), EE_FEATURE_FIELD ) );
901 		}
902 		else if ( pBtn == &aBtnTable )
903             pActiveEdWnd->InsertField( SvxFieldItem(SvxTableField(), EE_FEATURE_FIELD) );
904 	}
905 	InsertToDefinedList();
906 	pActiveEdWnd->GrabFocus();
907 
908 	return 0;
909 }
910 
IMPL_LINK(ScHFEditPage,MenuHdl,ScExtIButton *,pBtn)911 IMPL_LINK( ScHFEditPage, MenuHdl, ScExtIButton*, pBtn )
912 {
913 	pActiveEdWnd = ::GetScEditWindow(); //CHINA001
914 	if ( !pActiveEdWnd )
915 		return 0;
916 
917 	if(pBtn!=NULL)
918 	{
919 		switch(pBtn->GetSelected())
920 		{
921 			case FILE_COMMAND_TITEL:
922                 pActiveEdWnd->InsertField( SvxFieldItem( SvxFileField(), EE_FEATURE_FIELD ) );
923 				break;
924 			case FILE_COMMAND_FILENAME:
925 				pActiveEdWnd->InsertField( SvxFieldItem( SvxExtFileField(
926                         EMPTY_STRING, SVXFILETYPE_VAR, SVXFILEFORMAT_NAME_EXT ), EE_FEATURE_FIELD ) );
927 				break;
928 			case FILE_COMMAND_PATH:
929 				pActiveEdWnd->InsertField( SvxFieldItem( SvxExtFileField(
930                         EMPTY_STRING, SVXFILETYPE_VAR, SVXFILEFORMAT_FULLPATH ), EE_FEATURE_FIELD ) );
931 				break;
932 		}
933 	}
934 	return 0;
935 }
936 
937 //========================================================================
938 // class ScRightHeaderEditPage
939 //========================================================================
940 
ScRightHeaderEditPage(Window * pParent,const SfxItemSet & rCoreSet)941 ScRightHeaderEditPage::ScRightHeaderEditPage( Window* pParent, const SfxItemSet& rCoreSet )
942 	: ScHFEditPage( pParent, RID_SCPAGE_HFED_HR, rCoreSet,
943 					rCoreSet.GetPool()->GetWhich(SID_SCATTR_PAGE_HEADERRIGHT ), true )
944 	{}
945 
946 // -----------------------------------------------------------------------
947 
GetRanges()948 sal_uInt16* __EXPORT ScRightHeaderEditPage::GetRanges()
949 	{ return pPageRightHeaderRanges; }
950 
951 // -----------------------------------------------------------------------
952 
Create(Window * pParent,const SfxItemSet & rCoreSet)953 SfxTabPage* __EXPORT ScRightHeaderEditPage::Create( Window* pParent, const SfxItemSet& rCoreSet )
954 	{ return ( new ScRightHeaderEditPage( pParent, rCoreSet ) ); };
955 
956 
957 //========================================================================
958 // class ScLeftHeaderEditPage
959 //========================================================================
960 
ScLeftHeaderEditPage(Window * pParent,const SfxItemSet & rCoreSet)961 ScLeftHeaderEditPage::ScLeftHeaderEditPage( Window* pParent, const SfxItemSet& rCoreSet )
962 	: ScHFEditPage( pParent, RID_SCPAGE_HFED_HL, rCoreSet,
963 					rCoreSet.GetPool()->GetWhich(SID_SCATTR_PAGE_HEADERLEFT ), true )
964 	{}
965 
966 // -----------------------------------------------------------------------
967 
GetRanges()968 sal_uInt16* __EXPORT ScLeftHeaderEditPage::GetRanges()
969 	{ return pPageLeftHeaderRanges; }
970 
971 // -----------------------------------------------------------------------
972 
Create(Window * pParent,const SfxItemSet & rCoreSet)973 SfxTabPage* __EXPORT ScLeftHeaderEditPage::Create( Window* pParent, const SfxItemSet& rCoreSet )
974 	{ return ( new ScLeftHeaderEditPage( pParent, rCoreSet ) ); };
975 
976 //========================================================================
977 // class ScRightFooterEditPage
978 //========================================================================
979 
ScRightFooterEditPage(Window * pParent,const SfxItemSet & rCoreSet)980 ScRightFooterEditPage::ScRightFooterEditPage( Window* pParent, const SfxItemSet& rCoreSet )
981 	: ScHFEditPage( pParent, RID_SCPAGE_HFED_FR, rCoreSet,
982 					rCoreSet.GetPool()->GetWhich(SID_SCATTR_PAGE_FOOTERRIGHT ), false )
983 	{}
984 
985 // -----------------------------------------------------------------------
986 
GetRanges()987 sal_uInt16* __EXPORT ScRightFooterEditPage::GetRanges()
988 	{ return pPageRightFooterRanges; }
989 
990 // -----------------------------------------------------------------------
991 
Create(Window * pParent,const SfxItemSet & rCoreSet)992 SfxTabPage* __EXPORT ScRightFooterEditPage::Create( Window* pParent, const SfxItemSet& rCoreSet )
993 	{ return ( new ScRightFooterEditPage( pParent, rCoreSet ) ); };
994 
995 //========================================================================
996 // class ScLeftFooterEditPage
997 //========================================================================
998 
ScLeftFooterEditPage(Window * pParent,const SfxItemSet & rCoreSet)999 ScLeftFooterEditPage::ScLeftFooterEditPage( Window* pParent, const SfxItemSet& rCoreSet )
1000 	: ScHFEditPage( pParent, RID_SCPAGE_HFED_FL, rCoreSet,
1001 					rCoreSet.GetPool()->GetWhich(SID_SCATTR_PAGE_FOOTERLEFT ), false )
1002 	{}
1003 
1004 // -----------------------------------------------------------------------
1005 
GetRanges()1006 sal_uInt16* __EXPORT ScLeftFooterEditPage::GetRanges()
1007 	{ return pPageLeftFooterRanges; }
1008 
1009 // -----------------------------------------------------------------------
1010 
Create(Window * pParent,const SfxItemSet & rCoreSet)1011 SfxTabPage* __EXPORT ScLeftFooterEditPage::Create( Window* pParent, const SfxItemSet& rCoreSet )
1012 	{ return ( new ScLeftFooterEditPage( pParent, rCoreSet ) ); };
1013