xref: /aoo41x/main/sc/source/ui/miscdlgs/anyrefdg.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_sc.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir 
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir //----------------------------------------------------------------------------
34*cdf0e10cSrcweir 
35*cdf0e10cSrcweir #include "rangelst.hxx"
36*cdf0e10cSrcweir #include <sfx2/app.hxx>
37*cdf0e10cSrcweir #include <sfx2/viewsh.hxx>
38*cdf0e10cSrcweir #include <vcl/wrkwin.hxx>
39*cdf0e10cSrcweir #include <vcl/mnemonic.hxx>
40*cdf0e10cSrcweir #include <tools/shl.hxx>
41*cdf0e10cSrcweir #include <svtools/taskbar.hxx>
42*cdf0e10cSrcweir #include <sfx2/bindings.hxx>
43*cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
44*cdf0e10cSrcweir 
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir #define ANYREFDG_CXX
47*cdf0e10cSrcweir #include "anyrefdg.hxx"
48*cdf0e10cSrcweir #undef ANYREFDG_CXX
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir #include "sc.hrc"
51*cdf0e10cSrcweir #include "inputhdl.hxx"
52*cdf0e10cSrcweir #include "scmod.hxx"
53*cdf0e10cSrcweir #include "scresid.hxx"
54*cdf0e10cSrcweir #include "inputwin.hxx"
55*cdf0e10cSrcweir #include "tabvwsh.hxx"
56*cdf0e10cSrcweir #include "docsh.hxx"
57*cdf0e10cSrcweir #include "rfindlst.hxx"
58*cdf0e10cSrcweir #include "compiler.hxx"
59*cdf0e10cSrcweir #include "cell.hxx"
60*cdf0e10cSrcweir #include "global.hxx"
61*cdf0e10cSrcweir #include "inputopt.hxx"
62*cdf0e10cSrcweir #include "rangeutl.hxx"
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir ScFormulaReferenceHelper::ScFormulaReferenceHelper(IAnyRefDialog* _pDlg,SfxBindings* _pBindings)
66*cdf0e10cSrcweir  : m_pDlg(_pDlg)
67*cdf0e10cSrcweir  , pRefEdit (NULL)
68*cdf0e10cSrcweir  , m_pWindow(NULL)
69*cdf0e10cSrcweir  , m_pBindings(_pBindings)
70*cdf0e10cSrcweir  , pAccel( NULL )
71*cdf0e10cSrcweir  , pHiddenMarks(NULL)
72*cdf0e10cSrcweir  , nRefTab(0)
73*cdf0e10cSrcweir  , bHighLightRef( sal_False )
74*cdf0e10cSrcweir  , bAccInserted( sal_False )
75*cdf0e10cSrcweir {
76*cdf0e10cSrcweir     ScInputOptions aInputOption=SC_MOD()->GetInputOptions();
77*cdf0e10cSrcweir 	bEnableColorRef=aInputOption.GetRangeFinder();
78*cdf0e10cSrcweir }
79*cdf0e10cSrcweir // -----------------------------------------------------------------------------
80*cdf0e10cSrcweir ScFormulaReferenceHelper::~ScFormulaReferenceHelper()
81*cdf0e10cSrcweir {
82*cdf0e10cSrcweir     if (bAccInserted)
83*cdf0e10cSrcweir 		Application::RemoveAccel( pAccel.get() );
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir     // common cleanup for ScAnyRefDlg and ScFormulaDlg is done here
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir     HideReference();
88*cdf0e10cSrcweir     enableInput( sal_True );
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir     ScInputHandler* pInputHdl = SC_MOD()->GetInputHdl();
91*cdf0e10cSrcweir     if ( pInputHdl )
92*cdf0e10cSrcweir         pInputHdl->ResetDelayTimer();   // stop the timer for disabling the input line
93*cdf0e10cSrcweir }
94*cdf0e10cSrcweir // -----------------------------------------------------------------------------
95*cdf0e10cSrcweir void ScFormulaReferenceHelper::enableInput( sal_Bool bEnable )
96*cdf0e10cSrcweir {
97*cdf0e10cSrcweir     TypeId aType(TYPE(ScDocShell));
98*cdf0e10cSrcweir     ScDocShell* pDocShell = (ScDocShell*)SfxObjectShell::GetFirst(&aType);
99*cdf0e10cSrcweir     while( pDocShell )
100*cdf0e10cSrcweir     {
101*cdf0e10cSrcweir 	    SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocShell );
102*cdf0e10cSrcweir 	    while( pFrame )
103*cdf0e10cSrcweir 	    {
104*cdf0e10cSrcweir 		    //	#71577# enable everything except InPlace, including bean frames
105*cdf0e10cSrcweir             if ( !pFrame->GetFrame().IsInPlace() )
106*cdf0e10cSrcweir 		    {
107*cdf0e10cSrcweir 			    SfxViewShell* p = pFrame->GetViewShell();
108*cdf0e10cSrcweir 			    ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,p);
109*cdf0e10cSrcweir 			    if(pViewSh!=NULL)
110*cdf0e10cSrcweir 			    {
111*cdf0e10cSrcweir 				    Window *pWin=pViewSh->GetWindow();
112*cdf0e10cSrcweir 				    if(pWin)
113*cdf0e10cSrcweir 				    {
114*cdf0e10cSrcweir 					    Window *pParent=pWin->GetParent();
115*cdf0e10cSrcweir 					    if(pParent)
116*cdf0e10cSrcweir 					    {
117*cdf0e10cSrcweir 						    pParent->EnableInput(bEnable,sal_True /* sal_False */);
118*cdf0e10cSrcweir 						    if(sal_True /*bChilds*/)
119*cdf0e10cSrcweir 							    pViewSh->EnableRefInput(bEnable);
120*cdf0e10cSrcweir 					    }
121*cdf0e10cSrcweir 				    }
122*cdf0e10cSrcweir 			    }
123*cdf0e10cSrcweir 		    }
124*cdf0e10cSrcweir 		    pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell );
125*cdf0e10cSrcweir 	    }
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir 	    pDocShell = (ScDocShell*)SfxObjectShell::GetNext(*pDocShell, &aType);
128*cdf0e10cSrcweir     }
129*cdf0e10cSrcweir }
130*cdf0e10cSrcweir // -----------------------------------------------------------------------------
131*cdf0e10cSrcweir void ScFormulaReferenceHelper::ShowSimpleReference( const XubString& rStr )
132*cdf0e10cSrcweir {
133*cdf0e10cSrcweir     if( /*!pRefEdit &&*/ bEnableColorRef )
134*cdf0e10cSrcweir 	{
135*cdf0e10cSrcweir 		bHighLightRef=sal_True;
136*cdf0e10cSrcweir 		ScViewData* pViewData=ScDocShell::GetViewData();
137*cdf0e10cSrcweir 		if ( pViewData )
138*cdf0e10cSrcweir 		{
139*cdf0e10cSrcweir 			ScDocument* pDoc=pViewData->GetDocument();
140*cdf0e10cSrcweir 			ScTabViewShell*	pTabViewShell=pViewData->GetViewShell();
141*cdf0e10cSrcweir 
142*cdf0e10cSrcweir 			ScRangeList aRangeList;
143*cdf0e10cSrcweir 
144*cdf0e10cSrcweir 			pTabViewShell->DoneRefMode( sal_False );
145*cdf0e10cSrcweir 			pTabViewShell->ClearHighlightRanges();
146*cdf0e10cSrcweir 
147*cdf0e10cSrcweir 			if( ParseWithNames( aRangeList, rStr, pDoc ) )
148*cdf0e10cSrcweir 			{
149*cdf0e10cSrcweir 				ScRange* pRangeEntry = aRangeList.First();
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir 				sal_uInt16 nIndex=0;
152*cdf0e10cSrcweir 				while(pRangeEntry != NULL)
153*cdf0e10cSrcweir 				{
154*cdf0e10cSrcweir 					ColorData aColName = ScRangeFindList::GetColorName(nIndex++);
155*cdf0e10cSrcweir 					pTabViewShell->AddHighlightRange(*pRangeEntry, aColName);
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir 					pRangeEntry = aRangeList.Next();
158*cdf0e10cSrcweir 				}
159*cdf0e10cSrcweir 			}
160*cdf0e10cSrcweir 		}
161*cdf0e10cSrcweir 	}
162*cdf0e10cSrcweir }
163*cdf0e10cSrcweir // -----------------------------------------------------------------------------
164*cdf0e10cSrcweir bool ScFormulaReferenceHelper::ParseWithNames( ScRangeList& rRanges, const String& rStr, ScDocument* pDoc )
165*cdf0e10cSrcweir {
166*cdf0e10cSrcweir     bool bError = false;
167*cdf0e10cSrcweir     rRanges.RemoveAll();
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir     ScAddress::Details aDetails(pDoc->GetAddressConvention(), 0, 0);
170*cdf0e10cSrcweir     ScRangeUtil aRangeUtil;
171*cdf0e10cSrcweir     xub_StrLen nTokenCnt = rStr.GetTokenCount();
172*cdf0e10cSrcweir     for( xub_StrLen nToken = 0; nToken < nTokenCnt; ++nToken )
173*cdf0e10cSrcweir     {
174*cdf0e10cSrcweir         ScRange aRange;
175*cdf0e10cSrcweir         String aRangeStr( rStr.GetToken( nToken ) );
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir         sal_uInt16 nFlags = aRange.ParseAny( aRangeStr, pDoc, aDetails );
178*cdf0e10cSrcweir         if ( nFlags & SCA_VALID )
179*cdf0e10cSrcweir         {
180*cdf0e10cSrcweir             if ( (nFlags & SCA_TAB_3D) == 0 )
181*cdf0e10cSrcweir                 aRange.aStart.SetTab( nRefTab );
182*cdf0e10cSrcweir             if ( (nFlags & SCA_TAB2_3D) == 0 )
183*cdf0e10cSrcweir                 aRange.aEnd.SetTab( aRange.aStart.Tab() );
184*cdf0e10cSrcweir             rRanges.Append( aRange );
185*cdf0e10cSrcweir         }
186*cdf0e10cSrcweir         else if ( aRangeUtil.MakeRangeFromName( aRangeStr, pDoc, nRefTab, aRange, RUTL_NAMES, aDetails ) )
187*cdf0e10cSrcweir             rRanges.Append( aRange );
188*cdf0e10cSrcweir         else
189*cdf0e10cSrcweir             bError = true;
190*cdf0e10cSrcweir     }
191*cdf0e10cSrcweir 
192*cdf0e10cSrcweir     return !bError;
193*cdf0e10cSrcweir }
194*cdf0e10cSrcweir // -----------------------------------------------------------------------------
195*cdf0e10cSrcweir void ScFormulaReferenceHelper::ShowFormulaReference( const XubString& rStr )
196*cdf0e10cSrcweir {
197*cdf0e10cSrcweir     if( /*!pRefEdit &&*/ bEnableColorRef)
198*cdf0e10cSrcweir 	{
199*cdf0e10cSrcweir 		bHighLightRef=sal_True;
200*cdf0e10cSrcweir 		ScViewData* pViewData=ScDocShell::GetViewData();
201*cdf0e10cSrcweir 		if ( pViewData && pRefComp.get() )
202*cdf0e10cSrcweir 		{
203*cdf0e10cSrcweir 			ScTabViewShell*	pTabViewShell=pViewData->GetViewShell();
204*cdf0e10cSrcweir 			SCCOL nCol = pViewData->GetCurX();
205*cdf0e10cSrcweir 			SCROW nRow = pViewData->GetCurY();
206*cdf0e10cSrcweir 			SCTAB nTab = pViewData->GetTabNo();
207*cdf0e10cSrcweir 			ScAddress aPos( nCol, nRow, nTab );
208*cdf0e10cSrcweir 
209*cdf0e10cSrcweir 			ScTokenArray* pScTokA=pRefComp->CompileString(rStr);
210*cdf0e10cSrcweir 			//pRefComp->CompileTokenArray();
211*cdf0e10cSrcweir 
212*cdf0e10cSrcweir 			if(pTabViewShell!=NULL && pScTokA!=NULL)
213*cdf0e10cSrcweir 			{
214*cdf0e10cSrcweir 				pTabViewShell->DoneRefMode( sal_False );
215*cdf0e10cSrcweir 				pTabViewShell->ClearHighlightRanges();
216*cdf0e10cSrcweir 
217*cdf0e10cSrcweir 				pScTokA->Reset();
218*cdf0e10cSrcweir 				const ScToken* pToken = static_cast<const ScToken*>(pScTokA->GetNextReference());
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir 				sal_uInt16 nIndex=0;
221*cdf0e10cSrcweir 
222*cdf0e10cSrcweir 				while(pToken!=NULL)
223*cdf0e10cSrcweir 				{
224*cdf0e10cSrcweir 					sal_Bool bDoubleRef=(pToken->GetType()==formula::svDoubleRef);
225*cdf0e10cSrcweir 
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir 					if(pToken->GetType()==formula::svSingleRef || bDoubleRef)
228*cdf0e10cSrcweir 					{
229*cdf0e10cSrcweir 						ScRange aRange;
230*cdf0e10cSrcweir 						if(bDoubleRef)
231*cdf0e10cSrcweir 						{
232*cdf0e10cSrcweir 							ScComplexRefData aRef( pToken->GetDoubleRef() );
233*cdf0e10cSrcweir 							aRef.CalcAbsIfRel( aPos );
234*cdf0e10cSrcweir 							aRange.aStart.Set( aRef.Ref1.nCol, aRef.Ref1.nRow, aRef.Ref1.nTab );
235*cdf0e10cSrcweir 							aRange.aEnd.Set( aRef.Ref2.nCol, aRef.Ref2.nRow, aRef.Ref2.nTab );
236*cdf0e10cSrcweir 						}
237*cdf0e10cSrcweir 						else
238*cdf0e10cSrcweir 						{
239*cdf0e10cSrcweir 							ScSingleRefData aRef( pToken->GetSingleRef() );
240*cdf0e10cSrcweir 							aRef.CalcAbsIfRel( aPos );
241*cdf0e10cSrcweir 							aRange.aStart.Set( aRef.nCol, aRef.nRow, aRef.nTab );
242*cdf0e10cSrcweir 							aRange.aEnd = aRange.aStart;
243*cdf0e10cSrcweir 						}
244*cdf0e10cSrcweir 						ColorData aColName=ScRangeFindList::GetColorName(nIndex++);
245*cdf0e10cSrcweir 						pTabViewShell->AddHighlightRange(aRange, aColName);
246*cdf0e10cSrcweir 					}
247*cdf0e10cSrcweir 
248*cdf0e10cSrcweir 					pToken = static_cast<const ScToken*>(pScTokA->GetNextReference());
249*cdf0e10cSrcweir 				}
250*cdf0e10cSrcweir 			}
251*cdf0e10cSrcweir 			if(pScTokA!=NULL) delete pScTokA;
252*cdf0e10cSrcweir 		}
253*cdf0e10cSrcweir 	}
254*cdf0e10cSrcweir }
255*cdf0e10cSrcweir // -----------------------------------------------------------------------------
256*cdf0e10cSrcweir void ScFormulaReferenceHelper::HideReference( sal_Bool bDoneRefMode )
257*cdf0e10cSrcweir {
258*cdf0e10cSrcweir 	ScViewData* pViewData=ScDocShell::GetViewData();
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir     if( pViewData && /*!pRefEdit &&*/ bHighLightRef && bEnableColorRef)
261*cdf0e10cSrcweir 	{
262*cdf0e10cSrcweir 		ScTabViewShell*	pTabViewShell=pViewData->GetViewShell();
263*cdf0e10cSrcweir 
264*cdf0e10cSrcweir 		if(pTabViewShell!=NULL)
265*cdf0e10cSrcweir 		{
266*cdf0e10cSrcweir 			//	bDoneRefMode is sal_False when called from before SetReference.
267*cdf0e10cSrcweir 			//	In that case, RefMode was just started and must not be ended now.
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir 			if ( bDoneRefMode )
270*cdf0e10cSrcweir 				pTabViewShell->DoneRefMode( sal_False );
271*cdf0e10cSrcweir 			pTabViewShell->ClearHighlightRanges();
272*cdf0e10cSrcweir 		}
273*cdf0e10cSrcweir 		bHighLightRef=sal_False;
274*cdf0e10cSrcweir 	}
275*cdf0e10cSrcweir }
276*cdf0e10cSrcweir // -----------------------------------------------------------------------------
277*cdf0e10cSrcweir void ScFormulaReferenceHelper::ShowReference( const XubString& rStr )
278*cdf0e10cSrcweir {
279*cdf0e10cSrcweir     if( /*!pRefEdit &&*/ bEnableColorRef )
280*cdf0e10cSrcweir 	{
281*cdf0e10cSrcweir 		if(	rStr.Search('(')!=STRING_NOTFOUND ||
282*cdf0e10cSrcweir 			rStr.Search('+')!=STRING_NOTFOUND ||
283*cdf0e10cSrcweir 			rStr.Search('*')!=STRING_NOTFOUND ||
284*cdf0e10cSrcweir 			rStr.Search('-')!=STRING_NOTFOUND ||
285*cdf0e10cSrcweir 			rStr.Search('/')!=STRING_NOTFOUND ||
286*cdf0e10cSrcweir 			rStr.Search('&')!=STRING_NOTFOUND ||
287*cdf0e10cSrcweir 			rStr.Search('<')!=STRING_NOTFOUND ||
288*cdf0e10cSrcweir 			rStr.Search('>')!=STRING_NOTFOUND ||
289*cdf0e10cSrcweir 			rStr.Search('=')!=STRING_NOTFOUND ||
290*cdf0e10cSrcweir 			rStr.Search('^')!=STRING_NOTFOUND)
291*cdf0e10cSrcweir 		{
292*cdf0e10cSrcweir 			ShowFormulaReference(rStr);
293*cdf0e10cSrcweir 		}
294*cdf0e10cSrcweir 		else
295*cdf0e10cSrcweir 		{
296*cdf0e10cSrcweir 			ShowSimpleReference(rStr);
297*cdf0e10cSrcweir 		}
298*cdf0e10cSrcweir 	}
299*cdf0e10cSrcweir }
300*cdf0e10cSrcweir // -----------------------------------------------------------------------------
301*cdf0e10cSrcweir void ScFormulaReferenceHelper::ReleaseFocus( formula::RefEdit* pEdit, formula::RefButton* pButton )
302*cdf0e10cSrcweir {
303*cdf0e10cSrcweir     if( !pRefEdit && pEdit )
304*cdf0e10cSrcweir     {
305*cdf0e10cSrcweir         m_pDlg->RefInputStart( pEdit, pButton );
306*cdf0e10cSrcweir //        if( pRefEdit )
307*cdf0e10cSrcweir //            pRefEdit->SilentGrabFocus();
308*cdf0e10cSrcweir     }
309*cdf0e10cSrcweir 
310*cdf0e10cSrcweir     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
311*cdf0e10cSrcweir     if( pViewShell )
312*cdf0e10cSrcweir     {
313*cdf0e10cSrcweir         pViewShell->ActiveGrabFocus();
314*cdf0e10cSrcweir         if( pRefEdit )
315*cdf0e10cSrcweir         {
316*cdf0e10cSrcweir             const ScViewData* pViewData = pViewShell->GetViewData();
317*cdf0e10cSrcweir             ScDocument* pDoc = pViewData->GetDocument();
318*cdf0e10cSrcweir 			ScRangeList aRangeList;
319*cdf0e10cSrcweir             if( ParseWithNames( aRangeList, pRefEdit->GetText(), pDoc ) )
320*cdf0e10cSrcweir 			{
321*cdf0e10cSrcweir                 const ScRange* pRange = aRangeList.GetObject( 0 );
322*cdf0e10cSrcweir                 if( pRange )
323*cdf0e10cSrcweir                 {
324*cdf0e10cSrcweir                     pViewShell->SetTabNo( pRange->aStart.Tab() );
325*cdf0e10cSrcweir                     pViewShell->MoveCursorAbs(  pRange->aStart.Col(),
326*cdf0e10cSrcweir                         pRange->aStart.Row(), SC_FOLLOW_JUMP, sal_False, sal_False );
327*cdf0e10cSrcweir                     pViewShell->MoveCursorAbs( pRange->aEnd.Col(),
328*cdf0e10cSrcweir                         pRange->aEnd.Row(), SC_FOLLOW_JUMP, sal_True, sal_False );
329*cdf0e10cSrcweir                     m_pDlg->SetReference( *pRange, pDoc );
330*cdf0e10cSrcweir                 }
331*cdf0e10cSrcweir             }
332*cdf0e10cSrcweir         }
333*cdf0e10cSrcweir     }
334*cdf0e10cSrcweir }
335*cdf0e10cSrcweir // -----------------------------------------------------------------------------
336*cdf0e10cSrcweir void ScFormulaReferenceHelper::Init()
337*cdf0e10cSrcweir {
338*cdf0e10cSrcweir     ScViewData* pViewData=ScDocShell::GetViewData();    //! use pScViewShell?
339*cdf0e10cSrcweir 	if ( pViewData )
340*cdf0e10cSrcweir 	{
341*cdf0e10cSrcweir 		ScDocument* pDoc = pViewData->GetDocument();
342*cdf0e10cSrcweir 		SCCOL nCol = pViewData->GetCurX();
343*cdf0e10cSrcweir 		SCROW nRow = pViewData->GetCurY();
344*cdf0e10cSrcweir 		SCTAB nTab = pViewData->GetTabNo();
345*cdf0e10cSrcweir 		ScAddress aCursorPos( nCol, nRow, nTab );
346*cdf0e10cSrcweir 
347*cdf0e10cSrcweir 		String rStrExp;
348*cdf0e10cSrcweir 		pRefCell.reset( new ScFormulaCell( pDoc, aCursorPos, rStrExp ) );
349*cdf0e10cSrcweir 		pRefComp.reset( new ScCompiler( pDoc, aCursorPos) );
350*cdf0e10cSrcweir         pRefComp->SetGrammar( pDoc->GetGrammar() );
351*cdf0e10cSrcweir 		pRefComp->SetCompileForFAP(sal_True);
352*cdf0e10cSrcweir 
353*cdf0e10cSrcweir         nRefTab = nTab;
354*cdf0e10cSrcweir 	} // if ( pViewData )
355*cdf0e10cSrcweir }
356*cdf0e10cSrcweir // -----------------------------------------------------------------------------
357*cdf0e10cSrcweir IMPL_LINK( ScFormulaReferenceHelper, AccelSelectHdl, Accelerator *, pSelAccel )
358*cdf0e10cSrcweir {
359*cdf0e10cSrcweir     if ( !pSelAccel )
360*cdf0e10cSrcweir 		return 0;
361*cdf0e10cSrcweir 
362*cdf0e10cSrcweir     switch ( pSelAccel->GetCurKeyCode().GetCode() )
363*cdf0e10cSrcweir 	{
364*cdf0e10cSrcweir 		case KEY_RETURN:
365*cdf0e10cSrcweir 		case KEY_ESCAPE:
366*cdf0e10cSrcweir             if( pRefEdit )
367*cdf0e10cSrcweir                 pRefEdit->GrabFocus();
368*cdf0e10cSrcweir             m_pDlg->RefInputDone( sal_True );
369*cdf0e10cSrcweir         break;
370*cdf0e10cSrcweir 	}
371*cdf0e10cSrcweir 	return sal_True;
372*cdf0e10cSrcweir }
373*cdf0e10cSrcweir //----------------------------------------------------------------------------
374*cdf0e10cSrcweir void ScFormulaReferenceHelper::RefInputDone( sal_Bool bForced )
375*cdf0e10cSrcweir {
376*cdf0e10cSrcweir 	//<!--Modified by PengYunQuan for Validity Cell Range Picker
377*cdf0e10cSrcweir 	//if (pRefEdit && (bForced || !pRefBtn))
378*cdf0e10cSrcweir 	if ( CanInputDone( bForced ) )//if (pRefEdit && (bForced || !pRefBtn))
379*cdf0e10cSrcweir 	//-->Modified by PengYunQuan for Validity Cell Range Picker
380*cdf0e10cSrcweir 	{
381*cdf0e10cSrcweir 		if (bAccInserted)			// Accelerator wieder abschalten
382*cdf0e10cSrcweir 		{
383*cdf0e10cSrcweir 			Application::RemoveAccel( pAccel.get() );
384*cdf0e10cSrcweir 			bAccInserted = sal_False;
385*cdf0e10cSrcweir 		}
386*cdf0e10cSrcweir 
387*cdf0e10cSrcweir 		// Fenstertitel anpassen
388*cdf0e10cSrcweir 		m_pWindow->SetText(sOldDialogText);
389*cdf0e10cSrcweir 
390*cdf0e10cSrcweir 		// Fenster wieder gross
391*cdf0e10cSrcweir 		m_pWindow->SetOutputSizePixel(aOldDialogSize);
392*cdf0e10cSrcweir 
393*cdf0e10cSrcweir 		// pEditCell an alte Position
394*cdf0e10cSrcweir 		pRefEdit->SetPosSizePixel(aOldEditPos, aOldEditSize);
395*cdf0e10cSrcweir 
396*cdf0e10cSrcweir         // set button position and image
397*cdf0e10cSrcweir         if( pRefBtn )
398*cdf0e10cSrcweir         {
399*cdf0e10cSrcweir             pRefBtn->SetPosPixel( aOldButtonPos );
400*cdf0e10cSrcweir             pRefBtn->SetStartImage();
401*cdf0e10cSrcweir         }
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir 		// Alle anderen: Show();
404*cdf0e10cSrcweir 		sal_uInt16 nChildren = m_pWindow->GetChildCount();
405*cdf0e10cSrcweir 		for ( sal_uInt16 i = 0; i < nChildren; i++ )
406*cdf0e10cSrcweir 			if (pHiddenMarks[i])
407*cdf0e10cSrcweir 			{
408*cdf0e10cSrcweir 				m_pWindow->GetChild(i)->GetWindow( WINDOW_CLIENT )->Show();
409*cdf0e10cSrcweir 			}
410*cdf0e10cSrcweir 		delete [] pHiddenMarks;
411*cdf0e10cSrcweir 
412*cdf0e10cSrcweir 		pRefEdit = NULL;
413*cdf0e10cSrcweir         pRefBtn = NULL;
414*cdf0e10cSrcweir 	}
415*cdf0e10cSrcweir }
416*cdf0e10cSrcweir // -----------------------------------------------------------------------------
417*cdf0e10cSrcweir void ScFormulaReferenceHelper::RefInputStart( formula::RefEdit* pEdit, formula::RefButton* pButton )
418*cdf0e10cSrcweir {
419*cdf0e10cSrcweir 	if (!pRefEdit)
420*cdf0e10cSrcweir 	{
421*cdf0e10cSrcweir 		pRefEdit = pEdit;
422*cdf0e10cSrcweir 		pRefBtn  = pButton;
423*cdf0e10cSrcweir 
424*cdf0e10cSrcweir 		// Neuen Fenstertitel basteln
425*cdf0e10cSrcweir 		String sNewDialogText;
426*cdf0e10cSrcweir 		sOldDialogText = m_pWindow->GetText();
427*cdf0e10cSrcweir 		sNewDialogText  = sOldDialogText;
428*cdf0e10cSrcweir 		sNewDialogText.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ": " ));
429*cdf0e10cSrcweir 
430*cdf0e10cSrcweir 		// Alle Elemente ausser EditCell und Button verstecken
431*cdf0e10cSrcweir 		sal_uInt16 nChildren = m_pWindow->GetChildCount();
432*cdf0e10cSrcweir 		pHiddenMarks = new sal_Bool [nChildren];
433*cdf0e10cSrcweir 		for (sal_uInt16 i = 0; i < nChildren; i++)
434*cdf0e10cSrcweir 		{
435*cdf0e10cSrcweir 			pHiddenMarks[i] = sal_False;
436*cdf0e10cSrcweir 			Window* pWin = m_pWindow->GetChild(i);
437*cdf0e10cSrcweir 			pWin = pWin->GetWindow( WINDOW_CLIENT );
438*cdf0e10cSrcweir 			if (pWin == (Window*)pRefEdit)
439*cdf0e10cSrcweir 			{
440*cdf0e10cSrcweir 				sNewDialogText += m_pWindow->GetChild(i-1)->GetWindow( WINDOW_CLIENT )->GetText();
441*cdf0e10cSrcweir 			}
442*cdf0e10cSrcweir 			else if (pWin == (Window*)pRefBtn)
443*cdf0e10cSrcweir 				;	// do nothing
444*cdf0e10cSrcweir 			else if (pWin->IsVisible())
445*cdf0e10cSrcweir 			{
446*cdf0e10cSrcweir 				pHiddenMarks[i] = sal_True;
447*cdf0e10cSrcweir 				pWin->Hide();
448*cdf0e10cSrcweir 			}
449*cdf0e10cSrcweir 		}
450*cdf0e10cSrcweir 
451*cdf0e10cSrcweir 		// Alte Daten merken
452*cdf0e10cSrcweir 		aOldDialogSize = m_pWindow->GetOutputSizePixel();
453*cdf0e10cSrcweir 		aOldEditPos = pRefEdit->GetPosPixel();
454*cdf0e10cSrcweir 		aOldEditSize = pRefEdit->GetSizePixel();
455*cdf0e10cSrcweir 		if (pRefBtn)
456*cdf0e10cSrcweir 			aOldButtonPos = pRefBtn->GetPosPixel();
457*cdf0e10cSrcweir 
458*cdf0e10cSrcweir 		// Edit-Feld verschieben und anpassen
459*cdf0e10cSrcweir 		Size aNewDlgSize(aOldDialogSize.Width(), aOldEditSize.Height());
460*cdf0e10cSrcweir 		Size aNewEditSize(aNewDlgSize);
461*cdf0e10cSrcweir         long nOffset = 0;
462*cdf0e10cSrcweir 		if (pRefBtn)
463*cdf0e10cSrcweir 		{
464*cdf0e10cSrcweir 			aNewEditSize.Width() -= pRefBtn->GetSizePixel().Width();
465*cdf0e10cSrcweir 			aNewEditSize.Width() -= aOldButtonPos.X() - (aOldEditPos.X()+aOldEditSize.Width());
466*cdf0e10cSrcweir 
467*cdf0e10cSrcweir             long nHeight = pRefBtn->GetSizePixel().Height();
468*cdf0e10cSrcweir             if ( nHeight > aOldEditSize.Height() )
469*cdf0e10cSrcweir             {
470*cdf0e10cSrcweir                 aNewDlgSize.Height() = nHeight;
471*cdf0e10cSrcweir                 nOffset = (nHeight-aOldEditSize.Height()) / 2;
472*cdf0e10cSrcweir             }
473*cdf0e10cSrcweir             aNewEditSize.Width() -= nOffset;
474*cdf0e10cSrcweir 		}
475*cdf0e10cSrcweir 		pRefEdit->SetPosSizePixel(Point(nOffset, nOffset), aNewEditSize);
476*cdf0e10cSrcweir 
477*cdf0e10cSrcweir         // set button position and image
478*cdf0e10cSrcweir         if( pRefBtn )
479*cdf0e10cSrcweir         {
480*cdf0e10cSrcweir             pRefBtn->SetPosPixel( Point( aOldDialogSize.Width() - pRefBtn->GetSizePixel().Width(), 0 ) );
481*cdf0e10cSrcweir             pRefBtn->SetEndImage();
482*cdf0e10cSrcweir         }
483*cdf0e10cSrcweir 
484*cdf0e10cSrcweir 		// Fenster verkleinern
485*cdf0e10cSrcweir 		m_pWindow->SetOutputSizePixel(aNewDlgSize);
486*cdf0e10cSrcweir 
487*cdf0e10cSrcweir 		// Fenstertitel anpassen
488*cdf0e10cSrcweir 		m_pWindow->SetText( MnemonicGenerator::EraseAllMnemonicChars( sNewDialogText ) );
489*cdf0e10cSrcweir 
490*cdf0e10cSrcweir //        if ( pButton )      // ueber den Button: Enter und Escape abfangen
491*cdf0e10cSrcweir //        {
492*cdf0e10cSrcweir 			if (!pAccel.get())
493*cdf0e10cSrcweir 			{
494*cdf0e10cSrcweir 				pAccel.reset( new Accelerator );
495*cdf0e10cSrcweir 				pAccel->InsertItem( 1, KeyCode( KEY_RETURN ) );
496*cdf0e10cSrcweir 				pAccel->InsertItem( 2, KeyCode( KEY_ESCAPE ) );
497*cdf0e10cSrcweir 				pAccel->SetSelectHdl( LINK( this, ScFormulaReferenceHelper, AccelSelectHdl ) );
498*cdf0e10cSrcweir 			}
499*cdf0e10cSrcweir 			Application::InsertAccel( pAccel.get() );
500*cdf0e10cSrcweir 			bAccInserted = sal_True;
501*cdf0e10cSrcweir //        }
502*cdf0e10cSrcweir 	}
503*cdf0e10cSrcweir }
504*cdf0e10cSrcweir // -----------------------------------------------------------------------------
505*cdf0e10cSrcweir void ScFormulaReferenceHelper::ToggleCollapsed( formula::RefEdit* pEdit, formula::RefButton* pButton )
506*cdf0e10cSrcweir {
507*cdf0e10cSrcweir     if( pEdit )
508*cdf0e10cSrcweir     {
509*cdf0e10cSrcweir         if( pRefEdit == pEdit )                 // is this the active ref edit field?
510*cdf0e10cSrcweir         {
511*cdf0e10cSrcweir             pRefEdit->GrabFocus();              // before RefInputDone()
512*cdf0e10cSrcweir             m_pDlg->RefInputDone( sal_True );               // finish ref input
513*cdf0e10cSrcweir         }
514*cdf0e10cSrcweir         else
515*cdf0e10cSrcweir         {
516*cdf0e10cSrcweir             m_pDlg->RefInputDone( sal_True );               // another active ref edit?
517*cdf0e10cSrcweir             m_pDlg->RefInputStart( pEdit, pButton );    // start ref input
518*cdf0e10cSrcweir             // pRefEdit might differ from pEdit after RefInputStart() (i.e. ScFormulaDlg)
519*cdf0e10cSrcweir             if( pRefEdit )
520*cdf0e10cSrcweir                 pRefEdit->GrabFocus();
521*cdf0e10cSrcweir         }
522*cdf0e10cSrcweir     }
523*cdf0e10cSrcweir }
524*cdf0e10cSrcweir // -----------------------------------------------------------------------------
525*cdf0e10cSrcweir sal_Bool ScFormulaReferenceHelper::DoClose( sal_uInt16 nId )
526*cdf0e10cSrcweir {
527*cdf0e10cSrcweir 	SfxApplication* pSfxApp = SFX_APP();
528*cdf0e10cSrcweir 
529*cdf0e10cSrcweir 	SetDispatcherLock( sal_False );			//! here and in dtor ?
530*cdf0e10cSrcweir 
531*cdf0e10cSrcweir 	SfxViewFrame* pViewFrm = SfxViewFrame::Current();
532*cdf0e10cSrcweir 	if ( pViewFrm && pViewFrm->HasChildWindow(FID_INPUTLINE_STATUS) )
533*cdf0e10cSrcweir 	{
534*cdf0e10cSrcweir 		//	Die Eingabezeile wird per ToolBox::Disable disabled, muss darum auch
535*cdf0e10cSrcweir 		//	per ToolBox::Enable wieder aktiviert werden (vor dem Enable des AppWindow),
536*cdf0e10cSrcweir 		//	damit die Buttons auch wieder enabled gezeichnet werden.
537*cdf0e10cSrcweir 		SfxChildWindow* pChild = pViewFrm->GetChildWindow(FID_INPUTLINE_STATUS);
538*cdf0e10cSrcweir 		if (pChild)
539*cdf0e10cSrcweir 		{
540*cdf0e10cSrcweir 			ScInputWindow* pWin = (ScInputWindow*)pChild->GetWindow();
541*cdf0e10cSrcweir 			pWin->Enable();
542*cdf0e10cSrcweir 		}
543*cdf0e10cSrcweir 	}
544*cdf0e10cSrcweir 
545*cdf0e10cSrcweir 	// find parent view frame to close dialog
546*cdf0e10cSrcweir 	SfxViewFrame* pMyViewFrm = NULL;
547*cdf0e10cSrcweir 	if ( m_pBindings )
548*cdf0e10cSrcweir 	{
549*cdf0e10cSrcweir 		SfxDispatcher* pMyDisp = m_pBindings->GetDispatcher();
550*cdf0e10cSrcweir 		if (pMyDisp)
551*cdf0e10cSrcweir 			pMyViewFrm = pMyDisp->GetFrame();
552*cdf0e10cSrcweir 	}
553*cdf0e10cSrcweir 	SC_MOD()->SetRefDialog( nId, sal_False, pMyViewFrm );
554*cdf0e10cSrcweir 
555*cdf0e10cSrcweir 	pSfxApp->Broadcast( SfxSimpleHint( FID_KILLEDITVIEW ) );
556*cdf0e10cSrcweir 
557*cdf0e10cSrcweir     ScTabViewShell* pScViewShell = ScTabViewShell::GetActiveViewShell();
558*cdf0e10cSrcweir 	if ( pScViewShell )
559*cdf0e10cSrcweir 		pScViewShell->UpdateInputHandler(sal_True);
560*cdf0e10cSrcweir 
561*cdf0e10cSrcweir 	return sal_True;
562*cdf0e10cSrcweir }
563*cdf0e10cSrcweir void ScFormulaReferenceHelper::SetDispatcherLock( sal_Bool bLock )
564*cdf0e10cSrcweir {
565*cdf0e10cSrcweir 	//	lock / unlock only the dispatchers of Calc documents
566*cdf0e10cSrcweir 
567*cdf0e10cSrcweir 	TypeId aType(TYPE(ScDocShell));
568*cdf0e10cSrcweir 	ScDocShell* pDocShell = (ScDocShell*)SfxObjectShell::GetFirst(&aType);
569*cdf0e10cSrcweir 	while( pDocShell )
570*cdf0e10cSrcweir 	{
571*cdf0e10cSrcweir 		SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocShell );
572*cdf0e10cSrcweir 		while( pFrame )
573*cdf0e10cSrcweir 		{
574*cdf0e10cSrcweir 			SfxDispatcher* pDisp = pFrame->GetDispatcher();
575*cdf0e10cSrcweir 			if (pDisp)
576*cdf0e10cSrcweir 				pDisp->Lock( bLock );
577*cdf0e10cSrcweir 
578*cdf0e10cSrcweir 			pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell );
579*cdf0e10cSrcweir 		}
580*cdf0e10cSrcweir 		pDocShell = (ScDocShell*)SfxObjectShell::GetNext(*pDocShell, &aType);
581*cdf0e10cSrcweir 	}
582*cdf0e10cSrcweir 
583*cdf0e10cSrcweir 	//	if a new view is created while the dialog is open,
584*cdf0e10cSrcweir 	//	that view's dispatcher is locked when trying to create the dialog
585*cdf0e10cSrcweir 	//	for that view (ScTabViewShell::CreateRefDialog)
586*cdf0e10cSrcweir }
587*cdf0e10cSrcweir // -----------------------------------------------------------------------------
588*cdf0e10cSrcweir void ScFormulaReferenceHelper::ViewShellChanged(ScTabViewShell* /* pScViewShell */)
589*cdf0e10cSrcweir {
590*cdf0e10cSrcweir 	enableInput( sal_False );
591*cdf0e10cSrcweir 
592*cdf0e10cSrcweir 	EnableSpreadsheets();
593*cdf0e10cSrcweir }
594*cdf0e10cSrcweir void ScFormulaReferenceHelper::EnableSpreadsheets(sal_Bool bFlag, sal_Bool bChilds)
595*cdf0e10cSrcweir {
596*cdf0e10cSrcweir 	TypeId aType(TYPE(ScDocShell));
597*cdf0e10cSrcweir 	ScDocShell* pDocShell = (ScDocShell*)SfxObjectShell::GetFirst(&aType);
598*cdf0e10cSrcweir 	while( pDocShell )
599*cdf0e10cSrcweir 	{
600*cdf0e10cSrcweir 		SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocShell );
601*cdf0e10cSrcweir 		while( pFrame )
602*cdf0e10cSrcweir 		{
603*cdf0e10cSrcweir 			//	#71577# enable everything except InPlace, including bean frames
604*cdf0e10cSrcweir             if ( !pFrame->GetFrame().IsInPlace() )
605*cdf0e10cSrcweir 			{
606*cdf0e10cSrcweir 				SfxViewShell* p = pFrame->GetViewShell();
607*cdf0e10cSrcweir 				ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,p);
608*cdf0e10cSrcweir 				if(pViewSh!=NULL)
609*cdf0e10cSrcweir 				{
610*cdf0e10cSrcweir 					Window *pWin=pViewSh->GetWindow();
611*cdf0e10cSrcweir 					if(pWin)
612*cdf0e10cSrcweir 					{
613*cdf0e10cSrcweir 						Window *pParent=pWin->GetParent();
614*cdf0e10cSrcweir 						if(pParent)
615*cdf0e10cSrcweir 						{
616*cdf0e10cSrcweir 							pParent->EnableInput(bFlag,sal_False);
617*cdf0e10cSrcweir 							if(bChilds)
618*cdf0e10cSrcweir 								pViewSh->EnableRefInput(bFlag);
619*cdf0e10cSrcweir 						}
620*cdf0e10cSrcweir 					}
621*cdf0e10cSrcweir 				}
622*cdf0e10cSrcweir 			}
623*cdf0e10cSrcweir 			pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell );
624*cdf0e10cSrcweir 		}
625*cdf0e10cSrcweir 
626*cdf0e10cSrcweir 		pDocShell = (ScDocShell*)SfxObjectShell::GetNext(*pDocShell, &aType);
627*cdf0e10cSrcweir 	}
628*cdf0e10cSrcweir }
629*cdf0e10cSrcweir 
630*cdf0e10cSrcweir //----------------------------------------------------------------------------
631*cdf0e10cSrcweir 
632*cdf0e10cSrcweir 
633*cdf0e10cSrcweir 
634*cdf0e10cSrcweir void lcl_InvalidateWindows()
635*cdf0e10cSrcweir {
636*cdf0e10cSrcweir 	TypeId aType(TYPE(ScDocShell));
637*cdf0e10cSrcweir 	ScDocShell* pDocShell = (ScDocShell*)SfxObjectShell::GetFirst(&aType);
638*cdf0e10cSrcweir 	while( pDocShell )
639*cdf0e10cSrcweir 	{
640*cdf0e10cSrcweir 		SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocShell );
641*cdf0e10cSrcweir 		while( pFrame )
642*cdf0e10cSrcweir 		{
643*cdf0e10cSrcweir 			//	#71577# enable everything except InPlace, including bean frames
644*cdf0e10cSrcweir             if ( !pFrame->GetFrame().IsInPlace() )
645*cdf0e10cSrcweir 			{
646*cdf0e10cSrcweir 				SfxViewShell* p = pFrame->GetViewShell();
647*cdf0e10cSrcweir 				ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,p);
648*cdf0e10cSrcweir 				if(pViewSh!=NULL)
649*cdf0e10cSrcweir 				{
650*cdf0e10cSrcweir 					Window *pWin=pViewSh->GetWindow();
651*cdf0e10cSrcweir 					if(pWin)
652*cdf0e10cSrcweir 					{
653*cdf0e10cSrcweir 						Window *pParent=pWin->GetParent();
654*cdf0e10cSrcweir 						if(pParent)
655*cdf0e10cSrcweir 							pParent->Invalidate();
656*cdf0e10cSrcweir 					}
657*cdf0e10cSrcweir 				}
658*cdf0e10cSrcweir 			}
659*cdf0e10cSrcweir 			pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell );
660*cdf0e10cSrcweir 		}
661*cdf0e10cSrcweir 
662*cdf0e10cSrcweir 		pDocShell = (ScDocShell*)SfxObjectShell::GetNext(*pDocShell, &aType);
663*cdf0e10cSrcweir 	}
664*cdf0e10cSrcweir }
665*cdf0e10cSrcweir //----------------------------------------------------------------------------
666*cdf0e10cSrcweir 
667*cdf0e10cSrcweir void lcl_HideAllReferences()
668*cdf0e10cSrcweir {
669*cdf0e10cSrcweir 	TypeId aScType = TYPE(ScTabViewShell);
670*cdf0e10cSrcweir 	SfxViewShell* pSh = SfxViewShell::GetFirst( &aScType );
671*cdf0e10cSrcweir 	while ( pSh )
672*cdf0e10cSrcweir 	{
673*cdf0e10cSrcweir 		((ScTabViewShell*)pSh)->ClearHighlightRanges();
674*cdf0e10cSrcweir 		pSh = SfxViewShell::GetNext( *pSh, &aScType );
675*cdf0e10cSrcweir 	}
676*cdf0e10cSrcweir }
677*cdf0e10cSrcweir 
678*cdf0e10cSrcweir //============================================================================
679*cdf0e10cSrcweir //The class of ScAnyRefDlg is rewritten by PengYunQuan for Validity Cell Range Picker
680*cdf0e10cSrcweir //	class ScRefHandler
681*cdf0e10cSrcweir //----------------------------------------------------------------------------
682*cdf0e10cSrcweir 
683*cdf0e10cSrcweir ScRefHandler::ScRefHandler( Window &rWindow, SfxBindings* pB/*, SfxChildWindow* pCW,
684*cdf0e10cSrcweir 						  Window* pParent, sal_uInt16 nResId*/, bool bBindRef )
685*cdf0e10cSrcweir 	:	//SfxModelessDialog ( pB, pCW, pParent, ScResId( nResId ) ),
686*cdf0e10cSrcweir 		m_rWindow( rWindow ),
687*cdf0e10cSrcweir 		m_bInRefMode( false ),
688*cdf0e10cSrcweir         m_aHelper(this,pB),
689*cdf0e10cSrcweir 		pMyBindings( pB ),
690*cdf0e10cSrcweir         pActiveWin(NULL)
691*cdf0e10cSrcweir {
692*cdf0e10cSrcweir 	m_aHelper.SetWindow(/*this*/&m_rWindow);
693*cdf0e10cSrcweir 	if(m_rWindow.GetHelpId().getLength()==0)				//Hack, da im SfxModelessDialog die HelpId
694*cdf0e10cSrcweir 		m_rWindow.SetHelpId(m_rWindow.GetUniqueId());	//fuer einen ModelessDialog entfernt und
695*cdf0e10cSrcweir 									//in eine UniqueId gewandelt wird, machen
696*cdf0e10cSrcweir 									//wir das an dieser Stelle rueckgaengig.
697*cdf0e10cSrcweir 	aTimer.SetTimeout(200);
698*cdf0e10cSrcweir 	aTimer.SetTimeoutHdl(LINK( this, ScRefHandler, UpdateFocusHdl));
699*cdf0e10cSrcweir 
700*cdf0e10cSrcweir 	if( bBindRef ) EnterRefMode();
701*cdf0e10cSrcweir }
702*cdf0e10cSrcweir 
703*cdf0e10cSrcweir bool ScRefHandler::EnterRefMode()
704*cdf0e10cSrcweir {
705*cdf0e10cSrcweir 	if( m_bInRefMode ) return false;
706*cdf0e10cSrcweir 
707*cdf0e10cSrcweir 	SC_MOD()->InputEnterHandler();
708*cdf0e10cSrcweir //    ScTabViewShell* pScViewShell = ScTabViewShell::GetActiveViewShell();
709*cdf0e10cSrcweir 
710*cdf0e10cSrcweir     ScTabViewShell* pScViewShell = NULL;
711*cdf0e10cSrcweir 
712*cdf0e10cSrcweir 	// title has to be from the view that opened the dialog,
713*cdf0e10cSrcweir 	// even if it's not the current view
714*cdf0e10cSrcweir 
715*cdf0e10cSrcweir 	SfxObjectShell* pParentDoc = NULL;
716*cdf0e10cSrcweir 	if ( pMyBindings )
717*cdf0e10cSrcweir 	{
718*cdf0e10cSrcweir 		SfxDispatcher* pMyDisp = pMyBindings->GetDispatcher();
719*cdf0e10cSrcweir 		if (pMyDisp)
720*cdf0e10cSrcweir 		{
721*cdf0e10cSrcweir 			SfxViewFrame* pMyViewFrm = pMyDisp->GetFrame();
722*cdf0e10cSrcweir 			if (pMyViewFrm)
723*cdf0e10cSrcweir             {
724*cdf0e10cSrcweir                 pScViewShell = PTR_CAST( ScTabViewShell, pMyViewFrm->GetViewShell() );
725*cdf0e10cSrcweir                 if( pScViewShell )
726*cdf0e10cSrcweir 		            pScViewShell->UpdateInputHandler(sal_True);
727*cdf0e10cSrcweir 				pParentDoc = pMyViewFrm->GetObjectShell();
728*cdf0e10cSrcweir             }
729*cdf0e10cSrcweir 		}
730*cdf0e10cSrcweir 	}
731*cdf0e10cSrcweir 	if ( !pParentDoc && pScViewShell )					// use current only if above fails
732*cdf0e10cSrcweir 		pParentDoc = pScViewShell->GetObjectShell();
733*cdf0e10cSrcweir 	if ( pParentDoc )
734*cdf0e10cSrcweir 		aDocName = pParentDoc->GetTitle();
735*cdf0e10cSrcweir 
736*cdf0e10cSrcweir     ScInputHandler*	pInputHdl = SC_MOD()->GetInputHdl(pScViewShell);
737*cdf0e10cSrcweir 
738*cdf0e10cSrcweir 	DBG_ASSERT( pInputHdl, "Missing input handler :-/" );
739*cdf0e10cSrcweir 
740*cdf0e10cSrcweir 	if ( pInputHdl )
741*cdf0e10cSrcweir 		pInputHdl->NotifyChange( NULL );
742*cdf0e10cSrcweir 
743*cdf0e10cSrcweir 	m_aHelper.enableInput( sal_False );
744*cdf0e10cSrcweir 
745*cdf0e10cSrcweir 	m_aHelper.EnableSpreadsheets();
746*cdf0e10cSrcweir 
747*cdf0e10cSrcweir     m_aHelper.Init();
748*cdf0e10cSrcweir 
749*cdf0e10cSrcweir 	m_aHelper.SetDispatcherLock( sal_True );
750*cdf0e10cSrcweir 	//@Test
751*cdf0e10cSrcweir 	//SFX_APPWINDOW->Disable(sal_True);	  //@BugID 54702
752*cdf0e10cSrcweir 
753*cdf0e10cSrcweir 	return m_bInRefMode = true;
754*cdf0e10cSrcweir }
755*cdf0e10cSrcweir 
756*cdf0e10cSrcweir //----------------------------------------------------------------------------
757*cdf0e10cSrcweir 
758*cdf0e10cSrcweir ScRefHandler::~ScRefHandler()
759*cdf0e10cSrcweir {
760*cdf0e10cSrcweir 	LeaveRefMode();
761*cdf0e10cSrcweir }
762*cdf0e10cSrcweir 
763*cdf0e10cSrcweir bool ScRefHandler::LeaveRefMode()
764*cdf0e10cSrcweir {
765*cdf0e10cSrcweir 	if( !m_bInRefMode ) return false;
766*cdf0e10cSrcweir 
767*cdf0e10cSrcweir 	lcl_HideAllReferences();
768*cdf0e10cSrcweir 
769*cdf0e10cSrcweir 	if( Dialog *pDlg = dynamic_cast<Dialog*>( static_cast<Window*>(*this) ) )
770*cdf0e10cSrcweir 		pDlg->SetModalInputMode(sal_False);
771*cdf0e10cSrcweir 	SetDispatcherLock( sal_False );			//! here and in DoClose ?
772*cdf0e10cSrcweir 
773*cdf0e10cSrcweir     ScTabViewShell* pScViewShell = ScTabViewShell::GetActiveViewShell();
774*cdf0e10cSrcweir     if( pScViewShell )
775*cdf0e10cSrcweir 		pScViewShell->UpdateInputHandler(sal_True);
776*cdf0e10cSrcweir 
777*cdf0e10cSrcweir 	//SFX_APPWINDOW->Enable(sal_True,sal_True);
778*cdf0e10cSrcweir 	lcl_InvalidateWindows();
779*cdf0e10cSrcweir 
780*cdf0e10cSrcweir 	m_bInRefMode = false;
781*cdf0e10cSrcweir 	return true;
782*cdf0e10cSrcweir }
783*cdf0e10cSrcweir 
784*cdf0e10cSrcweir //----------------------------------------------------------------------------
785*cdf0e10cSrcweir 
786*cdf0e10cSrcweir //SfxBindings& ScRefHandler::GetBindings()
787*cdf0e10cSrcweir //{
788*cdf0e10cSrcweir //	//!	SfxModelessDialog should allow access to pBindings pointer
789*cdf0e10cSrcweir //
790*cdf0e10cSrcweir //	return *pMyBindings;
791*cdf0e10cSrcweir //}
792*cdf0e10cSrcweir 
793*cdf0e10cSrcweir //----------------------------------------------------------------------------
794*cdf0e10cSrcweir 
795*cdf0e10cSrcweir void ScRefHandler::SwitchToDocument()
796*cdf0e10cSrcweir {
797*cdf0e10cSrcweir 	ScTabViewShell* pCurrent = ScTabViewShell::GetActiveViewShell();
798*cdf0e10cSrcweir 	if (pCurrent)
799*cdf0e10cSrcweir 	{
800*cdf0e10cSrcweir 		SfxObjectShell* pObjSh = pCurrent->GetObjectShell();
801*cdf0e10cSrcweir 		if ( pObjSh && pObjSh->GetTitle() == aDocName )
802*cdf0e10cSrcweir 		{
803*cdf0e10cSrcweir 			//	right document already visible -> nothing to do
804*cdf0e10cSrcweir 			return;
805*cdf0e10cSrcweir 		}
806*cdf0e10cSrcweir 	}
807*cdf0e10cSrcweir 
808*cdf0e10cSrcweir 	TypeId aScType = TYPE(ScTabViewShell);
809*cdf0e10cSrcweir 	SfxViewShell* pSh = SfxViewShell::GetFirst( &aScType );
810*cdf0e10cSrcweir 	while ( pSh )
811*cdf0e10cSrcweir 	{
812*cdf0e10cSrcweir 		SfxObjectShell* pObjSh = pSh->GetObjectShell();
813*cdf0e10cSrcweir 		if ( pObjSh && pObjSh->GetTitle() == aDocName )
814*cdf0e10cSrcweir 		{
815*cdf0e10cSrcweir 			//	switch to first TabViewShell for document
816*cdf0e10cSrcweir 			((ScTabViewShell*)pSh)->SetActive();
817*cdf0e10cSrcweir 			return;
818*cdf0e10cSrcweir 		}
819*cdf0e10cSrcweir 		pSh = SfxViewShell::GetNext( *pSh, &aScType );
820*cdf0e10cSrcweir 	}
821*cdf0e10cSrcweir }
822*cdf0e10cSrcweir 
823*cdf0e10cSrcweir //----------------------------------------------------------------------------
824*cdf0e10cSrcweir 
825*cdf0e10cSrcweir sal_Bool ScRefHandler::IsDocAllowed(SfxObjectShell* pDocSh) const	// pDocSh may be 0
826*cdf0e10cSrcweir {
827*cdf0e10cSrcweir 	//	default: allow only same document (overridden in function dialog)
828*cdf0e10cSrcweir 	String aCmpName;
829*cdf0e10cSrcweir 	if ( pDocSh )
830*cdf0e10cSrcweir 		aCmpName = pDocSh->GetTitle();
831*cdf0e10cSrcweir 
832*cdf0e10cSrcweir 	//	if aDocName isn't initialized, allow
833*cdf0e10cSrcweir 	return ( aDocName.Len() == 0 || aDocName == aCmpName );
834*cdf0e10cSrcweir }
835*cdf0e10cSrcweir 
836*cdf0e10cSrcweir //----------------------------------------------------------------------------
837*cdf0e10cSrcweir 
838*cdf0e10cSrcweir sal_Bool __EXPORT ScRefHandler::IsRefInputMode() const
839*cdf0e10cSrcweir {
840*cdf0e10cSrcweir 	return m_rWindow.IsVisible(); // nur wer sichtbar ist kann auch Referenzen bekommen
841*cdf0e10cSrcweir }
842*cdf0e10cSrcweir 
843*cdf0e10cSrcweir //----------------------------------------------------------------------------
844*cdf0e10cSrcweir 
845*cdf0e10cSrcweir sal_Bool __EXPORT ScRefHandler::DoClose( sal_uInt16 nId )
846*cdf0e10cSrcweir {
847*cdf0e10cSrcweir     m_aHelper.DoClose(nId);
848*cdf0e10cSrcweir 	return sal_True;
849*cdf0e10cSrcweir }
850*cdf0e10cSrcweir 
851*cdf0e10cSrcweir void ScRefHandler::SetDispatcherLock( sal_Bool bLock )
852*cdf0e10cSrcweir {
853*cdf0e10cSrcweir 	m_aHelper.SetDispatcherLock( bLock );
854*cdf0e10cSrcweir }
855*cdf0e10cSrcweir 
856*cdf0e10cSrcweir //----------------------------------------------------------------------------
857*cdf0e10cSrcweir 
858*cdf0e10cSrcweir void ScRefHandler::ViewShellChanged(ScTabViewShell*  pScViewShell )
859*cdf0e10cSrcweir {
860*cdf0e10cSrcweir 	m_aHelper.ViewShellChanged(pScViewShell);
861*cdf0e10cSrcweir }
862*cdf0e10cSrcweir 
863*cdf0e10cSrcweir //----------------------------------------------------------------------------
864*cdf0e10cSrcweir 
865*cdf0e10cSrcweir void ScRefHandler::AddRefEntry()
866*cdf0e10cSrcweir {
867*cdf0e10cSrcweir 	//	wenn nicht ueberladen, gibt es keine Mehrfach-Referenzen
868*cdf0e10cSrcweir }
869*cdf0e10cSrcweir 
870*cdf0e10cSrcweir //----------------------------------------------------------------------------
871*cdf0e10cSrcweir 
872*cdf0e10cSrcweir sal_Bool __EXPORT ScRefHandler::IsTableLocked() const
873*cdf0e10cSrcweir {
874*cdf0e10cSrcweir 	// per Default kann bei Referenzeingabe auch die Tabelle umgeschaltet werden
875*cdf0e10cSrcweir 
876*cdf0e10cSrcweir 	return sal_False;
877*cdf0e10cSrcweir }
878*cdf0e10cSrcweir 
879*cdf0e10cSrcweir //----------------------------------------------------------------------------
880*cdf0e10cSrcweir //
881*cdf0e10cSrcweir //	RefInputStart/Done: Zoom-In (AutoHide) auf einzelnes Feld
882*cdf0e10cSrcweir //	(per Button oder Bewegung)
883*cdf0e10cSrcweir //
884*cdf0e10cSrcweir //----------------------------------------------------------------------------
885*cdf0e10cSrcweir 
886*cdf0e10cSrcweir void ScRefHandler::RefInputStart( formula::RefEdit* pEdit, formula::RefButton* pButton )
887*cdf0e10cSrcweir {
888*cdf0e10cSrcweir     m_aHelper.RefInputStart( pEdit, pButton );
889*cdf0e10cSrcweir }
890*cdf0e10cSrcweir 
891*cdf0e10cSrcweir 
892*cdf0e10cSrcweir void ScRefHandler::ToggleCollapsed( formula::RefEdit* pEdit, formula::RefButton* pButton )
893*cdf0e10cSrcweir {
894*cdf0e10cSrcweir     m_aHelper.ToggleCollapsed( pEdit, pButton );
895*cdf0e10cSrcweir }
896*cdf0e10cSrcweir 
897*cdf0e10cSrcweir //The two following function is commentted out by PengYunQuan for Validity Cell Range Picker
898*cdf0e10cSrcweir //long ScAnyRefDlg::PreNotify( NotifyEvent& rNEvt )
899*cdf0e10cSrcweir //{
900*cdf0e10cSrcweir //	sal_uInt16 nSwitch=rNEvt.GetType();
901*cdf0e10cSrcweir //	if(nSwitch==EVENT_GETFOCUS)
902*cdf0e10cSrcweir //	{
903*cdf0e10cSrcweir //		pActiveWin=rNEvt.GetWindow();
904*cdf0e10cSrcweir //	}
905*cdf0e10cSrcweir //	return SfxModelessDialog::PreNotify(rNEvt);
906*cdf0e10cSrcweir //}
907*cdf0e10cSrcweir //
908*cdf0e10cSrcweir //void ScAnyRefDlg::StateChanged( StateChangedType nStateChange )
909*cdf0e10cSrcweir //{
910*cdf0e10cSrcweir //	SfxModelessDialog::StateChanged( nStateChange );
911*cdf0e10cSrcweir //
912*cdf0e10cSrcweir //	if(nStateChange == STATE_CHANGE_VISIBLE)
913*cdf0e10cSrcweir //	{
914*cdf0e10cSrcweir //		if(IsVisible())
915*cdf0e10cSrcweir //		{
916*cdf0e10cSrcweir //			m_aHelper.enableInput( sal_False );
917*cdf0e10cSrcweir //			m_aHelper.EnableSpreadsheets();
918*cdf0e10cSrcweir //			m_aHelper.SetDispatcherLock( sal_True );
919*cdf0e10cSrcweir //			aTimer.Start();
920*cdf0e10cSrcweir //		}
921*cdf0e10cSrcweir //		else
922*cdf0e10cSrcweir //		{
923*cdf0e10cSrcweir //			m_aHelper.enableInput( sal_True );
924*cdf0e10cSrcweir //			m_aHelper.SetDispatcherLock( sal_False );			//! here and in DoClose ?
925*cdf0e10cSrcweir //		}
926*cdf0e10cSrcweir //	}
927*cdf0e10cSrcweir //}
928*cdf0e10cSrcweir 
929*cdf0e10cSrcweir #if defined( _MSC_VER )
930*cdf0e10cSrcweir #define INTRODUCE_TEMPLATE
931*cdf0e10cSrcweir #else
932*cdf0e10cSrcweir #define INTRODUCE_TEMPLATE	template <>
933*cdf0e10cSrcweir #endif
934*cdf0e10cSrcweir 
935*cdf0e10cSrcweir #define IMPL_TWINDOW_PRENOTIFY( TWindow,bBindRef )	\
936*cdf0e10cSrcweir INTRODUCE_TEMPLATE long ScRefHdlrImplBase<TWindow,bBindRef>::PreNotify( NotifyEvent& rNEvt )\
937*cdf0e10cSrcweir {\
938*cdf0e10cSrcweir 	if( bBindRef || m_bInRefMode )\
939*cdf0e10cSrcweir 	{\
940*cdf0e10cSrcweir 		sal_uInt16 nSwitch=rNEvt.GetType();\
941*cdf0e10cSrcweir 		if(nSwitch==EVENT_GETFOCUS)\
942*cdf0e10cSrcweir 		{\
943*cdf0e10cSrcweir 			pActiveWin=rNEvt.GetWindow();\
944*cdf0e10cSrcweir 		}\
945*cdf0e10cSrcweir 	}\
946*cdf0e10cSrcweir 	return TWindow::PreNotify(rNEvt);\
947*cdf0e10cSrcweir }
948*cdf0e10cSrcweir 
949*cdf0e10cSrcweir #define IMPL_TWINDOW_STATECHANGED( TWindow,bBindRef )	\
950*cdf0e10cSrcweir INTRODUCE_TEMPLATE void ScRefHdlrImplBase<TWindow,bBindRef>::StateChanged( StateChangedType nStateChange )\
951*cdf0e10cSrcweir {\
952*cdf0e10cSrcweir 	TWindow::StateChanged( nStateChange );\
953*cdf0e10cSrcweir \
954*cdf0e10cSrcweir 	if( !bBindRef && !m_bInRefMode ) return;\
955*cdf0e10cSrcweir 	\
956*cdf0e10cSrcweir 	if(nStateChange == STATE_CHANGE_VISIBLE)\
957*cdf0e10cSrcweir 	{\
958*cdf0e10cSrcweir 		if(m_rWindow.IsVisible())\
959*cdf0e10cSrcweir 		{\
960*cdf0e10cSrcweir 			m_aHelper.enableInput( sal_False );\
961*cdf0e10cSrcweir 			m_aHelper.EnableSpreadsheets();\
962*cdf0e10cSrcweir 			m_aHelper.SetDispatcherLock( sal_True );\
963*cdf0e10cSrcweir 			aTimer.Start();\
964*cdf0e10cSrcweir 		}\
965*cdf0e10cSrcweir 		else\
966*cdf0e10cSrcweir 		{\
967*cdf0e10cSrcweir 			m_aHelper.enableInput( sal_True );\
968*cdf0e10cSrcweir 			m_aHelper.SetDispatcherLock( sal_False );			/*//! here and in DoClose ?*/\
969*cdf0e10cSrcweir 		}\
970*cdf0e10cSrcweir 	}\
971*cdf0e10cSrcweir }
972*cdf0e10cSrcweir 
973*cdf0e10cSrcweir IMPL_TWINDOW_PRENOTIFY( SfxModelessDialog, true )
974*cdf0e10cSrcweir IMPL_TWINDOW_PRENOTIFY( SfxTabDialog, false )
975*cdf0e10cSrcweir IMPL_TWINDOW_STATECHANGED( SfxModelessDialog, true )
976*cdf0e10cSrcweir IMPL_TWINDOW_STATECHANGED( SfxTabDialog, false )
977*cdf0e10cSrcweir 
978*cdf0e10cSrcweir IMPL_LINK( ScRefHandler, UpdateFocusHdl, Timer*, EMPTYARG )
979*cdf0e10cSrcweir {
980*cdf0e10cSrcweir 	if (pActiveWin)
981*cdf0e10cSrcweir 	{
982*cdf0e10cSrcweir 		pActiveWin->GrabFocus();
983*cdf0e10cSrcweir 	}
984*cdf0e10cSrcweir 	return 0;
985*cdf0e10cSrcweir }
986*cdf0e10cSrcweir // -----------------------------------------------------------------------------
987*cdf0e10cSrcweir bool ScRefHandler::ParseWithNames( ScRangeList& rRanges, const String& rStr, ScDocument* pDoc )
988*cdf0e10cSrcweir {
989*cdf0e10cSrcweir     return m_aHelper.ParseWithNames( rRanges, rStr, pDoc );
990*cdf0e10cSrcweir }
991*cdf0e10cSrcweir // -----------------------------------------------------------------------------
992*cdf0e10cSrcweir void ScRefHandler::HideReference( sal_Bool bDoneRefMode )
993*cdf0e10cSrcweir {
994*cdf0e10cSrcweir     m_aHelper.HideReference( bDoneRefMode );
995*cdf0e10cSrcweir }
996*cdf0e10cSrcweir // -----------------------------------------------------------------------------
997*cdf0e10cSrcweir void ScRefHandler::ShowReference( const XubString& rStr )
998*cdf0e10cSrcweir {
999*cdf0e10cSrcweir     m_aHelper.ShowReference( rStr );
1000*cdf0e10cSrcweir }
1001*cdf0e10cSrcweir // -----------------------------------------------------------------------------
1002*cdf0e10cSrcweir void ScRefHandler::ReleaseFocus( formula::RefEdit* pEdit, formula::RefButton* pButton )
1003*cdf0e10cSrcweir {
1004*cdf0e10cSrcweir     m_aHelper.ReleaseFocus( pEdit,pButton );
1005*cdf0e10cSrcweir }
1006*cdf0e10cSrcweir //----------------------------------------------------------------------------
1007*cdf0e10cSrcweir void ScRefHandler::RefInputDone( sal_Bool bForced )
1008*cdf0e10cSrcweir {
1009*cdf0e10cSrcweir     m_aHelper.RefInputDone( bForced );
1010*cdf0e10cSrcweir }
1011*cdf0e10cSrcweir 
1012