Files
libreoffice/sw/source/core/doc/docdde.cxx
Ivo Hinkelmann df6d312ca5 CWS-TOOLING: integrate CWS swrefactormarks2
2009-04-09 12:51:41 +0200 b_michaelsen  r270689 : #i94949# cleaned up assertions after rebasing
2009-04-08 17:37:08 +0200 b_michaelsen  r270658 : fixing sw/source/ui/utlui/makefile.mk
2009-04-07 17:56:54 +0200 b_michaelsen  r270606 : added bookctrl.cxx to EXCEPTIONFILES, because this is needed for stl on unxsols4
2009-04-07 17:05:20 +0200 b_michaelsen  r270603 : added crbm.cxx to EXCEPTIONFILES, because this is needed for stl on unxsols4
2009-04-02 23:44:38 +0200 b_michaelsen  r270436 : CWS-TOOLING: rebase CWS swrefactormarks2 to trunk@270033 (milestone: DEV300:m45)
2009-02-27 16:25:31 +0100 b_michaelsen  r268606 : #i94949# fixed Windows buildbreaker
2009-02-25 18:01:13 +0100 b_michaelsen  r268464 : #i94949# Bookmarktest document filter roundtrips
2009-02-24 18:23:55 +0100 b_michaelsen  r268404 : #i94949# Bookmark unittests
2009-02-23 19:47:44 +0100 b_michaelsen  r268370 : #i94949# added unittest for bookmarks
2009-02-23 12:22:07 +0100 b_michaelsen  r268348 : #i94949# fixing CheckCrossReferences testcase
2009-02-20 18:12:50 +0100 b_michaelsen  r268335 : #i94949# fixing SwXTextRange
2009-02-18 18:32:57 +0100 b_michaelsen  r268252 : #i94949# deregistering DdeBookmarks on delete
2009-02-18 18:29:08 +0100 b_michaelsen  r268251 : fixing dbgoutsw.cxx for debug builds
2009-02-16 18:42:43 +0100 b_michaelsen  r267834 : CWS-TOOLING: rebase CWS swrefactormarks2 to trunk@267171 (milestone: DEV300:m41)
2009-02-12 15:32:02 +0100 b_michaelsen  r267667 : #i94949 fixed crossrefbookmark naming
2009-02-11 18:30:08 +0100 b_michaelsen  r267624 : #94949# fixing bookmark navigation
2009-02-11 13:55:26 +0100 b_michaelsen  r267599 : #i94949# fixed bookmark naming
2009-02-10 17:53:05 +0100 b_michaelsen  r267571 : #i94949# renamed HasOtherMarkPos to IsExpanded
2009-02-10 17:23:01 +0100 b_michaelsen  r267564 : #i94949# renamed ::sw::bookmark namespace to more fitting ::sw::mark
2009-02-10 16:16:32 +0100 b_michaelsen  r267553 : #i94949# creating only CrossRefBookmark per Txtnode
2009-02-10 12:14:05 +0100 b_michaelsen  r267547 : #i94949# fixed bookmark count in navigator
2009-02-09 19:12:18 +0100 b_michaelsen  r267532 : #i94949# lcl_CopyBookmarks(..) - handle marks on boundaries correctly
2009-02-09 17:32:45 +0100 b_michaelsen  r267524 : #i94949# setting the refobject of the DdeBookmark in Sin SwServerObject::SetDdeBookmark(..)
2009-02-09 17:22:15 +0100 b_michaelsen  r267523 : #i94949# trying to harden SwServerObject
2009-02-09 16:47:32 +0100 b_michaelsen  r267521 : #i94949# lcl_CopyBookmarks(..): try to get the source mark name, if possible
2009-02-09 16:05:42 +0100 b_michaelsen  r267519 : #i94949# clearing the OtherMarkPos if PaM has no mark in repositionMark(..), swapping inverted bookmarks without hissing an assertion
2009-02-09 15:55:38 +0100 b_michaelsen  r267518 : #i94949# checking for out-of-bounds in SwView::ExecuteStatusLine(..)
2009-02-09 15:23:47 +0100 b_michaelsen  r267517 : #i94949# using an UNO_BOOKMARK in ui/dbui/dbinsdlg.cxx
2009-02-09 14:14:47 +0100 b_michaelsen  r267514 : #i94949# IDocumentMarkAccess::GetType(..) asserts on unknown type
2009-02-09 14:04:25 +0100 b_michaelsen  r267513 : #i94949# using rtl strings instead of tools-strings in CrossRefBookmarks
2009-02-09 13:55:01 +0100 b_michaelsen  r267510 : #i94949# using empty string for UnoMark construction
2009-02-09 13:46:46 +0100 b_michaelsen  r267509 : #i94949# removed superfluous #includes, removed superfluous member DdeBookmark::bGenerateName, initialized DdeBookmark::m_aRefObj removed superfluous local _FindItem::ClearObj
2009-02-06 14:38:37 +0100 b_michaelsen  r267462 : #i94949# fixing FN_STAT_BOOKMARK dispatches
2009-02-05 18:05:07 +0100 b_michaelsen  r267436 : #i94949# removing superfluous #includes
2009-02-04 15:51:31 +0100 b_michaelsen  r267391 : fixing resync merge error
2009-02-02 19:39:55 +0100 b_michaelsen  r267294 : #i94949# bookmark performance
2009-01-30 19:30:51 +0100 b_michaelsen  r267229 : #i94949# throwing IllegalArgumentException, if appropriate
2009-01-30 19:29:56 +0100 b_michaelsen  r267228 : #i94949# refactored lcl_FillBookmarkArray, comments, constness
2009-01-30 19:23:49 +0100 b_michaelsen  r267227 : #i94949# refactored lcl_FillBookmarkArray, comments, constness
2009-01-30 19:16:06 +0100 b_michaelsen  r267226 : #i94949# refactored lcl_FillBookmarkArray
2009-01-30 17:59:27 +0100 b_michaelsen  r267222 : #i94949# removed superficial #include
2009-01-30 17:50:02 +0100 b_michaelsen  r267220 : #i94949# SwXTextRange remembers its UNO bookmark
2009-01-29 20:19:58 +0100 b_michaelsen  r267168 : #i94949# implemented IDocumentMarkAccess::findBookmark
2009-01-29 17:22:17 +0100 b_michaelsen  r267162 : #i94949# implemented renameMark in Markmanager
2009-01-29 14:17:10 +0100 b_michaelsen  r267134 : #i94949# cleanup in SwXBookmark, whitespace
2009-01-29 13:21:54 +0100 b_michaelsen  r267125 : #i94949# cleanup in SwXBookmark, whitespace
2009-01-29 13:06:10 +0100 b_michaelsen  r267120 : #i94949# cleanup in SwXBookmark, whitespace
2009-01-29 13:00:09 +0100 b_michaelsen  r267118 : #i94949# cleanup in SwXBookmark, whitespace
2009-01-29 10:35:10 +0100 b_michaelsen  r267101 : #i94949# renamed SetCrsrToBkmk to SetCrsrToMark, moving to start/end of doc if no more bookmarks can be found
2009-01-28 17:05:36 +0100 b_michaelsen  r267070 : #i94949# fixed order in aProvNamesId in unocoll.cxx
2009-01-28 15:46:13 +0100 b_michaelsen  r267063 : #i94949# documentation
2009-01-28 15:36:59 +0100 b_michaelsen  r267062 : #i94949# removing superficial #include
2009-01-28 15:30:36 +0100 b_michaelsen  r267061 : #i94949# basic code conventions
2009-01-28 11:14:30 +0100 b_michaelsen  r267039 : #i94949# comparing to the actual name of the new mark
2009-01-26 15:22:25 +0100 b_michaelsen  r266927 : #i94949# performance fixes
2009-01-14 21:16:56 +0100 b_michaelsen  r266332 : #i94949# fixing linux x86-64 compiler warnings
2009-01-14 19:52:06 +0100 b_michaelsen  r266331 : #i94949# fixing some compiler warnings
2008-12-15 13:04:49 +0100 b_michaelsen  r265474 : #i94949# fixed microsoft compiler warnings
2008-12-12 18:26:02 +0100 b_michaelsen  r265434 : #i94949# fixed pro platform buildbreakers
2008-12-11 17:51:24 +0100 b_michaelsen  r265342 : CWS-TOOLING: rebase CWS swrefactormarks2 to trunk@264807 (milestone: DEV300:m37)
2008-12-09 18:30:59 +0100 b_michaelsen  r265134 : #i94949# fixed IDocumentMarkAccess::GetType for new mark inheritance tree
2008-12-09 16:56:26 +0100 b_michaelsen  r265118 : #i94949# fixed deleteMark optimization
2008-12-09 14:55:58 +0100 b_michaelsen  r265092 : #i94949# DdeLink and DdeBookmark
2008-12-05 18:28:05 +0100 b_michaelsen  r264914 : #i94949# fixed InitDoc in bookmarks
2008-12-02 02:23:51 +0100 b_michaelsen  r264649 : #i94949# removed obsolete naming proposal code in SwXTextRange, fixed navigator reminders to forget the oldest reminder when the pool is empty
2008-12-02 02:05:19 +0100 b_michaelsen  r264648 : #i94949# using bisect search for delete
2008-12-02 01:58:16 +0100 b_michaelsen  r264647 : #i94949# using bisect search for delete
2008-12-02 01:37:33 +0100 b_michaelsen  r264646 : #i94949# using bisect search for delete
2008-12-02 01:03:29 +0100 b_michaelsen  r264645 : #i94949# fixed deleteMark crash
2008-12-01 20:55:00 +0100 b_michaelsen  r264638 : #i94949# removed crossrefs from ui enumerations
2008-12-01 15:48:12 +0100 b_michaelsen  r264613 : #i94949# removed superfluous local functions
2008-12-01 15:01:19 +0100 b_michaelsen  r264608 : #i94949# optimized insertion of new marks
2008-12-01 14:33:21 +0100 b_michaelsen  r264603 : #i94949# simplified code finding Fieldmark for a position
2008-12-01 14:05:55 +0100 b_michaelsen  r264598 : #i94949# fixed reverse travelling through marks, removed obsolete getUniqueMarkName()
2008-11-27 18:48:15 +0100 b_michaelsen  r264515 : #i94949# fixed _SaveCntntIdx and friends
2008-11-27 15:59:49 +0100 b_michaelsen  r264500 : #i94949# fix Mark position only in ctor
2008-11-27 15:52:28 +0100 b_michaelsen  r264497 : #i94949# fixed Bug in SwXBookmark, was using pDoc too early
2008-11-26 14:54:22 +0100 b_michaelsen  r264396 : #i94949# fixed documentation, simplified  navigator reminder code
2008-11-24 20:45:51 +0100 b_michaelsen  r264266 : #i94949# removed last obsolete getUniqueMarkName calls
2008-11-24 20:21:35 +0100 b_michaelsen  r264265 : #i94949# fixed typo in IDocumentMarkAccess, removed obsolete getUniqueMarkName calls
2008-11-24 18:34:32 +0100 b_michaelsen  r264264 : #i94949# repositioning of Marks, removed possibility to delete marks by name in the core, refactoring of navigator reminder generation
2008-11-21 14:08:49 +0100 b_michaelsen  r264137 : #i94949# simplified makeMark
2008-11-21 12:07:09 +0100 b_michaelsen  r264120 : #i94949# moved ShortName and KeyCode from IMark to IBookmark
2008-11-19 12:50:49 +0100 b_michaelsen  r263981 : #i94949# starting refactoring of bookmark naming
2008-11-19 11:31:08 +0100 b_michaelsen  r263972 : #i94949# getting rid of obsolete dynamic casts
2008-11-18 19:06:09 +0100 b_michaelsen  r263795 : #i94949# getting rid of index based mark access, IDocumentMarkAccess already provides iterators
2008-11-18 17:50:18 +0100 b_michaelsen  r263792 : #i94949# getting rid of index based mark access, IDocumentMarkAccess already provides iterators
2008-11-18 16:48:20 +0100 b_michaelsen  r263783 : #i94949# removed methods from crsrsh which are already available directly via IDocumentMarkAccess
2008-11-18 11:31:35 +0100 b_michaelsen  r263753 : #i94949# cleaning up mark code in crsrsh
2008-11-17 10:15:25 +0100 b_michaelsen  r263705 : #i94949# removed possible integer overflow
2008-11-14 18:48:45 +0100 b_michaelsen  r263695 : #i94949# management of mark names in MarkManager
2008-11-14 18:23:40 +0100 b_michaelsen  r263693 : #i94949# using polymorphism to do mark-specific setup in SwDoc
2008-11-14 16:27:09 +0100 b_michaelsen  r263684 : #i94949# got rid of makeCrossRefBookmark
2008-11-14 13:03:32 +0100 b_michaelsen  r263674 : #i94949# refactored Correction methods
2008-11-13 12:27:55 +0100 b_michaelsen  r263631 : #i94949# got rid of old-style tools assertions in new code
2008-11-12 16:58:16 +0100 b_michaelsen  r263608 : #i94949# added assertion for unique names
2008-11-12 16:55:18 +0100 b_michaelsen  r263607 : #i94949# maked XFormField deprecated
2008-11-12 13:04:29 +0100 b_michaelsen  r263587 : #i94949# replaced IDocumentMarkAccess::GetType with simple dynamic_cast where possible
2008-11-11 18:45:53 +0100 b_michaelsen  r263572 : #i94949# cleaned up SwHstryBookmark
2008-11-11 13:48:18 +0100 b_michaelsen  r263557 : #i94949# removed dynamic_casts to SwModify by inheriting IMark from it
2008-11-11 11:26:28 +0100 b_michaelsen  r263548 : #i94949# fixed SwXBookmark
2008-11-10 17:01:19 +0100 b_michaelsen  r263529 : #i94949# fixed DdeBookmarks in clipboard
2008-11-10 16:44:52 +0100 b_michaelsen  r263527 : #i94949# formatting
2008-11-10 16:29:16 +0100 b_michaelsen  r263526 : #i94949# fixing unoobj.cxx
2008-11-10 16:23:50 +0100 b_michaelsen  r263525 : #i94949# cleaning up crossrefbookmark.cxx/.hxx
2008-11-10 16:02:08 +0100 b_michaelsen  r263524 : #i94949# Pdf Export should only generate 'real' bookmarks
2008-11-10 15:33:58 +0100 b_michaelsen  r263521 : #i94949# removed const_casts
2008-11-10 15:12:06 +0100 b_michaelsen  r263520 : #i94949# moved _DelBookmarks into MarksManager
2008-11-07 18:48:38 +0100 b_michaelsen  r263480 : #i94949# using iterator interface
2008-11-07 18:41:46 +0100 b_michaelsen  r263478 : #i94949# using iterator interface
2008-11-07 18:07:41 +0100 b_michaelsen  r263477 : #i94949# using iterator interface
2008-11-07 17:54:41 +0100 b_michaelsen  r263476 : #i94949# using iterator interface
2008-11-07 17:44:41 +0100 b_michaelsen  r263475 : #i94949# moved correction methods into MarkManager
2008-11-06 18:47:28 +0100 b_michaelsen  r263404 : #i94949# getting rid of superfluous const_casts
2008-11-06 17:58:01 +0100 b_michaelsen  r263403 : #i94949# no more setting of mark positions outside of the core
2008-11-06 17:08:37 +0100 b_michaelsen  r263401 : #i94949# removed setters from IMark
2008-11-06 13:55:25 +0100 b_michaelsen  r263383 : #i94949 SwDoc does not implement IDocumentMarkAccess anymore
2008-11-04 18:17:03 +0100 b_michaelsen  r263333 : #i94949# began removing IDocumentMarkAccess from SwDoc
2008-11-04 16:48:34 +0100 b_michaelsen  r263330 : removing dead code (SwBitArray) found by mst
2008-11-04 16:29:32 +0100 b_michaelsen  r263329 : removing dead code (SwBitArray) found by mst
2008-11-04 14:57:48 +0100 b_michaelsen  r263326 : removing dead code (SwBitArray) found by mst
2008-11-04 14:50:18 +0100 b_michaelsen  r263325 : #i94949# stricter typing in IDocumentMarkAccess
2008-10-24 15:16:27 +0200 b_michaelsen  r262647 : #i94949# renamed ::sw:🔖:SimpleMark to NavigatorReminder to fit the IDocumentMarkAccess enum
2008-10-24 15:10:10 +0200 b_michaelsen  r262646 : #i94949# only 'real' bookmark implement IBookmark, Marks also get removed from m_vFieldmarks on delete/clear
2008-10-24 13:06:23 +0200 b_michaelsen  r262636 : #i94949# Fieldmark tabnavigation
2008-10-23 12:16:36 +0200 b_michaelsen  r262619 : #i94949# Fieldmark classes and filters
2008-10-22 13:17:18 +0200 b_michaelsen  r262597 : #i94949# writer import fixes
2008-10-21 11:30:38 +0200 b_michaelsen  r262565 : #i94949# renamed methods containing Bookmark in the generic IMark interface
2008-10-20 14:09:02 +0200 b_michaelsen  r262318 : #i94949# fixed SwDoc::CorrRel
2008-10-16 22:45:13 +0200 b_michaelsen  r262273 : #i94949 simplified Before/After methods
2008-10-16 21:40:57 +0200 b_michaelsen  r262271 : #i94949 renamed SimpleMark to NavigatorReminder
2008-10-16 21:15:23 +0200 b_michaelsen  r262270 : #i94949 using shared_ptr only in MarkManager
2008-10-16 17:46:37 +0200 b_michaelsen  r262269 : #i94949# getFieldmarkBefore and getFieldmarkAfter
2008-10-16 17:12:13 +0200 b_michaelsen  r262265 : #i94949# cleanup in crbm.cxx
2008-10-16 12:49:01 +0200 b_michaelsen  r262257 : #i94949# fixed usage of invalid iterator, fixed invalid cast
2008-10-15 15:34:20 +0200 b_michaelsen  r262239 : #i94949# added moved files
2008-10-15 15:26:45 +0200 b_michaelsen  r262237 : #i94949# initial reimplementation of Bookmarks
2009-04-21 15:40:02 +00:00

360 lines
12 KiB
C++

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: docdde.cxx,v $
* $Revision: 1.14 $
*
* 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"
#include <stdlib.h>
#ifndef _APP_HXX
#include <vcl/svapp.hxx>
#endif
#include <tools/urlobj.hxx>
#define _SVSTDARR_STRINGS
#include <svtools/svstdarr.hxx>
#include <svx/linkmgr.hxx> // LinkManager
#include <unotools/charclass.hxx>
#include <fmtcntnt.hxx>
#include <doc.hxx>
#include <swserv.hxx> // fuer Server-Funktionalitaet
#include <IMark.hxx>
#include <bookmrk.hxx>
#include <section.hxx> // fuer SwSectionFmt
#include <swtable.hxx> // fuer SwTable
#include <node.hxx>
#include <ndtxt.hxx>
#include <pam.hxx>
#include <docary.hxx>
#include <MarkManager.hxx>
using namespace ::com::sun::star;
namespace
{
static ::sw::mark::DdeBookmark* const lcl_FindDdeBookmark(const IDocumentMarkAccess& rMarkAccess, const String& rName)
{
//Iterating over all bookmarks, checking DdeBookmarks
const String sNameLc = GetAppCharClass().lower(rName);
for(IDocumentMarkAccess::const_iterator_t ppMark = rMarkAccess.getMarksBegin();
ppMark != rMarkAccess.getMarksEnd();
ppMark++)
{
::sw::mark::DdeBookmark* const pBkmk = dynamic_cast< ::sw::mark::DdeBookmark*>(ppMark->get());
if(pBkmk && GetAppCharClass().lower(pBkmk->GetName()) == sNameLc)
return pBkmk;
}
return NULL;
}
}
struct _FindItem
{
const String& rItem;
SwTableNode* pTblNd;
SwSectionNode* pSectNd;
_FindItem(const String& rS)
: rItem(rS), pTblNd(0), pSectNd(0)
{}
};
BOOL lcl_FindSection( const SwSectionFmtPtr& rpSectFmt, void* pArgs )
{
SwSection* pSect = rpSectFmt->GetSection();
if( pSect )
{
String sNm( GetAppCharClass().lower( pSect->GetName() ));
if( sNm.Equals( ((_FindItem*)pArgs)->rItem ))
{
// gefunden, als erfrage die Daten
const SwNodeIndex* pIdx;
if( 0 != (pIdx = rpSectFmt->GetCntnt().GetCntntIdx() ) &&
&rpSectFmt->GetDoc()->GetNodes() == &pIdx->GetNodes() )
{
// eine Tabelle im normalen NodesArr
((_FindItem*)pArgs)->pSectNd = pIdx->GetNode().GetSectionNode();
return FALSE;
}
//nein!! // sollte der Namen schon passen, der Rest aber nicht, dann haben wir
// sie nicht. Die Namen sind immer eindeutig.
}
}
return TRUE; // dann weiter
}
BOOL lcl_FindTable( const SwFrmFmtPtr& rpTableFmt, void* pArgs )
{
String sNm( GetAppCharClass().lower( rpTableFmt->GetName() ));
if( sNm.Equals( ((_FindItem*)pArgs)->rItem ))
{
SwTable* pTmpTbl;
SwTableBox* pFBox;
if( 0 != ( pTmpTbl = SwTable::FindTable( rpTableFmt ) ) &&
0 != ( pFBox = pTmpTbl->GetTabSortBoxes()[0] ) &&
pFBox->GetSttNd() &&
&rpTableFmt->GetDoc()->GetNodes() == &pFBox->GetSttNd()->GetNodes() )
{
// eine Tabelle im normalen NodesArr
((_FindItem*)pArgs)->pTblNd = (SwTableNode*)
pFBox->GetSttNd()->FindTableNode();
return FALSE;
}
//nein! // sollte der Namen schon passen, der Rest aber nicht, dann haben wir
// sie nicht. Die Namen sind immer eindeutig.
}
return TRUE; // dann weiter
}
bool SwDoc::GetData( const String& rItem, const String& rMimeType,
uno::Any & rValue ) const
{
::sw::mark::DdeBookmark* const pBkmk = lcl_FindDdeBookmark(*pMarkManager, rItem);
if(pBkmk) return SwServerObject(*pBkmk).GetData(rValue, rMimeType);
// haben wir ueberhaupt das Item vorraetig?
String sItem(GetAppCharClass().lower(rItem));
_FindItem aPara( sItem );
((SwSectionFmts&)*pSectionFmtTbl).ForEach( 0, pSectionFmtTbl->Count(),
lcl_FindSection, &aPara );
if( aPara.pSectNd )
{
// gefunden, als erfrage die Daten
return SwServerObject( *aPara.pSectNd ).GetData( rValue, rMimeType );
}
((SwFrmFmts*)pTblFrmFmtTbl)->ForEach( 0, pTblFrmFmtTbl->Count(),
lcl_FindTable, &aPara );
if( aPara.pTblNd )
{
return SwServerObject( *aPara.pTblNd ).GetData( rValue, rMimeType );
}
return FALSE;
}
bool SwDoc::SetData( const String& rItem, const String& rMimeType,
const uno::Any & rValue )
{
::sw::mark::DdeBookmark* const pBkmk = lcl_FindDdeBookmark(*pMarkManager, rItem);
if(pBkmk) return SwServerObject(*pBkmk).SetData(rMimeType, rValue);
// haben wir ueberhaupt das Item vorraetig?
String sItem(GetAppCharClass().lower(rItem));
_FindItem aPara( sItem );
pSectionFmtTbl->ForEach( 0, pSectionFmtTbl->Count(), lcl_FindSection, &aPara );
if( aPara.pSectNd )
{
// gefunden, als erfrage die Daten
return SwServerObject( *aPara.pSectNd ).SetData( rMimeType, rValue );
}
pTblFrmFmtTbl->ForEach( 0, pTblFrmFmtTbl->Count(), lcl_FindTable, &aPara );
if( aPara.pTblNd )
{
return SwServerObject( *aPara.pTblNd ).SetData( rMimeType, rValue );
}
return FALSE;
}
::sfx2::SvLinkSource* SwDoc::CreateLinkSource(const String& rItem)
{
SwServerObject* pObj = NULL;
// bookmarks
::sw::mark::DdeBookmark* const pBkmk = lcl_FindDdeBookmark(*pMarkManager, rItem);
if(pBkmk && pBkmk->IsExpanded()
&& (0 == (pObj = pBkmk->GetRefObject())))
{
// mark found, but no link yet -> create hotlink
pObj = new SwServerObject(*pBkmk);
pBkmk->SetRefObject(pObj);
GetLinkManager().InsertServer(pObj);
}
if(pObj) return pObj;
_FindItem aPara(GetAppCharClass().lower(rItem));
// sections
((SwSectionFmts&)*pSectionFmtTbl).ForEach(0, pSectionFmtTbl->Count(), lcl_FindSection, &aPara);
if(aPara.pSectNd
&& (0 == (pObj = aPara.pSectNd->GetSection().GetObject())))
{
// section found, but no link yet -> create hotlink
pObj = new SwServerObject( *aPara.pSectNd );
aPara.pSectNd->GetSection().SetRefObject( pObj );
GetLinkManager().InsertServer(pObj);
}
if(pObj) return pObj;
// tables
((SwFrmFmts*)pTblFrmFmtTbl)->ForEach(0, pTblFrmFmtTbl->Count(), lcl_FindTable, &aPara);
if(aPara.pTblNd
&& (0 == (pObj = aPara.pTblNd->GetTable().GetObject())))
{
// table found, but no link yet -> create hotlink
pObj = new SwServerObject(*aPara.pTblNd);
aPara.pTblNd->GetTable().SetRefObject(pObj);
GetLinkManager().InsertServer(pObj);
}
return pObj;
}
BOOL SwDoc::SelectServerObj( const String& rStr, SwPaM*& rpPam,
SwNodeRange*& rpRange ) const
{
// haben wir ueberhaupt das Item vorraetig?
rpPam = 0;
rpRange = 0;
String sItem( INetURLObject::decode( rStr, INET_HEX_ESCAPE,
INetURLObject::DECODE_WITH_CHARSET,
RTL_TEXTENCODING_UTF8 ));
xub_StrLen nPos = sItem.Search( cMarkSeperator );
const CharClass& rCC = GetAppCharClass();
// Erweiterung fuer die Bereiche, nicht nur Bookmarks/Bereiche linken,
// sondern auch Rahmen(Text!), Tabellen, Gliederungen:
if( STRING_NOTFOUND != nPos )
{
BOOL bWeiter = FALSE;
String sName( sItem.Copy( 0, nPos ) );
String sCmp( sItem.Copy( nPos + 1 ));
rCC.toLower( sItem );
_FindItem aPara( sName );
if( sCmp.EqualsAscii( pMarkToTable ) )
{
rCC.toLower( sName );
((SwFrmFmts*)pTblFrmFmtTbl)->ForEach( 0, pTblFrmFmtTbl->Count(),
lcl_FindTable, &aPara );
if( aPara.pTblNd )
{
rpRange = new SwNodeRange( *aPara.pTblNd, 0,
*aPara.pTblNd->EndOfSectionNode(), 1 );
return TRUE;
}
}
else if( sCmp.EqualsAscii( pMarkToFrame ) )
{
SwNodeIndex* pIdx;
SwNode* pNd;
const SwFlyFrmFmt* pFlyFmt = FindFlyByName( sName );
if( pFlyFmt &&
0 != ( pIdx = (SwNodeIndex*)pFlyFmt->GetCntnt().GetCntntIdx() ) &&
!( pNd = &pIdx->GetNode())->IsNoTxtNode() )
{
rpRange = new SwNodeRange( *pNd, 1, *pNd->EndOfSectionNode() );
return TRUE;
}
}
else if( sCmp.EqualsAscii( pMarkToRegion ) )
{
sItem = sName; // wird unten behandelt !
bWeiter = TRUE;
}
else if( sCmp.EqualsAscii( pMarkToOutline ) )
{
SwPosition aPos( SwNodeIndex( (SwNodes&)GetNodes() ));
if( GotoOutline( aPos, sName ))
{
SwNode* pNd = &aPos.nNode.GetNode();
//BYTE nLvl = pNd->GetTxtNode()->GetTxtColl()->GetOutlineLevel();//#outline level,zhaojianwei
const int nLvl = pNd->GetTxtNode()->GetAttrOutlineLevel()-1;//<-end,zhaojianwei
const SwOutlineNodes& rOutlNds = GetNodes().GetOutLineNds();
USHORT nTmpPos;
rOutlNds.Seek_Entry( pNd, &nTmpPos );
rpRange = new SwNodeRange( aPos.nNode, 0, aPos.nNode );
// dann suche jetzt noch das Ende vom Bereich
for( ++nTmpPos;
nTmpPos < rOutlNds.Count() &&
nLvl < rOutlNds[ nTmpPos ]->GetTxtNode()->
//GetTxtColl()->GetOutlineLevel();//#outline level,zhaojianwei
GetAttrOutlineLevel()-1;//<-end,zhaojianwei
++nTmpPos )
; // es gibt keinen Block
if( nTmpPos < rOutlNds.Count() )
rpRange->aEnd = *rOutlNds[ nTmpPos ];
else
rpRange->aEnd = GetNodes().GetEndOfContent();
return TRUE;
}
}
if( !bWeiter )
return FALSE;
}
::sw::mark::DdeBookmark* const pBkmk = lcl_FindDdeBookmark(*pMarkManager, sItem);
if(pBkmk)
{
if(pBkmk->IsExpanded())
rpPam = new SwPaM(
pBkmk->GetMarkPos(),
pBkmk->GetOtherMarkPos());
return static_cast<bool>(rpPam);
}
// alte "Mechanik"
rCC.toLower( sItem );
_FindItem aPara( sItem );
if( pSectionFmtTbl->Count() )
{
((SwSectionFmts&)*pSectionFmtTbl).ForEach( 0, pSectionFmtTbl->Count(),
lcl_FindSection, &aPara );
if( aPara.pSectNd )
{
rpRange = new SwNodeRange( *aPara.pSectNd, 1,
*aPara.pSectNd->EndOfSectionNode() );
return TRUE;
}
}
return FALSE;
}