📄 dboxmain.cpp
字号:
// file DboxMain.cpp//// Methods related to viewing the actual password database are in DboxView.cpp//-----------------------------------------------------------------------------#include "PasswordSafe.h"#include "ThisMfcApp.h"#include "corelib/PWSprefs.h"#if defined(POCKET_PC) #include "pocketpc/resource.h"#else #include <errno.h> #include "resource.h"#endif// dialog boxen#include "DboxMain.h"#include "ClearQuestionDlg.h"#include "FindDlg.h"#include "PasskeyChangeDlg.h"#include "PasskeyEntry.h"#include "PasskeySetup.h"#include "UsernameEntry.h"#include "TryAgainDlg.h"#include "ExportText.h"// widget override?#include "SysColStatic.h"#ifdef POCKET_PC #include "pocketpc/PocketPC.h" #include "ShowPasswordDlg.h"#endif#include <afxpriv.h>#include <stdlib.h> // for qsort#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif#if defined(UNICODE) #define CLIPBOARD_TEXT_FORMAT CF_UNICODETEXT#else #define CLIPBOARD_TEXT_FORMAT CF_TEXT#endif/* * This is the string to be displayed instead of the actual password, unless * the user chooses to see the password: */const TCHAR *HIDDEN_PASSWORD = _T("**************");//-----------------------------------------------------------------------------class DboxAbout#if defined(POCKET_PC) : public CPwsPopupDialog#else : public CDialog#endif{public:#if defined(POCKET_PC) typedef CPwsPopupDialog super;#else typedef CDialog super;#endif DboxAbout() : super(DboxAbout::IDD) {} enum { IDD = IDD_ABOUTBOX };protected: virtual void DoDataExchange(CDataExchange* pDX) // DDX/DDV support { super::DoDataExchange(pDX); }protected: DECLARE_MESSAGE_MAP()};// I don't think we need this, but...BEGIN_MESSAGE_MAP(DboxAbout, super)END_MESSAGE_MAP()//-----------------------------------------------------------------------------DboxMain::DboxMain(CWnd* pParent) : CDialog(DboxMain::IDD, pParent), m_bSizing( false ), m_needsreading(true), m_windowok(false), m_existingrestore(FALSE), m_toolbarsSetup(FALSE), m_bShowPasswordInEdit(false), m_bShowPasswordInList(false), m_bSortAscending(true), m_iSortedColumn(0), m_core(app.m_core), m_LockDisabled(false){ //{{AFX_DATA_INIT(DboxMain) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_hIcon = app.LoadIcon(IDI_CORNERICON); m_hIconSm = (HICON) ::LoadImage(app.m_hInstance, MAKEINTRESOURCE(IDI_CORNERICON), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); ClearData(); /* * current file and current backup file specs are stored in registry * Note that if m_currfile is non-empty, we will not read the registry value. * This will happen if a filename was given in the command line. */ if (m_core.GetCurFile().IsEmpty()) { // If there's no stored preference, this is probably a fresh install. // CheckPassword will catch this and handle it correctly m_core.SetCurFile(PWSprefs::GetInstance()-> GetPref(PWSprefs::StringPrefs::CurrentFile)); }#if !defined(POCKET_PC) m_title = _T(""); m_toolbarsSetup = FALSE;#endif m_bShowPasswordInEdit = false; m_bShowPasswordInList = false; m_bSortAscending = true; m_iSortedColumn = 0;}BEGIN_MESSAGE_MAP(DboxMain, CDialog) //{{AFX_MSG_MAP(DboxMain) ON_WM_DESTROY() ON_WM_SIZE() ON_COMMAND(ID_MENUITEM_ABOUT, OnAbout) ON_COMMAND(ID_PWSAFE_WEBSITE, OnPasswordSafeWebsite) ON_COMMAND(ID_MENUITEM_COPYUSERNAME, OnCopyUsername)#if defined(POCKET_PC) ON_WM_CREATE()#else ON_WM_CONTEXTMENU()#endif ON_NOTIFY(LVN_KEYDOWN, IDC_ITEMLIST, OnKeydownItemlist) ON_NOTIFY(NM_DBLCLK, IDC_ITEMLIST, OnItemDoubleClick) ON_NOTIFY(NM_DBLCLK, IDC_ITEMTREE, OnItemDoubleClick) ON_COMMAND(ID_MENUITEM_BROWSE, OnBrowse) ON_COMMAND(ID_MENUITEM_COPYPASSWORD, OnCopyPassword) ON_COMMAND(ID_MENUITEM_NEW, OnNew) ON_COMMAND(ID_MENUITEM_OPEN, OnOpen) ON_COMMAND(ID_MENUITEM_RESTORE, OnRestore) ON_COMMAND(ID_MENUTIME_SAVEAS, OnSaveAs) ON_COMMAND(ID_MENUITEM_BACKUPSAFE, OnBackupSafe) ON_COMMAND(ID_MENUITEM_CHANGECOMBO, OnPasswordChange) ON_COMMAND(ID_MENUITEM_CLEARCLIPBOARD, OnClearClipboard) ON_COMMAND(ID_MENUITEM_DELETE, OnDelete) ON_COMMAND(ID_MENUITEM_EDIT, OnEdit) ON_COMMAND(ID_MENUITEM_RENAME, OnRename) ON_COMMAND(ID_MENUITEM_FIND, OnFind) ON_COMMAND(ID_MENUITEM_OPTIONS, OnOptions) ON_COMMAND(ID_MENUITEM_SAVE, OnSave) ON_COMMAND(ID_MENUITEM_LIST_VIEW, OnListView) ON_COMMAND(ID_MENUITEM_TREE_VIEW, OnTreeView) ON_COMMAND(ID_MENUITEM_OLD_TOOLBAR, OnOldToolbar) ON_COMMAND(ID_MENUITEM_NEW_TOOLBAR, OnNewToolbar) ON_COMMAND(ID_FILE_EXPORTTO_OLD1XFORMAT, OnExportV17) ON_COMMAND(ID_FILE_EXPORTTO_PLAINTEXT, OnExportText) ON_COMMAND(ID_FILE_EXPORTTO_XML, OnExportXML) ON_COMMAND(ID_FILE_IMPORT_PLAINTEXT, OnImportText) ON_COMMAND(ID_FILE_IMPORT_XML, OnImportXML) ON_COMMAND(ID_MENUITEM_ADD, OnAdd) ON_COMMAND(ID_MENUITEM_ADDGROUP, OnAddGroup) ON_WM_TIMER() ON_COMMAND(ID_MENUITEM_AUTOTYPE, OnAutoType)#if defined(POCKET_PC) ON_COMMAND(ID_MENUITEM_SHOWPASSWORD, OnShowPassword)#else ON_NOTIFY(NM_SETFOCUS, IDC_ITEMLIST, OnSetfocusItemlist) ON_NOTIFY(NM_KILLFOCUS, IDC_ITEMLIST, OnKillfocusItemlist) ON_WM_DROPFILES()#endif ON_NOTIFY(LVN_COLUMNCLICK, IDC_ITEMLIST, OnColumnClick) ON_UPDATE_COMMAND_UI(ID_FILE_MRU_ENTRY1, OnUpdateMRU) ON_WM_INITMENU() ON_WM_INITMENUPOPUP() ON_COMMAND(ID_MENUITEM_EXIT, OnOK) ON_COMMAND(ID_MENUITEM_MINIMIZE, OnMinimize) ON_COMMAND(ID_MENUITEM_UNMINIMIZE, OnUnMinimize)#if !defined(POCKET_PC) ON_COMMAND(ID_TOOLBUTTON_ADD, OnAdd) ON_COMMAND(ID_TOOLBUTTON_COPYPASSWORD, OnCopyPassword) ON_COMMAND(ID_TOOLBUTTON_COPYUSERNAME, OnCopyUsername) ON_COMMAND(ID_TOOLBUTTON_CLEARCLIPBOARD, OnClearClipboard) ON_COMMAND(ID_TOOLBUTTON_DELETE, OnDelete) ON_COMMAND(ID_TOOLBUTTON_EDIT, OnEdit) ON_COMMAND(ID_TOOLBUTTON_NEW, OnNew) ON_COMMAND(ID_TOOLBUTTON_OPEN, OnOpen) ON_COMMAND(ID_TOOLBUTTON_SAVE, OnSave)#endif ON_WM_SYSCOMMAND()#if !defined(POCKET_PC) ON_BN_CLICKED(IDOK, OnEdit) ON_WM_SIZING()#endif ON_MESSAGE(WM_ICON_NOTIFY, OnTrayNotification) //}}AFX_MSG_MAP ON_COMMAND_EX_RANGE(ID_FILE_MRU_ENTRY1, ID_FILE_MRU_ENTRY20, OnOpenMRU)#if !defined(POCKET_PC) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)#endifEND_MESSAGE_MAP()BOOLDboxMain::OnInitDialog(){ ConfigureSystemMenu(); CDialog::OnInitDialog(); if (OpenOnInit()==FALSE) // If this function fails, abort launch return TRUE; // AlwaysOnTop preference read from database, if possible, hence set after OpenOnInit m_bAlwaysOnTop = PWSprefs::GetInstance()->GetPref(PWSprefs::BoolPrefs::AlwaysOnTop); UpdateAlwaysOnTop(); // ditto for CurrentBackup... m_currbackup = PWSprefs::GetInstance()->GetPref(PWSprefs::StringPrefs::CurrentBackup); // ... and for UseSystemTray if (!PWSprefs::GetInstance()-> GetPref(PWSprefs::BoolPrefs::UseSystemTray)) app.m_TrayIcon.HideIcon(); m_windowok = true; // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIconSm, FALSE); // Set small icon // Init stuff for tree view CImageList *pImageList = new CImageList(); BOOL status = pImageList->Create(9, 9, ILC_COLOR, 2, 0); ASSERT(status != 0); CBitmap bitmap; // Order of LoadBitmap() calls matches CMyTreeCtrl public enum bitmap.LoadBitmap(IDB_NODE); pImageList->Add(&bitmap, (COLORREF)0x0); bitmap.DeleteObject(); bitmap.LoadBitmap(IDB_LEAF); pImageList->Add(&bitmap, (COLORREF)0x0); bitmap.DeleteObject(); m_ctlItemTree.SetImageList(pImageList, TVSIL_NORMAL); // Init stuff for list view m_ctlItemList.SetExtendedStyle(LVS_EX_FULLROWSELECT); int iColumnCount = 3; m_ctlItemList.InsertColumn(0, _T("Title")); m_ctlItemList.InsertColumn(1, _T("User Name")); m_ctlItemList.InsertColumn(2, _T("Notes")); m_bShowPasswordInEdit = PWSprefs::GetInstance()-> GetPref(PWSprefs::BoolPrefs::ShowPWDefault); m_bShowPasswordInList = PWSprefs::GetInstance()-> GetPref(PWSprefs::BoolPrefs::ShowPWInList); const CString lastView = PWSprefs::GetInstance()-> GetPref(PWSprefs::StringPrefs::LastView); if (lastView != _T("list")) { // not list mode, so start in tree view. m_ctlItemList.ShowWindow(SW_HIDE); m_ctlItemTree.ShowWindow(SW_SHOW); } CRect rect; m_ctlItemList.GetClientRect(&rect); int i1stWidth = PWSprefs::GetInstance()->GetPref(PWSprefs::IntPrefs::Column1Width, (rect.Width() / iColumnCount + rect.Width() % iColumnCount)); int i2ndWidth = PWSprefs::GetInstance()->GetPref(PWSprefs::IntPrefs::Column2Width, rect.Width() / iColumnCount); int i3rdWidth = PWSprefs::GetInstance()->GetPref(PWSprefs::IntPrefs::Column3Width, rect.Width() / iColumnCount); m_ctlItemList.SetColumnWidth(0, i1stWidth); m_ctlItemList.SetColumnWidth(1, i2ndWidth); m_ctlItemList.SetColumnWidth(2, i3rdWidth); m_iSortedColumn = PWSprefs::GetInstance()->GetPref(PWSprefs::IntPrefs::SortedColumn); m_bSortAscending = PWSprefs::GetInstance()-> GetPref(PWSprefs::BoolPrefs::SortAscending); // refresh list will add and size password column if necessary... RefreshList(); ChangeOkUpdate(); setupBars(); // Just to keep things a little bit cleaner#if !defined(POCKET_PC) // {kjp} Can't drag and drop files onto an application in PocketPC DragAcceptFiles(TRUE); // {kjp} meaningless when target is a PocketPC device. PWSprefs::GetInstance()->GetPrefRect(rect.top, rect.bottom, rect.left, rect.right); if (rect.top == -1 || rect.bottom == -1 || rect.left == -1 || rect.right == -1) { GetWindowRect(&rect); SendMessage(WM_SIZE, SIZE_RESTORED, MAKEWPARAM(rect.Width(), rect.Height())); } else { MoveWindow(&rect, TRUE); }#endif m_core.SetUseDefUser(PWSprefs::GetInstance()-> GetPref(PWSprefs::BoolPrefs::UseDefUser)); m_core.SetDefUsername(PWSprefs::GetInstance()-> GetPref(PWSprefs::StringPrefs::DefUserName)); return TRUE; // return TRUE unless you set the focus to a control}BOOLDboxMain::OpenOnInit(void){ /* Routine to account for the differences between opening PSafe for the first time, and just opening a different database or un-minimizing the application */ CMyString passkey; int rc = GetAndCheckPassword(m_core.GetCurFile(), passkey, true); int rc2 = PWScore::NOT_SUCCESS; switch (rc) { case PWScore::SUCCESS: rc2 = m_core.ReadCurFile(passkey);#if !defined(POCKET_PC) m_title = "Password Safe - " + m_core.GetCurFile();#endif break; case PWScore::CANT_OPEN_FILE: if (m_core.GetCurFile().IsEmpty()) { // Empty filename. Assume they are starting Password Safe // for the first time and don't confuse them. // fallthrough to New() } else { // Here if there was a filename saved from last invocation, but it couldn't // be opened. It was either removed or renamed, so ask the user what to do CMyString msg = _T("The database ") + m_core.GetCurFile(); msg += _T(" couldn't be opened.\nDo you wish to look for it elsewhere (Yes), "); msg += _T("create a new database (No), or exit (Cancel)?"); int rc3 = MessageBox(msg, AfxGetAppName(), (MB_ICONQUESTION | MB_YESNOCANCEL)); switch (rc3) { case IDYES: rc2 = Open(); break; case IDNO: rc2 = New(); break; case IDCANCEL: rc2 = PWScore::USER_CANCEL; break; } break; } case TAR_NEW: rc2 = New(); if (PWScore::USER_CANCEL == rc2) { // somehow, get DboxPasskeyEntryFirst redisplayed... } break; case TAR_OPEN: rc2 = Open(); if (PWScore::USER_CANCEL == rc2) { // somehow, get DboxPasskeyEntryFirst redisplayed... } break; case PWScore::WRONG_PASSWORD: default: break; } if (rc2 == PWScore::SUCCESS) { m_existingrestore = FALSE; m_needsreading = false; startLockCheckTimer(); return TRUE; } else { app.m_pMainWnd = NULL; CDialog::OnCancel(); return FALSE; }}voidDboxMain::OnDestroy(){ //WinHelp(0L, HELP_QUIT); CDialog::OnDestroy();}voidDboxMain::OnItemDoubleClick( NMHDR *, LRESULT *){#if defined(POCKET_PC) if ( app.GetProfileInt(_T(PWS_REG_OPTIONS), _T("dcshowspassword"), FALSE) == FALSE ) { OnCopyPassword(); } else { OnShowPassword(); }#else OnCopyPassword();#endif}// Called to open a web browser to the URL associated with an entry.void DboxMain::OnBrowse(){ if (!m_BrowseURL.IsEmpty()) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -