xref: /aoo4110/main/sw/source/core/edit/edattr.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <hintids.hxx>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <editeng/tstpitem.hxx>
31*b1cdbd2cSJim Jagielski #include <editeng/lrspitem.hxx>
32*b1cdbd2cSJim Jagielski #include <editeng/scripttypeitem.hxx>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/ScriptType.hdl>
34*b1cdbd2cSJim Jagielski #include <txatbase.hxx>
35*b1cdbd2cSJim Jagielski #include <txtftn.hxx>
36*b1cdbd2cSJim Jagielski #include <fmtftn.hxx>
37*b1cdbd2cSJim Jagielski #include <editsh.hxx>
38*b1cdbd2cSJim Jagielski #include <edimp.hxx>	// fuer MACROS
39*b1cdbd2cSJim Jagielski #include <doc.hxx>
40*b1cdbd2cSJim Jagielski #include <swundo.hxx>	// fuer UNDO-Ids
41*b1cdbd2cSJim Jagielski #include <ndtxt.hxx>
42*b1cdbd2cSJim Jagielski #include <ftnidx.hxx>
43*b1cdbd2cSJim Jagielski #include <expfld.hxx>
44*b1cdbd2cSJim Jagielski #include <rootfrm.hxx>
45*b1cdbd2cSJim Jagielski #include <cntfrm.hxx>
46*b1cdbd2cSJim Jagielski #include <breakit.hxx>
47*b1cdbd2cSJim Jagielski #include <txtfld.hxx>
48*b1cdbd2cSJim Jagielski #include <fmtfld.hxx>
49*b1cdbd2cSJim Jagielski #include <crsskip.hxx>
50*b1cdbd2cSJim Jagielski #include <txtfrm.hxx>		// SwTxtFrm
51*b1cdbd2cSJim Jagielski #include <scriptinfo.hxx>
52*b1cdbd2cSJim Jagielski #include <svl/ctloptions.hxx>
53*b1cdbd2cSJim Jagielski #include <charfmt.hxx>  // #i27615#
54*b1cdbd2cSJim Jagielski #include <numrule.hxx>
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski /*************************************
58*b1cdbd2cSJim Jagielski  * harte Formatierung (Attribute)
59*b1cdbd2cSJim Jagielski  *************************************/
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski // wenn Selektion groesser Max Nodes oder mehr als Max Selektionen
62*b1cdbd2cSJim Jagielski // => keine Attribute
getMaxLookup()63*b1cdbd2cSJim Jagielski const sal_uInt16& getMaxLookup()
64*b1cdbd2cSJim Jagielski {
65*b1cdbd2cSJim Jagielski 	static const sal_uInt16 nMaxLookup = 1000;
66*b1cdbd2cSJim Jagielski 	return nMaxLookup;
67*b1cdbd2cSJim Jagielski }
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski // --> OD 2008-01-16 #newlistlevelattrs#
GetCurAttr(SfxItemSet & rSet,const bool bMergeIndentValuesOfNumRule) const70*b1cdbd2cSJim Jagielski sal_Bool SwEditShell::GetCurAttr( SfxItemSet& rSet,
71*b1cdbd2cSJim Jagielski                               const bool bMergeIndentValuesOfNumRule ) const
72*b1cdbd2cSJim Jagielski // <--
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski 	if( GetCrsrCnt() > getMaxLookup() )
75*b1cdbd2cSJim Jagielski 	{
76*b1cdbd2cSJim Jagielski 		rSet.InvalidateAllItems();
77*b1cdbd2cSJim Jagielski 		return sal_False;
78*b1cdbd2cSJim Jagielski 	}
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski 	SfxItemSet aSet( *rSet.GetPool(), rSet.GetRanges() );
81*b1cdbd2cSJim Jagielski 	SfxItemSet *pSet = &rSet;
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski 	FOREACHPAM_START(this)
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski         // #i27615# if the cursor is in front of the numbering label
86*b1cdbd2cSJim Jagielski         // the attributes to get are those from the numbering format.
87*b1cdbd2cSJim Jagielski         if (PCURCRSR->IsInFrontOfLabel())
88*b1cdbd2cSJim Jagielski         {
89*b1cdbd2cSJim Jagielski             SwTxtNode * pTxtNd =
90*b1cdbd2cSJim Jagielski                 PCURCRSR->GetPoint()->nNode.GetNode().GetTxtNode();
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski             if (pTxtNd)
93*b1cdbd2cSJim Jagielski             {
94*b1cdbd2cSJim Jagielski                 SwNumRule * pNumRule = pTxtNd->GetNumRule();
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski                 if (pNumRule)
97*b1cdbd2cSJim Jagielski                 {
98*b1cdbd2cSJim Jagielski                     const String & aCharFmtName =
99*b1cdbd2cSJim Jagielski                         pNumRule->Get(static_cast<sal_uInt16>(pTxtNd->GetActualListLevel())).GetCharFmtName();
100*b1cdbd2cSJim Jagielski                     SwCharFmt * pCharFmt =
101*b1cdbd2cSJim Jagielski                         GetDoc()->FindCharFmtByName(aCharFmtName);
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski                     if (pCharFmt)
104*b1cdbd2cSJim Jagielski                         rSet.Put(pCharFmt->GetAttrSet());
105*b1cdbd2cSJim Jagielski                 }
106*b1cdbd2cSJim Jagielski             }
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski             continue;
109*b1cdbd2cSJim Jagielski         }
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 		sal_uLong nSttNd = PCURCRSR->GetMark()->nNode.GetIndex(),
112*b1cdbd2cSJim Jagielski 			  nEndNd = PCURCRSR->GetPoint()->nNode.GetIndex();
113*b1cdbd2cSJim Jagielski 		xub_StrLen nSttCnt = PCURCRSR->GetMark()->nContent.GetIndex(),
114*b1cdbd2cSJim Jagielski 				   nEndCnt = PCURCRSR->GetPoint()->nContent.GetIndex();
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 		if( nSttNd > nEndNd || ( nSttNd == nEndNd && nSttCnt > nEndCnt ))
117*b1cdbd2cSJim Jagielski 		{
118*b1cdbd2cSJim Jagielski 			sal_uLong nTmp = nSttNd; nSttNd = nEndNd; nEndNd = nTmp;
119*b1cdbd2cSJim Jagielski 			nTmp = nSttCnt; nSttCnt = nEndCnt; nEndCnt = (xub_StrLen)nTmp;
120*b1cdbd2cSJim Jagielski 		}
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski 		if( nEndNd - nSttNd >= getMaxLookup() )
123*b1cdbd2cSJim Jagielski 		{
124*b1cdbd2cSJim Jagielski 			rSet.ClearItem();
125*b1cdbd2cSJim Jagielski 			rSet.InvalidateAllItems();
126*b1cdbd2cSJim Jagielski 			return sal_False;
127*b1cdbd2cSJim Jagielski 		}
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski 		// beim 1.Node traegt der Node die Werte in den GetSet ein (Initial)
130*b1cdbd2cSJim Jagielski 		// alle weiteren Nodes werden zum GetSet zu gemergt
131*b1cdbd2cSJim Jagielski 		for( sal_uLong n = nSttNd; n <= nEndNd; ++n )
132*b1cdbd2cSJim Jagielski 		{
133*b1cdbd2cSJim Jagielski 			SwNode* pNd = GetDoc()->GetNodes()[ n ];
134*b1cdbd2cSJim Jagielski 			switch( pNd->GetNodeType() )
135*b1cdbd2cSJim Jagielski 			{
136*b1cdbd2cSJim Jagielski 			case ND_TEXTNODE:
137*b1cdbd2cSJim Jagielski 				{
138*b1cdbd2cSJim Jagielski 					xub_StrLen nStt = n == nSttNd ? nSttCnt : 0,
139*b1cdbd2cSJim Jagielski 						   	   nEnd = n == nEndNd ? nEndCnt
140*b1cdbd2cSJim Jagielski 										: ((SwTxtNode*)pNd)->GetTxt().Len();
141*b1cdbd2cSJim Jagielski                     // --> OD 2008-01-16 #newlistlevelattrs#
142*b1cdbd2cSJim Jagielski                     ((SwTxtNode*)pNd)->GetAttr( *pSet, nStt, nEnd,
143*b1cdbd2cSJim Jagielski                                                 sal_False, sal_True,
144*b1cdbd2cSJim Jagielski                                                 bMergeIndentValuesOfNumRule );
145*b1cdbd2cSJim Jagielski                     // <--
146*b1cdbd2cSJim Jagielski 				}
147*b1cdbd2cSJim Jagielski 				break;
148*b1cdbd2cSJim Jagielski 			case ND_GRFNODE:
149*b1cdbd2cSJim Jagielski 			case ND_OLENODE:
150*b1cdbd2cSJim Jagielski 				((SwCntntNode*)pNd)->GetAttr( *pSet );
151*b1cdbd2cSJim Jagielski 				break;
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski 			default:
154*b1cdbd2cSJim Jagielski 				pNd = 0;
155*b1cdbd2cSJim Jagielski 			}
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 			if( pNd )
158*b1cdbd2cSJim Jagielski 			{
159*b1cdbd2cSJim Jagielski 				if( pSet != &rSet )
160*b1cdbd2cSJim Jagielski 					rSet.MergeValues( aSet );
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski 				if( aSet.Count() )
163*b1cdbd2cSJim Jagielski 					aSet.ClearItem();
164*b1cdbd2cSJim Jagielski 			}
165*b1cdbd2cSJim Jagielski 			pSet = &aSet;
166*b1cdbd2cSJim Jagielski 		}
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski 	FOREACHPAM_END()
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 	return sal_True;
171*b1cdbd2cSJim Jagielski }
172*b1cdbd2cSJim Jagielski 
GetCurTxtFmtColl() const173*b1cdbd2cSJim Jagielski SwTxtFmtColl* SwEditShell::GetCurTxtFmtColl() const
174*b1cdbd2cSJim Jagielski {
175*b1cdbd2cSJim Jagielski 	SwTxtFmtColl *pFmt = 0;
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski 	if ( GetCrsrCnt() > getMaxLookup() )
178*b1cdbd2cSJim Jagielski 		return 0;
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski 	FOREACHPAM_START(this)
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 		sal_uLong nSttNd = PCURCRSR->GetMark()->nNode.GetIndex(),
183*b1cdbd2cSJim Jagielski 			  nEndNd = PCURCRSR->GetPoint()->nNode.GetIndex();
184*b1cdbd2cSJim Jagielski 		xub_StrLen nSttCnt = PCURCRSR->GetMark()->nContent.GetIndex(),
185*b1cdbd2cSJim Jagielski 				   nEndCnt = PCURCRSR->GetPoint()->nContent.GetIndex();
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 		if( nSttNd > nEndNd || ( nSttNd == nEndNd && nSttCnt > nEndCnt ))
188*b1cdbd2cSJim Jagielski 		{
189*b1cdbd2cSJim Jagielski 			sal_uLong nTmp = nSttNd; nSttNd = nEndNd; nEndNd = nTmp;
190*b1cdbd2cSJim Jagielski 			nTmp = nSttCnt; nSttCnt = nEndCnt; nEndCnt = (xub_StrLen)nTmp;
191*b1cdbd2cSJim Jagielski 		}
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski 		if( nEndNd - nSttNd >= getMaxLookup() )
194*b1cdbd2cSJim Jagielski 		{
195*b1cdbd2cSJim Jagielski 			pFmt = 0;
196*b1cdbd2cSJim Jagielski 			break;
197*b1cdbd2cSJim Jagielski 		}
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski 		for( sal_uLong n = nSttNd; n <= nEndNd; ++n )
200*b1cdbd2cSJim Jagielski 		{
201*b1cdbd2cSJim Jagielski 			SwNode* pNd = GetDoc()->GetNodes()[ n ];
202*b1cdbd2cSJim Jagielski 			if( pNd->IsTxtNode() )
203*b1cdbd2cSJim Jagielski 			{
204*b1cdbd2cSJim Jagielski 				if( !pFmt )
205*b1cdbd2cSJim Jagielski 					pFmt = ((SwTxtNode*)pNd)->GetTxtColl();
206*b1cdbd2cSJim Jagielski 				else if( pFmt == ((SwTxtNode*)pNd)->GetTxtColl() ) // ???
207*b1cdbd2cSJim Jagielski 					break;
208*b1cdbd2cSJim Jagielski 			}
209*b1cdbd2cSJim Jagielski 		}
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 	FOREACHPAM_END()
212*b1cdbd2cSJim Jagielski 	return pFmt;
213*b1cdbd2cSJim Jagielski }
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski 
GetCurFtn(SwFmtFtn * pFillFtn)217*b1cdbd2cSJim Jagielski sal_Bool SwEditShell::GetCurFtn( SwFmtFtn* pFillFtn )
218*b1cdbd2cSJim Jagielski {
219*b1cdbd2cSJim Jagielski 	// der Cursor muss auf dem akt. Fussnoten-Anker stehen:
220*b1cdbd2cSJim Jagielski 	SwPaM* pCrsr = GetCrsr();
221*b1cdbd2cSJim Jagielski 	SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
222*b1cdbd2cSJim Jagielski 	if( !pTxtNd )
223*b1cdbd2cSJim Jagielski 		return sal_False;
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski     SwTxtAttr *const pFtn = pTxtNd->GetTxtAttrForCharAt(
226*b1cdbd2cSJim Jagielski         pCrsr->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN);
227*b1cdbd2cSJim Jagielski 	if( pFtn && pFillFtn )
228*b1cdbd2cSJim Jagielski 	{
229*b1cdbd2cSJim Jagielski 		// Daten vom Attribut uebertragen
230*b1cdbd2cSJim Jagielski 		const SwFmtFtn &rFtn = ((SwTxtFtn*)pFtn)->GetFtn();
231*b1cdbd2cSJim Jagielski 		pFillFtn->SetNumber( rFtn );
232*b1cdbd2cSJim Jagielski 		pFillFtn->SetEndNote( rFtn.IsEndNote() );
233*b1cdbd2cSJim Jagielski 	}
234*b1cdbd2cSJim Jagielski 	return 0 != pFtn;
235*b1cdbd2cSJim Jagielski }
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski 
SetCurFtn(const SwFmtFtn & rFillFtn)238*b1cdbd2cSJim Jagielski bool SwEditShell::SetCurFtn( const SwFmtFtn& rFillFtn )
239*b1cdbd2cSJim Jagielski {
240*b1cdbd2cSJim Jagielski     bool bChgd = false;
241*b1cdbd2cSJim Jagielski     StartAllAction();
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski     SwPaM* pCrsr = GetCrsr(), *pFirst = pCrsr;
244*b1cdbd2cSJim Jagielski     do {
245*b1cdbd2cSJim Jagielski         bChgd |=
246*b1cdbd2cSJim Jagielski             pDoc->SetCurFtn( *pCrsr, rFillFtn.GetNumStr(), rFillFtn.GetNumber(), rFillFtn.IsEndNote() );
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski     } while( pFirst != ( pCrsr = (SwPaM*)pCrsr->GetNext() ));
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski     EndAllAction();
251*b1cdbd2cSJim Jagielski     return bChgd;
252*b1cdbd2cSJim Jagielski }
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski /*sal_uInt16 SwEditShell::GetFtnCnt( sal_Bool bEndNotes = sal_False ) const
257*b1cdbd2cSJim Jagielski {
258*b1cdbd2cSJim Jagielski 	const SwFtnIdxs &rIdxs = pDoc->GetFtnIdxs();
259*b1cdbd2cSJim Jagielski 	sal_uInt16 nCnt = 0;
260*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < rIdxs.Count(); ++i )
261*b1cdbd2cSJim Jagielski 	{
262*b1cdbd2cSJim Jagielski 		const SwFmtFtn &rFtn = rIdxs[i]->GetFtn();
263*b1cdbd2cSJim Jagielski 		if ( bEndNotes == rFtn.IsEndNote() )
264*b1cdbd2cSJim Jagielski 			nCnt++;
265*b1cdbd2cSJim Jagielski 	}
266*b1cdbd2cSJim Jagielski 	return nCnt;
267*b1cdbd2cSJim Jagielski } */
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski 
HasFtns(bool bEndNotes) const270*b1cdbd2cSJim Jagielski bool SwEditShell::HasFtns( bool bEndNotes ) const
271*b1cdbd2cSJim Jagielski {
272*b1cdbd2cSJim Jagielski 	const SwFtnIdxs &rIdxs = pDoc->GetFtnIdxs();
273*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < rIdxs.Count(); ++i )
274*b1cdbd2cSJim Jagielski 	{
275*b1cdbd2cSJim Jagielski 		const SwFmtFtn &rFtn = rIdxs[i]->GetFtn();
276*b1cdbd2cSJim Jagielski 		if ( bEndNotes == rFtn.IsEndNote() )
277*b1cdbd2cSJim Jagielski 			return sal_True;
278*b1cdbd2cSJim Jagielski 	}
279*b1cdbd2cSJim Jagielski 	return sal_False;
280*b1cdbd2cSJim Jagielski }
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 	// gebe Liste aller Fussnoten und deren Anfangstexte
GetSeqFtnList(SwSeqFldList & rList,bool bEndNotes)284*b1cdbd2cSJim Jagielski sal_uInt16 SwEditShell::GetSeqFtnList( SwSeqFldList& rList, bool bEndNotes )
285*b1cdbd2cSJim Jagielski {
286*b1cdbd2cSJim Jagielski 	if( rList.Count() )
287*b1cdbd2cSJim Jagielski 		rList.Remove( 0, rList.Count() );
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski 	sal_uInt16 n, nFtnCnt = pDoc->GetFtnIdxs().Count();
290*b1cdbd2cSJim Jagielski 	SwTxtFtn* pTxtFtn;
291*b1cdbd2cSJim Jagielski 	for( n = 0; n < nFtnCnt; ++n )
292*b1cdbd2cSJim Jagielski 	{
293*b1cdbd2cSJim Jagielski 		pTxtFtn = pDoc->GetFtnIdxs()[ n ];
294*b1cdbd2cSJim Jagielski 		const SwFmtFtn& rFtn = pTxtFtn->GetFtn();
295*b1cdbd2cSJim Jagielski 		if ( rFtn.IsEndNote() != bEndNotes )
296*b1cdbd2cSJim Jagielski 			continue;
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski 		SwNodeIndex* pIdx = pTxtFtn->GetStartNode();
299*b1cdbd2cSJim Jagielski 		if( pIdx )
300*b1cdbd2cSJim Jagielski 		{
301*b1cdbd2cSJim Jagielski 			SwNodeIndex aIdx( *pIdx, 1 );
302*b1cdbd2cSJim Jagielski 			SwTxtNode* pTxtNd = aIdx.GetNode().GetTxtNode();
303*b1cdbd2cSJim Jagielski 			if( !pTxtNd )
304*b1cdbd2cSJim Jagielski 				pTxtNd = (SwTxtNode*)pDoc->GetNodes().GoNext( &aIdx );
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski 			if( pTxtNd )
307*b1cdbd2cSJim Jagielski 			{
308*b1cdbd2cSJim Jagielski 				String sTxt( rFtn.GetViewNumStr( *pDoc ));
309*b1cdbd2cSJim Jagielski 				if( sTxt.Len() )
310*b1cdbd2cSJim Jagielski 					sTxt += ' ';
311*b1cdbd2cSJim Jagielski                 sTxt += pTxtNd->GetExpandTxt( 0, USHRT_MAX );
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski 				_SeqFldLstElem* pNew = new _SeqFldLstElem( sTxt,
314*b1cdbd2cSJim Jagielski 											pTxtFtn->GetSeqRefNo() );
315*b1cdbd2cSJim Jagielski 				while( rList.InsertSort( pNew ) )
316*b1cdbd2cSJim Jagielski 					pNew->sDlgEntry += ' ';
317*b1cdbd2cSJim Jagielski 			}
318*b1cdbd2cSJim Jagielski 		}
319*b1cdbd2cSJim Jagielski 	}
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski 	return rList.Count();
322*b1cdbd2cSJim Jagielski }
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski // linken Rand ueber Objectleiste einstellen (aenhlich dem Stufen von
326*b1cdbd2cSJim Jagielski // Numerierungen)
IsMoveLeftMargin(sal_Bool bRight,sal_Bool bModulus) const327*b1cdbd2cSJim Jagielski sal_Bool SwEditShell::IsMoveLeftMargin( sal_Bool bRight, sal_Bool bModulus ) const
328*b1cdbd2cSJim Jagielski {
329*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_True;
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski 	const SvxTabStopItem& rTabItem = (SvxTabStopItem&)GetDoc()->
332*b1cdbd2cSJim Jagielski 								GetDefault( RES_PARATR_TABSTOP );
333*b1cdbd2cSJim Jagielski 	sal_uInt16 nDefDist = static_cast<sal_uInt16>(rTabItem.Count() ? rTabItem[0].GetTabPos() : 1134);
334*b1cdbd2cSJim Jagielski 	if( !nDefDist )
335*b1cdbd2cSJim Jagielski 		return sal_False;
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski 	FOREACHPAM_START(this)
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski 		sal_uLong nSttNd = PCURCRSR->GetMark()->nNode.GetIndex(),
340*b1cdbd2cSJim Jagielski 			  nEndNd = PCURCRSR->GetPoint()->nNode.GetIndex();
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski 		if( nSttNd > nEndNd )
343*b1cdbd2cSJim Jagielski 		{
344*b1cdbd2cSJim Jagielski 			sal_uLong nTmp = nSttNd; nSttNd = nEndNd; nEndNd = nTmp;
345*b1cdbd2cSJim Jagielski 		}
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski 		SwCntntNode* pCNd;
348*b1cdbd2cSJim Jagielski 		for( sal_uLong n = nSttNd; bRet && n <= nEndNd; ++n )
349*b1cdbd2cSJim Jagielski 			if( 0 != ( pCNd = GetDoc()->GetNodes()[ n ]->GetTxtNode() ))
350*b1cdbd2cSJim Jagielski 			{
351*b1cdbd2cSJim Jagielski 				const SvxLRSpaceItem& rLS = (SvxLRSpaceItem&)
352*b1cdbd2cSJim Jagielski 											pCNd->GetAttr( RES_LR_SPACE );
353*b1cdbd2cSJim Jagielski 				if( bRight )
354*b1cdbd2cSJim Jagielski 				{
355*b1cdbd2cSJim Jagielski 					long nNext = rLS.GetTxtLeft() + nDefDist;
356*b1cdbd2cSJim Jagielski 					if( bModulus )
357*b1cdbd2cSJim Jagielski 						nNext = ( nNext / nDefDist ) * nDefDist;
358*b1cdbd2cSJim Jagielski 					SwFrm* pFrm = pCNd->getLayoutFrm( GetLayout() );
359*b1cdbd2cSJim Jagielski                     if ( pFrm )
360*b1cdbd2cSJim Jagielski                     {
361*b1cdbd2cSJim Jagielski                         const sal_uInt16 nFrmWidth = static_cast<sal_uInt16>( pFrm->IsVertical() ?
362*b1cdbd2cSJim Jagielski                                                  pFrm->Frm().Height() :
363*b1cdbd2cSJim Jagielski                                                  pFrm->Frm().Width() );
364*b1cdbd2cSJim Jagielski                         bRet = nFrmWidth > ( nNext + MM50 );
365*b1cdbd2cSJim Jagielski                     }
366*b1cdbd2cSJim Jagielski                     else
367*b1cdbd2cSJim Jagielski                         bRet = sal_False;
368*b1cdbd2cSJim Jagielski 				}
369*b1cdbd2cSJim Jagielski 			}
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski 		if( !bRet )
372*b1cdbd2cSJim Jagielski 			break;
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski 	FOREACHPAM_END()
375*b1cdbd2cSJim Jagielski 	return bRet;
376*b1cdbd2cSJim Jagielski }
377*b1cdbd2cSJim Jagielski 
MoveLeftMargin(sal_Bool bRight,sal_Bool bModulus)378*b1cdbd2cSJim Jagielski void SwEditShell::MoveLeftMargin( sal_Bool bRight, sal_Bool bModulus )
379*b1cdbd2cSJim Jagielski {
380*b1cdbd2cSJim Jagielski 	StartAllAction();
381*b1cdbd2cSJim Jagielski 	StartUndo( UNDO_START );
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski 	SwPaM* pCrsr = GetCrsr();
384*b1cdbd2cSJim Jagielski 	if( pCrsr->GetNext() != pCrsr )			// Mehrfachselektion ?
385*b1cdbd2cSJim Jagielski 	{
386*b1cdbd2cSJim Jagielski 		SwPamRanges aRangeArr( *pCrsr );
387*b1cdbd2cSJim Jagielski 		SwPaM aPam( *pCrsr->GetPoint() );
388*b1cdbd2cSJim Jagielski 		for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
389*b1cdbd2cSJim Jagielski 			GetDoc()->MoveLeftMargin( aRangeArr.SetPam( n, aPam ),
390*b1cdbd2cSJim Jagielski 										bRight, bModulus );
391*b1cdbd2cSJim Jagielski 	}
392*b1cdbd2cSJim Jagielski 	else
393*b1cdbd2cSJim Jagielski 		GetDoc()->MoveLeftMargin( *pCrsr, bRight, bModulus );
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski 	EndUndo( UNDO_END );
396*b1cdbd2cSJim Jagielski 	EndAllAction();
397*b1cdbd2cSJim Jagielski }
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski 
lcl_SetScriptFlags(sal_uInt16 nType)400*b1cdbd2cSJim Jagielski inline sal_uInt16 lcl_SetScriptFlags( sal_uInt16 nType )
401*b1cdbd2cSJim Jagielski {
402*b1cdbd2cSJim Jagielski 	sal_uInt16 nRet;
403*b1cdbd2cSJim Jagielski    	switch( nType )
404*b1cdbd2cSJim Jagielski 	{
405*b1cdbd2cSJim Jagielski 	case ::com::sun::star::i18n::ScriptType::LATIN:		nRet = SCRIPTTYPE_LATIN;	break;
406*b1cdbd2cSJim Jagielski 	case ::com::sun::star::i18n::ScriptType::ASIAN:		nRet = SCRIPTTYPE_ASIAN;	break;
407*b1cdbd2cSJim Jagielski 	case ::com::sun::star::i18n::ScriptType::COMPLEX:	nRet = SCRIPTTYPE_COMPLEX;	break;
408*b1cdbd2cSJim Jagielski 	default: nRet = 0;
409*b1cdbd2cSJim Jagielski 	}
410*b1cdbd2cSJim Jagielski 	return nRet;
411*b1cdbd2cSJim Jagielski }
412*b1cdbd2cSJim Jagielski 
lcl_IsNoEndTxtAttrAtPos(const SwTxtNode & rTNd,xub_StrLen nPos,sal_uInt16 & rScrpt,sal_Bool bInSelection,sal_Bool bNum)413*b1cdbd2cSJim Jagielski sal_Bool lcl_IsNoEndTxtAttrAtPos( const SwTxtNode& rTNd, xub_StrLen nPos,
414*b1cdbd2cSJim Jagielski                             sal_uInt16 &rScrpt, sal_Bool bInSelection, sal_Bool bNum )
415*b1cdbd2cSJim Jagielski {
416*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
417*b1cdbd2cSJim Jagielski 	const String& rTxt = rTNd.GetTxt();
418*b1cdbd2cSJim Jagielski     String sExp;
419*b1cdbd2cSJim Jagielski 
420*b1cdbd2cSJim Jagielski     // consider numbering
421*b1cdbd2cSJim Jagielski     if ( bNum )
422*b1cdbd2cSJim Jagielski     {
423*b1cdbd2cSJim Jagielski         bRet = sal_False;
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski         if ( rTNd.IsInList() )
426*b1cdbd2cSJim Jagielski         {
427*b1cdbd2cSJim Jagielski             ASSERT( rTNd.GetNumRule(),
428*b1cdbd2cSJim Jagielski                     "<lcl_IsNoEndTxtAttrAtPos(..)> - no list style found at text node. Serious defect -> please inform OD." );
429*b1cdbd2cSJim Jagielski             const SwNumRule* pNumRule = rTNd.GetNumRule();
430*b1cdbd2cSJim Jagielski             //Modified for i119959,2012.6.12
431*b1cdbd2cSJim Jagielski             //Under this scenario,this pointer is null,but on win,it doesn't crash immediately
432*b1cdbd2cSJim Jagielski             //it exits with exception,and associated memory will have problem which leads to crash problem in
433*b1cdbd2cSJim Jagielski             //other place in dev env...
434*b1cdbd2cSJim Jagielski             if ( pNumRule )
435*b1cdbd2cSJim Jagielski             {
436*b1cdbd2cSJim Jagielski                 //End
437*b1cdbd2cSJim Jagielski                 const SwNumFmt &rNumFmt = pNumRule->Get( static_cast<sal_uInt16>(rTNd.GetActualListLevel()) );
438*b1cdbd2cSJim Jagielski                 if( SVX_NUM_BITMAP != rNumFmt.GetNumberingType() )
439*b1cdbd2cSJim Jagielski                 {
440*b1cdbd2cSJim Jagielski                     if ( SVX_NUM_CHAR_SPECIAL == rNumFmt.GetNumberingType() )
441*b1cdbd2cSJim Jagielski                         sExp = rNumFmt.GetBulletChar();
442*b1cdbd2cSJim Jagielski                     else
443*b1cdbd2cSJim Jagielski                         sExp = rTNd.GetNumString();
444*b1cdbd2cSJim Jagielski                 }
445*b1cdbd2cSJim Jagielski                 //Modified for i119959,2012.6.12
446*b1cdbd2cSJim Jagielski                 //Under this scenario,this pointer is null,but on win,it doesn't crash immediately
447*b1cdbd2cSJim Jagielski                 //it exits with exception,and associated memory will have problem which leads to crash problem in
448*b1cdbd2cSJim Jagielski                 //other place in dev env...
449*b1cdbd2cSJim Jagielski             }
450*b1cdbd2cSJim Jagielski             //End
451*b1cdbd2cSJim Jagielski         }
452*b1cdbd2cSJim Jagielski     }
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski     // and fields
455*b1cdbd2cSJim Jagielski     if ( CH_TXTATR_BREAKWORD == rTxt.GetChar( nPos ) )
456*b1cdbd2cSJim Jagielski     {
457*b1cdbd2cSJim Jagielski         const SwTxtAttr* const pAttr = rTNd.GetTxtAttrForCharAt( nPos );
458*b1cdbd2cSJim Jagielski         if (pAttr)
459*b1cdbd2cSJim Jagielski         {
460*b1cdbd2cSJim Jagielski             bRet = sal_True; // all other than fields can be
461*b1cdbd2cSJim Jagielski                          // defined as weak-script ?
462*b1cdbd2cSJim Jagielski             if ( RES_TXTATR_FIELD == pAttr->Which() )
463*b1cdbd2cSJim Jagielski             {
464*b1cdbd2cSJim Jagielski                 const SwField* const pFld = pAttr->GetFmtFld().GetField();
465*b1cdbd2cSJim Jagielski                 if (pFld)
466*b1cdbd2cSJim Jagielski                 {
467*b1cdbd2cSJim Jagielski                     sExp += pFld->ExpandField(true);
468*b1cdbd2cSJim Jagielski                 }
469*b1cdbd2cSJim Jagielski             }
470*b1cdbd2cSJim Jagielski         }
471*b1cdbd2cSJim Jagielski     }
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski     xub_StrLen nEnd = sExp.Len();
474*b1cdbd2cSJim Jagielski     if ( nEnd )
475*b1cdbd2cSJim Jagielski     {
476*b1cdbd2cSJim Jagielski         xub_StrLen n;
477*b1cdbd2cSJim Jagielski         if( bInSelection )
478*b1cdbd2cSJim Jagielski         {
479*b1cdbd2cSJim Jagielski             sal_uInt16 nScript;
480*b1cdbd2cSJim Jagielski             for( n = 0; n < nEnd; n = (xub_StrLen)
481*b1cdbd2cSJim Jagielski                     pBreakIt->GetBreakIter()->endOfScript( sExp, n, nScript ))
482*b1cdbd2cSJim Jagielski             {
483*b1cdbd2cSJim Jagielski                 nScript = pBreakIt->GetBreakIter()->getScriptType( sExp, n );
484*b1cdbd2cSJim Jagielski                 rScrpt |= lcl_SetScriptFlags( nScript );
485*b1cdbd2cSJim Jagielski             }
486*b1cdbd2cSJim Jagielski         }
487*b1cdbd2cSJim Jagielski         else
488*b1cdbd2cSJim Jagielski             rScrpt |= lcl_SetScriptFlags( pBreakIt->GetBreakIter()->
489*b1cdbd2cSJim Jagielski                                         getScriptType( sExp, nEnd-1 ));
490*b1cdbd2cSJim Jagielski     }
491*b1cdbd2cSJim Jagielski 
492*b1cdbd2cSJim Jagielski     return bRet;
493*b1cdbd2cSJim Jagielski }
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski // returns the scripttpye of the selection
GetScriptType() const497*b1cdbd2cSJim Jagielski sal_uInt16 SwEditShell::GetScriptType() const
498*b1cdbd2cSJim Jagielski {
499*b1cdbd2cSJim Jagielski 	sal_uInt16 nRet = 0;
500*b1cdbd2cSJim Jagielski 	//if( pBreakIt->GetBreakIter().is() )
501*b1cdbd2cSJim Jagielski 	{
502*b1cdbd2cSJim Jagielski 		FOREACHPAM_START(this)
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski 			const SwPosition *pStt = PCURCRSR->Start(),
505*b1cdbd2cSJim Jagielski 							 *pEnd = pStt == PCURCRSR->GetMark()
506*b1cdbd2cSJim Jagielski 									? PCURCRSR->GetPoint()
507*b1cdbd2cSJim Jagielski 									: PCURCRSR->GetMark();
508*b1cdbd2cSJim Jagielski 			if( pStt == pEnd || *pStt == *pEnd )
509*b1cdbd2cSJim Jagielski 			{
510*b1cdbd2cSJim Jagielski 				const SwTxtNode* pTNd = pStt->nNode.GetNode().GetTxtNode();
511*b1cdbd2cSJim Jagielski 				if( pTNd )
512*b1cdbd2cSJim Jagielski 				{
513*b1cdbd2cSJim Jagielski                     // try to get SwScriptInfo
514*b1cdbd2cSJim Jagielski                     const SwScriptInfo* pScriptInfo = SwScriptInfo::GetScriptInfo( *pTNd );
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski 					xub_StrLen nPos = pStt->nContent.GetIndex();
517*b1cdbd2cSJim Jagielski 					//Task 90448: we need the scripttype of the previous
518*b1cdbd2cSJim Jagielski 					//				position, if no selection exist!
519*b1cdbd2cSJim Jagielski 					if( nPos )
520*b1cdbd2cSJim Jagielski 					{
521*b1cdbd2cSJim Jagielski 						SwIndex aIdx( pStt->nContent );
522*b1cdbd2cSJim Jagielski 						if( pTNd->GoPrevious( &aIdx, CRSR_SKIP_CHARS ) )
523*b1cdbd2cSJim Jagielski 							nPos = aIdx.GetIndex();
524*b1cdbd2cSJim Jagielski 					}
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski                     sal_uInt16 nScript;
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski                     if ( pTNd->GetTxt().Len() )
529*b1cdbd2cSJim Jagielski                     {
530*b1cdbd2cSJim Jagielski                         nScript = pScriptInfo ?
531*b1cdbd2cSJim Jagielski                                   pScriptInfo->ScriptType( nPos ) :
532*b1cdbd2cSJim Jagielski                                   pBreakIt->GetBreakIter()->getScriptType( pTNd->GetTxt(), nPos );
533*b1cdbd2cSJim Jagielski                     }
534*b1cdbd2cSJim Jagielski                     else
535*b1cdbd2cSJim Jagielski                         nScript = GetI18NScriptTypeOfLanguage( (sal_uInt16)GetAppLanguage() );
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski                     if( !lcl_IsNoEndTxtAttrAtPos( *pTNd, nPos, nRet, sal_False, sal_False ))
538*b1cdbd2cSJim Jagielski                         nRet |= lcl_SetScriptFlags( nScript );
539*b1cdbd2cSJim Jagielski 				}
540*b1cdbd2cSJim Jagielski 			}
541*b1cdbd2cSJim Jagielski 			else if ( pBreakIt->GetBreakIter().is() )
542*b1cdbd2cSJim Jagielski 			{
543*b1cdbd2cSJim Jagielski 				sal_uLong nEndIdx = pEnd->nNode.GetIndex();
544*b1cdbd2cSJim Jagielski 				SwNodeIndex aIdx( pStt->nNode );
545*b1cdbd2cSJim Jagielski 				for( ; aIdx.GetIndex() <= nEndIdx; aIdx++ )
546*b1cdbd2cSJim Jagielski 					if( aIdx.GetNode().IsTxtNode() )
547*b1cdbd2cSJim Jagielski 					{
548*b1cdbd2cSJim Jagielski 						const SwTxtNode* pTNd = aIdx.GetNode().GetTxtNode();
549*b1cdbd2cSJim Jagielski 						const String& rTxt = pTNd->GetTxt();
550*b1cdbd2cSJim Jagielski 
551*b1cdbd2cSJim Jagielski                         // try to get SwScriptInfo
552*b1cdbd2cSJim Jagielski                         const SwScriptInfo* pScriptInfo = SwScriptInfo::GetScriptInfo( *pTNd );
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski 						xub_StrLen nChg = aIdx == pStt->nNode
555*b1cdbd2cSJim Jagielski 												? pStt->nContent.GetIndex()
556*b1cdbd2cSJim Jagielski 												: 0,
557*b1cdbd2cSJim Jagielski 									nEndPos = aIdx == nEndIdx
558*b1cdbd2cSJim Jagielski 												? pEnd->nContent.GetIndex()
559*b1cdbd2cSJim Jagielski                                                 : rTxt.Len();
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski 						ASSERT( nEndPos <= rTxt.Len(), "Index outside the range - endless loop!" );
562*b1cdbd2cSJim Jagielski 						if( nEndPos > rTxt.Len() )
563*b1cdbd2cSJim Jagielski 							nEndPos = rTxt.Len();
564*b1cdbd2cSJim Jagielski 
565*b1cdbd2cSJim Jagielski 						sal_uInt16 nScript;
566*b1cdbd2cSJim Jagielski 						while( nChg < nEndPos )
567*b1cdbd2cSJim Jagielski 						{
568*b1cdbd2cSJim Jagielski                             nScript = pScriptInfo ?
569*b1cdbd2cSJim Jagielski                                       pScriptInfo->ScriptType( nChg ) :
570*b1cdbd2cSJim Jagielski                                       pBreakIt->GetBreakIter()->getScriptType(
571*b1cdbd2cSJim Jagielski 																rTxt, nChg );
572*b1cdbd2cSJim Jagielski 
573*b1cdbd2cSJim Jagielski                             if( !lcl_IsNoEndTxtAttrAtPos( *pTNd, nChg, nRet, sal_True,
574*b1cdbd2cSJim Jagielski                                                           0 == nChg && rTxt.Len() == nEndPos ) )
575*b1cdbd2cSJim Jagielski 								nRet |= lcl_SetScriptFlags( nScript );
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 							if( (SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN |
578*b1cdbd2cSJim Jagielski 								SCRIPTTYPE_COMPLEX) == nRet )
579*b1cdbd2cSJim Jagielski 								break;
580*b1cdbd2cSJim Jagielski 
581*b1cdbd2cSJim Jagielski 							xub_StrLen nFldPos = nChg+1;
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski                             nChg = pScriptInfo ?
584*b1cdbd2cSJim Jagielski                                    pScriptInfo->NextScriptChg( nChg ) :
585*b1cdbd2cSJim Jagielski                                    (xub_StrLen)pBreakIt->GetBreakIter()->endOfScript(
586*b1cdbd2cSJim Jagielski 													rTxt, nChg, nScript );
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski                             nFldPos = rTxt.Search(
589*b1cdbd2cSJim Jagielski 											CH_TXTATR_BREAKWORD, nFldPos );
590*b1cdbd2cSJim Jagielski 							if( nFldPos < nChg )
591*b1cdbd2cSJim Jagielski 								nChg = nFldPos;
592*b1cdbd2cSJim Jagielski 						}
593*b1cdbd2cSJim Jagielski 						if( (SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN |
594*b1cdbd2cSJim Jagielski 								SCRIPTTYPE_COMPLEX) == nRet )
595*b1cdbd2cSJim Jagielski 							break;
596*b1cdbd2cSJim Jagielski 					}
597*b1cdbd2cSJim Jagielski 			}
598*b1cdbd2cSJim Jagielski 			if( (SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN |
599*b1cdbd2cSJim Jagielski 								SCRIPTTYPE_COMPLEX) == nRet )
600*b1cdbd2cSJim Jagielski 				break;
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski 		FOREACHPAM_END()
603*b1cdbd2cSJim Jagielski 	}
604*b1cdbd2cSJim Jagielski 	if( !nRet )
605*b1cdbd2cSJim Jagielski         nRet = SvtLanguageOptions::GetScriptTypeOfLanguage( LANGUAGE_SYSTEM );
606*b1cdbd2cSJim Jagielski 	return nRet;
607*b1cdbd2cSJim Jagielski }
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski 
GetCurLang() const610*b1cdbd2cSJim Jagielski sal_uInt16 SwEditShell::GetCurLang() const
611*b1cdbd2cSJim Jagielski {
612*b1cdbd2cSJim Jagielski 	const SwPaM* pCrsr = GetCrsr();
613*b1cdbd2cSJim Jagielski 	const SwPosition& rPos = *pCrsr->GetPoint();
614*b1cdbd2cSJim Jagielski 	const SwTxtNode* pTNd = rPos.nNode.GetNode().GetTxtNode();
615*b1cdbd2cSJim Jagielski 	sal_uInt16 nLang;
616*b1cdbd2cSJim Jagielski 	if( pTNd )
617*b1cdbd2cSJim Jagielski 	{
618*b1cdbd2cSJim Jagielski 		//JP 24.9.2001: if exist no selection, then get the language before
619*b1cdbd2cSJim Jagielski 		//				the current character!
620*b1cdbd2cSJim Jagielski 		xub_StrLen nPos = rPos.nContent.GetIndex();
621*b1cdbd2cSJim Jagielski 		if( nPos && !pCrsr->HasMark() )
622*b1cdbd2cSJim Jagielski 			--nPos;
623*b1cdbd2cSJim Jagielski 		nLang = pTNd->GetLang( nPos );
624*b1cdbd2cSJim Jagielski 	}
625*b1cdbd2cSJim Jagielski 	else
626*b1cdbd2cSJim Jagielski 		nLang = LANGUAGE_DONTKNOW;
627*b1cdbd2cSJim Jagielski 	return nLang;
628*b1cdbd2cSJim Jagielski }
629*b1cdbd2cSJim Jagielski 
GetScalingOfSelectedText() const630*b1cdbd2cSJim Jagielski sal_uInt16 SwEditShell::GetScalingOfSelectedText() const
631*b1cdbd2cSJim Jagielski {
632*b1cdbd2cSJim Jagielski 	const SwPaM* pCrsr = GetCrsr();
633*b1cdbd2cSJim Jagielski 	const SwPosition* pStt = pCrsr->Start();
634*b1cdbd2cSJim Jagielski 	const SwTxtNode* pTNd = pStt->nNode.GetNode().GetTxtNode();
635*b1cdbd2cSJim Jagielski 	ASSERT( pTNd, "no textnode available" );
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski 	sal_uInt16 nScaleWidth;
638*b1cdbd2cSJim Jagielski 	if( pTNd )
639*b1cdbd2cSJim Jagielski 	{
640*b1cdbd2cSJim Jagielski 		xub_StrLen nStt = pStt->nContent.GetIndex(), nEnd;
641*b1cdbd2cSJim Jagielski 		const SwPosition* pEnd = pStt == pCrsr->GetPoint()
642*b1cdbd2cSJim Jagielski 										? pCrsr->GetMark()
643*b1cdbd2cSJim Jagielski 										: pCrsr->GetPoint();
644*b1cdbd2cSJim Jagielski 		if( pStt->nNode == pEnd->nNode )
645*b1cdbd2cSJim Jagielski 			nEnd = pEnd->nContent.GetIndex();
646*b1cdbd2cSJim Jagielski 		else
647*b1cdbd2cSJim Jagielski 			nEnd = pTNd->GetTxt().Len();
648*b1cdbd2cSJim Jagielski 		nScaleWidth = pTNd->GetScalingOfSelectedText( nStt, nEnd );
649*b1cdbd2cSJim Jagielski 	}
650*b1cdbd2cSJim Jagielski 	else
651*b1cdbd2cSJim Jagielski 		nScaleWidth = 100;		        // default are no scaling -> 100%
652*b1cdbd2cSJim Jagielski 	return nScaleWidth;
653*b1cdbd2cSJim Jagielski }
654