update ooo310-m15
[ooovba.git] / applied_patches / 0838-field-patch-fix-docx.diff
blob9bdc578e6108fa6a84623c2777e1f57ec88f1cf9
1 diff --git sw/source/filter/docx/docx-wrtww8.cxx sw/source/filter/docx/docx-wrtww8.cxx
2 index 5dce10d..92a9e0d 100644
3 --- sw/source/filter/docx/docx-wrtww8.cxx
4 +++ sw/source/filter/docx/docx-wrtww8.cxx
5 @@ -3190,96 +3190,9 @@ void WW8SHDLong::Write( WW8Export& rExport )
7 void WW8Export::WriteFormData( SwFieldBookmark &rFieldmark )
9 - ASSERT(bWrtWW8, "No 95 export yet");
10 - if ( !bWrtWW8 )
11 - return;
13 - int type = rFieldmark.GetFieldType();
14 - const String ffname = rFieldmark.GetFFName();
16 - ULONG nDataStt = pDataStrm->Tell();
17 - pChpPlc->AppendFkpEntry( Strm().Tell() );
19 - WriteChar( 0x01 );
20 - static BYTE aArr1[] = {
21 - 0x03, 0x6a, 0,0,0,0, // sprmCPicLocation
23 - 0x06, 0x08, 0x01, // sprmCFData
24 - 0x55, 0x08, 0x01, // sprmCFSpec
25 - 0x02, 0x08, 0x01 // sprmCFFldVanish
26 - };
27 - BYTE* pDataAdr = aArr1 + 2;
28 - Set_UInt32( pDataAdr, nDataStt );
30 - pChpPlc->AppendFkpEntry(Strm().Tell(),
31 - sizeof( aArr1 ), aArr1 );
33 - sal_uInt8 aFldHeader[] =
34 - {
35 - 0xFF, 0xFF, 0xFF, 0xFF, // Unicode Marker...
36 - 0, 0, 0, 0//, 0, 0, 0, 0
37 - };
39 - aFldHeader[4] |= (type & 0x03);
40 - int ffres = rFieldmark.GetFFRes();
41 - aFldHeader[4] |= ((ffres<<2) & 0x7C);
43 - const String ffdeftext;
44 - const String ffformat;
45 - const String ffhelptext;
46 - const String ffstattext;
47 - const String ffentrymcr;
48 - const String ffexitmcr;
50 - const sal_uInt8 aFldData[] =
51 - {
52 - 0,0,0,0, // len of struct
53 - 0x44,0, // the start of "next" data
54 - 0,0,0,0,0,0,0,0,0,0, // PIC-Structure! /10
55 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // | /16
56 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // | /16
57 - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // | /16
58 - 0,0,0,0, // / /4
59 - };
60 - int slen = sizeof( aFldData )
61 - +sizeof( aFldHeader )
62 - +2*ffname.Len() + 4
63 - +2*ffdeftext.Len() + 4
64 - +2*ffformat.Len() + 4
65 - +2*ffhelptext.Len() + 4
66 - +2*ffstattext.Len() + 4
67 - +2*ffentrymcr.Len() + 4
68 - +2*ffexitmcr.Len() + 4;
69 -#ifdef OSL_BIGENDIAN
70 - slen = SWAPLONG(slen);
71 -#endif // OSL_BIGENDIAN
72 - *((sal_uInt32 *)aFldData) = slen;
73 - int len = sizeof( aFldData );
74 - assert( len == 0x44 );
75 - pDataStrm->Write( aFldData, len );
77 - len = sizeof( aFldHeader );
78 - assert( len == 8 );
79 - pDataStrm->Write( aFldHeader, len );
81 - SwWW8Writer::WriteString_xstz( *pDataStrm, ffname, true ); // Form field name
83 - if (type==0)
84 - SwWW8Writer::WriteString_xstz( *pDataStrm, ffdeftext, true );
85 - else
86 - pDataStrm->WriteNumber((sal_uInt16)0);
88 - SwWW8Writer::WriteString_xstz( *pDataStrm, ffformat, true );
89 - SwWW8Writer::WriteString_xstz( *pDataStrm, ffhelptext, true );
90 - SwWW8Writer::WriteString_xstz( *pDataStrm, ffstattext, true );
91 - SwWW8Writer::WriteString_xstz( *pDataStrm, ffentrymcr, true );
92 - SwWW8Writer::WriteString_xstz( *pDataStrm, ffexitmcr, true );
93 - if ( type==2 )
94 - {
95 - // 0xFF, 0xFF
96 - // sal_uInt32 number of strings
97 - // (sal_uInt16 len; sal_uInt16 unicode char[len])*num of strings
98 - }
99 + printf("FIXME!!!!!!!!\n");
100 + //@TODO fixme!!
101 + return;
104 /* vi:set tabstop=4 shiftwidth=4 expandtab: */
105 diff --git sw/source/filter/docx/docx-ww8par.cxx sw/source/filter/docx/docx-ww8par.cxx
106 index 2ae6e58..b56ed71 100644
107 --- sw/source/filter/docx/docx-ww8par.cxx
108 +++ sw/source/filter/docx/docx-ww8par.cxx
109 @@ -2590,21 +2590,7 @@ bool SwWW8ImplReader::ReadChar(long nPosCp, long nCpOfs)
110 case 0x15:
111 if( !bSpec ) // Juristenparagraph
112 cInsert = '\xa7';
113 - 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....]
114 - if (!maNewFieldCtxStack.empty() && pPaM!=NULL && pPaM->GetPoint()!=NULL) {
115 - WW8NewFieldCtx *pFieldCtx=maNewFieldCtxStack.back();
116 - maNewFieldCtxStack.pop_back();
117 - SwPosition aEndPos = *pPaM->GetPoint();
118 - SwPaM aFldPam( pFieldCtx->GetPtNode(), pFieldCtx->GetPtCntnt(), aEndPos.nNode, aEndPos.nContent.GetIndex());
119 - SwFieldBookmark *pFieldmark=(SwFieldBookmark*)rDoc.makeBookmark(aFldPam, KeyCode(), pFieldCtx->GetBookmarkName(), String(), IDocumentBookmarkAccess::FORM_FIELDMARK_TEXT);
120 - ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
121 - if (pFieldmark!=NULL) {
122 - pFieldmark->SetFieldType(0); // 0==Text
123 - // set field data here...
124 - pFieldCtx->SetCurrentFieldParamsTo(*pFieldmark);
126 - delete pFieldCtx;
128 + else {
130 break;
131 case 0x9:
132 diff --git sw/source/filter/docx/docx-ww8par3.cxx sw/source/filter/docx/docx-ww8par3.cxx
133 index eebd76c..acc52b9 100644
134 --- sw/source/filter/docx/docx-ww8par3.cxx
135 +++ sw/source/filter/docx/docx-ww8par3.cxx
136 @@ -103,49 +103,6 @@ using namespace com::sun::star;
137 using namespace sw::util;
138 using namespace sw::types;
140 -WW8NewFieldCtx::WW8NewFieldCtx(SwPosition &aStartPos, ::rtl::OUString _sBookmarkName, ::rtl::OUString _sBookmarkType)
141 -: maPtNode(aStartPos.nNode), mnPtCntnt(aStartPos.nContent.GetIndex()),
142 - sBookmarkName(_sBookmarkName),
143 - sBookmarkType(_sBookmarkType), mpPaM(NULL)
148 -WW8NewFieldCtx::~WW8NewFieldCtx()
150 - if (mpPaM) delete mpPaM;
153 -::rtl::OUString WW8NewFieldCtx::GetBookmarkName()
155 - return sBookmarkName;
158 -::rtl::OUString WW8NewFieldCtx::GetBookmarkType()
160 - return sBookmarkType;
163 -void WW8NewFieldCtx::AddParam(::rtl::OUString name, ::rtl::OUString value)
165 - maParams.push_back( Param_t(name, value) );
168 -void WW8NewFieldCtx::SetCurrentFieldParamsTo(SwFieldBookmark &rFieldBookmark)
170 - for(Params_t::iterator i=maParams.begin();i!=maParams.end();i++) {
171 - ::rtl::OUString aName=i->first;
172 - ::rtl::OUString aValue=i->second;
173 - if (aName.compareToAscii("Description")==0) {
174 - rFieldBookmark.SetFFHelpText(aValue);
175 - } else if (aName.compareToAscii("Name")==0) {
176 - rFieldBookmark.SetFFName(aValue);
177 - } else if (aName.compareToAscii("Result")==0) {
178 - rFieldBookmark.SetFFRes( aValue.toInt32() );
183 //-----------------------------------------
184 // UNO-Controls
185 //-----------------------------------------
186 @@ -159,157 +116,30 @@ eF_ResT SwWW8ImplReader::Read_F_OCX( WW8FieldDesc*, String& )
187 return FLD_TEXT;
191 eF_ResT SwWW8ImplReader::Read_F_FormTextBox( WW8FieldDesc* pF, String& rStr )
193 - WW8FormulaEditBox aFormula(*this);
195 - if (0x01 == rStr.GetChar(writer_cast<xub_StrLen>(pF->nLCode-1))) {
196 - ImportFormulaControl(aFormula,pF->nSCode+pF->nLCode-1, WW8_CT_EDIT);
199 - /* #80205#
200 - Here we have a small complication. This formula control contains
201 - the default text that is displayed if you edit the form field in
202 - the "default text" area. But MSOffice does not display that
203 - information, instead it display the result of the field,
204 - MSOffice just uses the default text of the control as its
205 - initial value for the displayed default text. So we will swap in
206 - the field result into the formula here in place of the default
207 - text.
208 - */
210 - const SvtFilterOptions* pOpt = SvtFilterOptions::Get();
211 - sal_Bool bUseEnhFields=(pOpt && pOpt->IsUseEnhancedFields());
213 - if (!bUseEnhFields) {
214 - aFormula.sDefault = GetFieldResult(pF);
216 -#if 0 // why not? (flr)
217 - //substituting Unicode spacing 0x2002 with double space for layout
218 - aFormula.sDefault.SearchAndReplaceAll(
219 - String(static_cast< sal_Unicode >(0x2002)),
220 - CREATE_CONST_ASC(" "));
221 -#endif
223 - SwInputField aFld((SwInputFieldType*)rDoc.GetSysFldType( RES_INPUTFLD ),
224 - aFormula.sDefault , aFormula.sTitle , INP_TXT, 0 );
225 - aFld.SetHelp(aFormula.sHelp);
226 - aFld.SetToolTip(aFormula.sToolTip);
228 - rDoc.Insert(*pPaM, SwFmtFld(aFld), 0);
229 - return FLD_OK;
230 - } else {
231 - WW8PLCFx_Book* pB = pPlcxMan->GetBook();
232 - String aBookmarkName;
233 - if (pB!=NULL) {
234 - WW8_CP currentCP=pF->nSCode;
235 - WW8_CP currentLen=pF->nLen;
237 - USHORT bkmFindIdx;
238 - String aBookmarkFind=pB->GetBookmark(currentCP-1, currentCP+currentLen-1, bkmFindIdx);
240 - if (aBookmarkFind.Len()>0) {
241 - pB->SetStatus(bkmFindIdx, BOOK_FIELD); // mark bookmark as consumed, such that tl'll not get inserted as a "normal" bookmark again
242 - if (aBookmarkFind.Len()>0) {
243 - aBookmarkName=aBookmarkFind;
248 - if (pB!=NULL && aBookmarkName.Len()==0) {
249 - aBookmarkName=pB->GetUniqueBookmarkName(aFormula.sTitle);
253 - if (aBookmarkName.Len()>0) {
254 - WW8NewFieldCtx *pFieldCtx=new WW8NewFieldCtx(*pPaM->GetPoint(), aBookmarkName, ::rtl::OUString::createFromAscii("ecma.office-open-xml.field.FORMTEXT"));
255 - maNewFieldCtxStack.push_back(pFieldCtx);
256 - pFieldCtx->AddParam(::rtl::OUString::createFromAscii("Description"), aFormula.sToolTip);
257 - pFieldCtx->AddParam(::rtl::OUString::createFromAscii("Name"), aFormula.sTitle);
259 - return FLD_TEXT;
261 + //@TODO fixme!
262 + printf("FIXME!!!!!!!!\n");
263 + return FLD_TEXT;
266 eF_ResT SwWW8ImplReader::Read_F_FormCheckBox( WW8FieldDesc* pF, String& rStr )
268 - WW8FormulaCheckBox aFormula(*this);
270 - if (!pFormImpl)
271 - pFormImpl = new SwMSConvertControls(mpDocShell, pPaM);
273 - if (0x01 == rStr.GetChar(writer_cast<xub_StrLen>(pF->nLCode-1)))
274 - ImportFormulaControl(aFormula,pF->nSCode+pF->nLCode-1, WW8_CT_CHECKBOX);
275 - const SvtFilterOptions* pOpt = SvtFilterOptions::Get();
276 - sal_Bool bUseEnhFields=(pOpt && pOpt->IsUseEnhancedFields());
278 - if (!bUseEnhFields) {
279 - pFormImpl->InsertFormula(aFormula);
280 - return FLD_OK;
281 - } else {
282 - String aBookmarkName;
283 - WW8PLCFx_Book* pB = pPlcxMan->GetBook();
284 - if (pB!=NULL) {
285 - WW8_CP currentCP=pF->nSCode;
286 - WW8_CP currentLen=pF->nLen;
288 - USHORT bkmFindIdx;
289 - String aBookmarkFind=pB->GetBookmark(currentCP-1, currentCP+currentLen-1, bkmFindIdx);
291 - if (aBookmarkFind.Len()>0) {
292 - pB->SetStatus(bkmFindIdx, BOOK_FIELD); // mark as consumed by field
293 - if (aBookmarkFind.Len()>0) {
294 - aBookmarkName=aBookmarkFind;
299 - if (pB!=NULL && aBookmarkName.Len()==0) {
300 - aBookmarkName=pB->GetUniqueBookmarkName(aFormula.sTitle);
303 - if (aBookmarkName.Len()>0) {
304 - SwFieldBookmark *pFieldmark=(SwFieldBookmark*)rDoc.makeBookmark(*pPaM, KeyCode(), aBookmarkName, String(), IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT);
305 - ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
306 - if (pFieldmark!=NULL) {
307 - pFieldmark->SetFieldType(1); // 0==Checkbox
308 - pFieldmark->SetFFName(aFormula.sTitle);
309 - pFieldmark->SetFFHelpText(aFormula.sToolTip);
310 - pFieldmark->SetChecked(aFormula.nChecked!=0);
311 - // set field data here...
314 - return FLD_OK;
316 + //@TODO fixme!
317 + printf("FIXME!!!!!!!!\n");
318 + return FLD_TEXT;
321 eF_ResT SwWW8ImplReader::Read_F_FormListBox( WW8FieldDesc* pF, String& rStr)
323 - WW8FormulaListBox aFormula(*this);
324 + //@TODO fixme!
325 + printf("FIXME!!!!!!!!\n");
327 - if (0x01 == rStr.GetChar(writer_cast<xub_StrLen>(pF->nLCode-1)))
328 - ImportFormulaControl(aFormula,pF->nSCode+pF->nLCode-1, WW8_CT_DROPDOWN);
330 - SwDropDownField aFld(
331 - (SwDropDownFieldType*)rDoc.GetSysFldType(RES_DROPDOWN));
333 - aFld.SetName(aFormula.sTitle);
334 - aFld.SetHelp(aFormula.sHelp);
335 - aFld.SetToolTip(aFormula.sToolTip);
337 - if (!aFormula.maListEntries.empty())
339 - aFld.SetItems(aFormula.maListEntries);
340 - int nIndex = aFormula.fDropdownIndex < aFormula.maListEntries.size()
341 - ? aFormula.fDropdownIndex : 0;
342 - aFld.SetSelectedItem(aFormula.maListEntries[nIndex]);
345 - rDoc.Insert(*pPaM, SwFmtFld(aFld), 0);
347 - return FLD_OK;
348 + return FLD_TEXT;
352 void SwWW8ImplReader::DeleteFormImpl()
354 delete pFormImpl, pFormImpl = 0;