summaryrefslogtreecommitdiffstats
path: root/sw/source/ui/fldui/fldpage.cxx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sw/source/ui/fldui/fldpage.cxx348
1 files changed, 348 insertions, 0 deletions
diff --git a/sw/source/ui/fldui/fldpage.cxx b/sw/source/ui/fldui/fldpage.cxx
new file mode 100644
index 000000000..00c31c9ba
--- /dev/null
+++ b/sw/source/ui/fldui/fldpage.cxx
@@ -0,0 +1,348 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <svl/stritem.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/htmlmode.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <dbfld.hxx>
+#include <flddat.hxx>
+#include <fmtfld.hxx>
+#include <viewopt.hxx>
+#include <fldedt.hxx>
+#include <docsh.hxx>
+#include <swmodule.hxx>
+#include <view.hxx>
+#include <wrtsh.hxx>
+#include <expfld.hxx>
+#include <fldtdlg.hxx>
+#include "fldpage.hxx"
+#include <docufld.hxx>
+#include <cmdid.h>
+#include <sfx2/bindings.hxx>
+#include <o3tl/string_view.hxx>
+
+using namespace ::com::sun::star;
+
+// note: pAttrSet may be null if the dialog is restored on startup
+SwFieldPage::SwFieldPage(weld::Container* pPage, weld::DialogController* pController, const OUString& rUIXMLDescription,
+ const OString& rID, const SfxItemSet *pAttrSet)
+ : SfxTabPage(pPage, pController, rUIXMLDescription, rID, pAttrSet)
+ , m_pCurField(nullptr)
+ , m_pWrtShell(nullptr)
+ , m_nTypeSel(-1)
+ , m_nSelectionSel(-1)
+ , m_bFieldEdit(false)
+ , m_bInsert(true)
+ , m_bFieldDlgHtmlMode(false)
+ , m_bRefresh(false)
+ , m_bFirstHTMLInit(true)
+{
+}
+
+SwFieldPage::~SwFieldPage()
+{
+}
+
+// initialise TabPage
+void SwFieldPage::Init()
+{
+ SwDocShell* pDocSh = static_cast<SwDocShell*>(SfxObjectShell::Current());
+ bool bNewMode = 0 != (::GetHtmlMode(pDocSh) & HTMLMODE_ON);
+
+ m_bFieldEdit = nullptr == dynamic_cast<SwFieldDlg*>(GetDialogController());
+
+ // newly initialise FieldManager. important for
+ // Dok-Switch (fldtdlg:ReInitTabPage)
+ m_pCurField = m_aMgr.GetCurField();
+
+ if( bNewMode == m_bFieldDlgHtmlMode )
+ return;
+
+ m_bFieldDlgHtmlMode = bNewMode;
+
+ // initialise Rangelistbox
+ if( !(m_bFieldDlgHtmlMode && m_bFirstHTMLInit) )
+ return;
+
+ m_bFirstHTMLInit = false;
+ SwWrtShell *pSh = m_pWrtShell;
+ if(! pSh)
+ pSh = ::GetActiveWrtShell();
+ if(pSh)
+ {
+ SwDoc* pDoc = pSh->GetDoc();
+ pSh->InsertFieldType( SwSetExpFieldType( pDoc,
+ "HTML_ON", 1));
+ pSh->InsertFieldType( SwSetExpFieldType(pDoc,
+ "HTML_OFF", 1));
+ }
+}
+
+// newly initialise page
+void SwFieldPage::Activate()
+{
+ EnableInsert(m_bInsert);
+}
+
+// complete reset; edit new field
+void SwFieldPage::EditNewField( bool bOnlyActivate )
+{
+ if (!bOnlyActivate)
+ m_nTypeSel = -1;
+ m_nSelectionSel = -1;
+ m_bRefresh = true;
+ Reset(nullptr);
+ m_bRefresh = false;
+}
+
+// insert field
+void SwFieldPage::InsertField(SwFieldTypesEnum nTypeId, sal_uInt16 nSubType, const OUString& rPar1,
+ const OUString& rPar2, sal_uInt32 nFormatId,
+ sal_Unicode cSeparator, bool bIsAutomaticLanguage)
+{
+ SwView* pView = GetActiveView();
+ if (!pView)
+ return;
+
+ SwWrtShell *pSh = m_pWrtShell ? m_pWrtShell : pView->GetWrtShellPtr();
+
+ if (!IsFieldEdit()) // insert new field
+ {
+ SwInsertField_Data aData(nTypeId, nSubType, rPar1, rPar2, nFormatId, nullptr, cSeparator, bIsAutomaticLanguage );
+ //#i26566# provide parent for SwWrtShell::StartInputFieldDlg
+ aData.m_pParent = &GetDialogController()->GetOKButton();
+ m_aMgr.InsertField( aData );
+
+ uno::Reference< frame::XDispatchRecorder > xRecorder =
+ pView->GetViewFrame()->GetBindings().GetRecorder();
+ if ( xRecorder.is() )
+ {
+ bool bRecordDB = SwFieldTypesEnum::Database == nTypeId ||
+ SwFieldTypesEnum::DatabaseSetNumber == nTypeId ||
+ SwFieldTypesEnum::DatabaseNumberSet == nTypeId ||
+ SwFieldTypesEnum::DatabaseNextSet == nTypeId ||
+ SwFieldTypesEnum::DatabaseName == nTypeId ;
+
+ SfxRequest aReq( pView->GetViewFrame(),
+ bRecordDB ? FN_INSERT_DBFIELD : FN_INSERT_FIELD );
+ if(bRecordDB)
+ {
+ sal_Int32 nIdx{ 0 };
+ aReq.AppendItem(SfxStringItem
+ (FN_INSERT_DBFIELD,rPar1.getToken(0, DB_DELIM, nIdx)));
+ aReq.AppendItem(SfxStringItem
+ (FN_PARAM_1,rPar1.getToken(0, DB_DELIM, nIdx)));
+ aReq.AppendItem(SfxInt32Item
+ (FN_PARAM_3, o3tl::toInt32(o3tl::getToken(rPar1, 0, DB_DELIM, nIdx))));
+ aReq.AppendItem(SfxStringItem
+ (FN_PARAM_2,rPar1.getToken(0, DB_DELIM, nIdx)));
+ }
+ else
+ {
+ aReq.AppendItem(SfxStringItem(FN_INSERT_FIELD, rPar1));
+ aReq.AppendItem(SfxStringItem
+ (FN_PARAM_3, OUString(cSeparator)));
+ aReq.AppendItem(SfxUInt16Item(FN_PARAM_FIELD_SUBTYPE, nSubType));
+ }
+ aReq.AppendItem(SfxUInt16Item(FN_PARAM_FIELD_TYPE , static_cast<sal_uInt16>(nTypeId)));
+ aReq.AppendItem(SfxStringItem(FN_PARAM_FIELD_CONTENT, rPar2));
+ aReq.AppendItem(SfxUInt32Item(FN_PARAM_FIELD_FORMAT , nFormatId));
+ aReq.Done();
+ }
+
+ }
+ else // change field
+ {
+ std::unique_ptr<SwField> pTmpField = m_pCurField->CopyField();
+
+ OUString sPar1(rPar1);
+ OUString sPar2(rPar2);
+ switch( nTypeId )
+ {
+ case SwFieldTypesEnum::Date:
+ case SwFieldTypesEnum::Time:
+ nSubType = static_cast< sal_uInt16 >(((nTypeId == SwFieldTypesEnum::Date) ? DATEFLD : TIMEFLD) |
+ ((nSubType == DATE_VAR) ? 0 : FIXEDFLD));
+ break;
+
+ case SwFieldTypesEnum::DatabaseName:
+ case SwFieldTypesEnum::DatabaseNextSet:
+ case SwFieldTypesEnum::DatabaseNumberSet:
+ case SwFieldTypesEnum::DatabaseSetNumber:
+ {
+ sal_Int32 nPos = 0;
+ SwDBData aData;
+
+ aData.sDataSource = rPar1.getToken(0, DB_DELIM, nPos);
+ aData.sCommand = rPar1.getToken(0, DB_DELIM, nPos);
+ aData.nCommandType = o3tl::toInt32(o3tl::getToken(rPar1, 0, DB_DELIM, nPos));
+ sPar1 = rPar1.copy(nPos);
+
+ static_cast<SwDBNameInfField*>(pTmpField.get())->SetDBData(aData);
+ }
+ break;
+
+ case SwFieldTypesEnum::Database:
+ {
+ SwDBData aData;
+ sal_Int32 nIdx{ 0 };
+ aData.sDataSource = rPar1.getToken(0, DB_DELIM, nIdx);
+ aData.sCommand = rPar1.getToken(0, DB_DELIM, nIdx);
+ aData.nCommandType = o3tl::toInt32(o3tl::getToken(rPar1, 0, DB_DELIM, nIdx));
+ OUString sColumn = rPar1.getToken(0, DB_DELIM, nIdx);
+
+ auto pOldType = static_cast<SwDBFieldType*>(pTmpField->GetTyp());
+ auto pType = static_cast<SwDBFieldType*>(pSh->InsertFieldType(SwDBFieldType(pSh->GetDoc(), sColumn, aData)));
+ if(auto pFormatField = pOldType->FindFormatForField(m_pCurField))
+ {
+ pFormatField->RegisterToFieldType(*pType);
+ pTmpField->ChgTyp(pType);
+ }
+ }
+ break;
+
+ case SwFieldTypesEnum::Sequence:
+ {
+ SwSetExpFieldType* pTyp = static_cast<SwSetExpFieldType*>(pTmpField->GetTyp());
+ pTyp->SetOutlineLvl( static_cast< sal_uInt8 >(nSubType & 0xff));
+ pTyp->SetDelimiter(OUString(cSeparator));
+
+ nSubType = nsSwGetSetExpType::GSE_SEQ;
+ }
+ break;
+
+ case SwFieldTypesEnum::Input:
+ {
+ // User- or SetField ?
+ if (m_aMgr.GetFieldType(SwFieldIds::User, sPar1) == nullptr &&
+ !(pTmpField->GetSubType() & INP_TXT)) // SETEXPFLD
+ {
+ SwSetExpField* pField = static_cast<SwSetExpField*>(pTmpField.get());
+ pField->SetPromptText(sPar2);
+ sPar2 = pField->GetPar2();
+ }
+ }
+ break;
+ case SwFieldTypesEnum::DocumentInfo:
+ {
+ if( nSubType == nsSwDocInfoSubType::DI_CUSTOM )
+ {
+ SwDocInfoField* pDocInfo = static_cast<SwDocInfoField*>( pTmpField.get() );
+ pDocInfo->SetName( rPar1 );
+ }
+ }
+ break;
+ default: break;
+ }
+
+ pSh->StartAllAction();
+
+ pTmpField->SetSubType(nSubType);
+ pTmpField->SetAutomaticLanguage(bIsAutomaticLanguage);
+
+ m_aMgr.UpdateCurField( nFormatId, sPar1, sPar2, std::move(pTmpField) );
+
+ m_pCurField = m_aMgr.GetCurField();
+
+ switch (nTypeId)
+ {
+ case SwFieldTypesEnum::HiddenText:
+ case SwFieldTypesEnum::HiddenParagraph:
+ m_aMgr.EvalExpFields(pSh);
+ break;
+ default: break;
+ }
+
+ pSh->SetUndoNoResetModified();
+ pSh->EndAllAction();
+ }
+}
+
+void SwFieldPage::SavePos( const weld::TreeView& rLst1 )
+{
+ if (rLst1.n_children())
+ m_aLstStrArr[ 0 ] = rLst1.get_selected_text();
+ else
+ m_aLstStrArr[ 0 ].clear();
+ m_aLstStrArr[ 1 ].clear();
+ m_aLstStrArr[ 2 ].clear();
+}
+
+void SwFieldPage::RestorePos(weld::TreeView& rLst1)
+{
+ sal_Int32 nPos = 0;
+ if (rLst1.n_children() && !m_aLstStrArr[ 0 ].isEmpty() &&
+ -1 != ( nPos = rLst1.find_text(m_aLstStrArr[ 0 ] ) ) )
+ rLst1.select( nPos );
+}
+
+// Insert new fields
+IMPL_LINK( SwFieldPage, TreeViewInsertHdl, weld::TreeView&, rBox, bool )
+{
+ InsertHdl(&rBox);
+ return true;
+}
+
+void SwFieldPage::InsertHdl(weld::Widget* pBtn)
+{
+ if (SwFieldDlg *pDlg = dynamic_cast<SwFieldDlg*>(GetDialogController()))
+ {
+ pDlg->InsertHdl();
+
+ if (pBtn)
+ pBtn->grab_focus(); // because of InputField-Dlg
+ }
+ else
+ {
+ SwFieldEditDlg *pEditDlg = static_cast<SwFieldEditDlg*>(GetDialogController());
+ pEditDlg->InsertHdl();
+ }
+}
+
+// enable/disable "Insert"-Button
+void SwFieldPage::EnableInsert(bool bEnable)
+{
+ if (SwFieldDlg *pDlg = dynamic_cast<SwFieldDlg*>(GetDialogController()))
+ {
+ if (pDlg->GetCurTabPage() == this)
+ pDlg->EnableInsert(bEnable);
+ }
+ else
+ {
+ SwFieldEditDlg *pEditDlg = static_cast<SwFieldEditDlg*>(GetDialogController());
+ pEditDlg->EnableInsert(bEnable);
+ }
+
+ m_bInsert = bEnable;
+}
+
+IMPL_LINK_NOARG(SwFieldPage, NumFormatHdl, weld::TreeView&, bool)
+{
+ InsertHdl(nullptr);
+ return true;
+}
+
+void SwFieldPage::SetWrtShell( SwWrtShell* pShell )
+{
+ m_pWrtShell = pShell;
+ m_aMgr.SetWrtShell( pShell );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */