1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: retypepassdlg.cxx,v $
10 * $Revision: 1.1.2.7 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sc.hxx"
34 #include "retypepassdlg.hxx"
35 #include "retypepassdlg.hrc"
36 #include "scresid.hxx"
37 #include "document.hxx"
38 #include "tabprotection.hxx"
42 #include <vcl/msgbox.hxx>
44 ScRetypePassDlg::ScRetypePassDlg(Window
* pParent
) :
45 ModalDialog(pParent
, ScResId(RID_SCDLG_RETYPEPASS
)),
47 maBtnOk (this, ScResId(BTN_OK
)),
48 maBtnCancel (this, ScResId(BTN_CANCEL
)),
49 maBtnHelp (this, ScResId(BTN_HELP
)),
51 maTextDescription(this, ScResId(FT_DESC
)),
52 maLineDocument(this, ScResId(FL_DOCUMENT
)),
53 maTextDocStatus(this, ScResId(FT_DOCSTATUS
)),
54 maBtnRetypeDoc(this, ScResId(BTN_RETYPE_DOC
)),
56 maLineSheet(this, ScResId(FL_SHEET
)),
57 maTextSheetName1(this, ScResId(FT_SHEETNAME1
)),
58 maTextSheetStatus1(this, ScResId(FT_SHEETSTATUS1
)),
59 maBtnRetypeSheet1(this, ScResId(BTN_RETYPE_SHEET1
)),
61 maTextSheetName2(this, ScResId(FT_SHEETNAME2
)),
62 maTextSheetStatus2(this, ScResId(FT_SHEETSTATUS2
)),
63 maBtnRetypeSheet2(this, ScResId(BTN_RETYPE_SHEET2
)),
65 maTextSheetName3(this, ScResId(FT_SHEETNAME3
)),
66 maTextSheetStatus3(this, ScResId(FT_SHEETSTATUS3
)),
67 maBtnRetypeSheet3(this, ScResId(BTN_RETYPE_SHEET3
)),
69 maTextSheetName4(this, ScResId(FT_SHEETNAME4
)),
70 maTextSheetStatus4(this, ScResId(FT_SHEETSTATUS4
)),
71 maBtnRetypeSheet4(this, ScResId(BTN_RETYPE_SHEET4
)),
73 maScrollBar (this, ScResId(SB_SCROLL
)),
75 maTextNotProtected(ScResId(STR_NOT_PROTECTED
)),
76 maTextNotPassProtected(ScResId(STR_NOT_PASS_PROTECTED
)),
77 maTextHashBad(ScResId(STR_HASH_BAD
)),
78 maTextHashGood(ScResId(STR_HASH_GOOD
)),
79 maTextHashRegen(ScResId(STR_HASH_REGENERATED
)),
81 mpDocItem(static_cast<ScDocProtection
*>(NULL
)),
83 meDesiredHash(PASSHASH_SHA1
)
88 ScRetypePassDlg::~ScRetypePassDlg()
92 short ScRetypePassDlg::Execute()
96 return ModalDialog::Execute();
99 void ScRetypePassDlg::SetDataFromDocument(const ScDocument
& rDoc
)
101 const ScDocProtection
* pDocProtect
= rDoc
.GetDocProtection();
102 if (pDocProtect
&& pDocProtect
->isProtected())
103 mpDocItem
.reset(new ScDocProtection(*pDocProtect
));
105 SCTAB nTabCount
= rDoc
.GetTableCount();
106 maTableItems
.reserve(nTabCount
);
107 for (SCTAB i
= 0; i
< nTabCount
; ++i
)
110 rDoc
.GetName(i
, aTabItem
.maName
);
112 const ScTableProtection
* pTabProtect
= rDoc
.GetTabProtection(i
);
113 if (pTabProtect
&& pTabProtect
->isProtected())
114 aTabItem
.mpProtect
.reset(new ScTableProtection(*pTabProtect
));
116 maTableItems
.push_back(aTabItem
);
120 void ScRetypePassDlg::SetDesiredHash(ScPasswordHash eHash
)
122 meDesiredHash
= eHash
;
125 void ScRetypePassDlg::WriteNewDataToDocument(ScDocument
& rDoc
) const
128 rDoc
.SetDocProtection(mpDocItem
.get());
130 size_t nTabCount
= static_cast<size_t>(rDoc
.GetTableCount());
131 size_t n
= maTableItems
.size();
132 for (size_t i
= 0; i
< n
; ++i
)
137 ScTableProtection
* pTabProtect
= maTableItems
[i
].mpProtect
.get();
139 rDoc
.SetTabProtection(static_cast<SCTAB
>(i
), pTabProtect
);
143 void ScRetypePassDlg::Init()
145 Link aLink
= LINK( this, ScRetypePassDlg
, OKHdl
);
146 maBtnOk
.SetClickHdl(aLink
);
148 aLink
= LINK( this, ScRetypePassDlg
, RetypeBtnHdl
);
149 maBtnRetypeDoc
.SetClickHdl(aLink
);
150 maBtnRetypeSheet1
.SetClickHdl(aLink
);
151 maBtnRetypeSheet2
.SetClickHdl(aLink
);
152 maBtnRetypeSheet3
.SetClickHdl(aLink
);
153 maBtnRetypeSheet4
.SetClickHdl(aLink
);
155 maTextDocStatus
.SetText(maTextNotProtected
);
156 maTextSheetStatus1
.SetText(maTextNotProtected
);
157 maTextSheetStatus2
.SetText(maTextNotProtected
);
158 maTextSheetStatus3
.SetText(maTextNotProtected
);
159 maTextSheetStatus4
.SetText(maTextNotProtected
);
160 maBtnRetypeDoc
.Disable();
162 // Make all sheet rows invisible.
164 maTextSheetName1
.Show(false);
165 maTextSheetStatus1
.Show(false);
166 maBtnRetypeSheet1
.Show(false);
167 maBtnRetypeSheet1
.Disable();
169 maTextSheetName2
.Show(false);
170 maTextSheetStatus2
.Show(false);
171 maBtnRetypeSheet2
.Show(false);
172 maBtnRetypeSheet2
.Disable();
174 maTextSheetName3
.Show(false);
175 maTextSheetStatus3
.Show(false);
176 maBtnRetypeSheet3
.Show(false);
177 maBtnRetypeSheet3
.Disable();
179 maTextSheetName4
.Show(false);
180 maTextSheetStatus4
.Show(false);
181 maBtnRetypeSheet4
.Show(false);
182 maBtnRetypeSheet4
.Disable();
184 maScrollBar
.Show(false);
186 maScrollBar
.SetEndScrollHdl( LINK( this, ScRetypePassDlg
, ScrollHdl
) );
187 maScrollBar
.SetScrollHdl( LINK( this, ScRetypePassDlg
, ScrollHdl
) );
189 maScrollBar
.SetPageSize(4);
190 maScrollBar
.SetVisibleSize(4);
191 maScrollBar
.SetLineSize(1);
194 void ScRetypePassDlg::PopulateDialog()
196 // Document protection first.
199 // Sheet protection next. We're only interested in the first 4 sheets
201 size_t n
= maTableItems
.size();
202 for (size_t i
= 0; i
< n
&& i
< 4; ++i
)
203 SetTableData(i
, static_cast< SCTAB
>( i
));
207 maScrollBar
.Show(true);
208 maScrollBar
.SetRange(Range(0, n
));
212 void ScRetypePassDlg::SetDocData()
214 bool bBtnEnabled
= false;
215 if (mpDocItem
.get() && mpDocItem
->isProtected())
217 if (mpDocItem
->isPasswordEmpty())
218 maTextDocStatus
.SetText(maTextNotPassProtected
);
219 else if (mpDocItem
->hasPasswordHash(meDesiredHash
))
220 maTextDocStatus
.SetText(maTextHashGood
);
224 maTextDocStatus
.SetText(maTextHashBad
);
228 maBtnRetypeDoc
.Enable(bBtnEnabled
);
231 void ScRetypePassDlg::SetTableData(size_t nRowPos
, SCTAB nTab
)
236 FixedText
* pName
= NULL
;
237 FixedText
* pStatus
= NULL
;
238 PushButton
* pBtn
= NULL
;
242 pName
= &maTextSheetName1
;
243 pStatus
= &maTextSheetStatus1
;
244 pBtn
= &maBtnRetypeSheet1
;
247 pName
= &maTextSheetName2
;
248 pStatus
= &maTextSheetStatus2
;
249 pBtn
= &maBtnRetypeSheet2
;
252 pName
= &maTextSheetName3
;
253 pStatus
= &maTextSheetStatus3
;
254 pBtn
= &maBtnRetypeSheet3
;
257 pName
= &maTextSheetName4
;
258 pStatus
= &maTextSheetStatus4
;
259 pBtn
= &maBtnRetypeSheet4
;
265 bool bBtnEnabled
= false;
266 pName
->SetText(maTableItems
[nTab
].maName
);
268 const ScTableProtection
* pTabProtect
= maTableItems
[nTab
].mpProtect
.get();
269 if (pTabProtect
&& pTabProtect
->isProtected())
271 if (pTabProtect
->isPasswordEmpty())
272 pStatus
->SetText(maTextNotPassProtected
);
273 else if (pTabProtect
->hasPasswordHash(meDesiredHash
))
274 pStatus
->SetText(maTextHashGood
);
278 pStatus
->SetText(maTextHashBad
);
283 pStatus
->SetText(maTextNotProtected
);
287 pBtn
->Enable(bBtnEnabled
);
290 void ScRetypePassDlg::ResetTableRows()
292 long nScrollPos
= maScrollBar
.GetThumbPos();
293 mnCurScrollPos
= nScrollPos
< 0 ? 0 : nScrollPos
;
294 size_t nRowCount
= maTableItems
.size() - nScrollPos
;
295 for (size_t i
= 0; i
< nRowCount
; ++i
)
296 SetTableData(i
, static_cast< SCTAB
>( i
+ nScrollPos
));
299 bool lcl_IsInGoodStatus(ScPassHashProtectable
* pProtected
, ScPasswordHash eDesiredHash
)
301 if (!pProtected
|| !pProtected
->isProtected())
305 if (pProtected
->isPasswordEmpty())
308 if (pProtected
->hasPasswordHash(eDesiredHash
))
314 void ScRetypePassDlg::CheckHashStatus()
318 if (!lcl_IsInGoodStatus(mpDocItem
.get(), meDesiredHash
))
321 bool bStatusGood
= true;
322 size_t nTabCount
= maTableItems
.size();
323 for (size_t i
= 0; i
< nTabCount
&& bStatusGood
; ++i
)
325 if (!lcl_IsInGoodStatus(maTableItems
[i
].mpProtect
.get(), meDesiredHash
))
339 IMPL_LINK( ScRetypePassDlg
, OKHdl
, OKButton
*, EMPTYARG
)
345 IMPL_LINK( ScRetypePassDlg
, RetypeBtnHdl
, PushButton
*, pBtn
)
347 ScPassHashProtectable
* pProtected
= NULL
;
348 if (pBtn
== &maBtnRetypeDoc
)
350 // document protection.
351 pProtected
= mpDocItem
.get();
356 size_t nTabPos
= mnCurScrollPos
;
357 if (pBtn
== &maBtnRetypeSheet2
)
359 else if (pBtn
== &maBtnRetypeSheet3
)
361 else if (pBtn
== &maBtnRetypeSheet4
)
363 else if (pBtn
!= &maBtnRetypeSheet1
)
364 // This should never happen !
367 if (nTabPos
>= maTableItems
.size())
368 // Likewise, this should never happen !
371 pProtected
= maTableItems
[nTabPos
].mpProtect
.get();
378 ScRetypePassInputDlg
aDlg(this, pProtected
);
379 if (aDlg
.Execute() == RET_OK
)
381 // OK is pressed. Update the protected item.
382 if (aDlg
.IsRemovePassword())
384 // Remove password from this item.
385 pProtected
->setPassword(String());
389 // Set a new password.
390 String aNewPass
= aDlg
.GetNewPassword();
391 pProtected
->setPassword(aNewPass
);
401 IMPL_LINK( ScRetypePassDlg
, ScrollHdl
, ScrollBar
*, EMPTYARG
)
407 // ============================================================================
409 ScRetypePassInputDlg::ScRetypePassInputDlg(Window
* pParent
, ScPassHashProtectable
* pProtected
) :
410 ModalDialog(pParent
, ScResId(RID_SCDLG_RETYPEPASS_INPUT
)),
412 maBtnOk (this, ScResId(BTN_OK
)),
413 maBtnCancel (this, ScResId(BTN_CANCEL
)),
414 maBtnHelp (this, ScResId(BTN_HELP
)),
416 maBtnRetypePassword(this, ScResId(BTN_RETYPE_PASSWORD
)),
418 maPassword1Text (this, ScResId(FT_PASSWORD1
)),
419 maPassword1Edit (this, ScResId(ED_PASSWORD1
)),
420 maPassword2Text (this, ScResId(FT_PASSWORD2
)),
421 maPassword2Edit (this, ScResId(ED_PASSWORD2
)),
422 maBtnMatchOldPass(this, ScResId(BTN_MATCH_OLD_PASSWORD
)),
424 maBtnRemovePassword(this, ScResId(BTN_REMOVE_PASSWORD
)),
426 mpProtected(pProtected
)
431 ScRetypePassInputDlg::~ScRetypePassInputDlg()
435 short ScRetypePassInputDlg::Execute()
437 return ModalDialog::Execute();
440 bool ScRetypePassInputDlg::IsRemovePassword() const
442 return maBtnRemovePassword
.IsChecked();
445 String
ScRetypePassInputDlg::GetNewPassword() const
447 return maPassword1Edit
.GetText();
450 void ScRetypePassInputDlg::Init()
452 Link aLink
= LINK( this, ScRetypePassInputDlg
, OKHdl
);
453 maBtnOk
.SetClickHdl(aLink
);
454 aLink
= LINK( this, ScRetypePassInputDlg
, RadioBtnHdl
);
455 maBtnRetypePassword
.SetClickHdl(aLink
);
456 maBtnRemovePassword
.SetClickHdl(aLink
);
457 aLink
= LINK( this, ScRetypePassInputDlg
, CheckBoxHdl
);
458 maBtnMatchOldPass
.SetClickHdl(aLink
);
459 aLink
= LINK( this, ScRetypePassInputDlg
, PasswordModifyHdl
);
460 maPassword1Edit
.SetModifyHdl(aLink
);
461 maPassword2Edit
.SetModifyHdl(aLink
);
464 maBtnRetypePassword
.Check(true);
465 maBtnMatchOldPass
.Check(true);
466 maPassword1Edit
.GrabFocus();
469 void ScRetypePassInputDlg::CheckPasswordInput()
471 String aPass1
= maPassword1Edit
.GetText();
472 String aPass2
= maPassword2Edit
.GetText();
474 if (!aPass1
.Len() || !aPass2
.Len())
476 // Empty password is not allowed.
481 if (!aPass1
.Equals(aPass2
))
483 // The two passwords differ.
488 if (!maBtnMatchOldPass
.IsChecked())
496 // This should never happen!
501 bool bPassGood
= mpProtected
->verifyPassword(aPass1
);
502 maBtnOk
.Enable(bPassGood
);
505 IMPL_LINK( ScRetypePassInputDlg
, OKHdl
, OKButton
*, EMPTYARG
)
511 IMPL_LINK( ScRetypePassInputDlg
, RadioBtnHdl
, RadioButton
*, pBtn
)
513 if (pBtn
== &maBtnRetypePassword
)
515 maBtnRemovePassword
.Check(false);
516 maPassword1Text
.Enable();
517 maPassword1Edit
.Enable();
518 maPassword2Text
.Enable();
519 maPassword2Edit
.Enable();
520 maBtnMatchOldPass
.Enable();
521 CheckPasswordInput();
523 else if (pBtn
== &maBtnRemovePassword
)
525 maBtnRetypePassword
.Check(false);
526 maPassword1Text
.Disable();
527 maPassword1Edit
.Disable();
528 maPassword2Text
.Disable();
529 maPassword2Edit
.Disable();
530 maBtnMatchOldPass
.Disable();
537 IMPL_LINK( ScRetypePassInputDlg
, CheckBoxHdl
, CheckBox
*, EMPTYARG
)
539 CheckPasswordInput();
543 IMPL_LINK( ScRetypePassInputDlg
, PasswordModifyHdl
, Edit
*, EMPTYARG
)
545 CheckPasswordInput();