summaryrefslogtreecommitdiff
path: root/sw/source/ui/fldui/fldref.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/ui/fldui/fldref.cxx')
-rw-r--r--sw/source/ui/fldui/fldref.cxx1073
1 files changed, 1073 insertions, 0 deletions
diff --git a/sw/source/ui/fldui/fldref.cxx b/sw/source/ui/fldui/fldref.cxx
new file mode 100644
index 000000000000..1c7ff9e09564
--- /dev/null
+++ b/sw/source/ui/fldui/fldref.cxx
@@ -0,0 +1,1073 @@
+/*************************************************************************
+ *
+ * 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 "swtypes.hxx"
+#include <view.hxx>
+#include <IMark.hxx>
+#include <expfld.hxx>
+#include <swmodule.hxx>
+#ifndef _FLDREF_HXX
+#include <fldref.hxx>
+#endif
+#include <reffld.hxx>
+#include <wrtsh.hxx>
+
+#ifndef _FLDUI_HRC
+#include <fldui.hrc>
+#endif
+#ifndef _FLDTDLG_HRC
+#include <fldtdlg.hrc>
+#endif
+#ifndef _GLOBALS_HRC
+#include <globals.hrc>
+#endif
+// --> OD 2007-11-14 #i83479#
+#include <SwNodeNum.hxx>
+#include <IDocumentMarkAccess.hxx>
+#include <ndtxt.hxx>
+// <--
+
+// sw/inc/expfld.hxx
+SV_IMPL_PTRARR( _SwSeqFldList, _SeqFldLstElem* )
+
+#define REFFLDFLAG 0x4000
+#define REFFLDFLAG_BOOKMARK 0x4800
+#define REFFLDFLAG_FOOTNOTE 0x5000
+#define REFFLDFLAG_ENDNOTE 0x6000
+// --> OD 2007-11-09 #i83479#
+#define REFFLDFLAG_HEADING 0x7100
+#define REFFLDFLAG_NUMITEM 0x7200
+// <--
+
+USHORT nFldDlgFmtSel = 0;
+
+#define USER_DATA_VERSION_1 "1"
+#define USER_DATA_VERSION USER_DATA_VERSION_1
+
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+SwFldRefPage::SwFldRefPage(Window* pParent, const SfxItemSet& rCoreSet ) :
+ SwFldPage( pParent, SW_RES( TP_FLD_REF ), rCoreSet ),
+
+ aTypeFT (this, SW_RES(FT_REFTYPE)),
+ aTypeLB (this, SW_RES(LB_REFTYPE)),
+ aSelectionFT (this, SW_RES(FT_REFSELECTION)),
+ aSelectionLB (this, SW_RES(LB_REFSELECTION)),
+ // --> OD 2007-11-21 #i83479#
+ aSelectionToolTipLB( this, SW_RES(LB_REFSELECTION_TOOLTIP) ),
+ // <--
+ aFormatFT (this, SW_RES(FT_REFFORMAT)),
+ aFormatLB (this, SW_RES(LB_REFFORMAT)),
+ aNameFT (this, SW_RES(FT_REFNAME)),
+ aNameED (this, SW_RES(ED_REFNAME)),
+ aValueFT (this, SW_RES(FT_REFVALUE)),
+ aValueED (this, SW_RES(ED_REFVALUE)),
+
+ sBookmarkTxt (SW_RES(STR_REFBOOKMARK)),
+ sFootnoteTxt (SW_RES(STR_REFFOOTNOTE)),
+ sEndnoteTxt (SW_RES(STR_REFENDNOTE)),
+ // --> OD 2007-11-09 #i83479#
+ sHeadingTxt (SW_RES(STR_REFHEADING)),
+ sNumItemTxt (SW_RES(STR_REFNUMITEM)),
+ maOutlineNodes(),
+ maNumItems(),
+ mpSavedSelectedTxtNode( 0 ),
+ mnSavedSelectedPos( 0 )
+ // <--
+{
+ FreeResource();
+
+ aNameED.SetModifyHdl(LINK(this, SwFldRefPage, ModifyHdl));
+
+ aTypeLB.SetDoubleClickHdl (LINK(this, SwFldRefPage, InsertHdl));
+ aTypeLB.SetSelectHdl (LINK(this, SwFldRefPage, TypeHdl));
+ aSelectionLB.SetSelectHdl (LINK(this, SwFldRefPage, SubTypeHdl));
+ aSelectionLB.SetDoubleClickHdl (LINK(this, SwFldRefPage, InsertHdl));
+ aFormatLB.SetDoubleClickHdl (LINK(this, SwFldRefPage, InsertHdl));
+
+ // --> OD 2007-11-21 #i83479#
+ aSelectionToolTipLB.SetSelectHdl( LINK(this, SwFldRefPage, SubTypeHdl) );
+ aSelectionToolTipLB.SetDoubleClickHdl( LINK(this, SwFldRefPage, InsertHdl) );
+ aSelectionToolTipLB.SetWindowBits( aSelectionToolTipLB.GetWindowBits() | WB_HSCROLL );
+ aSelectionToolTipLB.SetSpaceBetweenEntries(1);
+ aSelectionToolTipLB.SetHighlightRange();
+ // <--
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+SwFldRefPage::~SwFldRefPage()
+{
+}
+
+// --> OD 2007-11-22 #i83479#
+void SwFldRefPage::SaveSelectedTxtNode()
+{
+ mpSavedSelectedTxtNode = 0;
+ mnSavedSelectedPos = 0;
+ if ( aSelectionToolTipLB.IsVisible() )
+ {
+ SvLBoxEntry* pEntry = aSelectionToolTipLB.GetCurEntry();
+ if ( pEntry )
+ {
+ const USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());
+ SwWrtShell *pSh = GetWrtShell();
+ if ( !pSh )
+ {
+ pSh = ::GetActiveWrtShell();
+ }
+ if ( nTypeId == REFFLDFLAG_HEADING )
+ {
+ mnSavedSelectedPos = static_cast<sal_uInt16>(reinterpret_cast<ULONG>(pEntry->GetUserData()));
+ if ( mnSavedSelectedPos < maOutlineNodes.size() )
+ {
+ mpSavedSelectedTxtNode = maOutlineNodes[mnSavedSelectedPos];
+ }
+ }
+ else if ( nTypeId == REFFLDFLAG_NUMITEM )
+ {
+ mnSavedSelectedPos = static_cast<sal_uInt16>(reinterpret_cast<ULONG>(pEntry->GetUserData()));
+ if ( mnSavedSelectedPos < maNumItems.size() )
+ {
+ mpSavedSelectedTxtNode = maNumItems[mnSavedSelectedPos]->GetTxtNode();
+ }
+ }
+ }
+ }
+}
+
+const SwTxtNode* SwFldRefPage::GetSavedSelectedTxtNode() const
+{
+ return mpSavedSelectedTxtNode;
+}
+
+sal_uInt16 SwFldRefPage::GetSavedSelectedPos() const
+{
+ return mnSavedSelectedPos;
+}
+
+// <--
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+void SwFldRefPage::Reset(const SfxItemSet& )
+{
+ if (!IsFldEdit())
+ {
+ SavePos(&aTypeLB);
+ // --> OD 2007-11-22 #i83479#
+ SaveSelectedTxtNode();
+ // <--
+ }
+ SetSelectionSel(LISTBOX_ENTRY_NOTFOUND);
+ SetTypeSel(LISTBOX_ENTRY_NOTFOUND);
+ Init(); // Allgemeine initialisierung
+
+ // TypeListBox initialisieren
+ aTypeLB.SetUpdateMode(FALSE);
+ aTypeLB.Clear();
+
+ // Typ-Listbox fuellen
+
+ USHORT nPos;
+ // Referenz setzen / einfuegen
+ const SwFldGroupRgn& rRg = GetFldMgr().GetGroupRange(IsFldDlgHtmlMode(), GetGroup());
+
+ for (short i = rRg.nStart; i < rRg.nEnd; ++i)
+ {
+ const USHORT nTypeId = GetFldMgr().GetTypeId(i);
+
+ if (!IsFldEdit() || nTypeId != TYP_SETREFFLD)
+ {
+ nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(i), i - rRg.nStart);
+ aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
+ }
+ }
+
+ // --> OD 2007-11-09 #i83479#
+ // entries for headings and numbered items
+ nPos = aTypeLB.InsertEntry(sHeadingTxt);
+ aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_HEADING);
+ nPos = aTypeLB.InsertEntry(sNumItemTxt);
+ aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_NUMITEM);
+ // <--
+
+ // mit den Sequence-Typen auffuellen
+ SwWrtShell *pSh = GetWrtShell();
+ if(!pSh)
+ pSh = ::GetActiveWrtShell();
+
+ USHORT nFldTypeCnt = pSh->GetFldTypeCount(RES_SETEXPFLD);
+
+ for (USHORT n = 0; n < nFldTypeCnt; ++n)
+ {
+ SwSetExpFieldType* pType = (SwSetExpFieldType*)pSh->GetFldType(n, RES_SETEXPFLD);
+
+ if ((nsSwGetSetExpType::GSE_SEQ & pType->GetType()) && pType->GetDepends() && pSh->IsUsed(*pType))
+ {
+ nPos = aTypeLB.InsertEntry(pType->GetName());
+ aTypeLB.SetEntryData(nPos, (void*)(REFFLDFLAG | n));
+ }
+ }
+
+ // Textmarken - jetzt immer (wegen Globaldokumenten)
+ nPos = aTypeLB.InsertEntry(sBookmarkTxt);
+ aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_BOOKMARK);
+
+ // Fussnoten:
+ if( pSh->HasFtns() )
+ {
+ nPos = aTypeLB.InsertEntry(sFootnoteTxt);
+ aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_FOOTNOTE);
+ }
+
+ // Endnoten:
+ if ( pSh->HasFtns(true) )
+ {
+ nPos = aTypeLB.InsertEntry(sEndnoteTxt);
+ aTypeLB.SetEntryData(nPos, (void*)REFFLDFLAG_ENDNOTE);
+ }
+
+ // alte Pos selektieren
+ if (!IsFldEdit())
+ RestorePos(&aTypeLB);
+
+ aTypeLB.SetUpdateMode(TRUE);
+
+ nFldDlgFmtSel = 0;
+
+ if( !IsRefresh() )
+ {
+ String sUserData = GetUserData();
+ if(!IsRefresh() && sUserData.GetToken(0, ';').
+ EqualsIgnoreCaseAscii(USER_DATA_VERSION_1))
+ {
+ String sVal = sUserData.GetToken(1, ';');
+ USHORT nVal = static_cast< USHORT >(sVal.ToInt32());
+ if(nVal != USHRT_MAX)
+ {
+ for(USHORT i = 0; i < aTypeLB.GetEntryCount(); i++)
+ if(nVal == (USHORT)(ULONG)aTypeLB.GetEntryData(i))
+ {
+ aTypeLB.SelectEntryPos(i);
+ break;
+ }
+ }
+ }
+ }
+ TypeHdl(0);
+
+ if (IsFldEdit())
+ {
+ aTypeLB.SaveValue();
+ aSelectionLB.SaveValue();
+ aFormatLB.SaveValue();
+ aNameED.SaveValue();
+ aValueED.SaveValue();
+ }
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+IMPL_LINK( SwFldRefPage, TypeHdl, ListBox *, EMPTYARG )
+{
+ // Alte ListBoxPos sichern
+ const USHORT nOld = GetTypeSel();
+
+ // Aktuelle ListBoxPos
+ SetTypeSel(aTypeLB.GetSelectEntryPos());
+
+ if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
+ {
+ if (IsFldEdit())
+ {
+ // Positionen selektieren
+ String sName;
+ USHORT nFlag = 0;
+
+ switch( GetCurField()->GetSubType() )
+ {
+ case REF_BOOKMARK:
+ {
+ // --> OD 2007-11-14 #i83479#
+// sName = sBookmarkTxt;
+// nFlag = REFFLDFLAG_BOOKMARK;
+ SwGetRefField* pRefFld = dynamic_cast<SwGetRefField*>(GetCurField());
+ if ( pRefFld &&
+ pRefFld->IsRefToHeadingCrossRefBookmark() )
+ {
+ sName = sHeadingTxt;
+ nFlag = REFFLDFLAG_HEADING;
+ }
+ else if ( pRefFld &&
+ pRefFld->IsRefToNumItemCrossRefBookmark() )
+ {
+ sName = sNumItemTxt;
+ nFlag = REFFLDFLAG_NUMITEM;
+ }
+ else
+ {
+ sName = sBookmarkTxt;
+ nFlag = REFFLDFLAG_BOOKMARK;
+ }
+ // <--
+ }
+ break;
+
+ case REF_FOOTNOTE:
+ sName = sFootnoteTxt;
+ nFlag = REFFLDFLAG_FOOTNOTE;
+ break;
+
+ case REF_ENDNOTE:
+ sName = sEndnoteTxt;
+ nFlag = REFFLDFLAG_ENDNOTE;
+ break;
+
+ case REF_SETREFATTR:
+ sName = SW_RESSTR(STR_GETREFFLD);
+ nFlag = REF_SETREFATTR;
+ break;
+
+ case REF_SEQUENCEFLD:
+ sName = ((SwGetRefField*)GetCurField())->GetSetRefName();
+ nFlag = REFFLDFLAG;
+ break;
+ }
+
+ if (aTypeLB.GetEntryPos(sName) == LISTBOX_ENTRY_NOTFOUND) // Referenz zu gel?schter Marke
+ {
+ USHORT nPos = aTypeLB.InsertEntry(sName);
+ aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nFlag));
+ }
+
+ aTypeLB.SelectEntry(sName);
+ SetTypeSel(aTypeLB.GetSelectEntryPos());
+ }
+ else
+ {
+ SetTypeSel(0);
+ aTypeLB.SelectEntryPos(0);
+ }
+ }
+
+ if (nOld != GetTypeSel())
+ {
+ USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());
+
+ // Auswahl-Listbox fuellen
+ UpdateSubType();
+
+ BOOL bName = FALSE; nFldDlgFmtSel = 0;
+
+ if ( ( !IsFldEdit() || aSelectionLB.GetEntryCount() ) &&
+ nOld != LISTBOX_ENTRY_NOTFOUND )
+ {
+ aNameED.SetText(aEmptyStr);
+ aValueED.SetText(aEmptyStr);
+ }
+
+ switch (nTypeId)
+ {
+ case TYP_GETREFFLD:
+ if (REFFLDFLAG & (USHORT)(ULONG)aTypeLB.GetEntryData(nOld))
+ // dann bleibt die alte bestehen
+ nFldDlgFmtSel = aFormatLB.GetSelectEntryPos();
+ bName = TRUE;
+ break;
+
+ case TYP_SETREFFLD:
+ bName = TRUE;
+ break;
+
+ case REFFLDFLAG_BOOKMARK:
+ bName = TRUE;
+ // kein break!!!
+ default:
+ if( REFFLDFLAG & nTypeId )
+ {
+ USHORT nOldId = (USHORT)(ULONG)aTypeLB.GetEntryData(nOld);
+ if( nOldId & REFFLDFLAG || nOldId == TYP_GETREFFLD )
+ // dann bleibt die alte bestehen
+ nFldDlgFmtSel = aFormatLB.GetSelectEntryPos();
+ }
+ break;
+ }
+
+ aNameED.Enable(bName);
+ aNameFT.Enable(bName);
+
+ // Format-Listbox fuellen
+ USHORT nSize = FillFormatLB(nTypeId);
+ BOOL bFormat = nSize != 0;
+ aFormatLB.Enable(bFormat);
+ aFormatFT.Enable(bFormat);
+
+ SubTypeHdl();
+ ModifyHdl();
+ }
+
+ return 0;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+IMPL_LINK( SwFldRefPage, SubTypeHdl, ListBox *, EMPTYARG )
+{
+ USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());
+
+ switch(nTypeId)
+ {
+ case TYP_GETREFFLD:
+ if (!IsFldEdit() || aSelectionLB.GetSelectEntryCount())
+ {
+ aNameED.SetText(aSelectionLB.GetSelectEntry());
+ ModifyHdl(&aNameED);
+ }
+ break;
+
+ case TYP_SETREFFLD:
+ {
+ SwWrtShell *pSh = GetWrtShell();
+ if(!pSh)
+ pSh = ::GetActiveWrtShell();
+ if(pSh)
+ {
+ aValueED.SetText(pSh->GetSelTxt());
+ }
+
+ }
+ break;
+ // --> OD 2007-11-21 #i83479#
+ case REFFLDFLAG_HEADING:
+ case REFFLDFLAG_NUMITEM:
+ {
+ if ( aSelectionToolTipLB.GetCurEntry() )
+ {
+ aNameED.SetText( aSelectionToolTipLB.GetEntryText(
+ aSelectionToolTipLB.GetCurEntry() ) );
+ }
+ }
+ break;
+ // <--
+
+ default:
+ if (!IsFldEdit() || aSelectionLB.GetSelectEntryCount())
+ aNameED.SetText(aSelectionLB.GetSelectEntry());
+ break;
+ }
+
+ return 0;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Typen in SelectionLB erneuern
+ --------------------------------------------------------------------*/
+
+void SwFldRefPage::UpdateSubType()
+{
+ SwWrtShell *pSh = GetWrtShell();
+ if(!pSh)
+ pSh = ::GetActiveWrtShell();
+ SwGetRefField* pRefFld = (SwGetRefField*)GetCurField();
+ const USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());
+
+ String sOldSel;
+ // --> OD 2007-11-22 #i83479#
+ if ( aSelectionLB.IsVisible() )
+ {
+ const USHORT nSelectionSel = aSelectionLB.GetSelectEntryPos();
+ if (nSelectionSel != LISTBOX_ENTRY_NOTFOUND)
+ {
+ sOldSel = aSelectionLB.GetEntry(nSelectionSel);
+ }
+ }
+ // <--
+ if (IsFldEdit() && !sOldSel.Len())
+ sOldSel = String::CreateFromInt32( pRefFld->GetSeqNo() + 1 );
+
+ aSelectionLB.SetUpdateMode(FALSE);
+ aSelectionLB.Clear();
+ // --> OD 2007-11-21 #i83479#
+ aSelectionToolTipLB.SetUpdateMode(FALSE);
+ aSelectionToolTipLB.Clear();
+ bool bShowSelectionToolTipLB( false );
+ // <--
+
+ if( REFFLDFLAG & nTypeId )
+ {
+ if (nTypeId == REFFLDFLAG_BOOKMARK) // TextMarken!
+ {
+ aSelectionLB.SetStyle(aSelectionLB.GetStyle()|WB_SORT);
+ // alle Textmarken besorgen
+ IDocumentMarkAccess* const pMarkAccess = pSh->getIDocumentMarkAccess();
+ for(IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->getBookmarksBegin();
+ ppMark != pMarkAccess->getBookmarksEnd();
+ ppMark++)
+ {
+ const ::sw::mark::IMark* pBkmk = ppMark->get();
+ if(IDocumentMarkAccess::BOOKMARK == IDocumentMarkAccess::GetType(*pBkmk))
+ aSelectionLB.InsertEntry( pBkmk->GetName() );
+ }
+ if (IsFldEdit())
+ sOldSel = pRefFld->GetSetRefName();
+ }
+ else if (nTypeId == REFFLDFLAG_FOOTNOTE)
+ {
+ aSelectionLB.SetStyle(aSelectionLB.GetStyle() & ~WB_SORT);
+ SwSeqFldList aArr;
+ USHORT nCnt = pSh->GetSeqFtnList( aArr );
+
+ for( USHORT n = 0; n < nCnt; ++n )
+ {
+ aSelectionLB.InsertEntry( aArr[ n ]->sDlgEntry );
+ if (IsFldEdit() && pRefFld->GetSeqNo() == aArr[ n ]->nSeqNo)
+ sOldSel = aArr[n]->sDlgEntry;
+ }
+ }
+ else if (nTypeId == REFFLDFLAG_ENDNOTE)
+ {
+ aSelectionLB.SetStyle(aSelectionLB.GetStyle() & ~WB_SORT);
+ SwSeqFldList aArr;
+ USHORT nCnt = pSh->GetSeqFtnList( aArr, true );
+
+ for( USHORT n = 0; n < nCnt; ++n )
+ {
+ aSelectionLB.InsertEntry( aArr[ n ]->sDlgEntry );
+ if (IsFldEdit() && pRefFld->GetSeqNo() == aArr[ n ]->nSeqNo)
+ sOldSel = aArr[n]->sDlgEntry;
+ }
+ }
+ // --> OD 2007-11-14 #i83479#
+ else if ( nTypeId == REFFLDFLAG_HEADING )
+ {
+ bShowSelectionToolTipLB = true;
+
+ const IDocumentOutlineNodes* pIDoc( pSh->getIDocumentOutlineNodesAccess() );
+ pIDoc->getOutlineNodes( maOutlineNodes );
+ bool bCertainTxtNodeSelected( false );
+ SvLBoxEntry* pEntry = 0;
+ sal_uInt16 nOutlIdx = 0;
+ for ( nOutlIdx = 0; nOutlIdx < maOutlineNodes.size(); ++nOutlIdx )
+ {
+ pEntry = aSelectionToolTipLB.InsertEntry(
+ pIDoc->getOutlineText( nOutlIdx, true, true ) );
+ pEntry->SetUserData( reinterpret_cast<void*>(nOutlIdx) );
+ if ( ( IsFldEdit() &&
+ pRefFld->GetReferencedTxtNode() == maOutlineNodes[nOutlIdx] ) ||
+ GetSavedSelectedTxtNode() == maOutlineNodes[nOutlIdx] )
+ {
+ aSelectionToolTipLB.Select( pEntry );
+ sOldSel.Erase();
+ bCertainTxtNodeSelected = true;
+ }
+ else if ( !bCertainTxtNodeSelected &&
+ GetSavedSelectedPos() == nOutlIdx )
+ {
+ aSelectionToolTipLB.Select( pEntry );
+ sOldSel.Erase();
+ }
+ }
+ }
+ else if ( nTypeId == REFFLDFLAG_NUMITEM )
+ {
+ bShowSelectionToolTipLB = true;
+
+ const IDocumentListItems* pIDoc( pSh->getIDocumentListItemsAccess() );
+ pIDoc->getNumItems( maNumItems );
+ bool bCertainTxtNodeSelected( false );
+ SvLBoxEntry* pEntry = 0;
+ sal_uInt16 nNumItemIdx = 0;
+ for ( nNumItemIdx = 0; nNumItemIdx < maNumItems.size(); ++nNumItemIdx )
+ {
+ pEntry = aSelectionToolTipLB.InsertEntry(
+ pIDoc->getListItemText( *maNumItems[nNumItemIdx], true, true ) );
+ pEntry->SetUserData( reinterpret_cast<void*>(nNumItemIdx) );
+ if ( ( IsFldEdit() &&
+ pRefFld->GetReferencedTxtNode() == maNumItems[nNumItemIdx]->GetTxtNode() ) ||
+ GetSavedSelectedTxtNode() == maNumItems[nNumItemIdx]->GetTxtNode() )
+ {
+ aSelectionToolTipLB.Select( pEntry );
+ sOldSel.Erase();
+ bCertainTxtNodeSelected = true;
+ }
+ else if ( !bCertainTxtNodeSelected &&
+ GetSavedSelectedPos() == nNumItemIdx )
+ {
+ aSelectionToolTipLB.Select( pEntry );
+ sOldSel.Erase();
+ }
+ }
+ }
+ // <--
+ else
+ {
+ aSelectionLB.SetStyle(aSelectionLB.GetStyle()|WB_SORT);
+ // zum Seq-FeldTyp die Felder besorgen:
+
+ SwSetExpFieldType* pType = (SwSetExpFieldType*)pSh->GetFldType(
+ nTypeId & ~REFFLDFLAG, RES_SETEXPFLD );
+ if( pType )
+ {
+ SwSeqFldList aArr;
+ // old selection should be kept in non-edit mode
+ if(IsFldEdit())
+ sOldSel.Erase();
+
+ USHORT nCnt = pType->GetSeqFldList( aArr );
+ for( USHORT n = 0; n < nCnt; ++n )
+ {
+ aSelectionLB.InsertEntry( aArr[ n ]->sDlgEntry );
+ if (IsFldEdit() && !sOldSel.Len() &&
+ aArr[ n ]->nSeqNo == pRefFld->GetSeqNo())
+ sOldSel = aArr[ n ]->sDlgEntry;
+ }
+
+ if (IsFldEdit() && !sOldSel.Len())
+ sOldSel = String::CreateFromInt32( pRefFld->GetSeqNo() + 1);
+ }
+ }
+ }
+ else
+ {
+ SvStringsDtor aLst;
+ GetFldMgr().GetSubTypes(nTypeId, aLst);
+ for (USHORT i = 0; i < aLst.Count(); ++i)
+ aSelectionLB.InsertEntry(*aLst[i]);
+
+ if (IsFldEdit())
+ sOldSel = pRefFld->GetSetRefName();
+ }
+
+ // --> OD 2007-11-21 #i83479#
+ aSelectionToolTipLB.Show( bShowSelectionToolTipLB );
+ aSelectionLB.Show( !bShowSelectionToolTipLB );
+ if ( bShowSelectionToolTipLB )
+ {
+ aSelectionToolTipLB.SetUpdateMode(TRUE);
+
+ BOOL bEnable = aSelectionToolTipLB.GetEntryCount() != 0;
+ aSelectionToolTipLB.Enable( bEnable );
+ aSelectionFT.Enable( bEnable );
+
+ if ( aSelectionToolTipLB.GetCurEntry() != 0 )
+ {
+ aSelectionToolTipLB.MakeVisible( aSelectionToolTipLB.GetCurEntry() );
+ }
+
+ if ( IsFldEdit() && aSelectionToolTipLB.GetCurEntry() == 0 )
+ {
+ aNameED.SetText(sOldSel);
+ }
+ }
+ else
+ {
+ aSelectionLB.SetUpdateMode(TRUE);
+
+ // Enable oder Disable
+ BOOL bEnable = aSelectionLB.GetEntryCount() != 0;
+ aSelectionLB.Enable( bEnable );
+ aSelectionFT.Enable( bEnable );
+
+ if ( bEnable )
+ {
+ aSelectionLB.SelectEntry(sOldSel);
+ if (!aSelectionLB.GetSelectEntryCount() && !IsFldEdit())
+ aSelectionLB.SelectEntryPos(0);
+ }
+
+ if (IsFldEdit() && !aSelectionLB.GetSelectEntryCount()) // Falls die Referenz schon geloescht wurde...
+ aNameED.SetText(sOldSel);
+ }
+ // <--
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+USHORT SwFldRefPage::FillFormatLB(USHORT nTypeId)
+{
+ String sOldSel;
+
+ USHORT nFormatSel = aFormatLB.GetSelectEntryPos();
+ if (nFormatSel != LISTBOX_ENTRY_NOTFOUND)
+ sOldSel = aFormatLB.GetEntry(nFormatSel);
+
+ // Format-Listbox fuellen
+ aFormatLB.Clear();
+
+ // Referenz hat weniger als die Beschriftung
+ USHORT nSize( 0 );
+ bool bAddCrossRefFormats( false );
+ switch (nTypeId)
+ {
+ // --> OD 2007-11-16 #i83479#
+ case REFFLDFLAG_HEADING:
+ case REFFLDFLAG_NUMITEM:
+ bAddCrossRefFormats = true;
+ // intentional no break here
+ // <--
+
+ case TYP_GETREFFLD:
+ case REFFLDFLAG_BOOKMARK:
+ case REFFLDFLAG_FOOTNOTE:
+ case REFFLDFLAG_ENDNOTE:
+ nSize = FMT_REF_PAGE_PGDSC - FMT_REF_BEGIN + 1;
+ break;
+
+ default:
+ // --> OD 2007-11-16 #i83479#
+// nSize = GetFldMgr().GetFormatCount( (REFFLDFLAG & nTypeId)
+// ? (USHORT)TYP_GETREFFLD : nTypeId,
+// FALSE, IsFldDlgHtmlMode() );
+ if ( REFFLDFLAG & nTypeId )
+ {
+ nSize = FMT_REF_ONLYSEQNO - FMT_REF_BEGIN + 1;
+ }
+ else
+ {
+ nSize = GetFldMgr().GetFormatCount( nTypeId, FALSE, IsFldDlgHtmlMode() );
+ }
+ break;
+ }
+
+ if (REFFLDFLAG & nTypeId)
+ nTypeId = TYP_GETREFFLD;
+
+ for (USHORT i = 0; i < nSize; i++)
+ {
+ USHORT nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr( nTypeId, i ));
+ aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, i )));
+ }
+ // --> OD 2007-11-16 #i83479#
+ if ( bAddCrossRefFormats )
+ {
+ USHORT nFormat = FMT_REF_NUMBER - FMT_REF_BEGIN;
+ USHORT nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr( nTypeId, nFormat ));
+ aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, nFormat )));
+ nFormat = FMT_REF_NUMBER_NO_CONTEXT - FMT_REF_BEGIN;
+ nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr( nTypeId, nFormat ));
+ aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, nFormat )));
+ nFormat = FMT_REF_NUMBER_FULL_CONTEXT - FMT_REF_BEGIN;
+ nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr( nTypeId, nFormat ));
+ aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId( nTypeId, nFormat )));
+ nSize += 3;
+ }
+ // <--
+
+ // select a certain entry
+ if (nSize)
+ {
+ if (!IsFldEdit())
+ aFormatLB.SelectEntry(sOldSel);
+ else
+ aFormatLB.SelectEntry(SW_RESSTR(FMT_REF_BEGIN + (USHORT)GetCurField()->GetFormat()));
+
+ if (!aFormatLB.GetSelectEntryCount())
+ {
+ aFormatLB.SelectEntryPos(nFldDlgFmtSel);
+ if (!aFormatLB.GetSelectEntryCount())
+ aFormatLB.SelectEntryPos(0);
+ }
+ }
+
+ return nSize;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Modify
+ --------------------------------------------------------------------*/
+
+IMPL_LINK( SwFldRefPage, ModifyHdl, Edit *, EMPTYARG )
+{
+ String aName(aNameED.GetText());
+ const USHORT nLen = aName.Len();
+
+ BOOL bEnable = TRUE;
+ USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());
+
+ if ((nTypeId == TYP_SETREFFLD && !GetFldMgr().CanInsertRefMark(aName)) ||
+ (nLen == 0 && (nTypeId == TYP_GETREFFLD || nTypeId == TYP_SETREFFLD ||
+ nTypeId == REFFLDFLAG_BOOKMARK)))
+ bEnable = FALSE;
+
+ EnableInsert(bEnable);
+
+ aSelectionLB.SelectEntry(aName);
+
+ return 0;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+BOOL SwFldRefPage::FillItemSet(SfxItemSet& )
+{
+ BOOL bModified = FALSE;
+ USHORT nTypeId = (USHORT)(ULONG)aTypeLB.GetEntryData(GetTypeSel());
+
+ USHORT nSubType = 0;
+ ULONG nFormat;
+
+ nFormat = aFormatLB.GetSelectEntryPos();
+
+ if(nFormat == LISTBOX_ENTRY_NOTFOUND)
+ nFormat = 0;
+ else
+ nFormat = (ULONG)aFormatLB.GetEntryData((USHORT)nFormat);
+
+ String aVal(aValueED.GetText());
+ String aName(aNameED.GetText());
+
+ switch(nTypeId)
+ {
+ case TYP_GETREFFLD:
+ // aName = aSelectionLB.GetSelectEntry();
+ nSubType = REF_SETREFATTR;
+ break;
+
+ case TYP_SETREFFLD:
+ {
+ SwFieldType* pType = GetFldMgr().GetFldType(RES_SETEXPFLD, aName);
+
+ if(!pType) // Nur einfuegen, wenn es den Namen noch nicht gibt
+ {
+ aSelectionLB.InsertEntry(aName);
+ aSelectionLB.Enable();
+ aSelectionFT.Enable();
+ }
+ break;
+ }
+ }
+
+ SwGetRefField* pRefFld = (SwGetRefField*)GetCurField();
+
+ if (REFFLDFLAG & nTypeId)
+ {
+ SwWrtShell *pSh = GetWrtShell();
+ if(!pSh)
+ {
+ pSh = ::GetActiveWrtShell();
+ }
+ if (nTypeId == REFFLDFLAG_BOOKMARK) // TextMarken!
+ {
+ aName = aNameED.GetText();
+ nTypeId = TYP_GETREFFLD;
+ nSubType = REF_BOOKMARK;
+ }
+ else if (REFFLDFLAG_FOOTNOTE == nTypeId) // Fussnoten
+ {
+ SwSeqFldList aArr;
+ _SeqFldLstElem aElem( aSelectionLB.GetSelectEntry(), 0 );
+
+ USHORT nPos;
+
+ nTypeId = TYP_GETREFFLD;
+ nSubType = REF_FOOTNOTE;
+ aName.Erase();
+
+ if (pSh->GetSeqFtnList(aArr) && aArr.SeekEntry(aElem, &nPos))
+ {
+ aVal = String::CreateFromInt32( aArr[nPos]->nSeqNo );
+
+ if (IsFldEdit() && aArr[nPos]->nSeqNo == pRefFld->GetSeqNo())
+ bModified = TRUE; // Kann bei Feldern passieren, deren Referenz geloescht wurde
+ }
+ else if (IsFldEdit())
+ aVal = String::CreateFromInt32( pRefFld->GetSeqNo() );
+ }
+ else if (REFFLDFLAG_ENDNOTE == nTypeId) // Endnoten
+ {
+ SwSeqFldList aArr;
+ _SeqFldLstElem aElem( aSelectionLB.GetSelectEntry(), 0 );
+
+ USHORT nPos;
+
+ nTypeId = TYP_GETREFFLD;
+ nSubType = REF_ENDNOTE;
+ aName.Erase();
+
+ if (pSh->GetSeqFtnList(aArr, true) && aArr.SeekEntry(aElem, &nPos))
+ {
+ aVal = String::CreateFromInt32( aArr[nPos]->nSeqNo );
+
+ if (IsFldEdit() && aArr[nPos]->nSeqNo == pRefFld->GetSeqNo())
+ bModified = TRUE; // Kann bei Feldern passieren, deren Referenz geloescht wurde
+ }
+ else if (IsFldEdit())
+ aVal = String::CreateFromInt32( pRefFld->GetSeqNo() );
+ }
+ // --> OD 2007-11-16 #i83479#
+ else if ( nTypeId == REFFLDFLAG_HEADING )
+ {
+ SvLBoxEntry* pEntry = aSelectionToolTipLB.GetCurEntry();
+ ASSERT( pEntry,
+ "<SwFldRefPage::FillItemSet(..)> - no entry selected in selection tool tip listbox!" );
+ if ( pEntry )
+ {
+ const sal_uInt16 nOutlIdx( static_cast<sal_uInt16>(reinterpret_cast<ULONG>(pEntry->GetUserData())) );
+ pSh->getIDocumentOutlineNodesAccess()->getOutlineNodes( maOutlineNodes );
+ if ( nOutlIdx < maOutlineNodes.size() )
+ {
+ ::sw::mark::IMark const * const pMark = pSh->getIDocumentMarkAccess()->getMarkForTxtNode(
+ *(maOutlineNodes[nOutlIdx]),
+ IDocumentMarkAccess::CROSSREF_HEADING_BOOKMARK);
+ aName = pMark->GetName();
+ nTypeId = TYP_GETREFFLD;
+ nSubType = REF_BOOKMARK;
+ }
+ }
+ }
+ else if ( nTypeId == REFFLDFLAG_NUMITEM )
+ {
+ SvLBoxEntry* pEntry = aSelectionToolTipLB.GetCurEntry();
+ ASSERT( pEntry,
+ "<SwFldRefPage::FillItemSet(..)> - no entry selected in selection tool tip listbox!" );
+ if ( pEntry )
+ {
+ const sal_uInt16 nNumItemIdx( static_cast<sal_uInt16>(reinterpret_cast<ULONG>(pEntry->GetUserData())) );
+ pSh->getIDocumentListItemsAccess()->getNumItems( maNumItems );
+ if ( nNumItemIdx < maNumItems.size() )
+ {
+ ::sw::mark::IMark const * const pMark = pSh->getIDocumentMarkAccess()->getMarkForTxtNode(
+ *(maNumItems[nNumItemIdx]->GetTxtNode()),
+ IDocumentMarkAccess::CROSSREF_NUMITEM_BOOKMARK);
+ aName = pMark->GetName();
+ nTypeId = TYP_GETREFFLD;
+ nSubType = REF_BOOKMARK;
+ }
+ }
+ }
+ // <--
+ else // SeqenceFelder
+ {
+ // zum Seq-FeldTyp die Felder besorgen:
+ SwSetExpFieldType* pType = (SwSetExpFieldType*)pSh->GetFldType(
+ nTypeId & ~REFFLDFLAG, RES_SETEXPFLD );
+ if( pType )
+ {
+ SwSeqFldList aArr;
+ _SeqFldLstElem aElem( aSelectionLB.GetSelectEntry(), 0 );
+
+ USHORT nPos;
+
+ nTypeId = TYP_GETREFFLD;
+ nSubType = REF_SEQUENCEFLD;
+ aName = pType->GetName();
+
+ if (pType->GetSeqFldList(aArr) && aArr.SeekEntry(aElem, &nPos))
+ {
+ aVal = String::CreateFromInt32( aArr[nPos]->nSeqNo );
+
+ if (IsFldEdit() && aArr[nPos]->nSeqNo == pRefFld->GetSeqNo())
+ bModified = TRUE; // Kann bei Feldern passieren, deren Referenz geloescht wurde
+ }
+ else if (IsFldEdit())
+ aVal = String::CreateFromInt32( pRefFld->GetSeqNo() );
+ }
+ }
+ }
+
+ if (IsFldEdit() && nTypeId == TYP_GETREFFLD)
+ {
+ aVal.Insert('|', 0);
+ aVal.Insert(String::CreateFromInt32(nSubType), 0);
+ }
+
+ if (!IsFldEdit() || bModified ||
+ aNameED.GetSavedValue() != aNameED.GetText() ||
+ aValueED.GetSavedValue() != aValueED.GetText() ||
+ aTypeLB.GetSavedValue() != aTypeLB.GetSelectEntryPos() ||
+ aSelectionLB.GetSavedValue() != aSelectionLB.GetSelectEntryPos() ||
+ aFormatLB.GetSavedValue() != aFormatLB.GetSelectEntryPos())
+ {
+ InsertFld( nTypeId, nSubType, aName, aVal, nFormat );
+ }
+
+ ModifyHdl(); // Insert ggf enablen/disablen
+
+ return FALSE;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+SfxTabPage* SwFldRefPage::Create( Window* pParent,
+ const SfxItemSet& rAttrSet )
+{
+ return ( new SwFldRefPage( pParent, rAttrSet ) );
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung:
+ --------------------------------------------------------------------*/
+
+USHORT SwFldRefPage::GetGroup()
+{
+ return GRP_REF;
+}
+
+/* -----------------12.01.99 10:09-------------------
+ *
+ * --------------------------------------------------*/
+void SwFldRefPage::FillUserData()
+{
+ String sData( String::CreateFromAscii(
+ RTL_CONSTASCII_STRINGPARAM( USER_DATA_VERSION )));
+ sData += ';';
+ USHORT nTypeSel = aTypeLB.GetSelectEntryPos();
+ if( LISTBOX_ENTRY_NOTFOUND == nTypeSel )
+ nTypeSel = USHRT_MAX;
+ else
+ nTypeSel = sal::static_int_cast< USHORT >(reinterpret_cast< sal_uIntPtr >(aTypeLB.GetEntryData( nTypeSel )));
+ sData += String::CreateFromInt32( nTypeSel );
+ SetUserData(sData);
+}
+