summaryrefslogtreecommitdiff
path: root/sw/source/ui/fldui/fldpage.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/ui/fldui/fldpage.cxx')
-rw-r--r--sw/source/ui/fldui/fldpage.cxx419
1 files changed, 419 insertions, 0 deletions
diff --git a/sw/source/ui/fldui/fldpage.cxx b/sw/source/ui/fldui/fldpage.cxx
new file mode 100644
index 000000000000..26882f1d8325
--- /dev/null
+++ b/sw/source/ui/fldui/fldpage.cxx
@@ -0,0 +1,419 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+
+#ifdef SW_DLLIMPLEMENTATION
+#undef SW_DLLIMPLEMENTATION
+#endif
+
+
+#include <vcl/lstbox.hxx>
+#include <svl/stritem.hxx>
+#include <sfx2/request.hxx>
+#include <svx/htmlmode.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 <globals.hrc>
+#include <sfx2/bindings.hxx>
+#include <switerator.hxx>
+
+using namespace ::com::sun::star;
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+SwFldPage::SwFldPage( Window *pParent, const ResId &rId,
+ const SfxItemSet &rAttrSet )
+ :SfxTabPage (pParent, rId, rAttrSet),
+ m_pCurFld (0),
+ m_pWrtShell (0),
+ m_nPageId ( static_cast< sal_uInt16 >(rId.GetId()) ),
+ m_nTypeSel (LISTBOX_ENTRY_NOTFOUND),
+ m_nSelectionSel (LISTBOX_ENTRY_NOTFOUND),
+ m_bFldEdit (sal_False),
+ m_bInsert (sal_True),
+ m_bFldDlgHtmlMode (sal_False),
+ m_bRefresh (sal_False),
+ m_bFirstHTMLInit (sal_True)
+{
+// FreeResource();
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+SwFldPage::~SwFldPage()
+{
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: TabPage initialisieren
+ --------------------------------------------------------------------*/
+
+void SwFldPage::Init()
+{
+ SwDocShell* pDocSh = (SwDocShell*)SfxObjectShell::Current();
+ sal_Bool bNewMode = 0 != (::GetHtmlMode(pDocSh) & HTMLMODE_ON);
+
+ m_bFldEdit = 0 == GetTabDialog();
+
+ // FieldManager neu initialisieren wichtig fuer
+ // Dok-Wechsel (fldtdlg:ReInitTabPage)
+ m_pCurFld = m_aMgr.GetCurFld();
+
+ if( bNewMode != m_bFldDlgHtmlMode )
+ {
+ m_bFldDlgHtmlMode = bNewMode;
+
+ // Bereichslistbox initialisieren
+ if( m_bFldDlgHtmlMode && m_bFirstHTMLInit )
+ {
+ m_bFirstHTMLInit = sal_False;
+ SwWrtShell *pSh = m_pWrtShell;
+ if(! pSh)
+ pSh = ::GetActiveWrtShell();
+ if(pSh)
+ {
+ SwDoc* pDoc = pSh->GetDoc();
+ pSh->InsertFldType( SwSetExpFieldType( pDoc,
+ String::CreateFromAscii("HTML_ON"), 1));
+ pSh->InsertFldType( SwSetExpFieldType(pDoc,
+ String::CreateFromAscii("HTML_OFF"), 1));
+ }
+ }
+ }
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Seite neu initialisieren
+ --------------------------------------------------------------------*/
+
+void SwFldPage::ActivatePage()
+{
+ EnableInsert(m_bInsert);
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Kompletter Reset; neues Feld editieren
+ --------------------------------------------------------------------*/
+
+void SwFldPage::EditNewField( sal_Bool bOnlyActivate )
+{
+ if( !bOnlyActivate )
+ {
+ m_nTypeSel = LISTBOX_ENTRY_NOTFOUND;
+ }
+ m_nSelectionSel = LISTBOX_ENTRY_NOTFOUND;
+ m_bRefresh = sal_True;
+ Reset(*(SfxItemSet*)0);
+ m_bRefresh = sal_False;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Feld einfuegen
+ --------------------------------------------------------------------*/
+
+sal_Bool SwFldPage::InsertFld(sal_uInt16 nTypeId, sal_uInt16 nSubType, const String& rPar1,
+ const String& rPar2, sal_uLong nFormatId,
+ sal_Unicode cSeparator, sal_Bool bIsAutomaticLanguage)
+{
+ sal_Bool bRet = sal_False;
+ SwView* pView = GetActiveView();
+ SwWrtShell *pSh = m_pWrtShell ? m_pWrtShell : pView->GetWrtShellPtr();
+
+ if (!IsFldEdit()) // Neues Feld einfuegen
+ {
+ SwInsertFld_Data aData(nTypeId, nSubType, rPar1, rPar2, nFormatId, 0, cSeparator, bIsAutomaticLanguage );
+ //#i26566# provide parent for SwWrtShell::StartInputFldDlg
+ aData.pParent = &GetTabDialog()->GetOKButton();
+ bRet = m_aMgr.InsertFld( aData );
+
+ uno::Reference< frame::XDispatchRecorder > xRecorder =
+ pView->GetViewFrame()->GetBindings().GetRecorder();
+ if ( xRecorder.is() )
+ {
+ sal_Bool bRecordDB = TYP_DBFLD == nTypeId ||
+ TYP_DBSETNUMBERFLD == nTypeId ||
+ TYP_DBNUMSETFLD == nTypeId ||
+ TYP_DBNEXTSETFLD == nTypeId ||
+ TYP_DBNAMEFLD == nTypeId ;
+
+ SfxRequest aReq( pView->GetViewFrame(),
+ bRecordDB ? FN_INSERT_DBFIELD : FN_INSERT_FIELD );
+ if(bRecordDB)
+ {
+ aReq.AppendItem(SfxStringItem
+ (FN_INSERT_DBFIELD,rPar1.GetToken(0, DB_DELIM)));
+ aReq.AppendItem(SfxStringItem
+ (FN_PARAM_1,rPar1.GetToken(1, DB_DELIM)));
+ aReq.AppendItem(SfxInt32Item
+ (FN_PARAM_3,rPar1.GetToken(1, DB_DELIM).ToInt32()));
+ aReq.AppendItem(SfxStringItem
+ (FN_PARAM_2,rPar1.GetToken(3, DB_DELIM)));
+ }
+ else
+ {
+ aReq.AppendItem(SfxStringItem(FN_INSERT_FIELD, rPar1));
+ aReq.AppendItem(SfxStringItem
+ (FN_PARAM_3,String(cSeparator)));
+ aReq.AppendItem(SfxUInt16Item(FN_PARAM_FIELD_SUBTYPE, nSubType));
+ }
+ aReq.AppendItem(SfxUInt16Item(FN_PARAM_FIELD_TYPE , nTypeId));
+ aReq.AppendItem(SfxStringItem(FN_PARAM_FIELD_CONTENT, rPar2));
+ aReq.AppendItem(SfxUInt32Item(FN_PARAM_FIELD_FORMAT , nFormatId));
+ aReq.Done();
+ }
+
+ }
+ else // Feld aendern
+ {
+ SwField *const pTmpFld = m_pCurFld->CopyField();
+
+ String sPar1(rPar1);
+ String sPar2(rPar2);
+ sal_Bool bDBChanged = sal_False;
+ switch( nTypeId )
+ {
+ case TYP_DATEFLD:
+ case TYP_TIMEFLD:
+ nSubType = static_cast< sal_uInt16 >(((nTypeId == TYP_DATEFLD) ? DATEFLD : TIMEFLD) |
+ ((nSubType == DATE_VAR) ? 0 : FIXEDFLD));
+ break;
+
+ case TYP_DBNAMEFLD:
+ case TYP_DBNEXTSETFLD:
+ case TYP_DBNUMSETFLD:
+ case TYP_DBSETNUMBERFLD:
+ {
+ xub_StrLen nPos = 0;
+ SwDBData aData;
+
+ aData.sDataSource = rPar1.GetToken(0, DB_DELIM, nPos);
+ aData.sCommand = rPar1.GetToken(0, DB_DELIM, nPos);
+ aData.nCommandType = rPar1.GetToken(0, DB_DELIM, nPos).ToInt32();
+ sPar1 = rPar1.Copy(nPos);
+
+ ((SwDBNameInfField*)pTmpFld)->SetDBData(aData);
+ bDBChanged = sal_True;
+ }
+ break;
+
+ case TYP_DBFLD:
+ {
+ SwDBData aData;
+ aData.sDataSource = rPar1.GetToken(0, DB_DELIM);
+ aData.sCommand = rPar1.GetToken(1, DB_DELIM);
+ aData.nCommandType = rPar1.GetToken(2, DB_DELIM).ToInt32();
+ String sColumn = rPar1.GetToken(3, DB_DELIM);
+
+ SwDBFieldType* pOldTyp = (SwDBFieldType*)pTmpFld->GetTyp();
+ SwDBFieldType* pTyp = (SwDBFieldType*)pSh->InsertFldType(
+ SwDBFieldType(pSh->GetDoc(), sColumn, aData));
+
+ SwIterator<SwFmtFld,SwFieldType> aIter( *pOldTyp );
+
+ for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
+ {
+ if( pFmtFld->GetFld() == m_pCurFld)
+ {
+ pFmtFld->RegisterToFieldType(*pTyp);
+ pTmpFld->ChgTyp(pTyp);
+ break;
+ }
+ }
+ bDBChanged = sal_True;
+ }
+ break;
+
+ case TYP_SEQFLD:
+ {
+ SwSetExpFieldType* pTyp = (SwSetExpFieldType*)pTmpFld->GetTyp();
+ pTyp->SetOutlineLvl( static_cast< sal_uInt8 >(nSubType & 0xff));
+ pTyp->SetDelimiter(cSeparator);
+
+ nSubType = nsSwGetSetExpType::GSE_SEQ;
+ }
+ break;
+
+ case TYP_INPUTFLD:
+ {
+ // User- oder SetField ?
+ if (m_aMgr.GetFldType(RES_USERFLD, sPar1) == 0 &&
+ !(pTmpFld->GetSubType() & INP_TXT)) // SETEXPFLD
+ {
+ SwSetExpField* pFld = (SwSetExpField*)pTmpFld;
+ pFld->SetPromptText(sPar2);
+ sPar2 = pFld->GetPar2();
+ }
+ }
+ break;
+ case TYP_DOCINFOFLD:
+ {
+ if( nSubType == nsSwDocInfoSubType::DI_CUSTOM )
+ {
+ SwDocInfoField* pDocInfo = static_cast<SwDocInfoField*>( pTmpFld );
+ pDocInfo->SetName( rPar1 );
+ }
+ }
+ break;
+ }
+
+ pSh->StartAllAction();
+
+ pTmpFld->SetSubType(nSubType);
+ pTmpFld->SetAutomaticLanguage(bIsAutomaticLanguage);
+
+ m_aMgr.UpdateCurFld( nFormatId, sPar1, sPar2, pTmpFld );
+
+ m_pCurFld = m_aMgr.GetCurFld();
+
+ switch (nTypeId)
+ {
+ case TYP_HIDDENTXTFLD:
+ case TYP_HIDDENPARAFLD:
+ m_aMgr.EvalExpFlds(pSh);
+ break;
+ }
+
+ pSh->SetUndoNoResetModified();
+ pSh->EndAllAction();
+ }
+
+ return bRet;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+void SwFldPage::SavePos( const ListBox* pLst1, const ListBox* pLst2,
+ const ListBox* pLst3 )
+{
+ const ListBox* aLBArr [ coLBCount ] = { pLst1, pLst2, pLst3 };
+
+ const ListBox** ppLB = aLBArr;
+ for( int i = 0; i < coLBCount; ++i, ++ppLB )
+ if( (*ppLB) && (*ppLB)->GetEntryCount() )
+ m_aLstStrArr[ i ] = (*ppLB)->GetSelectEntry();
+ else
+ m_aLstStrArr[ i ].Erase();
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+void SwFldPage::RestorePos(ListBox* pLst1, ListBox* pLst2, ListBox* pLst3)
+{
+ sal_uInt16 nPos = 0;
+ ListBox* aLBArr [ coLBCount ] = { pLst1, pLst2, pLst3 };
+ ListBox** ppLB = aLBArr;
+ for( int i = 0; i < coLBCount; ++i, ++ppLB )
+ if( (*ppLB) && (*ppLB)->GetEntryCount() && m_aLstStrArr[ i ].Len() &&
+ LISTBOX_ENTRY_NOTFOUND !=
+ ( nPos = (*ppLB)->GetEntryPos(m_aLstStrArr[ i ] ) ) )
+ (*ppLB)->SelectEntryPos( nPos );
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Einfuegen von neuen Feldern
+ --------------------------------------------------------------------*/
+
+IMPL_LINK( SwFldPage, InsertHdl, Button *, pBtn )
+{
+ SwFldDlg *pDlg = (SwFldDlg*)GetTabDialog();
+
+ if (pDlg)
+ {
+ pDlg->InsertHdl();
+
+ if (pBtn)
+ pBtn->GrabFocus(); // Wegen InputField-Dlg
+ }
+ else
+ {
+ SwFldEditDlg *pEditDlg = (SwFldEditDlg *)GetParent();
+ pEditDlg->InsertHdl();
+ }
+
+ return 0;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: "Einfuegen"-Button Enablen/Disablen
+ --------------------------------------------------------------------*/
+
+void SwFldPage::EnableInsert(sal_Bool bEnable)
+{
+ SwFldDlg *pDlg = (SwFldDlg*)GetTabDialog();
+
+ if (pDlg)
+ {
+ if (pDlg->GetCurPageId() == m_nPageId)
+ pDlg->EnableInsert(bEnable);
+ }
+ else
+ {
+ SwFldEditDlg *pEditDlg = (SwFldEditDlg *)GetParent();
+ pEditDlg->EnableInsert(bEnable);
+ }
+
+ m_bInsert = bEnable;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+IMPL_LINK( SwFldPage, NumFormatHdl, ListBox *, EMPTYARG )
+{
+ InsertHdl();
+
+ return 0;
+}
+
+void SwFldPage::SetWrtShell( SwWrtShell* pShell )
+{
+ m_pWrtShell = pShell;
+ m_aMgr.SetWrtShell( pShell );
+}