1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26
27
28
29 // INCLUDE ---------------------------------------------------------------
30
31 #include <editeng/editview.hxx>
32 #include <sfx2/bindings.hxx>
33 #include <sfx2/dispatch.hxx>
34 #include <sfx2/objsh.hxx>
35 #include <sfx2/viewsh.hxx>
36
37 #include "sc.hrc"
38 #include "global.hxx" // ScAddress
39 #include "scresid.hxx"
40 #include "reffact.hxx"
41 #include "document.hxx"
42 #include "cell.hxx"
43 #include "scmod.hxx"
44 #include "inputhdl.hxx"
45 #include "tabvwsh.hxx"
46 #include "appoptio.hxx"
47 #include "compiler.hxx"
48
49 #include "dwfunctr.hrc"
50 #include "dwfunctr.hxx"
51
52 // -----------------------------------------------------------------------
53
54 #define ARG_SEPERATOR String("; ")
SFX_IMPL_DOCKINGWINDOW(ScFunctionChildWindow,FID_FUNCTION_BOX)55 SFX_IMPL_DOCKINGWINDOW( ScFunctionChildWindow, FID_FUNCTION_BOX )
56
57 /*************************************************************************
58 #* Member: ScFunctionChildWindow Datum:06.10.97
59 #*------------------------------------------------------------------------
60 #*
61 #* Klasse: ScFunctionChildWindow
62 #*
63 #* Funktion: Konstruktor der Klasse ScFunctionChildWindow
64 #* Ableitung vom SfxChildWindow als "Behaelter" fuer
65 #* Funktions- Fenster in Clac
66 #*
67 #* Input: ---
68 #*
69 #* Output: ---
70 #*
71 #************************************************************************/
72
73 __EXPORT ScFunctionChildWindow::ScFunctionChildWindow( Window* pParentP,
74 sal_uInt16 nId,
75 SfxBindings* pBindings,
76 SfxChildWinInfo* pInfo ) :
77 SfxChildWindow( pParentP, nId )
78 {
79 ScFunctionDockWin* pWin = new ScFunctionDockWin( pBindings, this,
80 pParentP, ScResId( FID_FUNCTION_BOX ) );
81 pWindow = pWin;
82
83 eChildAlignment = SFX_ALIGN_RIGHT;
84
85 pWin->Initialize( pInfo );
86 }
87
88 /*************************************************************************
89 #* Member: ScFunctionDockWin Datum:06.10.97
90 #*------------------------------------------------------------------------
91 #*
92 #* Klasse: ScFunctionDockWin
93 #*
94 #* Funktion: Konstruktor der Klasse ScFunctionDockWin
95 #*
96 #* Input: Sfx- Verknuepfungen, Fenster, Resource
97 #*
98 #* Output: ---
99 #*
100 #************************************************************************/
101
ScFunctionDockWin(SfxBindings * pBindingsP,SfxChildWindow * pCW,Window * pParent,const ResId & rResId)102 ScFunctionDockWin::ScFunctionDockWin( SfxBindings* pBindingsP,
103 SfxChildWindow *pCW, Window* pParent, const ResId& rResId ) :
104
105 SfxDockingWindow( pBindingsP, pCW, pParent, rResId ),
106 aPrivatSplit ( this, ResId( FT_SPLIT, *rResId.GetResMgr() ),SC_SPLIT_VERT),
107 aCatBox ( this, ResId( CB_CAT, *rResId.GetResMgr() ) ),
108 aFuncList ( this, ResId( LB_FUNC, *rResId.GetResMgr() ) ),
109 aDDFuncList ( this, ResId( DDLB_FUNC, *rResId.GetResMgr() ) ),
110 aInsertButton ( this, ResId( IMB_INSERT, *rResId.GetResMgr() ) ),
111 aFiFuncDesc ( this, ResId( FI_FUNCDESC, *rResId.GetResMgr() ) ),
112 aOldSize (0,0)
113 {
114 FreeResource();
115 InitLRUList();
116 SetStyle(GetStyle()|WB_CLIPCHILDREN);
117
118 aTimer.SetTimeout(200);
119 aTimer.SetTimeoutHdl(LINK( this, ScFunctionDockWin, TimerHdl));
120
121 if (pCW != NULL)
122 eSfxNewAlignment=GetAlignment();
123 else
124 eSfxNewAlignment=SFX_ALIGN_RIGHT;
125 eSfxOldAlignment=eSfxNewAlignment;
126 aFiFuncDesc.SetUpdateMode(sal_True);
127 pAllFuncList=&aFuncList;
128 aDDFuncList.Disable();
129 aDDFuncList.Hide();
130 nArgs=0;
131 nDockMode=0;
132 bSizeFlag=sal_False;
133 aCatBox.SetDropDownLineCount(9);
134 Font aFont=aFiFuncDesc.GetFont();
135 aFont.SetColor(Color(COL_BLACK));
136 aFiFuncDesc.SetFont(aFont);
137 aFiFuncDesc.SetBackground( GetBackground() ); //! never transparent?
138 //? SetBackground();
139
140 Link aLink=LINK( this, ScFunctionDockWin, SelHdl);
141 aCatBox.SetSelectHdl(aLink);
142 aFuncList.SetSelectHdl(aLink);
143 aDDFuncList.SetSelectHdl(aLink);
144
145 Link a2Link=LINK( this, ScFunctionDockWin, SetSelectionHdl);
146 aFuncList.SetDoubleClickHdl(a2Link);
147 aDDFuncList.SetSelectHdl(aLink);
148 aInsertButton.SetClickHdl(a2Link);
149
150 Link a3Link=LINK( this, ScFunctionDockWin, SetSplitHdl);
151 aPrivatSplit.SetCtrModifiedHdl(a3Link);
152 StartListening( *pBindingsP, sal_True );
153
154 Point aTopLeft=aCatBox.GetPosPixel();
155 //String aString=aCatBox.GetEntry( 0)+String("www");
156 String aString=String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ww"));
157 Size aTxtSize( aFiFuncDesc.GetTextWidth(aString), aFiFuncDesc.GetTextHeight() );
158 nMinWidth=aTxtSize.Width()+aTopLeft.X()
159 +2*aFuncList.GetPosPixel().X();
160 nMinHeight=19*aTxtSize.Height();
161 aCatBox.SelectEntryPos(0);
162
163 Range aYRange(3*aTxtSize.Height()+aFuncList.GetPosPixel().Y(),
164 GetOutputSizePixel().Height()-2*aTxtSize.Height());
165 aPrivatSplit.SetYRange(aYRange);
166 SelHdl(&aCatBox);
167 bInit=sal_True;
168 }
169
170 /*************************************************************************
171 #* Member: ScFunctionDockWin Datum:06.10.97
172 #*------------------------------------------------------------------------
173 #*
174 #* Klasse: ScFunctionDockWin
175 #*
176 #* Funktion: Destruktor der Klasse ScFunctionDockWin
177 #*
178 #* Input: ---
179 #*
180 #* Output: ---
181 #*
182 #************************************************************************/
183
~ScFunctionDockWin()184 __EXPORT ScFunctionDockWin::~ScFunctionDockWin()
185 {
186 EndListening( GetBindings() );
187 }
188
189 /*************************************************************************
190 #* Member: UpdateFunctionList Datum:06.10.97
191 #*------------------------------------------------------------------------
192 #*
193 #* Klasse: ScFunctionDockWin
194 #*
195 #* Funktion: Aktualisiert die Liste der Funktionen ab-
196 #* haengig von der eingestellten Kategorie.
197 #*
198 #* Input: ---
199 #*
200 #* Output: ---
201 #*
202 #************************************************************************/
203
InitLRUList()204 void ScFunctionDockWin::InitLRUList()
205 {
206 const ScAppOptions& rAppOpt = SC_MOD()->GetAppOptions();
207 sal_uInt16 nLRUFuncCount = Min( rAppOpt.GetLRUFuncListCount(), (sal_uInt16)LRU_MAX );
208 sal_uInt16* pLRUListIds = rAppOpt.GetLRUFuncList();
209
210 sal_uInt16 i;
211 for ( i=0; i<LRU_MAX; i++ )
212 aLRUList[i] = NULL;
213
214 if ( pLRUListIds )
215 {
216 ScFunctionMgr* pFuncMgr = ScGlobal::GetStarCalcFunctionMgr();
217 for ( i=0; i<nLRUFuncCount; i++ )
218 aLRUList[i] = pFuncMgr->Get( pLRUListIds[i] );
219 }
220
221 sal_uInt16 nSelPos = aCatBox.GetSelectEntryPos();
222
223 if(nSelPos == 0)
224 UpdateFunctionList();
225 }
226
227 /*************************************************************************
228 #* Member: UpdateFunctionList Datum:10.12.99
229 #*------------------------------------------------------------------------
230 #*
231 #* Klasse: ScFunctionDockWin
232 #*
233 #* Funktion: Aktualisiert die Liste der zuletzt verwendeten Funktionen.
234 #*
235 #* Input: ---
236 #*
237 #* Output: ---
238 #*
239 #************************************************************************/
240
UpdateLRUList()241 void ScFunctionDockWin::UpdateLRUList()
242 {
243 if (pFuncDesc && pFuncDesc->nFIndex!=0)
244 {
245 ScModule* pScMod = SC_MOD();
246 pScMod->InsertEntryToLRUList(pFuncDesc->nFIndex);
247 }
248 }
249
250
251 /*************************************************************************
252 #* Member: SetSize Datum:06.10.97
253 #*------------------------------------------------------------------------
254 #*
255 #* Klasse: ScFunctionDockWin
256 #*
257 #* Funktion: Groesse fuer die einzelnen Controls einzustellen.
258 #*
259 #* Input: ---
260 #*
261 #* Output: ---
262 #*
263 #************************************************************************/
264
SetSize()265 void ScFunctionDockWin::SetSize()
266 {
267 sal_uInt16 nSelEntry=0;
268 SfxChildAlignment aChildAlign=eSfxOldAlignment;//GetAlignment();
269 short nNewDockMode;
270 switch(aChildAlign)
271 {
272 case SFX_ALIGN_HIGHESTTOP:
273 case SFX_ALIGN_TOP:
274 case SFX_ALIGN_LOWESTTOP:
275 case SFX_ALIGN_LOWESTBOTTOM:
276 case SFX_ALIGN_BOTTOM:
277 case SFX_ALIGN_TOOLBOXTOP:
278 case SFX_ALIGN_TOOLBOXBOTTOM:
279
280
281 nNewDockMode=1;
282 if(nDockMode!=nNewDockMode)
283 {
284 nDockMode=nNewDockMode;
285 nSelEntry=aFuncList.GetSelectEntryPos();
286 aFuncList.Clear();
287 aFiFuncDesc.SetPosPixel(aFuncList.GetPosPixel());
288 aDDFuncList.Enable();
289 aDDFuncList.Show();
290 aPrivatSplit.Disable();
291 aPrivatSplit.Hide();
292 aFuncList.Disable();
293 aFuncList.Hide();
294 pAllFuncList=&aDDFuncList;
295 SelHdl(&aCatBox);
296 aDDFuncList.SelectEntryPos(nSelEntry);
297 }
298 break;
299
300 default: nNewDockMode=0;
301 if(nDockMode!=nNewDockMode)
302 {
303 nDockMode=nNewDockMode;
304 nSelEntry=aDDFuncList.GetSelectEntryPos();
305 aDDFuncList.Clear();
306 aDDFuncList.Disable();
307 aDDFuncList.Hide();
308 aPrivatSplit.Enable();
309 aPrivatSplit.Show();
310 aFuncList.Enable();
311 aFuncList.Show();
312 pAllFuncList=&aFuncList;
313 SelHdl(&aCatBox);
314 aFuncList.SelectEntryPos(nSelEntry);
315 }
316 break;
317 }
318
319 if(nDockMode==0)
320 {
321 SetLeftRightSize();
322 }
323 else
324 {
325 SetTopBottonSize();
326 }
327 }
328 /*************************************************************************
329 #* Member: SetLeftRightSize Datum:15.10.97
330 #*------------------------------------------------------------------------
331 #*
332 #* Klasse: ScFunctionDockWin
333 #*
334 #* Funktion: Groesse fuer die einzelnen Controls einstellen,
335 #* wenn Links oder Rechts angedockt wird.
336 #*
337 #* Input: ---
338 #*
339 #* Output: ---
340 #*
341 #************************************************************************/
342
SetLeftRightSize()343 void ScFunctionDockWin::SetLeftRightSize()
344 {
345 if(bSizeFlag==sal_False)
346 {
347 bSizeFlag=sal_True;
348
349 Size aDiffSize=GetSizePixel();
350 Size aNewSize=GetOutputSizePixel();
351 aDiffSize.Width()-=aNewSize.Width();
352 aDiffSize.Height()-=aNewSize.Height();
353
354 //@ SetUpdateMode( sal_False);
355
356 String aString = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ww"));
357
358 Size aTxtSize( aFuncList.GetTextWidth(aString), aFuncList.GetTextHeight() );
359
360 Range aYRange(3*aTxtSize.Height()+aFuncList.GetPosPixel().Y(),
361 GetOutputSizePixel().Height()-2*aTxtSize.Height());
362 aPrivatSplit.SetYRange(aYRange);
363
364
365 if(aOldSize.Width()!=aNewSize.Width())
366 SetMyWidthLeRi(aNewSize);
367
368 if(aOldSize.Height()!=aNewSize.Height())
369 SetMyHeightLeRi(aNewSize);
370
371 aOldSize=aNewSize;
372 aNewSize.Width()+=aDiffSize.Width();
373 aNewSize.Height()+=aDiffSize.Height();
374 //SetSizePixel(aNewSize);
375 //@ SetUpdateMode( sal_True);
376 bSizeFlag=sal_False;
377 }
378
379 }
380 /*************************************************************************
381 #* Member: SetTopBottonSize Datum:15.10.97
382 #*------------------------------------------------------------------------
383 #*
384 #* Klasse: ScFunctionDockWin
385 #*
386 #* Funktion: Groesse fuer die einzelnen Controls einzustellen.
387 #* wenn oben oder unten angedockt wird.
388 #*
389 #* Input: ---
390 #*
391 #* Output: ---
392 #*
393 #************************************************************************/
394
SetTopBottonSize()395 void ScFunctionDockWin::SetTopBottonSize()
396 {
397 if(bSizeFlag==sal_False)
398 {
399 bSizeFlag=sal_True;
400 Size aDiffSize=GetSizePixel();
401 Size aNewSize=GetOutputSizePixel();
402 aDiffSize.Width()-=aNewSize.Width();
403 aDiffSize.Height()-=aNewSize.Height();
404
405 SetMyWidthToBo(aNewSize);
406 SetMyHeightToBo(aNewSize);
407
408 aNewSize.Width()+=aDiffSize.Width();
409 aNewSize.Height()+=aDiffSize.Height();
410 //SetSizePixel(aNewSize);
411 //@ SetUpdateMode( sal_True);
412 bSizeFlag=sal_False;
413 }
414 }
415
416 /*************************************************************************
417 #* Member: SetMyWidthLeRi Datum:15.10.97
418 #*------------------------------------------------------------------------
419 #*
420 #* Klasse: ScFunctionDockWin
421 #*
422 #* Funktion: Breite fuer die einzelnen Controls und
423 #* das Fenster einstellen,wenn Li oder Re
424 #*
425 #* Input: neue Fenstergroesse
426 #*
427 #* Output: ---
428 #*
429 #************************************************************************/
430
SetMyWidthLeRi(Size & aNewSize)431 void ScFunctionDockWin::SetMyWidthLeRi(Size &aNewSize)
432 {
433 if((sal_uLong)aNewSize.Width()<nMinWidth) aNewSize.Width()=nMinWidth;
434
435 Size aCDSize=aCatBox.GetSizePixel();
436 Size aFLSize=aFuncList.GetSizePixel();
437 Size aSplitterSize=aPrivatSplit.GetSizePixel();
438 Size aFDSize=aFiFuncDesc.GetSizePixel();
439
440 Point aCDTopLeft=aCatBox.GetPosPixel();
441 Point aFLTopLeft=aFuncList.GetPosPixel();
442 Point aSplitterTopLeft=aPrivatSplit.GetPosPixel();
443 Point aFDTopLeft=aFiFuncDesc.GetPosPixel();
444
445 aCDSize.Width()=aNewSize.Width()-aCDTopLeft.X()-aFLTopLeft.X();
446 aFLSize.Width()=aNewSize.Width()-2*aFLTopLeft.X();
447 aFDSize.Width()=aFLSize.Width();
448 aSplitterSize.Width()=aFLSize.Width();
449
450 aCatBox.SetSizePixel(aCDSize);
451 aFuncList.SetSizePixel(aFLSize);
452 aPrivatSplit.SetSizePixel(aSplitterSize);
453 aFiFuncDesc.SetSizePixel(aFDSize);
454 }
455
456 /*************************************************************************
457 #* Member: SetHeight Datum:06.10.97
458 #*------------------------------------------------------------------------
459 #*
460 #* Klasse: ScFunctionDockWin
461 #*
462 #* Funktion: Hoehe fuer die einzelnen Controls und
463 #* das Fenster einstellen bei Li oder Re
464 #*
465 #* Input: neue Fenstergroesse
466 #*
467 #* Output: ---
468 #*
469 #************************************************************************/
470
SetMyHeightLeRi(Size & aNewSize)471 void ScFunctionDockWin::SetMyHeightLeRi(Size &aNewSize)
472 {
473 if((sal_uLong)aNewSize.Height()<nMinHeight) aNewSize.Height()=nMinHeight;
474
475 Size aFLSize=aFuncList.GetSizePixel();
476 Size aSplitterSize=aPrivatSplit.GetSizePixel();
477 Size aFDSize=aFiFuncDesc.GetSizePixel();
478
479 Point aFLTopLeft=aFuncList.GetPosPixel();
480 Point aSplitterTopLeft=aPrivatSplit.GetPosPixel();
481 Point aFDTopLeft=aFiFuncDesc.GetPosPixel();
482
483 long nTxtHeight = aFuncList.GetTextHeight();
484
485 short nY=(short)(3*nTxtHeight+
486 aFuncList.GetPosPixel().Y()+aSplitterSize.Height());
487
488 aFDTopLeft.Y()=aNewSize.Height()-aFDSize.Height()-4;
489 if(nY>aFDTopLeft.Y())
490 {
491 aFDSize.Height()-=nY-aFDTopLeft.Y();
492 aFDTopLeft.Y()=nY;
493 }
494 aSplitterTopLeft.Y()=aFDTopLeft.Y()-aSplitterSize.Height()-1;
495 aFLSize.Height()=aSplitterTopLeft.Y()-aFLTopLeft.Y()-1;
496
497 aFuncList.SetSizePixel(aFLSize);
498 aPrivatSplit.SetPosPixel(aSplitterTopLeft);
499 aFiFuncDesc.SetPosPixel(aFDTopLeft);
500 aFiFuncDesc.SetSizePixel(aFDSize);
501
502 }
503
504 /*************************************************************************
505 #* Member: SetMyWidthToBo Datum:16.10.97
506 #*------------------------------------------------------------------------
507 #*
508 #* Klasse: ScFunctionDockWin
509 #*
510 #* Funktion: Breite fuer die einzelnen Controls und
511 #* das Fenster einstellen, wenn oben oder
512 #* unten angedockt werden soll.
513 #*
514 #* Input: neue Fenstergroesse
515 #*
516 #* Output: ---
517 #*
518 #************************************************************************/
519
SetMyWidthToBo(Size & aNewSize)520 void ScFunctionDockWin::SetMyWidthToBo(Size &aNewSize)
521 {
522 if((sal_uLong)aNewSize.Width()<nMinWidth) aNewSize.Width()=nMinWidth;
523
524 Size aCDSize=aCatBox.GetSizePixel();
525 Size aDdFLSize=aDDFuncList.GetSizePixel();
526 Size aFDSize=aFiFuncDesc.GetSizePixel();
527
528 Point aCDTopLeft=aCatBox.GetPosPixel();
529 Point aDdFLTopLeft=aDDFuncList.GetPosPixel();
530 Point aFDTopLeft=aFiFuncDesc.GetPosPixel();
531
532 aCDSize.Width()=aDdFLTopLeft.X()-aFDTopLeft.X()-aCDTopLeft.X();
533 aDdFLTopLeft.X()=aCDSize.Width()+aCDTopLeft.X()+aFDTopLeft.X();
534
535 aDdFLSize.Width()=aNewSize.Width()-aDdFLTopLeft.X()-aFDTopLeft.X();
536
537 aFDSize.Width()=aNewSize.Width()-2*aFDTopLeft.X();
538
539 aDDFuncList.SetPosPixel(aDdFLTopLeft);
540 aDDFuncList.SetSizePixel(aDdFLSize);
541 aCatBox.SetSizePixel(aCDSize);
542 aFiFuncDesc.SetSizePixel(aFDSize);
543 }
544
545 /*************************************************************************
546 #* Member: SetHeight Datum:16.10.97
547 #*------------------------------------------------------------------------
548 #*
549 #* Klasse: ScFunctionDockWin
550 #*
551 #* Funktion: Hoehe fuer die einzelnen Controls und
552 #* das Fenster einstellen, wenn oben oder
553 #* unten angedockt werden soll.
554 #*
555 #* Input: neue Fenstergroesse
556 #*
557 #* Output: ---
558 #*
559 #************************************************************************/
560
SetMyHeightToBo(Size & aNewSize)561 void ScFunctionDockWin::SetMyHeightToBo(Size &aNewSize)
562 {
563 if((sal_uLong)aNewSize.Height()<nMinHeight) aNewSize.Height()=nMinHeight;
564
565 Size aFDSize=aFiFuncDesc.GetSizePixel();
566
567 Point aFDTopLeft=aFiFuncDesc.GetPosPixel();
568 Point aCBTopLeft=aCatBox.GetPosPixel();
569 aFDSize.Height()=aNewSize.Height()-aFDTopLeft.Y()-aCBTopLeft.Y();
570 aFiFuncDesc.SetSizePixel(aFDSize);
571
572 }
573
574 /*************************************************************************
575 #* Member: SetDescription Datum:13.10.97
576 #*------------------------------------------------------------------------
577 #*
578 #* Klasse: ScFunctionDockWin
579 #*
580 #* Funktion: Erklaerungstext fuer die Funktion einstellen.
581 #*
582 #* Input: ---
583 #*
584 #* Output: ---
585 #*
586 #************************************************************************/
587
SetDescription()588 void ScFunctionDockWin::SetDescription()
589 {
590 aFiFuncDesc.SetText( EMPTY_STRING );
591 const ScFuncDesc* pDesc =
592 (const ScFuncDesc*)pAllFuncList->GetEntryData(
593 pAllFuncList->GetSelectEntryPos() );
594 if (pDesc)
595 {
596 pDesc->initArgumentInfo(); // full argument info is needed
597
598 String aString=pAllFuncList->GetSelectEntry();
599 if(nDockMode==0)
600 {
601 aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ":\n\n" ));
602 }
603 else
604 {
605 aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ": " ));
606 }
607
608 aString+=pDesc->GetParamList();
609
610 if(nDockMode==0)
611 {
612 aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "\n\n" ));
613 }
614 else
615 {
616 aString += '\n';
617 }
618
619 aString+=*(pDesc->pFuncDesc);
620
621 aFiFuncDesc.SetText(aString);
622 aFiFuncDesc.StateChanged(STATE_CHANGE_TEXT);
623 aFiFuncDesc.Invalidate();
624 aFiFuncDesc.Update();
625
626 }
627 }
628
629 /*************************************************************************
630 #* Member: Resizing Datum:06.10.97
631 #*------------------------------------------------------------------------
632 #*
633 #* Klasse: ScFunctionDockWin
634 #*
635 #* Funktion: Ueberladene Funktion um die Groesse der
636 #* einzelnen Controls einzustellen.
637 #*
638 #* Input: neue Groesse
639 #*
640 #* Output: ---
641 #*
642 #************************************************************************/
643
Resizing(Size & rNewSize)644 void __EXPORT ScFunctionDockWin::Resizing( Size& rNewSize )
645 {
646 if((sal_uLong)rNewSize.Width()<nMinWidth) rNewSize.Width()=nMinWidth;
647 if((sal_uLong)rNewSize.Height()<nMinHeight) rNewSize.Height()=nMinHeight;
648
649 }
650
651 /*************************************************************************
652 #* Member: Close Datum:07.10.97
653 #*------------------------------------------------------------------------
654 #*
655 #* Klasse: ScFunctionDockWin
656 #*
657 #* Funktion: Schliessen des Fensters
658 #*
659 #* Input: ---
660 #*
661 #* Output: TRUE
662 #*
663 #************************************************************************/
664
Close()665 sal_Bool __EXPORT ScFunctionDockWin::Close()
666 {
667 SfxBoolItem aItem( FID_FUNCTION_BOX, sal_False );
668
669 GetBindings().GetDispatcher()->Execute( FID_FUNCTION_BOX,
670 SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD,
671 &aItem, 0L );
672
673 SfxDockingWindow::Close();
674
675 return( sal_True );
676 }
677
678
679 /*************************************************************************
680 #* Member: CheckAlignment Datum:16.10.97
681 #*------------------------------------------------------------------------
682 #*
683 #* Klasse: ScFunctionDockWin
684 #*
685 #* Funktion: Ueberprueft den Andockmodus und stellt die
686 #* Groessen dementsprechend ein.
687 #*
688 #* Input: Das neue Alignment
689 #*
690 #* Output: Das uebergebene Alignment
691 #*
692 #************************************************************************/
CheckAlignment(SfxChildAlignment,SfxChildAlignment aChildAlign)693 SfxChildAlignment __EXPORT ScFunctionDockWin::CheckAlignment(SfxChildAlignment /* abla */,
694 SfxChildAlignment aChildAlign)
695 {
696 String aString = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ww"));
697 Size aTxtSize( aFiFuncDesc.GetTextWidth(aString), aFiFuncDesc.GetTextHeight() );
698 if(!bInit)
699 {
700 eSfxOldAlignment=eSfxNewAlignment;
701 eSfxNewAlignment=aChildAlign;
702 }
703 else
704 {
705 bInit=sal_False;
706 eSfxOldAlignment=aChildAlign;
707 eSfxNewAlignment=aChildAlign;
708 }
709
710 switch(eSfxOldAlignment)
711 {
712 case SFX_ALIGN_HIGHESTTOP:
713 case SFX_ALIGN_TOP:
714 case SFX_ALIGN_LOWESTTOP:
715 case SFX_ALIGN_LOWESTBOTTOM:
716 case SFX_ALIGN_BOTTOM:
717 case SFX_ALIGN_TOOLBOXTOP:
718 case SFX_ALIGN_TOOLBOXBOTTOM:
719
720 nMinWidth= 0;/*aDDFuncList.GetPosPixel().X()+
721 10*aTxtSize.Width()+
722 aFuncList.GetPosPixel().X();*/
723 nMinHeight=0;
724
725 break;
726
727 case SFX_ALIGN_NOALIGNMENT:
728
729 aString = aCatBox.GetEntry(0);
730 aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM("www"));
731 aTxtSize = Size( aFiFuncDesc.GetTextWidth(aString),
732 aFiFuncDesc.GetTextHeight() );
733
734 default: Point aTopLeft=aCatBox.GetPosPixel();
735 nMinWidth=aTxtSize.Width()+aTopLeft.X()
736 +2*aFuncList.GetPosPixel().X();
737 nMinHeight=19*aTxtSize.Height();
738 //aCatBox.SelectEntryPos(0);
739
740 break;
741 }
742
743 return aChildAlign;
744 }
745 /*************************************************************************
746 #* Member: Close Datum:07.10.97
747 #*------------------------------------------------------------------------
748 #*
749 #* Klasse: ScFunctionDockWin
750 #*
751 #* Funktion: Aenderungen erkennen
752 #*
753 #* Input: ---
754 #*
755 #* Output: TRUE
756 #*
757 #************************************************************************/
Notify(SfxBroadcaster &,const SfxHint &)758 void ScFunctionDockWin::Notify( SfxBroadcaster&, const SfxHint& /* rHint */ )
759 {
760 // const SfxPoolItemHint *pPoolItemHint = PTR_CAST(SfxPoolItemHint, &rHint);
761 /*
762 if ( pPoolItemHint
763 && ( pPoolItemHint->GetObject()->ISA( SvxColorTableItem ) ) )
764 {
765 // Die Liste der Farben hat sich geaendert
766 pColorTable = ( (SvxColorTableItem*) pPoolItemHint->GetObject() )->GetColorTable();
767 FillValueSet();
768 }
769 */
770 }
771
772
773 /*************************************************************************
774 #* Member: Resize Datum:06.10.97
775 #*------------------------------------------------------------------------
776 #*
777 #* Klasse: ScFunctionDockWin
778 #*
779 #* Funktion: Ueberladene Funktion um die Groesse der
780 #* einzelnen Controls einzustellen.
781 #*
782 #* Input: neue Groesse
783 #*
784 #* Output: ---
785 #*
786 #************************************************************************/
787
Resize()788 void __EXPORT ScFunctionDockWin::Resize()
789 {
790 if ( !IsFloatingMode() ||
791 !GetFloatingWindow()->IsRollUp() )
792 {
793 Size aQSize=GetOutputSizePixel();
794 Resizing( aQSize);
795 SetSize();
796 }
797 SfxDockingWindow::Resize();
798 }
799
800 /*************************************************************************
801 #* Member: UpdateFunctionList Datum:06.10.97
802 #*------------------------------------------------------------------------
803 #*
804 #* Klasse: ScFunctionDockWin
805 #*
806 #* Funktion: Aktualisiert die Liste der Funktionen ab-
807 #* haengig von der eingestellten Kategorie.
808 #*
809 #* Input: ---
810 #*
811 #* Output: ---
812 #*
813 #************************************************************************/
814
UpdateFunctionList()815 void ScFunctionDockWin::UpdateFunctionList()
816 {
817 sal_uInt16 nSelPos = aCatBox.GetSelectEntryPos();
818 sal_uInt16 nCategory = ( LISTBOX_ENTRY_NOTFOUND != nSelPos )
819 ? (nSelPos-1) : 0;
820
821 pAllFuncList->Clear();
822 pAllFuncList->SetUpdateMode( sal_False );
823
824 if ( nSelPos > 0 )
825 {
826 ScFunctionMgr* pFuncMgr = ScGlobal::GetStarCalcFunctionMgr();
827
828 const ScFuncDesc* pDesc = pFuncMgr->First( nCategory );
829 while ( pDesc )
830 {
831 pAllFuncList->SetEntryData(
832 pAllFuncList->InsertEntry( *(pDesc->pFuncName) ),
833 (void*)pDesc );
834 pDesc = pFuncMgr->Next();
835 }
836 }
837 else // LRU-Liste
838 {
839 for ( sal_uInt16 i=0; i<LRU_MAX && aLRUList[i]; i++ )
840 {
841 const ScFuncDesc* pDesc = aLRUList[i];
842 pAllFuncList->SetEntryData(
843 pAllFuncList->InsertEntry( *(pDesc->pFuncName) ),
844 (void*)pDesc );
845 }
846 }
847
848
849 //------------------------------------------------------
850 pAllFuncList->SetUpdateMode( sal_True );
851
852 if ( pAllFuncList->GetEntryCount() > 0 )
853 {
854 pAllFuncList->Enable();
855 pAllFuncList->SelectEntryPos( 0 );
856 }
857 else
858 {
859 pAllFuncList->Disable();
860 }
861 }
862
863 /*************************************************************************
864 #* Member: DoEnter Datum:06.10.97
865 #*------------------------------------------------------------------------
866 #*
867 #* Klasse: ScFunctionDockWin
868 #*
869 #* Funktion: Eingabe ins Dokument uebernehmen. Wird aufgerufen
870 #* nach betaetigen der Uebernehmen- Schaltflaeche
871 #* oder einem Doppelklick in die Funktionsliste.
872 #*
873 #* Input: ---
874 #*
875 #* Output: ---
876 #*
877 #************************************************************************/
878
DoEnter(sal_Bool)879 void ScFunctionDockWin::DoEnter(sal_Bool /* bOk */) //@@ ???
880 {
881 String aFirstArgStr;
882 String aParaStr;
883 String aArgStr;
884 String aString=pAllFuncList->GetSelectEntry();
885 SfxViewShell* pCurSh = SfxViewShell::Current();
886 nArgs=0;
887
888 if(aString.Len()>0)
889 {
890
891 ScModule* pScMod = SC_MOD();
892 ScTabViewShell* pViewSh = PTR_CAST( ScTabViewShell, pCurSh);
893 ScInputHandler* pHdl = pScMod->GetInputHdl( pViewSh );
894 if(!pScMod->IsEditMode())
895 {
896 pScMod->SetInputMode(SC_INPUT_TABLE);
897 aString = '=';
898 aString += pAllFuncList->GetSelectEntry();
899 if (pHdl)
900 pHdl->ClearText();
901 }
902 const ScFuncDesc* pDesc =
903 (const ScFuncDesc*)pAllFuncList->GetEntryData(
904 pAllFuncList->GetSelectEntryPos() );
905 if (pDesc)
906 {
907 pFuncDesc=pDesc;
908 UpdateLRUList();
909 nArgs = pDesc->nArgCount;
910 if(nArgs>0)
911 {
912 // NOTE: Theoretically the first parameter could have the
913 // suppress flag as well, but practically it doesn't.
914 aFirstArgStr = *(pDesc->ppDefArgNames[0]);
915 aFirstArgStr.EraseLeadingAndTrailingChars();
916 aFirstArgStr.SearchAndReplaceAll(' ', '_');
917 aArgStr = aFirstArgStr;
918 if ( nArgs != VAR_ARGS && nArgs != PAIRED_VAR_ARGS )
919 { // no VarArgs or Fix plus VarArgs, but not VarArgs only
920 String aArgSep = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( "; " ));
921 sal_uInt16 nFix;
922 if (nArgs >= PAIRED_VAR_ARGS)
923 nFix = nArgs - PAIRED_VAR_ARGS + 2;
924 else if (nArgs >= VAR_ARGS)
925 nFix = nArgs - VAR_ARGS + 1;
926 else
927 nFix = nArgs;
928 for ( sal_uInt16 nArg = 1;
929 nArg < nFix && !pDesc->pDefArgFlags[nArg].bOptional; nArg++ )
930 {
931 if (!pDesc->pDefArgFlags[nArg].bSuppress)
932 {
933 aArgStr += aArgSep;
934 String sTmp(*(pDesc->ppDefArgNames[nArg]));
935 sTmp.EraseLeadingAndTrailingChars();
936 sTmp.SearchAndReplaceAll(' ', '_');
937 aArgStr += sTmp;
938 }
939 }
940 }
941 }
942 }
943 if (pHdl)
944 {
945 if(pHdl->GetEditString().Len()==0)
946 {
947 aString = '=';
948 aString += pAllFuncList->GetSelectEntry();
949 }
950 EditView *pEdView=pHdl->GetActiveView();
951 if(pEdView!=NULL) // @ Wegen Absturz bei Namen festlegen
952 {
953 if(nArgs>0)
954 {
955 pHdl->InsertFunction(aString);
956 pEdView->InsertText(aArgStr,sal_True);
957 ESelection aESel=pEdView->GetSelection();
958 aESel.nEndPos=aESel.nStartPos+aFirstArgStr.Len();
959 pEdView->SetSelection(aESel);
960 pHdl->DataChanged();
961 }
962 else
963 {
964 aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "()" ));
965 pEdView->InsertText(aString,sal_False);
966 pHdl->DataChanged();
967 }
968 }
969 }
970 InitLRUList();
971 }
972 if ( pCurSh )
973 {
974 Window* pShellWnd = pCurSh->GetWindow();
975
976 if ( pShellWnd )
977 pShellWnd->GrabFocus();
978 }
979
980
981 }
982
983
984
985 /*************************************************************************
986 #* Handle: SelHdl Datum:06.10.97
987 #*------------------------------------------------------------------------
988 #*
989 #* Klasse: ScFunctionDockWin
990 #*
991 #* Funktion: Bei einer Aenderung der Kategorie wird die
992 #* die Liste der Funktionen aktualisiert.
993 #*
994 #* Input: ---
995 #*
996 #* Output: ---
997 #*
998 #************************************************************************/
999
IMPL_LINK(ScFunctionDockWin,SelHdl,ListBox *,pLb)1000 IMPL_LINK( ScFunctionDockWin, SelHdl, ListBox*, pLb )
1001 {
1002 if ( pLb == &aCatBox)
1003 {
1004 UpdateFunctionList();
1005 SetDescription();
1006 }
1007
1008 if ( pLb == &aFuncList||pLb == &aDDFuncList)
1009 {
1010 SetDescription();
1011 }
1012
1013
1014 //SetSize();
1015 return 0;
1016 }
1017
1018 /*************************************************************************
1019 #* Handle: SelHdl Datum:06.10.97
1020 #*------------------------------------------------------------------------
1021 #*
1022 #* Klasse: ScFunctionDockWin
1023 #*
1024 #* Funktion: Bei einer Aenderung der Kategorie wird die
1025 #* die Liste der Funktionen aktualisiert.
1026 #*
1027 #* Input: ---
1028 #*
1029 #* Output: ---
1030 #*
1031 #************************************************************************/
1032
IMPL_LINK(ScFunctionDockWin,SetSelectionHdl,void *,pCtrl)1033 IMPL_LINK( ScFunctionDockWin, SetSelectionHdl, void*, pCtrl )
1034 {
1035 if ((ImageButton *)pCtrl == &aInsertButton ||
1036 (ListBox *)pCtrl == &aFuncList)
1037 {
1038 DoEnter(sal_True); // Uebernimmt die Eingabe
1039 }
1040 //...
1041
1042 return 0;
1043 }
1044
1045 /*************************************************************************
1046 #* Handle: SetSplitHdl Datum:13.10.97
1047 #*------------------------------------------------------------------------
1048 #*
1049 #* Klasse: ScFunctionDockWin
1050 #*
1051 #* Funktion: Bei einer Aenderung des Split- Controls werden die
1052 #* einzelnen Controls an die neue Groesse angepasst.
1053 #*
1054 #* Input: Zeiger auf Control
1055 #*
1056 #* Output: ---
1057 #*
1058 #************************************************************************/
1059
IMPL_LINK(ScFunctionDockWin,SetSplitHdl,ScPrivatSplit *,pCtrl)1060 IMPL_LINK( ScFunctionDockWin, SetSplitHdl, ScPrivatSplit*, pCtrl )
1061 {
1062 if (pCtrl == &aPrivatSplit)
1063 {
1064 short nDeltaY=aPrivatSplit.GetDeltaY();
1065 Size aFLSize=aFuncList.GetSizePixel();
1066 Size aFDSize=aFiFuncDesc.GetSizePixel();
1067 Point aFDTopLeft=aFiFuncDesc.GetPosPixel();
1068
1069 aFLSize.Height()+=nDeltaY;
1070 aFDSize.Height()-=nDeltaY;
1071 aFDTopLeft.Y()+=nDeltaY;
1072 aFuncList.SetSizePixel(aFLSize);
1073 aFiFuncDesc.SetPosPixel(aFDTopLeft);
1074 aFiFuncDesc.SetSizePixel(aFDSize);
1075 /*
1076 aFuncList.Invalidate();
1077 aFuncList.Update();
1078 aFiFuncDesc.Invalidate();
1079 aFiFuncDesc.Update();
1080 */
1081 }
1082 //...
1083
1084 return 0;
1085 }
1086
ToggleFloatingMode()1087 void ScFunctionDockWin::ToggleFloatingMode()
1088 {
1089 aSplitterInitPos = Point();
1090 SfxDockingWindow::ToggleFloatingMode();
1091
1092 eSfxNewAlignment=GetAlignment();
1093 eSfxOldAlignment=eSfxNewAlignment;
1094
1095 aOldSize.Height()=0;
1096 aOldSize.Width()=0;
1097 aTimer.Start();
1098 }
1099
IMPL_LINK(ScFunctionDockWin,TimerHdl,Timer *,EMPTYARG)1100 IMPL_LINK( ScFunctionDockWin, TimerHdl, Timer*, EMPTYARG )
1101 {
1102 CheckAlignment(eSfxOldAlignment,eSfxNewAlignment);
1103 SetSize();
1104 return 0;
1105 }
1106
Initialize(SfxChildWinInfo * pInfo)1107 void ScFunctionDockWin::Initialize(SfxChildWinInfo *pInfo)
1108 {
1109 String aStr;
1110 if(pInfo!=NULL)
1111 {
1112 if ( pInfo->aExtraString.Len() )
1113 {
1114 xub_StrLen nPos = pInfo->aExtraString.Search(
1115 String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ScFuncList:")));
1116
1117 // Versuche, den Alignment-String "ALIGN:(...)" einzulesen; wenn
1118 // er nicht vorhanden ist, liegt eine "altere Version vor
1119 if ( nPos != STRING_NOTFOUND )
1120 {
1121 xub_StrLen n1 = pInfo->aExtraString.Search('(', nPos);
1122 if ( n1 != STRING_NOTFOUND )
1123 {
1124 xub_StrLen n2 = pInfo->aExtraString.Search(')', n1);
1125 if ( n2 != STRING_NOTFOUND )
1126 {
1127 // Alignment-String herausschneiden
1128 aStr = pInfo->aExtraString.Copy(nPos, n2 - nPos + 1);
1129 pInfo->aExtraString.Erase(nPos, n2 - nPos + 1);
1130 aStr.Erase(0, n1-nPos+1);
1131 }
1132 }
1133 }
1134 }
1135 }
1136 SfxDockingWindow::Initialize(pInfo);
1137
1138 if ( aStr.Len())
1139 {
1140 aSplitterInitPos=aPrivatSplit.GetPosPixel();
1141 aSplitterInitPos.Y()=(sal_uInt16) aStr.ToInt32();
1142 xub_StrLen n1 = aStr.Search(';');
1143 aStr.Erase(0, n1+1);
1144 sal_uInt16 nSelPos=sal::static_int_cast<sal_uInt16>( aStr.ToInt32() );
1145 aCatBox.SelectEntryPos(nSelPos);
1146 SelHdl(&aCatBox);
1147
1148 // if the window has already been shown (from SfxDockingWindow::Initialize if docked),
1149 // set the splitter position now, otherwise it is set in StateChanged with type INITSHOW
1150
1151 UseSplitterInitPos();
1152 }
1153 }
1154
1155 //-------------------------------------------------------------------------
1156
FillInfo(SfxChildWinInfo & rInfo) const1157 void ScFunctionDockWin::FillInfo(SfxChildWinInfo& rInfo) const
1158 {
1159 SfxDockingWindow::FillInfo(rInfo);
1160 Point aPoint=aPrivatSplit.GetPosPixel();
1161 rInfo.aExtraString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "ScFuncList:(" ));
1162 rInfo.aExtraString += String::CreateFromInt32(aPoint.Y());
1163 rInfo.aExtraString += ';';
1164 rInfo.aExtraString += String::CreateFromInt32(aCatBox.GetSelectEntryPos());
1165 rInfo.aExtraString += ')';
1166 }
1167
UseSplitterInitPos()1168 void ScFunctionDockWin::UseSplitterInitPos()
1169 {
1170 if ( IsVisible() && aPrivatSplit.IsEnabled() && aSplitterInitPos != Point() )
1171 {
1172 aPrivatSplit.MoveSplitTo(aSplitterInitPos);
1173 aSplitterInitPos = Point(); // use only once
1174 }
1175 }
1176
StateChanged(StateChangedType nStateChange)1177 void ScFunctionDockWin::StateChanged( StateChangedType nStateChange )
1178 {
1179 SfxDockingWindow::StateChanged( nStateChange );
1180
1181 if (nStateChange == STATE_CHANGE_INITSHOW)
1182 {
1183 UseSplitterInitPos(); // set initial splitter position if necessary
1184 }
1185 }
1186
1187
1188