From 08a4582f8e5184b8abb7d97781c4fc37ee7edf90 Mon Sep 17 00:00:00 2001 From: ulf69 Date: Fri, 29 Oct 2004 04:49:32 +0000 Subject: added category edit feature --- (limited to 'pwmanager') diff --git a/pwmanager/pwmanager/editcategory.cpp b/pwmanager/pwmanager/editcategory.cpp new file mode 100644 index 0000000..4e55de8 --- a/dev/null +++ b/pwmanager/pwmanager/editcategory.cpp @@ -0,0 +1,188 @@ +/* + This file is part of PwManager/Platform independent. + Copyright (c) 2004 Ulf Schenk + + 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. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. + +$Id$ +*/ + +#include "editcategory.h" +#include "pwmdoc.h" + +#include +#include +#include +#include +#include +#include +#include + + +/* + * Constructs a addEntryWnd as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + * + * The dialog will by default be modeless, unless you set 'modal' to + * TRUE to construct a modal dialog. + */ +editCategoryWnd::editCategoryWnd( PwMDoc* d, QWidget* parent, const char* name) + : KDialogBase( KDialogBase::Plain, i18n( "edit category descriptions" ), + Apply | User2 | Ok, + Ok, parent, name, true ), + doc(d) +{ + findButton( Ok )->setText (i18n("Close" )) ; + findButton( User2 )->setText (i18n("Cancel" )) ; + connect(this,SIGNAL(user2Clicked()), SLOT(cancel_slot())); + enableButton( KDialogBase::Apply, false ); + + + QWidget *page = plainPage(); + QGridLayout *layout = new QGridLayout( page, 3, 1 ); + layout->setMargin( KDialogBase::marginHint() ); + layout->setSpacing( KDialogBase::spacingHint() ); + + int i = 0; + categoryComboBox = new KComboBox( page ); + QLabel* label = new QLabel( categoryComboBox, i18n("Category:"), page ); + layout->addWidget( label, i, 0 ); + layout->addWidget( categoryComboBox, i, 1 ); + i++; + categoryComboBox->setEditable( FALSE ); + categoryComboBox->setSizeLimit( 100 ); + connect(categoryComboBox,SIGNAL(activated(const QString&)), SLOT(categorySelected(const QString&))); + + + descLineEdit = new KLineEdit( page, "descLineEdit" ); + label = new QLabel( descLineEdit, i18n("Text1 (Description):"), page ); + layout->addWidget( label, i, 0 ); + layout->addWidget( descLineEdit, i, 1 ); + connect( descLineEdit, SIGNAL( textChanged ( const QString & ) ), SLOT( widgetModified(const QString &) ) ); + i++; + + usernameLineEdit = new KLineEdit( page, "usernameLineEdit" ); + label = new QLabel( usernameLineEdit, i18n("Text2 (Username):"), page ); + layout->addWidget( label, i, 0 ); + layout->addWidget( usernameLineEdit, i, 1 ); + connect( usernameLineEdit, SIGNAL( textChanged ( const QString & ) ), SLOT( widgetModified(const QString &) ) ); + i++; + + pwLineEdit = new KLineEdit( page, "pwLineEdit" ); + label = new QLabel( pwLineEdit, i18n("Text3 (Password):"), page ); + layout->addWidget( label, i, 0 ); + layout->addWidget( pwLineEdit, i, 1 ); + connect( pwLineEdit, SIGNAL( textChanged ( const QString & ) ), SLOT( widgetModified(const QString &) ) ); + i++; + + unsigned int count = doc->numCategories(); + + for (unsigned int i = 0; i < count; ++i) { + categoryComboBox->insertItem(doc->getCategory(i)->c_str()); + } + + // PwMCategoryItem* getCategoryEntry(unsigned int index) + // { return &(dti.dta[index]); } + + + +} + +/* + * Destroys the object and frees any allocated resources + */ +editCategoryWnd::~editCategoryWnd() +{ + // no need to delete child widgets, Qt does it all for us +} + +void editCategoryWnd::slotOk() +{ + // qDebug( "addEntryWnd::slotOk(): Not implemented yet" ); + slotApply(); + accept(); +} + +void editCategoryWnd::slotApply() +{ + QString cat = categoryComboBox->currentText(); + + unsigned int idx; + bool found = doc->findCategory(cat, &idx); + + if (found == true) + { + PwMCategoryItem* catitem = doc->getCategoryEntry(idx); + + catitem->desc_text = descLineEdit->text().latin1(); + catitem->name_text = usernameLineEdit->text().latin1(); + catitem->pw_text = pwLineEdit->text().latin1(); + enableButton( KDialogBase::Apply, false ); + return; + } + + BUG(); + +} + +void editCategoryWnd::cancel_slot() +{ + QString cat = categoryComboBox->currentText(); + categorySelected ( cat ); +} + +void editCategoryWnd::setCurrCategory(const QString &cat) +{ + int i, count = categoryComboBox->count(); + + for (i = 0; i < count; ++i) { + if (categoryComboBox->text(i) == cat) { + categoryComboBox->setCurrentItem(i); + categorySelected ( cat ); + return; + } + } + BUG(); +} + +void editCategoryWnd::categorySelected ( const QString & string ) +{ + unsigned int idx; + bool found = doc->findCategory(string, &idx); + + if (found == true) + { + PwMCategoryItem* catitem = doc->getCategoryEntry(idx); + + descLineEdit->setText(catitem->desc_text.c_str()); + usernameLineEdit->setText(catitem->name_text.c_str()); + pwLineEdit->setText(catitem->pw_text.c_str()); + enableButton( KDialogBase::Apply, false ); + return; + } + + BUG(); + +} + +void editCategoryWnd::widgetModified(const QString &) +{ + enableButton( KDialogBase::Apply, true ); +} + diff --git a/pwmanager/pwmanager/editcategory.h b/pwmanager/pwmanager/editcategory.h new file mode 100644 index 0000000..90b685b --- a/dev/null +++ b/pwmanager/pwmanager/editcategory.h @@ -0,0 +1,77 @@ +/* + This file is part of PwManager/Platform independent. + Copyright (c) 2004 Ulf Schenk + + 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. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. + +$Id$ +*/ + +#ifndef EDITCATEGORY_H +#define EDITCATEGORY_H + +#include +#include + +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QSpacerItem; +class KLineEdit; +class QPushButton; +class KComboBox; +class QLabel; +class QGroupBox; +class QMultiLineEdit; +class PwMDoc; + +class editCategoryWnd : public KDialogBase +{ + Q_OBJECT + +public: + editCategoryWnd( PwMDoc* doc, QWidget* parent = 0, const char* name = 0); + ~editCategoryWnd(); + + void setCurrCategory(const QString &cat); + + KComboBox* categoryComboBox; + KLineEdit* descLineEdit; + KLineEdit* usernameLineEdit; + KLineEdit* pwLineEdit; + + //public slots: + // virtual void revealButton_slot(); + // virtual void generateButton_slot(); + // virtual void advancedCommentButton_slot(bool on); + + protected slots: + virtual void slotOk(); + virtual void slotApply(); + virtual void cancel_slot(); + + virtual void categorySelected ( const QString & string ); + virtual void widgetModified(const QString &); + + private: + PwMDoc* doc; + +}; + +#endif // EDITCATEGORY_H diff --git a/pwmanager/pwmanager/pwm.cpp b/pwmanager/pwmanager/pwm.cpp index 6ae6e28..bd98d72 100644 --- a/pwmanager/pwmanager/pwm.cpp +++ b/pwmanager/pwmanager/pwm.cpp @@ -40,6 +40,7 @@ #include #include #include +#include "editcategory.h" #endif @@ -117,6 +118,9 @@ enum { // Button IDs for "options" popup menu enum { BUTTON_POPUP_OPTIONS_CONFIG = 0 +#ifdef PWM_EMBEDDED + ,BUTTON_POPUP_OPTIONS_CATEGORY +#endif }; // Button IDs for "export" popup menu (in "file" popup menu) enum { @@ -360,6 +364,12 @@ void PwM::initMenubar() #ifndef PWM_EMBEDDED helpPopup = helpMenu(QString::null, false); #else + optionsPopup->insertItem(QIconSet(picons->loadIcon("configure", KIcon::Small)), + i18n("C&ategories..."), this, + SLOT(category_slot()), + BUTTON_POPUP_OPTIONS_CATEGORY); + + menuBar()->insertItem(i18n("&Sync"), syncPopup); @@ -1391,6 +1401,65 @@ void PwM::focusInEvent(QFocusEvent *e) #ifdef PWM_EMBEDDED +void PwM::category_slot() +{ + PwMDoc *doc = curDoc(); + PWM_ASSERT(doc); + doc->timer()->getLock(DocTimer::id_autoLockTimer); + + editCategoryWnd w(doc, this, "editcategory"); +/* + vector catList; + doc->getCategoryList(&catList); + unsigned i, size = catList.size(); + for (i = 0; i < size; ++i) { + w.addCategory(catList[i].c_str()); + } + w.setCurrCategory(view->getCurrentCategory()); + if (pw) + w.pwLineEdit->setText(*pw); +*/ + w.setCurrCategory(view->getCurrentCategory()); + + tryAgain: + if (w.exec() == 1) + { + PwMDataItem d; + + //US BUG: to initialize all values of curEntr with meaningfulldata, + // we call clear on it. Reason: Metadata will be uninitialized otherwise. + // another option would be to create a constructor for PwMDataItem + d.clear(true); + /* + d.desc = w.getDescription().latin1(); + d.name = w.getUsername().latin1(); + d.pw = w.getPassword().latin1(); + d.comment = w.getComment().latin1(); + d.url = w.getUrl().latin1(); + d.launcher = w.getLauncher().latin1(); + PwMerror ret = doc->addEntry(w.getCategory(), &d); + if (ret == e_entryExists) { + KMessageBox::error(this, + i18n + ("An entry with this \"Description\",\n" + "does already exist.\n" + "Please select another description."), + i18n("entry already exists.")); + goto tryAgain; + } else if (ret == e_maxAllowedEntr) { + KMessageBox::error(this, i18n("The maximum possible number of\nentries" + "has been reached.\nYou can't add more entries."), + i18n("maximum number of entries")); + doc->timer()->putLock(DocTimer::id_autoLockTimer); + return; + } + */ + } + setVirgin(false); + doc->timer()->putLock(DocTimer::id_autoLockTimer); +} + + void PwM::whatsnew_slot() { KApplication::showFile( "KDE-Pim/Pi Version Info", "kdepim/WhatsNew.txt" ); diff --git a/pwmanager/pwmanager/pwm.h b/pwmanager/pwmanager/pwm.h index fb34bca..9fa9edc 100644 --- a/pwmanager/pwmanager/pwm.h +++ b/pwmanager/pwmanager/pwm.h @@ -179,6 +179,7 @@ public slots: void replayCardBackup_slot(); #ifdef PWM_EMBEDDED + void category_slot(); void whatsnew_slot(); void showLicense_slot(); void faq_slot(); diff --git a/pwmanager/pwmanager/pwmanager.pro b/pwmanager/pwmanager/pwmanager.pro index fbc0554..7efe45c 100644 --- a/pwmanager/pwmanager/pwmanager.pro +++ b/pwmanager/pwmanager/pwmanager.pro @@ -67,6 +67,7 @@ commentbox.h \ compiler.h \ compressgzip.h \ csv.h \ +editcategory.h \ findwnd_emb.h \ findwndimpl.h \ genpasswd.h \ @@ -133,6 +134,7 @@ blowfish.cpp \ commentbox.cpp \ compressgzip.cpp \ csv.cpp \ +editcategory.cpp \ findwnd_emb.cpp \ findwndimpl.cpp \ genpasswd.cpp \ diff --git a/pwmanager/pwmanager/pwmanagerE.pro b/pwmanager/pwmanager/pwmanagerE.pro index e195178..6b68514 100644 --- a/pwmanager/pwmanager/pwmanagerE.pro +++ b/pwmanager/pwmanager/pwmanagerE.pro @@ -65,6 +65,7 @@ commentbox.h \ compiler.h \ compressgzip.h \ csv.h \ +editcategory.h \ findwnd_emb.h \ findwndimpl.h \ genpasswd.h \ @@ -131,6 +132,7 @@ blowfish.cpp \ commentbox.cpp \ compressgzip.cpp \ csv.cpp \ +editcategory.cpp \ findwnd_emb.cpp \ findwndimpl.cpp \ genpasswd.cpp \ diff --git a/pwmanager/pwmanager/pwmdoc.cpp b/pwmanager/pwmanager/pwmdoc.cpp index 9043acc..ddbf4f2 100644 --- a/pwmanager/pwmanager/pwmdoc.cpp +++ b/pwmanager/pwmanager/pwmdoc.cpp @@ -1052,6 +1052,9 @@ PwMerror PwMDoc::addCategory(const QString &category, unsigned int *categoryInde return e_categoryExists; } PwMCategoryItem item; + //US ENH: clear item to initialize with default values, or create a constructor + item.clear(); + item.name = category.latin1(); dti.dta.push_back(item); if (categoryIndex) @@ -1880,6 +1883,8 @@ void PwMDoc::clearDoc() { dti.clear(); PwMCategoryItem d; + //US ENH: to initialize all members with meaningfull data. + d.clear(); d.name = DEFAULT_CATEGORY.latin1(); dti.dta.push_back(d); currentPw = ""; diff --git a/pwmanager/pwmanager/pwmdoc.h b/pwmanager/pwmanager/pwmdoc.h index 09923ab..ef81dfc 100644 --- a/pwmanager/pwmanager/pwmdoc.h +++ b/pwmanager/pwmanager/pwmdoc.h @@ -253,10 +253,19 @@ struct PwMCategoryItem /** category name/description */ string name; + //US ENH: enhancements of the filestructure + /* each category stores the text for description,name and password */ + string desc_text; + string name_text; + string pw_text; + void clear() { d.clear(); name = ""; + desc_text = "Description"; + name_text = "Username"; + pw_text = "Password"; } }; @@ -785,6 +794,11 @@ protected: virtual void removeSyncInfo( QString syncProfile); #endif + //US ENH: helpermethods to return a whole category entry + /** returns a pointer to the categoryitem */ + PwMCategoryItem* getCategoryEntry(unsigned int index) + { return &(dti.dta[index]); } + private: //US ENH: helpermethods to access the sync data for a certain syncname. // It returns the syncdatas index diff --git a/pwmanager/pwmanager/pwmview.cpp b/pwmanager/pwmanager/pwmview.cpp index 5aaf66e..7733028 100644 --- a/pwmanager/pwmanager/pwmview.cpp +++ b/pwmanager/pwmanager/pwmview.cpp @@ -260,6 +260,16 @@ void PwMView::shiftToView() // shift tempoary data to ListView. tmpDisableSort(); lv->clear(); + + //US ENH: adjust the headers of the table according the category texts + { + PwMCategoryItem* catItem = doc->getCategoryEntry(catDocIndex); + // qDebug("PwMView::ShiftToView CAT: %i, %s", catDocIndex, catItem->name.c_str()); + lv->setColumnText(COLUMN_DESC, catItem->desc_text.c_str()); + lv->setColumnText(COLUMN_NAME, catItem->name_text.c_str()); + lv->setColumnText(COLUMN_PW, catItem->pw_text.c_str()); + } + QCheckListItem *newItem; vector::iterator it = tmpSorted.begin(), end = tmpSorted.end(); diff --git a/pwmanager/pwmanager/serializer.cpp b/pwmanager/pwmanager/serializer.cpp index 5753c1d..507fa30 100644 --- a/pwmanager/pwmanager/serializer.cpp +++ b/pwmanager/pwmanager/serializer.cpp @@ -39,7 +39,7 @@ #define META_EXPIRE_DATE "e" #define META_UPDATE_DATE "u" #define META_UPDATE_INT "i" -//US ENH : uniqueid +//US ENH : uniqueid and sync information #define META_UNIQUEID "n" #define SYNC_ROOT "s" #define SYNC_TARGET_PREFIX "t" @@ -56,6 +56,9 @@ #define CAT_ROOT_OLD "categories" #define CAT_PREFIX_OLD "cat_" #define CAT_NAME_OLD "name" +//US ENH : optional text for categories +#define CAT_TEXT_OLD "text" + #define ENTRY_PREFIX_OLD "entry_" #define ENTRY_DESC_OLD "desc" #define ENTRY_NAME_OLD "name" @@ -73,6 +76,9 @@ #define CAT_ROOT_NEW "c" #define CAT_PREFIX_NEW "c" #define CAT_NAME_NEW "n" +//US ENH : optional text for categories +#define CAT_TEXT_NEW "t" + #define ENTRY_PREFIX_NEW "e" #define ENTRY_DESC_NEW "d" #define ENTRY_NAME_NEW "n" @@ -91,6 +97,10 @@ # define CAT_ROOT_WR CAT_ROOT_OLD # define CAT_PREFIX_WR CAT_PREFIX_OLD # define CAT_NAME_WR CAT_NAME_OLD + +//US ENH : optional text for categories +# define CAT_TEXT_WR CAT_TEXT_OLD + # define ENTRY_PREFIX_WR ENTRY_PREFIX_OLD # define ENTRY_DESC_WR ENTRY_DESC_OLD # define ENTRY_NAME_WR ENTRY_NAME_OLD @@ -108,6 +118,10 @@ # define CAT_ROOT_WR CAT_ROOT_NEW # define CAT_PREFIX_WR CAT_PREFIX_NEW # define CAT_NAME_WR CAT_NAME_NEW + +//US ENH : optional text for categories +# define CAT_TEXT_WR CAT_TEXT_NEW + # define ENTRY_PREFIX_WR ENTRY_PREFIX_NEW # define ENTRY_DESC_WR ENTRY_DESC_NEW # define ENTRY_NAME_WR ENTRY_NAME_NEW @@ -271,6 +285,7 @@ bool Serializer::readCategories(const QDomNode &n, QDomNodeList nl(n.childNodes()); QDomNode cur; QString name; + QString text; unsigned int numCat = nl.count(), i; PwMCategoryItem curCat; vector curEntr; @@ -290,6 +305,23 @@ bool Serializer::readCategories(const QDomNode &n, PWM_ASSERT(name != ""); curCat.clear(); curCat.name = name.latin1(); + + //US ENH: new version might include text for description, name and pw + text = cur.toElement().attribute(CAT_TEXT_NEW); + if (text == QString::null) + text = cur.toElement().attribute(CAT_TEXT_OLD); + if (text != QString::null) + { + QStringList textlist = QStringList::split(";", text, true); + unsigned int num = textlist.count(); + if (num > 0) + curCat.desc_text = textlist[0].latin1(); + if (num > 1) + curCat.name_text = textlist[1].latin1(); + if (num > 2) + curCat.pw_text = textlist[2].latin1(); + } + if (!readEntries(cur, &curEntr)) { dta->clear(); return false; @@ -501,6 +533,16 @@ bool Serializer::addCategories(QDomElement *e, curName = dta[i].name.c_str(); curCat = domDoc->createElement(curId); curCat.setAttribute(CAT_NAME_WR, curName); + + //US ENH: new version includes text for description, name and pw + QStringList curTextList; + curTextList << dta[i].desc_text.c_str(); + curTextList << dta[i].name_text.c_str(); + curTextList << dta[i].pw_text.c_str(); + QString text = curTextList.join(";"); + curCat.setAttribute(CAT_TEXT_WR, text); + + if (!addEntries(&curCat, dta[i].d)) { return false; } -- cgit v0.9.0.2