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
PasswordReenterEdit_Impl(Window * pParent,const ResId & rResId)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
~PasswordReenterEdit_Impl()72 PasswordReenterEdit_Impl::~PasswordReenterEdit_Impl()
73 {
74 }
75
76
Paint(const Rectangle & rRect)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
PasswordToOpenModifyDialog_Impl(PasswordToOpenModifyDialog * pParent,sal_uInt16 nMinPasswdLen,sal_uInt16 nMaxPasswdLen,bool bIsPasswordToModify)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
~PasswordToOpenModifyDialog_Impl()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
IMPL_LINK(PasswordToOpenModifyDialog_Impl,OkBtnClickHdl,OKButton *,EMPTYARG)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
PasswordToOpenModifyDialog(Window * pParent,sal_uInt16 nMinPasswdLen,sal_uInt16 nMaxPasswdLen,bool bIsPasswordToModify)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
~PasswordToOpenModifyDialog()309 PasswordToOpenModifyDialog::~PasswordToOpenModifyDialog()
310 {
311 }
312
313
GetPasswordToOpen() const314 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
GetPasswordToModify() const323 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
IsRecommendToOpenReadonly() const332 bool PasswordToOpenModifyDialog::IsRecommendToOpenReadonly() const
333 {
334 return m_pImpl->m_aOpenReadonlyCB.IsChecked();
335 }
336
337
338 //////////////////////////////////////////////////////////////////////
339
340