xref: /AOO41X/main/sc/source/ui/attrdlg/condfrmt.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
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 #include <sfx2/dispatch.hxx>
29 #include <svl/stritem.hxx>
30 
31 #include "tabvwsh.hxx"
32 #include "reffact.hxx"
33 #include "conditio.hxx"
34 #include "stlpool.hxx"
35 #include "uiitems.hxx"
36 #include "document.hxx"
37 #include "scresid.hxx"
38 
39 #include "condfrmt.hrc"
40 #include "globstr.hrc"
41 
42 #define _CONDFRMT_CXX
43 #include "condfrmt.hxx"
44 #undef _CONDFRMT_CXX
45 
46 
47 //============================================================================
48 //  class ScConditionalFormat
49 
50 //----------------------------------------------------------------------------
51 // Konstruktor
52 
ScConditionalFormatDlg(SfxBindings * pB,SfxChildWindow * pCW,Window * pParent,ScDocument * pCurDoc,const ScConditionalFormat * pCurrentFormat)53 ScConditionalFormatDlg::ScConditionalFormatDlg(
54             SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
55             ScDocument* pCurDoc,
56             const ScConditionalFormat* pCurrentFormat )
57     :   ScAnyRefDlg         ( pB, pCW, pParent, RID_SCDLG_CONDFORMAT ),
58 
59         aCbxCond1           ( this, ScResId( CBX_COND1 ) ),
60         aLbCond11           ( this, ScResId( LB_COND1_1 ) ),
61         aLbCond12           ( this, ScResId( LB_COND1_2 ) ),
62         aEdtCond11          ( this, this, ScResId( EDT_COND1_1 ) ),
63         aRbCond11           ( this, ScResId( RB_COND1_1 ), &aEdtCond11,this ),
64         aFtCond1And         ( this, ScResId( FT_COND1_AND ) ),
65         aEdtCond12          ( this, this, ScResId( EDT_COND1_2 ) ),
66         aRbCond12           ( this, ScResId( RB_COND1_2 ), &aEdtCond12,this ),
67         aFtCond1Template    ( this, ScResId( FT_COND1_TEMPLATE ) ),
68         aLbCond1Template    ( this, ScResId( LB_COND1_TEMPLATE ) ),
69         aBtnNew1            ( this, ScResId( BTN_COND1_NEW ) ),
70 
71         aCbxCond2           ( this, ScResId( CBX_COND2 ) ),
72         aLbCond21           ( this, ScResId( LB_COND2_1 ) ),
73         aLbCond22           ( this, ScResId( LB_COND2_2 ) ),
74         aEdtCond21          ( this, this, ScResId( EDT_COND2_1 ) ),
75         aRbCond21           ( this, ScResId( RB_COND2_1 ), &aEdtCond21,this ),
76         aFtCond2And         ( this, ScResId( FT_COND2_AND ) ),
77         aEdtCond22          ( this, this, ScResId( EDT_COND2_2 ) ),
78         aRbCond22           ( this, ScResId( RB_COND2_2 ), &aEdtCond22,this ),
79         aFtCond2Template    ( this, ScResId( FT_COND2_TEMPLATE ) ),
80         aLbCond2Template    ( this, ScResId( LB_COND2_TEMPLATE ) ),
81         aBtnNew2            ( this, ScResId( BTN_COND2_NEW ) ),
82 
83         aCbxCond3           ( this, ScResId( CBX_COND3 ) ),
84         aLbCond31           ( this, ScResId( LB_COND3_1 ) ),
85         aLbCond32           ( this, ScResId( LB_COND3_2 ) ),
86         aEdtCond31          ( this, this, ScResId( EDT_COND3_1 ) ),
87         aRbCond31           ( this, ScResId( RB_COND3_1 ), &aEdtCond31,this ),
88         aFtCond3And         ( this, ScResId( FT_COND3_AND ) ),
89         aEdtCond32          ( this, this, ScResId( EDT_COND3_2 ) ),
90         aRbCond32           ( this, ScResId( RB_COND3_2 ), &aEdtCond32,this ),
91         aFtCond3Template    ( this, ScResId( FT_COND3_TEMPLATE ) ),
92         aLbCond3Template    ( this, ScResId( LB_COND3_TEMPLATE ) ),
93         aBtnNew3            ( this, ScResId( BTN_COND3_NEW ) ),
94 
95         aBtnOk              ( this, ScResId( BTN_OK ) ),
96         aBtnCancel          ( this, ScResId( BTN_CANCEL ) ),
97         aBtnHelp            ( this, ScResId( BTN_HELP ) ),
98         aFlSep2             ( this, ScResId( FL_SEP2 ) ),
99         aFlSep1             ( this, ScResId( FL_SEP1 ) ),
100         pEdActive           ( NULL ),
101         bDlgLostFocus       ( sal_False ),
102 
103         pDoc                ( pCurDoc )
104 {
105     Point aPos;
106     String aName;
107     SfxStyleSheetBase* pStyle;
108 
109     FreeResource();
110 
111     // Handler setzen
112     aCbxCond1.SetClickHdl ( LINK( this, ScConditionalFormatDlg, ClickCond1Hdl ) );
113     aLbCond11.SetSelectHdl( LINK( this, ScConditionalFormatDlg, ChangeCond11Hdl ) );
114     aLbCond12.SetSelectHdl( LINK( this, ScConditionalFormatDlg, ChangeCond12Hdl ) );
115 
116     aCbxCond2.SetClickHdl ( LINK( this, ScConditionalFormatDlg, ClickCond2Hdl ) );
117     aLbCond21.SetSelectHdl( LINK( this, ScConditionalFormatDlg, ChangeCond21Hdl ) );
118     aLbCond22.SetSelectHdl( LINK( this, ScConditionalFormatDlg, ChangeCond22Hdl ) );
119 
120     aCbxCond3.SetClickHdl ( LINK( this, ScConditionalFormatDlg, ClickCond3Hdl ) );
121     aLbCond31.SetSelectHdl( LINK( this, ScConditionalFormatDlg, ChangeCond31Hdl ) );
122     aLbCond32.SetSelectHdl( LINK( this, ScConditionalFormatDlg, ChangeCond32Hdl ) );
123 
124     aBtnOk.SetClickHdl    ( LINK( this, ScConditionalFormatDlg, BtnHdl ) );
125 //? aBtnCancel.SetClickHdl( LINK( this, ScConditionalFormatDlg, BtnHdl ) );
126 
127     Link aLink = LINK( this, ScConditionalFormatDlg, NewBtnHdl );
128     aBtnNew1.SetClickHdl( aLink );
129     aBtnNew2.SetClickHdl( aLink );
130     aBtnNew3.SetClickHdl( aLink );
131 
132     aLink = LINK( this, ScConditionalFormatDlg, GetFocusHdl );
133     aEdtCond11.SetGetFocusHdl( aLink );
134     aEdtCond12.SetGetFocusHdl( aLink );
135     aEdtCond21.SetGetFocusHdl( aLink );
136     aEdtCond22.SetGetFocusHdl( aLink );
137     aEdtCond31.SetGetFocusHdl( aLink );
138     aEdtCond32.SetGetFocusHdl( aLink );
139     aRbCond11.SetGetFocusHdl( aLink );
140     aRbCond12.SetGetFocusHdl( aLink );
141     aRbCond21.SetGetFocusHdl( aLink );
142     aRbCond22.SetGetFocusHdl( aLink );
143     aRbCond31.SetGetFocusHdl( aLink );
144     aRbCond32.SetGetFocusHdl( aLink );
145 
146     aLink = LINK( this, ScConditionalFormatDlg, LoseFocusHdl );
147     aEdtCond11.SetLoseFocusHdl( aLink );
148     aEdtCond12.SetLoseFocusHdl( aLink );
149     aEdtCond21.SetLoseFocusHdl( aLink );
150     aEdtCond22.SetLoseFocusHdl( aLink );
151     aEdtCond31.SetLoseFocusHdl( aLink );
152     aEdtCond32.SetLoseFocusHdl( aLink );
153     aRbCond11.SetLoseFocusHdl( aLink );
154     aRbCond12.SetLoseFocusHdl( aLink );
155     aRbCond21.SetLoseFocusHdl( aLink );
156     aRbCond22.SetLoseFocusHdl( aLink );
157     aRbCond31.SetLoseFocusHdl( aLink );
158     aRbCond32.SetLoseFocusHdl( aLink );
159 
160     // Condition 1
161     aCond1Pos1 = aLbCond12.GetPosPixel();       // Position Edit ohne Listbox
162     aCond1Pos2 = aEdtCond11.GetPosPixel();      // Position Edit mit Listbox
163     aRBtn1Pos1 = aRbCond11.GetPosPixel();
164     aRBtn1Pos2 = aRbCond12.GetPosPixel();
165     aPos = aEdtCond12.GetPosPixel();
166     aPos.X() += aEdtCond12.GetSizePixel().Width();  // rechter Rand
167     aCond1Size3 = aEdtCond11.GetSizePixel();
168     aCond1Size2 = Size( aPos.X() - aCond1Pos2.X(), aCond1Size3.Height() );
169     aCond1Size1 = Size( aPos.X() - aCond1Pos1.X(), aCond1Size3.Height() );
170 
171     aCbxCond1.Check();
172     aLbCond11.SelectEntryPos( 0 );
173     aLbCond12.SelectEntryPos( 0 );
174 
175     // Condition 2
176     aCond2Pos1  = aLbCond22.GetPosPixel();      // Position Edit ohne Listbox
177     aCond2Pos2  = aEdtCond21.GetPosPixel();     // Position Edit mit Listbox
178     aRBtn2Pos1 = aRbCond21.GetPosPixel();
179     aRBtn2Pos2 = aRbCond22.GetPosPixel();
180     aPos = aEdtCond22.GetPosPixel();
181     aPos.X() += aEdtCond22.GetSizePixel().Width();  // rechter Rand
182     aCond2Size3 = aEdtCond21.GetSizePixel();
183     aCond2Size2 = Size( aPos.X() - aCond2Pos2.X(), aCond2Size3.Height() );
184     aCond2Size1 = Size( aPos.X() - aCond2Pos1.X(), aCond2Size3.Height() );
185 
186     aCbxCond2.Check( sal_False );
187     aLbCond21.SelectEntryPos( 0 );
188     aLbCond22.SelectEntryPos( 0 );
189 
190     // Condition 3
191     aCond3Pos1  = aLbCond32.GetPosPixel();      // Position Edit ohne Listbox
192     aCond3Pos2  = aEdtCond31.GetPosPixel();     // Position Edit mit Listbox
193     aRBtn3Pos1 = aRbCond31.GetPosPixel();
194     aRBtn3Pos2 = aRbCond32.GetPosPixel();
195     aPos = aEdtCond32.GetPosPixel();
196     aPos.X() += aEdtCond32.GetSizePixel().Width();  // rechter Rand
197     aCond3Size3 = aEdtCond31.GetSizePixel();
198     aCond3Size2 = Size( aPos.X() - aCond3Pos2.X(), aCond3Size3.Height() );
199     aCond3Size1 = Size( aPos.X() - aCond3Pos1.X(), aCond3Size3.Height() );
200 
201     aCbxCond3.Check( sal_False );
202     aLbCond31.SelectEntryPos( 0 );
203     aLbCond32.SelectEntryPos( 0 );
204 
205     // Vorlagen aus pDoc holen
206     SfxStyleSheetIterator aStyleIter( pDoc->GetStyleSheetPool(), SFX_STYLE_FAMILY_PARA );
207     for ( pStyle = aStyleIter.First(); pStyle; pStyle = aStyleIter.Next() )
208     {
209         aName = pStyle->GetName();
210         aLbCond1Template.InsertEntry( aName );
211         aLbCond2Template.InsertEntry( aName );
212         aLbCond3Template.InsertEntry( aName );
213     }
214 
215     // Vorlagen eintragen
216 //! pStyle = pDoc->GetSelectionStyle( /* ??? const ScMarkData& rMark ??? */ );
217     pStyle = NULL;  //!
218     if (pStyle)
219         aName = pStyle->GetName();
220     else
221         aName = ScGlobal::GetRscString(STR_STYLENAME_STANDARD);
222     aLbCond1Template.SelectEntry( aName );
223     aLbCond2Template.SelectEntry( aName );
224     aLbCond3Template.SelectEntry( aName );
225 
226     ScAddress aCurPos;
227     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
228     if (pViewShell)
229     {
230         ScViewData* pData = pViewShell->GetViewData();
231         aCurPos = ScAddress( pData->GetCurX(), pData->GetCurY(), pData->GetTabNo() );
232     }
233 
234     // Inhalt aus ConditionalFormat holen
235     if ( pCurrentFormat )
236     {
237         const ScCondFormatEntry* pEntry;
238         if ( pCurrentFormat->Count() > 0 )
239         {
240             pEntry= pCurrentFormat->GetEntry( 0 );
241             aEdtCond11.SetText( pEntry->GetExpression( aCurPos, 0 ) );
242             aLbCond1Template.SelectEntry( pEntry->GetStyle() );
243 
244             ScConditionMode eMode = pEntry->GetOperation();
245             if ( eMode == SC_COND_DIRECT )          // via Formel
246             {
247                 aLbCond11.SelectEntryPos( 1 );
248                 ChangeCond11Hdl( NULL );
249             }
250             else if ( eMode == SC_COND_NONE )       // ???
251                 ;
252             else                                    // via Werte
253             {
254                 aLbCond12.SelectEntryPos( sal::static_int_cast<sal_uInt16>( eMode ) );
255                 if ( ( eMode == SC_COND_BETWEEN ) || ( eMode == SC_COND_NOTBETWEEN ) )
256                     aEdtCond12.SetText( pEntry->GetExpression( aCurPos, 1 ) );
257             }
258         }
259 
260 
261         if ( pCurrentFormat->Count() > 1 )
262         {
263             aCbxCond2.Check( sal_True );
264             pEntry= pCurrentFormat->GetEntry( 1 );
265             aEdtCond21.SetText( pEntry->GetExpression( aCurPos, 0 ) );
266             aLbCond2Template.SelectEntry( pEntry->GetStyle() );
267 
268             ScConditionMode eMode = pEntry->GetOperation();
269             if ( eMode == SC_COND_DIRECT )          // via Formel
270             {
271                 aLbCond21.SelectEntryPos( 1 );
272                 ChangeCond21Hdl( NULL );
273             }
274             else if ( eMode == SC_COND_NONE )       // ???
275                 ;
276             else                                    // via Werte
277             {
278                 aLbCond22.SelectEntryPos( sal::static_int_cast<sal_uInt16>( eMode ) );
279                 if ( ( eMode == SC_COND_BETWEEN ) || ( eMode == SC_COND_NOTBETWEEN ) )
280                     aEdtCond22.SetText( pEntry->GetExpression( aCurPos, 1 ) );
281             }
282         }
283 
284         if ( pCurrentFormat->Count() > 2 )
285         {
286             aCbxCond3.Check( sal_True );
287             pEntry= pCurrentFormat->GetEntry( 2 );
288             aEdtCond31.SetText( pEntry->GetExpression( aCurPos, 0 ) );
289             aLbCond3Template.SelectEntry( pEntry->GetStyle() );
290 
291             ScConditionMode eMode = pEntry->GetOperation();
292             if ( eMode == SC_COND_DIRECT )          // via Formel
293             {
294                 aLbCond31.SelectEntryPos( 1 );
295                 ChangeCond31Hdl( NULL );
296             }
297             else if ( eMode == SC_COND_NONE )       // ???
298                 ;
299             else                                    // via Werte
300             {
301                 aLbCond32.SelectEntryPos( sal::static_int_cast<sal_uInt16>( eMode ) );
302                 if ( ( eMode == SC_COND_BETWEEN ) || ( eMode == SC_COND_NOTBETWEEN ) )
303                     aEdtCond32.SetText( pEntry->GetExpression( aCurPos, 1 ) );
304             }
305         }
306     }
307 
308     ClickCond1Hdl( NULL );
309     ClickCond2Hdl( NULL );
310     ClickCond3Hdl( NULL );
311 
312     ChangeCond12Hdl( NULL );
313     ChangeCond22Hdl( NULL );
314     ChangeCond32Hdl( NULL );
315 
316     aEdtCond11.GrabFocus();
317     pEdActive = &aEdtCond11;
318     //@BugID 54702 Enablen/Disablen nur noch in Basisklasse
319     //SFX_APPWINDOW->Enable();      // Ref-Feld hat Focus
320 //  SFX_APPWINDOW->Disable();
321 
322     aLbCond11.SetAccessibleRelationLabeledBy( &aCbxCond1 );
323     aLbCond12.SetAccessibleRelationLabeledBy( &aCbxCond1 );
324     aEdtCond11.SetAccessibleRelationLabeledBy( &aCbxCond1 );
325     aRbCond11.SetAccessibleRelationLabeledBy( &aCbxCond1 );
326 
327     aLbCond21.SetAccessibleRelationLabeledBy( &aCbxCond2 );
328     aLbCond22.SetAccessibleRelationLabeledBy( &aCbxCond2 );
329     aEdtCond21.SetAccessibleRelationLabeledBy( &aCbxCond2 );
330     aRbCond21.SetAccessibleRelationLabeledBy( &aCbxCond2 );
331 
332     aLbCond31.SetAccessibleRelationLabeledBy( &aCbxCond3 );
333     aLbCond32.SetAccessibleRelationLabeledBy( &aCbxCond3 );
334     aEdtCond31.SetAccessibleRelationLabeledBy( &aCbxCond3 );
335     aRbCond31.SetAccessibleRelationLabeledBy( &aCbxCond3 );
336     aLbCond11.SetAccessibleName( ScResId(LABEL_FORMARTTING_CONDITIONS) );
337     aLbCond12.SetAccessibleName( ScResId(LABEL_CONDITIONS) );
338     aEdtCond11.SetAccessibleName( ScResId(LABEL_CONDITION_VALUE) );
339 
340     aLbCond21.SetAccessibleName( ScResId(LABEL_FORMARTTING_CONDITIONS) );
341     aLbCond22.SetAccessibleName( ScResId(LABEL_CONDITIONS) );
342     aEdtCond21.SetAccessibleName( ScResId(LABEL_CONDITION_VALUE) );
343 
344     aLbCond31.SetAccessibleName( ScResId(LABEL_FORMARTTING_CONDITIONS) );
345     aLbCond32.SetAccessibleName( ScResId(LABEL_CONDITIONS) );
346     aEdtCond31.SetAccessibleName( ScResId(LABEL_CONDITION_VALUE) );
347 }
348 
349 
350 //----------------------------------------------------------------------------
351 // Destruktor
352 
~ScConditionalFormatDlg()353 __EXPORT ScConditionalFormatDlg::~ScConditionalFormatDlg()
354 {
355 }
356 
357 
358 //----------------------------------------------------------------------------
359 
SetReference(const ScRange & rRef,ScDocument * pDocP)360 void ScConditionalFormatDlg::SetReference( const ScRange& rRef, ScDocument* pDocP )
361 {
362     if ( pEdActive )
363     {
364         if ( rRef.aStart != rRef.aEnd )
365             RefInputStart(pEdActive);
366 
367         String aStr;
368         rRef.Format( aStr, SCR_ABS_3D, pDocP, pDocP->GetAddressConvention () );
369         String aVal( pEdActive->GetText() );
370         Selection aSel( pEdActive->GetSelection() );
371         aSel.Justify();
372         aVal.Erase( (xub_StrLen)aSel.Min(), (xub_StrLen)aSel.Len() );
373         aVal.Insert( aStr, (xub_StrLen)aSel.Min() );
374         Selection aNewSel( aSel.Min(), aSel.Min()+aStr.Len() );
375         pEdActive->SetRefString( aVal );
376         pEdActive->SetSelection( aNewSel );
377 //      pEdActive->SetModifyFlag();
378     }
379 }
380 
381 //----------------------------------------------------------------------------
382 
AddRefEntry()383 void ScConditionalFormatDlg::AddRefEntry()
384 {
385     if ( pEdActive )
386     {
387         String aVal = pEdActive->GetText();
388         aVal += ';';
389         pEdActive->SetText(aVal);
390 
391         xub_StrLen nLen = aVal.Len();
392         pEdActive->SetSelection( Selection( nLen, nLen ) );
393 //      pEdActive->SetModifyFlag();
394     }
395 }
396 
397 //----------------------------------------------------------------------------
398 
IsRefInputMode() const399 sal_Bool ScConditionalFormatDlg::IsRefInputMode() const
400 {
401     return (pEdActive != NULL);
402 }
403 
404 
405 //----------------------------------------------------------------------------
406 
SetActive()407 void ScConditionalFormatDlg::SetActive()
408 {
409     if ( bDlgLostFocus )
410     {
411         bDlgLostFocus = sal_False;
412         if( pEdActive )
413             pEdActive->GrabFocus();
414     }
415     else
416         GrabFocus();
417 
418     RefInputDone();
419 }
420 
421 
422 //----------------------------------------------------------------------------
423 // Holt die ausgewaehlte bedingte Formatierung ab
424 
GetConditionalFormat(ScConditionalFormat & rCndFmt)425 void ScConditionalFormatDlg::GetConditionalFormat( ScConditionalFormat& rCndFmt )
426 {
427     ScConditionMode eOper;
428     String sExpr1;
429     String sExpr2;
430     String sStyle;
431     ScAddress aCurPos;
432 
433     ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
434     if (pViewShell)
435     {
436         ScViewData* pData = pViewShell->GetViewData();
437         aCurPos = ScAddress( pData->GetCurX(), pData->GetCurY(), pData->GetTabNo() );
438     }
439 
440     if ( aCbxCond1.IsChecked() )
441     {
442         if ( aLbCond11.GetSelectEntryPos() == 1 )   // via Formel
443             eOper = SC_COND_DIRECT;
444         else
445             eOper = (ScConditionMode)aLbCond12.GetSelectEntryPos();
446         sExpr1 = aEdtCond11.GetText();
447         sExpr2 = aEdtCond12.GetText();
448         sStyle = aLbCond1Template.GetSelectEntry();
449         ScCondFormatEntry aNewEntry( eOper, sExpr1, sExpr2, pDoc, aCurPos, sStyle );
450         rCndFmt.AddEntry( aNewEntry );
451     }
452 
453     if ( aCbxCond2.IsChecked() )
454     {
455         if ( aLbCond21.GetSelectEntryPos() == 1 )   // via Formel???
456             eOper = SC_COND_DIRECT;
457         else
458             eOper = (ScConditionMode)aLbCond22.GetSelectEntryPos();
459         sExpr1 = aEdtCond21.GetText();
460         sExpr2 = aEdtCond22.GetText();
461         sStyle = aLbCond2Template.GetSelectEntry();
462         ScCondFormatEntry aNewEntry( eOper, sExpr1, sExpr2, pDoc, aCurPos, sStyle );
463         rCndFmt.AddEntry( aNewEntry );
464     }
465 
466     if ( aCbxCond3.IsChecked() )
467     {
468         if ( aLbCond31.GetSelectEntryPos() == 1 )   // via Formel???
469             eOper = SC_COND_DIRECT;
470         else
471             eOper = (ScConditionMode)aLbCond32.GetSelectEntryPos();
472         sExpr1 = aEdtCond31.GetText();
473         sExpr2 = aEdtCond32.GetText();
474         sStyle = aLbCond3Template.GetSelectEntry();
475         ScCondFormatEntry aNewEntry( eOper, sExpr1, sExpr2, pDoc, aCurPos, sStyle );
476         rCndFmt.AddEntry( aNewEntry );
477     }
478 }
479 
480 
481 //----------------------------------------------------------------------------
482 // Zerstoert den Dialog
483 
Close()484 sal_Bool ScConditionalFormatDlg::Close()
485 {
486     return DoClose( ScCondFormatDlgWrapper::GetChildWindowId() );
487 }
488 
489 
490 //----------------------------------------------------------------------------
491 // Handler:
492 
493 //----------------------------------------------------------------------------
494 // Enabled/Disabled Condition1-Controls
495 
IMPL_LINK(ScConditionalFormatDlg,ClickCond1Hdl,void *,EMPTYARG)496 IMPL_LINK( ScConditionalFormatDlg, ClickCond1Hdl, void *, EMPTYARG )
497 {
498     sal_Bool bChecked = aCbxCond1.IsChecked();
499 
500     aLbCond11.Enable( bChecked );
501     aLbCond12.Enable( bChecked );
502     aEdtCond11.Enable( bChecked );
503     aRbCond11.Enable( bChecked );
504     aFtCond1And.Enable( bChecked );
505     aEdtCond12.Enable( bChecked );
506     aRbCond12.Enable( bChecked );
507     aFtCond1Template.Enable( bChecked );
508     aLbCond1Template.Enable( bChecked );
509     aBtnNew1.Enable( bChecked );
510 
511     return( 0L );
512 }
513 
514 
515 //----------------------------------------------------------------------------
516 // Zellwert/Formel
517 
IMPL_LINK(ScConditionalFormatDlg,ChangeCond11Hdl,void *,EMPTYARG)518 IMPL_LINK( ScConditionalFormatDlg, ChangeCond11Hdl, void *, EMPTYARG )
519 {
520     sal_uInt16 nPos = aLbCond11.GetSelectEntryPos();
521 
522     if( nPos == 0 ) // Zellwert
523     {
524         aLbCond12.Show();
525         aEdtCond11.SetPosPixel( aCond1Pos2 );
526     }
527     else // Formel
528     {
529         aLbCond12.Hide();
530         aFtCond1And.Hide();
531         aEdtCond12.Hide();
532         aRbCond12.Hide();
533         aRbCond11.SetPosPixel( aRBtn1Pos2 );
534         aEdtCond11.SetPosSizePixel( aCond1Pos1, aCond1Size1 );
535     }
536 
537     ChangeCond12Hdl( NULL );
538 
539     return( 0L );
540 }
541 
542 
543 //----------------------------------------------------------------------------
544 // zwischen, gleich, groesser, ...
545 
IMPL_LINK(ScConditionalFormatDlg,ChangeCond12Hdl,void *,EMPTYARG)546 IMPL_LINK( ScConditionalFormatDlg, ChangeCond12Hdl, void *, EMPTYARG )
547 {
548     if( aLbCond12.IsVisible() )
549     {
550         sal_uInt16 nPos = aLbCond12.GetSelectEntryPos();
551 
552         if( nPos == 6  || nPos == 7 ) // zwischen, n. zwischen
553         {
554             aEdtCond11.SetSizePixel( aCond1Size3 );
555             aRbCond11.SetPosPixel( aRBtn1Pos1 );
556             aFtCond1And.Show();
557             aEdtCond12.Show();
558             aRbCond12.Show();
559         }
560         else // gleich, n. gleich ...
561         {
562             aEdtCond12.Hide();
563             aRbCond12.Hide();
564             aFtCond1And.Hide();
565             aRbCond11.SetPosPixel( aRBtn1Pos2 );
566             aEdtCond11.SetSizePixel( aCond1Size2 );
567         }
568     }
569 
570     return( 0L );
571 }
572 
573 
574 //----------------------------------------------------------------------------
575 // Enabled/Disabled Condition2-Controls
576 
IMPL_LINK(ScConditionalFormatDlg,ClickCond2Hdl,void *,EMPTYARG)577 IMPL_LINK( ScConditionalFormatDlg, ClickCond2Hdl, void *, EMPTYARG )
578 {
579     sal_Bool bChecked = aCbxCond2.IsChecked();
580 
581     aLbCond21.Enable( bChecked );
582     aLbCond22.Enable( bChecked );
583     aEdtCond21.Enable( bChecked );
584     aRbCond21.Enable( bChecked );
585     aFtCond2And.Enable( bChecked );
586     aEdtCond22.Enable( bChecked );
587     aRbCond22.Enable( bChecked );
588     aFtCond2Template.Enable( bChecked );
589     aLbCond2Template.Enable( bChecked );
590     aBtnNew2.Enable( bChecked );
591 
592     return( 0L );
593 }
594 
595 
596 //----------------------------------------------------------------------------
597 // Zellwert/Formel
598 
IMPL_LINK(ScConditionalFormatDlg,ChangeCond21Hdl,void *,EMPTYARG)599 IMPL_LINK( ScConditionalFormatDlg, ChangeCond21Hdl, void *, EMPTYARG )
600 {
601     sal_uInt16 nPos = aLbCond21.GetSelectEntryPos();
602 
603     if( nPos == 0 ) // Zellwert
604     {
605         aLbCond22.Show();
606         aEdtCond21.SetPosPixel( aCond2Pos2 );
607     }
608     else // Formel
609     {
610         aLbCond22.Hide();
611         aFtCond2And.Hide();
612         aEdtCond22.Hide();
613         aRbCond22.Hide();
614         aRbCond21.SetPosPixel( aRBtn2Pos2 );
615         aEdtCond21.SetPosSizePixel( aCond2Pos1, aCond2Size1 );
616     }
617 
618     ChangeCond22Hdl( NULL );
619 
620     return( 0L );
621 }
622 
623 
624 //----------------------------------------------------------------------------
625 // zwischen, gleich, groesser, ...
626 
IMPL_LINK(ScConditionalFormatDlg,ChangeCond22Hdl,void *,EMPTYARG)627 IMPL_LINK( ScConditionalFormatDlg, ChangeCond22Hdl, void *, EMPTYARG )
628 {
629     if( aLbCond22.IsVisible() )
630     {
631         sal_uInt16 nPos = aLbCond22.GetSelectEntryPos();
632 
633         if( nPos == 6  || nPos == 7 ) // zwischen, n. zwischen
634         {
635             aEdtCond21.SetSizePixel( aCond2Size3 );
636             aRbCond21.SetPosPixel( aRBtn2Pos1 );
637             aFtCond2And.Show();
638             aEdtCond22.Show();
639             aRbCond22.Show();
640         }
641         else // gleich, n. gleich ...
642         {
643             aEdtCond22.Hide();
644             aRbCond22.Hide();
645             aFtCond2And.Hide();
646             aRbCond21.SetPosPixel( aRBtn2Pos2 );
647             aEdtCond21.SetSizePixel( aCond2Size2 );
648         }
649     }
650 
651     return( 0L );
652 }
653 
654 
655 //----------------------------------------------------------------------------
656 // Enabled/Disabled Condition3-Controls
657 
IMPL_LINK(ScConditionalFormatDlg,ClickCond3Hdl,void *,EMPTYARG)658 IMPL_LINK( ScConditionalFormatDlg, ClickCond3Hdl, void *, EMPTYARG )
659 {
660     sal_Bool bChecked = aCbxCond3.IsChecked();
661 
662     aLbCond31.Enable( bChecked );
663     aLbCond32.Enable( bChecked );
664     aEdtCond31.Enable( bChecked );
665     aRbCond31.Enable( bChecked );
666     aFtCond3And.Enable( bChecked );
667     aEdtCond32.Enable( bChecked );
668     aRbCond32.Enable( bChecked );
669     aFtCond3Template.Enable( bChecked );
670     aLbCond3Template.Enable( bChecked );
671     aBtnNew3.Enable( bChecked );
672 
673     return( 0L );
674 }
675 
676 
677 //----------------------------------------------------------------------------
678 // Zellwert/Formel
679 
IMPL_LINK(ScConditionalFormatDlg,ChangeCond31Hdl,void *,EMPTYARG)680 IMPL_LINK( ScConditionalFormatDlg, ChangeCond31Hdl, void *, EMPTYARG )
681 {
682     sal_uInt16 nPos = aLbCond31.GetSelectEntryPos();
683 
684     if( nPos == 0 ) // Zellwert
685     {
686         aLbCond32.Show();
687         aEdtCond31.SetPosPixel( aCond3Pos2 );
688     }
689     else // Formel
690     {
691         aLbCond32.Hide();
692         aFtCond3And.Hide();
693         aEdtCond32.Hide();
694         aRbCond32.Hide();
695         aRbCond31.SetPosPixel( aRBtn3Pos2 );
696         aEdtCond31.SetPosSizePixel( aCond3Pos1, aCond3Size1 );
697     }
698 
699     ChangeCond32Hdl( NULL );
700 
701     return( 0L );
702 }
703 
704 
705 //----------------------------------------------------------------------------
706 // zwischen, gleich, groesser, ...
707 
IMPL_LINK(ScConditionalFormatDlg,ChangeCond32Hdl,void *,EMPTYARG)708 IMPL_LINK( ScConditionalFormatDlg, ChangeCond32Hdl, void *, EMPTYARG )
709 {
710     if( aLbCond32.IsVisible() )
711     {
712         sal_uInt16 nPos = aLbCond32.GetSelectEntryPos();
713 
714         if( nPos == 6  || nPos == 7 ) // zwischen, n. zwischen
715         {
716             aEdtCond31.SetSizePixel( aCond3Size3 );
717             aRbCond31.SetPosPixel( aRBtn3Pos1 );
718             aFtCond3And.Show();
719             aEdtCond32.Show();
720             aRbCond32.Show();
721         }
722         else // gleich, n. gleich ...
723         {
724             aEdtCond32.Hide();
725             aRbCond32.Hide();
726             aFtCond3And.Hide();
727             aRbCond31.SetPosPixel( aRBtn3Pos2 );
728             aEdtCond31.SetSizePixel( aCond3Size2 );
729         }
730     }
731 
732     return( 0L );
733 }
734 
735 
736 //----------------------------------------------------------------------------
737 
IMPL_LINK(ScConditionalFormatDlg,GetFocusHdl,Control *,pCtrl)738 IMPL_LINK( ScConditionalFormatDlg, GetFocusHdl, Control*, pCtrl )
739 {
740     if( (pCtrl == (Control*)&aEdtCond11) || (pCtrl == (Control*)&aRbCond11) )
741         pEdActive = &aEdtCond11;
742     else if( (pCtrl == (Control*)&aEdtCond12) || (pCtrl == (Control*)&aRbCond12) )
743         pEdActive = &aEdtCond12;
744     else if( (pCtrl == (Control*)&aEdtCond21) || (pCtrl == (Control*)&aRbCond21) )
745         pEdActive = &aEdtCond21;
746     else if( (pCtrl == (Control*)&aEdtCond22) || (pCtrl == (Control*)&aRbCond22) )
747         pEdActive = &aEdtCond22;
748     else if( (pCtrl == (Control*)&aEdtCond31) || (pCtrl == (Control*)&aRbCond31) )
749         pEdActive = &aEdtCond31;
750     else if( (pCtrl == (Control*)&aEdtCond32) || (pCtrl == (Control*)&aRbCond32) )
751         pEdActive = &aEdtCond32;
752     else
753         pEdActive = NULL;
754 
755     if( pEdActive )
756         pEdActive->SetSelection( Selection( 0, SELECTION_MAX ) );
757 
758     return 0;
759 }
760 
761 
762 //----------------------------------------------------------------------------
763 
IMPL_LINK(ScConditionalFormatDlg,LoseFocusHdl,Control *,EMPTYARG)764 IMPL_LINK( ScConditionalFormatDlg, LoseFocusHdl, Control*, EMPTYARG )
765 {
766     bDlgLostFocus = !IsActive();
767     return 0;
768 }
769 
770 
771 //----------------------------------------------------------------------------
772 //  [OK], [Cancel]
773 
IMPL_LINK(ScConditionalFormatDlg,BtnHdl,PushButton *,pBtn)774 IMPL_LINK( ScConditionalFormatDlg, BtnHdl, PushButton*, pBtn )
775 {
776     if ( pBtn == &aBtnOk )
777     {
778         ScConditionalFormat aCondFrmt( 0, pDoc );
779         GetConditionalFormat( aCondFrmt );
780         ScCondFrmtItem aOutItem( FID_CONDITIONAL_FORMAT, aCondFrmt );
781 
782         SetDispatcherLock( sal_False );
783         SwitchToDocument();
784         GetBindings().GetDispatcher()->Execute( FID_CONDITIONAL_FORMAT,
785                                   SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD,
786                                   &aOutItem, 0L, 0L );
787         Close();
788     }
789     else if ( pBtn == &aBtnCancel )
790         Close();
791 
792     return( 0L );
793 }
794 
795 
796 //----------------------------------------------------------------------------
797 
IMPL_LINK(ScConditionalFormatDlg,NewBtnHdl,PushButton *,pBtn)798 IMPL_LINK( ScConditionalFormatDlg, NewBtnHdl, PushButton*, pBtn )
799 {
800     SfxUInt16Item aFamilyItem( SID_STYLE_FAMILY, SFX_STYLE_FAMILY_PARA );
801     SfxStringItem aRefItem( SID_STYLE_REFERENCE, ScGlobal::GetRscString(STR_STYLENAME_STANDARD) );
802 
803     // unlock the dispatcher so SID_STYLE_NEW can be executed
804     // (SetDispatcherLock would affect all Calc documents)
805     SfxDispatcher* pDisp = GetBindings().GetDispatcher();
806     sal_Bool bLocked = pDisp->IsLocked();
807     if (bLocked)
808         pDisp->Lock(sal_False);
809 
810     // Execute the "new style" slot, complete with undo and all necessary updates.
811     // The return value (SfxUInt16Item) is ignored, look for new styles instead.
812     pDisp->Execute( SID_STYLE_NEW, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD | SFX_CALLMODE_MODAL,
813                     &aFamilyItem,
814                     &aRefItem,
815                     0L );
816 
817     if (bLocked)
818         pDisp->Lock(sal_True);
819 
820     // Find the new style and add it into the style list boxes
821     String aNewStyle;
822     SfxStyleSheetIterator aStyleIter( pDoc->GetStyleSheetPool(), SFX_STYLE_FAMILY_PARA );
823     for ( SfxStyleSheetBase* pStyle = aStyleIter.First(); pStyle; pStyle = aStyleIter.Next() )
824     {
825         String aName = pStyle->GetName();
826         if ( aLbCond1Template.GetEntryPos(aName) == LISTBOX_ENTRY_NOTFOUND )    // all lists contain the same entries
827         {
828             aLbCond1Template.InsertEntry( aName );
829             aLbCond2Template.InsertEntry( aName );
830             aLbCond3Template.InsertEntry( aName );
831             // if there are several new styles (from API or a different view),
832             // assume the last one is the result of the dialog
833             aNewStyle = aName;
834         }
835     }
836 
837     // select the new style in the list box for which the button was pressed
838     if ( aNewStyle.Len() )
839     {
840         ListBox* pListBox = &aLbCond1Template;
841         if ( pBtn == &aBtnNew2 )
842             pListBox = &aLbCond2Template;
843         else if ( pBtn == &aBtnNew3 )
844             pListBox = &aLbCond3Template;
845 
846         pListBox->SelectEntry( aNewStyle );
847     }
848 
849     return 0;
850 }
851 
852