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_cui.hxx" 26 27 // include --------------------------------------------------------------- 28 29 #include "passwdomdlg.hrc" 30 #include "passwdomdlg.hxx" 31 32 #include "cuires.hrc" 33 #include "dialmgr.hxx" 34 35 #include <sfx2/tabdlg.hxx> 36 #include <tools/debug.hxx> 37 #include <vcl/fixed.hxx> 38 #include <vcl/edit.hxx> 39 #include <vcl/button.hxx> 40 #include <vcl/morebtn.hxx> 41 #include <vcl/settings.hxx> 42 #include <vcl/msgbox.hxx> 43 44 45 ////////////////////////////////////////////////////////////////////// 46 47 class PasswordReenterEdit_Impl : public Edit 48 { 49 String m_aDefaultTxt; 50 51 // disallow use of copy c-tor and assignment operator 52 PasswordReenterEdit_Impl( const PasswordReenterEdit_Impl & ); 53 PasswordReenterEdit_Impl & operator = ( const PasswordReenterEdit_Impl & ); 54 55 public: 56 PasswordReenterEdit_Impl( Window * pParent, const ResId &rResId ); 57 virtual ~PasswordReenterEdit_Impl(); 58 59 // Edit 60 virtual void Paint( const Rectangle& rRect ); 61 }; 62 63 64 PasswordReenterEdit_Impl::PasswordReenterEdit_Impl( Window * pParent, const ResId &rResId ) : 65 Edit( pParent, rResId ) 66 { 67 // currently the spec does not want to display this text anymore... 68 // m_aDefaultTxt = String( CUI_RES( STR_PASSWD_MUST_BE_CONFIRMED ) ); 69 } 70 71 72 PasswordReenterEdit_Impl::~PasswordReenterEdit_Impl() 73 { 74 } 75 76 77 void PasswordReenterEdit_Impl::Paint( const Rectangle& rRect ) 78 { 79 if (GetText().Len() == 0) 80 { 81 Push( /*PUSH_FILLCOLOR | PUSH_TEXTFILLCOLOR |*/ PUSH_TEXTCOLOR ); 82 /* 83 Color aFillColor( GetParent()->GetBackground().GetColor() ); 84 SetLineColor(); // don't draw a border when painting the Edit field rectangle with the new background color 85 SetFillColor( aFillColor ); 86 SetTextFillColor( aFillColor ); 87 SetTextColor( GetParent()->GetTextColor() ); // use plain text color even if the Edit field is disabled (it is hard to read the text otherwise) 88 89 DrawRect( Rectangle( Point(), GetOutputSizePixel() ) ); 90 */ 91 SetTextColor( Color( COL_GRAY ) ); 92 DrawText( Point(), m_aDefaultTxt ); 93 94 Pop(); 95 } 96 else 97 Edit::Paint( rRect ); 98 } 99 100 101 ////////////////////////////////////////////////////////////////////// 102 103 struct PasswordToOpenModifyDialog_Impl 104 { 105 PasswordToOpenModifyDialog * m_pParent; 106 107 FixedLine m_aFileEncryptionFL; 108 FixedText m_aPasswdToOpenFT; 109 Edit m_aPasswdToOpenED; 110 FixedText m_aReenterPasswdToOpenFT; 111 PasswordReenterEdit_Impl m_aReenterPasswdToOpenED; 112 // FixedImage m_aPasswdToOpenMatchFI; 113 FixedText m_aPasswdNoteFT; 114 FixedLine m_aButtonsFL; 115 MoreButton m_aMoreFewerOptionsBTN; 116 OKButton m_aOk; 117 CancelButton m_aCancel; 118 FixedLine m_aFileSharingOptionsFL; 119 CheckBox m_aOpenReadonlyCB; 120 FixedText m_aPasswdToModifyFT; 121 Edit m_aPasswdToModifyED; 122 FixedText m_aReenterPasswdToModifyFT; 123 PasswordReenterEdit_Impl m_aReenterPasswdToModifyED; 124 // FixedImage m_aPasswdToModifyMatchFI; 125 126 String m_aOneMismatch; 127 String m_aTwoMismatch; 128 String m_aInvalidStateForOkButton; 129 String m_aInvalidStateForOkButton_v2; 130 131 bool m_bIsPasswordToModify; 132 133 134 // DECL_LINK( ModifyHdl, Edit * ); 135 DECL_LINK( OkBtnClickHdl, OKButton * ); 136 137 PasswordToOpenModifyDialog_Impl( PasswordToOpenModifyDialog * pParent, 138 sal_uInt16 nMinPasswdLen, sal_uInt16 nMaxPasswdLen, bool bIsPasswordToModify ); 139 ~PasswordToOpenModifyDialog_Impl(); 140 }; 141 142 143 PasswordToOpenModifyDialog_Impl::PasswordToOpenModifyDialog_Impl( 144 PasswordToOpenModifyDialog * pParent, 145 sal_uInt16 nMinPasswdLen, 146 sal_uInt16 nMaxPasswdLen, 147 bool bIsPasswordToModify ) : 148 m_pParent( pParent ), 149 m_aFileEncryptionFL ( pParent, CUI_RES( FL_FILE_ENCRYPTION ) ), 150 m_aPasswdToOpenFT ( pParent, CUI_RES( FT_PASSWD_TO_OPEN ) ), 151 m_aPasswdToOpenED ( pParent, CUI_RES( ED_PASSWD_TO_OPEN ) ), 152 m_aReenterPasswdToOpenFT ( pParent, CUI_RES( FT_REENTER_PASSWD_TO_OPEN ) ), 153 m_aReenterPasswdToOpenED ( pParent, CUI_RES( ED_REENTER_PASSWD_TO_OPEN ) ), 154 // m_aPasswdToOpenMatchFI ( pParent, CUI_RES( FI_PASSWD_TO_OPEN_MATCH ) ), 155 m_aPasswdNoteFT ( pParent, CUI_RES( FT_PASSWD_NOTE ) ), 156 m_aButtonsFL ( pParent, CUI_RES( FL_BUTTONS ) ), 157 m_aMoreFewerOptionsBTN ( pParent, CUI_RES( BTN_MORE_FEWER_OPTIONS ) ), 158 m_aOk ( pParent, CUI_RES( BTN_OK ) ), 159 m_aCancel ( pParent, CUI_RES( BTN_CANCEL ) ), 160 m_aFileSharingOptionsFL ( pParent, CUI_RES( FL_FILE_SHARING_OPTIONS ) ), 161 m_aOpenReadonlyCB ( pParent, CUI_RES( CB_OPEN_READONLY ) ), 162 m_aPasswdToModifyFT ( pParent, CUI_RES( FT_PASSWD_TO_MODIFY ) ), 163 m_aPasswdToModifyED ( pParent, CUI_RES( ED_PASSWD_TO_MODIFY ) ), 164 m_aReenterPasswdToModifyFT ( pParent, CUI_RES( FT_REENTER_PASSWD_TO_MODIFY ) ), 165 m_aReenterPasswdToModifyED ( pParent, CUI_RES( ED_REENTER_PASSWD_TO_MODIFY ) ), 166 // m_aPasswdToModifyMatchFI ( pParent, CUI_RES( FI_PASSWD_TO_MODIFY_MATCH ) ) 167 m_aOneMismatch( CUI_RES( STR_ONE_PASSWORD_MISMATCH ) ), 168 m_aTwoMismatch( CUI_RES( STR_TWO_PASSWORDS_MISMATCH ) ), 169 m_aInvalidStateForOkButton( CUI_RES( STR_INVALID_STATE_FOR_OK_BUTTON ) ), 170 m_aInvalidStateForOkButton_v2( CUI_RES( STR_INVALID_STATE_FOR_OK_BUTTON_V2 ) ), 171 m_bIsPasswordToModify( bIsPasswordToModify ) 172 { 173 /* 174 const sal_Bool bHighContrast = pParent->GetSettings().GetStyleSettings().GetHighContrastMode(); 175 const Image aImage( CUI_RES( bHighContrast ? IMG_PASSWD_MATCH_HC : IMG_PASSWD_MATCH ) ); 176 m_aPasswdToOpenMatchFI.SetImage( aImage ); 177 m_aPasswdToModifyMatchFI.SetImage( aImage ); 178 */ 179 180 m_aMoreFewerOptionsBTN.SetMoreText( String( CUI_RES( STR_MORE_OPTIONS ) ) ); 181 m_aMoreFewerOptionsBTN.SetLessText( String( CUI_RES( STR_FEWER_OPTIONS ) ) ); 182 183 #if 0 184 Link aModifyLink = LINK( this, PasswordToOpenModifyDialog_Impl, ModifyHdl ); 185 m_aPasswdToOpenED.SetModifyHdl( aModifyLink ); 186 m_aReenterPasswdToOpenED.SetModifyHdl( aModifyLink ); 187 m_aPasswdToModifyED.SetModifyHdl( aModifyLink ); 188 m_aReenterPasswdToModifyED.SetModifyHdl( aModifyLink ); 189 #endif 190 191 m_aOk.SetClickHdl( LINK( this, PasswordToOpenModifyDialog_Impl, OkBtnClickHdl ) ); 192 193 // m_aOk.Enable( sal_False ); 194 195 if (nMaxPasswdLen) 196 { 197 m_aPasswdToOpenED.SetMaxTextLen( nMaxPasswdLen ); 198 m_aReenterPasswdToOpenED.SetMaxTextLen( nMaxPasswdLen ); 199 m_aPasswdToModifyED.SetMaxTextLen( nMaxPasswdLen ); 200 m_aReenterPasswdToModifyED.SetMaxTextLen( nMaxPasswdLen ); 201 } 202 203 (void) nMinPasswdLen; // currently not supported 204 205 m_aPasswdToOpenED.GrabFocus(); 206 207 // ModifyHdl( NULL ); 208 209 m_aMoreFewerOptionsBTN.Enable( bIsPasswordToModify ); 210 if (!bIsPasswordToModify) 211 m_aMoreFewerOptionsBTN.Hide( sal_True ); 212 } 213 214 215 PasswordToOpenModifyDialog_Impl::~PasswordToOpenModifyDialog_Impl() 216 { 217 } 218 219 #if 0 220 IMPL_LINK( PasswordToOpenModifyDialog_Impl, ModifyHdl, Edit *, EMPTYARG /*pEdit*/ ) 221 { 222 // force repaints to get the m_aDefaultTxt displayed again 223 if (m_aReenterPasswdToOpenED.GetText().Len() == 0) 224 m_aReenterPasswdToOpenED.Invalidate(); 225 if (m_aReenterPasswdToModifyED.GetText().Len() == 0) 226 m_aReenterPasswdToModifyED.Invalidate(); 227 228 const sal_Int32 nPasswdToOpenLen = m_aPasswdToOpenED.GetText().Len(); 229 const sal_Int32 nPasswdToModifyLen = m_aPasswdToModifyED.GetText().Len(); 230 231 const bool bBothEmpty = nPasswdToOpenLen == 0 && nPasswdToModifyLen == 0; 232 const bool bToOpenMatch = m_aPasswdToOpenED.GetText() == m_aReenterPasswdToOpenED.GetText(); 233 const bool bToModifyMatch = m_aPasswdToModifyED.GetText() == m_aReenterPasswdToModifyED.GetText(); 234 235 m_aOk.Enable( bToOpenMatch && bToModifyMatch && !bBothEmpty ); 236 237 // m_aPasswdToOpenMatchFI.Enable( bToOpenMatch && !bBothEmpty ); 238 // m_aPasswdToModifyMatchFI.Enable( bToModifyMatch && !bBothEmpty ); 239 240 return 0; 241 } 242 #endif 243 244 245 IMPL_LINK( PasswordToOpenModifyDialog_Impl, OkBtnClickHdl, OKButton *, EMPTYARG /*pBtn*/ ) 246 { 247 bool bInvalidState = !m_aOpenReadonlyCB.IsChecked() && 248 m_aPasswdToOpenED.GetText().Len() == 0 && 249 m_aPasswdToModifyED.GetText().Len() == 0; 250 if (bInvalidState) 251 { 252 ErrorBox aErrorBox( m_pParent, WB_OK, 253 m_bIsPasswordToModify? m_aInvalidStateForOkButton : m_aInvalidStateForOkButton_v2 ); 254 aErrorBox.Execute(); 255 } 256 else // check for mismatched passwords... 257 { 258 const bool bToOpenMatch = m_aPasswdToOpenED.GetText() == m_aReenterPasswdToOpenED.GetText(); 259 const bool bToModifyMatch = m_aPasswdToModifyED.GetText() == m_aReenterPasswdToModifyED.GetText(); 260 const int nMismatch = (bToOpenMatch? 0 : 1) + (bToModifyMatch? 0 : 1); 261 if (nMismatch > 0) 262 { 263 ErrorBox aErrorBox( m_pParent, WB_OK, nMismatch == 1 ? m_aOneMismatch : m_aTwoMismatch ); 264 aErrorBox.Execute(); 265 266 Edit &rEdit = !bToOpenMatch? m_aPasswdToOpenED : m_aPasswdToModifyED; 267 PasswordReenterEdit_Impl &rRepeatEdit = !bToOpenMatch? m_aReenterPasswdToOpenED : m_aReenterPasswdToModifyED; 268 String aEmpty; 269 if (nMismatch == 1) 270 { 271 rEdit.SetText( aEmpty ); 272 rRepeatEdit.SetText( aEmpty ); 273 } 274 else if (nMismatch == 2) 275 { 276 m_aPasswdToOpenED.SetText( aEmpty ); 277 m_aReenterPasswdToOpenED.SetText( aEmpty ); 278 m_aPasswdToModifyED.SetText( aEmpty ); 279 m_aReenterPasswdToModifyED.SetText( aEmpty ); 280 } 281 rEdit.GrabFocus(); 282 } 283 else 284 { 285 m_pParent->EndDialog( RET_OK ); 286 } 287 } 288 289 return 0; 290 } 291 292 ////////////////////////////////////////////////////////////////////// 293 294 295 PasswordToOpenModifyDialog::PasswordToOpenModifyDialog( 296 Window * pParent, 297 sal_uInt16 nMinPasswdLen, 298 sal_uInt16 nMaxPasswdLen, 299 bool bIsPasswordToModify ) : 300 SfxModalDialog( pParent, CUI_RES( RID_DLG_PASSWORD_TO_OPEN_MODIFY ) ) 301 { 302 m_pImpl = std::auto_ptr< PasswordToOpenModifyDialog_Impl >( 303 new PasswordToOpenModifyDialog_Impl( this, nMinPasswdLen, nMaxPasswdLen, bIsPasswordToModify ) ); 304 305 FreeResource(); 306 } 307 308 309 PasswordToOpenModifyDialog::~PasswordToOpenModifyDialog() 310 { 311 } 312 313 314 String PasswordToOpenModifyDialog::GetPasswordToOpen() const 315 { 316 const bool bPasswdOk = 317 m_pImpl->m_aPasswdToOpenED.GetText().Len() > 0 && 318 m_pImpl->m_aPasswdToOpenED.GetText() == m_pImpl->m_aReenterPasswdToOpenED.GetText(); 319 return bPasswdOk ? m_pImpl->m_aPasswdToOpenED.GetText() : String(); 320 } 321 322 323 String PasswordToOpenModifyDialog::GetPasswordToModify() const 324 { 325 const bool bPasswdOk = 326 m_pImpl->m_aPasswdToModifyED.GetText().Len() > 0 && 327 m_pImpl->m_aPasswdToModifyED.GetText() == m_pImpl->m_aReenterPasswdToModifyED.GetText(); 328 return bPasswdOk ? m_pImpl->m_aPasswdToModifyED.GetText() : String(); 329 } 330 331 332 bool PasswordToOpenModifyDialog::IsRecommendToOpenReadonly() const 333 { 334 return m_pImpl->m_aOpenReadonlyCB.IsChecked(); 335 } 336 337 338 ////////////////////////////////////////////////////////////////////// 339 340