From fbc6febc0cb746b1aa1fdad9d922082f416d9fbe Mon Sep 17 00:00:00 2001 From: tarek_saidi Date: Wed, 28 Mar 2007 21:24:38 +0000 Subject: [PATCH] added calendar dialog, added calendar access button in edit entry dialog, added customize detail view dialog for editing detail view templates, added 'show expired entries' dialog, new icon loading mechansim, added and replaced some icons. git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@130 b624d157-de02-0410-bad0-e51aec6abb33 --- share/keepass/icons/alarmclock.png | Bin 0 -> 2869 bytes share/keepass/icons/appsettings.png | Bin 0 -> 2857 bytes .../32x32/apps/ktouch.png => autotype.png} | Bin share/keepass/icons/clock.png | Bin 0 -> 3316 bytes .../actions/editcopy.png => cloneentry.png} | Bin share/keepass/icons/copypwd.png | Bin 0 -> 1997 bytes share/keepass/icons/copyusername.png | Bin 0 -> 2829 bytes share/keepass/icons/dbsearch.png | Bin 0 -> 1707 bytes .../actions/configure.png => dbsettings.png} | Bin share/keepass/icons/delete.png | Bin 0 -> 2478 bytes share/keepass/icons/deleteentry.png | Bin 0 -> 2506 bytes share/keepass/icons/deletegroup.png | Bin 0 -> 2052 bytes share/keepass/icons/dice.png | Bin 0 -> 2496 bytes share/keepass/icons/editentry.png | Bin 0 -> 2525 bytes share/keepass/icons/editgroup.png | Bin 0 -> 2291 bytes .../icons/{nuvola/32x32/actions => }/exit.png | Bin share/keepass/icons/expired.png | Bin 0 -> 3578 bytes .../{nuvola/32x32/actions => }/fileclose.png | Bin share/keepass/icons/filedelete.png | Bin 0 -> 2175 bytes .../{nuvola/32x32/actions => }/filenew.png | Bin .../{nuvola/32x32/actions => }/fileopen.png | Bin .../{nuvola/32x32/actions => }/filesave.png | Bin .../{nuvola/32x32/actions => }/filesaveas.png | Bin share/keepass/icons/filesavedisabled.png | Bin 0 -> 1044 bytes share/keepass/icons/generator.png | Bin 0 -> 2942 bytes share/keepass/icons/groupsearch.png | Bin 0 -> 2267 bytes .../icons/{nuvola/32x32/actions => }/help.png | Bin share/keepass/icons/key.png | Bin 1359 -> 2085 bytes share/keepass/icons/manual.png | Bin 0 -> 2205 bytes share/keepass/icons/newentry.png | Bin 0 -> 2775 bytes share/keepass/icons/newgroup.png | Bin 0 -> 2044 bytes .../icons/nuvola/32x32/actions/edit.png | Bin 1395 -> 0 bytes .../icons/nuvola/32x32/actions/edit_add.png | Bin 1790 -> 0 bytes .../icons/nuvola/32x32/actions/editdelete.png | Bin 1805 -> 0 bytes .../icons/nuvola/32x32/actions/fileexport.png | Bin 1596 -> 0 bytes .../icons/nuvola/32x32/actions/find.png | Bin 1446 -> 0 bytes .../icons/nuvola/32x32/actions/identity.png | Bin 1820 -> 0 bytes .../nuvola/32x32/actions/klipper_dock.png | Bin 2658 -> 0 bytes .../icons/nuvola/32x32/actions/run.png | Bin 2057 -> 0 bytes .../nuvola/32x32/filesystems/desktop.png | Bin 2742 -> 0 bytes .../icons/nuvola/32x32/filesystems/folder.png | Bin 2972 -> 0 bytes .../nuvola/32x32/filesystems/folder_home.png | Bin 2676 -> 0 bytes .../32x32/filesystems/network_local.png | Bin 2217 -> 0 bytes .../32x32/filesystems/trashcan_full.png | Bin 2844 -> 0 bytes share/keepass/icons/openurl.png | Bin 0 -> 3243 bytes share/keepass/icons/settings.png | Bin 880 -> 0 bytes .../32x32/actions/reload.png => swap.png} | Bin share/keepass/icons/templates.png | Bin 0 -> 1808 bytes share/keepass/icons/text_block.png | Bin 0 -> 213 bytes share/keepass/icons/text_bold.png | Bin 0 -> 1620 bytes share/keepass/icons/text_center.png | Bin 0 -> 206 bytes share/keepass/icons/text_italic.png | Bin 0 -> 1378 bytes share/keepass/icons/text_left.png | Bin 0 -> 214 bytes share/keepass/icons/text_right.png | Bin 0 -> 183 bytes share/keepass/icons/text_under.png | Bin 0 -> 1549 bytes src/Database.h | 3 + src/StandardDatabase.cpp | 259 ++++---- src/StandardDatabase.h | 18 +- src/crypto/sha256.cpp | 2 +- src/crypto/sha256.h | 2 +- src/dialogs/AboutDlg.cpp | 78 +-- src/dialogs/AboutDlg.h | 15 +- src/dialogs/CalendarDlg.cpp | 29 + src/dialogs/CalendarDlg.h | 35 + src/dialogs/CollectEntropyDlg.cpp | 2 +- src/dialogs/CustomizeDetailViewDlg.cpp | 217 +++++++ src/dialogs/CustomizeDetailViewDlg.h | 55 ++ src/dialogs/DatabaseSettingsDlg.cpp | 4 +- src/dialogs/EditEntryDlg.cpp | 72 ++- src/dialogs/EditEntryDlg.h | 11 +- src/dialogs/ExpiredEntriesDlg.cpp | 63 ++ src/dialogs/ExpiredEntriesDlg.h | 47 ++ src/dialogs/PasswordDlg.cpp | 4 +- src/dialogs/PasswordGenDlg.cpp | 2 +- src/dialogs/SearchDlg.cpp | 73 ++- src/dialogs/SearchDlg.h | 33 +- src/dialogs/SelectIconDlg.cpp | 4 +- src/dialogs/SettingsDlg.cpp | 20 +- src/dialogs/SettingsDlg.h | 1 + src/forms/AboutDlg.ui | 311 +++++---- src/forms/CalendarDlg.ui | 72 +++ src/forms/CustomizeDetailViewDlg.ui | 368 +++++++++++ src/forms/EditEntryDlg.ui | 10 + src/forms/ExpiredEntriesDlg.ui | 131 ++++ src/forms/MainWindow.ui | 147 +++-- src/forms/SearchDlg.ui | 543 ++++++++-------- src/forms/SettingsDlg.ui | 138 +++- src/lib/AutoType_X11.cpp | 608 +++++++++--------- src/lib/EntryView.cpp | 15 + src/lib/EntryView.h | 4 +- src/lib/GroupView.cpp | 10 +- src/lib/GroupView.h | 1 + src/main.cpp | 167 +++-- src/main.h | 36 +- src/mainwindow.cpp | 177 +++-- src/mainwindow.h | 1 + src/src.pro | 16 +- 97 files changed, 2576 insertions(+), 1228 deletions(-) create mode 100644 share/keepass/icons/alarmclock.png create mode 100644 share/keepass/icons/appsettings.png rename share/keepass/icons/{nuvola/32x32/apps/ktouch.png => autotype.png} (100%) create mode 100644 share/keepass/icons/clock.png rename share/keepass/icons/{nuvola/32x32/actions/editcopy.png => cloneentry.png} (100%) create mode 100644 share/keepass/icons/copypwd.png create mode 100644 share/keepass/icons/copyusername.png create mode 100644 share/keepass/icons/dbsearch.png rename share/keepass/icons/{nuvola/32x32/actions/configure.png => dbsettings.png} (100%) create mode 100644 share/keepass/icons/delete.png create mode 100644 share/keepass/icons/deleteentry.png create mode 100644 share/keepass/icons/deletegroup.png create mode 100644 share/keepass/icons/dice.png create mode 100644 share/keepass/icons/editentry.png create mode 100644 share/keepass/icons/editgroup.png rename share/keepass/icons/{nuvola/32x32/actions => }/exit.png (100%) create mode 100644 share/keepass/icons/expired.png rename share/keepass/icons/{nuvola/32x32/actions => }/fileclose.png (100%) create mode 100644 share/keepass/icons/filedelete.png rename share/keepass/icons/{nuvola/32x32/actions => }/filenew.png (100%) rename share/keepass/icons/{nuvola/32x32/actions => }/fileopen.png (100%) rename share/keepass/icons/{nuvola/32x32/actions => }/filesave.png (100%) rename share/keepass/icons/{nuvola/32x32/actions => }/filesaveas.png (100%) create mode 100644 share/keepass/icons/filesavedisabled.png create mode 100644 share/keepass/icons/generator.png create mode 100644 share/keepass/icons/groupsearch.png rename share/keepass/icons/{nuvola/32x32/actions => }/help.png (100%) create mode 100644 share/keepass/icons/manual.png create mode 100644 share/keepass/icons/newentry.png create mode 100644 share/keepass/icons/newgroup.png delete mode 100644 share/keepass/icons/nuvola/32x32/actions/edit.png delete mode 100644 share/keepass/icons/nuvola/32x32/actions/edit_add.png delete mode 100644 share/keepass/icons/nuvola/32x32/actions/editdelete.png delete mode 100644 share/keepass/icons/nuvola/32x32/actions/fileexport.png delete mode 100644 share/keepass/icons/nuvola/32x32/actions/find.png delete mode 100644 share/keepass/icons/nuvola/32x32/actions/identity.png delete mode 100644 share/keepass/icons/nuvola/32x32/actions/klipper_dock.png delete mode 100644 share/keepass/icons/nuvola/32x32/actions/run.png delete mode 100644 share/keepass/icons/nuvola/32x32/filesystems/desktop.png delete mode 100644 share/keepass/icons/nuvola/32x32/filesystems/folder.png delete mode 100644 share/keepass/icons/nuvola/32x32/filesystems/folder_home.png delete mode 100644 share/keepass/icons/nuvola/32x32/filesystems/network_local.png delete mode 100644 share/keepass/icons/nuvola/32x32/filesystems/trashcan_full.png create mode 100644 share/keepass/icons/openurl.png delete mode 100755 share/keepass/icons/settings.png rename share/keepass/icons/{nuvola/32x32/actions/reload.png => swap.png} (100%) create mode 100644 share/keepass/icons/templates.png create mode 100644 share/keepass/icons/text_block.png create mode 100644 share/keepass/icons/text_bold.png create mode 100644 share/keepass/icons/text_center.png create mode 100644 share/keepass/icons/text_italic.png create mode 100644 share/keepass/icons/text_left.png create mode 100644 share/keepass/icons/text_right.png create mode 100644 share/keepass/icons/text_under.png create mode 100644 src/dialogs/CalendarDlg.cpp create mode 100644 src/dialogs/CalendarDlg.h create mode 100644 src/dialogs/CustomizeDetailViewDlg.cpp create mode 100644 src/dialogs/CustomizeDetailViewDlg.h create mode 100644 src/dialogs/ExpiredEntriesDlg.cpp create mode 100644 src/dialogs/ExpiredEntriesDlg.h create mode 100644 src/forms/CalendarDlg.ui create mode 100644 src/forms/CustomizeDetailViewDlg.ui create mode 100644 src/forms/ExpiredEntriesDlg.ui diff --git a/share/keepass/icons/alarmclock.png b/share/keepass/icons/alarmclock.png new file mode 100644 index 0000000000000000000000000000000000000000..c66d2b16c312acb6fccf1fc2282fcc1eee2a7fad GIT binary patch literal 2869 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 Hu0mjfI2LzG literal 0 HcmV?d00001 diff --git a/share/keepass/icons/nuvola/32x32/apps/ktouch.png b/share/keepass/icons/autotype.png similarity index 100% rename from share/keepass/icons/nuvola/32x32/apps/ktouch.png rename to share/keepass/icons/autotype.png diff --git a/share/keepass/icons/clock.png b/share/keepass/icons/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..1f36acaa16023ac0fdba639a79e9142a4d0f035c GIT binary patch literal 3316 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 Y^ZoPbAJ-I^&lVsed|TM95JCR`0SwOn-2eap literal 0 HcmV?d00001 diff --git a/share/keepass/icons/nuvola/32x32/actions/editcopy.png b/share/keepass/icons/cloneentry.png similarity index 100% rename from share/keepass/icons/nuvola/32x32/actions/editcopy.png rename to share/keepass/icons/cloneentry.png diff --git a/share/keepass/icons/copypwd.png b/share/keepass/icons/copypwd.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9599228f104d165b75adef7b887ab745932060 GIT binary patch literal 1997 zcmXAqYgCfy7RO(B0a0E7vlKK1#f*xIOBYQY@P0W~WUi!|lZXL1r_##Pbm0Vu!%&vp zZ1Pwq$!_X6#*8)Dh005rJNpWeeO#K*GjO#pd;>46Ip`_89qXFQ)aU=T7d)J+uA1}z?o-4`!GV8Dy zh~Aqk5>t~8WJ$$o;;g;L54DOT0l+OYIW9W=*lW=|408=Uqyi{8|HMrSs1nn4yA=pGBm)64^+5AMg^5T^%%KyYFEVhk-YI)5B zRJWTu6v#c6_2<}|rt-^g0f|I{Nzf)P1ExXF1PiJ@-w*jI*VCc~di(PZ0 zt6l%pel4hWhM=mv8U-4*9>n|{WixesHn$;DkTM+9|EB3|Ap^71W5VvRjZxs)@oYAK z2u#IO6=wWwi(Yt}-lFf;BbLmz>UG&HT&!uT4thB=nr&*LtAaYFeL?VBq^e<DOdjBRtI8Tth8tDe$&F2? z+RWq{{Ly6~j-sk4rW;y%Z6qghwRF%doOL^^hN-g@QP2hmSzTQX6%-Ws7;l0^UY?t^ zj$>*yD$L@z{gpMUZNh0ufiT!B2oz6E>TIES81~gm0A0+{|sQ> zw-zz!RpadIeg8Teo%*8C^1qi&#LVE`XBG!j)l>=%#Pw{@g8Yf7k0h)gA`A`+mlX1f zpGHVW)0UTj=$c5VVo@ZNdm}2F=)G4o+tr17NDMHOc|uSG$K9XnFp02Hwg z!F96xWVXOkd=D-`GGG=K)(<Z{#yrog_Bslm=mXIp^eyyEM3fQVBcC=Xg7cwwD!dCjd5PbdsH?PY5At6^hey6u41g9_-VuWOj0U7P-=3%2ZQ}c z%5~m7SD~c^5N`Pq<_LH2x&HRzc5_B)r*-TlLE9&%W3C*9$)(Z5|8~YQX-E$5mfPGiVs<=nlthm$_^V}yLNy)<`$n@dKH|Pe9+b+I zmy*q|&RMv$Gr3tem1fSfI{Htbt1CJxOnb+AGEWDq>W9WCf``;8YavF5zFKwqD=!At!`%xJit!STI|hAe zWos|WV2aNsqCt-yZi3BkNl`ArYS4-PqL+9628}6~)zbZSk&50-Dwx^0&~7bq5K=4# z#q&W813P|+N&&%$Z}ww}JVAiIt)u4~fsxu)g=5TQQmZk1tj3+i)@XoO^F~_AQrf)} zm;s`4)96^{NRG>yx=lc-&+W&rh&e#$+@LL2{c_C7p0}XyDl_G*>d&X%lEOW$lWgH; z&;>0GudntOK2Luv@=?WBp~1B@9RzpdlizD4S2RSNN(<1K9;EM^xnSA>%}PuPXz~bF z00j}|sLE}~>2-YT@WUt2weru!nl#h~ZE5MvyDT=R!GY>1(DP>e9~TeabzR)<-oMm|usty$eAq<=@)3r^0zdBcl7npAhDXp##OeB+??@8HCho@Ctv zci7O8m=h0v^lMEL9@x=&Wb~@qt{(~o_3h{J(xq-x4HxC?jCqF;qKq{0vYUp<(d3jlAtAw_~JDRK(usdG@PeE Z06D4B)s1fe*!3R+$?;p_YGZ^2{|A>+Y)}9I literal 0 HcmV?d00001 diff --git a/share/keepass/icons/copyusername.png b/share/keepass/icons/copyusername.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c95be8ce6a47ee962ff05f9aefc90a24900cee GIT binary patch literal 2829 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 literal 0 HcmV?d00001 diff --git a/share/keepass/icons/dbsearch.png b/share/keepass/icons/dbsearch.png new file mode 100644 index 0000000000000000000000000000000000000000..62e32274dd277d11dfc23a18c351e81448b5e786 GIT binary patch literal 1707 zcmV;c22}ZpP)5@cUDX+~-AF4#!N_~h_RZ8DmsZt-? zm-eZDK&7e|`cPGBtL;WgUqY$cnoYA0QL-ekEP~h$36}siwvRct>4Rg|IL5G2R~>0I zb7tnu?>pc5-3I>8MQU`eU%&oNCX@N)=;-MCuIpO=GXYXvge=RFWm!r#o1L4VpZ{^O zSbThB;qBYEXEruA#8+KrXJ^I8$jG089ssogAe~NMOe7KrApnlF&9!-~b^fIFnx-)| zHAOfa9tVbj?Lz>zZM%)W=Xs|V)VjXYTGw^4Z5!8hCBT1#fktU%pjFuJ?k+D11@ieE zd&MHQ?cg{z5)h6=$Ye%IrBWD%fh0*sz%=xsd2jW&Q@5VZwrz5`9G@*c14%_U&d_aS zD4PeRY>YXM!;>dZ*xYzYcXF7u-2{#s zBpOlZib^=HN2zSFwNb`a3{-24xxe4%z3Ho5x^(F+CchK|LI_q@SJ~KDXCyPp>~fO+ zRFKSois6@#WpD)?I51r8=Fwu5)dfH4@G^Jre#GG5AhB4it#Sg$?e4yL!OqSOON)yP zoITIK3Ihy{b}?{9AUnMH9+3aD+@|G{)H1uaI-zAu~G8%*+g?X&%|LnQgfp z1Inb1Aqlp2dWnI_Q%=x4H1b%c=qfmuInBO@2G^W_g^ZN z2t<1DN(!!kstvXWstk(M09@At$AyD8-lQu4@l+c7wT@NXqgX7`+uM7*8MgC)4GR#8 zPRJ*rQ9qq&)uV_c)q{x;AgEWL0s#%Wf?y>Atau8N<5H zpvs`hbp~`50y@}c72%j@szxXjdP@OM)B%7TO8-f_}dS zg~ChB7f&fyO|D$K_EuatwHYRpNqjy(ySW8~xrZm}H2ajgKD^b}pjaxBTX;yVxJgfU z55woq9UBYePOex8K_C!d?EHDw3wcUwkEj*5IB*;^wXW@r8q`78;ML|PpZ@3H_^ds~ zCdM(gwy4~_i@UYeITkcqL31n1GO1Jwb7F#z=jSRg;av z8il3D?7Yeojz*c7oZvz{jPJ8qY9B45-1;uUFxp!|r({BwWkyCuNF)->&CQWpTg3<& zD7qgH8OyRT%SFt}KBj3BiN$eNR#^8d3}2g~_uV+Pf8OWiZ-0*eJ3s6k4LgAehr`^s zaf3pkKt7*mf4_un+jy>vU)SjF9%3|;A(>3FfA1b@b&1&iWBkPhg73u<(kA)8{EE2a zs2e9S&<>Ok0##K>r_&4$4pOaFv27b61iG%H>pHS5BZMG$^(w^=mx#{%5qVsLQi|@& zXR*9hJ~*Sr|Mr^R2Y}KLFgZDS=jP3usambpF(qrB({&x6&xg0 zHPY#JX?5#&GnmFdjeelNpTY0_fTzFM<>9aIIosu(2lgxXr-uNt+3Y9TZ1(c>^fabv zo_HOduCCpjBuV&_Nq#>x#ZP|o;UnNjz$eY8K5H1p&r+$>6(NNDCeEGs=sazaWtm#7 zCg=0{UDtL03j7XOYuzOVWPs3D_#$_J0+0us{{m4T8qSiXB002ovPDHLkV1juc BHg*62 literal 0 HcmV?d00001 diff --git a/share/keepass/icons/nuvola/32x32/actions/configure.png b/share/keepass/icons/dbsettings.png similarity index 100% rename from share/keepass/icons/nuvola/32x32/actions/configure.png rename to share/keepass/icons/dbsettings.png diff --git a/share/keepass/icons/delete.png b/share/keepass/icons/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..2d5e260a5f21585e0a76c81a0a66b6dbf5be60e6 GIT binary patch literal 2478 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 N002ovPDHLkV1lizTKWJ0 literal 0 HcmV?d00001 diff --git a/share/keepass/icons/nuvola/32x32/actions/exit.png b/share/keepass/icons/exit.png similarity index 100% rename from share/keepass/icons/nuvola/32x32/actions/exit.png rename to share/keepass/icons/exit.png diff --git a/share/keepass/icons/expired.png b/share/keepass/icons/expired.png new file mode 100644 index 0000000000000000000000000000000000000000..b3f3c5fb2bfecbb272d2ba1873c8d27a733fbfb9 GIT binary patch literal 3578 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 bAPFcUuCh#UGpsWPXdq~F=%%|HX}SLcJ#CIc literal 0 HcmV?d00001 diff --git a/share/keepass/icons/groupsearch.png b/share/keepass/icons/groupsearch.png new file mode 100644 index 0000000000000000000000000000000000000000..950c670907695949f5d112c2e9fbf90de17492f2 GIT binary patch literal 2267 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 N002ovPDHLkV1jK=@X-JO delta 1351 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 literal 0 HcmV?d00001 diff --git a/share/keepass/icons/newentry.png b/share/keepass/icons/newentry.png new file mode 100644 index 0000000000000000000000000000000000000000..0226c2f3f20185d13af06f5de7f2194671a37ba7 GIT binary patch literal 2775 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 QY^K1fi1pzWp~#8<0}Ay3D*ylh literal 0 HcmV?d00001 diff --git a/share/keepass/icons/newgroup.png b/share/keepass/icons/newgroup.png new file mode 100644 index 0000000000000000000000000000000000000000..495440ac0506ed7955d57dcd4a1234a702e388e4 GIT binary patch literal 2044 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 diff --git a/share/keepass/icons/nuvola/32x32/actions/editdelete.png b/share/keepass/icons/nuvola/32x32/actions/editdelete.png deleted file mode 100644 index ab71fae93f7832c3c3009c0773635f05ddbb062e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1805 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 diff --git a/share/keepass/icons/nuvola/32x32/actions/identity.png b/share/keepass/icons/nuvola/32x32/actions/identity.png deleted file mode 100644 index b38168a2fb8c3a9faa0204d7f56ca8e931b8c97d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1820 zcmZWqYgAKb7X1?P0xl#FR=EL%C^jn6dI?Vlh9n3GUB#mH0oK8r$U~6ILmW~H+&t_B zB^I>UVyjIUm`=xO6|Jo}(k2jr@)GM~)PZFP0xp&)7ljf?a_^+S=f^pFoj>Qt-uvux zB4hhDFOL8Z0DxCoYSK;@3jZh$%hiuoRxY@JkuOV^0dV=(80N_t*DNSc&MbewIIp}y zUX}}FImL=xVcLiC{M?FdSK**2iCIcl0fhoa0Z;1o5~x5x z2^%o(sN#T7#Tugl+AaE8-Kl%xM~|~cGaqMWlFodGU9Ub(3nbaMAT*laI1Ij_%mv5e z6IbiJ-sk2-h{MShr+(Q!V*K#($gUsV7`#U`olbXSadBRQ_J3@a2%4MEos$)*06h-Cv(zuu)Cpn{ ztDCFAJ{l&Lr-NAAeXLwO%?_r7D16kQo>+#X+!4a#rl$};zxNu5+?%WAl zj!46jryyP)vc`^q6-1%-u$p@W&3&DNqldql`rC)_96 z4;V>RI>o&9ToUgnONKZrTIs4Wm&a zZg;xvTX8?MC2oBx6S-2w!iTuH-iU=)Q8vzb_{NRcx=-yGC49nsyf`Ph<+20g7+A-U zc6paZBRy9=BOK)X*XkF~Jn`Cx`tT~{QV`rk!EHIoaKg{kL&R6R>#a}BF%Wx6kB(2G z$tNpBVMQWCwg~;}-h7_#1Z{LNI3OO-j{DIum$vj!lAUw3zCher71~2M`=jvIo0}t2 z`|HCyl`EfH7tQt1{who`d43Rng4z3t<$HT^4BOH;p%?Vi4CN*$y{@sG3FWo_g=$&j z@^c*zum&y0Mjk46j1aFv+{`O|HBhCl9%dYW3}<&%_7V1H>+$OpL*QMLo?l{bHKX6G z)XLtHtlDUy*nzr$C1H4~NmJ(bYguZg*00-j4U7>cMuH!DC9F3@DY(BL7TmTt`wb!H zUg4pvA!5f>m9_snGc=cdD59z)yAREs8z5dh^~YaxDNXAqv}}iApZDRzs$0@`c~mfR zLFT)L0T{eUekP$qGDVl#39h;hG-;*4eUDk^J~~8V4C6AyF(^!gky;KFcZHCTb=nmoM=e`stLko0>rHj>ft zHI~DpNUe2r_yefe;>hn{mQQ}M^e(#fKC~eCTc=Wui`80Kf$Y3!Yxpv##_6E_RIm0q z!*colw5O_IoQwEeMaY9n_sIP=Hs73YD9%!!@u*PecAb3<%{{?#m4uCN#-exNdJ}zS z*dKjV?dT;IBlza)2Xt@&=*~;pSSKwQ_utSbJ4%xR*>k!GUF#SmoOTIIfc`neM#Y%_ z`EeL@(pLw~O4*L4pK@$dXSzy~%{ptJqz1<<0{9nty0LsF%4~_bDVWA48Tjf=kv5+l z;G}QnpTHF0^P^ZnZ%3zI;T{7nvY*pSq8XyZlxYh3dp0Hz6;Y;=c_`2=F8Gcxh>5%X z=7fe!*Iv*4=RJH*Pa!2v+W=3vTqhgNbX{TKwRYJqsX@cu!v=>xC`nb_?U$evr1M!! zr;yGO*14%}+quI*u85G2KO+b4zzce7ueJet&qC$eUOf$NZ>Nb?849D(Z#ki2@wWqr zI5jOa!ol1}Qo(J7+Mbv;CZVVOTngR^k*I%siIp7D#=3GIeK2onFmWsuL_D%ixKDOz z8uW`3FM8!=G=^)$8W)YdR=XxfB9NtDH9|ucQv4lbo<^@L qHGG@`Xp!UJEB^oWM2>p{4g%_D+TGt0kbKvB18K?IlP)Eqn*RZsH#C+2 diff --git a/share/keepass/icons/nuvola/32x32/actions/klipper_dock.png b/share/keepass/icons/nuvola/32x32/actions/klipper_dock.png deleted file mode 100644 index 4759626022ccd338c8fc0fe4ebcc8317f42c1a0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2658 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 diff --git a/share/keepass/icons/nuvola/32x32/actions/run.png b/share/keepass/icons/nuvola/32x32/actions/run.png deleted file mode 100644 index db5111a9af5ab7c467a8d44789301abb186bc3fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2057 zcmWkvdsvcr7XG*h5}$&b8r}l6$#RB7oi&|Oz&lCmOih_N35u85b;mSy%g7JBkT!U$ z9IeJ=v}`tOw6d{!EJ(1`w4}|_)bUb@Q&x!Sh=Tl<{y677=b!Vu&vVZEp0e2J2&*-Y zYaj@+;zWjiV@BGiu*8}3q5S*>Ghox$JJ}G_+OyT-#2a((kP{Y{vnw+-=imJ76o@Uz zOiH0~{>4vA`6h)gIFi+yvK@l(=QyG4-G@h#i~ul|EVKwpN}})}G7IwoGS_TPzd#_+ zTciMSQaH_IrRrzFCk;e91K}bF?q=gwdAvzXQm!n1f1b5Y0I-xvk9|wM9(by{ z(S;_8>&Xr1Q2}zqWz@Am#wL3AhRG6WYtIx0g=N$|W96W;| zvo-`k>8|eTjy0@iLTr;=YhB&#_OoZtOPe=#NDI+Lb!`mHOh+b+Gz6vSk!7Ev!Ak1i zhA0%SxZ;n}KCYSc{bYy!S|N)%f+`x3o~j)R?R^}*H=e@@-?95N+xgF^f>fSJF6^C~ z)g?=)m!iEp5nbVwm)hnE0(>GxjTO~T<|hDf%KFSt1a%#R)NTi8d+_lYy^od2u2&k9 zT=^+UY(OQ9VXr3cXxPt<>>eW;yqWc~O9@6e~Y z{-Wx0qZ3&xImFFJkKP(?WwMBJfOWK%RscX@5%dkeQk2x(owx@|yx9H*!-!vYro8T1 zVA3AJImH`@L|_-`*8SFe0KsKv6BF-c0R5zE@v4EO9B7a`m`o-j=a>|(nzZ1jZj{J9 zFS8O&d_D2{J5q7@f8}gzNMilDdsDz~?Km=vn@-U7JZ*|7_@xv@H!e|wL-Z^du8_~K zfr0402@J)wWnL@k@}kkvgEUoFBaz$FIqYn{KW_TZeFN6cw@mM!rs2Y4I}7P0lL#>R zvc@1OQ8obj9{L*X?D={USICQc;;o)Xn21jsqF2zC4IO?A=bLQ-5KW|ZnVWk0esu3d z!kr!k3~K-|DT`cQ8j#8MIqi^_1S#x-!Qh~SX;n|)2x&xiz|=<%iJUrKq+|N!;ZpHw zIL@|+Xj$GYQ+;x+1B4}q`(Zu5(#@-SH#s;t$>e-jg~%2y+il5}DnfOMA?K#RTlNcodid%s6h(6hl@lvx1l(;WuoqSM%>1Cg6rz;X8i`9Qz z(mv^E+0)!2KVr4;CQO2mw7y1*_`lY@i{d3=Y6w3o^d_APWz8juDME!VvW}yPv+?~l zz_nRCEEm5CLDy~ce=*!&09Lw-69O?<^4dGoY9E8XuYTLOar91!Sf>k#^i0EtW7;wR z{_|{hi4~*Vcvo091>9wh_IpCvB~k}alPtb`P-#?3zAX{58&%Ey+g57LcPf&c{LkAf>lrx2wvv&!$q0ps- zh^e{R(bmLu2Rie+6_zbLUJdMnd$1_iPB@rQedUP48La_^O8bjam@Ab|R@ps$j=6KH z*Kyx^nrQAOA!a+W_?GGacO@e}i@1X{dHt2jo7ZSWx0jcR33Y=M2UnZrb#)>+Fm=z_ z$3<_4_KYUpzD4oJVqL1~C`($#G}NDhKhSyP!k9oArmR?W_$IIP{G zM83_HWGaLtI8dTxBHls^jdUqyy?3WPtA6TL{eGDG;g2I9m-=dxd-Bj`Nd$;g1qM@J z?XK1dd9BTiMzX&jy1=fp3B@ck#a}NhzQRi;j*}QhTXK>f+uy9!jtTV8^##pMFP7<9 zt9Jan-T*+B3?G9oFDTCNU_sYpcFJF`Hp!8g&U_FQiLMjX$p|_RGGejfT+F7|SF(&K z%In0vUTOM*5AQ%_?UsaE0htuw?z#*~yU4HOC_WQi# zq?>nMI8F{bq@JE>2>LE)NmIUsL1ze28=Ji*`-|k01c=W*!Buu{8K@({j11l z>$1$!p7ZMyOA1z&KhBJdlGYnn7iR`+c(yK>_&mo=xuics4oZ@P-?~>}AarS#Y}+LW l_2uNT5E0~f5D#G~5I4cIVZcySVgBV1CoDSjw_sl3{{gjV&HMlW diff --git a/share/keepass/icons/nuvola/32x32/filesystems/desktop.png b/share/keepass/icons/nuvola/32x32/filesystems/desktop.png deleted file mode 100644 index 9b993a5ebb3e6445a0fc7a47fe7acb169bc7966e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2742 zcmV;n3Q6^eP) z?bW#j-XBW80*Hks-eLq<2qZx6{Q-2??|*h8u74(oYuItWJn^aMJtLFx-@A9>8GiqM z2oONDkAmO-E!m8}tg5UC;Ewk&Vqi8BWe_wov1bq#ZUD;i0R#}09q=E5|NnzT#SaEW zR;@3KvnyT2wfIaKPJCa^AZ&GjflcEJDC+cpij@EYh(`B|2SSV zFo-;0koveFrPe{&Pt~7c;*E(6cNp$6Fn{G?c)RWLCx#c#kAWfxAb==y04NLpXA)%i z#qKA{{323E_>VKMu|3P9x4#%JTtE9Ju!Kt_R6B@a$-QL^xBuT_VErk`aI@#nkDo`M z>|*%;XD!f#djJ7Mo&)~lse|I>Erkz|U}Z^4~w-_uk#j@c+kBpeZLo*#;nhSV;2izkjkoi=8=z z_@m?%#hn$^gqb1*J~0GqC@^p-0^^+J4nyVbn+(rQco};9OBnV(Kg4k8^C1T2{~QeW zXa4*5X~VTK6Faah`2U5Wy{~~`+26wq(<{pv&OSTGuM zegGB@47-8&6U=yk0Aj(Jk^eCWGyMAL$HK`KDy1mtsi7&#peoPCpeM`5pefG5V6Gv< zz{bu2*Rf*zS%yj9PBCQ$42%C4By{_f_*a(zelzS zAb?m>Ty#Vj)Wmriq(pcbm|56RoV)wz zNrvoog$zwq$qb)geq`u5-plau>syAOmpB--{uMCXmifj18(hcGaG zV`OOA-OBLt!*hne*O?gfc?ub#5_1{WuD>XB;=$fyXuUsiz zvz1Fz4moe1+s7Cia*yG_Cu0UX1r`QlH94%7!)nn}SFbUM^YJny==w4AZ0KfqcJCR( z->d%_{G~D(d>tbgKK)=|FtX5L;MNEVW?+-@LN^B>fWQvm=Hri#cj9CSu-L)C#`Txs z!YNyZcWNOFYmVJv`1bt=_6z}az>y0V7<7~+8Kn8R8G0=u8ALt^GARFcV`xpvV=xx` z%y8w*Nrr#l-!rJ_>2fhh_+ zcLx5iR~T;GdBotveTu@Mv zq!t>>z`|n=vKkPqK?djuB_&k`1qDS0d3i+!B~>j3RWT6; zb-_Ihn!rG3{H4P1LN$*;-o!|RLD)PB)E)o`AVhoM+s(_*&u^c)Vc&fQ59NOh%uI-? zU0y+&;XNZi!|s#U7}(fY!HExq{{e#t6e6H>@f%p={se{!BO?<7KQJUDM1>dxgoGI6 zzV2h-69nd_Yg`Qbp2RZz5oc%M1Lhb8W=>#xjX?q+fKZF#mz$^0-)JB1XDy{{DI>^m z^(~~?2Z{;MQLR0n_nhZq;9!^C~7G9=8cepNF(;L~Av_0y5zC6_hBTW(o~GsllI)CL0M zS%i<_@1I``4_~}yIRD@s!|CUY3}>GM6CbY}13SMcI8;8r|Hkm@#T$mV*H3)^d1J>T zhIbdQGrYeHY6+bI;`5*q03d)c9RLDS-u|YEQ`R5$p2*0~J%Is~e80VyWO)7Ap5fqq z1BQE_MHrmS4H@>``oeJX1v|rQMlpu}T%ru@oIJoR_@CkJvlk3+?%!nia_8vV|MzxW zVR(DtEW@8KCx9m31mefg`T$&%0t66t2e9$7GZ;26pH<}(n95ne@RN5N1G@q+wTS`c z-Y_s+UCYlf`Ft+JVYLDV4t`;Vf56=F<>Oa|_s^a(e7t-5>z`ZO?lQc-aGBxbt+PNK zprZ5+5Wix8G}KW5KmcKP00@X#8EeN*J#?T_jqCdLYYgx2ZD-*Bzn|gs2TO(n|H6S$ zqQ>z34?Dw$S1%dfKDfp3#K(hAFmzw^zXsphYZh-UIcm_6vP*S_!bbq zV}SIp2m*ir!rvsjy?8?FY6FkI>=p`tez7uq`1qFL%hNjy-*4`I!f<|Jx1b^mh`&&yKLZe80B5o8p?2Y5`~Uy|07*qoM6N<$f=r7Sga7~l diff --git a/share/keepass/icons/nuvola/32x32/filesystems/folder.png b/share/keepass/icons/nuvola/32x32/filesystems/folder.png deleted file mode 100644 index bd433f4bfd9b001172c5ab8840a261ee9640a1d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2972 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 szo5RHT+iwPph*Sc@2uA_C??Bp`xd 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 diff --git a/share/keepass/icons/nuvola/32x32/filesystems/trashcan_full.png b/share/keepass/icons/nuvola/32x32/filesystems/trashcan_full.png deleted file mode 100644 index f19899dd8003724be482f238052947253d787da4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2844 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�#YNFEq>`f_T2Kl1vW=Ut-lq4 Go%}xqR5RHC diff --git a/share/keepass/icons/openurl.png b/share/keepass/icons/openurl.png new file mode 100644 index 0000000000000000000000000000000000000000..47d4b36fd8810cd82ca946fa07d20bcc9456050d GIT binary patch literal 3243 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 H0B8RX22l|= literal 0 HcmV?d00001 diff --git a/share/keepass/icons/settings.png b/share/keepass/icons/settings.png deleted file mode 100755 index 7c4529fff22ae89417a248965ab398098b188ada..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 880 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 iRs@Z7p+Dk)>b(ElGOMgEuo literal 0 HcmV?d00001 diff --git a/share/keepass/icons/text_block.png b/share/keepass/icons/text_block.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a9b8cc850f09ab91d4b64bbe0e57879224b1d6 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}EByV>Y zhW{YAVDIwDKoQOYkH}&M25vzRW~@(%p9mCWFY)wsWxv2F#HcN{sweX)P$FVdQ&MBb@06s56 A5C8xG literal 0 HcmV?d00001 diff --git a/share/keepass/icons/text_bold.png b/share/keepass/icons/text_bold.png new file mode 100644 index 0000000000000000000000000000000000000000..7984923fe76ca943a1b8b9ec29b538217a62c629 GIT binary patch literal 1620 zcmV-a2CMmrP)=Lf2qL`sNO+Mq0&j-I zpdmgOG?51rNF#^_4NyxYDHmITRtT#=H&p1hyWO46`F)s~vuCDTM9<`8&YatS`Tp-e zXNZ{*m9vLdrB`+5d!+O?5TO;!8K`hjg_XmqjCZ|pHv6aw#_!6b%Mb6*`*QXB`SD05 zMGB0ZZ+>O|g3_m!rCyz}!E6dVi*kuKD;k-aw0A9h>+w0Qz+ms96))tTTp;js|4DdK z;J*kr=2S`(sm+Vtete!z>|K}Y`tU}twEfq>0CNM_ehRcjy^ z3nqfWAhXMR0)PB6tio~7^xu&uZszliYiZt*c{I%ivU{Xz9qv2#y{- zis9j5OixckDFvkz8XFstPNz{SmC)4GgpQ65ba!_{T2`ogTseyR3?_* z&Q?~gT&b;BN+FxgLI{D)n>Qny%_5)AV`yjyA0Ipz;GV3Z5~jz+j3i;=Y_ypfwrxWQ zp{wuvdPy#qL$O$dloI{@{eiWK8YyBLEn^w1j&Ku2X<106QrZK)@9VL0xr|IE0|01i zYYT$UjDeUzHKV182UI+PBomJ%B^nwUv;v;z0SKagcz77D>p}>DcXsRm2@%JS2*ezR zKzqQzgcGhet&mc}aU5;^ojZ5X*Vl*Br%$6$C}7K$E!ekjA9A@I>J}mp;w+FR{>j9a zEHdGDR_-aRr!2&!j1`G^2be)t^#{e^9 z`}XZvx^yZ2x_=)B4jjPAlP7WN)G2J;x)mSn-W~HEF+*n;1A-YWU_B8!`lD?k52Vv+ zIF5r-xeO3t@#4kUvu6)n*M*c4y}iBo?#!9G6eJO6K|B#9XqY^NEFs`Hj;@oFlUhJq zTN~!gnFH5#;kqs^Uc9KO7|jvM7~t6;2*9c}Lxn6Ukxr+fl*0JJ8BWEew4VB({Ttwrz}!jp5dT+_nwPAstOabWx@P z$;+hSfk+8vMn0cMCX>OEB}-zl@#xVbxUP$?t}e8+v;=t|nFW)@Fj}(0q=vwIRC9kc zIn;jBrcL@h*OZDP+xQM}<{0i~;Zngcm?ov~iED6z4l4c{!=Iz0H}VLPW`s^skw61q z4(I5LY&foz0zd4p#hk(oF)`k70SXKSi1Bln`r~sV=uzkT7PrgucH@iOgDb2otPCXjv*yh()kN4+5| zMr7z@6CJ13ai|CV;Je>~RB-e0r$yhTd$|r`W?VXwTe4!sgC7N{+>E~=vuy_K)BcQ} z_NT-E`!qIIaywi0k6sl3u;HWI`P(;}yQ)+2oBu6bJ)7|9Y4P*u#Ju*F{i9a_ Se`aw20000NS%G}%0G|-o z|Ns93nZCZhR#sMxjg5SKe0_a=PEJm&tgJ5=yITO|7)yfuf*s7PW_|;4lDyqr7&=&G zJ%Aj}0*}aI1_o{+5N5n|x9$&6kiEpy*OmPO8>_Go2cLD=RiKcJr;B4q#hm1X1^fao oj5k<3j9I52SYhp9+$g}nu-~0?;sF*0F`zmIPgg&ebxsLQ00ZeU>i_@% literal 0 HcmV?d00001 diff --git a/share/keepass/icons/text_italic.png b/share/keepass/icons/text_italic.png new file mode 100644 index 0000000000000000000000000000000000000000..1a9baadb1428b2127806e72b916355ad3171d03e GIT binary patch literal 1378 zcmV-o1)chdP)7AusiZM|(--W(B5fjI>kEXv^G;F881x6Y=Fnqd4X9lF0$9Qf+Y2U~{uS`A=^Akr5R0oF02RN1yd z8LIXBf7%@iO{!Qdf|k_DE|0L)8~{cYDFRYTNGXxc zW&?v5&1O@(JdV5owaQommRY~*w$ott%L_!<-rfc?!?tZ?G8q7X>$?8B5b+9B7z~ex zLlCWNWd(B^G39}Yi3tFJloFojfei4d4;V%WIK~4Z@E9fPzEY{6QmG)BOlks-<3Jd$ zSDuQ~X&P;r@qi3BkZ9vk78Hv`B$G)9Auv8Zu1igUwt*|T$|s{ew^ad$m~w0~DFTT^ z0%K!i@Lbm?psbHeKuxYo6?7_l{eCd-?d@p~3}!N|Mia5#q|w?^j4D9495CX^ky6~> z-`502M@L)WUBW;*k-LR}BTXoHNvjDImP#eqwvB4FiW4VKw!piEA=soygsVWbonj0x zv~5BGxpKLzb0D2gw-GQe5xqBafIEdC>OKV?)VSj~a9tO}!^3`i4J_^y1~QBxBCv6w zvCNEwWF2oEcV=*)n3-{KZ~!3$m>DA@BcWW;WFz5F?q>kR@ChJFz&PocB$QGm+uhkg zy&qH!qCtV5{U#RCnwvpJsJ+f5Is6=MrJcI zNvQvx>*CzZ3}*6qom9^?45KZUsOS(l`z`mYhXeMGo9PIZ}c|>Kl5grW)gk)w9Q6Z30f_GM1IVbT*ln;|DkYGqa9Nt0w zuP;z3mr<+L&}cT{d0zV=#qf-hsRK#$l2Yoqw)s7H{ic4w^TZ0>x<1=G|N3uV+P&^o zd=z@Lj?Bnz4{`$p)kS`M>6>A}P_}^iT8BLb-N3GfO k%W7fj=c}LHYbeZr0WKR literal 0 HcmV?d00001 diff --git a/share/keepass/icons/text_left.png b/share/keepass/icons/text_left.png new file mode 100644 index 0000000000000000000000000000000000000000..54d22a3a0720ef4f6b142c12f6fd7286d7b5dd90 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}EByV>Y zhW{YAVDIwDKoQOYkH}&M25vzRW~@(%p9mCWFY)wsWxv2F#Hb|^qF=fgC=~4J;uumf z=j{|jz5@z8%(++E51y`^Wo>A@)$x&0YWLGQ=R9|DEf1AbXJAx$8QJ~z=ktdu&Q=Q; zx=Ud5a(7>L+z<+>2u7S~pftjU(apNPsk1jvvYXFUB@O1TaS?83{1OS(6 BK#~9e literal 0 HcmV?d00001 diff --git a/share/keepass/icons/text_right.png b/share/keepass/icons/text_right.png new file mode 100644 index 0000000000000000000000000000000000000000..20dba5b8e46024f00ff258493575722491634e04 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCils0(?ST z|Ns9FWQHEPTnD5WOM?7@9n7p|egkomyxm;OkH}&M25un`X1sK_?hjCq zy~NYkmHh%6tFVx&_YySf`R~9vYh^Pt!~Ot;&51nQ R4gpm$c)I$ztaD0e0sx#DF>C+; literal 0 HcmV?d00001 diff --git a/share/keepass/icons/text_under.png b/share/keepass/icons/text_under.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ac03b963c88e619467501dda84998a334cd813 GIT binary patch literal 1549 zcmV+o2J-odP)iDmH!vXKA_EGvg7gd|cBxkCPdk8psSg`yk? z7ZNEDMIz#%NG2!{L@W!CFBS(If~*k9kE~I^yPoyVOjiywJ=;Ay29mZ$?w#)G`s%B% zs=JAqq1xpyceU*K?D23*tG8DO?gMigG8~lQ!`dSg`bqDYs?wvGb;r6ld8hm4Ctppi zE1RSM%ua0UExx__wPndcV}XqTyl!lR|DG%Et}N$Hyz|AvqX@v0+gtjIZpH$PLzhnOOdUA+=%!`)Ltub81z4YgTKYlM9spnfL;!Qp*Bb+1 z4yJ@-%&~Fr1^gEeAXa_=$y&gK*Yw-1TfM{d=Vak1p)z^k8&!Gzw>=BN9d?Sw>-DHsZ=56Zw1|V`F1Db?OwBmX=T~7IF6M zS!A=>XyIb9i1G1p9653Xot>Syas4_9MUzni-~&b)TY8=*WtrYA%Yu{=?d|QzX0r|B zuInP3&0_oZ?I>>AWDbT*2#`?|ETc&1O^Gb*GXT%?VB0n_nT*L2f-p%bK?t-#L`F8K zc|>FsEldBQC2k$Kwul0dPN$>AlwMrdg&>0G`^e>T5PEhPb%6|fbrH(Cp$Kh^7-mK$ zlYwp9(Qg2dz8`t)`#v(63`mIjhf0XdAUy;!9s;f}n$(yXwrwMoN*V8c1t4UkwY9aO znAI6gVjwcEPlTxh073|4GMNYfA&5Of<3t1@L4e0xc+OU9F7R0tzqX_9A0Z64%5JJHB{lIw4`>ClZ*tU&BhYpz< zP~L}POwI!J#8^=C2|*o5r_*p<7YOMm4ZyW)*U-_?fws1`jWs|Ngj($f#(^P@Sam}{ zeSLjMr_;#i^EiM0JSycf2*BdvBF>yS10e(k1_mIM9zsp%Ac43Bj1vw=@mBwJJsdoE z5Z_+Bh|1a;q?GvP!UZ^v0|0Ow2M6}=$H>Tt5th2w8ok;{E3p#lAQS`Y-LYfGu&}s@ z`}gl-Zf*|Swr<7X&=9)2yV2CtWEf8h1AzilNolAv5KlqX^L!tjot+pR9Sx|~C|2`c z1t4OeVKyettgLqYYZ6Qi=8rwU%^BdL?vd;YQo(blM$*1ibvmuzJQJ!W`yshm#>FrS7=b z@lZ5`Agm`+O04~Q0(kO0z(BRud|J3w>vt88rsqGQ^4Bj|TU(3HbH49Kv587W!oh{r zQB8ZKlz|gr-j*~o0GJs@*L7%Ep(#*PR-J5)7-j4qT$r_0HBa_+B00000NkvXXu0mjf3s2g} literal 0 HcmV?d00001 diff --git a/src/Database.h b/src/Database.h index f178126..51862e6 100644 --- a/src/Database.h +++ b/src/Database.h @@ -284,6 +284,9 @@ public: //! \param Group The group which contains the wanted entries. //! \return a list of pointers to the handles of all entries which belong to the given group. The list contains only valid handles and is sorted in an ascending order regarding to the entry indices. virtual QList entries(IGroupHandle* Group)=0; + + //! \return a list with the pointers to the handles of all expired entries of the database. The list contains only valid handles. The list is not sorted. + virtual QList expiredEntries()=0; //! \return a list with the pointers to the handles of all entries of the database. The list contains only valid handles and is not sorted. virtual QList groups()=0; diff --git a/src/StandardDatabase.cpp b/src/StandardDatabase.cpp index 2ff83eb..a370750 100644 --- a/src/StandardDatabase.cpp +++ b/src/StandardDatabase.cpp @@ -50,21 +50,21 @@ bool EntryHandleLessThan(const IEntryHandle* This,const IEntryHandle* Other){ } -bool StdEntryLessThan(const StandardDatabase::StdEntry& This,const StandardDatabase::StdEntry& Other){ +bool StdEntryLessThan(const Kdb3Database::StdEntry& This,const Kdb3Database::StdEntry& Other){ return This.Index=builtinIcons()+CustomIcons.size()) return EntryIcons[0]; if(i= CustomIcons.size()) return; @@ -92,17 +92,17 @@ void StandardDatabase::removeIcon(int id){ emit iconsModified(); } -void StandardDatabase::replaceIcon(int id,const QPixmap& icon){ +void Kdb3Database::replaceIcon(int id,const QPixmap& icon){ if(idBinaryDesc="bin-stream"; e->Title="Meta-Info"; e->Username="SYSTEM"; @@ -239,13 +239,13 @@ void StandardDatabase::createGroupTreeStateMetaStream(StdEntry* e){ e->Binary=bin; } -StandardDatabase::StdEntry* StandardDatabase::getEntry(const KpxUuid& uuid){ +Kdb3Database::StdEntry* Kdb3Database::getEntry(const KpxUuid& uuid){ for(int i=0; i& Levels,quint16 FieldType, quint32 FieldSize, quint8 *pData) +bool Kdb3Database::readGroupField(StdGroup* group,QList& Levels,quint16 FieldType, quint32 FieldSize, quint8 *pData) { switch(FieldType) { @@ -358,7 +358,7 @@ bool StandardDatabase::readGroupField(StdGroup* group,QList& Levels,qui return true; // Field supported } -bool StandardDatabase::createGroupTree(QList& Levels){ +bool Kdb3Database::createGroupTree(QList& Levels){ if(Levels[0]!=0) return false; //find the parent for every group for(int i=0;i& Levels){ return true; } -void StandardDatabase::createHandles(){ +void Kdb3Database::createHandles(){ for(int i=0;ivalue("GroupTreeState","ExpandAll")=="ExpandAll"){ for(int i=0;i> 6) & 0x0000003F); pBytes[1] = (quint8)((((quint32)d.date().year() & 0x0000003F) << 2) | (((quint32)d.date().month() >> 2) & 0x00000003)); pBytes[2] = (quint8)((((quint32)d.date().month() & 0x00000003) << 6) | (((quint32)d.date().day() & 0x0000001F) << 1) | (((quint32)d.time().hour() >> 4) & 0x00000001)); @@ -637,7 +637,7 @@ pBytes[4] = (quint8)((((quint32)d.time().minute() & 0x00000003) << 6) | ((quint3 } -bool StandardDatabase::transformKey(quint8* src,quint8* dst,quint8* KeySeed,int rounds){ +bool Kdb3Database::transformKey(quint8* src,quint8* dst,quint8* KeySeed,int rounds){ quint8 tmp[32]; AESencrypt aes; aes.key256(KeySeed); @@ -650,17 +650,17 @@ bool StandardDatabase::transformKey(quint8* src,quint8* dst,quint8* KeySeed,int } -int StandardDatabase::numGroups(){ +int Kdb3Database::numGroups(){ return Groups.size(); } -int StandardDatabase::numEntries(){ +int Kdb3Database::numEntries(){ return Entries.size(); } -void StandardDatabase::deleteGroup(StdGroup* group){ +void Kdb3Database::deleteGroup(StdGroup* group){ while(group->Childs.size()) deleteGroup(group->Childs.front()); @@ -686,11 +686,11 @@ void StandardDatabase::deleteGroup(StdGroup* group){ } -void StandardDatabase::deleteGroup(IGroupHandle* group){ +void Kdb3Database::deleteGroup(IGroupHandle* group){ deleteGroup(((GroupHandle*)group)->Group); } -void StandardDatabase::GroupHandle::setIndex(int index){ +void Kdb3Database::GroupHandle::setIndex(int index){ /* quint32 ParentId=((GroupHandle*)parent())->Id; int Pos=pDB->getGroupListIndex(this); @@ -728,7 +728,7 @@ void StandardDatabase::GroupHandle::setIndex(int index){ } -bool StandardDatabase::convHexToBinaryKey(char* HexKey, char* dst){ +bool Kdb3Database::convHexToBinaryKey(char* HexKey, char* dst){ QString hex=QString::fromAscii(HexKey,64); for(int i=0; i<64; i+=2){ bool err; @@ -740,17 +740,31 @@ bool StandardDatabase::convHexToBinaryKey(char* HexKey, char* dst){ return true; } - -void StandardDatabase::authByPwd(QString& Password){ +/* +void Kdb3Database::authByPwd(QString& Password){ if(!Password.size()) { memcpy(RawMasterKey,QByteArray(32,'\0').data(),32); return; } SHA256::hashBuffer(Password.toUtf8().data(),RawMasterKey,Password.toUtf8().size()); return; +}*/ + +void Kdb3Database::authByPwd(QString& Password){ + if(!Password.size()) { + memcpy(RawMasterKey,QByteArray(32,'\0').data(),32); + return; + } + SHA256::hashBuffer(Password.toLatin1().data(),RawMasterKey,Password.toLatin1().size()); + QByteArray lat,utf; + utf=Password.toUtf8(); + lat=Password.toLatin1(); + char *Lat=lat.data(); + char *Utf=utf.data(); + return; } -bool StandardDatabase::authByFile(QString& filename){ +bool Kdb3Database::authByFile(QString& filename){ QFile file(filename); if(!file.open(QIODevice::ReadOnly|QIODevice::Unbuffered)){ error=decodeFileError(file.error()); @@ -788,7 +802,7 @@ bool StandardDatabase::authByFile(QString& filename){ return true; } -bool StandardDatabase::authByFileAndPwd(QString& Password, QString& filename){ +bool Kdb3Database::authByFileAndPwd(QString& Password, QString& filename){ unsigned char PasswordKey[32]; unsigned char FileKey[32]; if(!authByFile(filename))return false; @@ -803,7 +817,7 @@ bool StandardDatabase::authByFileAndPwd(QString& Password, QString& filename){ return true; } -QList StandardDatabase::entries(){ +QList Kdb3Database::entries(){ QList handles; for(int i=0; i StandardDatabase::entries(){ return handles; } -QList StandardDatabase::entries(IGroupHandle* group){ +QList Kdb3Database::expiredEntries(){ + QList handles; + for(int i=0; i Kdb3Database::entries(IGroupHandle* group){ QList handles; for(int i=0; i StandardDatabase::entries(IGroupHandle* group){ return handles; } -void StandardDatabase::deleteEntry(IEntryHandle* entry){ +void Kdb3Database::deleteEntry(IEntryHandle* entry){ if(!entry)return; StdGroup* Group=((EntryHandle*)entry)->Entry->Group; int j; @@ -835,13 +860,13 @@ void StandardDatabase::deleteEntry(IEntryHandle* entry){ Entries.removeAt(j); } -void StandardDatabase::moveEntry(IEntryHandle* entry, IGroupHandle* group){ +void Kdb3Database::moveEntry(IEntryHandle* entry, IGroupHandle* group){ ((EntryHandle*)entry)->Entry->GroupId=((GroupHandle*)group)->Group->Id; ((EntryHandle*)entry)->Entry->Group=((GroupHandle*)group)->Group; } -void StandardDatabase::deleteEntries(QList entries){ +void Kdb3Database::deleteEntries(QList entries){ if(!entries.size())return; StdGroup* Group=((EntryHandle*)entries[0])->Entry->Group; for(int i=0;i entries){ } }; -QList StandardDatabase::groups(){ +QList Kdb3Database::groups(){ QList handles; for(int i=0; i StandardDatabase::groups(){ return handles; } -quint32 StandardDatabase::getNewGroupId(){ +quint32 Kdb3Database::getNewGroupId(){ quint32 id; bool used; while(1){ @@ -882,7 +907,7 @@ quint32 StandardDatabase::getNewGroupId(){ return id; } -IGroupHandle* StandardDatabase::addGroup(const CGroup* group,IGroupHandle* ParentHandle){ +IGroupHandle* Kdb3Database::addGroup(const CGroup* group,IGroupHandle* ParentHandle){ GroupHandles.append(GroupHandle(this)); Groups.append(*group); Groups.back().Id=getNewGroupId(); @@ -901,7 +926,7 @@ IGroupHandle* StandardDatabase::addGroup(const CGroup* group,IGroupHandle* Paren return &GroupHandles.back(); } -StandardDatabase::StdGroup::StdGroup(const CGroup& other){ +Kdb3Database::StdGroup::StdGroup(const CGroup& other){ OldImage=0; Index=0; Id=other.Id; @@ -909,64 +934,64 @@ StandardDatabase::StdGroup::StdGroup(const CGroup& other){ Title=other.Title; } -void StandardDatabase::EntryHandle::setTitle(const QString& Title){Entry->Title=Title; } -void StandardDatabase::EntryHandle::setUsername(const QString& Username){Entry->Username=Username;} -void StandardDatabase::EntryHandle::setUrl(const QString& Url){Entry->Url=Url;} -void StandardDatabase::EntryHandle::setPassword(const SecString& Password){Entry->Password=Password;} -void StandardDatabase::EntryHandle::setExpire(const KpxDateTime& s){Entry->Expire=s;} -void StandardDatabase::EntryHandle::setCreation(const KpxDateTime& s){Entry->Creation=s;} -void StandardDatabase::EntryHandle::setLastAccess(const KpxDateTime& s){Entry->LastAccess=s;} -void StandardDatabase::EntryHandle::setLastMod(const KpxDateTime& s){Entry->LastMod=s;} -void StandardDatabase::EntryHandle::setBinaryDesc(const QString& s){Entry->BinaryDesc=s;} -void StandardDatabase::EntryHandle::setComment(const QString& s){Entry->Comment=s;} -void StandardDatabase::EntryHandle::setBinary(const QByteArray& s){Entry->Binary=s;} -void StandardDatabase::EntryHandle::setImage(const quint32& s){Entry->Image=s;} -void StandardDatabase::EntryHandle::setOldImage(const quint32& s){Entry->OldImage=s;} -KpxUuid StandardDatabase::EntryHandle::uuid(){return Entry->Uuid;} -IGroupHandle* StandardDatabase::EntryHandle::group(){return Entry->Group->Handle;} -quint32 StandardDatabase::EntryHandle::image(){return Entry->Image;} -quint32 StandardDatabase::EntryHandle::oldImage(){return Entry->OldImage;} -QString StandardDatabase::EntryHandle::title(){return Entry->Title;} -QString StandardDatabase::EntryHandle::url(){return Entry->Url;} -QString StandardDatabase::EntryHandle::username(){return Entry->Username;} -SecString StandardDatabase::EntryHandle::password(){return Entry->Password;} -QString StandardDatabase::EntryHandle::comment(){return Entry->Comment;} -QString StandardDatabase::EntryHandle::binaryDesc(){return Entry->BinaryDesc;} -KpxDateTime StandardDatabase::EntryHandle::creation(){return Entry->Creation;} -KpxDateTime StandardDatabase::EntryHandle::lastMod(){return Entry->LastMod;} -KpxDateTime StandardDatabase::EntryHandle::lastAccess(){return Entry->LastAccess;} -KpxDateTime StandardDatabase::EntryHandle::expire(){return Entry->Expire;} -QByteArray StandardDatabase::EntryHandle::binary(){return Entry->Binary;} -quint32 StandardDatabase::EntryHandle::binarySize(){return Entry->Binary.size();} -int StandardDatabase::EntryHandle::visualIndex()const{return Entry->Index;} -void StandardDatabase::EntryHandle::setVisualIndexDirectly(int i){Entry->Index=i;} -bool StandardDatabase::EntryHandle::isValid()const{return valid;} - -void StandardDatabase::EntryHandle::setVisualIndex(int index){ +void Kdb3Database::EntryHandle::setTitle(const QString& Title){Entry->Title=Title; } +void Kdb3Database::EntryHandle::setUsername(const QString& Username){Entry->Username=Username;} +void Kdb3Database::EntryHandle::setUrl(const QString& Url){Entry->Url=Url;} +void Kdb3Database::EntryHandle::setPassword(const SecString& Password){Entry->Password=Password;} +void Kdb3Database::EntryHandle::setExpire(const KpxDateTime& s){Entry->Expire=s;} +void Kdb3Database::EntryHandle::setCreation(const KpxDateTime& s){Entry->Creation=s;} +void Kdb3Database::EntryHandle::setLastAccess(const KpxDateTime& s){Entry->LastAccess=s;} +void Kdb3Database::EntryHandle::setLastMod(const KpxDateTime& s){Entry->LastMod=s;} +void Kdb3Database::EntryHandle::setBinaryDesc(const QString& s){Entry->BinaryDesc=s;} +void Kdb3Database::EntryHandle::setComment(const QString& s){Entry->Comment=s;} +void Kdb3Database::EntryHandle::setBinary(const QByteArray& s){Entry->Binary=s;} +void Kdb3Database::EntryHandle::setImage(const quint32& s){Entry->Image=s;} +void Kdb3Database::EntryHandle::setOldImage(const quint32& s){Entry->OldImage=s;} +KpxUuid Kdb3Database::EntryHandle::uuid(){return Entry->Uuid;} +IGroupHandle* Kdb3Database::EntryHandle::group(){return Entry->Group->Handle;} +quint32 Kdb3Database::EntryHandle::image(){return Entry->Image;} +quint32 Kdb3Database::EntryHandle::oldImage(){return Entry->OldImage;} +QString Kdb3Database::EntryHandle::title(){return Entry->Title;} +QString Kdb3Database::EntryHandle::url(){return Entry->Url;} +QString Kdb3Database::EntryHandle::username(){return Entry->Username;} +SecString Kdb3Database::EntryHandle::password(){return Entry->Password;} +QString Kdb3Database::EntryHandle::comment(){return Entry->Comment;} +QString Kdb3Database::EntryHandle::binaryDesc(){return Entry->BinaryDesc;} +KpxDateTime Kdb3Database::EntryHandle::creation(){return Entry->Creation;} +KpxDateTime Kdb3Database::EntryHandle::lastMod(){return Entry->LastMod;} +KpxDateTime Kdb3Database::EntryHandle::lastAccess(){return Entry->LastAccess;} +KpxDateTime Kdb3Database::EntryHandle::expire(){return Entry->Expire;} +QByteArray Kdb3Database::EntryHandle::binary(){return Entry->Binary;} +quint32 Kdb3Database::EntryHandle::binarySize(){return Entry->Binary.size();} +int Kdb3Database::EntryHandle::visualIndex()const{return Entry->Index;} +void Kdb3Database::EntryHandle::setVisualIndexDirectly(int i){Entry->Index=i;} +bool Kdb3Database::EntryHandle::isValid()const{return valid;} + +void Kdb3Database::EntryHandle::setVisualIndex(int index){ QListEntries=pDB->entries(Entry->Group->Handle); Entries.move(visualIndex(),index); for(int i=0;i(Entries[i])->Entry->Index=index; + dynamic_cast(Entries[i])->Entry->Index=index; } } -StandardDatabase::EntryHandle::EntryHandle(StandardDatabase* db){ +Kdb3Database::EntryHandle::EntryHandle(Kdb3Database* db){ pDB=db; ListIndex=0; valid=true; } -bool StandardDatabase::GroupHandle::isValid(){return valid;} -void StandardDatabase::GroupHandle::setOldImage(const quint32& s){Group->OldImage=s;} -QString StandardDatabase::GroupHandle::title(){return Group->Title;} -quint32 StandardDatabase::GroupHandle::oldImage(){return Group->OldImage;} -quint32 StandardDatabase::GroupHandle::image(){return Group->Image;} -int StandardDatabase::GroupHandle::index(){return Group->Index;} -void StandardDatabase::GroupHandle::setTitle(const QString& Title){Group->Title=Title;} -void StandardDatabase::GroupHandle::setExpanded(bool IsExpanded){Group->IsExpanded=IsExpanded;} -bool StandardDatabase::GroupHandle::expanded(){return Group->IsExpanded;} -void StandardDatabase::GroupHandle::setImage(const quint32& New) +bool Kdb3Database::GroupHandle::isValid(){return valid;} +void Kdb3Database::GroupHandle::setOldImage(const quint32& s){Group->OldImage=s;} +QString Kdb3Database::GroupHandle::title(){return Group->Title;} +quint32 Kdb3Database::GroupHandle::oldImage(){return Group->OldImage;} +quint32 Kdb3Database::GroupHandle::image(){return Group->Image;} +int Kdb3Database::GroupHandle::index(){return Group->Index;} +void Kdb3Database::GroupHandle::setTitle(const QString& Title){Group->Title=Title;} +void Kdb3Database::GroupHandle::setExpanded(bool IsExpanded){Group->IsExpanded=IsExpanded;} +bool Kdb3Database::GroupHandle::expanded(){return Group->IsExpanded;} +void Kdb3Database::GroupHandle::setImage(const quint32& New) { if(Group->Image < pDB->builtinIcons() && New >= pDB->builtinIcons()) Group->OldImage=Group->Image; @@ -978,17 +1003,17 @@ void StandardDatabase::GroupHandle::setImage(const quint32& New) } -StandardDatabase::GroupHandle::GroupHandle(StandardDatabase* db){ +Kdb3Database::GroupHandle::GroupHandle(Kdb3Database* db){ pDB=db; valid=true; Group=NULL; } -IGroupHandle* StandardDatabase::GroupHandle::parent(){ +IGroupHandle* Kdb3Database::GroupHandle::parent(){ return (IGroupHandle*)Group->Parent->Handle; } -int StandardDatabase::GroupHandle::level(){ +int Kdb3Database::GroupHandle::level(){ int i=0; StdGroup* group=Group; while(group->Parent){ @@ -1000,7 +1025,7 @@ int StandardDatabase::GroupHandle::level(){ } -QList StandardDatabase::GroupHandle::childs(){ +QList Kdb3Database::GroupHandle::childs(){ QList childs; for(int i=0;iChilds.size();i++){ childs.append(Group->Childs[i]->Handle); @@ -1053,7 +1078,7 @@ else memcpy(dst,src,2); } -bool StandardDatabase::save(){ +bool Kdb3Database::save(){ if(!Groups.size()){ error=tr("The database must contain at least one group."); return false; @@ -1212,7 +1237,7 @@ bool StandardDatabase::save(){ return true; } -void StandardDatabase::createCustomIconsMetaStream(StdEntry* e){ +void Kdb3Database::createCustomIconsMetaStream(StdEntry* e){ /* Rev 3 */ e->BinaryDesc="bin-stream"; e->Title="Meta-Info"; @@ -1261,14 +1286,14 @@ void StandardDatabase::createCustomIconsMetaStream(StdEntry* e){ } } -QList StandardDatabase::sortedGroups(){ +QList Kdb3Database::sortedGroups(){ QList SortedGroups; appendChildsToGroupList(SortedGroups,RootGroup); return SortedGroups; } -void StandardDatabase::appendChildsToGroupList(QList& list,StdGroup& group){ +void Kdb3Database::appendChildsToGroupList(QList& list,StdGroup& group){ for(int i=0;iHandle; appendChildsToGroupList(list,*group.Childs[i]); @@ -1276,7 +1301,7 @@ void StandardDatabase::appendChildsToGroupList(QList& list,StdGro } -void StandardDatabase::appendChildsToGroupList(QList& list,StdGroup& group){ +void Kdb3Database::appendChildsToGroupList(QList& list,StdGroup& group){ for(int i=0;i& list,StdGroup& } -void StandardDatabase::serializeGroups(QList& GroupList,char* buffer,unsigned int& pos){ +void Kdb3Database::serializeGroups(QList& GroupList,char* buffer,unsigned int& pos){ quint16 FieldType; quint32 FieldSize; quint32 Flags=0; //unused @@ -1355,7 +1380,7 @@ void StandardDatabase::serializeGroups(QList& GroupList,char* buffer,u } -void StandardDatabase::serializeEntries(QList& EntryList,char* buffer,unsigned int& pos){ +void Kdb3Database::serializeEntries(QList& EntryList,char* buffer,unsigned int& pos){ quint16 FieldType; quint32 FieldSize; for(int i = 0; i < EntryList.size(); i++){ @@ -1447,11 +1472,11 @@ void StandardDatabase::serializeEntries(QList& EntryList,char* buffer, } } -bool StandardDatabase::close(){ +bool Kdb3Database::close(){ return true; } -void StandardDatabase::create(){ +void Kdb3Database::create(){ File=NULL; RootGroup.Title="$ROOT$"; RootGroup.Parent=NULL; @@ -1461,7 +1486,7 @@ void StandardDatabase::create(){ KeyError=false; } -bool StandardDatabase::isKeyError(){ +bool Kdb3Database::isKeyError(){ if(KeyError){ KeyError=false; return true; @@ -1470,7 +1495,7 @@ bool StandardDatabase::isKeyError(){ return false; } -IEntryHandle* StandardDatabase::cloneEntry(const IEntryHandle* entry){ +IEntryHandle* Kdb3Database::cloneEntry(const IEntryHandle* entry){ StdEntry dolly; dolly=*((EntryHandle*)entry)->Entry; dolly.Uuid.generate(); @@ -1481,7 +1506,7 @@ IEntryHandle* StandardDatabase::cloneEntry(const IEntryHandle* entry){ return &EntryHandles.back(); } -IEntryHandle* StandardDatabase::newEntry(IGroupHandle* group){ +IEntryHandle* Kdb3Database::newEntry(IGroupHandle* group){ StdEntry Entry; Entry.Uuid.generate(); Entry.Group=((GroupHandle*)group)->Group; @@ -1493,7 +1518,7 @@ IEntryHandle* StandardDatabase::newEntry(IGroupHandle* group){ return &EntryHandles.back(); } -IEntryHandle* StandardDatabase::addEntry(const CEntry* NewEntry, IGroupHandle* Group){ +IEntryHandle* Kdb3Database::addEntry(const CEntry* NewEntry, IGroupHandle* Group){ StdEntry Entry(*((StdEntry*)NewEntry)); Entry.Uuid.generate(); Entry.Group=((GroupHandle*)Group)->Group; @@ -1505,12 +1530,12 @@ IEntryHandle* StandardDatabase::addEntry(const CEntry* NewEntry, IGroupHandle* G return &EntryHandles.back(); } -void StandardDatabase::deleteLastEntry(){ +void Kdb3Database::deleteLastEntry(){ Entries.removeAt(Entries.size()-1); EntryHandles.back().invalidate(); } -bool StandardDatabase::isParent(IGroupHandle* parent, IGroupHandle* child){ +bool Kdb3Database::isParent(IGroupHandle* parent, IGroupHandle* child){ StdGroup* group=((GroupHandle*)child)->Group; while(group->Parent!=&RootGroup){ if(group->Parent==((GroupHandle*)parent)->Group)return true; @@ -1521,9 +1546,9 @@ bool StandardDatabase::isParent(IGroupHandle* parent, IGroupHandle* child){ -void StandardDatabase::cleanUpHandles(){} +void Kdb3Database::cleanUpHandles(){} -bool StandardDatabase::searchStringContains(const QString& search, const QString& string,bool Cs, bool RegExp){ +bool Kdb3Database::searchStringContains(const QString& search, const QString& string,bool Cs, bool RegExp){ if(RegExp){ QRegExp exp(search,Cs ? Qt::CaseSensitive : Qt::CaseInsensitive); if(string.contains(exp)==0)return false;} @@ -1533,14 +1558,14 @@ bool StandardDatabase::searchStringContains(const QString& search, const QString return true; } -void StandardDatabase::getEntriesRecursive(IGroupHandle* Group, QList& EntryList){ +void Kdb3Database::getEntriesRecursive(IGroupHandle* Group, QList& EntryList){ EntryList<Group->Childs.size(); i++){ getEntriesRecursive(((GroupHandle*)Group)->Group->Childs[i]->Handle,EntryList); } } -QList StandardDatabase::search(IGroupHandle* Group,const QString& search, bool CaseSensitive, bool RegExp, bool Recursive,bool* Fields){ +QList Kdb3Database::search(IGroupHandle* Group,const QString& search, bool CaseSensitive, bool RegExp, bool Recursive,bool* Fields){ bool fields[6]={true,true,true,false,true,true}; if(!Fields) Fields=fields; @@ -1574,13 +1599,13 @@ QList StandardDatabase::search(IGroupHandle* Group,const QString& return SearchEntries; } -void StandardDatabase::rebuildIndices(QList& list){ +void Kdb3Database::rebuildIndices(QList& list){ for(int i=0;iIndex=i; } } -bool StandardDatabase::createKeyFile(const QString& filename,int length, bool Hex){ +bool Kdb3Database::createKeyFile(const QString& filename,int length, bool Hex){ QFile file(filename); if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate|QIODevice::Unbuffered)){ error=decodeFileError(file.error()); @@ -1613,7 +1638,7 @@ bool StandardDatabase::createKeyFile(const QString& filename,int length, bool He } -void StandardDatabase::moveGroup(IGroupHandle* groupHandle,IGroupHandle* NewParent,int Pos){ +void Kdb3Database::moveGroup(IGroupHandle* groupHandle,IGroupHandle* NewParent,int Pos){ StdGroup* Parent; StdGroup* Group=((GroupHandle*)groupHandle)->Group; if(NewParent) @@ -1634,7 +1659,7 @@ void StandardDatabase::moveGroup(IGroupHandle* groupHandle,IGroupHandle* NewPare rebuildIndices(Parent->Childs); } -bool StandardDatabase::changeFile(const QString& filename){ +bool Kdb3Database::changeFile(const QString& filename){ if(File) delete File; if(filename==QString()){ diff --git a/src/StandardDatabase.h b/src/StandardDatabase.h index 63171c1..2c7e249 100644 --- a/src/StandardDatabase.h +++ b/src/StandardDatabase.h @@ -49,15 +49,15 @@ void memcpyToLEnd32(char* src,const quint32* dst); void memcpyToLEnd16(char* src,const quint16* dst); //! Implementation of the standard KeePassX database. -class StandardDatabase:public ICustomIcons,public IDatabase, public IFilePasswordAuth, public IKdbSettings{ +class Kdb3Database:public ICustomIcons,public IDatabase, public IFilePasswordAuth, public IKdbSettings{ Q_OBJECT public: class StdGroup; class StdEntry; class EntryHandle:public IEntryHandle{ - friend class StandardDatabase; + friend class Kdb3Database; public: - EntryHandle(StandardDatabase* db); + EntryHandle(Kdb3Database* db); virtual void setImage(const quint32& ImageID); void setOldImage(const quint32& OldImgID); virtual void setTitle(const QString& Title); @@ -96,12 +96,12 @@ public: bool valid; unsigned int ListIndex; KpxUuid Uuid; - StandardDatabase* pDB; + Kdb3Database* pDB; StdEntry* Entry; }; class GroupHandle:public IGroupHandle{ - friend class StandardDatabase; - GroupHandle(StandardDatabase* db); + friend class Kdb3Database; + GroupHandle(Kdb3Database* db); public: virtual void setTitle(const QString& Title); virtual void setImage(const quint32& ImageId); @@ -121,7 +121,7 @@ public: void invalidate(){valid=false;} bool valid; StdGroup* Group; - StandardDatabase* pDB; + Kdb3Database* pDB; }; friend class EntryHandle; friend class GroupHandle; @@ -143,7 +143,7 @@ public: QList Childs; QList Entries; }; - virtual ~StandardDatabase(){}; + virtual ~Kdb3Database(){}; virtual bool load(QString identifier); virtual bool save(); virtual bool close(); @@ -173,6 +173,8 @@ public: virtual QList entries(); virtual QList entries(IGroupHandle* Group); + virtual QList expiredEntries(); + virtual IEntryHandle* cloneEntry(const IEntryHandle* entry); virtual void deleteEntry(IEntryHandle* entry); virtual void deleteEntries(QList entries); diff --git a/src/crypto/sha256.cpp b/src/crypto/sha256.cpp index 65f00db..85f008b 100644 --- a/src/crypto/sha256.cpp +++ b/src/crypto/sha256.cpp @@ -38,7 +38,7 @@ (b)[(i) + 3] = (quint8) ( (n) ); \ } -void SHA256::hashBuffer(void* input, void* digest, quint32 length){ +void SHA256::hashBuffer(const void* input, void* digest, quint32 length){ sha256_context ctx; sha256_starts(&ctx); sha256_update(&ctx,(quint8*)input,length); diff --git a/src/crypto/sha256.h b/src/crypto/sha256.h index 9d5f6c8..583f96a 100755 --- a/src/crypto/sha256.h +++ b/src/crypto/sha256.h @@ -40,7 +40,7 @@ class SHA256{ SHA256(){sha256_starts(&ctx);} void update(void* input,quint32 length){sha256_update(&ctx,(quint8*)input,length);} void finish(void* digest){sha256_finish(&ctx,(quint8*)digest);} - static void hashBuffer(void* input, void* digest,quint32 length); + static void hashBuffer(const void* input, void* digest,quint32 length); private: sha256_context ctx; }; diff --git a/src/dialogs/AboutDlg.cpp b/src/dialogs/AboutDlg.cpp index 1b1441e..443064d 100755 --- a/src/dialogs/AboutDlg.cpp +++ b/src/dialogs/AboutDlg.cpp @@ -22,56 +22,58 @@ #include #include #include +#include #include "main.h" #include "AboutDlg.h" -CAboutDialog::CAboutDialog(QWidget* parent,bool modal, Qt::WFlags fl) -: QDialog(parent,fl) +AboutDialog::AboutDialog(QWidget* parent):QDialog(parent) { -setupUi(this); -createBanner(Banner,Icon_Key32x32,tr("KeePassX %1").arg(KEEPASS_VERSION)); -loadLicFromFile(); - -QString AboutTr=tr("Current Translation: None

","Please replace 'None' with the language of your translation"); -if(TrActive){ - AboutTr+=tr("Author: %1
").arg(tr("$TRANSLATION_AUTHOR")); - QString mail=tr("$TRANSLATION_AUTHOR_EMAIL","Here you can enter your email or homepage if you want."); - if(mail!=QString()){ - AboutTr+=mail+"
"; + setupUi(this); + createBanner(&BannerPixmap,getPixmap("keepassx_large"),tr("KeePassX %1").arg(KEEPASS_VERSION),width()); + loadLicFromFile(); + + QString AboutTr=tr("Current Translation: None

","Please replace 'None' with the language of your translation"); + if(TrActive){ + AboutTr+=tr("Author: %1
").arg(tr("$TRANSLATION_AUTHOR")); + QString mail=tr("$TRANSLATION_AUTHOR_EMAIL","Here you can enter your email or homepage if you want."); + if(mail!=QString()){ + AboutTr+=mail+"
"; + } + AboutTr+="
"; } - AboutTr+="
"; -} -Edit_Translation->setHtml(AboutTr+tr("\ -Information on how to translate KeePassX can be found under:\n\ -http://keepassx.sourceforge.net/")); -QString str; -str+=""+tr("Team")+"
"; -str+="
"; -str+=""+tr("Tarek Saidi")+"
"+tr("Developer, Project Admin")+"
"+tr("tariq@users.berlios.de")+"
"; -str+="
"; -str+=""+tr("Eugen Gorschenin")+"
"+tr("Web Designer")+"
"+tr("geugen@users.berlios.de")+"
"; -str+="

"; -str+=""+tr("Thanks To")+""; -str+="
"; -str+=""+tr("Matthias Miller")+"
"+tr("Patches for better MacOS X support")+"
"+tr("www.outofhanwell.com")+"
"; -str+="
"; -str+="
"; -str+=""+tr("James Nicholls")+"
"+tr("Main Application Icon")/*+"
"+tr("mailto:???")*/+"
"; -Edit_Thanks->setHtml(str); + Edit_Translation->setHtml(AboutTr+tr("\ + Information on how to translate KeePassX can be found under:\n\ + http://keepassx.sourceforge.net/")); + QString str; + str+=""+tr("Team")+"
"; + str+="
"; + str+=""+tr("Tarek Saidi")+"
"+tr("Developer, Project Admin")+"
"+tr("tariq@users.berlios.de")+"
"; + str+="
"; + str+=""+tr("Eugen Gorschenin")+"
"+tr("Web Designer")+"
"+tr("geugen@users.berlios.de")+"
"; + str+="

"; + str+=""+tr("Thanks To")+""; + str+="
"; + str+=""+tr("Matthias Miller")+"
"+tr("Patches for better MacOS X support")+"
"+tr("www.outofhanwell.com")+"
"; + str+="
"; + str+="
"; + str+=""+tr("James Nicholls")+"
"+tr("Main Application Icon")/*+"
"+tr("mailto:???")*/+"
"; + Edit_Thanks->setHtml(str); } -CAboutDialog::~CAboutDialog() -{ - +void AboutDialog::paintEvent(QPaintEvent *event){ + QDialog::paintEvent(event); + QPainter painter(this); + painter.setClipRegion(event->region()); + painter.drawPixmap(QPoint(0,0),BannerPixmap); } -void CAboutDialog::OnClose() +void AboutDialog::OnClose() { close(); } -void CAboutDialog::loadLicFromFile(){ +void AboutDialog::loadLicFromFile(){ QFile gpl(AppDir+"/../share/keepass/license.html"); if(!gpl.exists()){ @@ -95,11 +97,11 @@ Edit_License->setHtml(QString::fromUtf8(buffer,l)); delete buffer; } -void CAboutDialog::OnHomepageClicked(){ +void AboutDialog::OnHomepageClicked(){ openBrowser(tr("http://keepassx.sf.net")); } -void CAboutDialog::OnEMailClicked(){ +void AboutDialog::OnEMailClicked(){ openBrowser("mailto:keepassx@gmail.com"); } diff --git a/src/dialogs/AboutDlg.h b/src/dialogs/AboutDlg.h index eecf4ec..a0af8a4 100755 --- a/src/dialogs/AboutDlg.h +++ b/src/dialogs/AboutDlg.h @@ -1,6 +1,6 @@ /*************************************************************************** - * Copyright (C) 2005 by Tarek Saidi * - * tarek@linux * + * Copyright (C) 2005-2007 by Tarek Saidi * + * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -19,25 +19,30 @@ ***************************************************************************/ #ifndef _ABOUTDIALOG_H_ #define _ABOUTDIALOG_H_ + +#include +#include #include "ui_AboutDlg.h" #include "lib/UrlLabel.h" #include "main.h" -class CAboutDialog : public QDialog, public Ui_AboutDlg +class AboutDialog : public QDialog, public Ui_AboutDlg { Q_OBJECT public: - CAboutDialog(QWidget* parent = 0, bool modal = FALSE, Qt::WFlags fl = 0 ); - ~CAboutDialog(); + AboutDialog(QWidget* parent); + public slots: virtual void OnClose(); void OnHomepageClicked(); void OnEMailClicked(); private: + QPixmap BannerPixmap; inline void loadLicFromFile(); + virtual void paintEvent(QPaintEvent*); }; #endif diff --git a/src/dialogs/CalendarDlg.cpp b/src/dialogs/CalendarDlg.cpp new file mode 100644 index 0000000..dc33629 --- /dev/null +++ b/src/dialogs/CalendarDlg.cpp @@ -0,0 +1,29 @@ +/*************************************************************************** + * Copyright (C) 2007 by Tarek Saidi * + * tarek.saidi@arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "main.h" +#include "CalendarDlg.h" + +CalendarDialog::CalendarDialog(QWidget* parent, const QDate& Start):QDialog(parent){ + setupUi(this); + calendarWidget->setSelectedDate(Start); + setWindowIcon(getIcon("clock")); + setWindowFlags(Qt::Sheet); +} diff --git a/src/dialogs/CalendarDlg.h b/src/dialogs/CalendarDlg.h new file mode 100644 index 0000000..2c46021 --- /dev/null +++ b/src/dialogs/CalendarDlg.h @@ -0,0 +1,35 @@ +/*************************************************************************** + * Copyright (C) 2007 by Tarek Saidi * + * tarek.saidi@arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef _CALENDAR_DLG_H_ +#define _CALENDAR_DLG_H_ + +#include +#include "ui_CalendarDlg.h" + +class CalendarDialog:public QDialog, public Ui_CalendarDialog{ + Q_OBJECT + public: + CalendarDialog(QWidget* parent, const QDate& Start=QDate::currentDate()); + + +}; + + +#endif diff --git a/src/dialogs/CollectEntropyDlg.cpp b/src/dialogs/CollectEntropyDlg.cpp index 01f030a..2373443 100644 --- a/src/dialogs/CollectEntropyDlg.cpp +++ b/src/dialogs/CollectEntropyDlg.cpp @@ -26,7 +26,7 @@ CollectEntropyDlg::CollectEntropyDlg(QWidget* parent):QDialog(parent){ setupUi(this); - createBanner(&BannerPixmap,Icon_Key32x32,tr("Entropy Collection"),width()); + createBanner(&BannerPixmap,getPixmap("dice"),tr("Entropy Collection"),width()); KeyEntropyBuffer=new unsigned char[105]; MouseEntropyBuffer=new quint16[210]; KeyCounter=0; diff --git a/src/dialogs/CustomizeDetailViewDlg.cpp b/src/dialogs/CustomizeDetailViewDlg.cpp new file mode 100644 index 0000000..419eaf1 --- /dev/null +++ b/src/dialogs/CustomizeDetailViewDlg.cpp @@ -0,0 +1,217 @@ +/*************************************************************************** + * Copyright (C) 2005-2007 by Tarek Saidi * + * tarek.saidi@arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include "main.h" +#include "CustomizeDetailViewDlg.h" + +bool DisableButtonSlots=false; + +CustomizeDetailViewDialog::CustomizeDetailViewDialog(QWidget* parent):QDialog(parent){ + setupUi(this); + BtnBold->setIcon(getIcon("text_bold")); + BtnItalic->setIcon(getIcon("text_italic")); + BtnUnderline->setIcon(getIcon("text_under")); + BtnAlignLeft->setIcon(getIcon("text_left")); + BtnAlignRight->setIcon(getIcon("text_right")); + BtnAlignCenter->setIcon(getIcon("text_center")); + BtnAlignBlock->setIcon(getIcon("text_block")); + BtnTemplates->setIcon(getIcon("templates")); + + QMenu* tmplmenu=new QMenu(); + tmplmenu->addAction(tr("Group"))->setData("%group%"); + tmplmenu->addAction(tr("Title"))->setData("%title%"); + tmplmenu->addAction(tr("Username"))->setData("%username%"); + tmplmenu->addAction(tr("Password"))->setData("%password%"); + tmplmenu->addAction(tr("Url"))->setData("%url%"); + tmplmenu->addAction(tr("Comment"))->setData("%comment%"); + tmplmenu->addAction(tr("Attachment Name"))->setData("%attachment%"); + tmplmenu->addAction(tr("Creation Date"))->setData("%creation%"); + tmplmenu->addAction(tr("Last Access Date"))->setData("%lastaccess%"); + tmplmenu->addAction(tr("Last Modification Date"))->setData("%lastmod%"); + tmplmenu->addAction(tr("Expiration Date"))->setData("%expire%"); + tmplmenu->addAction(tr("Time till Expiration"))->setData("%expire-timeleft%"); + BtnTemplates->setMenu(tmplmenu); + + connect(BtnBold,SIGNAL(toggled(bool)),this,SLOT(OnBtnBold(bool))); + connect(BtnItalic,SIGNAL(toggled(bool)),this,SLOT(OnBtnItalic(bool))); + connect(BtnUnderline,SIGNAL(toggled(bool)),this,SLOT(OnBtnUnderline(bool))); + connect(BtnAlignLeft,SIGNAL(toggled(bool)),this,SLOT(OnBtnAlignLeft(bool))); + connect(BtnAlignRight,SIGNAL(toggled(bool)),this,SLOT(OnBtnAlignRight(bool))); + connect(BtnAlignCenter,SIGNAL(toggled(bool)),this,SLOT(OnBtnAlignCenter(bool))); + connect(BtnAlignBlock,SIGNAL(toggled(bool)),this,SLOT(OnBtnAlignBlock(bool))); + connect(BtnColor,SIGNAL(clicked()),this,SLOT(OnBtnColor())); + connect(ButtonSave,SIGNAL(clicked()),this,SLOT(OnSave())); + connect(ButtonCancel,SIGNAL(clicked()),this,SLOT(OnCancel())); + connect(ButtonRestore,SIGNAL(clicked()),this,SLOT(OnRestoreDefault())); + connect(tmplmenu,SIGNAL(triggered(QAction*)),this,SLOT(OnInsertTemplate(QAction*))); + connect(RichEdit,SIGNAL(cursorPositionChanged()),this,SLOT(OnCursorPositionChanged())); + connect(TabWidget,SIGNAL(currentChanged(int)),this,SLOT(OnTabChanged(int))); + connect(FontSize,SIGNAL(activated(const QString&)),this,SLOT(OnFontSizeChanged(const QString&))); + connect(FontSize->lineEdit(),SIGNAL(returnPressed()),this,SLOT(OnFontSizeChanged())); + + RichEdit->setHtml(DetailViewTemplate); + + OnCursorPositionChanged(); +} + +void CustomizeDetailViewDialog::OnTabChanged(int index){ + + if(index==0){ + RichEdit->setHtml(HtmlEdit->toPlainText()); + } + if(index==1){ + HtmlEdit->setPlainText(RichEdit->toHtml()); + } +} + +void CustomizeDetailViewDialog::OnFontSizeChanged(const QString& text){ + bool ok=false; + int size=text.toInt(&ok); + if(ok && size > 0){ + RichEdit->setFontPointSize(size); + } +} + + +void CustomizeDetailViewDialog::OnCursorPositionChanged(){ + DisableButtonSlots=true; + if(RichEdit->fontWeight()==QFont::Bold)BtnBold->setChecked(true); + else BtnBold->setChecked(false); + BtnItalic->setChecked(RichEdit->fontItalic()); + BtnUnderline->setChecked(RichEdit->fontUnderline()); + switch(RichEdit->alignment()){ + case Qt::AlignLeft: + BtnAlignLeft->setChecked(true); + BtnAlignCenter->setChecked(false); + BtnAlignRight->setChecked(false); + BtnAlignBlock->setChecked(false); + break; + case Qt::AlignHCenter: + BtnAlignLeft->setChecked(false); + BtnAlignCenter->setChecked(true); + BtnAlignRight->setChecked(false); + BtnAlignBlock->setChecked(false); + break; + case Qt::AlignRight: + BtnAlignLeft->setChecked(false); + BtnAlignCenter->setChecked(false); + BtnAlignRight->setChecked(true); + BtnAlignBlock->setChecked(false); + break; + case Qt::AlignJustify: + BtnAlignLeft->setChecked(false); + BtnAlignCenter->setChecked(false); + BtnAlignRight->setChecked(false); + BtnAlignBlock->setChecked(true); + break; + } + CurrentColor=RichEdit->textColor(); + QPixmap pixmap=QPixmap(16,16); + pixmap.fill(CurrentColor); + BtnColor->setIcon(QIcon(pixmap)); + if(RichEdit->fontPointSize()>0) + FontSize->lineEdit()->setText(QString::number((int)RichEdit->fontPointSize())); + else + FontSize->lineEdit()->setText("9"); + + DisableButtonSlots=false; +} + +void CustomizeDetailViewDialog::OnBtnBold(bool toggled){ + if(DisableButtonSlots)return; + if(toggled) + RichEdit->setFontWeight(QFont::Bold); + else + RichEdit->setFontWeight(QFont::Normal); +} + +void CustomizeDetailViewDialog::OnBtnItalic(bool toggled){ + if(DisableButtonSlots)return; + RichEdit->setFontItalic(toggled); +} + +void CustomizeDetailViewDialog::OnBtnUnderline(bool toggled){ + if(DisableButtonSlots)return; + RichEdit->setFontUnderline(toggled); +} + + +void CustomizeDetailViewDialog::OnBtnAlignLeft(bool toggled){ + if(DisableButtonSlots)return; + RichEdit->setAlignment(Qt::AlignLeft); + OnCursorPositionChanged(); +} + +void CustomizeDetailViewDialog::OnBtnAlignRight(bool toggled){ + if(DisableButtonSlots)return; + RichEdit->setAlignment(Qt::AlignRight); + OnCursorPositionChanged(); +} + +void CustomizeDetailViewDialog::OnBtnAlignCenter(bool toggled){ + if(DisableButtonSlots)return; + RichEdit->setAlignment(Qt::AlignHCenter); + OnCursorPositionChanged(); +} + +void CustomizeDetailViewDialog::OnBtnAlignBlock(bool toggled){ + if(DisableButtonSlots)return; + RichEdit->setAlignment(Qt::AlignJustify); + OnCursorPositionChanged(); +} + +void CustomizeDetailViewDialog::OnBtnColor(){ + CurrentColor=QColorDialog::getColor(CurrentColor,this); + QPixmap pixmap=QPixmap(16,16); + pixmap.fill(CurrentColor); + BtnColor->setIcon(QIcon(pixmap)); + RichEdit->setTextColor(CurrentColor); +} + +void CustomizeDetailViewDialog::OnInsertTemplate(QAction* action){ + RichEdit->insertPlainText(action->data().toString()); +} + + +void CustomizeDetailViewDialog::OnSave(){ + if(TabWidget->currentIndex()==0) + DetailViewTemplate=RichEdit->toHtml(); + else if(TabWidget->currentIndex()==1) + DetailViewTemplate=HtmlEdit->toPlainText(); + + done(1); +} + +void CustomizeDetailViewDialog::OnCancel(){ + done(0); +} + +void CustomizeDetailViewDialog::OnRestoreDefault(){ + loadDefaultDetailViewTemplate(); + HtmlEdit->setPlainText(DetailViewTemplate); + RichEdit->setHtml(DetailViewTemplate); +} \ No newline at end of file diff --git a/src/dialogs/CustomizeDetailViewDlg.h b/src/dialogs/CustomizeDetailViewDlg.h new file mode 100644 index 0000000..83cf4dc --- /dev/null +++ b/src/dialogs/CustomizeDetailViewDlg.h @@ -0,0 +1,55 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 by Tarek Saidi * + * tarek.saidi@arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef _CUSTOMIZE_DETAIL_VIEW_H_ +#define _CUSTOMIZE_DETAIL_VIEW_H_ + +#include "ui_CustomizeDetailViewDlg.h"; +#include +#include + +class CustomizeDetailViewDialog : public QDialog, public Ui_CustomizeDetailViewDialog{ + Q_OBJECT + public: + CustomizeDetailViewDialog(QWidget* parent); + + private slots: + void OnBtnBold(bool); + void OnBtnItalic(bool); + void OnBtnUnderline(bool); + void OnBtnAlignLeft(bool); + void OnBtnAlignRight(bool); + void OnBtnAlignCenter(bool); + void OnBtnAlignBlock(bool); + void OnBtnColor(); + void OnSave(); + void OnCancel(); + void OnRestoreDefault(); + void OnInsertTemplate(QAction*); + void OnCursorPositionChanged(); + void OnTabChanged(int index); + void OnFontSizeChanged(const QString& text=QString()); + + private: + QColor CurrentColor; + + +}; + +#endif \ No newline at end of file diff --git a/src/dialogs/DatabaseSettingsDlg.cpp b/src/dialogs/DatabaseSettingsDlg.cpp index 26152a5..ac9faf9 100755 --- a/src/dialogs/DatabaseSettingsDlg.cpp +++ b/src/dialogs/DatabaseSettingsDlg.cpp @@ -32,7 +32,7 @@ CDbSettingsDlg::CDbSettingsDlg(QWidget* parent,IDatabase* db, bool modal, Qt::W { setupUi(this); database=dynamic_cast(db); - createBanner(&BannerPixmap,Icon_Settings32x32,tr("Settings"),width()); + createBanner(&BannerPixmap,getPixmap("appsettings"),tr("Settings"),width()); ComboAlgo->insertItem(0,tr("AES(Rijndael): 256 Bit (default)")); ComboAlgo->insertItem(1,tr("Twofish: 256 Bit")); ComboAlgo->setCurrentIndex(database->cryptAlgorithm()); //Achtung: AlgoID muss gleich dem ComboBox Index sein! @@ -77,4 +77,4 @@ void CDbSettingsDlg::OnOK() database->setKeyTransfRounds(rounds); database->setCryptAlgorithm((CryptAlgorithm)ComboAlgo->currentIndex()); done(1); -} \ No newline at end of file +} diff --git a/src/dialogs/EditEntryDlg.cpp b/src/dialogs/EditEntryDlg.cpp index 10022ec..74e7c7a 100755 --- a/src/dialogs/EditEntryDlg.cpp +++ b/src/dialogs/EditEntryDlg.cpp @@ -41,6 +41,7 @@ #include "SelectIconDlg.h" #include "PasswordGenDlg.h" #include "EditEntryDlg.h" +#include "CalendarDlg.h" @@ -52,10 +53,8 @@ CEditEntryDlg::CEditEntryDlg(IDatabase* _db, IEntryHandle* _entry,QWidget* paren entry=_entry; db=_db; setupUi(this); - //not sure if this createBanner is still needed - createBanner(&BannerPixmap,Icon_Key32x32,tr("Edit Entry"),width()); - //end ModFlag=false; + QMenu *ExpirePresetsMenu=new QMenu(); connect(Edit_Password_w, SIGNAL(editingFinished()), this, SLOT(OnPasswordwLostFocus())); connect(Edit_Password_w, SIGNAL(textChanged(const QString&)), this, SLOT( OnPasswordwTextChanged(const QString&))); connect(Edit_Password, SIGNAL(textChanged(const QString&)), this, SLOT( OnPasswordTextChanged(const QString&))); @@ -68,10 +67,28 @@ CEditEntryDlg::CEditEntryDlg(IDatabase* _db, IEntryHandle* _entry,QWidget* paren connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()),this,SLOT(OnButtonOK())); connect(CheckBox_ExpiresNever,SIGNAL(stateChanged(int)),this,SLOT(OnCheckBoxExpiresNeverChanged(int))); connect(Button_CustomIcons,SIGNAL(clicked()),this,SLOT(OnCustomIcons())); + connect(ExpirePresetsMenu,SIGNAL(triggered(QAction*)),this,SLOT(OnExpirePreset(QAction*))); + connect(ButtonExpirePresets,SIGNAL(triggered(QAction*)),this,SLOT(OnCalendar(QAction*))); - ButtonOpenAttachment->setIcon(*Icon_FileOpen); - ButtonDeleteAttachment->setIcon(*Icon_EditDelete); - ButtonSaveAttachment->setIcon(*Icon_FileSave); + // QAction::data() contains the time until expiration in days. + ExpirePresetsMenu->addAction(tr("Today"))->setData(0); + ExpirePresetsMenu->addSeparator(); + ExpirePresetsMenu->addAction(tr("1 Week"))->setData(7); + ExpirePresetsMenu->addAction(tr("2 Weeks"))->setData(14); + ExpirePresetsMenu->addAction(tr("3 Weeks"))->setData(21); + ExpirePresetsMenu->addSeparator(); + ExpirePresetsMenu->addAction(tr("1 Month"))->setData(30); + ExpirePresetsMenu->addAction(tr("3 Months"))->setData(60); + ExpirePresetsMenu->addAction(tr("6 Months"))->setData(180); + ExpirePresetsMenu->addSeparator(); + ExpirePresetsMenu->addAction(tr("1 Year"))->setData(365); + ButtonExpirePresets->setMenu(ExpirePresetsMenu); + ButtonExpirePresets->setDefaultAction(new QAction(tr("Calendar..."),ButtonExpirePresets)); + + ButtonOpenAttachment->setIcon(getIcon("fileopen")); + ButtonDeleteAttachment->setIcon(getIcon("filedelete")); + ButtonSaveAttachment->setIcon(getIcon("filesave")); + ButtonExpirePresets->setIcon(getIcon("clock")); setWindowTitle(entry->title()); @@ -136,9 +153,8 @@ if(event->spontaneous()==false){ } } -//Added resize event void CEditEntryDlg::resizeEvent(QResizeEvent *event){ - createBanner(&BannerPixmap,Icon_Key32x32,tr("Test 2"),width()); + createBanner(&BannerPixmap,getPixmap("keepassx_large"),tr("Test 2"),width()); QDialog::resizeEvent(event); } @@ -382,23 +398,35 @@ void CEditEntryDlg::OnButtonGenPw() void CEditEntryDlg::OnCheckBoxExpiresNeverChanged(int state){ -if(state==Qt::Unchecked){ - DateTime_Expire->setDisabled(false); -} -else -{ - DateTime_Expire->setDisabled(true); -} + if(state==Qt::Unchecked) + DateTime_Expire->setDisabled(false); + else + DateTime_Expire->setDisabled(true); } void CEditEntryDlg::OnCustomIcons(){ -CSelectIconDlg dlg(db,Combo_IconPicker->currentIndex(),this); -int r=dlg.exec(); -if(r!=-1){ - Combo_IconPicker->clear(); - for(int i=0;inumIcons();i++) - Combo_IconPicker->insertItem(i,db->icon(i),""); - Combo_IconPicker->setCurrentIndex(r); + CSelectIconDlg dlg(db,Combo_IconPicker->currentIndex(),this); + int r=dlg.exec(); + if(r!=-1){ + Combo_IconPicker->clear(); + for(int i=0;inumIcons();i++) + Combo_IconPicker->insertItem(i,db->icon(i),""); + Combo_IconPicker->setCurrentIndex(r); + } +} + +void CEditEntryDlg::OnExpirePreset(QAction* action){ + CheckBox_ExpiresNever->setChecked(false); + DateTime_Expire->setDate(QDate::fromJulianDay(QDate::currentDate().toJulianDay()+action->data().toInt())); + DateTime_Expire->setTime(QTime(0,0,0)); } + +void CEditEntryDlg::OnCalendar(QAction* action){ + CalendarDialog dlg(this); + if(dlg.exec()==QDialog::Accepted){ + CheckBox_ExpiresNever->setChecked(false); + DateTime_Expire->setDate(dlg.calendarWidget->selectedDate()); + DateTime_Expire->setTime(QTime(0,0,0)); + } } diff --git a/src/dialogs/EditEntryDlg.h b/src/dialogs/EditEntryDlg.h index 19f60f7..214659f 100755 --- a/src/dialogs/EditEntryDlg.h +++ b/src/dialogs/EditEntryDlg.h @@ -1,6 +1,6 @@ /*************************************************************************** - * Copyright (C) 2005 by Tarek Saidi * - * tarek@linux * + * Copyright (C) 2005-2007 by Tarek Saidi * + * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -56,14 +56,13 @@ class CEditEntryDlg : public QDialog, public Ui_EditEntryDialog void OnCheckBoxExpiresNeverChanged(int state); void OnCustomIcons(); void OnButtonOK(); + void OnExpirePreset(QAction*); + void OnCalendar(QAction*); private: virtual void showEvent(QShowEvent *); virtual void paintEvent(QPaintEvent*); - // Added resizeEvent - virtual void resizeEvent(QResizeEvent *); - - + virtual void resizeEvent(QResizeEvent *); }; diff --git a/src/dialogs/ExpiredEntriesDlg.cpp b/src/dialogs/ExpiredEntriesDlg.cpp new file mode 100644 index 0000000..b9c97a8 --- /dev/null +++ b/src/dialogs/ExpiredEntriesDlg.cpp @@ -0,0 +1,63 @@ +/*************************************************************************** + * Copyright (C) 2007 by Tarek Saidi * + * tarek.saidi@arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include +#include +#include +#include "main.h" +#include "ExpiredEntriesDlg.h" + +ExpiredEntriesDialog::ExpiredEntriesDialog(QWidget* parent,IDatabase* database,const QList& ExpiredEntries):QDialog(parent){ + setupUi(this); + Entries=ExpiredEntries; + for(int i=0;isetData(0,Qt::UserRole,i); + item->setText(0,Entries[i]->group()->title()); + item->setText(1,Entries[i]->title()); + item->setText(2,Entries[i]->username()); + item->setText(3,Entries[i]->expire().dateToString(Qt::LocalDate)); + item->setIcon(0,database->icon(Entries[i]->group()->image())); + item->setIcon(1,database->icon(Entries[i]->image())); + + } + connect(treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(OnItemDoubleClicked(QTreeWidgetItem*,int))); +} + + +void ExpiredEntriesDialog::paintEvent(QPaintEvent* event){ + QDialog::paintEvent(event); + QPainter painter(this); + painter.setClipRegion(event->region()); + painter.drawPixmap(QPoint(0,0),BannerPixmap); +} + +void ExpiredEntriesDialog::resizeEvent(QResizeEvent* event){ + createBanner(&BannerPixmap,getPixmap("alarmclock"),tr("Expried Entries of the Database"),width()); + QDialog::resizeEvent(event); +} + +void ExpiredEntriesDialog::OnItemDoubleClicked(QTreeWidgetItem* item, int column){ + SelectedEntry=Entries[item->data(0,Qt::UserRole).toInt()]; + accept(); +} + +///TODO 0.2.3 locale aware string/date compare for correct sorting diff --git a/src/dialogs/ExpiredEntriesDlg.h b/src/dialogs/ExpiredEntriesDlg.h new file mode 100644 index 0000000..b60c90b --- /dev/null +++ b/src/dialogs/ExpiredEntriesDlg.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * Copyright (C) 2007 by Tarek Saidi * + * tarek.saidi@arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _EXP_ENTRIES_DLG_ +#define _EXP_ENTRIES_DLG_ + +#include +#include +#include "ui_ExpiredEntriesDlg.h" +#include "Database.h" + +class ExpiredEntriesDialog:public QDialog, public Ui_ExpiredEntriesDialog{ + Q_OBJECT + public: + ExpiredEntriesDialog(QWidget* parent,IDatabase* database,const QList& Entries); + IEntryHandle* SelectedEntry; + private: + QList Entries; + QPixmap BannerPixmap; + virtual void paintEvent(QPaintEvent*); + virtual void resizeEvent(QResizeEvent *); + + private slots: + void OnItemDoubleClicked(QTreeWidgetItem*,int); + + +}; + + +#endif diff --git a/src/dialogs/PasswordDlg.cpp b/src/dialogs/PasswordDlg.cpp index 5b0dbbf..40e4fab 100755 --- a/src/dialogs/PasswordDlg.cpp +++ b/src/dialogs/PasswordDlg.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * Copyright (C) 2005-2006 by Tarek Saidi * - * tarek@linux * + * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -38,7 +38,7 @@ CPasswordDialog::CPasswordDialog(QWidget* parent,IDatabase* DB,bool ShowExitButt : QDialog(parent) { setupUi(this); - createBanner(Banner,Icon_Key32x32,tr("Database Key")); + createBanner(Banner,getPixmap("key"),tr("Database Key")); db=DB; QDir media(config.MountDir); if(media.exists()){ diff --git a/src/dialogs/PasswordGenDlg.cpp b/src/dialogs/PasswordGenDlg.cpp index 8ea605a..403fe5a 100755 --- a/src/dialogs/PasswordGenDlg.cpp +++ b/src/dialogs/PasswordGenDlg.cpp @@ -37,7 +37,7 @@ CGenPwDialog::CGenPwDialog(QWidget* parent, bool StandAloneMode,Qt::WFlags fl) : QDialog(parent,fl) { setupUi(this); - createBanner(&BannerPixmap,Icon_Key32x32,tr("Password Generator"),width()); + createBanner(&BannerPixmap,getPixmap("dice"),tr("Password Generator"),width()); connect(ButtonGenerate,SIGNAL(clicked()),this,SLOT(OnGeneratePw())); connect(Radio_1,SIGNAL(toggled(bool)),this,SLOT(OnRadio1StateChanged(bool))); diff --git a/src/dialogs/SearchDlg.cpp b/src/dialogs/SearchDlg.cpp index 32829f2..0bc7ae1 100755 --- a/src/dialogs/SearchDlg.cpp +++ b/src/dialogs/SearchDlg.cpp @@ -23,54 +23,55 @@ #include #include #include +#include #include "main.h" #include "PwmConfig.h" #include "SearchDlg.h" -CSearchDlg::CSearchDlg(IDatabase* database,IGroupHandle* Group,QWidget* parent, bool modal, Qt::WFlags fl) -: QDialog(parent,fl) +SearchDialog::SearchDialog(IDatabase* database,IGroupHandle* Group,QWidget* parent):QDialog(parent) { -setupUi(this); -connect( Button_Search, SIGNAL( clicked() ), this, SLOT( OnSearch() ) ); -connect( Button_Close, SIGNAL( clicked() ), this, SLOT( OnClose() ) ); -db=database; -group=Group; -createBanner(Banner,Icon_Search32x32,tr("Search")); -checkBox_Cs->setChecked(config.SearchOptions[0]); -checkBox_regExp->setChecked(config.SearchOptions[1]); -checkBox_Title->setChecked(config.SearchOptions[2]); -checkBox_Username->setChecked(config.SearchOptions[3]); -checkBox_Password->setChecked(config.SearchOptions[4]); -checkBox_Comment->setChecked(config.SearchOptions[5]); -checkBox_URL->setChecked(config.SearchOptions[6]); -checkBox_Attachment->setChecked(config.SearchOptions[7]); -if(group) - checkBox_Recursive->setChecked(config.SearchOptions[8]); -else{ - checkBox_Recursive->setChecked(false); - checkBox_Recursive->setEnabled(false);} + setupUi(this); + connect( Button_Search, SIGNAL( clicked() ), this, SLOT( OnSearch() ) ); + connect( Button_Close, SIGNAL( clicked() ), this, SLOT( OnClose() ) ); + db=database; + group=Group; + createBanner(&BannerPixmap,getPixmap("search"),tr("Search"),width()); + checkBox_Cs->setChecked(config.SearchOptions[0]); + checkBox_regExp->setChecked(config.SearchOptions[1]); + checkBox_Title->setChecked(config.SearchOptions[2]); + checkBox_Username->setChecked(config.SearchOptions[3]); + checkBox_Password->setChecked(config.SearchOptions[4]); + checkBox_Comment->setChecked(config.SearchOptions[5]); + checkBox_URL->setChecked(config.SearchOptions[6]); + checkBox_Attachment->setChecked(config.SearchOptions[7]); + if(group) + checkBox_Recursive->setChecked(config.SearchOptions[8]); + else{ + checkBox_Recursive->setChecked(false); + checkBox_Recursive->setEnabled(false); + } } -CSearchDlg::~CSearchDlg() +SearchDialog::~SearchDialog() { -config.SearchOptions[0]=checkBox_Cs->isChecked(); -config.SearchOptions[1]=checkBox_regExp->isChecked(); -config.SearchOptions[2]=checkBox_Title->isChecked(); -config.SearchOptions[3]=checkBox_Username->isChecked(); -config.SearchOptions[4]=checkBox_Password->isChecked(); -config.SearchOptions[5]=checkBox_Comment->isChecked(); -config.SearchOptions[6]=checkBox_URL->isChecked(); -config.SearchOptions[7]=checkBox_Attachment->isChecked(); -if(group) config.SearchOptions[8]=checkBox_Recursive->isChecked(); + config.SearchOptions[0]=checkBox_Cs->isChecked(); + config.SearchOptions[1]=checkBox_regExp->isChecked(); + config.SearchOptions[2]=checkBox_Title->isChecked(); + config.SearchOptions[3]=checkBox_Username->isChecked(); + config.SearchOptions[4]=checkBox_Password->isChecked(); + config.SearchOptions[5]=checkBox_Comment->isChecked(); + config.SearchOptions[6]=checkBox_URL->isChecked(); + config.SearchOptions[7]=checkBox_Attachment->isChecked(); + if(group) config.SearchOptions[8]=checkBox_Recursive->isChecked(); } -void CSearchDlg::OnClose() +void SearchDialog::OnClose() { done(0); } -void CSearchDlg::OnSearch() +void SearchDialog::OnSearch() { bool Fields[6]; Fields[0]=checkBox_Title->isChecked(); @@ -83,6 +84,12 @@ void CSearchDlg::OnSearch() done(1); } +void SearchDialog::paintEvent(QPaintEvent *event){ + QDialog::paintEvent(event); + QPainter painter(this); + painter.setClipRegion(event->region()); + painter.drawPixmap(QPoint(0,0),BannerPixmap); +} diff --git a/src/dialogs/SearchDlg.h b/src/dialogs/SearchDlg.h index 073803d..58c099e 100755 --- a/src/dialogs/SearchDlg.h +++ b/src/dialogs/SearchDlg.h @@ -19,25 +19,30 @@ ***************************************************************************/ #ifndef SEARCHDLG_H #define SEARCHDLG_H + +#include +#include #include "ui_SearchDlg.h" #include "main.h" #include "Database.h" -class CSearchDlg : public QDialog, public Ui_Search_Dlg +class SearchDialog : public QDialog, public Ui_Search_Dlg { - Q_OBJECT -public: - CSearchDlg(IDatabase* database, IGroupHandle* group=NULL,QWidget* parent = 0, bool modal = true, Qt::WFlags fl = 0 ); - ~CSearchDlg(); - QList Result; - -public slots: - virtual void OnClose(); - virtual void OnSearch(); - -private: - IGroupHandle* group; - IDatabase* db; + Q_OBJECT + public: + SearchDialog(IDatabase* database, IGroupHandle* group,QWidget* parent); + ~SearchDialog(); + QList Result; + + public slots: + virtual void OnClose(); + virtual void OnSearch(); + + private: + QPixmap BannerPixmap; + IGroupHandle* group; + IDatabase* db; + virtual void paintEvent(QPaintEvent*); }; #endif diff --git a/src/dialogs/SelectIconDlg.cpp b/src/dialogs/SelectIconDlg.cpp index 4849004..8338168 100644 --- a/src/dialogs/SelectIconDlg.cpp +++ b/src/dialogs/SelectIconDlg.cpp @@ -34,8 +34,8 @@ CSelectIconDlg::CSelectIconDlg(IDatabase* database,int CurrentId,QWidget* parent db=database; Id=CurrentId; CtxMenu=new QMenu(this); - ReplaceAction=CtxMenu->addAction(*Icon_Swap,tr("Replace...")); - DeleteAction=CtxMenu->addAction(*Icon_EditDelete,tr("Delete")); + ReplaceAction=CtxMenu->addAction(getIcon("swap"),tr("Replace...")); + DeleteAction=CtxMenu->addAction(getIcon("delete"),tr("Delete")); connect(Button_AddIcon, SIGNAL(clicked()), this, SLOT(OnAddIcon())); connect(Button_PickIcon, SIGNAL(clicked()), this, SLOT(OnPickIcon())); connect(Button_Cancel, SIGNAL(clicked()), this, SLOT(OnCancel())); diff --git a/src/dialogs/SettingsDlg.cpp b/src/dialogs/SettingsDlg.cpp index d6a01f4..1f05704 100755 --- a/src/dialogs/SettingsDlg.cpp +++ b/src/dialogs/SettingsDlg.cpp @@ -29,6 +29,7 @@ #include #include #include "SettingsDlg.h" +#include "CustomizeDetailViewDlg.h" bool CSettingsDlg::PluginsModified=false; @@ -51,9 +52,10 @@ CSettingsDlg::CSettingsDlg(QWidget* parent):QDialog(parent,Qt::Dialog) connect(Radio_IntPlugin_Kde,SIGNAL(toggled(bool)),this,SLOT(OnIntPluginKde(bool))); connect(CheckBox_BrowserDefault,SIGNAL(stateChanged(int)),this,SLOT(OnCheckBoxBrowserDefaultChanged(int))); + connect(Button_CustomizeEntryDetails,SIGNAL(clicked()),this,SLOT(OnCustomizeEntryDetails())); - createBanner(&BannerPixmap,Icon_Settings32x32,tr("Settings"),width()); + createBanner(&BannerPixmap,getPixmap("appsettings"),tr("Settings"),width()); //General CheckBox_OpenLast->setChecked(settings->value("OpenLastFile",true).toBool()); @@ -161,12 +163,12 @@ void CSettingsDlg::OnCheckBoxBrowserDefaultChanged(int state){ void CSettingsDlg::OnOK() { apply(); - close(); + accept(); } void CSettingsDlg::OnCancel() { - close(); + reject(); } void CSettingsDlg::OnOtherButton(QAbstractButton* button){ @@ -227,7 +229,7 @@ void CSettingsDlg::OnTextColor() px->fill(c); pixmTextColor->clear(); pixmTextColor->setPixmap(*px); - createBanner(&BannerPixmap,Icon_Settings32x32,tr("Settings"),width(),color1,color2,textcolor); + createBanner(&BannerPixmap,getPixmap("appsettings"),tr("Settings"),width(),color1,color2,textcolor); } } @@ -241,7 +243,7 @@ void CSettingsDlg::OnColor2() px->fill(c); pixmColor2->clear(); pixmColor2->setPixmap(*px); - createBanner(&BannerPixmap,Icon_Settings32x32,tr("Settings"),width(),color1,color2,textcolor); + createBanner(&BannerPixmap,getPixmap("appsettings"),tr("Settings"),width(),color1,color2,textcolor); } } @@ -255,7 +257,7 @@ void CSettingsDlg::OnColor1() px->fill(c); pixmColor1->clear(); pixmColor1->setPixmap(*px); - createBanner(&BannerPixmap,Icon_Settings32x32,tr("Settings"),width(),color1,color2,textcolor); + createBanner(&BannerPixmap,getPixmap("appsettings"),tr("Settings"),width(),color1,color2,textcolor); } } @@ -286,3 +288,9 @@ void CSettingsDlg::OnIntPluginGnome(bool toggled){ void CSettingsDlg::OnIntPluginKde(bool toggled){ Label_IntPlugin_Info->show(); } + + +void CSettingsDlg::OnCustomizeEntryDetails(){ + CustomizeDetailViewDialog dlg(this); + dlg.exec(); +} diff --git a/src/dialogs/SettingsDlg.h b/src/dialogs/SettingsDlg.h index 4c1f16d..dce674b 100755 --- a/src/dialogs/SettingsDlg.h +++ b/src/dialogs/SettingsDlg.h @@ -48,6 +48,7 @@ class CSettingsDlg : public QDialog, public Ui_SettingsDialog void OnCheckBoxOpenLastChanged(int state); void OnCheckBoxBrowserDefaultChanged(int state); void OnMountDirBrowse(); + void OnCustomizeEntryDetails(); private: virtual void paintEvent(QPaintEvent*); diff --git a/src/forms/AboutDlg.ui b/src/forms/AboutDlg.ui index 8e54db6..2ce6d81 100644 --- a/src/forms/AboutDlg.ui +++ b/src/forms/AboutDlg.ui @@ -1,7 +1,4 @@ - - - AboutDlg @@ -23,170 +20,198 @@ 419 - 211 + 268 - 211 + 419 268 About - - - - 0 - 0 - 420 - 50 - - - - + + + 9 - - true + + 6 - - - - - 10 - 60 - 401 - 201 - - - - - About - - - - - 20 - 20 - 351 - 17 - - - - <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">KeePassX</span> - Cross Platform Password Manager</p></body></html> - - - - - - 30 - 110 - 341 - 51 - - - - Copyright (C) 2005 - 2006 Tarek Saidi -KeePassX is distributed under the terms of the -General Public License (GPL) version 2. + + + + Qt::Vertical - - - - - 30 - 50 - 351 - 17 - - - - http://keepassx.sourceforge.net + + QSizePolicy::Fixed - - + + + 20 + 50 + - - - - - 30 - 80 - 351 - 17 - - - - keepassx@gmail.com - - - - - - Credits - - - - - 3 - 3 - 390 - 166 - - - - true - - - - - - Translation - - - - - 3 - 3 - 390 - 167 - - - - true - - - - - - License - - - - - 3 - 3 - 391 - 167 - - - - true + + + + + + 0 + + + About + + + + 9 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">KeePassX</span> - Cross Platform Password Manager</p></body></html> + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + 0 + + + 12 + + + + + http://keepassx.sourceforge.net + + + + + + + + + + keepassx@gmail.com + + + + + + + Copyright (C) 2005 - 2006 Tarek Saidi +KeePassX is distributed under the terms of the +General Public License (GPL) version 2 or later. + + + + + + + + + + + + Credits + + + + 9 + + + 6 + + + + + true + + + + + + + + Translation + + + + 9 + + + 6 + + + + + true + + + + + + + + License + + + + 9 + + + 6 + + + + + true + + + + + - - + + - LinkLabel QLabel
../../src/lib/UrlLabel.h
- 0 -
diff --git a/src/forms/CalendarDlg.ui b/src/forms/CalendarDlg.ui new file mode 100644 index 0000000..b47ffe8 --- /dev/null +++ b/src/forms/CalendarDlg.ui @@ -0,0 +1,72 @@ + + CalendarDialog + + + + 0 + 0 + 334 + 238 + + + + Calendar + + + + 9 + + + 6 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + CalendarDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + CalendarDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/forms/CustomizeDetailViewDlg.ui b/src/forms/CustomizeDetailViewDlg.ui new file mode 100644 index 0000000..d10362d --- /dev/null +++ b/src/forms/CustomizeDetailViewDlg.ui @@ -0,0 +1,368 @@ + + CustomizeDetailViewDialog + + + + 0 + 0 + 531 + 402 + + + + Dialog + + + + 9 + + + 6 + + + + + 0 + + + + Rich Text Editor + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + Bold + + + B + + + + 16 + 16 + + + + true + + + + + + + Italic + + + I + + + true + + + + + + + Underlined + + + U + + + true + + + + + + + Left-Aligned + + + L + + + true + + + + + + + Centered + + + C + + + true + + + + + + + Right-Aligned + + + R + + + true + + + + + + + Justified + + + B + + + true + + + + + + + Text Color + + + C + + + + + + + Font Size + + + true + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 14 + + + + + 16 + + + + + 18 + + + + + 20 + + + + + 22 + + + + + 24 + + + + + 26 + + + + + 28 + + + + + 36 + + + + + 42 + + + + + 78 + + + + + + + + Templates + + + T + + + QToolButton::InstantPopup + + + Qt::NoArrow + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + HTML + + + + 9 + + + 6 + + + + + false + + + + + + + + + + + 0 + + + 6 + + + + + Restore Default + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Save + + + false + + + + + + + Cancel + + + false + + + + + + + + + + diff --git a/src/forms/EditEntryDlg.ui b/src/forms/EditEntryDlg.ui index 5a93995..de0c272 100644 --- a/src/forms/EditEntryDlg.ui +++ b/src/forms/EditEntryDlg.ui @@ -361,6 +361,16 @@ + + + + ... + + + QToolButton::MenuButtonPopup + + + diff --git a/src/forms/ExpiredEntriesDlg.ui b/src/forms/ExpiredEntriesDlg.ui new file mode 100644 index 0000000..e9bb679 --- /dev/null +++ b/src/forms/ExpiredEntriesDlg.ui @@ -0,0 +1,131 @@ + + ExpiredEntriesDialog + + + + 0 + 0 + 588 + 408 + + + + Expired Entries + + + + 9 + + + 6 + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 50 + + + + + + + + Double click on an entry to jump to it. + + + + + + + false + + + true + + + false + + + true + + + true + + + + Group + + + + + Title + + + + + Username + + + + + Expired + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + + + buttonBox + accepted() + ExpiredEntriesDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ExpiredEntriesDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/forms/MainWindow.ui b/src/forms/MainWindow.ui index 8402d6a..007a6c2 100644 --- a/src/forms/MainWindow.ui +++ b/src/forms/MainWindow.ui @@ -25,41 +25,65 @@ 6 - - - - 7 - 7 - 0 - 60 - - + - Qt::Horizontal + Qt::Vertical - - - false - + 7 7 - 30 - 0 + 0 + 60 - - true - - - true - - - false + + Qt::Horizontal + + + false + + + + 7 + 7 + 30 + 0 + + + + true + + + true + + + false + + + + + false + + + + 7 + 7 + 70 + 0 + + + + QAbstractItemView::ExtendedSelection + + + false + + - + false @@ -67,43 +91,22 @@ 7 7 - 70 - 0 + 0 + 10
- - QAbstractItemView::ExtendedSelection + + + 0 + 30 + - - false + + true
- - - - false - - - - 7 - 4 - 0 - 10 - - - - - 16777215 - 60 - - - - true - - - @@ -123,13 +126,6 @@ - - - E&xtras - - - - &File @@ -220,6 +216,14 @@ + + + E&xtras + + + + + @@ -518,17 +522,28 @@ Group (search results only) + + + Show Expired Entries... + + + Show Expired Entries... + + + Show Expired Entries + + - KeepassGroupView + KeepassEntryView QTreeWidget -
../../src/lib/GroupView.h
+
../../src/lib/EntryView.h
- KeepassEntryView + KeepassGroupView QTreeWidget -
../../src/lib/EntryView.h
+
../../src/lib/GroupView.h
diff --git a/src/forms/SearchDlg.ui b/src/forms/SearchDlg.ui index 438a705..5eba4e9 100644 --- a/src/forms/SearchDlg.ui +++ b/src/forms/SearchDlg.ui @@ -1,286 +1,285 @@ - - - - Search_Dlg - - - - 0 - 0 - 390 - 260 - - - - - 0 - 0 - 0 - 0 - - - + Search_Dlg + + + + 0 + 0 + 390 + 280 + + + + + 0 + 0 + 0 + 0 + + + + + 390 + 280 + + + + + 390 + 280 + + + + Search... + + + + 9 + + + 6 + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + - 390 - 260 + 20 + 50 - - - - 390 - 260 - - - - Search... - - - - - 10 - 60 - 90 - 20 - - - - Search For: - - - - - - 110 - 60 - 270 - 21 - - - - - - - 110 - 110 - 170 - 20 - - - - Regular E&xpression - - - Alt+X - - - - - - 110 - 90 - 250 - 20 - - - - &Case Sensitive - - - Alt+C - - - - - - 0 - 0 - 390 - 50 - - - - - - - true - - - - - - 10 - 150 - 370 - 70 - - - + + + + + + + 0 + + + 4 + + + + + Qt::Horizontal + + + QSizePolicy::Maximum + + + + 40 + 20 + + + + + + + Include: - - - - - 20 - 20 - 110 - 20 - - - - &Titles - - - Alt+T - - - - - - 20 - 40 - 110 - 20 - - - - &Usernames - - - Alt+U - - - - - - 140 - 40 - 120 - 20 - - - - C&omments - - - Alt+O - - - - - - 260 - 20 - 100 - 20 - - - - U&RLs + + + + 9 - - Alt+R + + 6 + + + + Pass&words + + + Alt+W + + + + + + + A&nhang + + + Alt+N + + + + + + + U&RLs + + + Alt+R + + + + + + + C&omments + + + Alt+O + + + + + + + &Usernames + + + Alt+U + + + + + + + &Titles + + + Alt+T + + + + - - - - 260 - 40 - 100 - 20 - - - - A&nhang - - - Alt+N - - - - - - 140 - 20 - 110 - 20 - - - - Pass&words - - - Alt+W - + + + + + 0 + + + 0 + + + + + &Case Sensitive + + + Alt+C + + + + + + + Regular E&xpression + + + Alt+X + + + + + + + Include Subgroups (recursive) + + + + + + + + + + + + Search For: + - - - - - 170 - 230 - 97 - 23 - - - + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + - 0 - 0 - 0 - 0 + 0 + 0 + 0 + 0 - - + + Search - - - - - - 280 - 230 - 97 - 23 - - - + + + + + + Clo&se - - + + Alt+S - - - - - - 110 - 130 - 271 - 22 - - - - Include Subgroups (recursive) - - - - - - - Edit_Search - checkBox_Cs - checkBox_regExp - checkBox_Title - checkBox_Username - checkBox_Password - checkBox_Comment - checkBox_URL - checkBox_Attachment - Button_Search - Button_Close - - - + + + + + + + + + + Edit_Search + checkBox_Cs + checkBox_regExp + checkBox_Title + checkBox_Username + checkBox_Password + checkBox_Comment + checkBox_URL + checkBox_Attachment + Button_Search + Button_Close + + + diff --git a/src/forms/SettingsDlg.ui b/src/forms/SettingsDlg.ui index 8628555..0739830 100644 --- a/src/forms/SettingsDlg.ui +++ b/src/forms/SettingsDlg.ui @@ -52,9 +52,6 @@ - - The integration plugins provide features like usage of the native file dialogs and message boxes of the particular desktop environments. - QTabWidget::North @@ -62,9 +59,12 @@ QTabWidget::Rounded - 4 + 0 + + The integration plugins provide features like usage of the native file dialogs and message boxes of the particular desktop environments. + General @@ -593,6 +593,43 @@ + + + + Unified Title and Toolbar + + + + + + + 0 + + + 6 + + + + + Customize Entry Detail View... + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + @@ -894,12 +931,19 @@ - + + + The directory where storage devices like CDs and memory sticks are normally mounted. + + - Mounting Root: + Media Root: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -908,6 +952,9 @@ Browser Command: + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + @@ -946,10 +993,87 @@ + + + + Auto-Type Fine Tuning + + + + 9 + + + 6 + + + + + Time between the activation of an auto-type action by the user and the first simulated key stroke. + + + ms + + + 10000 + + + + + + + Pre-Gap: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Key Stroke Delay: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Delay between two simulated key strokes. Increase this if Auto-Type is randomly skipping characters. + + + ms + + + 10000 + + + + + + + + Enable this if you want to use your bookmarks and the last opened file independet from their absolute paths. This is especially useful when using KeePassX portably and therefore with changing mount points in the file system. + - Save relative paths + Save relative paths (bookmarks and last file) diff --git a/src/lib/AutoType_X11.cpp b/src/lib/AutoType_X11.cpp index 97459bb..475c8c3 100644 --- a/src/lib/AutoType_X11.cpp +++ b/src/lib/AutoType_X11.cpp @@ -31,15 +31,15 @@ QWidget* AutoType::MainWin=NULL; int AutoType::getModifiers(Display *d,KeySym keysym, int keycode){ -int SymsPerKey; -KeySym* Syms=XGetKeyboardMapping(d,keycode,1,&SymsPerKey); -int c=-1; -for(int i=0;i<4;i++) - if(Syms[i]==keysym){ - c=i; break;} -Q_ASSERT(c!=-1); -XFree(Syms); -return c; + int SymsPerKey; + KeySym* Syms=XGetKeyboardMapping(d,keycode,1,&SymsPerKey); + int c=-1; + for(int i=0;i<4;i++) + if(Syms[i]==keysym){ + c=i; break;} + Q_ASSERT(c!=-1); + XFree(Syms); + return c; } void AutoType::releaseModifiers(Display* d,int mods){ @@ -47,310 +47,310 @@ pressModifiers(d,mods,False); } void AutoType::pressModifiers(Display* d,int mods,bool press){ -int keycode; -switch(mods){ - case 0: //no modifier - break; - case 1: //Shift - XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,2); - break; - case 2: //AltGr - XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2); - break; - case 3: //Shift+AltGr - XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,2); - XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2); - break; -} + int keycode; + switch(mods){ + case 0: //no modifier + break; + case 1: //Shift + XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,2); + break; + case 2: //AltGr + XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2); + break; + case 3: //Shift+AltGr + XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,2); + XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2); + break; + } } -void AutoType::perform(IEntryHandle* entry, QString& err){ -struct timespec timeOut,remains; -timeOut.tv_sec = 0; -timeOut.tv_nsec = 30000000; /* 300 milliseconds */ -for(int i=0;i<10;i++)nanosleep(&timeOut, &remains); - -QString str; -QString comment=entry->comment(); -int c=comment.count("Auto-Type:"); -if(c>1){ - err=tr("More than one 'Auto-Type:' key sequence found.\nAllowed is only one per entry."); - return;} -if(c==1){ - int start=comment.indexOf("Auto-Type:")+10; - int len; - if(comment.size()==10)return; - for(len=0;len Keys; -for(int i=0;icomment(); + int c=comment.count("Auto-Type:"); + if(c>1){ + err=tr("More than one 'Auto-Type:' key sequence found.\nAllowed is only one per entry."); + return;} + if(c==1){ + int start=comment.indexOf("Auto-Type:")+10; + int len; + if(comment.size()==10)return; + for(len=0;len Keys; + for(int i=0;i=str.size()){ + err=tr("Syntax Error in Auto-Type sequence near character %1\n\ + Found '{' without closing '}'").arg(i+10); + return; + } + templateToKeysyms(tmpl.toLower(),Keys,entry); + continue; } - if(i>=str.size()){ - err=tr("Syntax Error in Auto-Type sequence near character %1\n\ - Found '{' without closing '}'").arg(i+10); - return; - } - templateToKeysyms(tmpl.toLower(),Keys,entry); - continue; + else + Keys << getKeysym(str[i]); } - else - Keys << getKeysym(str[i]); -} - -MainWin->hide(); -Display* pDisplay = XOpenDisplay( NULL ); -for(int i=0;ishow(); + + MainWin->hide(); + Display* pDisplay = XOpenDisplay( NULL ); + for(int i=0;ishow(); } void AutoType::templateToKeysyms(const QString& tmpl, QList& keys,IEntryHandle* entry){ -//tmpl must be lower case!!! -if(!tmpl.compare("title")){ - stringToKeysyms(entry->title(),keys); - return;} -if(!tmpl.compare("username")){ - stringToKeysyms(entry->username(),keys); - return;} -if(!tmpl.compare("url")){ - stringToKeysyms(entry->url(),keys); - return;} -if(!tmpl.compare("password")){ - SecString password=entry->password(); - password.unlock(); - stringToKeysyms(password,keys); - return; -} -if(!tmpl.compare("space")){ - keys << getKeysym(' '); - return;} - -if(!tmpl.compare("backspace") || !tmpl.compare("bs") || !tmpl.compare("bksp")){ - keys << XK_BackSpace; - return;} - -if(!tmpl.compare("break")){ - keys << XK_Break; - return;} - -if(!tmpl.compare("capslock")){ - keys << XK_Caps_Lock; - return;} - -if(!tmpl.compare("del") || !tmpl.compare("delete")){ - keys << XK_Delete; - return;} - -if(!tmpl.compare("end")){ - keys << XK_End; - return;} - -if(!tmpl.compare("enter")){ - keys << XK_Return; - return;} - -if(!tmpl.compare("esc")){ - keys << XK_Escape; - return;} - -if(!tmpl.compare("help")){ - keys << XK_Help; - return;} - -if(!tmpl.compare("home")){ - keys << XK_Home; - return;} - -if(!tmpl.compare("ins")){ - keys << XK_Insert; - return;} - -if(!tmpl.compare("numlock")){ - keys << XK_Num_Lock; - return;} - -if(!tmpl.compare("scroll")){ - keys << XK_Scroll_Lock; - return;} - -if(!tmpl.compare("pgdn")){ - keys << XK_Page_Down; - return;} - -if(!tmpl.compare("pgup")){ - keys << XK_Page_Up; - return;} - -if(!tmpl.compare("prtsc")){ - keys << XK_3270_PrintScreen; - return;} - -if(!tmpl.compare("up")){ - keys << XK_Up; - return;} - -if(!tmpl.compare("down")){ - keys << XK_Down; - return;} - -if(!tmpl.compare("left")){ - keys << XK_Left; - return;} - -if(!tmpl.compare("right")){ - keys << XK_Right; - return;} - -if(!tmpl.compare("f1")){ - keys << XK_F1; - return;} - -if(!tmpl.compare("f2")){ - keys << XK_F2; - return;} - -if(!tmpl.compare("f3")){ - keys << XK_F3; - return;} - -if(!tmpl.compare("f4")){ - keys << XK_F4; - return;} - -if(!tmpl.compare("f5")){ - keys << XK_F5; - return;} - -if(!tmpl.compare("f6")){ - keys << XK_F6; - return;} - -if(!tmpl.compare("f7")){ - keys << XK_F7; - return;} - -if(!tmpl.compare("f8")){ - keys << XK_F8; - return;} - -if(!tmpl.compare("f9")){ - keys << XK_F9; - return;} - -if(!tmpl.compare("f10")){ - keys << XK_F10; - return;} - -if(!tmpl.compare("f11")){ - keys << XK_F11; - return;} - -if(!tmpl.compare("f12")){ - keys << XK_F12; - return;} - -if(!tmpl.compare("f13")){ - keys << XK_F13; - return;} - -if(!tmpl.compare("f14")){ - keys << XK_F14; - return;} - -if(!tmpl.compare("f15")){ - keys << XK_F15; - return;} - -if(!tmpl.compare("f16")){ - keys << XK_F16; - return;} - -if(!tmpl.compare("add") || !tmpl.compare("plus")){ - keys << getKeysym('+'); - return;} - -if(!tmpl.compare("subtract")){ - keys << getKeysym('-'); - return;} - -if(!tmpl.compare("multiply")){ - keys << getKeysym('+'); - return;} - -if(!tmpl.compare("divide")){ - keys << getKeysym('/'); - return;} - -if(!tmpl.compare("at")){ - keys << getKeysym('@'); - return;} - -if(!tmpl.compare("percent")){ - keys << getKeysym('%'); - return;} - -if(!tmpl.compare("caret")){ - keys << getKeysym('^'); - return;} - -if(!tmpl.compare("tilde")){ - keys << getKeysym('~'); - return;} - -if(!tmpl.compare("leftbrace")){ - keys << getKeysym('{'); - return;} - -if(!tmpl.compare("rightbrace")){ - keys << getKeysym('}'); - return;} - -if(!tmpl.compare("leftparen")){ - keys << getKeysym('('); - return;} - -if(!tmpl.compare("rightparen")){ - keys << getKeysym(')'); - return;} - -if(!tmpl.compare("winl")){ - keys << XK_Super_L; - return;} - -if(!tmpl.compare("winr")){ - keys << XK_Super_R; - return;} - -if(!tmpl.compare("win")){ - keys << XK_Super_L; - return;} - -if(!tmpl.compare("tab")){ - keys << XK_Tab; - return;} + //tmpl must be lower case!!! + if(!tmpl.compare("title")){ + stringToKeysyms(entry->title(),keys); + return;} + if(!tmpl.compare("username")){ + stringToKeysyms(entry->username(),keys); + return;} + if(!tmpl.compare("url")){ + stringToKeysyms(entry->url(),keys); + return;} + if(!tmpl.compare("password")){ + SecString password=entry->password(); + password.unlock(); + stringToKeysyms(password,keys); + return; + } + if(!tmpl.compare("space")){ + keys << getKeysym(' '); + return;} + + if(!tmpl.compare("backspace") || !tmpl.compare("bs") || !tmpl.compare("bksp")){ + keys << XK_BackSpace; + return;} + + if(!tmpl.compare("break")){ + keys << XK_Break; + return;} + + if(!tmpl.compare("capslock")){ + keys << XK_Caps_Lock; + return;} + + if(!tmpl.compare("del") || !tmpl.compare("delete")){ + keys << XK_Delete; + return;} + + if(!tmpl.compare("end")){ + keys << XK_End; + return;} + + if(!tmpl.compare("enter")){ + keys << XK_Return; + return;} + + if(!tmpl.compare("esc")){ + keys << XK_Escape; + return;} + + if(!tmpl.compare("help")){ + keys << XK_Help; + return;} + + if(!tmpl.compare("home")){ + keys << XK_Home; + return;} + + if(!tmpl.compare("ins")){ + keys << XK_Insert; + return;} + + if(!tmpl.compare("numlock")){ + keys << XK_Num_Lock; + return;} + + if(!tmpl.compare("scroll")){ + keys << XK_Scroll_Lock; + return;} + + if(!tmpl.compare("pgdn")){ + keys << XK_Page_Down; + return;} + + if(!tmpl.compare("pgup")){ + keys << XK_Page_Up; + return;} + + if(!tmpl.compare("prtsc")){ + keys << XK_3270_PrintScreen; + return;} + + if(!tmpl.compare("up")){ + keys << XK_Up; + return;} + + if(!tmpl.compare("down")){ + keys << XK_Down; + return;} + + if(!tmpl.compare("left")){ + keys << XK_Left; + return;} + + if(!tmpl.compare("right")){ + keys << XK_Right; + return;} + + if(!tmpl.compare("f1")){ + keys << XK_F1; + return;} + + if(!tmpl.compare("f2")){ + keys << XK_F2; + return;} + + if(!tmpl.compare("f3")){ + keys << XK_F3; + return;} + + if(!tmpl.compare("f4")){ + keys << XK_F4; + return;} + + if(!tmpl.compare("f5")){ + keys << XK_F5; + return;} + + if(!tmpl.compare("f6")){ + keys << XK_F6; + return;} + + if(!tmpl.compare("f7")){ + keys << XK_F7; + return;} + + if(!tmpl.compare("f8")){ + keys << XK_F8; + return;} + + if(!tmpl.compare("f9")){ + keys << XK_F9; + return;} + + if(!tmpl.compare("f10")){ + keys << XK_F10; + return;} + + if(!tmpl.compare("f11")){ + keys << XK_F11; + return;} + + if(!tmpl.compare("f12")){ + keys << XK_F12; + return;} + + if(!tmpl.compare("f13")){ + keys << XK_F13; + return;} + + if(!tmpl.compare("f14")){ + keys << XK_F14; + return;} + + if(!tmpl.compare("f15")){ + keys << XK_F15; + return;} + + if(!tmpl.compare("f16")){ + keys << XK_F16; + return;} + + if(!tmpl.compare("add") || !tmpl.compare("plus")){ + keys << getKeysym('+'); + return;} + + if(!tmpl.compare("subtract")){ + keys << getKeysym('-'); + return;} + + if(!tmpl.compare("multiply")){ + keys << getKeysym('+'); + return;} + + if(!tmpl.compare("divide")){ + keys << getKeysym('/'); + return;} + + if(!tmpl.compare("at")){ + keys << getKeysym('@'); + return;} + + if(!tmpl.compare("percent")){ + keys << getKeysym('%'); + return;} + + if(!tmpl.compare("caret")){ + keys << getKeysym('^'); + return;} + + if(!tmpl.compare("tilde")){ + keys << getKeysym('~'); + return;} + + if(!tmpl.compare("leftbrace")){ + keys << getKeysym('{'); + return;} + + if(!tmpl.compare("rightbrace")){ + keys << getKeysym('}'); + return;} + + if(!tmpl.compare("leftparen")){ + keys << getKeysym('('); + return;} + + if(!tmpl.compare("rightparen")){ + keys << getKeysym(')'); + return;} + + if(!tmpl.compare("winl")){ + keys << XK_Super_L; + return;} + + if(!tmpl.compare("winr")){ + keys << XK_Super_R; + return;} + + if(!tmpl.compare("win")){ + keys << XK_Super_L; + return;} + + if(!tmpl.compare("tab")){ + keys << XK_Tab; + return;} } diff --git a/src/lib/EntryView.cpp b/src/lib/EntryView.cpp index c767192..f1b1e93 100644 --- a/src/lib/EntryView.cpp +++ b/src/lib/EntryView.cpp @@ -461,6 +461,11 @@ void KeepassEntryView::updateColumns(){ resizeColumns(); } +void KeepassEntryView::refreshItems(){ + for (int i=0;icount();i++){ ColumnOrder[columnListIndex(header()->logicalIndex(i))]=i; @@ -643,3 +648,13 @@ bool EntryViewItem::operator<(const QTreeWidgetItem& other)const{ } return DateThis < DateOther; } + + +void KeepassEntryView::setCurrentEntry(IEntryHandle* entry){ + bool found=false; + int i=0; + for(i;iEntryHandle==entry){found=true; break;} + if(!found)return; + setCurrentItem(Items[i]); +} diff --git a/src/lib/EntryView.h b/src/lib/EntryView.h index b96e86d..9a3e797 100644 --- a/src/lib/EntryView.h +++ b/src/lib/EntryView.h @@ -43,12 +43,14 @@ class KeepassEntryView:public QTreeWidget{ void showSearchResults(); void showGroup(IGroupHandle* group); void updateColumns(); + void refreshItems(); int columnListIndex(int LogicalIndex); IDatabase* db; QListItems; QList SearchResults; QMenu *ContextMenu; - QVarLengthArrayColumns; + QVarLengthArrayColumns; + void setCurrentEntry(IEntryHandle* entry); private: void setEntry(IEntryHandle* entry); void updateEntry(EntryViewItem*); diff --git a/src/lib/GroupView.cpp b/src/lib/GroupView.cpp index 8451fac..84d08bd 100644 --- a/src/lib/GroupView.cpp +++ b/src/lib/GroupView.cpp @@ -172,8 +172,14 @@ void KeepassGroupView::OnCurrentGroupChanged(QTreeWidgetItem* cur,QTreeWidgetIte } - - +void KeepassGroupView::setCurrentGroup(IGroupHandle* group){ + bool found=false; + int i=0; + for(i;iGroupHandle==group){found=true; break;} + if(!found)return; + setCurrentItem(Items[i]); +} void KeepassGroupView::dragEnterEvent ( QDragEnterEvent * event ){ LastHoverItem=NULL; diff --git a/src/lib/GroupView.h b/src/lib/GroupView.h index 69bfc22..07b56b4 100644 --- a/src/lib/GroupView.h +++ b/src/lib/GroupView.h @@ -38,6 +38,7 @@ class KeepassGroupView:public QTreeWidget{ GroupViewItem* SearchResultItem; void createItems(); void showSearchResults(); + void setCurrentGroup(IGroupHandle* group); private: virtual void dragEnterEvent(QDragEnterEvent* event); diff --git a/src/main.cpp b/src/main.cpp index 9b9d491..240c532 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -58,37 +58,17 @@ using namespace std; #define CSTR(x)(x.toUtf8().data()) +QHashPixmapCache; +QHashIconCache; + CConfig config; QSettings* settings; QString AppDir; QString PluginLoadError; bool TrActive; -QPixmap *Icon_Key32x32; -QPixmap *Icon_Settings32x32; -QPixmap *Icon_Search32x32; -QPixmap *Icon_I18n32x32; -QPixmap *Icon_Ok16x16; -QPixmap *EntryIcons; -QIcon *Icon_FileNew; -QIcon *Icon_FileOpen; -QIcon *Icon_FileClose; -QIcon *Icon_FileSave; -QIcon *Icon_FileSaveAs; -QIcon *Icon_Exit; -QIcon *Icon_File_Export; -QIcon *Icon_EditDelete; -QIcon *Icon_EditAdd; -QIcon *Icon_EditEdit; -QIcon *Icon_EditUsernameToCb; -QIcon *Icon_EditPasswordToCb; -QIcon *Icon_EditClone; -QIcon *Icon_EditOpenUrl; -QIcon *Icon_EditSearch; -QIcon *Icon_Configure; -QIcon *Icon_Help; -QIcon *Icon_AutoType; -QIcon *Icon_Swap; -QIcon *Icon_FileSaveDisabled; +QString DetailViewTemplate; + +QPixmap* EntryIcons; inline void loadImages(); inline void parseCmdLineArgs(int argc, char** argv,QString &ArgFile,QString& ArgCfg,QString& ArgLang); @@ -176,7 +156,7 @@ int main(int argc, char **argv) if(loadTranslation(translator,"keepass-",loc.name(),QStringList() << app->applicationDirPath()+"/../share/keepass/i18n/" - << QDir::homePath()+"/.keepass/" )) + << QDir::homePath()+"/.keepassx/" )) {app->installTranslator(translator); TrActive=true;} else{ @@ -201,6 +181,14 @@ int main(int argc, char **argv) delete qtTranslator; } + + QFile templ(QDir::homePath()+"/.keepassx/detailview-template.html"); ///FIXME ArgCfg + if(templ.open(QIODevice::ReadOnly)){ + DetailViewTemplate=QString::fromUtf8(templ.readAll()); + templ.close(); + } + else loadDefaultDetailViewTemplate(); + loadImages(); initYarrow(); //init random number generator SecString::generateSessionKey(); @@ -217,6 +205,15 @@ int main(int argc, char **argv) QObject::tr("Could not save configuration file.\nMake sure you have write access to '~/.keepass'."), QObject::tr("OK"),"","",0.0); + if(templ.open(QIODevice::WriteOnly)){ + templ.write(DetailViewTemplate.toUtf8()); + templ.close(); + } + else{ + qWarning("Failed to save detail view template: %s",decodeFileError(templ.error()).toUtf8().data()); + } + + fileDlgHistory.save(); delete app; delete settings; @@ -224,9 +221,25 @@ int main(int argc, char **argv) } +void loadDefaultDetailViewTemplate(){ + QFile templ(":/default-detailview.html"); + templ.open(QIODevice::ReadOnly); + DetailViewTemplate=QString::fromUtf8(templ.readAll()); + templ.close(); + DetailViewTemplate.replace("Group",QCoreApplication::translate("DetailViewTemplate","Group")); + DetailViewTemplate.replace("Title",QCoreApplication::translate("DetailViewTemplate","Title")); + DetailViewTemplate.replace("Username",QCoreApplication::translate("DetailViewTemplate","Username")); + DetailViewTemplate.replace("Password",QCoreApplication::translate("DetailViewTemplate","Password")); + DetailViewTemplate.replace("URL",QCoreApplication::translate("DetailViewTemplate","URL")); + DetailViewTemplate.replace("Creation",QCoreApplication::translate("DetailViewTemplate","Creation")); + DetailViewTemplate.replace("Last Access",QCoreApplication::translate("DetailViewTemplate","Last Access")); + DetailViewTemplate.replace("Last Modification",QCoreApplication::translate("DetailViewTemplate","Last Modification")); + DetailViewTemplate.replace("Expiration",QCoreApplication::translate("DetailViewTemplate","Expiration")); + DetailViewTemplate.replace("Comment",QCoreApplication::translate("DetailViewTemplate","Comment")); +} - -void createBanner(QLabel *Banner,QPixmap* symbol,QString text){ +//obsolete +void createBanner(QLabel *Banner,const QPixmap* symbol,QString text){ QPixmap Pixmap; createBanner(&Pixmap,symbol,text ,Banner->width() @@ -236,11 +249,11 @@ void createBanner(QLabel *Banner,QPixmap* symbol,QString text){ Banner->setPixmap(Pixmap); } -void createBanner(QPixmap* Pixmap, QPixmap* IconAlpha,const QString& Text,int Width){ +void createBanner(QPixmap* Pixmap,const QPixmap* IconAlpha,const QString& Text,int Width){ createBanner(Pixmap,IconAlpha,Text,Width,config.BannerColor1,config.BannerColor2,config.BannerTextColor); } -void createBanner(QPixmap* Pixmap, QPixmap* IconAlpha,const QString& Text,int Width, QColor Color1, QColor Color2, QColor TextColor){ +void createBanner(QPixmap* Pixmap,const QPixmap* IconAlpha,const QString& Text,int Width, QColor Color1, QColor Color2, QColor TextColor){ *Pixmap=QPixmap(Width,50); QPainter painter(Pixmap); QLinearGradient grad(0,0,Width,0); @@ -296,7 +309,7 @@ void openBrowser(QString UrlString){ } } - +///TODO 0.2.3 remove void loadImg(QString name,QPixmap& Img){ if(Img.load(AppDir+"/../share/keepass/icons/"+name)==false){ if(Img.load(AppDir+"/share/"+name)==false){ @@ -307,66 +320,44 @@ if(Img.load(AppDir+"/../share/keepass/icons/"+name)==false){ } - -#define _loadIcon(Icon,PATH)\ - Icon=new QIcon(ThemeDir+PATH); - - +///TODO 0.2.3 remove void loadImages(){ + bool small=true; + QString ThemeDir=AppDir+"/../share/keepass/icons/nuvola/32x32"; + QPixmap tmpImg; + loadImg("clientic.png",tmpImg); + EntryIcons=new QPixmap[BUILTIN_ICONS]; + for(int i=0;ipixmap(32,32,QIcon::Disabled)); +const QPixmap* getPixmap(const QString& name){ + QPixmap* CachedPixmap=PixmapCache.value(name); + if(CachedPixmap) + return CachedPixmap; + QImage img; + if(!img.load(AppDir+"/../share/keepass/icons/"+name+".png")){ + //ERROR + qWarning("%s",CSTR(name)); + } + QPixmap* NewPixmap=new QPixmap(QPixmap::fromImage(img)); + PixmapCache.insert(name,NewPixmap); + return NewPixmap; } diff --git a/src/main.h b/src/main.h index e5be136..66b1f8b 100644 --- a/src/main.h +++ b/src/main.h @@ -34,47 +34,25 @@ typedef enum tKeyType {PASSWORD=0,KEYFILE=1,BOTH=2}; class CConfig; -void createBanner(QLabel *Banner,QPixmap* symbol,QString text); -void createBanner(QPixmap* Pixmap, QPixmap* IconAlpha,const QString& Text,int Width); -void createBanner(QPixmap* Pixmap, QPixmap* IconAlpha,const QString& Text,int Width, QColor Color1, QColor Color2, QColor TextColor); +void createBanner(QLabel *Banner,const QPixmap* symbol,QString text); +void createBanner(QPixmap* Pixmap, const QPixmap* IconAlpha,const QString& Text,int Width); +void createBanner(QPixmap* Pixmap, const QPixmap* IconAlpha,const QString& Text,int Width, QColor Color1, QColor Color2, QColor TextColor); void openBrowser(QString url); void showErrMsg(const QString& msg,QWidget* parent=NULL); +const QIcon& getIcon(const QString& name); +const QPixmap* getPixmap(const QString& name); QString decodeFileError(QFile::FileError Code); QString findPlugin(const QString& filename); QString makePathRelative(const QString& Abs,const QString& Cur); +void loadDefaultDetailViewTemplate(); extern QString PluginLoadError; extern CConfig config; extern QSettings *settings; extern QString AppDir; extern bool TrActive; +extern QString DetailViewTemplate; extern QPixmap *EntryIcons; -extern QPixmap *Icon_Key32x32; -extern QPixmap *Icon_Settings32x32; -extern QPixmap *Icon_Search32x32; -extern QPixmap *Icon_I18n32x32; -extern QPixmap *Icon_Ok16x16; -extern QIcon *Icon_FileNew; -extern QIcon *Icon_FileOpen; -extern QIcon *Icon_FileClose; -extern QIcon *Icon_FileSave; -extern QIcon *Icon_FileSaveAs; -extern QIcon *Icon_Exit; -extern QIcon *Icon_File_Export; -extern QIcon *Icon_EditDelete; -extern QIcon *Icon_EditAdd; -extern QIcon *Icon_EditEdit; -extern QIcon *Icon_EditDelete; -extern QIcon *Icon_EditUsernameToCb; -extern QIcon *Icon_EditPasswordToCb; -extern QIcon *Icon_EditClone; -extern QIcon *Icon_EditOpenUrl; -extern QIcon *Icon_EditSearch; -extern QIcon *Icon_Configure; -extern QIcon *Icon_Help; -extern QIcon *Icon_AutoType; -extern QIcon *Icon_Swap; -extern QIcon *Icon_FileSaveDisabled; #endif diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 771466e..5f80a2d 100755 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2006 by Tarek Saidi * + * Copyright (C) 2005-2007 by Tarek Saidi * * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * @@ -57,6 +57,8 @@ #include "dialogs/SimplePasswordDlg.h" #include "dialogs/PasswordGenDlg.h" #include "dialogs/CollectEntropyDlg.h" +#include "dialogs/CustomizeDetailViewDlg.h" +#include "dialogs/ExpiredEntriesDlg.h" #include #include @@ -77,7 +79,8 @@ KeepassMainWindow::KeepassMainWindow(const QString& ArgFile,QWidget *parent, Qt: setupUi(this); AutoType::MainWin=this; setGeometry(settings->value("Ui/MainWindowGeometry",QVariant(geometry())).toRect()); - splitter->restoreState(settings->value("Ui/SplitterPos").toByteArray()); + VSplitter->restoreState(settings->value("Ui/VSplitterPos").toByteArray()); + HSplitter->restoreState(settings->value("Ui/HSplitterPos").toByteArray()); SysTray=new QSystemTrayIcon(this); setupToolbar(); setupIcons(); @@ -89,6 +92,7 @@ KeepassMainWindow::KeepassMainWindow(const QString& ArgFile,QWidget *parent, Qt: statusBar()->addWidget(StatusBarSelection,85); statusBar()->setVisible(config.ShowStatusbar); setupConnections(); + FileOpen=false; if(ArgFile!=QString()) openDatabase(QDir::cleanPath(QDir::current().absoluteFilePath(ArgFile)),false); @@ -100,6 +104,7 @@ KeepassMainWindow::KeepassMainWindow(const QString& ArgFile,QWidget *parent, Qt: settings->setValue("LastFile",""); } + // DBus Server of Qt 4.2 does not work - 4.3 snapshot seems to work fine /* //dbusServer=new QDBusServer("unix:path=/tmp/KpxBus",this); //qDebug("DBUS: %s",dbusServer->lastError().message().toAscii().data()); @@ -155,6 +160,7 @@ void KeepassMainWindow::setupConnections(){ connect(ExtrasSettingsAction,SIGNAL(triggered(bool)),this,SLOT(OnExtrasSettings())); connect(ExtrasPasswordGenAction,SIGNAL(triggered(bool)),this,SLOT(OnExtrasPasswordGen())); + connect(ExtrasShowExpiredEntriesAction,SIGNAL(triggered(bool)),this,SLOT(OnExtrasShowExpiredEntries())); connect(HelpHandbookAction,SIGNAL(triggered()),this,SLOT(OnHelpHandbook())); connect(HelpAboutAction,SIGNAL(triggered()),this,SLOT(OnHelpAbout())); @@ -197,31 +203,34 @@ void KeepassMainWindow::setupToolbar(){ } void KeepassMainWindow::setupIcons(){ - setWindowIcon(QIcon(AppDir+"/../share/keepass/icons/keepassx.png")); - FileNewAction->setIcon(*Icon_FileNew); - FileOpenAction->setIcon(*Icon_FileOpen); - FileSaveAction->setIcon(*Icon_FileSave); - FileSaveAsAction->setIcon(*Icon_FileSaveAs); - FileCloseAction->setIcon(*Icon_FileClose); - FileSettingsAction->setIcon(*Icon_Configure); - FileExitAction->setIcon(*Icon_Exit); - EditNewEntryAction->setIcon(*Icon_EditAdd); - EditEditEntryAction->setIcon(*Icon_EditEdit); - EditDeleteEntryAction->setIcon(*Icon_EditDelete); - EditPasswordToClipboardAction->setIcon(*Icon_EditPasswordToCb); - EditUsernameToClipboardAction->setIcon(*Icon_EditUsernameToCb); - EditCloneEntryAction->setIcon(*Icon_EditClone); - EditOpenUrlAction->setIcon(*Icon_EditOpenUrl); - EditSaveAttachmentAction->setIcon(*Icon_FileSave); - EditNewGroupAction->setIcon(*Icon_EditAdd); - EditEditGroupAction->setIcon(*Icon_EditEdit); - EditDeleteGroupAction->setIcon(*Icon_EditDelete); - EditSearchAction->setIcon(*Icon_EditSearch); - EditGroupSearchAction->setIcon(*Icon_EditSearch); - ExtrasSettingsAction->setIcon(*Icon_Configure); - EditAutoTypeAction->setIcon(*Icon_AutoType); - HelpHandbookAction->setIcon(*Icon_Help); - SysTray->setIcon(QIcon(AppDir+"/../share/keepass/icons/keepassx_large.png")); + setWindowIcon(getIcon("keepassx")); + FileNewAction->setIcon(getIcon("filenew")); + FileOpenAction->setIcon(getIcon("fileopen")); + FileSaveAction->setIcon(getIcon("filesave")); + FileSaveAsAction->setIcon(getIcon("filesaveas")); + FileCloseAction->setIcon(getIcon("fileclose")); + FileSettingsAction->setIcon(getIcon("dbsettings")); + FileExitAction->setIcon(getIcon("exit")); + EditNewEntryAction->setIcon(getIcon("newentry")); + EditEditEntryAction->setIcon(getIcon("editentry")); + EditDeleteEntryAction->setIcon(getIcon("deleteentry")); + EditPasswordToClipboardAction->setIcon(getIcon("copypwd")); + EditUsernameToClipboardAction->setIcon(getIcon("copyusername")); + EditCloneEntryAction->setIcon(getIcon("cloneentry")); + EditOpenUrlAction->setIcon(getIcon("openurl")); + EditSaveAttachmentAction->setIcon(getIcon("filesave")); + EditNewGroupAction->setIcon(getIcon("newgroup")); + EditEditGroupAction->setIcon(getIcon("editgroup")); + EditDeleteGroupAction->setIcon(getIcon("deletegroup")); + EditSearchAction->setIcon(getIcon("dbsearch")); + EditGroupSearchAction->setIcon(getIcon("groupsearch")); + ExtrasSettingsAction->setIcon(getIcon("appsettings")); + ExtrasShowExpiredEntriesAction->setIcon(getIcon("expired")); + ExtrasPasswordGenAction->setIcon(getIcon("generator")); + EditAutoTypeAction->setIcon(getIcon("autotype")); + HelpHandbookAction->setIcon(getIcon("manual")); + HelpAboutAction->setIcon(getIcon("help")); + SysTray->setIcon(getIcon("keepassx_large")); if(config.ShowSysTrayIcon) SysTray->show(); } @@ -328,7 +337,7 @@ void KeepassMainWindow::openDatabase(QString filename,bool IsAuto){ if(!IsAuto){ config.LastKeyLocation=QString(); config.LastKeyType=PASSWORD;} - db=dynamic_cast(new StandardDatabase()); + db=dynamic_cast(new Kdb3Database()); CPasswordDialog PasswordDlg(this,db,IsAuto,false); PasswordDlg.setWindowTitle(filename); switch(PasswordDlg.exec()){ @@ -392,7 +401,7 @@ bool KeepassMainWindow::closeDatabase(){ void KeepassMainWindow::OnFileNewKdb(){ - IDatabase* db_new=dynamic_cast(new StandardDatabase()); + IDatabase* db_new=dynamic_cast(new Kdb3Database()); db_new->create(); CPasswordDialog dlg(this,db_new,false,true); dlg.setWindowTitle(tr("New Database")); @@ -451,12 +460,13 @@ FileSaveAsAction->setEnabled(IsOpen); FileCloseAction->setEnabled(IsOpen); FileSettingsAction->setEnabled(IsOpen); FileChangeKeyAction->setEnabled(IsOpen); - EditSearchAction->setEnabled(IsOpen); GroupView->setEnabled(IsOpen); EntryView->setEnabled(IsOpen); DetailView->setEnabled(IsOpen); QuickSearchEdit->setEnabled(IsOpen); +ExtrasShowExpiredEntriesAction->setEnabled(IsOpen); + if(!IsOpen){ EditNewGroupAction->setEnabled(false); EditEditGroupAction->setEnabled(false); @@ -482,14 +492,14 @@ else{ void KeepassMainWindow::setStateFileModified(bool mod){ if(!FileOpen){ - FileSaveAction->setIcon(*Icon_FileSave); + FileSaveAction->setIcon(getIcon("filesave")); return; } ModFlag=mod; if(mod) - FileSaveAction->setIcon(*Icon_FileSave); + FileSaveAction->setIcon(getIcon("filesave")); else - FileSaveAction->setIcon(*Icon_FileSaveDisabled); + FileSaveAction->setIcon(getIcon("filesavedisabled")); } void KeepassMainWindow::setStateGroupSelected(SelectionState s){ @@ -526,28 +536,75 @@ void KeepassMainWindow::updateDetailView(){ return; } + QString templ=DetailViewTemplate; IEntryHandle* entry=((EntryViewItem*)(EntryView->selectedItems()[0]))->EntryHandle; - QString str=tr("Group: %1 Title: %2 Username: %3 URL:
%4 Password: %5 Creation: %6 Last Change: %7 LastAccess: %8 Expires: %9"); - - str=str.arg(entry->group()->title()).arg(entry->title()); - - if(!config.ListView_HideUsernames) str=str.arg(entry->username()); - else str=str.arg("****"); - - str=str.arg(entry->url()); + templ.replace("%group%",entry->group()->title()); + templ.replace("%title%",entry->title()); + if(config.ListView_HideUsernames)templ.replace("%username%","****"); + else templ.replace("%username%",entry->username()); if(!config.ListView_HidePasswords){ SecString password=entry->password(); password.unlock(); - str=str.arg(password.string()); + templ.replace("%password%",password.string()); } - else str=str.arg("****"); + else templ.replace("%password%","****"); + templ.replace("%url%",entry->url()); + templ.replace("%creation%",entry->creation().toString(Qt::LocalDate)); + templ.replace("%lastmod%",entry->lastMod().toString(Qt::LocalDate)); + templ.replace("%lastaccess%",entry->lastAccess().toString(Qt::LocalDate)); + templ.replace("%expire%",entry->expire().toString(Qt::LocalDate)); + templ.replace("%comment%",entry->comment()); + templ.replace("%attachment%",entry->binaryDesc()); + + if(entry->expire()!=Date_Never){ + int secs=QDateTime::currentDateTime().secsTo(entry->expire()); + if(secs < 0) + templ.replace("%expire-timeleft%",tr("expired")); + else{ + int years=0; + int months=0; + int days=0; + years=secs/(86400*365); + secs-=years*(86400*365); + months=secs/(86400*30); + secs-=months*(86400*30); + days=secs/86400; + + QString out; + + if(months==1) + out=tr("1 Month"); + if(months>1) + out=tr("%1 Months").arg(months); + + if(years){ + if(out!=QString()) + out.prepend(tr(", ")); + if(years==1) + out.prepend(tr("1 Year")); + if(years>1) + out.prepend(tr("%1 Years").arg(years)); + } + else if(days){ + if(out!=QString()) + out.append(tr(", ")); + if(days==1) + out.append(tr("1 Day")); + if(days>1) + out.append(tr("%1 Days").arg(days)); + } + + if(!days && !years && !months) + out=tr("less than 1 day"); + + templ.replace("%expire-timeleft%",out); + } + } + else + templ.replace("%expire-timeleft%","-"); - str=str .arg(entry->creation().toString(Qt::LocalDate)) - .arg(entry->lastMod().toString(Qt::LocalDate)) - .arg(entry->lastAccess().toString(Qt::LocalDate)) - .arg(entry->expire().toString(Qt::LocalDate)); - DetailView->setHtml(str); + DetailView->setHtml(templ); } @@ -688,7 +745,7 @@ void KeepassMainWindow::OnExport(QAction* action){ void KeepassMainWindow::OnImport(QAction* action){ if(FileOpen) if(!closeDatabase())return; - IDatabase* tmpdb=dynamic_cast(new StandardDatabase()); + IDatabase* tmpdb=dynamic_cast(new Kdb3Database()); tmpdb->create(); if(dynamic_cast(action->data().value())->importDatabase(this,tmpdb)){ CPasswordDialog dlg(this,tmpdb,false,true); @@ -726,7 +783,7 @@ for(int i=0; iSearchResults=dlg.Result; GroupView->showSearchResults(); @@ -766,7 +823,7 @@ void KeepassMainWindow::OnColumnVisibilityChanged(QAction* action){ void KeepassMainWindow::OnUsernPasswVisibilityChanged(bool value){ config.ListView_HidePasswords=ViewHidePasswordsAction->isChecked(); config.ListView_HideUsernames=ViewHideUsernamesAction->isChecked(); -//EntryView->refreshItems(); + EntryView->refreshItems(); } void KeepassMainWindow::OnFileModified(){ @@ -781,7 +838,8 @@ void KeepassMainWindow::closeEvent(QCloseEvent* e){ } settings->setValue("Ui/MainWindowGeometry",QVariant(geometry())); - settings->setValue("Ui/SplitterPos",splitter->saveState()); + settings->setValue("Ui/VSplitterPos",VSplitter->saveState()); + settings->setValue("Ui/HSplitterPos",HSplitter->saveState()); config.ShowStatusbar=statusBar()->isVisible(); if(FileOpen){ @@ -800,14 +858,14 @@ void KeepassMainWindow::closeEvent(QCloseEvent* e){ void KeepassMainWindow::OnExtrasSettings(){ CSettingsDlg dlg(this); - if(dlg.exec()==1){ + if(dlg.exec()==QDialog::Accepted){ EntryView->setAlternatingRowColors(config.AlternatingRowColors); SysTray->setVisible(config.ShowSysTrayIcon); } } void KeepassMainWindow::OnHelpAbout(){ -CAboutDialog dlg(this); +AboutDialog dlg(this); dlg.exec(); } @@ -896,4 +954,13 @@ void KeepassMainWindow::saveLastFilename(const QString& filename){ else settings->setValue("LastFile",filename); } -} \ No newline at end of file +} + +void KeepassMainWindow::OnExtrasShowExpiredEntries(){ + ExpiredEntriesDialog dlg(this,db,db->expiredEntries()); + if(dlg.exec()==QDialog::Accepted){ + GroupView->setCurrentGroup(dlg.SelectedEntry->group()); + EntryView->setCurrentEntry(dlg.SelectedEntry); + } + +} diff --git a/src/mainwindow.h b/src/mainwindow.h index 7f6349c..c121e36 100755 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -81,6 +81,7 @@ class KeepassMainWindow : public QMainWindow, public Ui_MainWindow{ void OnFileModified(); void OnExtrasSettings(); void OnExtrasPasswordGen(); + void OnExtrasShowExpiredEntries(); void OnHelpAbout(); void OnHelpHandbook(); void OnItemExpanded(QTreeWidgetItem*); diff --git a/src/src.pro b/src/src.pro index 152d007..6c0b6ff 100755 --- a/src/src.pro +++ b/src/src.pro @@ -8,7 +8,8 @@ DEPENDPATH += "crypto \ forms \ import \ lib \ - translations" + translations \ + res" INSTALLS += target data data.files += ../share/keepass/* TARGET = ../bin/keepassx @@ -47,7 +48,10 @@ FORMS += forms/EditGroupDlg.ui \ forms/EditEntryDlg.ui \ forms/PasswordGenDlg.ui \ forms/SelectIconDlg.ui \ - forms/CollectEntropyDlg.ui + forms/CollectEntropyDlg.ui \ + forms/CustomizeDetailViewDlg.ui \ + forms/CalendarDlg.ui \ + forms/ExpiredEntriesDlg.ui TRANSLATIONS += translations/keepass-de_DE.ts \ translations/keepass-ru_RU.ts \ translations/keepass-es_ES.ts \ @@ -80,6 +84,9 @@ HEADERS += lib/IniReader.h \ dialogs/PasswordGenDlg.h \ dialogs/SelectIconDlg.h \ dialogs/CollectEntropyDlg.h \ + dialogs/CustomizeDetailViewDlg.h \ + dialogs/CalendarDlg.h \ + dialogs/ExpiredEntriesDlg.h \ lib/random.h \ Database.h \ lib/KdePlugin.h \ @@ -135,6 +142,9 @@ SOURCES += lib/IniReader.cpp \ dialogs/PasswordGenDlg.cpp \ dialogs/SelectIconDlg.cpp \ dialogs/CollectEntropyDlg.cpp \ + dialogs/CustomizeDetailViewDlg.cpp \ + dialogs/CalendarDlg.cpp \ + dialogs/ExpiredEntriesDlg.cpp \ lib/random.cpp \ Database.cpp \ lib/KdePlugin.cpp \ @@ -151,9 +161,11 @@ SOURCES += lib/IniReader.cpp \ crypto/yarrow.cpp \ lib/WaitAnimationWidget.cpp \ KpxFirefox.cpp +RESOURCES += res/resources.qrc MOC_DIR = ../build/moc UI_DIR = ../build/ui OBJECTS_DIR = ../build/ +RCC_DIR = ../build/rcc CONFIG += debug \ qt \ thread \