nss: upgrade to release 3.73
[LibreOffice.git] / sc / source / ui / pagedlg / scuitphfedit.cxx
blob6567f06b239c7fb8a8aefe1bc52fa5aec3ab0b73
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #undef SC_DLLIMPLEMENTATION
22 #include <scitems.hxx>
23 #include <editeng/eeitem.hxx>
25 #include <editeng/editobj.hxx>
26 #include <editeng/flditem.hxx>
27 #include <osl/time.h>
28 #include <sfx2/tabdlg.hxx>
29 #include <vcl/settings.hxx>
31 #include <unotools/useroptions.hxx>
33 #include <editutil.hxx>
34 #include <global.hxx>
35 #include <attrib.hxx>
36 #include <patattr.hxx>
38 #include <scuitphfedit.hxx>
39 #include <memory>
42 ScHFEditPage::ScHFEditPage(weld::Container* pPage, weld::DialogController* pController,
43 const SfxItemSet& rCoreAttrs,
44 sal_uInt16 nWhichId,
45 bool bHeader)
46 : SfxTabPage(pPage, pController, "modules/scalc/ui/headerfootercontent.ui", "HeaderFooterContent", &rCoreAttrs)
47 , nWhich( nWhichId )
48 , m_bDropDownActive(false)
49 , m_nTimeToggled(-1)
50 , m_xFtDefinedHF(m_xBuilder->weld_label(!bHeader ? "labelFT_F_DEFINED" : "labelFT_H_DEFINED"))
51 , m_xLbDefined(m_xBuilder->weld_combo_box("comboLB_DEFINED"))
52 , m_xFtCustomHF(m_xBuilder->weld_label(!bHeader ? "labelFT_F_CUSTOM" : "labelFT_H_CUSTOM"))
53 , m_xBtnText(m_xBuilder->weld_button("buttonBTN_TEXT"))
54 , m_xBtnFile(m_xBuilder->weld_menu_button("buttonBTN_FILE"))
55 , m_xBtnTable(m_xBuilder->weld_button("buttonBTN_TABLE"))
56 , m_xBtnPage(m_xBuilder->weld_button("buttonBTN_PAGE"))
57 , m_xBtnLastPage(m_xBuilder->weld_button("buttonBTN_PAGES"))
58 , m_xBtnDate(m_xBuilder->weld_button("buttonBTN_DATE"))
59 , m_xBtnTime(m_xBuilder->weld_button("buttonBTN_TIME"))
60 , m_xFtConfidential(m_xBuilder->weld_label("labelSTR_HF_CONFIDENTIAL"))
61 , m_xFtPage(m_xBuilder->weld_label("labelSTR_PAGE"))
62 , m_xFtOfQuestion(m_xBuilder->weld_label("labelSTR_HF_OF_QUESTION"))
63 , m_xFtOf(m_xBuilder->weld_label("labelSTR_HF_OF"))
64 , m_xFtNone(m_xBuilder->weld_label("labelSTR_HF_NONE_IN_BRACKETS"))
65 , m_xFtCreatedBy(m_xBuilder->weld_label("labelSTR_HF_CREATED_BY"))
66 , m_xFtCustomized(m_xBuilder->weld_label("labelSTR_HF_CUSTOMIZED"))
67 , m_xLeft(m_xBuilder->weld_widget("labelFT_LEFT"))
68 , m_xRight(m_xBuilder->weld_widget("labelFT_RIGHT"))
69 , m_xWndLeft(new ScEditWindow(Left, pController->getDialog()))
70 , m_xWndCenter(new ScEditWindow(Center, pController->getDialog()))
71 , m_xWndRight(new ScEditWindow(Right, pController->getDialog()))
72 , m_xWndLeftWnd(new weld::CustomWeld(*m_xBuilder, "textviewWND_LEFT", *m_xWndLeft))
73 , m_xWndCenterWnd(new weld::CustomWeld(*m_xBuilder, "textviewWND_CENTER", *m_xWndCenter))
74 , m_xWndRightWnd(new weld::CustomWeld(*m_xBuilder, "textviewWND_RIGHT", *m_xWndRight))
75 , m_pEditFocus(nullptr)
77 // tdf#114695 override natural size with a small value
78 // we expect this to get stretched to some larger but
79 // limited size based on surrounding widgets
80 m_xLbDefined->set_size_request(m_xLbDefined->get_approximate_digit_width() * 20, -1);
82 //! use default style from current document?
83 //! if font color is used, header/footer background color must be set
85 ScPatternAttr aPatAttr( rCoreAttrs.GetPool() );
87 m_xLbDefined->connect_popup_toggled( LINK( this, ScHFEditPage, ListToggleHdl_Impl) );
88 m_xLbDefined->connect_changed( LINK( this, ScHFEditPage, ListHdl_Impl ) );
89 m_xBtnFile->connect_selected( LINK( this, ScHFEditPage, MenuHdl ) );
90 m_xBtnText->connect_clicked( LINK( this, ScHFEditPage, ClickHdl ) );
91 m_xBtnPage->connect_clicked( LINK( this, ScHFEditPage, ClickHdl ) );
92 m_xBtnLastPage->connect_clicked( LINK( this, ScHFEditPage, ClickHdl ) );
93 m_xBtnDate->connect_clicked( LINK( this, ScHFEditPage, ClickHdl ) );
94 m_xBtnTime->connect_clicked( LINK( this, ScHFEditPage, ClickHdl ) );
95 m_xBtnTable->connect_clicked( LINK( this, ScHFEditPage, ClickHdl ) );
97 m_xFtDefinedHF->show();
98 m_xFtCustomHF->show();
100 //swap left/right areas and their labels in RTL mode
101 if( AllSettings::GetLayoutRTL() )
103 sal_Int32 nOldLeftAttach = m_xLeft->get_grid_left_attach();
104 sal_Int32 nOldRightAttach = m_xRight->get_grid_left_attach();
105 m_xLeft->set_grid_left_attach(nOldRightAttach);
106 m_xRight->set_grid_left_attach(nOldLeftAttach);
108 nOldLeftAttach = m_xWndLeftWnd->get_grid_left_attach();
109 nOldRightAttach = m_xWndRightWnd->get_grid_left_attach();
110 m_xWndLeftWnd->set_grid_left_attach(nOldRightAttach);
111 m_xWndRightWnd->set_grid_left_attach(nOldLeftAttach);
113 m_xWndLeft->SetFont( aPatAttr );
114 m_xWndCenter->SetFont( aPatAttr );
115 m_xWndRight->SetFont( aPatAttr );
117 m_xWndLeft->SetObjectSelectHdl( LINK(this,ScHFEditPage,ObjectSelectHdl) );
118 m_xWndCenter->SetObjectSelectHdl( LINK(this,ScHFEditPage,ObjectSelectHdl) );
119 m_xWndRight->SetObjectSelectHdl( LINK(this,ScHFEditPage,ObjectSelectHdl) );
120 auto setEditFocus = [this](ScEditWindow & rEdit) { this->m_pEditFocus = &rEdit; };
121 m_xWndLeft->SetGetFocusHdl(setEditFocus);
122 m_xWndCenter->SetGetFocusHdl(setEditFocus);
123 m_xWndRight->SetGetFocusHdl(setEditFocus);
125 m_xWndLeft->GrabFocus();
126 m_pEditFocus = m_xWndLeft.get(); // there's no event from grab_focus()
128 InitPreDefinedList();
132 IMPL_LINK_NOARG( ScHFEditPage, ObjectSelectHdl, ScEditWindow&, void )
134 m_xBtnText->grab_focus();
137 ScHFEditPage::~ScHFEditPage()
141 void ScHFEditPage::SetNumType(SvxNumType eNumType)
143 m_xWndLeft->SetNumType(eNumType);
144 m_xWndCenter->SetNumType(eNumType);
145 m_xWndRight->SetNumType(eNumType);
148 void ScHFEditPage::Reset( const SfxItemSet* rCoreSet )
150 const SfxPoolItem* pItem = nullptr;
151 if ( !rCoreSet->HasItem(nWhich, &pItem) )
152 return;
154 const ScPageHFItem& rItem = static_cast<const ScPageHFItem&>(*pItem);
156 if( const EditTextObject* pLeft = rItem.GetLeftArea() )
157 m_xWndLeft->SetText( *pLeft );
158 if( const EditTextObject* pCenter = rItem.GetCenterArea() )
159 m_xWndCenter->SetText( *pCenter );
160 if( const EditTextObject* pRight = rItem.GetRightArea() )
161 m_xWndRight->SetText( *pRight );
163 SetSelectDefinedList();
166 bool ScHFEditPage::FillItemSet( SfxItemSet* rCoreSet )
168 ScPageHFItem aItem( nWhich );
169 std::unique_ptr<EditTextObject> pLeft = m_xWndLeft->CreateTextObject();
170 std::unique_ptr<EditTextObject> pCenter = m_xWndCenter->CreateTextObject();
171 std::unique_ptr<EditTextObject> pRight = m_xWndRight->CreateTextObject();
173 aItem.SetLeftArea ( *pLeft );
174 aItem.SetCenterArea( *pCenter );
175 aItem.SetRightArea ( *pRight );
177 rCoreSet->Put( aItem );
179 return true;
182 void ScHFEditPage::InitPreDefinedList()
184 SvtUserOptions aUserOpt;
186 std::optional<Color> pTxtColour;
187 std::optional<Color> pFldColour;
189 // Get the all field values at the outset.
190 OUString aPageFieldValue(m_xWndLeft->GetEditEngine()->CalcFieldValue(SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD), 0,0, pTxtColour, pFldColour));
191 OUString aSheetFieldValue(m_xWndLeft->GetEditEngine()->CalcFieldValue(SvxFieldItem(SvxTableField(), EE_FEATURE_FIELD), 0,0, pTxtColour, pFldColour));
192 OUString aFileFieldValue(m_xWndLeft->GetEditEngine()->CalcFieldValue(SvxFieldItem(SvxFileField(), EE_FEATURE_FIELD), 0,0, pTxtColour, pFldColour));
193 OUString aExtFileFieldValue(m_xWndLeft->GetEditEngine()->CalcFieldValue(SvxFieldItem(SvxExtFileField(), EE_FEATURE_FIELD), 0,0, pTxtColour, pFldColour));
194 OUString aDateFieldValue(m_xWndLeft->GetEditEngine()->CalcFieldValue(SvxFieldItem(SvxDateField(), EE_FEATURE_FIELD), 0,0, pTxtColour, pFldColour));
196 m_xLbDefined->clear();
198 m_xLbDefined->append_text(m_xFtNone->get_label());
200 OUString aPageEntry(m_xFtPage->get_label() + " " + aPageFieldValue);
201 m_xLbDefined->append_text(aPageEntry);
203 OUString aPageOfEntry(aPageEntry + " " + m_xFtOfQuestion->get_label());
204 m_xLbDefined->append_text( aPageOfEntry);
206 m_xLbDefined->append_text(aSheetFieldValue);
208 OUString aConfidentialEntry(aUserOpt.GetCompany() + " " + m_xFtConfidential->get_label() + ", " + aDateFieldValue + ", " + aPageEntry);
209 m_xLbDefined->append_text( aConfidentialEntry);
211 OUString aFileNamePageEntry(aFileFieldValue + ", " + aPageEntry);
212 m_xLbDefined->append_text( aFileNamePageEntry);
214 m_xLbDefined->append_text( aExtFileFieldValue);
216 OUString aPageSheetNameEntry(aPageEntry + ", " + aSheetFieldValue);
217 m_xLbDefined->append_text( aPageSheetNameEntry);
219 OUString aPageFileNameEntry(aPageEntry + ", " + aFileFieldValue);
220 m_xLbDefined->append_text( aPageFileNameEntry);
222 OUString aPagePathNameEntry(aPageEntry + ", " + aExtFileFieldValue);
223 m_xLbDefined->append_text( aPagePathNameEntry);
225 OUString aUserNameEntry(aUserOpt.GetFirstName() + " " + aUserOpt.GetLastName() + ", " + aPageEntry + ", " + aDateFieldValue);
226 m_xLbDefined->append_text( aUserNameEntry);
228 OUString aCreatedByEntry = m_xFtCreatedBy->get_label() + " " + aUserOpt.GetFirstName() + " " + aUserOpt.GetLastName() + ", " +
229 aDateFieldValue + ", " + aPageEntry;
230 m_xLbDefined->append_text( aCreatedByEntry);
233 void ScHFEditPage::InsertToDefinedList()
235 const sal_Int32 nCount = m_xLbDefined->get_count();
236 if(nCount == eEntryCount)
238 m_xLbDefined->append_text( m_xFtCustomized->get_label() );
239 m_xLbDefined->set_active(eEntryCount);
243 void ScHFEditPage::RemoveFromDefinedList()
245 const sal_Int32 nCount = m_xLbDefined->get_count();
246 if(nCount > eEntryCount )
247 m_xLbDefined->remove( nCount-1);
250 // determine if the header/footer exists in our predefined list and set select to it.
251 void ScHFEditPage::SetSelectDefinedList()
253 SvtUserOptions aUserOpt;
255 // default to customized
256 ScHFEntryId eSelectEntry = eEntryCount;
258 std::unique_ptr< EditTextObject > pLeftObj;
259 std::unique_ptr< EditTextObject > pCenterObj;
260 std::unique_ptr< EditTextObject > pRightObj;
262 OUString aLeftEntry;
263 OUString aCenterEntry;
264 OUString aRightEntry;
266 pLeftObj = m_xWndLeft->GetEditEngine()->CreateTextObject();
267 pCenterObj = m_xWndCenter->GetEditEngine()->CreateTextObject();
268 pRightObj = m_xWndRight->GetEditEngine()->CreateTextObject();
270 bool bFound = false;
272 const sal_Int32 nCount = m_xLbDefined->get_count();
273 for(sal_Int32 i = 0; i < nCount && !bFound; ++i)
275 switch(static_cast<ScHFEntryId>(i))
277 case eNoneEntry:
279 aLeftEntry = pLeftObj->GetText(0);
280 aCenterEntry = pCenterObj->GetText(0);
281 aRightEntry = pRightObj->GetText(0);
282 if(aLeftEntry == EMPTY_OUSTRING && aCenterEntry == EMPTY_OUSTRING
283 && aRightEntry == EMPTY_OUSTRING)
285 eSelectEntry = eNoneEntry;
286 bFound = true;
289 break;
291 case ePageEntry:
293 aLeftEntry = pLeftObj->GetText(0);
294 aRightEntry = pRightObj->GetText(0);
295 if(aLeftEntry == EMPTY_OUSTRING && aRightEntry == EMPTY_OUSTRING)
297 if(IsPageEntry(m_xWndCenter->GetEditEngine(), pCenterObj.get()))
299 eSelectEntry = ePageEntry;
300 bFound = true;
304 break;
306 //TODO
307 case ePagesEntry:
310 break;
312 case eSheetEntry:
314 aLeftEntry = pLeftObj->GetText(0);
315 aRightEntry = pRightObj->GetText(0);
316 if(aLeftEntry == EMPTY_OUSTRING && aRightEntry == EMPTY_OUSTRING)
318 if(pCenterObj->IsFieldObject())
320 const SvxFieldItem* pFieldItem = pCenterObj->GetField();
321 if(pFieldItem)
323 const SvxFieldData* pField = pFieldItem->GetField();
324 if(dynamic_cast<const SvxTableField*>( pField))
326 eSelectEntry = eSheetEntry;
327 bFound = true;
333 break;
335 case eConfidentialEntry:
337 if(IsDateEntry(pCenterObj.get()) && IsPageEntry(m_xWndRight->GetEditEngine(), pRightObj.get()))
339 OUString aConfidentialEntry(aUserOpt.GetCompany() + " " + m_xFtConfidential->get_label());
340 if(aConfidentialEntry == m_xWndLeft->GetEditEngine()->GetText(0))
342 eSelectEntry = eConfidentialEntry;
343 bFound = true;
347 break;
349 //TODO
350 case eFileNamePageEntry:
353 break;
355 case eExtFileNameEntry:
357 aLeftEntry = pLeftObj->GetText(0);
358 aRightEntry = pRightObj->GetText(0);
359 if(IsExtFileNameEntry(pCenterObj.get()) && aLeftEntry == EMPTY_OUSTRING
360 && aRightEntry == EMPTY_OUSTRING)
362 eSelectEntry = eExtFileNameEntry;
363 bFound = true;
366 break;
368 //TODO
369 case ePageSheetEntry:
372 break;
374 //TODO
375 case ePageFileNameEntry:
378 break;
380 case ePageExtFileNameEntry:
382 aLeftEntry = pLeftObj->GetText(0);
383 if(IsPageEntry(m_xWndCenter->GetEditEngine(), pCenterObj.get()) &&
384 IsExtFileNameEntry(pRightObj.get()) && aLeftEntry == EMPTY_OUSTRING)
386 eSelectEntry = ePageExtFileNameEntry;
387 bFound = true;
390 break;
392 case eUserNameEntry:
394 if(IsDateEntry(pRightObj.get()) && IsPageEntry(m_xWndCenter->GetEditEngine(), pCenterObj.get()))
396 OUString aUserNameEntry(aUserOpt.GetFirstName() + " " + aUserOpt.GetLastName());
398 if(aUserNameEntry == m_xWndLeft->GetEditEngine()->GetText(0))
400 eSelectEntry = eUserNameEntry;
401 bFound = true;
405 break;
407 case eCreatedByEntry:
409 if(IsDateEntry(pCenterObj.get()) && IsPageEntry(m_xWndRight->GetEditEngine(), pRightObj.get()))
411 OUString aCreatedByEntry(m_xFtCreatedBy->get_label() + " " + aUserOpt.GetFirstName() + " " + aUserOpt.GetLastName());
413 if(aCreatedByEntry == m_xWndLeft->GetEditEngine()->GetText(0))
415 eSelectEntry = eCreatedByEntry;
416 bFound = true;
420 break;
422 default:
424 // added to avoid warnings
429 if(eSelectEntry == eEntryCount)
430 InsertToDefinedList();
432 m_xLbDefined->set_active( sal::static_int_cast<sal_uInt16>( eSelectEntry ) );
435 bool ScHFEditPage::IsPageEntry(EditEngine*pEngine, const EditTextObject* pTextObj)
437 if(!pEngine || !pTextObj)
438 return false;
440 bool bReturn = false;
442 if(!pTextObj->IsFieldObject())
444 std::vector<sal_Int32> aPosList;
445 pEngine->GetPortions(0,aPosList);
446 if(aPosList.size() == 2)
448 OUString aPageEntry(m_xFtPage->get_label() + " ");
449 ESelection aSel(0,0,0,0);
450 aSel.nEndPos = aPageEntry.getLength();
451 if(aPageEntry == pEngine->GetText(aSel))
453 aSel.nStartPos = aSel.nEndPos;
454 aSel.nEndPos++;
455 std::unique_ptr< EditTextObject > pPageObj = pEngine->CreateTextObject(aSel);
456 if(pPageObj && pPageObj->IsFieldObject() )
458 const SvxFieldItem* pFieldItem = pPageObj->GetField();
459 if(pFieldItem)
461 const SvxFieldData* pField = pFieldItem->GetField();
462 if(dynamic_cast<const SvxPageField*>( pField))
463 bReturn = true;
469 return bReturn;
472 bool ScHFEditPage::IsDateEntry(const EditTextObject* pTextObj)
474 if(!pTextObj)
475 return false;
477 bool bReturn = false;
478 if(pTextObj->IsFieldObject())
480 const SvxFieldItem* pFieldItem = pTextObj->GetField();
481 if(pFieldItem)
483 const SvxFieldData* pField = pFieldItem->GetField();
484 if(dynamic_cast<const SvxDateField*>( pField))
485 bReturn = true;
488 return bReturn;
491 bool ScHFEditPage::IsExtFileNameEntry(const EditTextObject* pTextObj)
493 if(!pTextObj)
494 return false;
495 bool bReturn = false;
496 if(pTextObj->IsFieldObject())
498 const SvxFieldItem* pFieldItem = pTextObj->GetField();
499 if(pFieldItem)
501 const SvxFieldData* pField = pFieldItem->GetField();
502 if(dynamic_cast<const SvxExtFileField*>( pField))
503 bReturn = true;
506 return bReturn;
509 void ScHFEditPage::ProcessDefinedListSel(ScHFEntryId eSel, bool bTravelling)
511 SvtUserOptions aUserOpt;
512 std::unique_ptr< EditTextObject > pTextObj;
514 switch(eSel)
516 case eNoneEntry:
517 ClearTextAreas();
518 if(!bTravelling)
519 m_xWndLeft->GrabFocus();
520 break;
522 case ePageEntry:
524 ClearTextAreas();
525 OUString aPageEntry( m_xFtPage->get_label() + " " );
526 m_xWndCenter->GetEditEngine()->SetTextCurrentDefaults(aPageEntry);
527 m_xWndCenter->InsertField( SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD) );
528 if(!bTravelling)
529 m_xWndCenter->GrabFocus();
531 break;
533 case ePagesEntry:
535 ClearTextAreas();
536 ESelection aSel(0,0,0,0);
537 OUString aPageEntry( m_xFtPage->get_label() + " ");
538 m_xWndCenter->GetEditEngine()->SetTextCurrentDefaults(aPageEntry);
539 aSel.nEndPos = aPageEntry.getLength();
540 m_xWndCenter->GetEditEngine()->QuickInsertField(SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
541 ++aSel.nEndPos;
543 OUString aPageOfEntry(" " + m_xFtOf->get_label() + " ");
544 m_xWndCenter->GetEditEngine()->QuickInsertText(aPageOfEntry,ESelection(aSel.nEndPara,aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
545 aSel.nEndPos = aSel.nEndPos + aPageOfEntry.getLength();
546 m_xWndCenter->GetEditEngine()->QuickInsertField(SvxFieldItem(SvxPagesField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara,aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
547 pTextObj = m_xWndCenter->GetEditEngine()->CreateTextObject();
548 m_xWndCenter->SetText(*pTextObj);
549 if(!bTravelling)
550 m_xWndCenter->GrabFocus();
552 break;
554 case eSheetEntry:
555 ClearTextAreas();
556 m_xWndCenter->InsertField( SvxFieldItem(SvxTableField(), EE_FEATURE_FIELD) );
557 if(!bTravelling)
558 m_xWndCenter->GrabFocus();
559 break;
561 case eConfidentialEntry:
563 ClearTextAreas();
564 OUString aConfidentialEntry(aUserOpt.GetCompany() + " " + m_xFtConfidential->get_label());
565 m_xWndLeft->GetEditEngine()->SetTextCurrentDefaults(aConfidentialEntry);
566 m_xWndCenter->InsertField( SvxFieldItem(SvxDateField(Date( Date::SYSTEM ),SvxDateType::Var), EE_FEATURE_FIELD) );
568 OUString aPageEntry( m_xFtPage->get_label() + " ");
569 m_xWndRight->GetEditEngine()->SetTextCurrentDefaults(aPageEntry);
570 m_xWndRight->InsertField( SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD) );
571 if(!bTravelling)
572 m_xWndRight->GrabFocus();
574 break;
576 case eFileNamePageEntry:
578 ClearTextAreas();
579 ESelection aSel(0,0,0,0);
580 m_xWndCenter->GetEditEngine()->QuickInsertField(SvxFieldItem( SvxFileField(), EE_FEATURE_FIELD ), aSel );
581 ++aSel.nEndPos;
582 OUString aPageEntry(", " + m_xFtPage->get_label() + " ");
583 m_xWndCenter->GetEditEngine()->QuickInsertText(aPageEntry, ESelection(aSel.nEndPara,aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
584 aSel.nStartPos = aSel.nEndPos;
585 aSel.nEndPos = aSel.nEndPos + aPageEntry.getLength();
586 m_xWndCenter->GetEditEngine()->QuickInsertField(SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara,aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
587 pTextObj = m_xWndCenter->GetEditEngine()->CreateTextObject();
588 m_xWndCenter->SetText(*pTextObj);
589 if(!bTravelling)
590 m_xWndCenter->GrabFocus();
592 break;
594 case eExtFileNameEntry:
595 ClearTextAreas();
596 m_xWndCenter->InsertField( SvxFieldItem( SvxExtFileField(
597 EMPTY_OUSTRING, SvxFileType::Var, SvxFileFormat::PathFull ), EE_FEATURE_FIELD ) );
598 if(!bTravelling)
599 m_xWndCenter->GrabFocus();
600 break;
602 case ePageSheetEntry:
604 ClearTextAreas();
605 ESelection aSel(0,0,0,0);
606 OUString aPageEntry( m_xFtPage->get_label() + " " );
607 m_xWndCenter->GetEditEngine()->SetTextCurrentDefaults(aPageEntry);
608 aSel.nEndPos = aPageEntry.getLength();
609 m_xWndCenter->GetEditEngine()->QuickInsertField(SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
610 ++aSel.nEndPos;
612 OUString aCommaSpace(", ");
613 m_xWndCenter->GetEditEngine()->QuickInsertText(aCommaSpace,ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
614 aSel.nEndPos = aSel.nEndPos + aCommaSpace.getLength();
615 m_xWndCenter->GetEditEngine()->QuickInsertField( SvxFieldItem(SvxTableField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
616 pTextObj = m_xWndCenter->GetEditEngine()->CreateTextObject();
617 m_xWndCenter->SetText(*pTextObj);
618 if(!bTravelling)
619 m_xWndCenter->GrabFocus();
621 break;
623 case ePageFileNameEntry:
625 ClearTextAreas();
626 ESelection aSel(0,0,0,0);
627 OUString aPageEntry( m_xFtPage->get_label() + " " );
628 m_xWndCenter->GetEditEngine()->SetTextCurrentDefaults(aPageEntry);
629 aSel.nEndPos = aPageEntry.getLength();
630 m_xWndCenter->GetEditEngine()->QuickInsertField(SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
631 ++aSel.nEndPos;
632 OUString aCommaSpace(", ");
633 m_xWndCenter->GetEditEngine()->QuickInsertText(aCommaSpace,ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
634 aSel.nEndPos = aSel.nEndPos + aCommaSpace.getLength();
635 m_xWndCenter->GetEditEngine()->QuickInsertField( SvxFieldItem(SvxFileField(), EE_FEATURE_FIELD), ESelection(aSel.nEndPara, aSel.nEndPos, aSel.nEndPara, aSel.nEndPos));
636 pTextObj = m_xWndCenter->GetEditEngine()->CreateTextObject();
637 m_xWndCenter->SetText(*pTextObj);
638 if(!bTravelling)
639 m_xWndCenter->GrabFocus();
641 break;
643 case ePageExtFileNameEntry:
645 ClearTextAreas();
646 OUString aPageEntry( m_xFtPage->get_label() + " " );
647 m_xWndCenter->GetEditEngine()->SetTextCurrentDefaults(aPageEntry);
648 m_xWndCenter->InsertField( SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD) );
649 m_xWndRight->InsertField( SvxFieldItem( SvxExtFileField(
650 EMPTY_OUSTRING, SvxFileType::Var, SvxFileFormat::PathFull ), EE_FEATURE_FIELD ) );
651 if(!bTravelling)
652 m_xWndRight->GrabFocus();
654 break;
656 case eUserNameEntry:
658 ClearTextAreas();
659 OUString aUserNameEntry(aUserOpt.GetFirstName() + " " + aUserOpt.GetLastName());
660 m_xWndLeft->GetEditEngine()->SetTextCurrentDefaults(aUserNameEntry);
661 OUString aPageEntry( m_xFtPage->get_label() + " ");
662 //aPageEntry += " ";
663 m_xWndCenter->GetEditEngine()->SetTextCurrentDefaults(aPageEntry);
664 m_xWndCenter->InsertField( SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD) );
665 m_xWndRight->InsertField( SvxFieldItem(SvxDateField(Date( Date::SYSTEM ),SvxDateType::Var), EE_FEATURE_FIELD) );
666 if(!bTravelling)
667 m_xWndRight->GrabFocus();
669 break;
671 case eCreatedByEntry:
673 ClearTextAreas();
674 OUString aCreatedByEntry( m_xFtCreatedBy->get_label() + " " + aUserOpt.GetFirstName() + " " + aUserOpt.GetLastName());
675 m_xWndLeft->GetEditEngine()->SetTextCurrentDefaults(aCreatedByEntry);
676 m_xWndCenter->InsertField( SvxFieldItem(SvxDateField(Date( Date::SYSTEM ),SvxDateType::Var), EE_FEATURE_FIELD) );
677 OUString aPageEntry( m_xFtPage->get_label() + " " );
678 m_xWndRight->GetEditEngine()->SetTextCurrentDefaults(aPageEntry);
679 m_xWndRight->InsertField( SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD) );
680 if(!bTravelling)
681 m_xWndRight->GrabFocus();
683 break;
685 default :
686 break;
690 void ScHFEditPage::ClearTextAreas()
692 m_xWndLeft->GetEditEngine()->SetTextCurrentDefaults(EMPTY_OUSTRING);
693 m_xWndLeft->Invalidate();
694 m_xWndCenter->GetEditEngine()->SetTextCurrentDefaults(EMPTY_OUSTRING);
695 m_xWndCenter->Invalidate();
696 m_xWndRight->GetEditEngine()->SetTextCurrentDefaults(EMPTY_OUSTRING);
697 m_xWndRight->Invalidate();
700 // Handler:
701 IMPL_LINK_NOARG(ScHFEditPage, ListToggleHdl_Impl, weld::ComboBox&, void)
703 m_bDropDownActive = !m_bDropDownActive;
704 TimeValue aNow;
705 osl_getSystemTime(&aNow);
706 m_nTimeToggled = sal_Int64(aNow.Seconds) * 1000000000L + aNow.Nanosec;
709 IMPL_LINK_NOARG(ScHFEditPage, ListHdl_Impl, weld::ComboBox&, void)
711 ScHFEntryId eSel = static_cast<ScHFEntryId>(m_xLbDefined->get_active());
713 TimeValue aNow;
714 osl_getSystemTime(&aNow);
715 sal_Int64 nNow = sal_Int64(aNow.Seconds) * 1000000000L + aNow.Nanosec;
717 // order of dropdown vs select not guaranteed
718 bool bDiscrepancy = m_xLbDefined->get_popup_shown() != m_bDropDownActive;
719 if (bDiscrepancy)
720 ListToggleHdl_Impl(*m_xLbDefined);
722 bool bFocusToTarget = !m_xLbDefined->get_popup_shown() && m_nTimeToggled != -1 && (nNow - m_nTimeToggled < 800000000L);
723 ProcessDefinedListSel(eSel, !bFocusToTarget);
724 // check if we need to remove the customized entry.
725 if (!m_bDropDownActive && eSel < eEntryCount)
726 RemoveFromDefinedList();
728 // keep balanced
729 if (bDiscrepancy)
730 ListToggleHdl_Impl(*m_xLbDefined);
733 IMPL_LINK( ScHFEditPage, ClickHdl, weld::Button&, rBtn, void )
735 if (!m_pEditFocus)
736 return;
738 if (&rBtn == m_xBtnText.get())
740 m_pEditFocus->SetCharAttributes();
742 else
744 if ( &rBtn == m_xBtnPage.get() )
745 m_pEditFocus->InsertField(SvxFieldItem(SvxPageField(), EE_FEATURE_FIELD));
746 else if ( &rBtn == m_xBtnLastPage.get() )
747 m_pEditFocus->InsertField(SvxFieldItem(SvxPagesField(), EE_FEATURE_FIELD));
748 else if ( &rBtn == m_xBtnDate.get() )
749 m_pEditFocus->InsertField(SvxFieldItem(SvxDateField(Date(Date::SYSTEM),SvxDateType::Var), EE_FEATURE_FIELD));
750 else if ( &rBtn == m_xBtnTime.get() )
751 m_pEditFocus->InsertField(SvxFieldItem(SvxTimeField(), EE_FEATURE_FIELD));
752 else if ( &rBtn == m_xBtnTable.get() )
753 m_pEditFocus->InsertField(SvxFieldItem(SvxTableField(), EE_FEATURE_FIELD));
755 InsertToDefinedList();
756 m_pEditFocus->GrabFocus();
759 IMPL_LINK(ScHFEditPage, MenuHdl, const OString&, rSelectedId, void)
761 if (!m_pEditFocus)
762 return;
764 if (rSelectedId == "title")
766 m_pEditFocus->InsertField(SvxFieldItem(SvxFileField(), EE_FEATURE_FIELD));
768 else if (rSelectedId == "filename")
770 m_pEditFocus->InsertField( SvxFieldItem( SvxExtFileField(
771 OUString(), SvxFileType::Var, SvxFileFormat::NameAndExt ), EE_FEATURE_FIELD ) );
773 else if (rSelectedId == "pathname")
775 m_pEditFocus->InsertField( SvxFieldItem( SvxExtFileField(
776 OUString(), SvxFileType::Var, SvxFileFormat::PathFull ), EE_FEATURE_FIELD ) );
781 ScRightHeaderEditPage::ScRightHeaderEditPage( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet )
782 : ScHFEditPage( pPage, pController,
783 rCoreSet,
784 rCoreSet.GetPool()->GetWhich(SID_SCATTR_PAGE_HEADERRIGHT ),
785 true )
788 std::unique_ptr<SfxTabPage> ScRightHeaderEditPage::Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rCoreSet )
790 return std::make_unique<ScRightHeaderEditPage>( pPage, pController, *rCoreSet );
794 ScLeftHeaderEditPage::ScLeftHeaderEditPage( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet )
795 : ScHFEditPage( pPage, pController,
796 rCoreSet,
797 rCoreSet.GetPool()->GetWhich(SID_SCATTR_PAGE_HEADERLEFT ),
798 true )
801 std::unique_ptr<SfxTabPage> ScLeftHeaderEditPage::Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rCoreSet )
803 return std::make_unique<ScLeftHeaderEditPage>( pPage, pController, *rCoreSet );
807 ScRightFooterEditPage::ScRightFooterEditPage( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet )
808 : ScHFEditPage( pPage, pController,
809 rCoreSet,
810 rCoreSet.GetPool()->GetWhich(SID_SCATTR_PAGE_FOOTERRIGHT ),
811 false )
814 std::unique_ptr<SfxTabPage> ScRightFooterEditPage::Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rCoreSet )
816 return std::make_unique<ScRightFooterEditPage>( pPage, pController, *rCoreSet );
820 ScLeftFooterEditPage::ScLeftFooterEditPage( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet )
821 : ScHFEditPage( pPage, pController,
822 rCoreSet,
823 rCoreSet.GetPool()->GetWhich(SID_SCATTR_PAGE_FOOTERLEFT ),
824 false )
827 std::unique_ptr<SfxTabPage> ScLeftFooterEditPage::Create( weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rCoreSet )
829 return std::make_unique<ScLeftFooterEditPage>( pPage, pController, *rCoreSet );
832 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */