1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sfx2.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "sfx2/securitypage.hxx"
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include "securitypage.hrc"
30*b1cdbd2cSJim Jagielski #include "sfxresid.hxx"
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include <sfx2/sfx.hrc>
33*b1cdbd2cSJim Jagielski #include <sfx2/sfxsids.hrc>
34*b1cdbd2cSJim Jagielski #include <sfx2/objsh.hxx>
35*b1cdbd2cSJim Jagielski #include <sfx2/viewsh.hxx>
36*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
37*b1cdbd2cSJim Jagielski #include <sfx2/passwd.hxx>
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski #include <vcl/button.hxx>
40*b1cdbd2cSJim Jagielski #include <vcl/edit.hxx>
41*b1cdbd2cSJim Jagielski #include <vcl/fixed.hxx>
42*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
43*b1cdbd2cSJim Jagielski #include <svl/eitem.hxx>
44*b1cdbd2cSJim Jagielski #include <svl/poolitem.hxx>
45*b1cdbd2cSJim Jagielski #include <svl/intitem.hxx>
46*b1cdbd2cSJim Jagielski #include <svl/PasswordHelper.hxx>
47*b1cdbd2cSJim Jagielski #include <svtools/xwindowitem.hxx>
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski namespace
56*b1cdbd2cSJim Jagielski {
57*b1cdbd2cSJim Jagielski     enum RedliningMode  { RL_NONE, RL_WRITER, RL_CALC };
58*b1cdbd2cSJim Jagielski     enum RedlineFunc    { RF_ON, RF_PROTECT };
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski /*
61*b1cdbd2cSJim Jagielski     bool QueryIsEnabled( sal_uInt16 _nSlot )
62*b1cdbd2cSJim Jagielski     {
63*b1cdbd2cSJim Jagielski         bool bRes = false;
64*b1cdbd2cSJim Jagielski         SfxViewShell* pViewSh = SfxViewShell::Current();
65*b1cdbd2cSJim Jagielski         if (pViewSh)
66*b1cdbd2cSJim Jagielski         {
67*b1cdbd2cSJim Jagielski             const SfxPoolItem* pItem;
68*b1cdbd2cSJim Jagielski             SfxDispatcher* pDisp = pViewSh->GetDispatcher();
69*b1cdbd2cSJim Jagielski             SfxItemState eState = pDisp->QueryState( _nSlot, pItem );
70*b1cdbd2cSJim Jagielski             bRes = (eState & SFX_ITEM_DISABLED) == 0;
71*b1cdbd2cSJim Jagielski         }
72*b1cdbd2cSJim Jagielski         return bRes;
73*b1cdbd2cSJim Jagielski     }
74*b1cdbd2cSJim Jagielski */
75*b1cdbd2cSJim Jagielski 
QueryState(sal_uInt16 _nSlot,bool & _rValue)76*b1cdbd2cSJim Jagielski     bool QueryState( sal_uInt16 _nSlot, bool& _rValue )
77*b1cdbd2cSJim Jagielski     {
78*b1cdbd2cSJim Jagielski         bool bRet = false;
79*b1cdbd2cSJim Jagielski         SfxViewShell* pViewSh = SfxViewShell::Current();
80*b1cdbd2cSJim Jagielski         if (pViewSh)
81*b1cdbd2cSJim Jagielski         {
82*b1cdbd2cSJim Jagielski             const SfxPoolItem* pItem;
83*b1cdbd2cSJim Jagielski             SfxDispatcher* pDisp = pViewSh->GetDispatcher();
84*b1cdbd2cSJim Jagielski             SfxItemState nState = pDisp->QueryState( _nSlot, pItem );
85*b1cdbd2cSJim Jagielski             bRet = SFX_ITEM_AVAILABLE <= nState;
86*b1cdbd2cSJim Jagielski             if (bRet)
87*b1cdbd2cSJim Jagielski                 _rValue = ( static_cast< const SfxBoolItem* >( pItem ) )->GetValue();
88*b1cdbd2cSJim Jagielski         }
89*b1cdbd2cSJim Jagielski         return bRet;
90*b1cdbd2cSJim Jagielski     }
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski 
QueryRecordChangesProtectionState(RedliningMode _eMode,bool & _rValue)93*b1cdbd2cSJim Jagielski     bool QueryRecordChangesProtectionState( RedliningMode _eMode, bool& _rValue )
94*b1cdbd2cSJim Jagielski     {
95*b1cdbd2cSJim Jagielski         bool bRet = false;
96*b1cdbd2cSJim Jagielski         if (_eMode != RL_NONE)
97*b1cdbd2cSJim Jagielski         {
98*b1cdbd2cSJim Jagielski             sal_uInt16 nSlot = _eMode == RL_WRITER ? FN_REDLINE_PROTECT : SID_CHG_PROTECT;
99*b1cdbd2cSJim Jagielski             bRet = QueryState( nSlot, _rValue );
100*b1cdbd2cSJim Jagielski         }
101*b1cdbd2cSJim Jagielski         return bRet;
102*b1cdbd2cSJim Jagielski     }
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski 
QueryRecordChangesState(RedliningMode _eMode,bool & _rValue)105*b1cdbd2cSJim Jagielski     bool QueryRecordChangesState( RedliningMode _eMode, bool& _rValue )
106*b1cdbd2cSJim Jagielski     {
107*b1cdbd2cSJim Jagielski         bool bRet = false;
108*b1cdbd2cSJim Jagielski         if (_eMode != RL_NONE)
109*b1cdbd2cSJim Jagielski         {
110*b1cdbd2cSJim Jagielski             sal_uInt16 nSlot = _eMode == RL_WRITER ? FN_REDLINE_ON : FID_CHG_RECORD;
111*b1cdbd2cSJim Jagielski             bRet = QueryState( nSlot, _rValue );
112*b1cdbd2cSJim Jagielski         }
113*b1cdbd2cSJim Jagielski         return bRet;
114*b1cdbd2cSJim Jagielski     }
115*b1cdbd2cSJim Jagielski }
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski 
lcl_GetPassword(Window * pParent,bool bProtect,String & rPassword)121*b1cdbd2cSJim Jagielski static short lcl_GetPassword(
122*b1cdbd2cSJim Jagielski     Window *pParent,
123*b1cdbd2cSJim Jagielski     bool bProtect,
124*b1cdbd2cSJim Jagielski     /*out*/String &rPassword )
125*b1cdbd2cSJim Jagielski {
126*b1cdbd2cSJim Jagielski     bool bRes = false;
127*b1cdbd2cSJim Jagielski     SfxPasswordDialog aPasswdDlg( pParent );
128*b1cdbd2cSJim Jagielski     const String aTitle( SfxResId( bProtect ? RID_SFX_PROTECT_RECORDS : RID_SFX_UNPROTECT_RECORDS ) );
129*b1cdbd2cSJim Jagielski     aPasswdDlg.SetText( aTitle );
130*b1cdbd2cSJim Jagielski     aPasswdDlg.SetMinLen( 1 );
131*b1cdbd2cSJim Jagielski     if (bProtect)
132*b1cdbd2cSJim Jagielski         aPasswdDlg.ShowExtras( SHOWEXTRAS_CONFIRM );
133*b1cdbd2cSJim Jagielski     if (RET_OK == aPasswdDlg.Execute() && aPasswdDlg.GetPassword().Len() > 0)
134*b1cdbd2cSJim Jagielski     {
135*b1cdbd2cSJim Jagielski         rPassword = aPasswdDlg.GetPassword();
136*b1cdbd2cSJim Jagielski         bRes = true;
137*b1cdbd2cSJim Jagielski     }
138*b1cdbd2cSJim Jagielski     return bRes;
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski 
lcl_IsPasswordCorrect(const String & rPassword)142*b1cdbd2cSJim Jagielski static bool lcl_IsPasswordCorrect( const String &rPassword )
143*b1cdbd2cSJim Jagielski {
144*b1cdbd2cSJim Jagielski     bool bRes = false;
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski     SfxObjectShell* pCurDocShell = SfxObjectShell::Current();
147*b1cdbd2cSJim Jagielski     uno::Sequence< sal_Int8 >   aPasswordHash;
148*b1cdbd2cSJim Jagielski     pCurDocShell->GetProtectionHash( aPasswordHash );
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski     // check if supplied password was correct
151*b1cdbd2cSJim Jagielski     uno::Sequence< sal_Int8 > aNewPasswd( aPasswordHash );
152*b1cdbd2cSJim Jagielski     SvPasswordHelper::GetHashPassword( aNewPasswd, rPassword );
153*b1cdbd2cSJim Jagielski     if (SvPasswordHelper::CompareHashPassword( aPasswordHash, rPassword ))
154*b1cdbd2cSJim Jagielski         bRes = true;    // password was correct
155*b1cdbd2cSJim Jagielski     else
156*b1cdbd2cSJim Jagielski         InfoBox( NULL, String( SfxResId( RID_SFX_INCORRECT_PASSWORD ) ) ).Execute();
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski     return bRes;
159*b1cdbd2cSJim Jagielski }
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski struct SfxSecurityPage_Impl
166*b1cdbd2cSJim Jagielski {
167*b1cdbd2cSJim Jagielski     SfxSecurityPage &   m_rMyTabPage;
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski     FixedLine           m_aNewPasswordToOpenFL;
170*b1cdbd2cSJim Jagielski     FixedText           m_aNewPasswordToOpenFT;
171*b1cdbd2cSJim Jagielski     Edit                m_aNewPasswordToOpenED;
172*b1cdbd2cSJim Jagielski     FixedText           m_aConfirmPasswordToOpenFT;
173*b1cdbd2cSJim Jagielski     Edit                m_aConfirmPasswordToOpenED;
174*b1cdbd2cSJim Jagielski     FixedText           m_aNewPasswordInfoFT;
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski     FixedLine           m_aNewPasswordToModifyFL;
177*b1cdbd2cSJim Jagielski     FixedText           m_aNewPasswordToModifyFT;
178*b1cdbd2cSJim Jagielski     Edit                m_aNewPasswordToModifyED;
179*b1cdbd2cSJim Jagielski     FixedText           m_aConfirmPasswordToModifyFT;
180*b1cdbd2cSJim Jagielski     Edit                m_aConfirmPasswordToModifyED;
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski     FixedLine           m_aOptionsFL;
183*b1cdbd2cSJim Jagielski     CheckBox            m_aOpenReadonlyCB;
184*b1cdbd2cSJim Jagielski     CheckBox            m_aRecordChangesCB;         // for record changes
185*b1cdbd2cSJim Jagielski     PushButton          m_aChangeProtectionPB;      // for record changes
186*b1cdbd2cSJim Jagielski     String              m_aProtectSTR;              // for record changes
187*b1cdbd2cSJim Jagielski     String              m_aUnProtectSTR;            // for record changes
188*b1cdbd2cSJim Jagielski     RedliningMode       m_eRedlingMode;             // for record changes
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski     bool                m_bOrigPasswordIsConfirmed;
191*b1cdbd2cSJim Jagielski     bool                m_bNewPasswordIsValid;
192*b1cdbd2cSJim Jagielski     String              m_aNewPassword;
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski     String              m_aEndRedliningWarning;
195*b1cdbd2cSJim Jagielski     bool                m_bEndRedliningWarningDone;
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski     DECL_LINK( RecordChangesCBToggleHdl, void* );
198*b1cdbd2cSJim Jagielski     DECL_LINK( ChangeProtectionPBHdl, void* );
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski     SfxSecurityPage_Impl( SfxSecurityPage &rDlg, const SfxItemSet &rItemSet );
201*b1cdbd2cSJim Jagielski     ~SfxSecurityPage_Impl();
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski     sal_Bool    FillItemSet_Impl( SfxItemSet & );
204*b1cdbd2cSJim Jagielski     void    Reset_Impl( const SfxItemSet & );
205*b1cdbd2cSJim Jagielski };
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski 
SfxSecurityPage_Impl(SfxSecurityPage & rTabPage,const SfxItemSet &)208*b1cdbd2cSJim Jagielski SfxSecurityPage_Impl::SfxSecurityPage_Impl( SfxSecurityPage &rTabPage, const SfxItemSet & ) :
209*b1cdbd2cSJim Jagielski     m_rMyTabPage                    (rTabPage),
210*b1cdbd2cSJim Jagielski     m_aNewPasswordToOpenFL          (&rTabPage, SfxResId( PASSWORD_TO_OPEN_FL ) ),
211*b1cdbd2cSJim Jagielski     m_aNewPasswordToOpenFT          (&rTabPage, SfxResId( PASSWORD_TO_OPEN_FT ) ),
212*b1cdbd2cSJim Jagielski     m_aNewPasswordToOpenED          (&rTabPage, SfxResId( PASSWORD_TO_OPEN_ED ) ),
213*b1cdbd2cSJim Jagielski     m_aConfirmPasswordToOpenFT      (&rTabPage, SfxResId( CONFIRM_PASSWORD_TO_OPEN_FT ) ),
214*b1cdbd2cSJim Jagielski     m_aConfirmPasswordToOpenED      (&rTabPage, SfxResId( CONFIRM_PASSWORD_TO_OPEN_ED ) ),
215*b1cdbd2cSJim Jagielski     m_aNewPasswordInfoFT            (&rTabPage, SfxResId( PASSWORD_INFO_FT ) ),
216*b1cdbd2cSJim Jagielski     m_aNewPasswordToModifyFL        (&rTabPage, SfxResId( PASSWORD_TO_MODIFY_FL ) ),
217*b1cdbd2cSJim Jagielski     m_aNewPasswordToModifyFT        (&rTabPage, SfxResId( PASSWORD_TO_MODIFY_FT ) ),
218*b1cdbd2cSJim Jagielski     m_aNewPasswordToModifyED        (&rTabPage, SfxResId( PASSWORD_TO_MODIFY_ED ) ),
219*b1cdbd2cSJim Jagielski     m_aConfirmPasswordToModifyFT    (&rTabPage, SfxResId( CONFIRM_PASSWORD_TO_MODIFY_FT ) ),
220*b1cdbd2cSJim Jagielski     m_aConfirmPasswordToModifyED    (&rTabPage, SfxResId( CONFIRM_PASSWORD_TO_MODIFY_ED ) ),
221*b1cdbd2cSJim Jagielski     m_aOptionsFL                    (&rTabPage, SfxResId( OPTIONS_FL ) ),
222*b1cdbd2cSJim Jagielski     m_aOpenReadonlyCB               (&rTabPage, SfxResId( OPEN_READONLY_CB ) ),
223*b1cdbd2cSJim Jagielski     m_aRecordChangesCB              (&rTabPage, SfxResId( RECORD_CHANGES_CB ) ),
224*b1cdbd2cSJim Jagielski     m_aChangeProtectionPB           (&rTabPage, SfxResId( CHANGE_PROTECTION_PB ) ),
225*b1cdbd2cSJim Jagielski     m_aProtectSTR                   ( SfxResId( STR_PROTECT ) ),
226*b1cdbd2cSJim Jagielski     m_aUnProtectSTR                 ( SfxResId( STR_UNPROTECT ) ),
227*b1cdbd2cSJim Jagielski     m_eRedlingMode                  ( RL_NONE ),
228*b1cdbd2cSJim Jagielski     m_bOrigPasswordIsConfirmed      ( false ),
229*b1cdbd2cSJim Jagielski     m_bNewPasswordIsValid           ( false ),
230*b1cdbd2cSJim Jagielski     m_aEndRedliningWarning          ( SfxResId( STR_END_REDLINING_WARNING ) ),
231*b1cdbd2cSJim Jagielski     m_bEndRedliningWarningDone      ( false )
232*b1cdbd2cSJim Jagielski {
233*b1cdbd2cSJim Jagielski     m_aChangeProtectionPB.SetText( m_aProtectSTR );
234*b1cdbd2cSJim Jagielski     // adjust button width if necessary
235*b1cdbd2cSJim Jagielski     long nBtnTextWidth = 0;
236*b1cdbd2cSJim Jagielski     long nTemp = m_aChangeProtectionPB.GetCtrlTextWidth( m_aChangeProtectionPB.GetText() );
237*b1cdbd2cSJim Jagielski     if (nTemp > nBtnTextWidth)
238*b1cdbd2cSJim Jagielski         nBtnTextWidth = nTemp;
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski     // force toggle hdl called before visual change of checkbox
241*b1cdbd2cSJim Jagielski     m_aRecordChangesCB.SetStyle( m_aRecordChangesCB.GetStyle() | WB_EARLYTOGGLE );
242*b1cdbd2cSJim Jagielski     m_aRecordChangesCB.SetToggleHdl( LINK( this, SfxSecurityPage_Impl, RecordChangesCBToggleHdl ) );
243*b1cdbd2cSJim Jagielski     m_aChangeProtectionPB.SetClickHdl( LINK( this, SfxSecurityPage_Impl, ChangeProtectionPBHdl ) );
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski     // #i112277: for the time being (OOO 3.3) the following options should not
247*b1cdbd2cSJim Jagielski     // be available. In the long run however it is planned to implement the yet
248*b1cdbd2cSJim Jagielski     // missing functionality. Thus now we hide them and move the remaining ones up.
249*b1cdbd2cSJim Jagielski     m_aNewPasswordToOpenFL.Hide();
250*b1cdbd2cSJim Jagielski     m_aNewPasswordToOpenFT.Hide();
251*b1cdbd2cSJim Jagielski     m_aNewPasswordToOpenED.Hide();
252*b1cdbd2cSJim Jagielski     m_aConfirmPasswordToOpenFT.Hide();
253*b1cdbd2cSJim Jagielski     m_aConfirmPasswordToOpenED.Hide();
254*b1cdbd2cSJim Jagielski     m_aNewPasswordInfoFT.Hide();
255*b1cdbd2cSJim Jagielski     m_aNewPasswordToModifyFL.Hide();
256*b1cdbd2cSJim Jagielski     m_aNewPasswordToModifyFT.Hide();
257*b1cdbd2cSJim Jagielski     m_aNewPasswordToModifyED.Hide();
258*b1cdbd2cSJim Jagielski     m_aConfirmPasswordToModifyFT.Hide();
259*b1cdbd2cSJim Jagielski     m_aConfirmPasswordToModifyED.Hide();
260*b1cdbd2cSJim Jagielski     const long nDelta = m_aOptionsFL.GetPosPixel().Y() - m_aNewPasswordToOpenFL.GetPosPixel().Y();
261*b1cdbd2cSJim Jagielski     Point aPos;
262*b1cdbd2cSJim Jagielski     aPos = m_aOptionsFL.GetPosPixel();
263*b1cdbd2cSJim Jagielski     aPos.Y() -= nDelta;
264*b1cdbd2cSJim Jagielski     m_aOptionsFL.SetPosPixel( aPos );
265*b1cdbd2cSJim Jagielski     aPos = m_aOpenReadonlyCB.GetPosPixel();
266*b1cdbd2cSJim Jagielski     aPos.Y() -= nDelta;
267*b1cdbd2cSJim Jagielski     m_aOpenReadonlyCB.SetPosPixel( aPos );
268*b1cdbd2cSJim Jagielski     aPos = m_aRecordChangesCB.GetPosPixel();
269*b1cdbd2cSJim Jagielski     aPos.Y() -= nDelta;
270*b1cdbd2cSJim Jagielski     m_aRecordChangesCB.SetPosPixel( aPos );
271*b1cdbd2cSJim Jagielski     aPos = m_aChangeProtectionPB.GetPosPixel();
272*b1cdbd2cSJim Jagielski     aPos.Y() -= nDelta;
273*b1cdbd2cSJim Jagielski     m_aChangeProtectionPB.SetPosPixel( aPos );
274*b1cdbd2cSJim Jagielski }
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski 
~SfxSecurityPage_Impl()277*b1cdbd2cSJim Jagielski SfxSecurityPage_Impl::~SfxSecurityPage_Impl()
278*b1cdbd2cSJim Jagielski {
279*b1cdbd2cSJim Jagielski }
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski 
FillItemSet_Impl(SfxItemSet &)282*b1cdbd2cSJim Jagielski sal_Bool SfxSecurityPage_Impl::FillItemSet_Impl( SfxItemSet & )
283*b1cdbd2cSJim Jagielski {
284*b1cdbd2cSJim Jagielski     bool bModified = false;
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski     SfxObjectShell* pCurDocShell = SfxObjectShell::Current();
287*b1cdbd2cSJim Jagielski     if (pCurDocShell&& !pCurDocShell->IsReadOnly())
288*b1cdbd2cSJim Jagielski     {
289*b1cdbd2cSJim Jagielski         if (m_eRedlingMode != RL_NONE )
290*b1cdbd2cSJim Jagielski         {
291*b1cdbd2cSJim Jagielski             const bool bDoRecordChanges     = m_aRecordChangesCB.IsChecked();
292*b1cdbd2cSJim Jagielski             const bool bDoChangeProtection  = m_aChangeProtectionPB.GetText() != m_aProtectSTR;
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski             // sanity checks
295*b1cdbd2cSJim Jagielski             DBG_ASSERT( bDoRecordChanges || !bDoChangeProtection, "no change recording should imply no change protection" );
296*b1cdbd2cSJim Jagielski             DBG_ASSERT( bDoChangeProtection || !bDoRecordChanges, "no change protection should imply no change recording" );
297*b1cdbd2cSJim Jagielski             DBG_ASSERT( !bDoChangeProtection || m_aNewPassword.Len() > 0, "change protection should imply password length is > 0" );
298*b1cdbd2cSJim Jagielski             DBG_ASSERT( bDoChangeProtection || m_aNewPassword.Len() == 0, "no change protection should imply password length is 0" );
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski             // change recording
301*b1cdbd2cSJim Jagielski             if (bDoRecordChanges != pCurDocShell->IsChangeRecording())
302*b1cdbd2cSJim Jagielski             {
303*b1cdbd2cSJim Jagielski                 pCurDocShell->SetChangeRecording( bDoRecordChanges );
304*b1cdbd2cSJim Jagielski                 bModified = true;
305*b1cdbd2cSJim Jagielski             }
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski             // change record protection
308*b1cdbd2cSJim Jagielski             if (m_bNewPasswordIsValid &&
309*b1cdbd2cSJim Jagielski                 bDoChangeProtection != pCurDocShell->HasChangeRecordProtection())
310*b1cdbd2cSJim Jagielski             {
311*b1cdbd2cSJim Jagielski                 DBG_ASSERT( !bDoChangeProtection || bDoRecordChanges,
312*b1cdbd2cSJim Jagielski                         "change protection requires record changes to be active!" );
313*b1cdbd2cSJim Jagielski                 pCurDocShell->SetProtectionPassword( m_aNewPassword );
314*b1cdbd2cSJim Jagielski                 bModified = true;
315*b1cdbd2cSJim Jagielski             }
316*b1cdbd2cSJim Jagielski         }
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski         // open read-only?
319*b1cdbd2cSJim Jagielski         const sal_Bool bDoOpenReadonly = m_aOpenReadonlyCB.IsChecked();
320*b1cdbd2cSJim Jagielski         if (pCurDocShell->HasSecurityOptOpenReadOnly() &&
321*b1cdbd2cSJim Jagielski             bDoOpenReadonly != pCurDocShell->IsSecurityOptOpenReadOnly())
322*b1cdbd2cSJim Jagielski         {
323*b1cdbd2cSJim Jagielski             pCurDocShell->SetSecurityOptOpenReadOnly( bDoOpenReadonly );
324*b1cdbd2cSJim Jagielski             bModified = true;
325*b1cdbd2cSJim Jagielski         }
326*b1cdbd2cSJim Jagielski     }
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski     return bModified;
329*b1cdbd2cSJim Jagielski }
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski 
Reset_Impl(const SfxItemSet &)332*b1cdbd2cSJim Jagielski void SfxSecurityPage_Impl::Reset_Impl( const SfxItemSet & )
333*b1cdbd2cSJim Jagielski {
334*b1cdbd2cSJim Jagielski     SfxObjectShell* pCurDocShell = SfxObjectShell::Current();
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski     String sNewText = m_aProtectSTR;
337*b1cdbd2cSJim Jagielski     if (!pCurDocShell)
338*b1cdbd2cSJim Jagielski     {
339*b1cdbd2cSJim Jagielski         // no doc -> hide document settings
340*b1cdbd2cSJim Jagielski         m_aOpenReadonlyCB.Disable();
341*b1cdbd2cSJim Jagielski         m_aRecordChangesCB.Disable();
342*b1cdbd2cSJim Jagielski         m_aChangeProtectionPB.Disable();
343*b1cdbd2cSJim Jagielski     }
344*b1cdbd2cSJim Jagielski     else
345*b1cdbd2cSJim Jagielski     {
346*b1cdbd2cSJim Jagielski         bool bIsHTMLDoc = false;
347*b1cdbd2cSJim Jagielski         SfxViewShell* pViewSh = SfxViewShell::Current();
348*b1cdbd2cSJim Jagielski         if (pViewSh)
349*b1cdbd2cSJim Jagielski         {
350*b1cdbd2cSJim Jagielski             const SfxPoolItem* pItem;
351*b1cdbd2cSJim Jagielski             SfxDispatcher* pDisp = pViewSh->GetDispatcher();
352*b1cdbd2cSJim Jagielski             if (SFX_ITEM_AVAILABLE <= pDisp->QueryState( SID_HTML_MODE, pItem ))
353*b1cdbd2cSJim Jagielski             {
354*b1cdbd2cSJim Jagielski                 sal_uInt16 nMode = static_cast< const SfxUInt16Item* >( pItem )->GetValue();
355*b1cdbd2cSJim Jagielski                 bIsHTMLDoc = ( ( nMode & HTMLMODE_ON ) != 0 );
356*b1cdbd2cSJim Jagielski             }
357*b1cdbd2cSJim Jagielski         }
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski         sal_Bool bIsReadonly = pCurDocShell->IsReadOnly();
360*b1cdbd2cSJim Jagielski         if (pCurDocShell->HasSecurityOptOpenReadOnly() && !bIsHTMLDoc)
361*b1cdbd2cSJim Jagielski         {
362*b1cdbd2cSJim Jagielski             m_aOpenReadonlyCB.Check( pCurDocShell->IsSecurityOptOpenReadOnly() );
363*b1cdbd2cSJim Jagielski             m_aOpenReadonlyCB.Enable( !bIsReadonly );
364*b1cdbd2cSJim Jagielski         }
365*b1cdbd2cSJim Jagielski         else
366*b1cdbd2cSJim Jagielski             m_aOpenReadonlyCB.Disable();
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski         bool bRecordChanges;
369*b1cdbd2cSJim Jagielski         if (QueryRecordChangesState( RL_WRITER, bRecordChanges ) && !bIsHTMLDoc)
370*b1cdbd2cSJim Jagielski             m_eRedlingMode = RL_WRITER;
371*b1cdbd2cSJim Jagielski         else if (QueryRecordChangesState( RL_CALC, bRecordChanges ))
372*b1cdbd2cSJim Jagielski             m_eRedlingMode = RL_CALC;
373*b1cdbd2cSJim Jagielski         else
374*b1cdbd2cSJim Jagielski             m_eRedlingMode = RL_NONE;
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski         if (m_eRedlingMode != RL_NONE)
377*b1cdbd2cSJim Jagielski         {
378*b1cdbd2cSJim Jagielski             bool bProtection;
379*b1cdbd2cSJim Jagielski             QueryRecordChangesProtectionState( m_eRedlingMode, bProtection );
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski             m_aChangeProtectionPB.Enable( !bIsReadonly );
382*b1cdbd2cSJim Jagielski             // set the right text
383*b1cdbd2cSJim Jagielski             if (bProtection)
384*b1cdbd2cSJim Jagielski                 sNewText = m_aUnProtectSTR;
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski             m_aRecordChangesCB.Check( bRecordChanges );
387*b1cdbd2cSJim Jagielski             m_aRecordChangesCB.Enable( /*!bProtection && */!bIsReadonly );
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski             m_bOrigPasswordIsConfirmed = true;   // default case if no password is set
390*b1cdbd2cSJim Jagielski             uno::Sequence< sal_Int8 > aPasswordHash;
391*b1cdbd2cSJim Jagielski             // check if password is available
392*b1cdbd2cSJim Jagielski             if (pCurDocShell->GetProtectionHash( aPasswordHash ) &&
393*b1cdbd2cSJim Jagielski                 aPasswordHash.getLength() > 0)
394*b1cdbd2cSJim Jagielski                 m_bOrigPasswordIsConfirmed = false;  // password found, needs to be confirmed later on
395*b1cdbd2cSJim Jagielski         }
396*b1cdbd2cSJim Jagielski         else
397*b1cdbd2cSJim Jagielski         {
398*b1cdbd2cSJim Jagielski             // A Calc document that is shared will have 'm_eRedlingMode == RL_NONE'
399*b1cdbd2cSJim Jagielski             // In shared documents change recording and protection must be disabled,
400*b1cdbd2cSJim Jagielski             // similar to documents that do not support change recording at all.
401*b1cdbd2cSJim Jagielski             m_aRecordChangesCB.Check( sal_False );
402*b1cdbd2cSJim Jagielski             m_aRecordChangesCB.Disable();
403*b1cdbd2cSJim Jagielski             m_aChangeProtectionPB.Check( sal_False );
404*b1cdbd2cSJim Jagielski             m_aChangeProtectionPB.Disable();
405*b1cdbd2cSJim Jagielski         }
406*b1cdbd2cSJim Jagielski     }
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski     m_aChangeProtectionPB.SetText( sNewText );
409*b1cdbd2cSJim Jagielski }
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxSecurityPage_Impl,RecordChangesCBToggleHdl,void *,EMPTYARG)412*b1cdbd2cSJim Jagielski IMPL_LINK( SfxSecurityPage_Impl, RecordChangesCBToggleHdl, void*, EMPTYARG )
413*b1cdbd2cSJim Jagielski {
414*b1cdbd2cSJim Jagielski     // when change recording gets disabled protection must be disabled as well
415*b1cdbd2cSJim Jagielski     if (!m_aRecordChangesCB.IsChecked())    // the new check state is already present, thus the '!'
416*b1cdbd2cSJim Jagielski     {
417*b1cdbd2cSJim Jagielski         bool bAlreadyDone = false;
418*b1cdbd2cSJim Jagielski         if (!m_bEndRedliningWarningDone)
419*b1cdbd2cSJim Jagielski         {
420*b1cdbd2cSJim Jagielski 		    WarningBox aBox( m_rMyTabPage.GetParent(), WinBits(WB_YES_NO | WB_DEF_NO),
421*b1cdbd2cSJim Jagielski                     m_aEndRedliningWarning );
422*b1cdbd2cSJim Jagielski             if (aBox.Execute() != RET_YES)
423*b1cdbd2cSJim Jagielski                 bAlreadyDone = true;
424*b1cdbd2cSJim Jagielski             else
425*b1cdbd2cSJim Jagielski                 m_bEndRedliningWarningDone = true;
426*b1cdbd2cSJim Jagielski         }
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski         const bool bNeedPasssword = !m_bOrigPasswordIsConfirmed
429*b1cdbd2cSJim Jagielski                 && m_aChangeProtectionPB.GetText() != m_aProtectSTR;
430*b1cdbd2cSJim Jagielski         if (!bAlreadyDone && bNeedPasssword)
431*b1cdbd2cSJim Jagielski         {
432*b1cdbd2cSJim Jagielski             String aPasswordText;
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski             // dialog canceled or no password provided
435*b1cdbd2cSJim Jagielski             if (!lcl_GetPassword( m_rMyTabPage.GetParent(), false, aPasswordText ))
436*b1cdbd2cSJim Jagielski                 bAlreadyDone = true;
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski             // ask for password and if dialog is canceled or no password provided return
439*b1cdbd2cSJim Jagielski             if (lcl_IsPasswordCorrect( aPasswordText ))
440*b1cdbd2cSJim Jagielski                 m_bOrigPasswordIsConfirmed = true;
441*b1cdbd2cSJim Jagielski             else
442*b1cdbd2cSJim Jagielski                 bAlreadyDone = true;
443*b1cdbd2cSJim Jagielski         }
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski         if (bAlreadyDone)
446*b1cdbd2cSJim Jagielski             m_aRecordChangesCB.Check( true );     // restore original state
447*b1cdbd2cSJim Jagielski         else
448*b1cdbd2cSJim Jagielski         {
449*b1cdbd2cSJim Jagielski             // remember required values to change protection and change recording in
450*b1cdbd2cSJim Jagielski             // FillItemSet_Impl later on if password was correct.
451*b1cdbd2cSJim Jagielski             m_bNewPasswordIsValid = true;
452*b1cdbd2cSJim Jagielski             m_aNewPassword = String();
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski             m_aChangeProtectionPB.SetText( m_aProtectSTR );
455*b1cdbd2cSJim Jagielski         }
456*b1cdbd2cSJim Jagielski     }
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski     return 0;
459*b1cdbd2cSJim Jagielski }
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski 
IMPL_LINK(SfxSecurityPage_Impl,ChangeProtectionPBHdl,void *,EMPTYARG)462*b1cdbd2cSJim Jagielski IMPL_LINK( SfxSecurityPage_Impl, ChangeProtectionPBHdl, void*, EMPTYARG )
463*b1cdbd2cSJim Jagielski {
464*b1cdbd2cSJim Jagielski     if (m_eRedlingMode == RL_NONE)
465*b1cdbd2cSJim Jagielski         return 0;
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski     // the push button text is always the opposite of the current state. Thus:
468*b1cdbd2cSJim Jagielski     const bool bCurrentProtection = m_aChangeProtectionPB.GetText() != m_aProtectSTR;
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski     // ask user for password (if still necessary)
471*b1cdbd2cSJim Jagielski     String aPasswordText;
472*b1cdbd2cSJim Jagielski     bool bNewProtection = !bCurrentProtection;
473*b1cdbd2cSJim Jagielski     const bool bNeedPassword = bNewProtection || !m_bOrigPasswordIsConfirmed;
474*b1cdbd2cSJim Jagielski     if (bNeedPassword)
475*b1cdbd2cSJim Jagielski     {
476*b1cdbd2cSJim Jagielski         // ask for password and if dialog is canceled or no password provided return
477*b1cdbd2cSJim Jagielski         if (!lcl_GetPassword( m_rMyTabPage.GetParent(), bNewProtection, aPasswordText ))
478*b1cdbd2cSJim Jagielski             return 0;
479*b1cdbd2cSJim Jagielski 
480*b1cdbd2cSJim Jagielski         // provided password still needs to be checked?
481*b1cdbd2cSJim Jagielski         if (!bNewProtection && !m_bOrigPasswordIsConfirmed)
482*b1cdbd2cSJim Jagielski         {
483*b1cdbd2cSJim Jagielski             if (lcl_IsPasswordCorrect( aPasswordText ))
484*b1cdbd2cSJim Jagielski                 m_bOrigPasswordIsConfirmed = true;
485*b1cdbd2cSJim Jagielski             else
486*b1cdbd2cSJim Jagielski                 return 0;
487*b1cdbd2cSJim Jagielski         }
488*b1cdbd2cSJim Jagielski     }
489*b1cdbd2cSJim Jagielski     DBG_ASSERT( m_bOrigPasswordIsConfirmed, "ooops... this should not have happened!" );
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski     // remember required values to change protection and change recording in
492*b1cdbd2cSJim Jagielski     // FillItemSet_Impl later on if password was correct.
493*b1cdbd2cSJim Jagielski     m_bNewPasswordIsValid = true;
494*b1cdbd2cSJim Jagielski     m_aNewPassword = bNewProtection? aPasswordText : String();
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski //    // RecordChangesCB is enabled if protection is off
497*b1cdbd2cSJim Jagielski //    m_aRecordChangesCB.Enable( !bNewProtection );
498*b1cdbd2cSJim Jagielski     m_aRecordChangesCB.Check( bNewProtection );
499*b1cdbd2cSJim Jagielski     // toggle text of button "Protect" <-> "Unprotect"
500*b1cdbd2cSJim Jagielski     m_aChangeProtectionPB.SetText( bNewProtection ? m_aUnProtectSTR : m_aProtectSTR );
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski     return 0;
503*b1cdbd2cSJim Jagielski }
504*b1cdbd2cSJim Jagielski 
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski 
Create(Window * pParent,const SfxItemSet & rItemSet)509*b1cdbd2cSJim Jagielski SfxTabPage* SfxSecurityPage::Create( Window * pParent, const SfxItemSet & rItemSet )
510*b1cdbd2cSJim Jagielski {
511*b1cdbd2cSJim Jagielski     return new SfxSecurityPage( pParent, rItemSet );
512*b1cdbd2cSJim Jagielski }
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 
SfxSecurityPage(Window * pParent,const SfxItemSet & rItemSet)515*b1cdbd2cSJim Jagielski SfxSecurityPage::SfxSecurityPage( Window* pParent, const SfxItemSet& rItemSet ) :
516*b1cdbd2cSJim Jagielski     SfxTabPage( pParent, SfxResId( TP_DOCINFOSECURITY ), rItemSet )
517*b1cdbd2cSJim Jagielski {
518*b1cdbd2cSJim Jagielski     m_pImpl = std::auto_ptr< SfxSecurityPage_Impl >(new SfxSecurityPage_Impl( *this, rItemSet ));
519*b1cdbd2cSJim Jagielski 
520*b1cdbd2cSJim Jagielski     FreeResource();
521*b1cdbd2cSJim Jagielski }
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski 
~SfxSecurityPage()524*b1cdbd2cSJim Jagielski SfxSecurityPage::~SfxSecurityPage()
525*b1cdbd2cSJim Jagielski {
526*b1cdbd2cSJim Jagielski }
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski 
FillItemSet(SfxItemSet & rItemSet)529*b1cdbd2cSJim Jagielski sal_Bool SfxSecurityPage::FillItemSet( SfxItemSet & rItemSet )
530*b1cdbd2cSJim Jagielski {
531*b1cdbd2cSJim Jagielski     bool bModified = false;
532*b1cdbd2cSJim Jagielski     DBG_ASSERT( m_pImpl.get(), "implementation pointer is 0. Still in c-tor?" );
533*b1cdbd2cSJim Jagielski     if (m_pImpl.get() != 0)
534*b1cdbd2cSJim Jagielski         bModified =  m_pImpl->FillItemSet_Impl( rItemSet );
535*b1cdbd2cSJim Jagielski     return bModified;
536*b1cdbd2cSJim Jagielski }
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski 
Reset(const SfxItemSet & rItemSet)539*b1cdbd2cSJim Jagielski void SfxSecurityPage::Reset( const SfxItemSet & rItemSet )
540*b1cdbd2cSJim Jagielski {
541*b1cdbd2cSJim Jagielski     DBG_ASSERT( m_pImpl.get(), "implementation pointer is 0. Still in c-tor?" );
542*b1cdbd2cSJim Jagielski     if (m_pImpl.get() != 0)
543*b1cdbd2cSJim Jagielski         m_pImpl->Reset_Impl( rItemSet );
544*b1cdbd2cSJim Jagielski }
545*b1cdbd2cSJim Jagielski 
546*b1cdbd2cSJim Jagielski 
547*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////
548*b1cdbd2cSJim Jagielski 
549*b1cdbd2cSJim Jagielski 
550