xref: /aoo4110/main/sc/source/ui/pagedlg/areasdlg.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_sc.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
30*b1cdbd2cSJim Jagielski #include <rangelst.hxx>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
33*b1cdbd2cSJim Jagielski #include <svl/stritem.hxx>
34*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
35*b1cdbd2cSJim Jagielski #include <unotools/charclass.hxx>
36*b1cdbd2cSJim Jagielski #include <stdlib.h>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #define _AREASDLG_CXX
39*b1cdbd2cSJim Jagielski #include "areasdlg.hxx"
40*b1cdbd2cSJim Jagielski #undef _AREASDLG_CXX
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include "scresid.hxx"
43*b1cdbd2cSJim Jagielski #include "rangenam.hxx"
44*b1cdbd2cSJim Jagielski #include "reffact.hxx"
45*b1cdbd2cSJim Jagielski #include "tabvwsh.hxx"
46*b1cdbd2cSJim Jagielski #include "docsh.hxx"
47*b1cdbd2cSJim Jagielski #include "globstr.hrc"
48*b1cdbd2cSJim Jagielski #include "pagedlg.hrc"
49*b1cdbd2cSJim Jagielski #include "compiler.hxx"
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski // STATIC DATA ---------------------------------------------------------------
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski // List box positions for print range (PR)
54*b1cdbd2cSJim Jagielski const sal_uInt16 SC_AREASDLG_PR_NONE    = 0;
55*b1cdbd2cSJim Jagielski const sal_uInt16 SC_AREASDLG_PR_ENTIRE  = 1;
56*b1cdbd2cSJim Jagielski const sal_uInt16 SC_AREASDLG_PR_USER    = 2;
57*b1cdbd2cSJim Jagielski const sal_uInt16 SC_AREASDLG_PR_SELECT  = 3;
58*b1cdbd2cSJim Jagielski const sal_uInt16 SC_AREASDLG_PR_OFFSET  = 4;
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski // List box positions for repeat ranges (RR)
61*b1cdbd2cSJim Jagielski const sal_uInt16 SC_AREASDLG_RR_NONE    = 0;
62*b1cdbd2cSJim Jagielski const sal_uInt16 SC_AREASDLG_RR_USER    = 1;
63*b1cdbd2cSJim Jagielski const sal_uInt16 SC_AREASDLG_RR_OFFSET  = 2;
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski //============================================================================
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski #define HDL(hdl)			LINK( this, ScPrintAreasDlg, hdl )
68*b1cdbd2cSJim Jagielski #define ERRORBOX(nId)		ErrorBox( this, WinBits(WB_OK|WB_DEF_OK), \
69*b1cdbd2cSJim Jagielski 							ScGlobal::GetRscString( nId ) ).Execute()
70*b1cdbd2cSJim Jagielski #define SWAP(x1,x2)			{ int n=x1; x1=x2; x2=n; }
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski // globale Funktionen (->am Ende der Datei):
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski bool    lcl_CheckRepeatString( const String& rStr, ScDocument* pDoc, bool bIsRow, ScRange* pRange );
75*b1cdbd2cSJim Jagielski void	lcl_GetRepeatRangeString( const ScRange* pRange, ScDocument* pDoc, bool bIsRow, String& rStr );
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski #if 0
78*b1cdbd2cSJim Jagielski static void printAddressFlags(sal_uInt16 nFlag)
79*b1cdbd2cSJim Jagielski {
80*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_COL_ABSOLUTE  ) == SCA_COL_ABSOLUTE  )  printf("SCA_COL_ABSOLUTE \n");
81*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_ROW_ABSOLUTE  ) == SCA_ROW_ABSOLUTE  )  printf("SCA_ROW_ABSOLUTE \n");
82*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_TAB_ABSOLUTE  ) == SCA_TAB_ABSOLUTE  )  printf("SCA_TAB_ABSOLUTE \n");
83*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_TAB_3D        ) == SCA_TAB_3D        )  printf("SCA_TAB_3D       \n");
84*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_COL2_ABSOLUTE ) == SCA_COL2_ABSOLUTE )  printf("SCA_COL2_ABSOLUTE\n");
85*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_ROW2_ABSOLUTE ) == SCA_ROW2_ABSOLUTE )  printf("SCA_ROW2_ABSOLUTE\n");
86*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_TAB2_ABSOLUTE ) == SCA_TAB2_ABSOLUTE )  printf("SCA_TAB2_ABSOLUTE\n");
87*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_TAB2_3D       ) == SCA_TAB2_3D       )  printf("SCA_TAB2_3D      \n");
88*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_VALID_ROW     ) == SCA_VALID_ROW     )  printf("SCA_VALID_ROW    \n");
89*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_VALID_COL     ) == SCA_VALID_COL     )  printf("SCA_VALID_COL    \n");
90*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_VALID_TAB     ) == SCA_VALID_TAB     )  printf("SCA_VALID_TAB    \n");
91*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_FORCE_DOC     ) == SCA_FORCE_DOC     )  printf("SCA_FORCE_DOC    \n");
92*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_VALID_ROW2    ) == SCA_VALID_ROW2    )  printf("SCA_VALID_ROW2   \n");
93*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_VALID_COL2    ) == SCA_VALID_COL2    )  printf("SCA_VALID_COL2   \n");
94*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_VALID_TAB2    ) == SCA_VALID_TAB2    )  printf("SCA_VALID_TAB2   \n");
95*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_VALID         ) == SCA_VALID         )  printf("SCA_VALID        \n");
96*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_ABS           ) == SCA_ABS           )  printf("SCA_ABS          \n");
97*b1cdbd2cSJim Jagielski     if ((nFlag & SCR_ABS           ) == SCR_ABS           )  printf("SCR_ABS          \n");
98*b1cdbd2cSJim Jagielski     if ((nFlag & SCA_ABS_3D        ) == SCA_ABS_3D        )  printf("SCA_ABS_3D       \n");
99*b1cdbd2cSJim Jagielski     if ((nFlag & SCR_ABS_3D        ) == SCR_ABS_3D        )  printf("SCR_ABS_3D       \n");
100*b1cdbd2cSJim Jagielski }
101*b1cdbd2cSJim Jagielski #endif
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski //============================================================================
104*b1cdbd2cSJim Jagielski //	class ScPrintAreasDlg
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
107*b1cdbd2cSJim Jagielski 
ScPrintAreasDlg(SfxBindings * pB,SfxChildWindow * pCW,Window * pParent)108*b1cdbd2cSJim Jagielski ScPrintAreasDlg::ScPrintAreasDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent )
109*b1cdbd2cSJim Jagielski 	:	ScAnyRefDlg		( pB, pCW, pParent, RID_SCDLG_AREAS),
110*b1cdbd2cSJim Jagielski 		//
111*b1cdbd2cSJim Jagielski 		aFlPrintArea    ( this, ScResId( FL_PRINTAREA ) ),
112*b1cdbd2cSJim Jagielski 		aLbPrintArea	( this, ScResId( LB_PRINTAREA ) ),
113*b1cdbd2cSJim Jagielski         aEdPrintArea    ( this, this, ScResId( ED_PRINTAREA ) ),
114*b1cdbd2cSJim Jagielski 		aRbPrintArea	( this, ScResId( RB_PRINTAREA ), &aEdPrintArea, this ),
115*b1cdbd2cSJim Jagielski 		//
116*b1cdbd2cSJim Jagielski 		aFlRepeatRow    ( this, ScResId( FL_REPEATROW ) ),
117*b1cdbd2cSJim Jagielski 		aLbRepeatRow	( this, ScResId( LB_REPEATROW ) ),
118*b1cdbd2cSJim Jagielski         aEdRepeatRow    ( this, this, ScResId( ED_REPEATROW ) ),
119*b1cdbd2cSJim Jagielski 		aRbRepeatRow	( this, ScResId( RB_REPEATROW ), &aEdRepeatRow, this ),
120*b1cdbd2cSJim Jagielski 		//
121*b1cdbd2cSJim Jagielski 		aFlRepeatCol    ( this, ScResId( FL_REPEATCOL ) ),
122*b1cdbd2cSJim Jagielski 		aLbRepeatCol	( this, ScResId( LB_REPEATCOL ) ),
123*b1cdbd2cSJim Jagielski         aEdRepeatCol    ( this, this, ScResId( ED_REPEATCOL ) ),
124*b1cdbd2cSJim Jagielski 		aRbRepeatCol	( this, ScResId( RB_REPEATCOL ), &aEdRepeatCol, this ),
125*b1cdbd2cSJim Jagielski 		//
126*b1cdbd2cSJim Jagielski 		aBtnOk			( this, ScResId( BTN_OK ) ),
127*b1cdbd2cSJim Jagielski 		aBtnCancel		( this, ScResId( BTN_CANCEL ) ),
128*b1cdbd2cSJim Jagielski 		aBtnHelp		( this, ScResId( BTN_HELP ) ),
129*b1cdbd2cSJim Jagielski 		//
130*b1cdbd2cSJim Jagielski 		bDlgLostFocus	( sal_False ),
131*b1cdbd2cSJim Jagielski 		pRefInputEdit	( &aEdPrintArea ),
132*b1cdbd2cSJim Jagielski 		pDoc			( NULL ),
133*b1cdbd2cSJim Jagielski 		pViewData		( NULL ),
134*b1cdbd2cSJim Jagielski 		nCurTab 		( 0 )
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski 	ScTabViewShell* pScViewSh = PTR_CAST( ScTabViewShell, SfxViewShell::Current() );
137*b1cdbd2cSJim Jagielski 	ScDocShell*		pScDocSh  = PTR_CAST( ScDocShell,     SfxObjectShell::Current() );
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pScDocSh, "Current DocumentShell not found :-(" );
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski 	pDoc = pScDocSh->GetDocument();
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 	if ( pScViewSh )
144*b1cdbd2cSJim Jagielski 	{
145*b1cdbd2cSJim Jagielski 		pViewData = pScViewSh->GetViewData();
146*b1cdbd2cSJim Jagielski 		nCurTab   = pViewData->GetTabNo();
147*b1cdbd2cSJim Jagielski 	}
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 	Impl_Reset();
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski 	//@BugID 54702 Enablen/Disablen nur noch in Basisklasse
152*b1cdbd2cSJim Jagielski 	//SFX_APPWINDOW->Enable();
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski 	FreeResource();
155*b1cdbd2cSJim Jagielski }
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
159*b1cdbd2cSJim Jagielski 
~ScPrintAreasDlg()160*b1cdbd2cSJim Jagielski ScPrintAreasDlg::~ScPrintAreasDlg()
161*b1cdbd2cSJim Jagielski {
162*b1cdbd2cSJim Jagielski 	// Extra-Data an ListBox-Entries abraeumen
163*b1cdbd2cSJim Jagielski 	ListBox* pLb[3] = { &aLbPrintArea, &aLbRepeatRow, &aLbRepeatCol };
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i=0; i<3; i++ )
166*b1cdbd2cSJim Jagielski 	{
167*b1cdbd2cSJim Jagielski 		sal_uInt16 nCount = pLb[i]->GetEntryCount();
168*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 j=0; j<nCount; j++ )
169*b1cdbd2cSJim Jagielski 			delete (String*)pLb[i]->GetEntryData(j);
170*b1cdbd2cSJim Jagielski 	}
171*b1cdbd2cSJim Jagielski }
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
175*b1cdbd2cSJim Jagielski 
Close()176*b1cdbd2cSJim Jagielski sal_Bool ScPrintAreasDlg::Close()
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski 	return DoClose( ScPrintAreasDlgWrapper::GetChildWindowId() );
179*b1cdbd2cSJim Jagielski }
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
183*b1cdbd2cSJim Jagielski 
IsTableLocked() const184*b1cdbd2cSJim Jagielski sal_Bool ScPrintAreasDlg::IsTableLocked() const
185*b1cdbd2cSJim Jagielski {
186*b1cdbd2cSJim Jagielski 	//	Druckbereiche gelten pro Tabelle, darum macht es keinen Sinn,
187*b1cdbd2cSJim Jagielski 	//	bei der Eingabe die Tabelle umzuschalten
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 	return sal_True;
190*b1cdbd2cSJim Jagielski }
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
194*b1cdbd2cSJim Jagielski 
SetReference(const ScRange & rRef,ScDocument *)195*b1cdbd2cSJim Jagielski void ScPrintAreasDlg::SetReference( const ScRange& rRef, ScDocument* /* pDoc */ )
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski 	if ( pRefInputEdit )
198*b1cdbd2cSJim Jagielski 	{
199*b1cdbd2cSJim Jagielski 		if ( rRef.aStart != rRef.aEnd )
200*b1cdbd2cSJim Jagielski 			RefInputStart( pRefInputEdit );
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski 		String	aStr;
203*b1cdbd2cSJim Jagielski         const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski 		if ( &aEdPrintArea == pRefInputEdit )
206*b1cdbd2cSJim Jagielski 		{
207*b1cdbd2cSJim Jagielski 			rRef.Format( aStr, SCR_ABS, pDoc, eConv );
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski //			aEdPrintArea.ReplaceSelected( aStr );
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 			String aVal = aEdPrintArea.GetText();
212*b1cdbd2cSJim Jagielski 			Selection aSel = aEdPrintArea.GetSelection();
213*b1cdbd2cSJim Jagielski             aSel.Justify();
214*b1cdbd2cSJim Jagielski 			aVal.Erase( (xub_StrLen)aSel.Min(), (xub_StrLen)aSel.Len() );
215*b1cdbd2cSJim Jagielski 			aVal.Insert( aStr, (xub_StrLen)aSel.Min() );
216*b1cdbd2cSJim Jagielski 			Selection aNewSel( aSel.Min(), aSel.Min()+aStr.Len() );
217*b1cdbd2cSJim Jagielski 			aEdPrintArea.SetRefString( aVal );
218*b1cdbd2cSJim Jagielski 			aEdPrintArea.SetSelection( aNewSel );
219*b1cdbd2cSJim Jagielski 		}
220*b1cdbd2cSJim Jagielski 		else
221*b1cdbd2cSJim Jagielski 		{
222*b1cdbd2cSJim Jagielski 			sal_Bool bRow = ( &aEdRepeatRow == pRefInputEdit );
223*b1cdbd2cSJim Jagielski             lcl_GetRepeatRangeString(&rRef, pDoc, bRow, aStr);
224*b1cdbd2cSJim Jagielski 			pRefInputEdit->SetRefString( aStr );
225*b1cdbd2cSJim Jagielski 		}
226*b1cdbd2cSJim Jagielski 	}
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 	Impl_ModifyHdl( pRefInputEdit );
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
233*b1cdbd2cSJim Jagielski 
AddRefEntry()234*b1cdbd2cSJim Jagielski void ScPrintAreasDlg::AddRefEntry()
235*b1cdbd2cSJim Jagielski {
236*b1cdbd2cSJim Jagielski 	if ( pRefInputEdit == &aEdPrintArea )
237*b1cdbd2cSJim Jagielski 	{
238*b1cdbd2cSJim Jagielski         const sal_Unicode sep = ScCompiler::GetNativeSymbol(ocSep).GetChar(0);
239*b1cdbd2cSJim Jagielski 		String aVal = aEdPrintArea.GetText();
240*b1cdbd2cSJim Jagielski 		aVal += sep;
241*b1cdbd2cSJim Jagielski 		aEdPrintArea.SetText(aVal);
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski 		xub_StrLen nLen = aVal.Len();
244*b1cdbd2cSJim Jagielski 		aEdPrintArea.SetSelection( Selection( nLen, nLen ) );
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski 		Impl_ModifyHdl( &aEdPrintArea );
247*b1cdbd2cSJim Jagielski 	}
248*b1cdbd2cSJim Jagielski }
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
252*b1cdbd2cSJim Jagielski 
Deactivate()253*b1cdbd2cSJim Jagielski void ScPrintAreasDlg::Deactivate()
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski 	bDlgLostFocus = sal_True;
256*b1cdbd2cSJim Jagielski }
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
260*b1cdbd2cSJim Jagielski 
SetActive()261*b1cdbd2cSJim Jagielski void ScPrintAreasDlg::SetActive()
262*b1cdbd2cSJim Jagielski {
263*b1cdbd2cSJim Jagielski 	if ( bDlgLostFocus )
264*b1cdbd2cSJim Jagielski 	{
265*b1cdbd2cSJim Jagielski 		bDlgLostFocus = sal_False;
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski 		if ( pRefInputEdit )
268*b1cdbd2cSJim Jagielski 		{
269*b1cdbd2cSJim Jagielski 			pRefInputEdit->GrabFocus();
270*b1cdbd2cSJim Jagielski 			Impl_ModifyHdl( pRefInputEdit );
271*b1cdbd2cSJim Jagielski 		}
272*b1cdbd2cSJim Jagielski 	}
273*b1cdbd2cSJim Jagielski 	else
274*b1cdbd2cSJim Jagielski 		GrabFocus();
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski 	RefInputDone();
277*b1cdbd2cSJim Jagielski }
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
281*b1cdbd2cSJim Jagielski 
Impl_Reset()282*b1cdbd2cSJim Jagielski void ScPrintAreasDlg::Impl_Reset()
283*b1cdbd2cSJim Jagielski {
284*b1cdbd2cSJim Jagielski 	String			aStrRange;
285*b1cdbd2cSJim Jagielski 	const ScRange*	pRepeatColRange = pDoc->GetRepeatColRange( nCurTab );
286*b1cdbd2cSJim Jagielski 	const ScRange*	pRepeatRowRange = pDoc->GetRepeatRowRange( nCurTab );
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski 	aEdPrintArea.SetModifyHdl	( HDL(Impl_ModifyHdl) );
289*b1cdbd2cSJim Jagielski 	aEdRepeatRow.SetModifyHdl	( HDL(Impl_ModifyHdl) );
290*b1cdbd2cSJim Jagielski 	aEdRepeatCol.SetModifyHdl	( HDL(Impl_ModifyHdl) );
291*b1cdbd2cSJim Jagielski 	aEdPrintArea.SetGetFocusHdl( HDL(Impl_GetFocusHdl) );
292*b1cdbd2cSJim Jagielski 	aEdRepeatRow.SetGetFocusHdl( HDL(Impl_GetFocusHdl) );
293*b1cdbd2cSJim Jagielski 	aEdRepeatCol.SetGetFocusHdl( HDL(Impl_GetFocusHdl) );
294*b1cdbd2cSJim Jagielski 	aLbPrintArea.SetGetFocusHdl( HDL(Impl_GetFocusHdl) );
295*b1cdbd2cSJim Jagielski 	aLbRepeatRow.SetGetFocusHdl( HDL(Impl_GetFocusHdl) );
296*b1cdbd2cSJim Jagielski 	aLbRepeatCol.SetGetFocusHdl( HDL(Impl_GetFocusHdl) );
297*b1cdbd2cSJim Jagielski 	aLbPrintArea.SetSelectHdl	( HDL(Impl_SelectHdl) );
298*b1cdbd2cSJim Jagielski 	aLbRepeatRow.SetSelectHdl	( HDL(Impl_SelectHdl) );
299*b1cdbd2cSJim Jagielski 	aLbRepeatCol.SetSelectHdl	( HDL(Impl_SelectHdl) );
300*b1cdbd2cSJim Jagielski 	aBtnOk		.SetClickHdl 	( HDL(Impl_BtnHdl)    );
301*b1cdbd2cSJim Jagielski 	aBtnCancel	.SetClickHdl 	( HDL(Impl_BtnHdl)    );
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski 	Impl_FillLists();
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski 	//-------------------------
306*b1cdbd2cSJim Jagielski 	// Druckbereich
307*b1cdbd2cSJim Jagielski 	//-------------------------
308*b1cdbd2cSJim Jagielski 	aStrRange.Erase();
309*b1cdbd2cSJim Jagielski     String aOne;
310*b1cdbd2cSJim Jagielski     const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
311*b1cdbd2cSJim Jagielski     const sal_Unicode sep = ScCompiler::GetNativeSymbol(ocSep).GetChar(0);
312*b1cdbd2cSJim Jagielski     sal_uInt16 nRangeCount = pDoc->GetPrintRangeCount( nCurTab );
313*b1cdbd2cSJim Jagielski     for (sal_uInt16 i=0; i<nRangeCount; i++)
314*b1cdbd2cSJim Jagielski     {
315*b1cdbd2cSJim Jagielski         const ScRange* pPrintRange = pDoc->GetPrintRange( nCurTab, i );
316*b1cdbd2cSJim Jagielski         if (pPrintRange)
317*b1cdbd2cSJim Jagielski         {
318*b1cdbd2cSJim Jagielski             if ( aStrRange.Len() )
319*b1cdbd2cSJim Jagielski                 aStrRange += sep;
320*b1cdbd2cSJim Jagielski             pPrintRange->Format( aOne, SCR_ABS, pDoc, eConv );
321*b1cdbd2cSJim Jagielski             aStrRange += aOne;
322*b1cdbd2cSJim Jagielski         }
323*b1cdbd2cSJim Jagielski     }
324*b1cdbd2cSJim Jagielski     aEdPrintArea.SetText( aStrRange );
325*b1cdbd2cSJim Jagielski 
326*b1cdbd2cSJim Jagielski 	//-------------------------------
327*b1cdbd2cSJim Jagielski 	// Wiederholungszeile
328*b1cdbd2cSJim Jagielski 	//-------------------------------
329*b1cdbd2cSJim Jagielski     lcl_GetRepeatRangeString(pRepeatRowRange, pDoc, true, aStrRange);
330*b1cdbd2cSJim Jagielski 	aEdRepeatRow.SetText( aStrRange );
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski 	//--------------------------------
333*b1cdbd2cSJim Jagielski 	// Wiederholungsspalte
334*b1cdbd2cSJim Jagielski 	//--------------------------------
335*b1cdbd2cSJim Jagielski     lcl_GetRepeatRangeString(pRepeatColRange, pDoc, false, aStrRange);
336*b1cdbd2cSJim Jagielski 	aEdRepeatCol.SetText( aStrRange );
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski 	Impl_ModifyHdl( &aEdPrintArea );
339*b1cdbd2cSJim Jagielski 	Impl_ModifyHdl( &aEdRepeatRow );
340*b1cdbd2cSJim Jagielski 	Impl_ModifyHdl( &aEdRepeatCol );
341*b1cdbd2cSJim Jagielski     if( pDoc->IsPrintEntireSheet( nCurTab ) )
342*b1cdbd2cSJim Jagielski         aLbPrintArea.SelectEntryPos( SC_AREASDLG_PR_ENTIRE );
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski 	aEdPrintArea.SaveValue();	// fuer FillItemSet() merken:
345*b1cdbd2cSJim Jagielski 	aEdRepeatRow.SaveValue();
346*b1cdbd2cSJim Jagielski 	aEdRepeatCol.SaveValue();
347*b1cdbd2cSJim Jagielski }
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
351*b1cdbd2cSJim Jagielski 
Impl_GetItem(Edit * pEd,SfxStringItem & rItem)352*b1cdbd2cSJim Jagielski sal_Bool ScPrintAreasDlg::Impl_GetItem( Edit* pEd, SfxStringItem& rItem )
353*b1cdbd2cSJim Jagielski {
354*b1cdbd2cSJim Jagielski 	String	aRangeStr = pEd->GetText();
355*b1cdbd2cSJim Jagielski 	sal_Bool	bDataChanged = (pEd->GetSavedValue() != aRangeStr);
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski 	if ( (aRangeStr.Len() > 0) && &aEdPrintArea != pEd )
358*b1cdbd2cSJim Jagielski 	{
359*b1cdbd2cSJim Jagielski 		ScRange aRange;
360*b1cdbd2cSJim Jagielski         const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
361*b1cdbd2cSJim Jagielski         lcl_CheckRepeatString(aRangeStr, pDoc, &aEdRepeatRow == pEd, &aRange);
362*b1cdbd2cSJim Jagielski 		aRange.Format(aRangeStr, SCR_ABS, pDoc, eConv);
363*b1cdbd2cSJim Jagielski 	}
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski 	rItem.SetValue( aRangeStr );
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 	return bDataChanged;
368*b1cdbd2cSJim Jagielski }
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
372*b1cdbd2cSJim Jagielski 
Impl_CheckRefStrings()373*b1cdbd2cSJim Jagielski sal_Bool ScPrintAreasDlg::Impl_CheckRefStrings()
374*b1cdbd2cSJim Jagielski {
375*b1cdbd2cSJim Jagielski 	sal_Bool		bOk = sal_False;
376*b1cdbd2cSJim Jagielski 	String		aStrPrintArea	= aEdPrintArea.GetText();
377*b1cdbd2cSJim Jagielski 	String		aStrRepeatRow	= aEdRepeatRow.GetText();
378*b1cdbd2cSJim Jagielski 	String		aStrRepeatCol	= aEdRepeatCol.GetText();
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski 	sal_Bool bPrintAreaOk = sal_True;
381*b1cdbd2cSJim Jagielski 	if ( aStrPrintArea.Len() )
382*b1cdbd2cSJim Jagielski 	{
383*b1cdbd2cSJim Jagielski         const sal_uInt16 nValidAddr  = SCA_VALID | SCA_VALID_ROW | SCA_VALID_COL;
384*b1cdbd2cSJim Jagielski         const sal_uInt16 nValidRange = nValidAddr | SCA_VALID_ROW2 | SCA_VALID_COL2;
385*b1cdbd2cSJim Jagielski         const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
386*b1cdbd2cSJim Jagielski         const sal_Unicode sep  = ScCompiler::GetNativeSymbol(ocSep).GetChar(0);
387*b1cdbd2cSJim Jagielski         // const sal_Unicode rsep = ScCompiler::GetNativeSymbol(ocRange).GetChar(0);
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski         ScAddress aAddr;
390*b1cdbd2cSJim Jagielski 		ScRange aRange;
391*b1cdbd2cSJim Jagielski 		xub_StrLen nSepCount = aStrPrintArea.GetTokenCount(sep);
392*b1cdbd2cSJim Jagielski 		for ( xub_StrLen i = 0; i < nSepCount && bPrintAreaOk; ++i )
393*b1cdbd2cSJim Jagielski 		{
394*b1cdbd2cSJim Jagielski 			String aOne = aStrPrintArea.GetToken(i, sep);
395*b1cdbd2cSJim Jagielski             sal_uInt16 nResult = aRange.Parse( aOne, pDoc, eConv );
396*b1cdbd2cSJim Jagielski             if ((nResult & nValidRange) != nValidRange)
397*b1cdbd2cSJim Jagielski             {
398*b1cdbd2cSJim Jagielski                 sal_uInt16 nAddrResult = aAddr.Parse( aOne, pDoc, eConv );
399*b1cdbd2cSJim Jagielski                 if ((nAddrResult & nValidAddr) != nValidAddr)
400*b1cdbd2cSJim Jagielski                     bPrintAreaOk = sal_False;
401*b1cdbd2cSJim Jagielski             }
402*b1cdbd2cSJim Jagielski 		}
403*b1cdbd2cSJim Jagielski 	}
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski 	sal_Bool bRepeatRowOk = (aStrRepeatRow.Len() == 0);
406*b1cdbd2cSJim Jagielski 	if ( !bRepeatRowOk )
407*b1cdbd2cSJim Jagielski         bRepeatRowOk = lcl_CheckRepeatString(aStrRepeatRow, pDoc, true, NULL);
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski 	sal_Bool bRepeatColOk = (aStrRepeatCol.Len() == 0);
410*b1cdbd2cSJim Jagielski 	if ( !bRepeatColOk )
411*b1cdbd2cSJim Jagielski         bRepeatColOk = lcl_CheckRepeatString(aStrRepeatCol, pDoc, false, NULL);
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski 	// Fehlermeldungen
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski 	bOk = (bPrintAreaOk && bRepeatRowOk && bRepeatColOk);
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski 	if ( !bOk )
418*b1cdbd2cSJim Jagielski 	{
419*b1cdbd2cSJim Jagielski 		Edit* pEd = NULL;
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski 			 if ( !bPrintAreaOk ) pEd = &aEdPrintArea;
422*b1cdbd2cSJim Jagielski 		else if ( !bRepeatRowOk ) pEd = &aEdRepeatRow;
423*b1cdbd2cSJim Jagielski 		else if ( !bRepeatColOk ) pEd = &aEdRepeatCol;
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski 		ERRORBOX( STR_INVALID_TABREF );
426*b1cdbd2cSJim Jagielski 		pEd->GrabFocus();
427*b1cdbd2cSJim Jagielski 	}
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski 	return bOk;
430*b1cdbd2cSJim Jagielski }
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
434*b1cdbd2cSJim Jagielski 
Impl_FillLists()435*b1cdbd2cSJim Jagielski void ScPrintAreasDlg::Impl_FillLists()
436*b1cdbd2cSJim Jagielski {
437*b1cdbd2cSJim Jagielski 	//------------------------------------------------------
438*b1cdbd2cSJim Jagielski 	// Selektion holen und String in PrintArea-ListBox merken
439*b1cdbd2cSJim Jagielski 	//------------------------------------------------------
440*b1cdbd2cSJim Jagielski 	ScRange	aRange;
441*b1cdbd2cSJim Jagielski 	String	aStrRange;
442*b1cdbd2cSJim Jagielski 	sal_Bool bSimple = sal_True;
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski 	if ( pViewData )
445*b1cdbd2cSJim Jagielski 		bSimple = (pViewData->GetSimpleArea( aRange ) == SC_MARK_SIMPLE);
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski     formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski 	if ( bSimple )
450*b1cdbd2cSJim Jagielski 		aRange.Format( aStrRange, SCR_ABS, pDoc, eConv );
451*b1cdbd2cSJim Jagielski 	else
452*b1cdbd2cSJim Jagielski 	{
453*b1cdbd2cSJim Jagielski 		ScRangeListRef aList( new ScRangeList );
454*b1cdbd2cSJim Jagielski 		pViewData->GetMarkData().FillRangeListWithMarks( aList, sal_False );
455*b1cdbd2cSJim Jagielski 		aList->Format( aStrRange, SCR_ABS, pDoc, eConv );
456*b1cdbd2cSJim Jagielski 	}
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski     aLbPrintArea.SetEntryData( SC_AREASDLG_PR_SELECT, new String( aStrRange ) );
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski 	//------------------------------------------------------
461*b1cdbd2cSJim Jagielski 	// Ranges holen und in ListBoxen merken
462*b1cdbd2cSJim Jagielski 	//------------------------------------------------------
463*b1cdbd2cSJim Jagielski 	ScRangeName*	pRangeNames = pDoc->GetRangeName();
464*b1cdbd2cSJim Jagielski 	const sal_uInt16	nCount		= pRangeNames ? pRangeNames->GetCount() : 0;
465*b1cdbd2cSJim Jagielski 
466*b1cdbd2cSJim Jagielski 	if ( nCount > 0 )
467*b1cdbd2cSJim Jagielski 	{
468*b1cdbd2cSJim Jagielski 		String			aName;
469*b1cdbd2cSJim Jagielski 		String			aSymbol;
470*b1cdbd2cSJim Jagielski //        ScRange         aRange;
471*b1cdbd2cSJim Jagielski 		ScRangeData*	pData = NULL;
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 i=0; i<nCount; i++ )
474*b1cdbd2cSJim Jagielski 		{
475*b1cdbd2cSJim Jagielski 			pData = (ScRangeData*)(pRangeNames->At( i ));
476*b1cdbd2cSJim Jagielski 			if ( pData )
477*b1cdbd2cSJim Jagielski 			{
478*b1cdbd2cSJim Jagielski 				if (   pData->HasType( RT_ABSAREA )
479*b1cdbd2cSJim Jagielski 					|| pData->HasType( RT_REFAREA )
480*b1cdbd2cSJim Jagielski 					|| pData->HasType( RT_ABSPOS ) )
481*b1cdbd2cSJim Jagielski 				{
482*b1cdbd2cSJim Jagielski 					pData->GetName( aName );
483*b1cdbd2cSJim Jagielski 					pData->GetSymbol( aSymbol );
484*b1cdbd2cSJim Jagielski 					if ( aRange.ParseAny( aSymbol, pDoc, eConv ) & SCA_VALID )
485*b1cdbd2cSJim Jagielski 					{
486*b1cdbd2cSJim Jagielski 						if ( pData->HasType( RT_PRINTAREA ) )
487*b1cdbd2cSJim Jagielski 						{
488*b1cdbd2cSJim Jagielski 							aRange.Format( aSymbol, SCR_ABS, pDoc, eConv );
489*b1cdbd2cSJim Jagielski 							aLbPrintArea.SetEntryData(
490*b1cdbd2cSJim Jagielski 								aLbPrintArea.InsertEntry( aName ),
491*b1cdbd2cSJim Jagielski 								new String( aSymbol ) );
492*b1cdbd2cSJim Jagielski 						}
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski 						if ( pData->HasType( RT_ROWHEADER ) )
495*b1cdbd2cSJim Jagielski 						{
496*b1cdbd2cSJim Jagielski                             lcl_GetRepeatRangeString(&aRange, pDoc, true, aSymbol);
497*b1cdbd2cSJim Jagielski 							aLbRepeatRow.SetEntryData(
498*b1cdbd2cSJim Jagielski 								aLbRepeatRow.InsertEntry( aName ),
499*b1cdbd2cSJim Jagielski 								new String( aSymbol ) );
500*b1cdbd2cSJim Jagielski 						}
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski 						if ( pData->HasType( RT_COLHEADER ) )
503*b1cdbd2cSJim Jagielski 						{
504*b1cdbd2cSJim Jagielski                             lcl_GetRepeatRangeString(&aRange, pDoc, false, aSymbol);
505*b1cdbd2cSJim Jagielski 							aLbRepeatCol.SetEntryData(
506*b1cdbd2cSJim Jagielski 								aLbRepeatCol.InsertEntry( aName ),
507*b1cdbd2cSJim Jagielski 								new String( aSymbol ) );
508*b1cdbd2cSJim Jagielski 						}
509*b1cdbd2cSJim Jagielski 					}
510*b1cdbd2cSJim Jagielski 				}
511*b1cdbd2cSJim Jagielski 			}
512*b1cdbd2cSJim Jagielski 		}
513*b1cdbd2cSJim Jagielski 	}
514*b1cdbd2cSJim Jagielski }
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
518*b1cdbd2cSJim Jagielski // Handler:
519*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
520*b1cdbd2cSJim Jagielski 
IMPL_LINK(ScPrintAreasDlg,Impl_BtnHdl,PushButton *,pBtn)521*b1cdbd2cSJim Jagielski IMPL_LINK( ScPrintAreasDlg, Impl_BtnHdl, PushButton*, pBtn )
522*b1cdbd2cSJim Jagielski {
523*b1cdbd2cSJim Jagielski 	if ( &aBtnOk == pBtn )
524*b1cdbd2cSJim Jagielski 	{
525*b1cdbd2cSJim Jagielski 		if ( Impl_CheckRefStrings() )
526*b1cdbd2cSJim Jagielski 		{
527*b1cdbd2cSJim Jagielski 			sal_Bool			bDataChanged = sal_False;
528*b1cdbd2cSJim Jagielski 			String			aStr;
529*b1cdbd2cSJim Jagielski 			SfxStringItem	aPrintArea( SID_CHANGE_PRINTAREA, aStr );
530*b1cdbd2cSJim Jagielski 			SfxStringItem	aRepeatRow( FN_PARAM_2, aStr );
531*b1cdbd2cSJim Jagielski 			SfxStringItem 	aRepeatCol( FN_PARAM_3, aStr );
532*b1cdbd2cSJim Jagielski 
533*b1cdbd2cSJim Jagielski 			//-------------------------
534*b1cdbd2cSJim Jagielski 			// Druckbereich veraendert?
535*b1cdbd2cSJim Jagielski 			//-------------------------
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski             // first try the list box, if "Entite sheet" is selected
538*b1cdbd2cSJim Jagielski             sal_Bool bEntireSheet = (aLbPrintArea.GetSelectEntryPos() == SC_AREASDLG_PR_ENTIRE);
539*b1cdbd2cSJim Jagielski             SfxBoolItem aEntireSheet( FN_PARAM_4, bEntireSheet );
540*b1cdbd2cSJim Jagielski 
541*b1cdbd2cSJim Jagielski             bDataChanged = bEntireSheet != pDoc->IsPrintEntireSheet( nCurTab );
542*b1cdbd2cSJim Jagielski             if( !bEntireSheet )
543*b1cdbd2cSJim Jagielski             {
544*b1cdbd2cSJim Jagielski                 // if new list box selection is not "Entire sheet", get the edit field contents
545*b1cdbd2cSJim Jagielski                 bDataChanged |= Impl_GetItem( &aEdPrintArea, aPrintArea );
546*b1cdbd2cSJim Jagielski             }
547*b1cdbd2cSJim Jagielski 
548*b1cdbd2cSJim Jagielski 			//-------------------------------
549*b1cdbd2cSJim Jagielski 			// Wiederholungszeile veraendert?
550*b1cdbd2cSJim Jagielski 			//-------------------------------
551*b1cdbd2cSJim Jagielski 			bDataChanged |= Impl_GetItem( &aEdRepeatRow, aRepeatRow );
552*b1cdbd2cSJim Jagielski 
553*b1cdbd2cSJim Jagielski 			//--------------------------------
554*b1cdbd2cSJim Jagielski 			// Wiederholungsspalte veraendert?
555*b1cdbd2cSJim Jagielski 			//--------------------------------
556*b1cdbd2cSJim Jagielski 			bDataChanged |= Impl_GetItem( &aEdRepeatCol, aRepeatCol );
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski 			if ( bDataChanged )
559*b1cdbd2cSJim Jagielski 			{
560*b1cdbd2cSJim Jagielski 				SetDispatcherLock( sal_False );
561*b1cdbd2cSJim Jagielski 				SwitchToDocument();
562*b1cdbd2cSJim Jagielski 				GetBindings().GetDispatcher()->Execute( SID_CHANGE_PRINTAREA,
563*b1cdbd2cSJim Jagielski 										  SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD,
564*b1cdbd2cSJim Jagielski                                           &aPrintArea, &aRepeatRow, &aRepeatCol, &aEntireSheet, 0L );
565*b1cdbd2cSJim Jagielski 			}
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski 			Close();
568*b1cdbd2cSJim Jagielski 		}
569*b1cdbd2cSJim Jagielski 	}
570*b1cdbd2cSJim Jagielski 	else if ( &aBtnCancel == pBtn )
571*b1cdbd2cSJim Jagielski 		Close();
572*b1cdbd2cSJim Jagielski 
573*b1cdbd2cSJim Jagielski 	return 0;
574*b1cdbd2cSJim Jagielski }
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
578*b1cdbd2cSJim Jagielski 
IMPL_LINK(ScPrintAreasDlg,Impl_GetFocusHdl,Control *,pCtr)579*b1cdbd2cSJim Jagielski IMPL_LINK( ScPrintAreasDlg, Impl_GetFocusHdl, Control*, pCtr )
580*b1cdbd2cSJim Jagielski {
581*b1cdbd2cSJim Jagielski 	if ( pCtr ==(Control *) &aEdPrintArea ||
582*b1cdbd2cSJim Jagielski 		 pCtr ==(Control *) &aEdRepeatRow ||
583*b1cdbd2cSJim Jagielski 		 pCtr ==(Control *) &aEdRepeatCol)
584*b1cdbd2cSJim Jagielski 	{
585*b1cdbd2cSJim Jagielski 		 pRefInputEdit = (formula::RefEdit*) pCtr;
586*b1cdbd2cSJim Jagielski 	}
587*b1cdbd2cSJim Jagielski 	else if ( pCtr ==(Control *) &aLbPrintArea)
588*b1cdbd2cSJim Jagielski 	{
589*b1cdbd2cSJim Jagielski 		pRefInputEdit = &aEdPrintArea;
590*b1cdbd2cSJim Jagielski 	}
591*b1cdbd2cSJim Jagielski 	else if ( pCtr ==(Control *) &aLbRepeatRow)
592*b1cdbd2cSJim Jagielski 	{
593*b1cdbd2cSJim Jagielski 		pRefInputEdit = &aEdRepeatRow;
594*b1cdbd2cSJim Jagielski 	}
595*b1cdbd2cSJim Jagielski 	else if ( pCtr ==(Control *) &aLbRepeatCol)
596*b1cdbd2cSJim Jagielski 	{
597*b1cdbd2cSJim Jagielski 		pRefInputEdit = &aEdRepeatCol;
598*b1cdbd2cSJim Jagielski 	}
599*b1cdbd2cSJim Jagielski 
600*b1cdbd2cSJim Jagielski 	return 0;
601*b1cdbd2cSJim Jagielski }
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 
604*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
605*b1cdbd2cSJim Jagielski 
IMPL_LINK(ScPrintAreasDlg,Impl_SelectHdl,ListBox *,pLb)606*b1cdbd2cSJim Jagielski IMPL_LINK( ScPrintAreasDlg, Impl_SelectHdl, ListBox*, pLb )
607*b1cdbd2cSJim Jagielski {
608*b1cdbd2cSJim Jagielski     sal_uInt16 nSelPos = pLb->GetSelectEntryPos();
609*b1cdbd2cSJim Jagielski     Edit* pEd = NULL;
610*b1cdbd2cSJim Jagielski 
611*b1cdbd2cSJim Jagielski     // list box positions of specific entries, default to "repeat row/column" list boxes
612*b1cdbd2cSJim Jagielski     sal_uInt16 nAllSheetPos = SC_AREASDLG_RR_NONE;
613*b1cdbd2cSJim Jagielski     sal_uInt16 nUserDefPos = SC_AREASDLG_RR_USER;
614*b1cdbd2cSJim Jagielski     sal_uInt16 nFirstCustomPos = SC_AREASDLG_RR_OFFSET;
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski     // find edit field for list box, and list box positions
617*b1cdbd2cSJim Jagielski     if( pLb == &aLbPrintArea )
618*b1cdbd2cSJim Jagielski     {
619*b1cdbd2cSJim Jagielski         pEd = &aEdPrintArea;
620*b1cdbd2cSJim Jagielski         nAllSheetPos = SC_AREASDLG_PR_ENTIRE;
621*b1cdbd2cSJim Jagielski         nUserDefPos = SC_AREASDLG_PR_USER;
622*b1cdbd2cSJim Jagielski         nFirstCustomPos = SC_AREASDLG_PR_SELECT;    // "Selection" and following
623*b1cdbd2cSJim Jagielski     }
624*b1cdbd2cSJim Jagielski     else if( pLb == &aLbRepeatCol )
625*b1cdbd2cSJim Jagielski         pEd = &aEdRepeatCol;
626*b1cdbd2cSJim Jagielski     else if( pLb == &aLbRepeatRow )
627*b1cdbd2cSJim Jagielski         pEd = &aEdRepeatRow;
628*b1cdbd2cSJim Jagielski     else
629*b1cdbd2cSJim Jagielski         return 0;
630*b1cdbd2cSJim Jagielski 
631*b1cdbd2cSJim Jagielski     // fill edit field according to list box selection
632*b1cdbd2cSJim Jagielski     if( (nSelPos == 0) || (nSelPos == nAllSheetPos) )
633*b1cdbd2cSJim Jagielski         pEd->SetText( EMPTY_STRING );
634*b1cdbd2cSJim Jagielski     else if( nSelPos == nUserDefPos && !pLb->IsTravelSelect() && pEd->GetText().Len() == 0 )
635*b1cdbd2cSJim Jagielski         pLb->SelectEntryPos( 0 );
636*b1cdbd2cSJim Jagielski     else if( nSelPos >= nFirstCustomPos )
637*b1cdbd2cSJim Jagielski         pEd->SetText( *static_cast< String* >( pLb->GetEntryData( nSelPos ) ) );
638*b1cdbd2cSJim Jagielski 
639*b1cdbd2cSJim Jagielski     return 0;
640*b1cdbd2cSJim Jagielski }
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
644*b1cdbd2cSJim Jagielski 
IMPL_LINK(ScPrintAreasDlg,Impl_ModifyHdl,formula::RefEdit *,pEd)645*b1cdbd2cSJim Jagielski IMPL_LINK( ScPrintAreasDlg, Impl_ModifyHdl, formula::RefEdit*, pEd )
646*b1cdbd2cSJim Jagielski {
647*b1cdbd2cSJim Jagielski     ListBox* pLb = NULL;
648*b1cdbd2cSJim Jagielski 
649*b1cdbd2cSJim Jagielski     // list box positions of specific entries, default to "repeat row/column" list boxes
650*b1cdbd2cSJim Jagielski     sal_uInt16 nUserDefPos = SC_AREASDLG_RR_USER;
651*b1cdbd2cSJim Jagielski     sal_uInt16 nFirstCustomPos = SC_AREASDLG_RR_OFFSET;
652*b1cdbd2cSJim Jagielski 
653*b1cdbd2cSJim Jagielski     if( pEd == &aEdPrintArea )
654*b1cdbd2cSJim Jagielski     {
655*b1cdbd2cSJim Jagielski         pLb = &aLbPrintArea;
656*b1cdbd2cSJim Jagielski         nUserDefPos = SC_AREASDLG_PR_USER;
657*b1cdbd2cSJim Jagielski         nFirstCustomPos = SC_AREASDLG_PR_SELECT;    // "Selection" and following
658*b1cdbd2cSJim Jagielski     }
659*b1cdbd2cSJim Jagielski     else if( pEd == &aEdRepeatCol )
660*b1cdbd2cSJim Jagielski 		pLb = &aLbRepeatCol;
661*b1cdbd2cSJim Jagielski     else if( pEd == &aEdRepeatRow )
662*b1cdbd2cSJim Jagielski 		pLb = &aLbRepeatRow;
663*b1cdbd2cSJim Jagielski     else
664*b1cdbd2cSJim Jagielski         return 0;
665*b1cdbd2cSJim Jagielski 
666*b1cdbd2cSJim Jagielski     // set list box selection according to edit field
667*b1cdbd2cSJim Jagielski 	sal_uInt16	nEntryCount = pLb->GetEntryCount();
668*b1cdbd2cSJim Jagielski 	String	aStrEd( pEd->GetText() );
669*b1cdbd2cSJim Jagielski 	String	aEdUpper = aStrEd;
670*b1cdbd2cSJim Jagielski 	aEdUpper.ToUpperAscii();
671*b1cdbd2cSJim Jagielski 
672*b1cdbd2cSJim Jagielski     if ( (nEntryCount > nFirstCustomPos) && aStrEd.Len() > 0 )
673*b1cdbd2cSJim Jagielski 	{
674*b1cdbd2cSJim Jagielski 		sal_Bool	bFound	= sal_False;
675*b1cdbd2cSJim Jagielski 		String* pSymbol	= NULL;
676*b1cdbd2cSJim Jagielski 		sal_uInt16 i;
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski         for ( i=nFirstCustomPos; i<nEntryCount && !bFound; i++ )
679*b1cdbd2cSJim Jagielski 		{
680*b1cdbd2cSJim Jagielski 			pSymbol = (String*)pLb->GetEntryData( i );
681*b1cdbd2cSJim Jagielski 			bFound  = ( (*pSymbol == aStrEd) || (*pSymbol == aEdUpper) );
682*b1cdbd2cSJim Jagielski 		}
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski         pLb->SelectEntryPos( bFound ? i-1 : nUserDefPos );
685*b1cdbd2cSJim Jagielski 	}
686*b1cdbd2cSJim Jagielski 	else
687*b1cdbd2cSJim Jagielski         pLb->SelectEntryPos( aStrEd.Len() ? nUserDefPos : 0 );
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski 	return 0;
690*b1cdbd2cSJim Jagielski }
691*b1cdbd2cSJim Jagielski 
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski //============================================================================
694*b1cdbd2cSJim Jagielski // globale Funktionen:
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
697*b1cdbd2cSJim Jagielski 
698*b1cdbd2cSJim Jagielski // TODO: It might make sense to move these functions to address.?xx. -kohei
699*b1cdbd2cSJim Jagielski 
lcl_CheckOne_OOO(const String & rStr,bool bIsRow,SCCOLROW & rVal)700*b1cdbd2cSJim Jagielski bool lcl_CheckOne_OOO( const String& rStr, bool bIsRow, SCCOLROW& rVal )
701*b1cdbd2cSJim Jagielski {
702*b1cdbd2cSJim Jagielski 	// Zulaessige Syntax fuer rStr:
703*b1cdbd2cSJim Jagielski 	// Row: [$]1-MAXTAB
704*b1cdbd2cSJim Jagielski 	// Col: [$]A-IV
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski 	String	aStr	= rStr;
707*b1cdbd2cSJim Jagielski 	xub_StrLen nLen = aStr.Len();
708*b1cdbd2cSJim Jagielski 	SCCOLROW	nNum	= 0;
709*b1cdbd2cSJim Jagielski 	sal_Bool	bStrOk  = ( nLen > 0 ) && ( bIsRow ? ( nLen < 6 ) : ( nLen < 4 ) );
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski 	if ( bStrOk )
712*b1cdbd2cSJim Jagielski 	{
713*b1cdbd2cSJim Jagielski 		if ( '$' == aStr.GetChar(0) )
714*b1cdbd2cSJim Jagielski 			aStr.Erase( 0, 1 );
715*b1cdbd2cSJim Jagielski 
716*b1cdbd2cSJim Jagielski 		if ( bIsRow )
717*b1cdbd2cSJim Jagielski 		{
718*b1cdbd2cSJim Jagielski 			bStrOk = CharClass::isAsciiNumeric(aStr);
719*b1cdbd2cSJim Jagielski 
720*b1cdbd2cSJim Jagielski 			if ( bStrOk )
721*b1cdbd2cSJim Jagielski 			{
722*b1cdbd2cSJim Jagielski 				sal_Int32 n = aStr.ToInt32();
723*b1cdbd2cSJim Jagielski 
724*b1cdbd2cSJim Jagielski                 if ( ( bStrOk = (n > 0) && ( n <= MAXROWCOUNT ) ) != sal_False )
725*b1cdbd2cSJim Jagielski 					nNum = static_cast<SCCOLROW>(n - 1);
726*b1cdbd2cSJim Jagielski 			}
727*b1cdbd2cSJim Jagielski 		}
728*b1cdbd2cSJim Jagielski 		else
729*b1cdbd2cSJim Jagielski 		{
730*b1cdbd2cSJim Jagielski             SCCOL nCol = 0;
731*b1cdbd2cSJim Jagielski 			bStrOk = ::AlphaToCol( nCol, aStr);
732*b1cdbd2cSJim Jagielski             nNum = nCol;
733*b1cdbd2cSJim Jagielski 		}
734*b1cdbd2cSJim Jagielski 	}
735*b1cdbd2cSJim Jagielski 
736*b1cdbd2cSJim Jagielski 	if ( bStrOk )
737*b1cdbd2cSJim Jagielski 		rVal = nNum;
738*b1cdbd2cSJim Jagielski 
739*b1cdbd2cSJim Jagielski 	return bStrOk;
740*b1cdbd2cSJim Jagielski }
741*b1cdbd2cSJim Jagielski 
lcl_CheckOne_XL_A1(const String & rStr,bool bIsRow,SCCOLROW & rVal)742*b1cdbd2cSJim Jagielski bool lcl_CheckOne_XL_A1( const String& rStr, bool bIsRow, SCCOLROW& rVal )
743*b1cdbd2cSJim Jagielski {
744*b1cdbd2cSJim Jagielski     // XL A1 style is identical to OOO one for print range formats.
745*b1cdbd2cSJim Jagielski     return lcl_CheckOne_OOO(rStr, bIsRow, rVal);
746*b1cdbd2cSJim Jagielski }
747*b1cdbd2cSJim Jagielski 
lcl_CheckOne_XL_R1C1(const String & rStr,bool bIsRow,SCCOLROW & rVal)748*b1cdbd2cSJim Jagielski bool lcl_CheckOne_XL_R1C1( const String& rStr, bool bIsRow, SCCOLROW& rVal )
749*b1cdbd2cSJim Jagielski {
750*b1cdbd2cSJim Jagielski     xub_StrLen nLen = rStr.Len();
751*b1cdbd2cSJim Jagielski     if (nLen <= 1)
752*b1cdbd2cSJim Jagielski         // There must be at least two characters.
753*b1cdbd2cSJim Jagielski         return false;
754*b1cdbd2cSJim Jagielski 
755*b1cdbd2cSJim Jagielski     const sal_Unicode preUpper = bIsRow ? 'R' : 'C';
756*b1cdbd2cSJim Jagielski     const sal_Unicode preLower = bIsRow ? 'r' : 'c';
757*b1cdbd2cSJim Jagielski     if (rStr.GetChar(0) != preUpper && rStr.GetChar(0) != preLower)
758*b1cdbd2cSJim Jagielski         return false;
759*b1cdbd2cSJim Jagielski 
760*b1cdbd2cSJim Jagielski     String aNumStr = rStr.Copy(1);
761*b1cdbd2cSJim Jagielski     if (!CharClass::isAsciiNumeric(aNumStr))
762*b1cdbd2cSJim Jagielski         return false;
763*b1cdbd2cSJim Jagielski 
764*b1cdbd2cSJim Jagielski     sal_Int32 nNum = aNumStr.ToInt32();
765*b1cdbd2cSJim Jagielski 
766*b1cdbd2cSJim Jagielski     if (nNum <= 0)
767*b1cdbd2cSJim Jagielski         return false;
768*b1cdbd2cSJim Jagielski 
769*b1cdbd2cSJim Jagielski     if ((bIsRow && nNum > MAXROWCOUNT) || (!bIsRow && nNum > MAXCOLCOUNT))
770*b1cdbd2cSJim Jagielski         return false;
771*b1cdbd2cSJim Jagielski 
772*b1cdbd2cSJim Jagielski     rVal = static_cast<SCCOLROW>(nNum-1);
773*b1cdbd2cSJim Jagielski     return true;
774*b1cdbd2cSJim Jagielski }
775*b1cdbd2cSJim Jagielski 
lcl_CheckRepeatOne(const String & rStr,formula::FormulaGrammar::AddressConvention eConv,bool bIsRow,SCCOLROW & rVal)776*b1cdbd2cSJim Jagielski bool lcl_CheckRepeatOne( const String& rStr, formula::FormulaGrammar::AddressConvention eConv, bool bIsRow, SCCOLROW& rVal )
777*b1cdbd2cSJim Jagielski {
778*b1cdbd2cSJim Jagielski     switch (eConv)
779*b1cdbd2cSJim Jagielski     {
780*b1cdbd2cSJim Jagielski         case formula::FormulaGrammar::CONV_OOO:
781*b1cdbd2cSJim Jagielski             return lcl_CheckOne_OOO(rStr, bIsRow, rVal);
782*b1cdbd2cSJim Jagielski         case formula::FormulaGrammar::CONV_XL_A1:
783*b1cdbd2cSJim Jagielski             return lcl_CheckOne_XL_A1(rStr, bIsRow, rVal);
784*b1cdbd2cSJim Jagielski         case formula::FormulaGrammar::CONV_XL_R1C1:
785*b1cdbd2cSJim Jagielski             return lcl_CheckOne_XL_R1C1(rStr, bIsRow, rVal);
786*b1cdbd2cSJim Jagielski         default:
787*b1cdbd2cSJim Jagielski         {
788*b1cdbd2cSJim Jagielski             // added to avoid warnings
789*b1cdbd2cSJim Jagielski         }
790*b1cdbd2cSJim Jagielski     }
791*b1cdbd2cSJim Jagielski     return false;
792*b1cdbd2cSJim Jagielski }
793*b1cdbd2cSJim Jagielski 
lcl_CheckRepeatString(const String & rStr,ScDocument * pDoc,bool bIsRow,ScRange * pRange)794*b1cdbd2cSJim Jagielski bool lcl_CheckRepeatString( const String& rStr, ScDocument* pDoc, bool bIsRow, ScRange* pRange )
795*b1cdbd2cSJim Jagielski {
796*b1cdbd2cSJim Jagielski     // Row: [valid row] rsep [valid row]
797*b1cdbd2cSJim Jagielski     // Col: [valid col] rsep [valid col]
798*b1cdbd2cSJim Jagielski 
799*b1cdbd2cSJim Jagielski     const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
800*b1cdbd2cSJim Jagielski     const sal_Unicode rsep = ScCompiler::GetNativeSymbol(ocRange).GetChar(0);
801*b1cdbd2cSJim Jagielski 
802*b1cdbd2cSJim Jagielski     if (pRange)
803*b1cdbd2cSJim Jagielski     {
804*b1cdbd2cSJim Jagielski         // initialize the range value.
805*b1cdbd2cSJim Jagielski         pRange->aStart.SetCol(0);
806*b1cdbd2cSJim Jagielski         pRange->aStart.SetRow(0);
807*b1cdbd2cSJim Jagielski         pRange->aEnd.SetCol(0);
808*b1cdbd2cSJim Jagielski         pRange->aEnd.SetRow(0);
809*b1cdbd2cSJim Jagielski     }
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski     String aBuf;
812*b1cdbd2cSJim Jagielski     SCCOLROW nVal = 0;
813*b1cdbd2cSJim Jagielski     xub_StrLen nLen = rStr.Len();
814*b1cdbd2cSJim Jagielski     bool bEndPos = false;
815*b1cdbd2cSJim Jagielski     for (xub_StrLen i = 0; i < nLen; ++i)
816*b1cdbd2cSJim Jagielski     {
817*b1cdbd2cSJim Jagielski         const sal_Unicode c = rStr.GetChar(i);
818*b1cdbd2cSJim Jagielski         if (c == rsep)
819*b1cdbd2cSJim Jagielski         {
820*b1cdbd2cSJim Jagielski             if (bEndPos)
821*b1cdbd2cSJim Jagielski                 // We aren't supposed to have more than one range separator.
822*b1cdbd2cSJim Jagielski                 return false;
823*b1cdbd2cSJim Jagielski 
824*b1cdbd2cSJim Jagielski             // range separator
825*b1cdbd2cSJim Jagielski             if (aBuf.Len() == 0)
826*b1cdbd2cSJim Jagielski                 return false;
827*b1cdbd2cSJim Jagielski 
828*b1cdbd2cSJim Jagielski             bool bRes = lcl_CheckRepeatOne(aBuf, eConv, bIsRow, nVal);
829*b1cdbd2cSJim Jagielski             if (!bRes)
830*b1cdbd2cSJim Jagielski                 return false;
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski             if (pRange)
833*b1cdbd2cSJim Jagielski             {
834*b1cdbd2cSJim Jagielski                 if (bIsRow)
835*b1cdbd2cSJim Jagielski                 {
836*b1cdbd2cSJim Jagielski                     pRange->aStart.SetRow(static_cast<SCROW>(nVal));
837*b1cdbd2cSJim Jagielski                     pRange->aEnd.SetRow(static_cast<SCROW>(nVal));
838*b1cdbd2cSJim Jagielski                 }
839*b1cdbd2cSJim Jagielski                 else
840*b1cdbd2cSJim Jagielski                 {
841*b1cdbd2cSJim Jagielski                     pRange->aStart.SetCol(static_cast<SCCOL>(nVal));
842*b1cdbd2cSJim Jagielski                     pRange->aEnd.SetCol(static_cast<SCCOL>(nVal));
843*b1cdbd2cSJim Jagielski                 }
844*b1cdbd2cSJim Jagielski             }
845*b1cdbd2cSJim Jagielski 
846*b1cdbd2cSJim Jagielski             aBuf.Erase();
847*b1cdbd2cSJim Jagielski             bEndPos = true;
848*b1cdbd2cSJim Jagielski         }
849*b1cdbd2cSJim Jagielski         else
850*b1cdbd2cSJim Jagielski             aBuf.Append(c);
851*b1cdbd2cSJim Jagielski     }
852*b1cdbd2cSJim Jagielski 
853*b1cdbd2cSJim Jagielski     if (aBuf.Len() > 0)
854*b1cdbd2cSJim Jagielski     {
855*b1cdbd2cSJim Jagielski         bool bRes = lcl_CheckRepeatOne(aBuf, eConv, bIsRow, nVal);
856*b1cdbd2cSJim Jagielski         if (!bRes)
857*b1cdbd2cSJim Jagielski             return false;
858*b1cdbd2cSJim Jagielski 
859*b1cdbd2cSJim Jagielski         if (pRange)
860*b1cdbd2cSJim Jagielski         {
861*b1cdbd2cSJim Jagielski             if (bIsRow)
862*b1cdbd2cSJim Jagielski             {
863*b1cdbd2cSJim Jagielski                 if (!bEndPos)
864*b1cdbd2cSJim Jagielski                     pRange->aStart.SetRow(static_cast<SCROW>(nVal));
865*b1cdbd2cSJim Jagielski                 pRange->aEnd.SetRow(static_cast<SCROW>(nVal));
866*b1cdbd2cSJim Jagielski             }
867*b1cdbd2cSJim Jagielski             else
868*b1cdbd2cSJim Jagielski             {
869*b1cdbd2cSJim Jagielski                 if (!bEndPos)
870*b1cdbd2cSJim Jagielski                     pRange->aStart.SetCol(static_cast<SCCOL>(nVal));
871*b1cdbd2cSJim Jagielski                 pRange->aEnd.SetCol(static_cast<SCCOL>(nVal));
872*b1cdbd2cSJim Jagielski             }
873*b1cdbd2cSJim Jagielski         }
874*b1cdbd2cSJim Jagielski     }
875*b1cdbd2cSJim Jagielski 
876*b1cdbd2cSJim Jagielski     return true;
877*b1cdbd2cSJim Jagielski }
878*b1cdbd2cSJim Jagielski 
879*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
880*b1cdbd2cSJim Jagielski 
lcl_GetRepeatRangeString(const ScRange * pRange,ScDocument * pDoc,bool bIsRow,String & rStr)881*b1cdbd2cSJim Jagielski void lcl_GetRepeatRangeString( const ScRange* pRange, ScDocument* pDoc, bool bIsRow, String& rStr )
882*b1cdbd2cSJim Jagielski {
883*b1cdbd2cSJim Jagielski     rStr.Erase();
884*b1cdbd2cSJim Jagielski     if (!pRange)
885*b1cdbd2cSJim Jagielski         return;
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski     const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
888*b1cdbd2cSJim Jagielski     const ScAddress& rStart = pRange->aStart;
889*b1cdbd2cSJim Jagielski     const ScAddress& rEnd   = pRange->aEnd;
890*b1cdbd2cSJim Jagielski 
891*b1cdbd2cSJim Jagielski     const sal_uInt16 nFmt = bIsRow ? (SCA_VALID_ROW | SCA_ROW_ABSOLUTE) : (SCA_VALID_COL | SCA_COL_ABSOLUTE);
892*b1cdbd2cSJim Jagielski     String aTmpStr;
893*b1cdbd2cSJim Jagielski     rStart.Format(aTmpStr, nFmt, pDoc, eConv);
894*b1cdbd2cSJim Jagielski     rStr += aTmpStr;
895*b1cdbd2cSJim Jagielski     if ((bIsRow && rStart.Row() != rEnd.Row()) || (!bIsRow && rStart.Col() != rEnd.Col()))
896*b1cdbd2cSJim Jagielski     {
897*b1cdbd2cSJim Jagielski         rStr += ScCompiler::GetNativeSymbol(ocRange);
898*b1cdbd2cSJim Jagielski         rEnd.Format(aTmpStr, nFmt, pDoc, eConv);
899*b1cdbd2cSJim Jagielski         rStr += aTmpStr;
900*b1cdbd2cSJim Jagielski     }
901*b1cdbd2cSJim Jagielski }
902*b1cdbd2cSJim Jagielski 
903