summaryrefslogtreecommitdiff
path: root/sw/source
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source')
-rw-r--r--sw/source/core/crsr/bookmrk.cxx73
-rw-r--r--sw/source/core/crsr/crossrefbookmark.cxx2
-rw-r--r--sw/source/core/crsr/crstrvl.cxx11
-rw-r--r--sw/source/core/crsr/makefile.mk1
-rw-r--r--sw/source/core/crsr/pam.cxx40
-rw-r--r--sw/source/core/doc/docbm.cxx43
-rw-r--r--sw/source/core/edit/edtox.cxx22
-rw-r--r--sw/source/core/inc/MarkManager.hxx10
-rw-r--r--sw/source/core/inc/bookmrk.hxx60
-rw-r--r--sw/source/core/inc/crossrefbookmark.hxx6
-rw-r--r--sw/source/core/text/inftxt.cxx57
-rw-r--r--sw/source/core/text/portxt.cxx121
-rw-r--r--sw/source/core/unocore/unobkm.cxx137
-rw-r--r--sw/source/filter/ww8/escher.hxx21
-rw-r--r--sw/source/filter/ww8/wrtw8esh.cxx82
-rw-r--r--sw/source/filter/ww8/wrtw8nds.cxx112
-rw-r--r--sw/source/filter/ww8/wrtww8.cxx149
-rw-r--r--sw/source/filter/ww8/wrtww8.hxx2
-rw-r--r--sw/source/filter/ww8/ww8par.cxx34
-rw-r--r--sw/source/filter/ww8/ww8par.hxx60
-rw-r--r--sw/source/filter/ww8/ww8par3.cxx171
-rw-r--r--sw/source/filter/ww8/ww8par5.cxx105
-rw-r--r--sw/source/ui/docvw/edtwin.cxx41
-rw-r--r--sw/source/ui/inc/view.hxx4
-rw-r--r--sw/source/ui/inc/wrtsh.hxx4
-rw-r--r--sw/source/ui/uiview/viewling.cxx144
-rw-r--r--sw/source/ui/wrtsh/wrtsh1.cxx9
-rw-r--r--sw/source/ui/wrtsh/wrtsh2.cxx7
28 files changed, 1108 insertions, 420 deletions
diff --git a/sw/source/core/crsr/bookmrk.cxx b/sw/source/core/crsr/bookmrk.cxx
index 6752f70e5eaf..11060352b6c3 100644
--- a/sw/source/core/crsr/bookmrk.cxx
+++ b/sw/source/core/crsr/bookmrk.cxx
@@ -41,12 +41,14 @@
#include <undobj.hxx>
#include <unobookmark.hxx>
#include <rtl/random.h>
+#include <xmloff/odffields.hxx>
SV_IMPL_REF( SwServerObject )
using namespace ::sw::mark;
using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
namespace
{
@@ -75,20 +77,20 @@ namespace
const sal_Unicode aStartMark,
const sal_Unicode aEndMark)
{
- const SwPosition& rStart = pField->GetMarkStart();
- const SwPosition& rEnd = pField->GetMarkEnd();
+ SwPosition& rStart = pField->GetMarkStart();
+ SwPosition& rEnd = pField->GetMarkEnd();
SwTxtNode const * const pStartTxtNode = io_pDoc->GetNodes()[rStart.nNode]->GetTxtNode();
SwTxtNode const * const pEndTxtNode = io_pDoc->GetNodes()[rEnd.nNode]->GetTxtNode();
const sal_Unicode ch_start=pStartTxtNode->GetTxt().GetChar(rStart.nContent.GetIndex());
const sal_Unicode ch_end=pEndTxtNode->GetTxt().GetChar(rEnd.nContent.GetIndex()-1);
- const SwPaM aStartPaM(rStart);
- const SwPaM aEndPaM(rEnd);
+ SwPaM aStartPaM(rStart);
+ SwPaM aEndPaM(rEnd);
io_pDoc->StartUndo(UNDO_UI_REPLACE, NULL);
if(ch_start != aStartMark)
{
io_pDoc->InsertString(aStartPaM, aStartMark);
}
- if(aEndMark && ch_end != aEndMark)
+ if ( aEndMark && ( ch_end != aEndMark ) && ( rStart != rEnd ) )
{
io_pDoc->InsertString(aEndPaM, aEndMark);
}
@@ -112,6 +114,11 @@ namespace sw { namespace mark
}
}
+ bool MarkBase::IsCoveringPosition(const SwPosition& rPos) const
+ {
+ return GetMarkStart() <= rPos && rPos <= GetMarkEnd();
+ }
+
void MarkBase::SetMarkPos(const SwPosition& rNewPos)
{
::boost::scoped_ptr<SwPosition>(new SwPosition(rNewPos)).swap(m_pPos1);
@@ -124,6 +131,17 @@ namespace sw { namespace mark
//lcl_FixPosition(*m_pPos2);
}
+ rtl::OUString MarkBase::ToString( ) const
+ {
+ rtl::OUStringBuffer buf;
+ buf.appendAscii( "Mark: ( Name, [ Node1, Index1 ] ): ( " );
+ buf.append( m_aName ).appendAscii( ", [ " );
+ buf.append( sal_Int32( GetMarkPos().nNode.GetIndex( ) ) ).appendAscii( ", " );
+ buf.append( sal_Int32( GetMarkPos().nContent.GetIndex( ) ) ).appendAscii( " ] )" );
+
+ return buf.makeStringAndClear( );
+ }
+
MarkBase::~MarkBase()
{ }
@@ -145,7 +163,7 @@ namespace sw { namespace mark
return aResult.append(nCount++).append(sUniquePostfix).makeStringAndClear();
}
- // SwClient
+
void MarkBase::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew)
{
SwModify::Modify(pOld, pNew);
@@ -250,6 +268,7 @@ namespace sw { namespace mark
uno::Reference< rdf::XMetadatable > Bookmark::MakeUnoObject()
{
+ // create new SwXBookmark
SwDoc *const pDoc( GetMarkPos().GetDoc() );
OSL_ENSURE(pDoc, "Bookmark::MakeUnoObject: no doc?");
const uno::Reference< rdf::XMetadatable> xMeta(
@@ -265,6 +284,28 @@ namespace sw { namespace mark
SetOtherMarkPos(GetMarkPos());
}
+ rtl::OUString Fieldmark::ToString( ) const
+ {
+ rtl::OUStringBuffer buf;
+ buf.appendAscii( "Fieldmark: ( Name, Type, [ Nd1, Id1 ], [ Nd2, Id2 ] ): ( " );
+ buf.append( m_aName ).appendAscii( ", " );
+ buf.append( m_aFieldname ).appendAscii( ", [ " );
+ buf.append( sal_Int32( GetMarkPos().nNode.GetIndex( ) ) ).appendAscii( ", " );
+ buf.append( sal_Int32( GetMarkPos( ).nContent.GetIndex( ) ) ).appendAscii( " ], [" );
+ buf.append( sal_Int32( GetOtherMarkPos().nNode.GetIndex( ) ) ).appendAscii( ", " );
+ buf.append( sal_Int32( GetOtherMarkPos( ).nContent.GetIndex( ) ) ).appendAscii( " ] ) " );
+
+ return buf.makeStringAndClear( );
+ }
+
+ void Fieldmark::Invalidate( )
+ {
+ // @TODO: Does exist a better solution to trigger a format of the
+ // fieldmark portion? If yes, please use it.
+ SwPaM aPaM( this->GetMarkPos(), this->GetOtherMarkPos() );
+ aPaM.InvalidatePaM();
+ }
+
const ::rtl::OUString Fieldmark::our_sNamePrefix = ::rtl::OUString::createFromAscii("__Fieldmark__");
TextFieldmark::TextFieldmark(const SwPaM& rPaM)
@@ -282,12 +323,24 @@ namespace sw { namespace mark
void CheckboxFieldmark::InitDoc(SwDoc* const io_pDoc)
{
- lcl_AssureFieldMarksSet(this, io_pDoc, CH_TXT_ATR_FIELDSTART, CH_TXT_ATR_FIELDEND);
- }
+ lcl_AssureFieldMarksSet(this, io_pDoc, CH_TXT_ATR_FORMELEMENT, CH_TXT_ATR_FIELDEND);
+ // For some reason the end mark is moved from 1 by the Insert: we don't
+ // want this for checkboxes
+ this->GetMarkEnd( ).nContent--;
+ }
void CheckboxFieldmark::SetChecked(bool checked)
- { m_isChecked = checked; }
+ {
+ (*GetParameters())[::rtl::OUString::createFromAscii(ODF_FORMCHECKBOX_RESULT)] = makeAny(checked);
+ }
bool CheckboxFieldmark::IsChecked() const
- { return m_isChecked; }
+ {
+ bool bResult = false;
+ parameter_map_t::const_iterator pResult = GetParameters()->find(::rtl::OUString::createFromAscii(ODF_FORMCHECKBOX_RESULT));
+ if(pResult != GetParameters()->end())
+ pResult->second >>= bResult;
+ return bResult;
+ }
+
}}
diff --git a/sw/source/core/crsr/crossrefbookmark.cxx b/sw/source/core/crsr/crossrefbookmark.cxx
index 4e0d1a4151e9..dc083801ee8e 100644
--- a/sw/source/core/crsr/crossrefbookmark.cxx
+++ b/sw/source/core/crsr/crossrefbookmark.cxx
@@ -64,7 +64,7 @@ namespace sw { namespace mark
MarkBase::SetMarkPos(rNewPos);
}
- const SwPosition& CrossRefBookmark::GetOtherMarkPos() const
+ SwPosition& CrossRefBookmark::GetOtherMarkPos() const
{
OSL_PRECOND(false,
"<SwCrossRefBookmark::GetOtherMarkPos(..)>"
diff --git a/sw/source/core/crsr/crstrvl.cxx b/sw/source/core/crsr/crstrvl.cxx
index 56986a9cf5e7..818ccc6e228f 100644
--- a/sw/source/core/crsr/crstrvl.cxx
+++ b/sw/source/core/crsr/crstrvl.cxx
@@ -1172,6 +1172,17 @@ BOOL SwCrsrShell::GetContentAtPos( const Point& rPt,
}
}
+ if( !bRet && SwContentAtPos::SW_FORMCTRL & rCntntAtPos.eCntntAtPos )
+ {
+ IDocumentMarkAccess* pMarksAccess = GetDoc()->getIDocumentMarkAccess( );
+ sw::mark::IFieldmark* pFldBookmark = pMarksAccess->getFieldmarkFor( aPos );
+ if( bCrsrFoundExact && pTxtNd && pFldBookmark) {
+ rCntntAtPos.eCntntAtPos = SwContentAtPos::SW_FORMCTRL;
+ rCntntAtPos.aFnd.pFldmark = pFldBookmark;
+ bRet=TRUE;
+ }
+ }
+
if( !bRet && SwContentAtPos::SW_FTN & rCntntAtPos.eCntntAtPos )
{
if( aTmpState.bFtnNoInfo )
diff --git a/sw/source/core/crsr/makefile.mk b/sw/source/core/crsr/makefile.mk
index 6d579171dc02..a2571901c068 100644
--- a/sw/source/core/crsr/makefile.mk
+++ b/sw/source/core/crsr/makefile.mk
@@ -47,6 +47,7 @@ CDEFS+=-Dmydebug
EXCEPTIONSFILES= \
$(SLO)$/crbm.obj \
$(SLO)$/crsrsh.obj \
+ $(SLO)$/bookmrk.obj \
$(SLO)$/viscrs.obj
SLOFILES = \
diff --git a/sw/source/core/crsr/pam.cxx b/sw/source/core/crsr/pam.cxx
index 565669bd7a35..ec30b5aefbe0 100644
--- a/sw/source/core/crsr/pam.cxx
+++ b/sw/source/core/crsr/pam.cxx
@@ -53,6 +53,7 @@
#include <ndtxt.hxx> // #111827#
#include <IMark.hxx>
+#include <hints.hxx>
// fuer den dummen ?MSC-? Compiler
inline xub_StrLen GetSttOrEnd( BOOL bCondition, const SwCntntNode& rNd )
@@ -824,16 +825,21 @@ BOOL SwPaM::HasReadonlySel( bool bFormView ) const
}
//FIXME FieldBk
// TODO: Form Protection when Enhanced Fields are enabled
-// if( !bRet )
-// {
-// const SwDoc *pDoc=GetDoc();
-// SwBookmark *pA = ( pDoc && pPoint ? pDoc->getFieldmarkFor( *pPoint ) : NULL );
-// SwBookmark *pB = ( pDoc && pMark ? pDoc->getFieldmarkFor( *pMark ) : pA );
-// bRet = ( pA != pB );
-// bool bProtectForm = pDoc->get( IDocumentSettingAccess::PROTECT_FORM );
-// if( bProtectForm )
-// bRet |= ( pA==NULL || pB==NULL );
-// }
+ if (!bRet) {
+ const SwDoc *pDoc = GetDoc();
+ sw::mark::IMark* pA = NULL;
+ sw::mark::IMark* pB = NULL;
+ if ( pDoc )
+ {
+ const IDocumentMarkAccess* pMarksAccess = pDoc->getIDocumentMarkAccess( );
+ pA = GetPoint() ? pMarksAccess->getFieldmarkFor( *GetPoint( ) ) : NULL;
+ pB = GetMark( ) ? pMarksAccess->getFieldmarkFor( *GetMark( ) ) : pA;
+ bRet = ( pA != pB );
+ }
+ bool bProtectForm = pDoc->get( IDocumentSettingAccess::PROTECT_FORM );
+ if ( bProtectForm )
+ bRet |= ( pA == NULL || pB == NULL );
+ }
return bRet;
}
@@ -1220,6 +1226,20 @@ BOOL SwPaM::Overlap(const SwPaM & a, const SwPaM & b)
return !(*b.End() <= *a.Start() || *a.End() <= *b.End());
}
+void SwPaM::InvalidatePaM()
+{
+ const SwNode *_pNd=this->GetNode();
+ const SwTxtNode *_pTxtNd=(_pNd!=NULL?_pNd->GetTxtNode():NULL);
+ if (_pTxtNd!=NULL)
+ {
+ // pretent that the PaM marks inserted text to recalc the portion...
+ SwInsTxt aHint( Start()->nContent.GetIndex(),
+ End()->nContent.GetIndex() - Start()->nContent.GetIndex() + 1 );
+ SwModify *_pModify=(SwModify*)_pTxtNd;
+ _pModify->Modify( 0, &aHint);
+ }
+}
+
BOOL SwPaM::LessThan(const SwPaM & a, const SwPaM & b)
{
return (*a.Start() < *b.Start()) || (*a.Start() == *b.Start() && *a.End() < *b.End());
diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx
index 12edc1858b87..1e058867ba32 100644
--- a/sw/source/core/doc/docbm.cxx
+++ b/sw/source/core/doc/docbm.cxx
@@ -37,6 +37,7 @@
#include <dcontact.hxx>
#include <doc.hxx>
#include <docary.hxx>
+#include <xmloff/odffields.hxx>
#include <editsh.hxx>
#include <errhdl.hxx>
#include <fmtanchr.hxx>
@@ -305,6 +306,17 @@ namespace sw { namespace mark
: m_pDoc(&rDoc)
{ }
+ void MarkManager::dumpFieldmarks( ) const
+ {
+ const_iterator_t pIt = m_vFieldmarks.begin();
+ for (; pIt != m_vFieldmarks.end( ); pIt++)
+ {
+ rtl::OUString str = (*pIt)->ToString();
+ OSL_TRACE("%s\n",
+ ::rtl::OUStringToOString(str, RTL_TEXTENCODING_UTF8).getStr());
+ }
+ }
+
::sw::mark::IMark* MarkManager::makeMark(const SwPaM& rPaM,
const ::rtl::OUString& rName,
const IDocumentMarkAccess::MarkType eType)
@@ -410,6 +422,30 @@ namespace sw { namespace mark
return pMark.get();
}
+ ::sw::mark::IFieldmark* MarkManager::makeFieldBookmark( const SwPaM& rPaM,
+ const rtl::OUString& rName,
+ const rtl::OUString& rType )
+ {
+ sw::mark::IMark* pMark = makeMark( rPaM, rName,
+ IDocumentMarkAccess::TEXT_FIELDMARK );
+ sw::mark::IFieldmark* pFieldMark = dynamic_cast<sw::mark::IFieldmark*>( pMark );
+ pFieldMark->SetFieldname( rType );
+
+ return pFieldMark;
+ }
+
+ ::sw::mark::IFieldmark* MarkManager::makeNoTextFieldBookmark( const SwPaM& rPaM,
+ const rtl::OUString& rName,
+ const rtl::OUString& rType)
+ {
+ sw::mark::IMark* pMark = makeMark( rPaM, rName,
+ IDocumentMarkAccess::CHECKBOX_FIELDMARK );
+ sw::mark::IFieldmark* pFieldMark = dynamic_cast<sw::mark::IFieldmark*>( pMark );
+ pFieldMark->SetFieldname( rType );
+
+ return pFieldMark;
+ }
+
::sw::mark::IMark* MarkManager::getMarkForTxtNode(const SwTxtNode& rTxtNode,
const IDocumentMarkAccess::MarkType eType)
{
@@ -763,12 +799,7 @@ namespace sw { namespace mark
{
const_iterator_t pFieldmark = find_if(
m_vFieldmarks.begin(),
- // we do not need to check marks starting behind the positon
- lower_bound(
- m_vFieldmarks.begin(),
- m_vFieldmarks.end(),
- rPos,
- bind(&IMark::StartsAfter, _1, _2)),
+ m_vFieldmarks.end( ),
bind(&IMark::IsCoveringPosition, _1, rPos));
if(pFieldmark == m_vFieldmarks.end()) return NULL;
return dynamic_cast<IFieldmark*>(pFieldmark->get());
diff --git a/sw/source/core/edit/edtox.cxx b/sw/source/core/edit/edtox.cxx
index 97b2531cdbe2..d6fb64577e11 100644
--- a/sw/source/core/edit/edtox.cxx
+++ b/sw/source/core/edit/edtox.cxx
@@ -57,6 +57,9 @@
#ifndef _STATSTR_HRC
#include <statstr.hrc>
#endif
+#include <bookmrk.hxx>
+#include <xmloff/odffields.hxx>
+
using namespace ::com::sun::star;
using namespace ::com::sun::star::i18n;
@@ -232,6 +235,25 @@ BOOL SwEditShell::UpdateTableOf( const SwTOXBase& rTOX, const SfxItemSet* pSet )
return bRet;
}
+BOOL SwEditShell::UpdateField( sw::mark::IFieldmark &fieldBM)
+{
+// SwDocShell* pDocSh = pDoc->GetDocShell();
+ //@TODO implement me...; add undo etc...
+ if ( pDoc && fieldBM.IsExpanded( ) ) {
+ SwPosition aSttPos = fieldBM.GetMarkStart( );
+ aSttPos.nContent++;
+
+ SwPosition aEndPos = fieldBM.GetMarkEnd( );
+ aEndPos.nContent--;
+
+ SwPaM aPaM( aSttPos, aEndPos );
+ pDoc->DeleteRange(aPaM);
+ pDoc->InsertString(aPaM, String::CreateFromAscii("Implement me ;-)") );
+ }
+ return TRUE;
+}
+
+
/*--------------------------------------------------------------------
Beschreibung: Aktuelles Verzeichnis vor oder in dem der Cursor
steht
diff --git a/sw/source/core/inc/MarkManager.hxx b/sw/source/core/inc/MarkManager.hxx
index faaa487d7467..1a5cd1724050 100644
--- a/sw/source/core/inc/MarkManager.hxx
+++ b/sw/source/core/inc/MarkManager.hxx
@@ -40,8 +40,18 @@ namespace sw { namespace mark
public:
MarkManager(/*[in/out]*/ SwDoc& rDoc);
+ void dumpFieldmarks( ) const;
+
// IDocumentMarkAccess
virtual ::sw::mark::IMark* makeMark(const SwPaM& rPaM, const ::rtl::OUString& rName, IDocumentMarkAccess::MarkType eMark);
+
+ virtual sw::mark::IFieldmark* makeFieldBookmark( const SwPaM& rPaM,
+ const rtl::OUString& rName,
+ const rtl::OUString& rType);
+ virtual sw::mark::IFieldmark* makeNoTextFieldBookmark( const SwPaM& rPaM,
+ const rtl::OUString& rName,
+ const rtl::OUString& rType);
+
virtual ::sw::mark::IMark* getMarkForTxtNode(const SwTxtNode& rTxtNode, IDocumentMarkAccess::MarkType eMark);
virtual void repositionMark(::sw::mark::IMark* io_pMark, const SwPaM& rPaM);
diff --git a/sw/source/core/inc/bookmrk.hxx b/sw/source/core/inc/bookmrk.hxx
index 1b341a57ae2e..90c6a44fa239 100644
--- a/sw/source/core/inc/bookmrk.hxx
+++ b/sw/source/core/inc/bookmrk.hxx
@@ -34,6 +34,7 @@
#include <boost/scoped_ptr.hpp>
#include <boost/noncopyable.hpp>
+#include <map>
#include <IMark.hxx>
@@ -53,26 +54,31 @@ namespace sw { namespace mark
{
public:
//getters
- virtual const SwPosition& GetMarkPos() const
+ virtual SwPosition& GetMarkPos() const
{ return *m_pPos1; }
virtual const ::rtl::OUString& GetName() const
{ return m_aName; }
- virtual bool IsCoveringPosition(const SwPosition& rPos) const
- { return GetMarkStart() <= rPos && rPos <= GetMarkEnd(); };
- virtual const SwPosition& GetOtherMarkPos() const
+ virtual bool IsCoveringPosition(const SwPosition& rPos) const;
+ virtual SwPosition& GetOtherMarkPos() const
{
OSL_PRECOND(IsExpanded(), "<SwPosition::GetOtherMarkPos(..)> - I have no other Pos set." );
return *m_pPos2;
}
- virtual const SwPosition& GetMarkStart() const
+ virtual SwPosition& GetMarkStart() const
{
- if(!m_pPos2 /* !IsExpanded()*/) return *m_pPos1;
- return *m_pPos1 < *m_pPos2 ? *m_pPos1 : *m_pPos2;
+ if( !IsExpanded() ) return GetMarkPos( );
+ if ( GetMarkPos( ) < GetOtherMarkPos( ) )
+ return GetMarkPos();
+ else
+ return GetOtherMarkPos( );
}
- virtual const SwPosition& GetMarkEnd() const
+ virtual SwPosition& GetMarkEnd() const
{
- if(!m_pPos2 /* !IsExpanded()*/ ) return *m_pPos1;
- return *m_pPos1 > *m_pPos2 ? *m_pPos1 : *m_pPos2;
+ if( !IsExpanded() ) return GetMarkPos();
+ if ( GetMarkPos( ) > GetOtherMarkPos( ) )
+ return GetMarkPos( );
+ else
+ return GetOtherMarkPos( );
}
virtual bool IsExpanded() const
{ return m_pPos2; }
@@ -85,6 +91,8 @@ namespace sw { namespace mark
virtual void ClearOtherMarkPos()
{ m_pPos2.reset(); }
+ virtual rtl::OUString ToString( ) const;
+
virtual void Swap()
{
if(m_pPos2)
@@ -120,7 +128,6 @@ namespace sw { namespace mark
class NavigatorReminder
: public MarkBase
- , virtual public IMark
{
public:
NavigatorReminder(const SwPaM& rPaM);
@@ -204,24 +211,31 @@ namespace sw { namespace mark
Fieldmark(const SwPaM& rPaM);
// getters
- ::rtl::OUString GetFieldname() const
+ virtual ::rtl::OUString GetFieldname() const
{ return m_aFieldname; }
- ::rtl::OUString GetFieldHelptext() const
+ virtual ::rtl::OUString GetFieldHelptext() const
{ return m_aFieldHelptext; }
+ virtual IFieldmark::parameter_map_t* GetParameters()
+ { return &m_vParams; }
+
+ virtual const IFieldmark::parameter_map_t* GetParameters() const
+ { return &m_vParams; }
+
// setters
- void SetFieldname(const ::rtl::OUString& aFieldname)
+ virtual void SetFieldname(const ::rtl::OUString& aFieldname)
{ m_aFieldname = aFieldname; }
- void SetFieldHelptext(const ::rtl::OUString& aFieldHelptext)
+ virtual void SetFieldHelptext(const ::rtl::OUString& aFieldHelptext)
{ m_aFieldHelptext = aFieldHelptext; }
- private:
- //int fftype; // Type: 0 = Text, 1 = Check Box, 2 = List
- //bool ffprot;
+ virtual void Invalidate();
+ virtual rtl::OUString ToString() const;
+ private:
::rtl::OUString m_aFieldname;
::rtl::OUString m_aFieldHelptext;
- static const ::rtl::OUString our_sNamePrefix;
+ IFieldmark::parameter_map_t m_vParams;
+ static const ::rtl::OUString our_sNamePrefix;
};
class TextFieldmark
@@ -230,9 +244,6 @@ namespace sw { namespace mark
public:
TextFieldmark(const SwPaM& rPaM);
virtual void InitDoc(SwDoc* const io_pDoc);
- private:
- //int fftypetxt; // Type of text field: 0 = Regular text, 1 = Number, 2 = Date, 3 = Current date, 4 = Current time, 5 = Calculation
- //int ffmaxlen; // Number of characters for text field. Zero means unlimited.
};
class CheckboxFieldmark
@@ -244,11 +255,6 @@ namespace sw { namespace mark
virtual void InitDoc(SwDoc* const io_pDoc);
bool IsChecked() const;
void SetChecked(bool checked);
- private:
- bool m_isChecked;
- //bool ffsize; // 0 = Auto, 1=Exact (see ffhps)
- //bool ffrecalc;
- //int ffhps; // Check box size (half-point sizes).
};
}}
diff --git a/sw/source/core/inc/crossrefbookmark.hxx b/sw/source/core/inc/crossrefbookmark.hxx
index cfacf26c65d5..27f920be7651 100644
--- a/sw/source/core/inc/crossrefbookmark.hxx
+++ b/sw/source/core/inc/crossrefbookmark.hxx
@@ -45,10 +45,10 @@ namespace sw { namespace mark
const ::rtl::OUString& rPrefix);
// getters
- virtual const SwPosition& GetOtherMarkPos() const;
- virtual const SwPosition& GetMarkStart() const
+ virtual SwPosition& GetOtherMarkPos() const;
+ virtual SwPosition& GetMarkStart() const
{ return *m_pPos1; }
- virtual const SwPosition& GetMarkEnd() const
+ virtual SwPosition& GetMarkEnd() const
{ return *m_pPos1; }
virtual bool IsExpanded() const
{ return false; }
diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx
index 9341206dfa71..f7c96d9dc745 100644
--- a/sw/source/core/text/inftxt.cxx
+++ b/sw/source/core/text/inftxt.cxx
@@ -1142,27 +1142,30 @@ void SwTxtPaintInfo::DrawCheckBox( const SwFieldFormPortion &rPor, bool checked)
{
SwRect aIntersect;
CalcRect( rPor, &aIntersect, 0 );
- if ( aIntersect.HasArea() ) {
- if (OnWin()) {
- OutputDevice* pOutDev = (OutputDevice*)GetOut();
- pOutDev->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
- pOutDev->SetLineColor( Color(220, 233, 245));
- pOutDev->SetFillColor( Color(220, 233, 245));
- pOutDev->DrawRect( aIntersect.SVRect() );
- pOutDev->Pop();
- }
- const int delta=10;
- Rectangle r(aIntersect.Left()+delta, aIntersect.Top()+delta, aIntersect.Right()-delta, aIntersect.Bottom()-delta);
- pOut->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
- pOut->SetLineColor( Color(0, 0, 0));
- pOut->SetFillColor();
- pOut->DrawRect( r );
- if (checked) {
- pOut->DrawLine(r.TopLeft(), r.BottomRight());
- pOut->DrawLine(r.TopRight(), r.BottomLeft());
+ if ( aIntersect.HasArea() )
+ {
+ if (OnWin() && SwViewOption::IsFieldShadings() &&
+ !GetOpt().IsPagePreview())
+ {
+ OutputDevice* pOut_ = (OutputDevice*)GetOut();
+ pOut_->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
+ pOut_->SetFillColor( SwViewOption::GetFieldShadingsColor() );
+ pOut_->SetLineColor();
+ pOut_->DrawRect( aIntersect.SVRect() );
+ pOut_->Pop();
+ }
+ const int delta=10;
+ Rectangle r(aIntersect.Left()+delta, aIntersect.Top()+delta, aIntersect.Right()-delta, aIntersect.Bottom()-delta);
+ pOut->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
+ pOut->SetLineColor( Color(0, 0, 0));
+ pOut->SetFillColor();
+ pOut->DrawRect( r );
+ if (checked) {
+ pOut->DrawLine(r.TopLeft(), r.BottomRight());
+ pOut->DrawLine(r.TopRight(), r.BottomLeft());
+ }
pOut->Pop();
}
- }
}
/*************************************************************************
@@ -1216,14 +1219,22 @@ void SwTxtPaintInfo::_DrawBackBrush( const SwLinePortion &rPor ) const
}
}
bool bIsStartMark=(1==GetLen() && CH_TXT_ATR_FIELDSTART==GetTxt().GetChar(GetIdx()));
- if(pFieldmark) OSL_TRACE("Found Fieldmark");
+ if(pFieldmark) {
+ OSL_TRACE("Found Fieldmark");
+#if DEBUG
+ rtl::OUString str = pFieldmark->ToString( );
+ fprintf( stderr, "%s\n", rtl::OUStringToOString( str, RTL_TEXTENCODING_UTF8 ).getStr( ) );
+#endif
+ }
if(bIsStartMark) OSL_TRACE("Found StartMark");
- if (OnWin() && (pFieldmark!=NULL || bIsStartMark))
+ if (OnWin() && (pFieldmark!=NULL || bIsStartMark) &&
+ SwViewOption::IsFieldShadings() &&
+ !GetOpt().IsPagePreview())
{
OutputDevice* pOutDev = (OutputDevice*)GetOut();
pOutDev->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
- pOutDev->SetLineColor( Color(220, 233, 245));
- pOutDev->SetFillColor( Color(220, 233, 245));
+ pOutDev->SetFillColor( SwViewOption::GetFieldShadingsColor() );
+ pOutDev->SetLineColor( );
pOutDev->DrawRect( aIntersect.SVRect() );
pOutDev->Pop();
}
diff --git a/sw/source/core/text/portxt.cxx b/sw/source/core/text/portxt.cxx
index 3eedc0c8c983..b1d236cb0471 100644
--- a/sw/source/core/text/portxt.cxx
+++ b/sw/source/core/text/portxt.cxx
@@ -52,11 +52,13 @@
#include <IMark.hxx>
#include <pam.hxx>
#include <doc.hxx>
+#include <xmloff/odffields.hxx>
#if OSL_DEBUG_LEVEL > 1
const sal_Char *GetLangName( const MSHORT nLang );
#endif
+using namespace ::sw::mark;
using namespace ::com::sun::star;
using namespace ::com::sun::star::i18n::ScriptType;
@@ -349,7 +351,7 @@ sal_Bool SwTxtPortion::_Format( SwTxtFormatInfo &rInf )
// C2 break iterator does not found a possible line break at all:
// ==> line break
- // case A: line not yet full
+ // case A: line not yet full
if ( !bFull )
{
Width( aGuess.BreakWidth() );
@@ -655,7 +657,7 @@ xub_StrLen SwTxtPortion::GetSpaceCnt( const SwTxtSizeInfo &rInf,
long SwTxtPortion::CalcSpacing( long nSpaceAdd, const SwTxtSizeInfo &rInf ) const
{
- xub_StrLen nCnt = 0;
+ xub_StrLen nCnt = 0;
if ( InExpGrp() )
{
@@ -766,9 +768,10 @@ void SwHolePortion::HandlePortion( SwPortionHandler& rPH ) const
rPH.Text( GetLen(), GetWhichPor() );
}
-void SwFieldMarkPortion::Paint( const SwTxtPaintInfo & rInf) const
+void SwFieldMarkPortion::Paint( const SwTxtPaintInfo & /*rInf*/) const
{
- SwTxtPortion::Paint(rInf);
+ // These shouldn't be painted!
+ // SwTxtPortion::Paint(rInf);
}
sal_Bool SwFieldMarkPortion::Format( SwTxtFormatInfo & )
@@ -778,38 +781,96 @@ sal_Bool SwFieldMarkPortion::Format( SwTxtFormatInfo & )
return ret;
}
+namespace {
+ static sal_Int32 getCurrentListIndex( IFieldmark* pBM,
+ ::rtl::OUString* io_pCurrentText = NULL )
+ {
+ const IFieldmark::parameter_map_t* const pParameters = pBM->GetParameters();
+ sal_Int32 nCurrentIdx = 0;
+ const IFieldmark::parameter_map_t::const_iterator pResult = pParameters->find(::rtl::OUString::createFromAscii(ODF_FORMDROPDOWN_RESULT));
+ if(pResult != pParameters->end())
+ pResult->second >>= nCurrentIdx;
+ if(io_pCurrentText)
+ {
+ const IFieldmark::parameter_map_t::const_iterator pListEntries = pParameters->find(::rtl::OUString::createFromAscii(ODF_FORMDROPDOWN_LISTENTRY));
+ if(pListEntries != pParameters->end())
+ {
+ uno::Sequence< ::rtl::OUString > vListEntries;
+ pListEntries->second >>= vListEntries;
+ if(nCurrentIdx < vListEntries.getLength())
+ *io_pCurrentText = vListEntries[nCurrentIdx];
+ }
+ }
+ return nCurrentIdx;
+ }
+}
//FIXME Fieldbk
-//void SwFieldFormPortion::Paint( const SwTxtPaintInfo& rInf ) const
-void SwFieldFormPortion::Paint( const SwTxtPaintInfo& ) const
+void SwFieldFormPortion::Paint( const SwTxtPaintInfo& rInf ) const
{
-// SwTxtNode *pNd=const_cast<SwTxtNode*>(rInf.GetTxtFrm()->GetTxtNode());
-// const SwDoc *doc=pNd->GetDoc();
-// SwIndex aIndex( pNd, rInf.GetIdx() );
-// SwPosition aPosition(*pNd, aIndex);
-// pMark = dynamic_cast< doc->getFieldmarkFor(aPosition);
-// OSL_ENSURE(pMark,
-// "SwFieldFormPortion::Paint(..)"
-// " - Where is my form field bookmark???");
-
-// bool checked=(pBM!=NULL?pBM->IsChecked():false);
-// rInf.DrawCheckBox(*this , checked);
-}
+ SwTxtNode* pNd = const_cast<SwTxtNode*>(rInf.GetTxtFrm()->GetTxtNode());
+ const SwDoc *doc=pNd->GetDoc();
+ SwIndex aIndex( pNd, rInf.GetIdx() );
+ SwPosition aPosition(*pNd, aIndex);
-sal_Bool SwFieldFormPortion::Format( SwTxtFormatInfo &rInf )
-{
- sal_Bool ret=0;
-// ret=SwTxtPortion::Format(rInf);
+ IFieldmark* pBM = doc->getIDocumentMarkAccess( )->getFieldmarkFor( aPosition );
+
+ OSL_ENSURE( pBM,
+ "SwFieldFormPortion::Paint(..)"
+ " - Where is my form field bookmark???");
- Width(rInf.GetTxtHeight());
- Height(rInf.GetTxtHeight());
- SetAscent(rInf.GetAscent());
- //int h=rInf.GetTxtHeight();
+ if ( pBM != NULL )
+ {
+ if ( pBM->GetFieldname( ).equalsAscii( ODF_FORMCHECKBOX ) )
+ { // a checkbox...
+ ICheckboxFieldmark* pCheckboxFm = dynamic_cast< ICheckboxFieldmark* >(pBM);
+ bool checked = pCheckboxFm->IsChecked();
+ rInf.DrawCheckBox(*this, checked);
+ }
+ else if ( pBM->GetFieldname( ).equalsAscii( ODF_FORMDROPDOWN ) )
+ { // a list...
+ rtl::OUString aTxt;
+ rInf.DrawViewOpt( *this, POR_FLD );
+ rInf.DrawText( aTxt, *this, 0, 0/*aTxt.getLength()*/, false );
+ }
+ else
+ {
+ assert(0); // unknown type...
+ }
+ }
+}
-/*
- Height(100);
- SetAscent(100);
-*/
+sal_Bool SwFieldFormPortion::Format( SwTxtFormatInfo & rInf )
+{
+ sal_Bool ret = 0;
+ SwTxtNode *pNd = const_cast < SwTxtNode * >( rInf.GetTxtFrm( )->GetTxtNode( ) );
+ const SwDoc *doc = pNd->GetDoc( );
+ SwIndex aIndex( pNd, rInf.GetIdx( ) );
+ SwPosition aPosition( *pNd, aIndex );
+ IFieldmark *pBM = doc->getIDocumentMarkAccess( )->getFieldmarkFor( aPosition );
+ ASSERT( pBM != NULL, "Where is my form field bookmark???" );
+ if ( pBM != NULL )
+ {
+ if ( pBM->GetFieldname( ).equalsAscii( ODF_FORMCHECKBOX ) )
+ {
+ Width( rInf.GetTxtHeight( ) );
+ Height( rInf.GetTxtHeight( ) );
+ SetAscent( rInf.GetAscent( ) );
+ }
+ else if ( pBM->GetFieldname( ).equalsAscii( ODF_FORMDROPDOWN ) )
+ {
+ ::rtl::OUString aTxt;
+ getCurrentListIndex( pBM, &aTxt );
+ SwPosSize aPosSize = rInf.GetTxtSize( aTxt );
+ Width( aPosSize.Width( ) );
+ Height( aPosSize.Height( ) );
+ SetAscent( rInf.GetAscent( ) );
+ }
+ else
+ {
+ assert( 0 ); // unknown type...
+ }
+ }
return ret;
}
diff --git a/sw/source/core/unocore/unobkm.cxx b/sw/source/core/unocore/unobkm.cxx
index 5f487bce1184..590ddb6e803e 100644
--- a/sw/source/core/unocore/unobkm.cxx
+++ b/sw/source/core/unocore/unobkm.cxx
@@ -49,6 +49,7 @@
#include <docsh.hxx>
+using namespace ::sw::mark;
using namespace ::com::sun::star;
using ::rtl::OUString;
@@ -520,67 +521,131 @@ SwXFieldmark::SwXFieldmark(bool _isReplacementObject, ::sw::mark::IMark* pBkm, S
, isReplacementObject(_isReplacementObject)
{ }
-void SwXFieldmark::attachToRange(const uno::Reference< text::XTextRange > & xTextRange)
- throw( lang::IllegalArgumentException, uno::RuntimeException )
+void SwXFieldmarkParameters::insertByName(const OUString& aName, const uno::Any& aElement)
+ throw (lang::IllegalArgumentException, container::ElementExistException, lang::WrappedTargetException, uno::RuntimeException)
{
- attachToRangeEx(xTextRange, (isReplacementObject?IDocumentMarkAccess::CHECKBOX_FIELDMARK:IDocumentMarkAccess::TEXT_FIELDMARK));
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IFieldmark::parameter_map_t* pParameters = getCoreParameters();
+ if(pParameters->find(aName) != pParameters->end())
+ throw container::ElementExistException();
+ (*pParameters)[aName] = aElement;
}
-::rtl::OUString SwXFieldmark::getDescription(void) throw( ::com::sun::star::uno::RuntimeException )
+void SwXFieldmarkParameters::removeByName(const OUString& aName)
+ throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
-// TODO implement...
-// if(!GetBookmark())
- ::sw::mark::IFieldmark const * const pMark =
- dynamic_cast< ::sw::mark::IFieldmark const * const>(GetBookmark());
- if(!pMark)
- throw uno::RuntimeException();
- return pMark->GetFieldHelptext();
+ if(!getCoreParameters()->erase(aName))
+ throw container::NoSuchElementException();
}
-::sal_Int16 SAL_CALL SwXFieldmark::getType() throw (::com::sun::star::uno::RuntimeException)
+void SwXFieldmarkParameters::replaceByName(const OUString& aName, const uno::Any& aElement)
+ throw (lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- ::sw::mark::ICheckboxFieldmark const * const pAsCheckbox =
- dynamic_cast< ::sw::mark::ICheckboxFieldmark const * const>(GetBookmark());
- if(pAsCheckbox)
- return 1;
- return 0;
+ IFieldmark::parameter_map_t* pParameters = getCoreParameters();
+ IFieldmark::parameter_map_t::iterator pEntry = pParameters->find(aName);
+ if(pEntry == pParameters->end())
+ throw container::NoSuchElementException();
+ pEntry->second = aElement;
}
-::sal_Int16 SAL_CALL SwXFieldmark::getRes() throw (::com::sun::star::uno::RuntimeException)
+uno::Any SwXFieldmarkParameters::getByName(const OUString& aName)
+ throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- ::sw::mark::ICheckboxFieldmark const * const pAsCheckbox =
- dynamic_cast< ::sw::mark::ICheckboxFieldmark const * const>(GetBookmark());
- if(pAsCheckbox && pAsCheckbox->IsChecked())
- return 1;
- return 0;
+ IFieldmark::parameter_map_t* pParameters = getCoreParameters();
+ IFieldmark::parameter_map_t::iterator pEntry = pParameters->find(aName);
+ if(pEntry == pParameters->end())
+ throw container::NoSuchElementException();
+ return pEntry->second;
+}
+
+uno::Sequence<OUString> SwXFieldmarkParameters::getElementNames()
+ throw (uno::RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IFieldmark::parameter_map_t* pParameters = getCoreParameters();
+ uno::Sequence<OUString> vResult(pParameters->size());
+ OUString* pOutEntry = vResult.getArray();
+ for(IFieldmark::parameter_map_t::iterator pEntry = pParameters->begin(); pEntry!=pParameters->end(); ++pEntry, ++pOutEntry)
+ *pOutEntry = pEntry->first;
+ return vResult;
+}
+
+::sal_Bool SwXFieldmarkParameters::hasByName(const OUString& aName)
+ throw (uno::RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ IFieldmark::parameter_map_t* pParameters = getCoreParameters();
+ return (pParameters->find(aName) != pParameters->end());
+}
+
+uno::Type SwXFieldmarkParameters::getElementType()
+ throw (uno::RuntimeException)
+{
+ return ::cppu::UnoType< ::cppu::UnoVoidType>::get();
+}
+
+::sal_Bool SwXFieldmarkParameters::hasElements()
+ throw (uno::RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ return !getCoreParameters()->empty();
}
-//FIXME Remove Method
-void SAL_CALL SwXFieldmark::setType( ::sal_Int16 ) throw (::com::sun::star::uno::RuntimeException)
+void SwXFieldmarkParameters::Modify(SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
+}
+
+
+IFieldmark::parameter_map_t* SwXFieldmarkParameters::getCoreParameters()
+ throw (uno::RuntimeException)
+{
+ const IFieldmark* pFieldmark = dynamic_cast< const IFieldmark* >(GetRegisteredIn());
+ if(!pFieldmark)
+ throw uno::RuntimeException();
+ return const_cast< IFieldmark* >(pFieldmark)->GetParameters();
+}
+
+
+void SwXFieldmark::attachToRange( const uno::Reference < text::XTextRange >& xTextRange )
+ throw(lang::IllegalArgumentException, uno::RuntimeException)
+{
+ attachToRangeEx( xTextRange,
+ ( isReplacementObject ? IDocumentMarkAccess::CHECKBOX_FIELDMARK : IDocumentMarkAccess::TEXT_FIELDMARK ) );
+}
+
+::rtl::OUString SwXFieldmark::getFieldType(void)
+ throw(uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- throw uno::RuntimeException();
+ const IFieldmark *pBkm = dynamic_cast<const IFieldmark*>(GetBookmark());
+ if(!pBkm)
+ throw uno::RuntimeException();
+ return pBkm->GetFieldname();
}
-//FIXME Remove Method
-void SAL_CALL SwXFieldmark::setRes( ::sal_Int16 ) throw (::com::sun::star::uno::RuntimeException)
+void SwXFieldmark::setFieldType(const::rtl::OUString & fieldType)
+ throw(uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- throw uno::RuntimeException();
+ IFieldmark *pBkm = const_cast<IFieldmark*>(
+ dynamic_cast<const IFieldmark*>(GetBookmark()));
+ if(!pBkm)
+ throw uno::RuntimeException();
+ pBkm->SetFieldname(fieldType);
}
-void SAL_CALL SwXFieldmark::setDescription( const ::rtl::OUString& description )
- throw (::com::sun::star::uno::RuntimeException)
+uno::Reference<container::XNameContainer> SwXFieldmark::getParameters()
+ throw (uno::RuntimeException)
{
vos::OGuard aGuard(Application::GetSolarMutex());
- const ::sw::mark::IFieldmark* pMark =
- dynamic_cast<const ::sw::mark::IFieldmark*>(GetBookmark());
- if(pMark)
- const_cast< ::sw::mark::IFieldmark*>(pMark)->SetFieldHelptext(description);
- else
+ IFieldmark *pBkm = const_cast<IFieldmark*>(
+ dynamic_cast<const IFieldmark*>(GetBookmark()));
+ if(!pBkm)
throw uno::RuntimeException();
+ return uno::Reference<container::XNameContainer>(new SwXFieldmarkParameters(pBkm));
}
diff --git a/sw/source/filter/ww8/escher.hxx b/sw/source/filter/ww8/escher.hxx
index 37638044a44c..46aa1d0d71a8 100644
--- a/sw/source/filter/ww8/escher.hxx
+++ b/sw/source/filter/ww8/escher.hxx
@@ -88,6 +88,20 @@ private:
};
+class SwEscherExGlobal : public EscherExGlobal
+{
+public:
+ explicit SwEscherExGlobal();
+ virtual ~SwEscherExGlobal();
+
+private:
+ /** Overloaded to create a new memory stream for picture data. */
+ virtual SvStream* ImplQueryPictureStream();
+
+private:
+ ::std::auto_ptr< SvStream > mxPicStrm;
+};
+
class SwBasicEscherEx : public EscherEx
{
private:
@@ -95,7 +109,6 @@ private:
protected:
WW8Export& rWrt;
SvStream* pEscherStrm;
- SvStream* pPictStrm;
long mnEmuMul, mnEmuDiv;
virtual INT32 WriteFlyFrameAttr(const SwFrmFmt& rFmt, MSO_SPT eShapeType,
@@ -112,13 +125,11 @@ protected:
INT32 ToFract16(INT32 nVal, UINT32 nMax) const;
- SvStream* QueryPicStream();
-
virtual void SetPicId(const SdrObject &, UINT32, EscherPropertyContainer &);
SdrLayerID GetInvisibleHellId() const;
public:
- SwBasicEscherEx(SvStream* pStrm, WW8Export& rWrt, UINT32 nDrawings = 1);
+ SwBasicEscherEx(SvStream* pStrm, WW8Export& rWrt);
INT32 WriteGrfFlyFrame(const SwFrmFmt& rFmt, UINT32 nShapeId);
INT32 WriteOLEFlyFrame(const SwFrmFmt& rFmt, UINT32 nShapeId);
void WriteEmptyFlyFrame(const SwFrmFmt& rFmt, UINT32 nShapeId);
@@ -166,7 +177,7 @@ public:
virtual void WriteFrmExtraData(const SwFrmFmt& rFmt);
EscherExHostAppData* StartShape(const com::sun::star::uno::Reference<
- com::sun::star::drawing::XShape > &) {return &aHostData;}
+ com::sun::star::drawing::XShape > &, const Rectangle*) {return &aHostData;}
private:
//No copying
SwEscherEx(const SwEscherEx&);
diff --git a/sw/source/filter/ww8/wrtw8esh.cxx b/sw/source/filter/ww8/wrtw8esh.cxx
index d85a54885e43..6686ae5b13d7 100644
--- a/sw/source/filter/ww8/wrtw8esh.cxx
+++ b/sw/source/filter/ww8/wrtw8esh.cxx
@@ -1308,16 +1308,14 @@ void WW8Export::WriteEscher()
void SwEscherEx::WritePictures()
{
- if (pPictStrm)
+ if( SvStream* pPicStrm = static_cast< SwEscherExGlobal& >( *mxGlobal ).GetPictureStream() )
{
// set the blip - entries to the correct stream pos
INT32 nEndPos = rWrt.Strm().Tell();
- SetNewBlipStreamOffset( nEndPos );
+ mxGlobal->SetNewBlipStreamOffset( nEndPos );
- pPictStrm->Seek( 0 );
- rWrt.Strm() << *pPictStrm;
-
- delete pPictStrm, pPictStrm = 0;
+ pPicStrm->Seek( 0 );
+ rWrt.Strm() << *pPicStrm;
}
Flush();
}
@@ -1326,10 +1324,24 @@ void SwEscherEx::WritePictures()
// Output- Routines for Escher Export
-SwBasicEscherEx::SwBasicEscherEx(SvStream* pStrm, WW8Export& rWW8Wrt,
- UINT32 nDrawings)
- : EscherEx(*pStrm, nDrawings), rWrt(rWW8Wrt), pEscherStrm(pStrm),
- pPictStrm(0)
+SwEscherExGlobal::SwEscherExGlobal()
+{
+}
+
+SwEscherExGlobal::~SwEscherExGlobal()
+{
+}
+
+SvStream* SwEscherExGlobal::ImplQueryPictureStream()
+{
+ // this function will be called exactly once
+ mxPicStrm.reset( new SvMemoryStream );
+ mxPicStrm->SetNumberFormatInt(NUMBERFORMAT_INT_LITTLEENDIAN);
+ return mxPicStrm.get();
+}
+
+SwBasicEscherEx::SwBasicEscherEx(SvStream* pStrm, WW8Export& rWW8Wrt)
+ : EscherEx( EscherExGlobalRef( new SwEscherExGlobal ), *pStrm), rWrt(rWW8Wrt), pEscherStrm(pStrm)
{
Init();
}
@@ -1442,8 +1454,8 @@ INT32 SwBasicEscherEx::WriteGrfFlyFrame(const SwFrmFmt& rFmt, UINT32 nShapeId)
Point aEmptyPoint = Point();
Rectangle aRect( aEmptyPoint, aSize );
- sal_uInt32 nBlibId = GetBlibID( *QueryPicStream(), aUniqueId,
- aRect, NULL, 0 );
+ sal_uInt32 nBlibId = mxGlobal->GetBlibID( *QueryPictureStream(),
+ aUniqueId, aRect, NULL, 0 );
if (nBlibId)
aPropOpt.AddOpt(ESCHER_Prop_pib, nBlibId, sal_True);
}
@@ -1651,8 +1663,8 @@ void SwBasicEscherEx::WriteBrushAttr(const SvxBrushItem &rBrush,
Point aEmptyPoint = Point();
Rectangle aRect(aEmptyPoint, aSize);
- sal_uInt32 nBlibId = GetBlibID(*QueryPicStream(), aUniqueId,
- aRect, NULL, 0);
+ sal_uInt32 nBlibId = mxGlobal->GetBlibID( *QueryPictureStream(),
+ aUniqueId, aRect, NULL, 0);
if (nBlibId)
rPropOpt.AddOpt(ESCHER_Prop_fillBlip,nBlibId,sal_True);
}
@@ -1894,16 +1906,6 @@ INT32 SwBasicEscherEx::ToFract16(INT32 nVal, UINT32 nMax) const
return 0;
}
-SvStream* SwBasicEscherEx::QueryPicStream()
-{
- if (!pPictStrm)
- {
- pPictStrm = new SvMemoryStream;
- pPictStrm->SetNumberFormatInt(NUMBERFORMAT_INT_LITTLEENDIAN);
- }
- return pPictStrm;
-}
-
SdrLayerID SwBasicEscherEx::GetInvisibleHellId() const
{
return rWrt.pDoc->GetInvisibleHellId();
@@ -1911,22 +1913,19 @@ SdrLayerID SwBasicEscherEx::GetInvisibleHellId() const
void SwBasicEscherEx::WritePictures()
{
- ASSERT(pPictStrm, "no picture!");
- if (pPictStrm)
+ if( SvStream* pPicStrm = static_cast< SwEscherExGlobal& >( *mxGlobal ).GetPictureStream() )
{
// set the blip - entries to the correct stream pos
- INT32 nEndPos = pPictStrm->Tell();
- WriteBlibStoreEntry(*pEscherStrm, 1, sal_True, nEndPos);
-
- pPictStrm->Seek(0);
- *pEscherStrm << *pPictStrm;
+ INT32 nEndPos = pPicStrm->Tell();
+ mxGlobal->WriteBlibStoreEntry(*pEscherStrm, 1, sal_True, nEndPos);
- delete pPictStrm, pPictStrm = 0;
+ pPicStrm->Seek(0);
+ *pEscherStrm << *pPicStrm;
}
}
SwEscherEx::SwEscherEx(SvStream* pStrm, WW8Export& rWW8Wrt)
- : SwBasicEscherEx(pStrm, rWW8Wrt, rWW8Wrt.pHFSdrObjs->size() ? 2 : 1),
+ : SwBasicEscherEx(pStrm, rWW8Wrt),
pTxtBxs(0)
{
aHostData.SetClientData(&aWinwordAnchoring);
@@ -1964,7 +1963,7 @@ SwEscherEx::SwEscherEx(SvStream* pStrm, WW8Export& rWW8Wrt)
EnterGroup( 0 );
- ULONG nSecondShapeId = pSdrObjs == rWrt.pSdrObjs ? GetShapeID() : 0;
+ ULONG nSecondShapeId = pSdrObjs == rWrt.pSdrObjs ? GenerateShapeId() : 0;
// write now all Writer-/DrawObjects
DrawObjPointerVector aSorted;
@@ -1990,7 +1989,7 @@ SwEscherEx::SwEscherEx(SvStream* pStrm, WW8Export& rWW8Wrt)
nBorderThick = WriteFlyFrm(*pObj, nShapeId, aSorted);
break;
case sw::Frame::eFormControl:
- WriteOCXControl(rFmt, nShapeId=GetShapeID());
+ WriteOCXControl(rFmt, nShapeId = GenerateShapeId());
break;
case sw::Frame::eDrawing:
aWinwordAnchoring.SetAnchoring(rFmt);
@@ -2560,10 +2559,10 @@ INT32 SwEscherEx::WriteFlyFrm(const DrawObj &rObj, UINT32 &rShapeId,
switch( aIdx.GetNode().GetNodeType() )
{
case ND_GRFNODE:
- nBorderThick = WriteGrfFlyFrame( rFmt, rShapeId = GetShapeID() );
+ nBorderThick = WriteGrfFlyFrame( rFmt, rShapeId = GenerateShapeId() );
break;
case ND_OLENODE:
- nBorderThick = WriteOLEFlyFrame( rFmt, rShapeId = GetShapeID() );
+ nBorderThick = WriteOLEFlyFrame( rFmt, rShapeId = GenerateShapeId() );
break;
default:
if (const SdrObject* pObj = rFmt.FindRealSdrObject())
@@ -2702,7 +2701,8 @@ void SwBasicEscherEx::WriteOLEPicture(EscherPropertyContainer &rPropOpt,
aRect.SetPos(Point(0,0));
aRect.Right() = DrawModelToEmu(aRect.Right());
aRect.Bottom() = DrawModelToEmu(aRect.Bottom());
- sal_uInt32 nBlibId = GetBlibID(*QueryPicStream(), aId, aRect, pVisArea, 0); // SJ: the fourth parameter (VisArea) should be set..
+ sal_uInt32 nBlibId = mxGlobal->GetBlibID( *QueryPictureStream(),
+ aId, aRect, pVisArea, 0); // SJ: the fourth parameter (VisArea) should be set..
if (nBlibId)
rPropOpt.AddOpt(ESCHER_Prop_pib, nBlibId, sal_True);
}
@@ -2774,7 +2774,7 @@ void SwEscherEx::MakeZOrderArrAndFollowIds(
bNeedsShapeId = true;
}
- ULONG nShapeId = bNeedsShapeId ? GetShapeID() : 0;
+ ULONG nShapeId = bNeedsShapeId ? GenerateShapeId() : 0;
aFollowShpIds.Insert(nShapeId, n);
}
@@ -2789,12 +2789,12 @@ UINT32 SwEscherEx::GetFlyShapeId(const SwFrmFmt& rFmt,
{
if (0 == (nShapeId = aFollowShpIds[nPos]))
{
- nShapeId = GetShapeID();
+ nShapeId = GenerateShapeId();
aFollowShpIds[ nPos ] = nShapeId;
}
}
else
- nShapeId = GetShapeID();
+ nShapeId = GenerateShapeId();
return nShapeId;
}
diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx
index a50bdb775837..23fa8ecb2c34 100644
--- a/sw/source/filter/ww8/wrtw8nds.cxx
+++ b/sw/source/filter/ww8/wrtw8nds.cxx
@@ -103,12 +103,53 @@
#include <ndgrf.hxx>
#include <ndole.hxx>
+
using namespace ::com::sun::star;
using namespace ::com::sun::star::i18n;
using namespace sw::util;
using namespace sw::types;
+using namespace sw::mark;
using namespace nsFieldFlags;
+
+static String lcl_getFieldCode( const IFieldmark* pFieldmark ) {
+ ASSERT(pFieldmark!=NULL, "where is my fieldmark???");
+ if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMTEXT ) ) {
+ return String::CreateFromAscii(" FORMTEXT ");
+ } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMDROPDOWN ) ) {
+ return String::CreateFromAscii(" FORMDROPDOWN ");
+ } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMCHECKBOX ) ) {
+ return String::CreateFromAscii(" FORMCHECKBOX ");
+ } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_TOC ) ) {
+ return String::CreateFromAscii(" TOC ");
+ } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_HYPERLINK ) ) {
+ return String::CreateFromAscii(" HYPERLINK ");
+ } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_PAGEREF ) ) {
+ return String::CreateFromAscii(" PAGEREF ");
+ } else {
+ return pFieldmark->GetFieldname();
+ }
+}
+
+ww::eField lcl_getFieldId( const IFieldmark* pFieldmark ) {
+ ASSERT(pFieldmark!=NULL, "where is my fieldmark???");
+ if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMTEXT ) ) {
+ return ww::eFORMTEXT;
+ } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMDROPDOWN ) ) {
+ return ww::eFORMDROPDOWN;
+ } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMCHECKBOX ) ) {
+ return ww::eFORMCHECKBOX;
+ } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_TOC ) ) {
+ return ww::eTOC;
+ } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_HYPERLINK ) ) {
+ return ww::eHYPERLINK;
+ } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_PAGEREF ) ) {
+ return ww::ePAGEREF;
+ } else {
+ return ww::eUNKNOWN;
+ }
+}
+
/* */
MSWordAttrIter::MSWordAttrIter( MSWordExportBase& rExport )
@@ -259,22 +300,40 @@ SwAttrIter::SwAttrIter(MSWordExportBase& rWr, const SwTxtNode& rTxtNd) :
nAktSwPos = SearchNext(1);
}
+xub_StrLen lcl_getMinPos( xub_StrLen pos1, xub_StrLen pos2 )
+{
+ xub_StrLen min = STRING_NOTFOUND;
+ if ( pos1 == STRING_NOTFOUND && pos2 != STRING_NOTFOUND )
+ min = pos2;
+ else if ( pos2 == STRING_NOTFOUND && pos1 != STRING_NOTFOUND )
+ min = pos1;
+ else if ( pos2 != STRING_NOTFOUND && pos2 != STRING_NOTFOUND )
+ {
+ if ( pos1 < pos2 )
+ min = pos1;
+ else
+ min = pos2;
+ }
+
+ return min;
+}
+
xub_StrLen SwAttrIter::SearchNext( xub_StrLen nStartPos )
{
xub_StrLen nPos;
xub_StrLen nMinPos = STRING_MAXLEN;
+ xub_StrLen i=0;
+
const String aTxt = rNd.GetTxt();
- xub_StrLen pos = aTxt.Search(CH_TXT_ATR_FIELDSTART, nStartPos);
- if( pos==STRING_NOTFOUND )
- {
- pos = aTxt.Search(CH_TXT_ATR_FIELDEND, nStartPos);
- if( pos==STRING_NOTFOUND )
- pos = aTxt.Search(CH_TXT_ATR_FORMELEMENT, nStartPos);
- }
- if( pos!=STRING_NOTFOUND )
- nMinPos=pos;
+ xub_StrLen fieldEndPos = aTxt.Search(CH_TXT_ATR_FIELDEND, nStartPos);
+ xub_StrLen fieldStartPos = aTxt.Search(CH_TXT_ATR_FIELDSTART, nStartPos);
+ xub_StrLen formElementPos = aTxt.Search(CH_TXT_ATR_FORMELEMENT, nStartPos);
- xub_StrLen i=0;
+ xub_StrLen pos = lcl_getMinPos( fieldEndPos, fieldStartPos );
+ pos = lcl_getMinPos( pos, formElementPos );
+
+ if (pos!=STRING_NOTFOUND)
+ nMinPos=pos;
// first the redline, then the attributes
if( pCurRedline )
@@ -1692,12 +1751,14 @@ void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode )
::sw::mark::IFieldmark const * const pFieldmark = pMarkAccess->getFieldmarkFor( aPosition );
OSL_ENSURE( pFieldmark, "Looks like this doc is broken...; where is the Fieldmark for the FIELDSTART??" );
- if ( pFieldmark )
- AppendBookmark( pFieldmark->GetName(), true );
- OutputField( NULL, ww::eFORMTEXT, String::CreateFromAscii( " FORMTEXT " ), WRITEFIELD_START | WRITEFIELD_CMD_START );
- if ( pFieldmark )
+ if ( pFieldmark->GetFieldname().equalsAscii( ODF_FORMTEXT ) )
+ AppendBookmark( pFieldmark->GetName(), false );
+ OutputField( NULL, lcl_getFieldId( pFieldmark ), lcl_getFieldCode( pFieldmark ), WRITEFIELD_START | WRITEFIELD_CMD_START );
+ if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMTEXT ) )
WriteFormData( *pFieldmark );
- OutputField( NULL, ww::eFORMTEXT, String(), WRITEFIELD_CMD_END );
+ else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_HYPERLINK ) )
+ WriteHyperlinkData( *pFieldmark );
+ OutputField( NULL, lcl_getFieldId( pFieldmark ), String(), WRITEFIELD_CMD_END );
}
else if ( ch == CH_TXT_ATR_FIELDEND )
{
@@ -1705,8 +1766,8 @@ void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode )
::sw::mark::IFieldmark const * const pFieldmark = pMarkAccess->getFieldmarkFor( aPosition );
OSL_ENSURE( pFieldmark, "Looks like this doc is broken...; where is the Fieldmark for the FIELDSTART??" );
- OutputField( NULL, ww::eFORMTEXT, String(), WRITEFIELD_CLOSE );
- if ( pFieldmark )
+ OutputField( NULL, lcl_getFieldId( pFieldmark ), String(), WRITEFIELD_CLOSE );
+ if ( pFieldmark->GetFieldname().equalsAscii( ODF_FORMTEXT ) )
AppendBookmark( pFieldmark->GetName(), false );
}
else if ( ch == CH_TXT_ATR_FORMELEMENT )
@@ -1715,13 +1776,18 @@ void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode )
::sw::mark::IFieldmark const * const pFieldmark = pMarkAccess->getFieldmarkFor( aPosition );
OSL_ENSURE( pFieldmark, "Looks like this doc is broken...; where is the Fieldmark for the FIELDSTART??" );
- if ( pFieldmark )
- AppendBookmark( pFieldmark->GetName(), true );
- OutputField( NULL, ww::eFORMCHECKBOX, String::CreateFromAscii( " FORMCHECKBOX " ), WRITEFIELD_START | WRITEFIELD_CMD_START );
- if ( pFieldmark )
+ bool isDropdownOrCheckbox = pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMDROPDOWN ) ||
+ pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMCHECKBOX );
+
+ if ( isDropdownOrCheckbox )
+ AppendBookmark( pFieldmark->GetName(), 0 );
+ OutputField( NULL, lcl_getFieldId( pFieldmark ),
+ lcl_getFieldCode( pFieldmark ),
+ WRITEFIELD_START | WRITEFIELD_CMD_START );
+ if ( isDropdownOrCheckbox )
WriteFormData( *pFieldmark );
- OutputField( NULL, ww::eFORMCHECKBOX, String(), WRITEFIELD_CMD_END | WRITEFIELD_CLOSE );
- if ( pFieldmark )
+ OutputField( NULL, lcl_getFieldId( pFieldmark ), String(), WRITEFIELD_CLOSE );
+ if ( isDropdownOrCheckbox )
AppendBookmark( pFieldmark->GetName(), false );
}
nLen -= static_cast< USHORT >( ofs );
diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx
index ddb0a55cd5fa..6bf7ecbb8cdf 100644
--- a/sw/source/filter/ww8/wrtww8.cxx
+++ b/sw/source/filter/ww8/wrtww8.cxx
@@ -94,7 +94,7 @@
#include <fmtline.hxx>
#include <fmtfsize.hxx>
#include <comphelper/extract.hxx>
-
+#include <comphelper/stlunosequence.hxx>
#include <writerfilter/doctok/sprmids.hxx>
#include "writerhelper.hxx"
@@ -102,6 +102,7 @@
#include "ww8attributeoutput.hxx"
#include <IDocumentMarkAccess.hxx>
+#include <xmloff/odffields.hxx>
#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
#include <com/sun/star/document/XDocumentProperties.hpp>
@@ -2379,33 +2380,33 @@ void WW8AttributeOutput::TableBackgrounds( ww8::WW8TableNodeInfoInner::Pointer_t
m_rWW8Export.pO->Insert( static_cast<BYTE>(nBoxes0 * 10),
m_rWW8Export.pO->Count() );
- for ( sal_uInt8 n = 0; n < nBoxes0; n++ )
- {
- const SwTableBox * pBox1 = rTabBoxes[n];
- const SwFrmFmt * pFrmFmt = pBox1->GetFrmFmt();
- const SfxPoolItem * pI = NULL;
- Color aColor;
+ for ( sal_uInt8 n = 0; n < nBoxes0; n++ )
+ {
+ const SwTableBox * pBox1 = rTabBoxes[n];
+ const SwFrmFmt * pFrmFmt = pBox1->GetFrmFmt();
+ const SfxPoolItem * pI = NULL;
+ Color aColor;
if ( SFX_ITEM_ON ==
pFrmFmt->GetAttrSet().
GetItemState( RES_BACKGROUND, false, &pI ) )
- {
- aColor = dynamic_cast<const SvxBrushItem *>(pI)->GetColor();
- }
- else
- aColor = COL_AUTO;
+ {
+ aColor = dynamic_cast<const SvxBrushItem *>(pI)->GetColor();
+ }
+ else
+ aColor = COL_AUTO;
- WW8SHDLong aSHD;
- aSHD.setCvFore( 0xFF000000 );
+ WW8SHDLong aSHD;
+ aSHD.setCvFore( 0xFF000000 );
- sal_uInt32 nBgColor = aColor.GetColor();
- if ( nBgColor == COL_AUTO )
- aSHD.setCvBack( 0xFF000000 );
- else
- aSHD.setCvBack( wwUtility::RGBToBGR( nBgColor ) );
+ sal_uInt32 nBgColor = aColor.GetColor();
+ if ( nBgColor == COL_AUTO )
+ aSHD.setCvBack( 0xFF000000 );
+ else
+ aSHD.setCvBack( wwUtility::RGBToBGR( nBgColor ) );
- aSHD.Write( m_rWW8Export );
- }
+ aSHD.Write( m_rWW8Export );
+ }
}
}
}
@@ -2709,18 +2710,19 @@ void WW8Export::WriteFkpPlcUsw()
if ( pSttbfAssoc )
// <--
{
- ::std::vector<String> aStrings;
- ::ww8::StringVector_t & aSttbStrings = pSttbfAssoc->getStrings();
- ::ww8::StringVector_t::const_iterator aItEnd = aSttbStrings.end();
- for (::ww8::StringVector_t::const_iterator aIt = aSttbStrings.begin();
- aIt != aItEnd; aIt++)
- {
- String aStr(aIt->getStr());
- aStrings.push_back(aStr);
- }
+ ::std::vector<String> aStrings;
- WriteAsStringTable(aStrings, pFib->fcSttbfAssoc,
- pFib->lcbSttbfAssoc);
+ ::ww8::StringVector_t & aSttbStrings = pSttbfAssoc->getStrings();
+ ::ww8::StringVector_t::const_iterator aItEnd = aSttbStrings.end();
+ for (::ww8::StringVector_t::const_iterator aIt = aSttbStrings.begin();
+ aIt != aItEnd; aIt++)
+ {
+ String aStr(aIt->getStr());
+ aStrings.push_back(aStr);
+ }
+
+ WriteAsStringTable(aStrings, pFib->fcSttbfAssoc,
+ pFib->lcbSttbfAssoc);
}
}
Strm().Seek( 0 );
@@ -2728,18 +2730,17 @@ void WW8Export::WriteFkpPlcUsw()
// Reclaim stored FIB data from document.
::ww8::WW8FibData * pFibData = dynamic_cast<ww8::WW8FibData *>
(pDoc->getExternalData(::sw::FIB).get());
- // --> OD 2009-10-19 #i106057#
+
if ( pFibData )
// <--
{
- pFib->fReadOnlyRecommended =
- pFibData->getReadOnlyRecommended() ? 1 : 0;
- pFib->fWriteReservation =
- pFibData->getWriteReservation() ? 1 : 0;
+ pFib->fReadOnlyRecommended =
+ pFibData->getReadOnlyRecommended() ? 1 : 0;
+ pFib->fWriteReservation =
+ pFibData->getWriteReservation() ? 1 : 0;
}
pFib->Write( Strm() ); // FIB
-
}
void WW8Export::StoreDoc1()
@@ -3527,11 +3528,23 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark )
const ::sw::mark::IFieldmark* pFieldmark = &rFieldmark;
const ::sw::mark::ICheckboxFieldmark* pAsCheckbox = dynamic_cast< const ::sw::mark::ICheckboxFieldmark* >( pFieldmark );
+
+ ASSERT(rFieldmark.GetFieldname().equalsAscii( ODF_FORMTEXT ) || rFieldmark.GetFieldname().equalsAscii( ODF_FORMDROPDOWN ) || rFieldmark.GetFieldname().equalsAscii( ODF_FORMCHECKBOX ), "Unknown field type!!!");
+ if ( ! ( rFieldmark.GetFieldname().equalsAscii( ODF_FORMTEXT ) ||
+ rFieldmark.GetFieldname().equalsAscii( ODF_FORMDROPDOWN ) ||
+ rFieldmark.GetFieldname().equalsAscii( ODF_FORMCHECKBOX ) ) )
+ return;
+
int type = 0; // TextFieldmark
if ( pAsCheckbox )
type = 1;
+ if ( rFieldmark.GetFieldname().equalsAscii( ODF_FORMDROPDOWN ) )
+ type=2;
- const ::rtl::OUString ffname = rFieldmark.GetFieldname();
+ ::sw::mark::IFieldmark::parameter_map_t::const_iterator pNameParameter = rFieldmark.GetParameters()->find(::rtl::OUString::createFromAscii("name"));
+ ::rtl::OUString ffname;
+ if(pNameParameter != rFieldmark.GetParameters()->end())
+ pNameParameter->second >>= ffname;
ULONG nDataStt = pDataStrm->Tell();
pChpPlc->AppendFkpEntry(Strm().Tell());
@@ -3553,15 +3566,37 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark )
sal_uInt8 aFldHeader[] =
{
0xFF, 0xFF, 0xFF, 0xFF, // Unicode Marker...
- 0, 0, 0, 0//, 0, 0, 0, 0
+ 0, 0, 0, 0,// 0, 0, 0, 0
};
aFldHeader[4] |= (type & 0x03);
- int ffres = 0; // rFieldmark.GetFFRes();
+ sal_Int32 ffres = 0; // rFieldmark.GetFFRes();
if ( pAsCheckbox && pAsCheckbox->IsChecked() )
ffres = 1;
+ else if ( type == 2 )
+ {
+ ::sw::mark::IFieldmark::parameter_map_t::const_iterator pResParameter = rFieldmark.GetParameters()->find(::rtl::OUString::createFromAscii(ODF_FORMDROPDOWN));
+ if(pResParameter != rFieldmark.GetParameters()->end())
+ pResParameter->second >>= ffres;
+ else
+ ffres = 0;
+ }
aFldHeader[4] |= ( (ffres<<2) & 0x7C );
+ std::vector< ::rtl::OUString > aListItems;
+ if (type==2)
+ {
+ aFldHeader[5] |= 0x80; // ffhaslistbox
+ const ::sw::mark::IFieldmark::parameter_map_t* const pParameters = rFieldmark.GetParameters();
+ ::sw::mark::IFieldmark::parameter_map_t::const_iterator pListEntries = pParameters->find(::rtl::OUString::createFromAscii(ODF_FORMDROPDOWN_LISTENTRY));
+ if(pListEntries != pParameters->end())
+ {
+ uno::Sequence< ::rtl::OUString > vListEntries;
+ pListEntries->second >>= vListEntries;
+ copy(::comphelper::stl_begin(vListEntries), ::comphelper::stl_end(vListEntries), back_inserter(aListItems));
+ }
+ }
+
const ::rtl::OUString ffdeftext;
const ::rtl::OUString ffformat;
const ::rtl::OUString ffhelptext;
@@ -3569,6 +3604,7 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark )
const ::rtl::OUString ffentrymcr;
const ::rtl::OUString ffexitmcr;
+
const sal_uInt8 aFldData[] =
{
0x44,0, // the start of "next" data
@@ -3578,7 +3614,7 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark )
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // | /16
0,0,0,0, // / /4
};
- sal_uInt32 slen=sizeof(sal_uInt32)
+ sal_uInt32 slen = sizeof(sal_uInt32)
+ sizeof(aFldData)
+ sizeof( aFldHeader )
+ 2*ffname.getLength() + 4
@@ -3588,6 +3624,15 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark )
+ 2*ffstattext.getLength() + 4
+ 2*ffentrymcr.getLength() + 4
+ 2*ffexitmcr.getLength() + 4;
+ if ( type==2 ) {
+ slen += 2; // for 0xFF, 0xFF
+ slen += 4; // for num of list items
+ const int items = aListItems.size();
+ for( int i = 0; i < items; i++ ) {
+ rtl::OUString item = aListItems[i];
+ slen += 2 * item.getLength() + 2;
+ }
+ }
*pDataStrm << slen;
@@ -3597,6 +3642,7 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark )
len = sizeof( aFldHeader );
OSL_ENSURE( len == 8, "SwWW8Writer::WriteFormData(..) - wrong aFldHeader length" );
+
pDataStrm->Write( aFldHeader, len );
SwWW8Writer::WriteString_xstz( *pDataStrm, ffname, true ); // Form field name
@@ -3611,11 +3657,20 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark )
SwWW8Writer::WriteString_xstz( *pDataStrm, String( ffstattext ), true );
SwWW8Writer::WriteString_xstz( *pDataStrm, String( ffentrymcr ), true );
SwWW8Writer::WriteString_xstz( *pDataStrm, String( ffexitmcr ), true );
-// if (type==2) {
-// // 0xFF, 0xFF
-// // sal_uInt32 number of strings
-// // (sal_uInt16 len; sal_uInt16 unicode char[len])*num of strings
-// }
+ if (type==2) {
+ *pDataStrm<<(sal_uInt16)0xFFFF;
+ const int items=aListItems.size();
+ *pDataStrm<<(sal_uInt32)items;
+ for(int i=0;i<items;i++) {
+ rtl::OUString item=aListItems[i];
+ SwWW8Writer::WriteString_xstz( *pDataStrm, item, false );
+ }
+ }
+}
+
+void WW8Export::WriteHyperlinkData( const sw::mark::IFieldmark& /*rFieldmark*/ )
+{
+ //@TODO implement me !!!
}
void WW8AttributeOutput::TableNodeInfoInner( ww8::WW8TableNodeInfoInner::Pointer_t pNodeInfoInner )
diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
index ca96f617c5fd..21295ba11ca4 100644
--- a/sw/source/filter/ww8/wrtww8.hxx
+++ b/sw/source/filter/ww8/wrtww8.hxx
@@ -706,6 +706,7 @@ public:
/// Write the data of the form field
virtual void WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ) = 0;
+ virtual void WriteHyperlinkData( const ::sw::mark::IFieldmark& rFieldmark ) = 0;
virtual void DoComboBox(const rtl::OUString &rName,
const rtl::OUString &rHelp,
@@ -1073,6 +1074,7 @@ public:
/// Write the data of the form field
virtual void WriteFormData( const ::sw::mark::IFieldmark& rFieldmark );
+ virtual void WriteHyperlinkData( const ::sw::mark::IFieldmark& rFieldmark );
/// Fields.
WW8_WrPlcFld* CurrentFieldPlc() const;
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index 0285b3451b6f..a290e8f30790 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -1508,7 +1508,6 @@ WW8ReaderSave::WW8ReaderSave(SwWW8ImplReader* pRdr ,WW8_CP nStartCp) :
maOldApos.push_back(false);
maOldApos.swap(pRdr->maApos);
maOldFieldStack.swap(pRdr->maFieldStack);
- maFieldCtxStack.swap(pRdr->maNewFieldCtxStack);
}
void WW8ReaderSave::Restore( SwWW8ImplReader* pRdr )
@@ -1555,7 +1554,6 @@ void WW8ReaderSave::Restore( SwWW8ImplReader* pRdr )
pRdr->pPlcxMan->RestoreAllPLCFx(maPLCFxSave);
pRdr->maApos.swap(maOldApos);
pRdr->maFieldStack.swap(maOldFieldStack);
- pRdr->maNewFieldCtxStack.swap(maFieldCtxStack);
}
void SwWW8ImplReader::Read_HdFtFtnText( const SwNodeIndex* pSttIdx,
@@ -2673,29 +2671,6 @@ bool SwWW8ImplReader::ReadChar(long nPosCp, long nCpOfs)
case 0x15:
if( !bSpec ) // Juristenparagraph
cInsert = '\xa7';
- else
- {
- // 0x15 is special --> so it's our field end mark...;
- // hmmm what about field marks not handled by us??, maybe a problem with nested fields;
- // probably an area of bugs... [well release quick and release often....]
- if (!maNewFieldCtxStack.empty() && pPaM!=NULL && pPaM->GetPoint()!=NULL)
- {
- ::boost::scoped_ptr<WW8NewFieldCtx> pFieldCtx(maNewFieldCtxStack.back());
- maNewFieldCtxStack.pop_back();
- SwPosition aEndPos = *pPaM->GetPoint();
- SwPaM aFldPam(pFieldCtx->GetPtNode(), pFieldCtx->GetPtCntnt(), aEndPos.nNode, aEndPos.nContent.GetIndex());
- IDocumentMarkAccess* const pMarkAccess = rDoc.getIDocumentMarkAccess();
- ::sw::mark::IFieldmark* pFieldmark =
- dynamic_cast< ::sw::mark::IFieldmark*>(pMarkAccess->makeMark(
- aFldPam,
- pFieldCtx->GetBookmarkName(),
- IDocumentMarkAccess::TEXT_FIELDMARK));
- OSL_ENSURE(pFieldmark!=NULL,
- "hmmm; why was the bookmark not created?");
- if (pFieldmark)
- pFieldCtx->SetCurrentFieldParamsTo(pFieldmark);
- }
- }
break;
case 0x9:
cInsert = '\x9'; // Tab
@@ -3507,7 +3482,14 @@ void wwSectionManager::InsertSegments()
bool bInsertSection = (aIter != aStart) ? (aIter->IsContinous() && bThisAndPreviousAreCompatible): false;
bool bInsertPageDesc = !bInsertSection;
- bool bProtected = !bUseEnhFields && SectionIsProtected(*aIter); // do we really need this ?? I guess I have a different logic in editshell which disales this...
+ bool bProtected = SectionIsProtected(*aIter); // do we really need this ?? I guess I have a different logic in editshell which disales this...
+ if (bUseEnhFields && mrReader.pWDop->fProtEnabled && aIter->IsNotProtected()) {
+ // here we have the special case that the whole document is protected, with the execption of this section.
+ // I want to address this when I do the section rework, so for the moment we disable the overall protection then...
+ mrReader.rDoc.set(IDocumentSettingAccess::PROTECT_FORM, false );
+ }
+
+
if (bInsertPageDesc)
{
/*
diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx
index 6d731ea1204e..099ecca83d6a 100644
--- a/sw/source/filter/ww8/ww8par.hxx
+++ b/sw/source/filter/ww8/ww8par.hxx
@@ -57,6 +57,8 @@
#include "ww8glsy.hxx"
#include "wrtww8.hxx"
#include "../inc/msfilter.hxx"
+#include <xmloff/odffields.hxx>
+#include <IMark.hxx>
class SwDoc;
class SwPaM;
@@ -359,43 +361,35 @@ namespace sw
Position(const SwPosition &rPos);
Position(const Position &rPos);
operator SwPosition() const;
+ SwNodeIndex GetPtNode() { return maPtNode; };
+ xub_StrLen GetPtCntnt() { return mnPtCntnt; };
};
}
}
class FieldEntry
{
-public:
- sw::hack::Position maStartPos;
- sal_uInt16 mnFieldId;
- FieldEntry(SwPosition &rPos, sal_uInt16 nFieldId) throw();
- FieldEntry(const FieldEntry &rOther) throw();
- FieldEntry &operator=(const FieldEntry &rOther) throw();
- void Swap(FieldEntry &rOther) throw();
-};
-
-class WW8NewFieldCtx
-{
-private:
- SwNodeIndex maPtNode;
- xub_StrLen mnPtCntnt;
- ::rtl::OUString msBookmarkName;
- ::rtl::OUString msMarkType;
- typedef ::std::pair< ::rtl::OUString, ::rtl::OUString> Param_t;
- typedef ::std::vector< Param_t > Params_t;
- Params_t maParams;
- SwPaM * mpPaM;
-
-public:
- WW8NewFieldCtx(SwPosition &aStartPos, ::rtl::OUString sBookmarkName, ::rtl::OUString sMarkType);
- ~WW8NewFieldCtx();
-
- SwNodeIndex GetPtNode() { return maPtNode; };
- xub_StrLen GetPtCntnt() { return mnPtCntnt; };
- ::rtl::OUString GetBookmarkName();
- ::rtl::OUString GetMarkType();
- void AddParam(::rtl::OUString name, ::rtl::OUString value);
- void SetCurrentFieldParamsTo(::sw::mark::IFieldmark* pFieldmark);
+ private:
+ ::rtl::OUString msBookmarkName;
+ ::rtl::OUString msMarkType;
+ ::sw::mark::IFieldmark::parameter_map_t maParams;
+
+ public:
+ sw::hack::Position maStartPos;
+ sal_uInt16 mnFieldId;
+ FieldEntry(SwPosition &rPos, sal_uInt16 nFieldId) throw();
+ FieldEntry(const FieldEntry &rOther) throw();
+ FieldEntry &operator=(const FieldEntry &rOther) throw();
+ void Swap(FieldEntry &rOther) throw();
+
+ SwNodeIndex GetPtNode() { return maStartPos.GetPtNode(); };
+ xub_StrLen GetPtCntnt() { return maStartPos.GetPtCntnt(); };
+
+ ::rtl::OUString GetBookmarkName();
+ ::rtl::OUString GetBookmarkType();
+ void SetBookmarkName(::rtl::OUString bookmarkName);
+ void SetBookmarkType(::rtl::OUString bookmarkType);
+ ::sw::mark::IFieldmark::parameter_map_t& getParameters();
};
@@ -431,7 +425,6 @@ private:
bool mbWasParaEnd;
bool mbHasBorder;
bool mbFirstPara;
- std::deque<WW8NewFieldCtx *> maFieldCtxStack;
public:
WW8ReaderSave(SwWW8ImplReader* pRdr, WW8_CP nStart=-1);
void Restore(SwWW8ImplReader* pRdr);
@@ -886,9 +879,6 @@ private:
std::deque<FieldEntry> maFieldStack;
typedef std::deque<FieldEntry>::const_iterator mycFieldIter;
- typedef std::deque<WW8NewFieldCtx *> WW8NewFieldCtxStack_t;
- WW8NewFieldCtxStack_t maNewFieldCtxStack;
-
/*
A stack of open footnotes. Should only be one in it at any time.
*/
diff --git a/sw/source/filter/ww8/ww8par3.cxx b/sw/source/filter/ww8/ww8par3.cxx
index 984f5792e5ac..465d07c0d2b5 100644
--- a/sw/source/filter/ww8/ww8par3.cxx
+++ b/sw/source/filter/ww8/ww8par3.cxx
@@ -58,6 +58,7 @@
#include <com/sun/star/text/VertOrientation.hpp>
#include <com/sun/star/text/TextContentAnchorType.hpp>
#include <comphelper/extract.hxx>
+#include <comphelper/stlunosequence.hxx>
#include <com/sun/star/beans/XPropertyContainer.hpp>
#include <com/sun/star/beans/PropertyAttribute.hpp>
@@ -93,66 +94,15 @@
#include <IMark.hxx>
#include <unotools/fltrcfg.hxx>
+#include <xmloff/odffields.hxx>
#include <stdio.h>
+#include <algorithm>
using namespace com::sun::star;
using namespace sw::util;
using namespace sw::types;
-
-WW8NewFieldCtx::WW8NewFieldCtx(SwPosition &aStartPos, ::rtl::OUString sBookmarkName, ::rtl::OUString sMarkType)
- : maPtNode(aStartPos.nNode)
- , mnPtCntnt(aStartPos.nContent.GetIndex())
- , msBookmarkName(sBookmarkName)
- , msMarkType(sMarkType)
- , mpPaM(NULL)
-{
-}
-
-
-WW8NewFieldCtx::~WW8NewFieldCtx()
-{
- if (mpPaM) delete mpPaM;
-}
-
-::rtl::OUString WW8NewFieldCtx::GetBookmarkName()
-{
- return msBookmarkName;
-}
-
-::rtl::OUString WW8NewFieldCtx::GetMarkType()
-{
- return msMarkType;
-}
-
-void WW8NewFieldCtx::AddParam(::rtl::OUString name, ::rtl::OUString value)
-{
- maParams.push_back( Param_t(name, value) );
-}
-
-void WW8NewFieldCtx::SetCurrentFieldParamsTo(::sw::mark::IFieldmark* pFieldmark)
-{
- for(Params_t::iterator i=maParams.begin();i!=maParams.end();i++)
- {
- ::rtl::OUString aName=i->first;
- ::rtl::OUString aValue=i->second;
- if(aName.compareToAscii("Description")==0)
- {
- pFieldmark->SetFieldHelptext(aValue);
- }
- else if(aName.compareToAscii("Name")==0)
- {
- pFieldmark->SetFieldname(aValue);
- }
- else if(aName.compareToAscii("Result")==0)
- {
- ::sw::mark::ICheckboxFieldmark* pAsCheckbox =
- dynamic_cast< ::sw::mark::ICheckboxFieldmark* >(pFieldmark);
- if(pAsCheckbox)
- pAsCheckbox->SetChecked(aValue.toInt32()==0);
- }
- }
-}
+using namespace sw::mark;
//-----------------------------------------
// UNO-Controls
@@ -230,10 +180,10 @@ eF_ResT SwWW8ImplReader::Read_F_FormTextBox( WW8FieldDesc* pF, String& rStr )
if (aBookmarkName.Len()>0) {
- WW8NewFieldCtx *pFieldCtx=new WW8NewFieldCtx(*pPaM->GetPoint(), aBookmarkName, ::rtl::OUString::createFromAscii("ecma.office-open-xml.field.FORMTEXT"));
- maNewFieldCtxStack.push_back(pFieldCtx);
- pFieldCtx->AddParam(::rtl::OUString::createFromAscii("Description"), aFormula.sToolTip);
- pFieldCtx->AddParam(::rtl::OUString::createFromAscii("Name"), aFormula.sTitle);
+ maFieldStack.back().SetBookmarkName(aBookmarkName);
+ maFieldStack.back().SetBookmarkType(::rtl::OUString::createFromAscii(ODF_FORMTEXT));
+ maFieldStack.back().getParameters()[::rtl::OUString::createFromAscii("Description")] = uno::makeAny(::rtl::OUString(aFormula.sToolTip));
+ maFieldStack.back().getParameters()[::rtl::OUString::createFromAscii("Name")] = uno::makeAny(::rtl::OUString(aFormula.sTitle));
}
return FLD_TEXT;
}
@@ -276,19 +226,20 @@ eF_ResT SwWW8ImplReader::Read_F_FormCheckBox( WW8FieldDesc* pF, String& rStr )
aBookmarkName=pB->GetUniqueBookmarkName(aFormula.sTitle);
}
- if (aBookmarkName.Len()>0) {
- ::sw::mark::ICheckboxFieldmark* pFieldmark =
- dynamic_cast< ::sw::mark::ICheckboxFieldmark*>(rDoc.getIDocumentMarkAccess()->makeMark(
- *pPaM,
- aBookmarkName,
- IDocumentMarkAccess::CHECKBOX_FIELDMARK));
- OSL_ENSURE(pFieldmark,
- "hmmm; why was the bookmark not created?");
- if(pFieldmark)
- {
- pFieldmark->SetFieldname(aFormula.sTitle);
- pFieldmark->SetFieldHelptext(aFormula.sToolTip);
- pFieldmark->SetChecked(aFormula.nChecked!=0);
+ if (aBookmarkName.Len()>0)
+ {
+ IDocumentMarkAccess* pMarksAccess = rDoc.getIDocumentMarkAccess( );
+ IFieldmark* pFieldmark = dynamic_cast<IFieldmark*>( pMarksAccess->makeNoTextFieldBookmark(
+ *pPaM, aBookmarkName,
+ rtl::OUString::createFromAscii( ODF_FORMCHECKBOX ) ) );
+ ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
+ if (pFieldmark!=NULL) {
+ IFieldmark::parameter_map_t* const pParameters = pFieldmark->GetParameters();
+ ICheckboxFieldmark* pCheckboxFm = dynamic_cast<ICheckboxFieldmark*>(pFieldmark);
+ (*pParameters)[::rtl::OUString::createFromAscii(ODF_FORMCHECKBOX_NAME)] = uno::makeAny(::rtl::OUString(aFormula.sTitle));
+ (*pParameters)[::rtl::OUString::createFromAscii(ODF_FORMCHECKBOX_HELPTEXT)] = uno::makeAny(::rtl::OUString(aFormula.sToolTip));
+ if(pCheckboxFm)
+ pCheckboxFm->SetChecked(aFormula.nChecked);
// set field data here...
}
}
@@ -303,24 +254,71 @@ eF_ResT SwWW8ImplReader::Read_F_FormListBox( WW8FieldDesc* pF, String& rStr)
if (0x01 == rStr.GetChar(writer_cast<xub_StrLen>(pF->nLCode-1)))
ImportFormulaControl(aFormula,pF->nSCode+pF->nLCode-1, WW8_CT_DROPDOWN);
- SwDropDownField aFld(
- (SwDropDownFieldType*)rDoc.GetSysFldType(RES_DROPDOWN));
-
- aFld.SetName(aFormula.sTitle);
- aFld.SetHelp(aFormula.sHelp);
- aFld.SetToolTip(aFormula.sToolTip);
+ const SvtFilterOptions* pOpt = SvtFilterOptions::Get();
+ sal_Bool bUseEnhFields=(pOpt && pOpt->IsUseEnhancedFields());
- if (!aFormula.maListEntries.empty())
+ if (!bUseEnhFields)
{
- aFld.SetItems(aFormula.maListEntries);
- int nIndex = aFormula.fDropdownIndex < aFormula.maListEntries.size()
- ? aFormula.fDropdownIndex : 0;
- aFld.SetSelectedItem(aFormula.maListEntries[nIndex]);
+ SwDropDownField aFld((SwDropDownFieldType*)rDoc.GetSysFldType(RES_DROPDOWN));
+
+ aFld.SetName(aFormula.sTitle);
+ aFld.SetHelp(aFormula.sHelp);
+ aFld.SetToolTip(aFormula.sToolTip);
+
+ if (!aFormula.maListEntries.empty())
+ {
+ aFld.SetItems(aFormula.maListEntries);
+ int nIndex = aFormula.fDropdownIndex < aFormula.maListEntries.size() ? aFormula.fDropdownIndex : 0;
+ aFld.SetSelectedItem(aFormula.maListEntries[nIndex]);
+ }
+
+ rDoc.InsertPoolItem(*pPaM, SwFmtFld(aFld), 0);
+ return FLD_OK;
}
+ else
+ {
+ // TODO: review me
+ String aBookmarkName;
+ WW8PLCFx_Book* pB = pPlcxMan->GetBook();
+ if (pB!=NULL)
+ {
+ WW8_CP currentCP=pF->nSCode;
+ WW8_CP currentLen=pF->nLen;
- rDoc.InsertPoolItem(*pPaM, SwFmtFld(aFld), 0);
+ USHORT bkmFindIdx;
+ String aBookmarkFind=pB->GetBookmark(currentCP-1, currentCP+currentLen-1, bkmFindIdx);
- return FLD_OK;
+ if (aBookmarkFind.Len()>0)
+ {
+ pB->SetStatus(bkmFindIdx, BOOK_FIELD); // mark as consumed by field
+ if (aBookmarkFind.Len()>0)
+ aBookmarkName=aBookmarkFind;
+ }
+ }
+
+ if (pB!=NULL && aBookmarkName.Len()==0)
+ aBookmarkName=pB->GetUniqueBookmarkName(aFormula.sTitle);
+
+ if (aBookmarkName.Len()>0)
+ {
+ IDocumentMarkAccess* pMarksAccess = rDoc.getIDocumentMarkAccess( );
+ IFieldmark *pFieldmark = dynamic_cast<IFieldmark*>(
+ pMarksAccess->makeNoTextFieldBookmark( *pPaM, aBookmarkName,
+ ::rtl::OUString::createFromAscii( ODF_FORMDROPDOWN ) ) );
+ ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
+ if ( pFieldmark != NULL )
+ {
+ uno::Sequence< ::rtl::OUString > vListEntries(aFormula.maListEntries.size());
+ ::std::copy(aFormula.maListEntries.begin(), aFormula.maListEntries.end(), ::comphelper::stl_begin(vListEntries));
+ (*pFieldmark->GetParameters())[::rtl::OUString::createFromAscii(ODF_FORMDROPDOWN_LISTENTRY)] = uno::makeAny(vListEntries);
+ sal_Int32 nIndex = aFormula.fDropdownIndex < aFormula.maListEntries.size() ? aFormula.fDropdownIndex : 0;
+ (*pFieldmark->GetParameters())[::rtl::OUString::createFromAscii(ODF_FORMDROPDOWN_RESULT)] = uno::makeAny(nIndex);
+ // set field data here...
+ }
+ }
+
+ return FLD_OK;
+ }
}
void SwWW8ImplReader::DeleteFormImpl()
@@ -2137,11 +2135,6 @@ bool SwWW8ImplReader::ImportFormulaControl(WW8FormulaControl &aFormula,
if((aPic.lcb > 0x3A) && !pDataStream->GetError() )
{
- pDataStream->Seek( nPicLocFc + aPic.cbHeader );
- int len=aPic.lcb-aPic.cbHeader;
- char *pBuf=(char*)malloc(len);
- pDataStream->Read( pBuf, len);
- pDataStream->Seek( nPicLocFc + aPic.cbHeader );
aFormula.FormulaRead(nWhich,pDataStream);
bRet = true;
}
diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx
index ee3bdaf38beb..255b17e04638 100644
--- a/sw/source/filter/ww8/ww8par5.cxx
+++ b/sw/source/filter/ww8/ww8par5.cxx
@@ -79,22 +79,26 @@
#include <fmtclds.hxx>
#include <pagedesc.hxx>
#include <SwStyleNameMapper.hxx>
-
+#include <IMark.hxx>
#include "ww8scan.hxx" // WW8FieldDesc
#include "ww8par.hxx"
#include "ww8par2.hxx"
#include "writerhelper.hxx"
#include "fields.hxx"
+#include <unotools/fltrcfg.hxx>
#include <algorithm> // #i24377#
+//#define WW_NATIVE_TOC 0
+
#define MAX_FIELDLEN 64000
#define WW8_TOX_LEVEL_DELIM ':'
using namespace ::com::sun::star;
using namespace sw::util;
+using namespace sw::mark;
using namespace std; // #i24377#
using namespace nsSwDocInfoSubType;
@@ -319,9 +323,11 @@ long SwWW8ImplReader::Read_Book(WW8PLCFManResult*)
//"_Toc*" and "_Hlt*" are unnecessary
const String* pName = pB->GetName();
+#if !defined(WW_NATIVE_TOC)
if( !pName || pName->EqualsIgnoreCaseAscii( "_Toc", 0, 4 )
|| pName->EqualsIgnoreCaseAscii( "_Hlt", 0, 4 ) )
return 0;
+#endif
//JP 16.11.98: ToUpper darf auf keinen Fall gemacht werden, weil der
//Bookmark- name ein Hyperlink-Ziel sein kann!
@@ -663,6 +669,9 @@ sal_uInt16 SwWW8ImplReader::End_Field()
if (!pF || !pF->EndPosIsFieldEnd())
return nRet;
+ const SvtFilterOptions* pOpt = SvtFilterOptions::Get();
+ sal_Bool bUseEnhFields=(pOpt && pOpt->IsUseEnhancedFields());
+
ASSERT(!maFieldStack.empty(), "Empty field stack\n");
if (!maFieldStack.empty())
{
@@ -674,9 +683,42 @@ sal_uInt16 SwWW8ImplReader::End_Field()
nRet = maFieldStack.back().mnFieldId;
switch (nRet)
{
+ case 70:
+ if (bUseEnhFields && pPaM!=NULL && pPaM->GetPoint()!=NULL) {
+ SwPosition aEndPos = *pPaM->GetPoint();
+ SwPaM aFldPam( maFieldStack.back().GetPtNode(), maFieldStack.back().GetPtCntnt(), aEndPos.nNode, aEndPos.nContent.GetIndex());
+ IDocumentMarkAccess* pMarksAccess = rDoc.getIDocumentMarkAccess( );
+ IFieldmark *pFieldmark = dynamic_cast<IFieldmark*>( pMarksAccess->makeFieldBookmark(
+ aFldPam, maFieldStack.back().GetBookmarkName(), ::rtl::OUString::createFromAscii(ODF_FORMTEXT ) ) );
+ ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
+ if (pFieldmark!=NULL) {
+ const IFieldmark::parameter_map_t& pParametersToAdd = maFieldStack.back().getParameters();
+ pFieldmark->GetParameters()->insert(pParametersToAdd.begin(), pParametersToAdd.end());
+ }
+ }
+ break;
+#if defined(WW_NATIVE_TOC)
+ case 8: // TOX_INDEX
+ case 13: // TOX_CONTENT
+ case 88: // HYPERLINK
+ case 37: // REF
+ if (pPaM!=NULL && pPaM->GetPoint()!=NULL) {
+
+ SwPosition aEndPos = *pPaM->GetPoint();
+ SwPaM aFldPam( maFieldStack.back().GetPtNode(), maFieldStack.back().GetPtCntnt(), aEndPos.nNode, aEndPos.nContent.GetIndex());
+ SwFieldBookmark *pFieldmark=(SwFieldBookmark*)rDoc.makeFieldBookmark(aFldPam, maFieldStack.back().GetBookmarkName(), maFieldStack.back().GetBookmarkType());
+ ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
+ if (pFieldmark!=NULL) {
+ const IFieldmark::parameter_map_t& pParametersToAdd = maFieldStack.back().getParameters();
+ pFieldmark->GetParameters()->insert(pParameters.begin(), pParameters.end());
+ }
+ }
+ break;
+#else
case 88:
pCtrlStck->SetAttr(*pPaM->GetPoint(),RES_TXTATR_INETFMT);
break;
+#endif
case 36:
case 68:
//Move outside the section associated with this type of field
@@ -694,6 +736,10 @@ bool AcceptableNestedField(sal_uInt16 nFieldCode)
{
switch (nFieldCode)
{
+#if defined(WW_NATIVE_TOC)
+ case 8: // allow recursive field in TOC...
+ case 13: // allow recursive field in TOC...
+#endif
case 36:
case 68:
case 79:
@@ -732,6 +778,32 @@ FieldEntry &FieldEntry::operator=(const FieldEntry &rOther) throw()
return *this;
}
+::rtl::OUString FieldEntry::GetBookmarkName()
+{
+ return msBookmarkName;
+}
+
+::rtl::OUString FieldEntry::GetBookmarkType()
+{
+ return msMarkType;
+}
+
+void FieldEntry::SetBookmarkName(::rtl::OUString bookmarkName)
+{
+ msBookmarkName=bookmarkName;
+}
+
+void FieldEntry::SetBookmarkType(::rtl::OUString bookmarkType)
+{
+ msMarkType=bookmarkType;
+}
+
+
+::sw::mark::IFieldmark::parameter_map_t& FieldEntry::getParameters() {
+ return maParams;
+}
+
+
// Read_Field liest ein Feld ein oder, wenn es nicht gelesen werden kann,
// wird 0 zurueckgegeben, so dass das Feld vom Aufrufer textuell gelesen wird.
// Returnwert: Gesamtlaenge des Feldes ( zum UEberlesen )
@@ -2061,6 +2133,17 @@ eF_ResT SwWW8ImplReader::Read_F_PgRef( WW8FieldDesc*, String& rStr )
String sName(GetMappedBookmark(sOrigName));
+#if defined(WW_NATIVE_TOC)
+ if (1) {
+ ::rtl::OUString aBookmarkName=::rtl::OUString::createFromAscii("_REF");
+ maFieldStack.back().SetBookmarkName(aBookmarkName);
+ maFieldStack.back().SetBookmarkType(::rtl::OUString::createFromAscii(ODF_PAGEREF));
+ maFieldStack.back().AddParam(rtl::OUString(), sName);
+ return FLD_TEXT;
+ }
+#endif
+
+
SwGetRefField aFld(
(SwGetRefFieldType*)rDoc.GetSysFldType( RES_GETREFFLD ), sName,
REF_BOOKMARK, 0, REF_PAGE );
@@ -2759,6 +2842,16 @@ USHORT lcl_GetMaxValidWordTOCLevel(const SwForm &rForm)
eF_ResT SwWW8ImplReader::Read_F_Tox( WW8FieldDesc* pF, String& rStr )
{
+#if defined(WW_NATIVE_TOC)
+ if (1) {
+ ::rtl::OUString aBookmarkName=::rtl::OUString::createFromAscii("_TOC");
+ maFieldStack.back().SetBookmarkName(aBookmarkName);
+ maFieldStack.back().SetBookmarkType(::rtl::OUString::createFromAscii(ODF_TOC));
+// maFieldStack.back().AddParam(::rtl::OUString::createFromAscii("Description"), aFormula.sToolTip);
+ return FLD_TEXT;
+ }
+#endif
+
if (pF->nLRes < 3)
return FLD_TEXT; // ignore (#i25440#)
@@ -3277,6 +3370,16 @@ eF_ResT SwWW8ImplReader::Read_F_Shape(WW8FieldDesc* /*pF*/, String& /*rStr*/)
eF_ResT SwWW8ImplReader::Read_F_Hyperlink( WW8FieldDesc* /*pF*/, String& rStr )
{
+#if defined(WW_NATIVE_TOC)
+ if (1) {
+ ::rtl::OUString aBookmarkName=::rtl::OUString::createFromAscii("_HYPERLINK");
+ maFieldStack.back().SetBookmarkName(aBookmarkName);
+ maFieldStack.back().SetBookmarkType(::rtl::OUString::createFromAscii(ODF_HYPERLINK));
+// maFieldStack.back().AddParam(::rtl::OUString::createFromAscii("Description"), aFormula.sToolTip);
+ return FLD_TEXT;
+ }
+#endif
+
String sURL, sTarget, sMark;
bool bDataImport = false;
//HYPERLINk "filename" [switches]
diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx
index 3801d72186e8..6fcc3701aae1 100644
--- a/sw/source/ui/docvw/edtwin.cxx
+++ b/sw/source/ui/docvw/edtwin.cxx
@@ -137,6 +137,7 @@
#include <IMark.hxx>
#include <doc.hxx>
+#include <xmloff/odffields.hxx>
#include "PostItMgr.hxx"
#include "postit.hxx"
@@ -146,6 +147,7 @@
//#define TEST_FOR_BUG91313
#endif
+using namespace sw::mark;
using namespace ::com::sun::star;
/*--------------------------------------------------------------------
@@ -2311,6 +2313,12 @@ KEYINPUT_CHECKTABLE_INSDEL:
ChgToEnEmDash | SetINetAttr |
Autocorrect ) &&
!rSh.HasReadonlySel() )
+ /* {
+ pACorr->IsAutoCorrFlag( CptlSttSntnc | CptlSttWrd |
+ ChgFractionSymbol | ChgOrdinalNumber |
+ ChgToEnEmDash | SetINetAttr |
+ Autocorrect ) &&
+ !rSh.HasReadonlySel() ) */
{
FlushInBuffer();
rSh.AutoCorrect( *pACorr, static_cast< sal_Unicode >('\0') );
@@ -3608,10 +3616,10 @@ void SwEditWin::MouseMove(const MouseEvent& _rMEvt)
pAnchorMarker->ChgHdl( pHdl );
if( aNew.X() || aNew.Y() )
{
- pAnchorMarker->SetPos( aNew );
- pAnchorMarker->SetLastPos( aDocPt );
- //OLMpSdrView->RefreshAllIAOManagers();
- }
+ pAnchorMarker->SetPos( aNew );
+ pAnchorMarker->SetLastPos( aDocPt );
+ //OLMpSdrView->RefreshAllIAOManagers();
+ }
}
else
{
@@ -4177,7 +4185,7 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
SwContentAtPos aCntntAtPos( SwContentAtPos::SW_CLICKFIELD |
SwContentAtPos::SW_INETATTR |
- SwContentAtPos::SW_SMARTTAG );
+ SwContentAtPos::SW_SMARTTAG | SwContentAtPos::SW_FORMCTRL);
if( rSh.GetContentAtPos( aDocPt, aCntntAtPos, TRUE ) )
{
@@ -4198,6 +4206,29 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
if ( bExecSmarttags && SwSmartTagMgr::Get().IsSmartTagsEnabled() )
rView.ExecSmartTagPopup( aDocPt );
}
+ else if ( SwContentAtPos::SW_FORMCTRL == aCntntAtPos.eCntntAtPos )
+ {
+ ASSERT( aCntntAtPos.aFnd.pFldmark != NULL, "where is my field ptr???");
+ if ( aCntntAtPos.aFnd.pFldmark != NULL)
+ {
+ IFieldmark *fieldBM = const_cast< IFieldmark* > ( aCntntAtPos.aFnd.pFldmark );
+ //SwDocShell* pDocSh = rView.GetDocShell();
+ //SwDoc *pDoc=pDocSh->GetDoc();
+ if (fieldBM->GetFieldname( ).equalsAscii( ODF_FORMCHECKBOX ) )
+ {
+ ICheckboxFieldmark* pCheckboxFm = dynamic_cast<ICheckboxFieldmark*>(fieldBM);
+ pCheckboxFm->SetChecked(!pCheckboxFm->IsChecked());
+ pCheckboxFm->Invalidate();
+ rSh.InvalidateWindows( rView.GetVisArea() );
+ } else if (fieldBM->GetFieldname().equalsAscii( ODF_FORMDROPDOWN) ) {
+ rView.ExecFieldPopup( aDocPt, fieldBM );
+ fieldBM->Invalidate();
+ rSh.InvalidateWindows( rView.GetVisArea() );
+ } else {
+ // unknown type..
+ }
+ }
+ }
else // if ( SwContentAtPos::SW_INETATTR == aCntntAtPos.eCntntAtPos )
{
if ( bExecHyperlinks )
diff --git a/sw/source/ui/inc/view.hxx b/sw/source/ui/inc/view.hxx
index f243202a01ac..7cff88c897cc 100644
--- a/sw/source/ui/inc/view.hxx
+++ b/sw/source/ui/inc/view.hxx
@@ -40,6 +40,7 @@
#include <swtypes.hxx>
#include <shellid.hxx>
#include <layout/layout.hxx>
+#include <IMark.hxx>
class SwBaseShell;
class Button;
@@ -92,6 +93,7 @@ struct SwConversionArgs;
class Graphic;
class GraphicFilter;
class SwPostItMgr;
+class SwFieldBookmark;
namespace com{ namespace sun { namespace star {
namespace view{ class XSelectionSupplier; }
@@ -463,7 +465,7 @@ public:
DECL_LINK( SpellError, LanguageType * );
BOOL ExecSpellPopup( const Point& rPt );
-
+ BOOL ExecFieldPopup( const Point& rPt, sw::mark::IFieldmark *fieldBM );
// SMARTTAGS
BOOL ExecSmartTagPopup( const Point& rPt );
diff --git a/sw/source/ui/inc/wrtsh.hxx b/sw/source/ui/inc/wrtsh.hxx
index 90180b86110b..2a65e1b36ff7 100644
--- a/sw/source/ui/inc/wrtsh.hxx
+++ b/sw/source/ui/inc/wrtsh.hxx
@@ -32,6 +32,7 @@
#include <fesh.hxx>
#include <sortopt.hxx>
#include <swurl.hxx>
+#include <IMark.hxx>
class Window;
class OutputDevice;
@@ -319,6 +320,9 @@ typedef BOOL (SwWrtShell:: *FNSimpleMove)();
void InsertTableOf(const SwTOXBase& rTOX, const SfxItemSet* pSet = 0);
BOOL UpdateTableOf(const SwTOXBase& rTOX, const SfxItemSet* pSet = 0);
+ // new fields
+ BOOL UpdateField( sw::mark::IFieldmark &fieldBM);
+
// Numerierung und Bullets
/**
Turns on numbering or bullets.
diff --git a/sw/source/ui/uiview/viewling.cxx b/sw/source/ui/uiview/viewling.cxx
index 65e6aa20f546..05191276e0d0 100644
--- a/sw/source/ui/uiview/viewling.cxx
+++ b/sw/source/ui/uiview/viewling.cxx
@@ -70,7 +70,7 @@
#include <edtwin.hxx>
#include <crsskip.hxx>
#include <ndtxt.hxx>
-
+#include <vcl/lstbox.hxx>
#include <cmdid.h>
#include <globals.hrc>
#include <comcore.hrc> // STR_MULT_INTERACT_SPELL_WARN
@@ -97,10 +97,13 @@
#include <svx/dialogs.hrc>
#include <svtools/langtab.hxx>
#include <unomid.h>
+#include <IMark.hxx>
+#include <xmloff/odffields.hxx>
#include <memory>
#include <editeng/editerr.hxx>
+using namespace sw::mark;
using ::rtl::OUString;
using namespace ::com::sun::star;
using namespace ::com::sun::star::beans;
@@ -916,3 +919,142 @@ sal_Bool SwView::ExecSmartTagPopup( const Point& rPt )
return bRet;
}
+
+
+class SwFieldPopup : public PopupMenu
+{
+public:
+ SwFieldPopup() {
+ InsertItem(1, ::rtl::OUString::createFromAscii("Hello"));
+ }
+};
+
+class SwFieldListBox : public ListBox
+{
+public:
+ SwFieldListBox(Window* pParent) : ListBox(pParent /*, WB_DROPDOWN*/) {
+ }
+
+ void *GetImplWin() {
+ return NULL; //FIXME!!!
+// return mpImplWin;
+ }
+
+protected:
+ virtual void LoseFocus() {
+// printf("ListBox: lose focus!!\n");
+ ListBox::LoseFocus();
+ }
+
+ virtual void Select() {
+// printf("SELECT!!! IsTravelSelect=%i\n", IsTravelSelect());
+ ListBox::Select();
+ }
+};
+
+class SwFieldDialog : public Dialog
+{
+private:
+ SwFieldListBox aListBox;
+ Edit aText;
+ int selection;
+
+ DECL_LINK( MyListBoxHandler, ListBox * );
+
+public:
+ SwFieldDialog(Window* parent, IFieldmark *fieldBM) : Dialog(parent, WB_BORDER | WB_SYSTEMWINDOW | WB_NOSHADOW ), aListBox(this), aText(this, WB_RIGHT | WB_READONLY), selection(-1) {
+
+ assert(fieldBM!=NULL);
+ if (fieldBM!=NULL) {
+ const IFieldmark::parameter_map_t* const pParameters = fieldBM->GetParameters();
+ IFieldmark::parameter_map_t::const_iterator pListEntries = pParameters->find(::rtl::OUString::createFromAscii(ODF_FORMDROPDOWN_LISTENTRY));
+ if(pListEntries != pParameters->end())
+ {
+ Sequence< ::rtl::OUString> vListEntries;
+ pListEntries->second >>= vListEntries;
+ for( ::rtl::OUString* pCurrent = vListEntries.getArray();
+ pCurrent != vListEntries.getArray() + vListEntries.getLength();
+ ++pCurrent)
+ {
+ aListBox.InsertEntry(*pCurrent);
+ }
+ }
+ }
+ Size lbSize=aListBox.GetOptimalSize(WINDOWSIZE_PREFERRED);
+ lbSize.Width()+=50;
+ lbSize.Height()+=20;
+ aListBox.SetSizePixel(lbSize);
+ aListBox.SetSelectHdl( LINK( this, SwFieldDialog, MyListBoxHandler ) );
+ aListBox.Show();
+ aText.SetText(rtl::OUString::createFromAscii("Cancel"));
+ Size tSize=aText.GetOptimalSize(WINDOWSIZE_PREFERRED);
+ aText.SetSizePixel(Size(lbSize.Width(), tSize.Height()));
+ aText.SetPosPixel(Point(0, lbSize.Height()));
+ aText.Show();
+ SetSizePixel(Size(lbSize.Width(), lbSize.Height()+tSize.Height()));
+// SetSizePixel(Size(200, 200));
+ }
+
+ int getSelection() {
+ return selection;
+ }
+protected:
+ /*
+ virtual void LoseFocus() {
+ printf("lose focus!!\n");
+ Dialog::LoseFocus();
+ printf("close:\n");
+ EndDialog(8);
+ }
+ */
+
+ virtual long PreNotify( NotifyEvent& rNEvt ) {
+ if (rNEvt.GetType() == EVENT_LOSEFOCUS && aListBox.GetImplWin()==rNEvt.GetWindow()) {
+ EndDialog(8);
+ return 1;
+ }
+ if (rNEvt.GetType() == EVENT_KEYINPUT) {
+// printf("PreNotify::KEYINPUT\n");
+ }
+ return Dialog::PreNotify(rNEvt);
+ }
+};
+
+IMPL_LINK( SwFieldDialog, MyListBoxHandler, ListBox *, pBox )
+{
+// printf("### DROP DOWN SELECT... IsTravelSelect=%i\n", pBox->IsTravelSelect());
+ if (pBox->IsTravelSelect()) {
+ return 0;
+ } else {
+ this->selection=pBox->GetSelectEntryPos();
+ EndDialog(9); //@TODO have meaningfull returns...
+ return 1;
+ }
+}
+
+
+BOOL SwView::ExecFieldPopup( const Point& rPt, IFieldmark *fieldBM )
+{
+ sal_Bool bRet = sal_False;
+ const sal_Bool bOldViewLock = pWrtShell->IsViewLocked();
+ pWrtShell->LockView( sal_True );
+ pWrtShell->Push();
+
+ bRet=sal_True;
+ const Point aPixPos = GetEditWin().LogicToPixel( rPt );
+
+ SwFieldDialog aFldDlg(pEditWin, fieldBM);
+ aFldDlg.SetPosPixel(pEditWin->OutputToScreenPixel(aPixPos));
+
+ /*short ret=*/aFldDlg.Execute();
+ sal_Int32 selection=aFldDlg.getSelection();
+ if (selection>=0) {
+ (*fieldBM->GetParameters())[::rtl::OUString::createFromAscii(ODF_FORMDROPDOWN_RESULT)] = makeAny(selection);
+ }
+
+ pWrtShell->Pop( sal_False );
+ pWrtShell->LockView( bOldViewLock );
+
+ return bRet;
+}
+
diff --git a/sw/source/ui/wrtsh/wrtsh1.cxx b/sw/source/ui/wrtsh/wrtsh1.cxx
index c3a8ae118f8a..389f6eac69e3 100644
--- a/sw/source/ui/wrtsh/wrtsh1.cxx
+++ b/sw/source/ui/wrtsh/wrtsh1.cxx
@@ -108,6 +108,8 @@
#include <paratr.hxx>
#include <ndtxt.hxx>
#include <editeng/acorrcfg.hxx>
+//#include <svx/acorrcfg.hxx>
+#include <IMark.hxx>
// -> #111827#
#include <SwRewriter.hxx>
@@ -122,6 +124,7 @@
#include "PostItMgr.hxx"
+using namespace sw::mark;
using namespace com::sun::star;
#define COMMON_INI_LIST \
@@ -1750,6 +1753,12 @@ SwWrtShell::SwWrtShell( SwWrtShell& rSh, Window *_pWin, SwView &rShell )
SetSfxViewShell( (SfxViewShell *)&rShell );
SetFlyMacroLnk( LINK(this, SwWrtShell, ExecFlyMac) );
+
+ // place the cursor on the first field...
+ IFieldmark *pBM = NULL;
+ if ( IsFormProtected() && ( pBM = GetFieldmarkAfter( ) ) !=NULL ) {
+ GotoFieldmark(pBM);
+ }
}
diff --git a/sw/source/ui/wrtsh/wrtsh2.cxx b/sw/source/ui/wrtsh/wrtsh2.cxx
index a2477349ee44..4d0172a5461b 100644
--- a/sw/source/ui/wrtsh/wrtsh2.cxx
+++ b/sw/source/ui/wrtsh/wrtsh2.cxx
@@ -239,6 +239,13 @@ BOOL SwWrtShell::UpdateTableOf(const SwTOXBase& rTOX, const SfxItemSet* pSet)
return bResult;
}
+BOOL SwWrtShell::UpdateField( sw::mark::IFieldmark &fieldBM )
+{
+ return SwEditShell::UpdateField(fieldBM);
+}
+
+
+
// ein Klick aus das angegebene Feld. Der Cursor steht auf diesem.
// Fuehre die vor definierten Aktionen aus.