xref: /trunk/main/sc/source/ui/attrdlg/tabpages.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 
31 #undef SC_DLLIMPLEMENTATION
32 
33 
34 
35 #include "global.hxx"
36 #include "document.hxx"
37 #include "attrib.hxx"
38 #include "scresid.hxx"
39 #include "sc.hrc"
40 
41 #include "attrdlg.hrc"
42 #include "tabpages.hxx"
43 
44 // STATIC DATA -----------------------------------------------------------
45 
46 static sal_uInt16 pProtectionRanges[] =
47 {
48     SID_SCATTR_PROTECTION,
49     SID_SCATTR_PROTECTION,
50     0
51 };
52 
53 //========================================================================
54 // Zellschutz-Tabpage:
55 //========================================================================
56 
57 ScTabPageProtection::ScTabPageProtection( Window*           pParent,
58                                           const SfxItemSet& rCoreAttrs )
59     :   SfxTabPage          ( pParent,
60                               ScResId( RID_SCPAGE_PROTECTION ),
61                               rCoreAttrs ),
62         //
63         aFlProtect          ( this, ScResId( FL_PROTECTION      ) ),
64         aBtnHideCell        ( this, ScResId( BTN_HIDE_ALL       ) ),
65         aBtnProtect         ( this, ScResId( BTN_PROTECTED      ) ),
66         aBtnHideFormula     ( this, ScResId( BTN_HIDE_FORMULAR  ) ),
67         aTxtHint            ( this, ScResId( FT_HINT            ) ),
68         aFlPrint            ( this, ScResId( FL_PRINT           ) ),
69         aBtnHidePrint       ( this, ScResId( BTN_HIDE_PRINT     ) ),
70         aTxtHint2           ( this, ScResId( FT_HINT2           ) )
71 {
72     // diese Page braucht ExchangeSupport
73     SetExchangeSupport();
74 
75     //  States werden in Reset gesetzt
76     bTriEnabled = bDontCare = bProtect = bHideForm = bHideCell = bHidePrint = sal_False;
77 
78     aBtnProtect.SetClickHdl(     LINK( this, ScTabPageProtection, ButtonClickHdl ) );
79     aBtnHideCell.SetClickHdl(    LINK( this, ScTabPageProtection, ButtonClickHdl ) );
80     aBtnHideFormula.SetClickHdl( LINK( this, ScTabPageProtection, ButtonClickHdl ) );
81     aBtnHidePrint.SetClickHdl(   LINK( this, ScTabPageProtection, ButtonClickHdl ) );
82 
83     FreeResource();
84 }
85 
86 // -----------------------------------------------------------------------
87 
88 __EXPORT ScTabPageProtection::~ScTabPageProtection()
89 {
90 }
91 
92 //------------------------------------------------------------------------
93 
94 sal_uInt16* __EXPORT ScTabPageProtection::GetRanges()
95 {
96     return pProtectionRanges;
97 }
98 
99 // -----------------------------------------------------------------------
100 
101 SfxTabPage* __EXPORT ScTabPageProtection::Create( Window*           pParent,
102                                                   const SfxItemSet& rAttrSet )
103 {
104     return ( new ScTabPageProtection( pParent, rAttrSet ) );
105 }
106 
107 //------------------------------------------------------------------------
108 
109 void __EXPORT ScTabPageProtection::Reset( const SfxItemSet& rCoreAttrs )
110 {
111     //  Variablen initialisieren
112 
113     sal_uInt16 nWhich = GetWhich( SID_SCATTR_PROTECTION );
114     const ScProtectionAttr* pProtAttr = NULL;
115     SfxItemState eItemState = rCoreAttrs.GetItemState( nWhich, sal_False,
116                                           (const SfxPoolItem**)&pProtAttr );
117 
118     // handelt es sich um ein Default-Item?
119     if ( eItemState == SFX_ITEM_DEFAULT )
120         pProtAttr = (const ScProtectionAttr*)&(rCoreAttrs.Get(nWhich));
121     // bei SFX_ITEM_DONTCARE auf 0 lassen
122 
123     bTriEnabled = ( pProtAttr == NULL );                // TriState, wenn DontCare
124     bDontCare = bTriEnabled;
125     if (bTriEnabled)
126     {
127         //  Defaults, die erscheinen wenn ein TriState weggeklickt wird:
128         //  (weil alles zusammen ein Attribut ist, kann auch nur alles zusammen
129         //  auf DontCare stehen - #38543#)
130         bProtect = sal_True;
131         bHideForm = bHideCell = bHidePrint = sal_False;
132     }
133     else
134     {
135         bProtect = pProtAttr->GetProtection();
136         bHideCell = pProtAttr->GetHideCell();
137         bHideForm = pProtAttr->GetHideFormula();
138         bHidePrint = pProtAttr->GetHidePrint();
139     }
140 
141     //  Controls initialisieren
142 
143     aBtnProtect     .EnableTriState( bTriEnabled );
144     aBtnHideCell    .EnableTriState( bTriEnabled );
145     aBtnHideFormula .EnableTriState( bTriEnabled );
146     aBtnHidePrint   .EnableTriState( bTriEnabled );
147 
148     UpdateButtons();
149 }
150 
151 // -----------------------------------------------------------------------
152 
153 sal_Bool __EXPORT ScTabPageProtection::FillItemSet( SfxItemSet& rCoreAttrs )
154 {
155     sal_Bool                bAttrsChanged   = sal_False;
156     sal_uInt16              nWhich          = GetWhich( SID_SCATTR_PROTECTION );
157     const SfxPoolItem*  pOldItem        = GetOldItem( rCoreAttrs, SID_SCATTR_PROTECTION );
158     const SfxItemSet&   rOldSet         = GetItemSet();
159     SfxItemState        eItemState      = rOldSet.GetItemState( nWhich, sal_False );
160     ScProtectionAttr    aProtAttr;
161 
162     if ( !bDontCare )
163     {
164         aProtAttr.SetProtection( bProtect );
165         aProtAttr.SetHideCell( bHideCell );
166         aProtAttr.SetHideFormula( bHideForm );
167         aProtAttr.SetHidePrint( bHidePrint );
168 
169         if ( bTriEnabled )
170             bAttrsChanged = sal_True;                   // DontCare -> richtiger Wert
171         else
172             bAttrsChanged = !pOldItem || !( aProtAttr == *(const ScProtectionAttr*)pOldItem );
173     }
174 
175     //--------------------------------------------------
176 
177     if ( bAttrsChanged )
178         rCoreAttrs.Put( aProtAttr );
179     else if ( eItemState == SFX_ITEM_DEFAULT )
180         rCoreAttrs.ClearItem( nWhich );
181 
182     return bAttrsChanged;
183 }
184 
185 //------------------------------------------------------------------------
186 
187 int __EXPORT ScTabPageProtection::DeactivatePage( SfxItemSet* pSetP )
188 {
189     if ( pSetP )
190         FillItemSet( *pSetP );
191 
192     return LEAVE_PAGE;
193 }
194 
195 //------------------------------------------------------------------------
196 
197 IMPL_LINK( ScTabPageProtection, ButtonClickHdl, TriStateBox*, pBox )
198 {
199     TriState eState = pBox->GetState();
200     if ( eState == STATE_DONTKNOW )
201         bDontCare = sal_True;                           // alles zusammen auf DontCare
202     else
203     {
204         bDontCare = sal_False;                          // DontCare ueberall aus
205         sal_Bool bOn = ( eState == STATE_CHECK );       // ausgewaehlter Wert
206 
207         if ( pBox == &aBtnProtect )
208             bProtect = bOn;
209         else if ( pBox == &aBtnHideCell )
210             bHideCell = bOn;
211         else if ( pBox == &aBtnHideFormula )
212             bHideForm = bOn;
213         else if ( pBox == &aBtnHidePrint )
214             bHidePrint = bOn;
215         else
216         {
217             DBG_ERRORFILE("falscher Button");
218         }
219     }
220 
221     UpdateButtons();        // TriState und Enable-Logik
222 
223     return 0;
224 }
225 
226 //------------------------------------------------------------------------
227 
228 void ScTabPageProtection::UpdateButtons()
229 {
230     if ( bDontCare )
231     {
232         aBtnProtect.SetState( STATE_DONTKNOW );
233         aBtnHideCell.SetState( STATE_DONTKNOW );
234         aBtnHideFormula.SetState( STATE_DONTKNOW );
235         aBtnHidePrint.SetState( STATE_DONTKNOW );
236     }
237     else
238     {
239         aBtnProtect.SetState( bProtect ? STATE_CHECK : STATE_NOCHECK );
240         aBtnHideCell.SetState( bHideCell ? STATE_CHECK : STATE_NOCHECK );
241         aBtnHideFormula.SetState( bHideForm ? STATE_CHECK : STATE_NOCHECK );
242         aBtnHidePrint.SetState( bHidePrint ? STATE_CHECK : STATE_NOCHECK );
243     }
244 
245     sal_Bool bEnable = ( aBtnHideCell.GetState() != STATE_CHECK );
246     {
247         aBtnProtect.Enable( bEnable );
248         aBtnHideFormula.Enable( bEnable );
249     }
250 }
251