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