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