//=============================================================================
//
//   File : RegisteredUserEntryDialog.cpp
//   Creation date : Tue Dec 26 2000 12:24:12 CEST by Szymon Stefanek
//
//   This file is part of the KVIrc IRC client distribution
//   Copyright (C) 2000-2010 Szymon Stefanek (pragma at kvirc dot net)
//
//   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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================
#define _WANT_OPTION_FLAGS_
#define _EDITUSER_CPP_

#include "RegisteredUserEntryDialog.h"
#include "RegistrationWizard.h"
#include "RegisteredUsersDialog.h"

#include "KviRegisteredUserDataBase.h"
#include "KviLocale.h"
#include "KviIrcMask.h"
#include "kvi_debug.h"
#include "KviIconManager.h"
#include "KviApplication.h"
#include "KviOptions.h"
#include "KviFile.h"
#include "KviMessageBox.h"
#include "KviFileUtils.h"
#include "kvi_settings.h"
#include "KviStringConversion.h"
#include "KviPointerHashTable.h"
#include "KviTalHBox.h"
#include "KviTalVBox.h"

#include <QLayout>
#include <QLabel>
#include <QGroupBox>
#include <QStyle>
#include <QPainter>
#include <QInputDialog>
#include <QImage>
#include <QString>
#include <QComboBox>
#include <QToolTip>
#include <QTableWidgetItem>
#include <QStringList>
#include <QHeaderView>
#include <QEvent>
#include <QCloseEvent>

// KviApplication.cpp
extern RegisteredUsersDialog * g_pRegisteredUsersDialog;

KviRegisteredUserDataBase * g_pLocalRegisteredUserDataBase; // local copy!

RegisteredUserPropertiesDialog::RegisteredUserPropertiesDialog(QWidget * p, KviPointerHashTable<QString, QString> * dict)
    : QDialog(p)
{
	setObjectName("property_editor");
	setWindowModality(Qt::WindowModal);
	m_pPropertyDict = dict;

	setWindowTitle(__tr2qs_ctx("Property Editor - KVIrc", "register"));
	setWindowIcon(*(g_pIconManager->getSmallIcon(KviIconManager::Linux)));

	QGridLayout * g = new QGridLayout(this);

	m_pTable = new QTableWidget(this);
	//g->addMultiCellWidget(m_pTable,0,1,0,1);
	g->addWidget(m_pTable, 0, 0);
	m_pTable->setColumnCount(2);
	m_pTable->setSelectionMode(QAbstractItemView::SingleSelection);
	m_pTable->setSelectionBehavior(QAbstractItemView::SelectRows);

	QStringList header;
	header.append(__tr2qs_ctx("Property", "register"));
	header.append(__tr2qs_ctx("Value", "register"));
	m_pTable->setHorizontalHeaderLabels(header);

	m_pTable->setMinimumSize(250, 250);
	//connect(m_pTable,SIGNAL(valueChanged(int,int)),this,SLOT(propertyValueChanged(int,int)));

	KviTalVBox * vb = new KviTalVBox(this);
	vb->setSpacing(4);
	g->addWidget(vb, 0, 1, 0, 3);

	m_pAddButton = new QPushButton(__tr2qs_ctx("&New", "register"), vb);
	connect(m_pAddButton, SIGNAL(clicked()), this, SLOT(addClicked()));
	m_pAddButton->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::NewItem)));

	m_pDelButton = new QPushButton(__tr2qs_ctx("&Remove", "register"), vb);
	connect(m_pDelButton, SIGNAL(clicked()), this, SLOT(delClicked()));
	m_pDelButton->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::DeleteItem)));

	KviTalHBox * b = new KviTalHBox(this);
	b->setSpacing(4);
	//g->addMultiCellWidget(b,2,2,1,2);
	g->addWidget(b, 1, 1);
	QPushButton * pb = new QPushButton(__tr2qs_ctx("&OK", "register"), b);
	connect(pb, SIGNAL(clicked()), this, SLOT(okClicked()));
	pb->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::Accept)));

	pb = new QPushButton(__tr2qs_ctx("Cancel", "register"), b);
	connect(pb, SIGNAL(clicked()), this, SLOT(reject()));
	pb->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::Discard)));

	g->setRowStretch(1, 1);
	g->setColumnStretch(0, 1);

	fillData();
}

RegisteredUserPropertiesDialog::~RegisteredUserPropertiesDialog()
    = default;

void RegisteredUserPropertiesDialog::closeEvent(QCloseEvent * e)
{
	e->accept();
	//delete this;
}

void RegisteredUserPropertiesDialog::fillData()
{
	m_pTable->setRowCount(m_pPropertyDict->count());
	KviPointerHashTableIterator<QString, QString> it(*m_pPropertyDict);
	int row = 0;
	while(it.current())
	{
		QTableWidgetItem * m_pTableItem1 = new QTableWidgetItem(it.currentKey(), QTableWidgetItem::Type);
		m_pTableItem1->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);

		QTableWidgetItem * m_pTableItem2 = new QTableWidgetItem(*(it.current()), QTableWidgetItem::Type);
		m_pTableItem2->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);

		m_pTable->setItem(row, 0, m_pTableItem1);
		m_pTable->setItem(row, 1, m_pTableItem2);
		++row;
		++it;
	}
	if(m_pTable->rowCount() == 0)
		m_pDelButton->setEnabled(false);
}

void RegisteredUserPropertiesDialog::okClicked()
{
	m_pPropertyDict->clear();

	int n = m_pTable->rowCount();
	for(int i = 0; i < n; i++)
	{
		QString szName = m_pTable->item(i, 0)->text();
		QString szValue = m_pTable->item(i, 1)->text();
		if((!szName.isEmpty()) && (!szValue.isEmpty()))
		{
			m_pPropertyDict->replace(szName, new QString(szValue));
		}
	}

	accept();
}

void RegisteredUserPropertiesDialog::addClicked()
{
	m_pTable->setRowCount(m_pTable->rowCount() + 1);

	QTableWidgetItem * m_pTableItem1 = new QTableWidgetItem("", QTableWidgetItem::Type);
	m_pTableItem1->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);

	QTableWidgetItem * m_pTableItem2 = new QTableWidgetItem("", QTableWidgetItem::Type);
	m_pTableItem2->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);

	m_pTable->setItem(m_pTable->rowCount() - 1, 0, m_pTableItem1);
	m_pTable->setItem(m_pTable->rowCount() - 1, 1, m_pTableItem2);
	m_pDelButton->setEnabled(true);
}

void RegisteredUserPropertiesDialog::delClicked()
{
	int i = m_pTable->currentRow();

	if((i > -1) && (i < m_pTable->rowCount()))
	{
		// remove row i
		m_pTable->removeRow(i);
		if(m_pTable->rowCount() == 0)
			m_pDelButton->setEnabled(false);
	}
}

RegisteredUserMaskDialog::RegisteredUserMaskDialog(QWidget * p, KviIrcMask * m)
    : QDialog(p)
{
	setObjectName("reguser_mask_editor");
	setWindowModality(Qt::WindowModal);
	m_pMask = m;

	setWindowTitle(__tr2qs_ctx("Mask Editor - KVIrc", "register"));

	QGridLayout * g = new QGridLayout(this);

	QLabel * l = new QLabel(__tr2qs_ctx("Insert a mask for this user.<br>It can contain the wildcard characters '*' and '?'.", "register"), this);
	//l->setAlignment(Qt::AlignCenter);
	g->addWidget(l, 0, 0, 1, 2);

	KviTalHBox * b = new KviTalHBox(this);
	g->addWidget(b, 1, 0, 1, 2);

	m_pNickEdit = new QLineEdit(b);
	//m_pNickEdit->setMinimumWidth(120);
	m_pNickEdit->setAlignment(Qt::AlignRight);
	m_pNickEdit->setToolTip(__tr2qs_ctx("This is the <b>nickname</b> that will match this user, default value is the registered name.", "register"));

	l = new QLabel("<b>!</b>", b);
	l->setAlignment(Qt::AlignCenter);
	//l->setMinimumWidth(40);

	m_pUserEdit = new QLineEdit(b);
	//m_pUserEdit->setMinimumWidth(120);
	m_pUserEdit->setAlignment(Qt::AlignCenter);
	m_pUserEdit->setToolTip(__tr2qs_ctx("This is the <b>username</b> that will match this user. <b>*</b> will match any username.", "register"));

	l = new QLabel("<b>@</b>", b);
	l->setAlignment(Qt::AlignCenter);
	//l->setMinimumWidth(40);

	m_pHostEdit = new QLineEdit(b);
	//m_pHostEdit->setMinimumWidth(120);
	m_pHostEdit->setAlignment(Qt::AlignLeft);
	m_pHostEdit->setToolTip(__tr2qs_ctx("This is the <b>hostname</b> that will match this user. <b>*</b> will match any hostname.", "register"));

	// just a spacer
	//	l = new QLabel("<nobr>&nbsp;<nobr>",this);
	//	g->addMultiCellWidget(l,2,2,0,1);

	//	QFrame * f = new QFrame(this);
	//	f->setFrameStyle(QFrame::HLine | QFrame::Sunken);
	//	g->addMultiCellWidget(f,3,3,0,1);

	b = new KviTalHBox(this);
	b->setSpacing(4);
	g->addWidget(b, 2, 1);

	QPushButton * pb = new QPushButton(__tr2qs_ctx("&OK", "register"), b);
	connect(pb, SIGNAL(clicked()), this, SLOT(okClicked()));
	//pb->setMinimumWidth(120);

	pb = new QPushButton(__tr2qs_ctx("Cancel", "register"), b);
	connect(pb, SIGNAL(clicked()), this, SLOT(reject()));
	//pb->setMinimumWidth(120);

	g->setColumnStretch(0, 1);
	g->setRowStretch(0, 1);

	m_pNickEdit->setText(m->nick());
	m_pUserEdit->setText(m->user());
	m_pHostEdit->setText(m->host());
}

RegisteredUserMaskDialog::~RegisteredUserMaskDialog()
    = default;

void RegisteredUserMaskDialog::closeEvent(QCloseEvent * e)
{
	e->accept();
	//delete this;
}

void RegisteredUserMaskDialog::okClicked()
{
	KviCString szTmp = m_pNickEdit->text();
	if(szTmp.isEmpty())
		szTmp = "*";
	m_pMask->setNick(szTmp.ptr());

	szTmp = m_pUserEdit->text();
	if(szTmp.isEmpty())
		szTmp = "*";
	m_pMask->setUsername(szTmp.ptr());

	szTmp = m_pHostEdit->text();
	if(szTmp.isEmpty())
		szTmp = "*";
	m_pMask->setHost(szTmp.ptr());

	accept();
}

RegisteredUserEntryDialog::RegisteredUserEntryDialog(QWidget * p, KviRegisteredUser * r, bool bModal)
    : KviTalTabDialog(p, "reguser_entry_editor", bModal)
{
	m_pUser = r;
	m_pCustomColor = new QColor();

	if(r)
	{
		QString col = r->getProperty("customColor");
		KviStringConversion::fromString(col, (*m_pCustomColor));
	}

	m_pPropertyDict = new KviPointerHashTable<QString, QString>(17, false);
	m_pPropertyDict->setAutoDelete(true);

	//setMinimumSize(400,450);

	setWindowIcon(*(g_pIconManager->getSmallIcon(KviIconManager::Linux)));
	setWindowTitle(__tr2qs_ctx("Registered User Entry - KVIrc", "register"));

	QWidget * p1 = new QWidget(this);

	QGridLayout * g = new QGridLayout(p1);

	QLabel * l = new QLabel(__tr2qs_ctx("Name:", "register"), p1);
	g->addWidget(l, 0, 0);

	m_pNameEdit = new QLineEdit(p1);
	g->addWidget(m_pNameEdit, 0, 1);

	l = new QLabel(__tr2qs_ctx("Comment:", "register"), p1);
	g->addWidget(l, 1, 0);

	m_pCommentEdit = new QLineEdit(p1);
	g->addWidget(m_pCommentEdit, 1, 1);

	QFrame * f = new QFrame(p1);
	g->addWidget(f, 2, 0, 1, 2);
	f->setFrameStyle(QFrame::HLine | QFrame::Sunken);

	l = new QLabel(__tr2qs_ctx("Masks:", "register"), p1);
	g->addWidget(l, 3, 0, 1, 2);

	m_pMaskListBox = new QListWidget(p1);
	connect(m_pMaskListBox, SIGNAL(itemSelectionChanged()), this, SLOT(maskCurrentChanged()));
	m_pMaskListBox->setMinimumSize(300, 200);

	g->addWidget(m_pMaskListBox, 4, 0, 1, 2);

	KviTalHBox * b = new KviTalHBox(p1);
	g->addWidget(b, 5, 0, 1, 2);
	b->setSpacing(4);

	m_pAddMaskButton = new QPushButton(__tr2qs_ctx("&Add...", "register"), b);
	connect(m_pAddMaskButton, SIGNAL(clicked()), this, SLOT(addMaskClicked()));
	m_pAddMaskButton->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::NewItem)));

	m_pDelMaskButton = new QPushButton(__tr2qs_ctx("Re&move", "register"), b);
	m_pDelMaskButton->setEnabled(false);
	connect(m_pDelMaskButton, SIGNAL(clicked()), this, SLOT(delMaskClicked()));
	m_pDelMaskButton->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::DeleteItem)));

	m_pEditMaskButton = new QPushButton(__tr2qs_ctx("&Edit", "register"), b);
	m_pEditMaskButton->setEnabled(false);
	connect(m_pEditMaskButton, SIGNAL(clicked()), this, SLOT(editMaskClicked()));
	m_pEditMaskButton->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::EditItem)));

	g->setRowStretch(4, 1);
	g->setColumnStretch(1, 1);

	addTab(p1, __tr2qs_ctx("Identity", "register"));

	QWidget * p2 = new QWidget(this);

	g = new QGridLayout(p2);

	m_pNotifyCheck = new QCheckBox(__tr2qs_ctx("Notify when user is online", "register"), p2);
	g->addWidget(m_pNotifyCheck, 0, 0, 1, 3);

	m_pNotifyLabel = new QLabel(__tr2qs_ctx("Notify nicknames:", "register"), p2);
	m_pNotifyLabel->setEnabled(m_pNotifyCheck->isChecked());
	g->addWidget(m_pNotifyLabel, 1, 0);
	m_pNotifyCheck->setToolTip(__tr2qs_ctx("You can enter a space separated list of nicknames.", "register"));

	m_pNotifyNick = new QLineEdit(p2);
	m_pNotifyNick->setEnabled(false);

	g->addWidget(m_pNotifyNick, 1, 1, 1, 2);
	connect(m_pNotifyCheck, SIGNAL(toggled(bool)), this, SLOT(notifyCheckClicked(bool)));

	f = new QFrame(p2);
	f->setFrameStyle(QFrame::HLine | QFrame::Sunken);
	g->addWidget(f, 2, 0, 1, 3);

	m_pAvatar = nullptr;
	if(r)
	{
		const QString av = r->getProperty("avatar");
		if(!av.isEmpty())
		{
			m_pAvatar = new KviPixmap(av.toUtf8().data());
		}
	}
	if(!m_pAvatar)
		m_pAvatar = new KviPixmap();

	m_pAvatarSelector = new KviPixmapSelector(p2, __tr2qs_ctx("Avatar:", "register"), m_pAvatar, true);
	g->addWidget(m_pAvatarSelector, 3, 0, 1, 3);

	f = new QFrame(p2);
	f->setFrameStyle(QFrame::HLine | QFrame::Sunken);
	g->addWidget(f, 4, 0, 1, 3);

	m_pCustomColorCheck = new QCheckBox(__tr2qs_ctx("Use custom color in userlist", "register"), p2);
	if(r)
		m_pCustomColorCheck->setChecked(r->getBoolProperty("useCustomColor"));
	g->addWidget(m_pCustomColorCheck, 5, 0, 1, 2);

	m_pCustomColorSelector = new KviColorSelector(p2, QString(), m_pCustomColor, true);
	g->addWidget(m_pCustomColorSelector, 5, 2);

	QPushButton * pb = new QPushButton(__tr2qs_ctx("All Properties...", "register"), p2);
	connect(pb, SIGNAL(clicked()), this, SLOT(editAllPropertiesClicked()));
	g->addWidget(pb, 6, 2);

	g->setColumnStretch(1, 1);
	g->setRowStretch(3, 1);

	addTab(p2, __tr2qs_ctx("Properties", "register"));

	// Ignore TAB
	KviTalVBox * vb = new KviTalVBox(this);
	vb->setContentsMargins(10, 10, 10, 10);

	m_pIgnoreEnabled = new QCheckBox(__tr2qs_ctx("Enable ignore for this user", "register"), vb);

	QGroupBox * gb = new QGroupBox(__tr2qs_ctx("Ignore Features", "register"), vb);
	connect(m_pIgnoreEnabled, SIGNAL(toggled(bool)), gb, SLOT(setEnabled(bool)));

	QVBoxLayout * layout = new QVBoxLayout(gb);
	layout->setContentsMargins(20, 20, 20, 20);
	layout->setSpacing(3);

	m_pIgnoreQuery = new QCheckBox(__tr2qs_ctx("Ignore query messages", "register"), gb);
	layout->addWidget(m_pIgnoreQuery);

	m_pIgnoreChannel = new QCheckBox(__tr2qs_ctx("Ignore channel messages", "register"), gb);
	layout->addWidget(m_pIgnoreChannel);

	m_pIgnoreNotice = new QCheckBox(__tr2qs_ctx("Ignore notice messages", "register"), gb);
	layout->addWidget(m_pIgnoreNotice);

	m_pIgnoreCtcp = new QCheckBox(__tr2qs_ctx("Ignore CTCP messages", "register"), gb);
	layout->addWidget(m_pIgnoreCtcp);

	m_pIgnoreInvite = new QCheckBox(__tr2qs_ctx("Ignore invites", "register"), gb);
	layout->addWidget(m_pIgnoreInvite);

	m_pIgnoreDcc = new QCheckBox(__tr2qs_ctx("Ignore DCCs", "register"), gb);
	layout->addWidget(m_pIgnoreDcc);

	m_pIgnoreHighlight = new QCheckBox(__tr2qs_ctx("Ignore highlights", "register"), gb);
	layout->addWidget(m_pIgnoreHighlight);

	QWidget * w = new QWidget(vb);
	w->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);

	addTab(vb, __tr2qs_ctx("Ignore", "register"));

	setCancelButton(__tr2qs_ctx("Cancel", "register"));
	setOkButton(__tr2qs_ctx("&OK", "register"));
	connect(this, SIGNAL(applyButtonPressed()), this, SLOT(okClicked()));
	connect(this, SIGNAL(cancelButtonPressed()), this, SLOT(reject()));

	if(r)
	{
		m_pNameEdit->setText(r->name());
		m_pCommentEdit->setText(r->getProperty("comment"));
		for(KviIrcMask * m = r->maskList()->first(); m; m = r->maskList()->next())
		{
			QString mk = m->nick();
			mk += QChar('!');
			mk += m->user();
			mk += QChar('@');
			mk += m->host();
			m_pMaskListBox->addItem(mk);
		}

		QString szNotifyNicks = r->getProperty("notify");
		if(!szNotifyNicks.isEmpty())
		{
			m_pNotifyCheck->setChecked(true);
			m_pNotifyNick->setText(szNotifyNicks);
			m_pNotifyNick->setEnabled(true);
		}

		if(r->propertyDict())
		{
			KviPointerHashTableIterator<QString, QString> it(*(r->propertyDict()));
			while(QString * s = it.current())
			{
				m_pPropertyDict->insert(it.currentKey(), new QString(*s));
				++it;
			}
		}

		m_pIgnoreEnabled->setChecked(r->ignoreEnabled());

		gb->setEnabled(r->ignoreEnabled());

		m_pIgnoreQuery->setChecked(r->ignoreFlags() & KviRegisteredUser::Query);
		m_pIgnoreChannel->setChecked(r->ignoreFlags() & KviRegisteredUser::Channel);
		m_pIgnoreNotice->setChecked(r->ignoreFlags() & KviRegisteredUser::Notice);
		m_pIgnoreCtcp->setChecked(r->ignoreFlags() & KviRegisteredUser::Ctcp);
		m_pIgnoreInvite->setChecked(r->ignoreFlags() & KviRegisteredUser::Invite);
		m_pIgnoreDcc->setChecked(r->ignoreFlags() & KviRegisteredUser::Dcc);
		m_pIgnoreHighlight->setChecked(r->ignoreFlags() & KviRegisteredUser::Highlight);
	}
	else
	{
		// default values
		if(!m_pIgnoreEnabled->isChecked())
		{
			gb->setEnabled(false);
		}
	}
}

void RegisteredUserEntryDialog::closeEvent(QCloseEvent * e)
{
	e->accept();
	okClicked();
	//delete this;
}

RegisteredUserEntryDialog::~RegisteredUserEntryDialog()
{
	delete m_pAvatar;
	delete m_pPropertyDict;
	delete m_pCustomColor;
}

void RegisteredUserEntryDialog::notifyCheckClicked(bool bChecked)
{
	m_pNotifyNick->setEnabled(bChecked);
	m_pNotifyLabel->setEnabled(bChecked);
	if(bChecked && m_pNotifyNick->text().isEmpty())
	{
		QString szMask;
		if(m_pUser)
		{
			for(KviIrcMask * m = m_pUser->maskList()->first(); m; m = m_pUser->maskList()->next())
			{
				QString tmp = m->nick();
				if((tmp.indexOf('*') == -1) && (tmp.indexOf('?') == -1) && (!tmp.isEmpty()))
				{
					if(!szMask.isEmpty())
						szMask.append(' ');
					szMask.append(tmp);
				}
			}
			// if the nickname list is still empty, build a dummy nick to notify
			if(szMask.isEmpty())
			{
				szMask = m_pUser->name();
				szMask.replace(" ", "");
				szMask.replace("'", "");
				szMask.replace("&", "");
				szMask.replace(",", "");
			}
			m_pNotifyNick->setText(szMask);
		}
	}
}

void RegisteredUserEntryDialog::maskCurrentChanged()
{
	bool bHaveSelected = !m_pMaskListBox->selectedItems().empty();

	m_pDelMaskButton->setEnabled(bHaveSelected);
	m_pEditMaskButton->setEnabled(bHaveSelected);
}

void RegisteredUserEntryDialog::okClicked()
{
	QString szGroup;
	if(m_pUser)
	{
		szGroup = m_pUser->group();
		g_pLocalRegisteredUserDataBase->removeUser(m_pUser->name());
	}

	QString name = m_pNameEdit->text();

	if(name.isEmpty())
		name = "user";

	KviRegisteredUser * u;

	QString szNameOk = name;

	int idx = 1;

	do
	{
		u = g_pLocalRegisteredUserDataBase->findUserByName(szNameOk);
		if(u)
		{
			szNameOk = QString("%1%2").arg(name).arg(idx);
			idx++;
		}
	} while(u);

	u = g_pLocalRegisteredUserDataBase->addUser(szNameOk);
	u->setGroup(szGroup);

	if(!u)
	{
		// ops... no way
		// FIXME: spit an error message ?
		qDebug("Oops! Something wrong with the regusers DB");
		accept();
		return;
	}

	int cnt = m_pMaskListBox->count();
	idx = 0;
	while(cnt > 0)
	{
		QString mask = m_pMaskListBox->item(idx)->text();
		KviIrcMask * mk = new KviIrcMask(mask);
		g_pLocalRegisteredUserDataBase->removeMask(*mk);
		g_pLocalRegisteredUserDataBase->addMask(u, mk);
		cnt--;
		idx++;
	}
	u->setProperty("comment", m_pCommentEdit->text());

	m_pAvatarSelector->commit();

	if(!m_pAvatar->isNull())
	{
		QString szPath = m_pAvatar->path();
		u->setProperty("avatar", szPath);
	}

	if(m_pNotifyCheck->isChecked())
	{
		QString szNicks = m_pNotifyNick->text();

		if(szNicks.isEmpty())
		{
			u->setProperty("notify", QString(""));
		}
		else
		{
			u->setProperty("notify", szNicks);
		}
	}
	else
	{
		u->setProperty("notify", QString(""));
	}

	m_pPropertyDict->remove("comment");
	m_pPropertyDict->remove("notify");
	m_pPropertyDict->remove("avatar");

	KviPointerHashTableIterator<QString, QString> it(*m_pPropertyDict);
	while(QString * s = it.current())
	{
		u->setProperty(it.currentKey(), *s);
		++it;
	}

	u->setProperty("useCustomColor", m_pCustomColorCheck->isChecked());

	QString col;
	KviStringConversion::toString(m_pCustomColorSelector->getColor(), col);
	u->setProperty("customColor", col);

	int iIgnoreFlags = 0;
	u->setIgnoreEnabled(m_pIgnoreEnabled->isChecked());
	if(m_pIgnoreQuery->isChecked())
		iIgnoreFlags |= KviRegisteredUser::Query;
	if(m_pIgnoreChannel->isChecked())
		iIgnoreFlags |= KviRegisteredUser::Channel;
	if(m_pIgnoreNotice->isChecked())
		iIgnoreFlags |= KviRegisteredUser::Notice;
	if(m_pIgnoreCtcp->isChecked())
		iIgnoreFlags |= KviRegisteredUser::Ctcp;
	if(m_pIgnoreInvite->isChecked())
		iIgnoreFlags |= KviRegisteredUser::Invite;
	if(m_pIgnoreDcc->isChecked())
		iIgnoreFlags |= KviRegisteredUser::Dcc;
	if(m_pIgnoreHighlight->isChecked())
		iIgnoreFlags |= KviRegisteredUser::Highlight;

	u->setIgnoreFlags(iIgnoreFlags);
	accept();
	g_pApp->optionResetUpdate(KviOption_resetUpdateGui);
}

void RegisteredUserEntryDialog::addMaskClicked()
{
	KviIrcMask mk;
	RegisteredUserMaskDialog * dlg = new RegisteredUserMaskDialog(this, &mk);
	if(dlg->exec() == QDialog::Accepted)
	{
		QString m = mk.nick();
		m += QChar('!');
		m += mk.user();
		m += QChar('@');
		m += mk.host();
		m_pMaskListBox->addItem(m);
	}
	delete dlg;
}

void RegisteredUserEntryDialog::delMaskClicked()
{
	if(m_pMaskListBox->currentItem())
	{
		delete m_pMaskListBox->currentItem();
	}
}

void RegisteredUserEntryDialog::editMaskClicked()
{
	if(!m_pMaskListBox->currentItem())
		return;
	QString szM = m_pMaskListBox->currentItem()->text();
	if(szM.isEmpty())
		return;

	KviIrcMask mk(szM);
	RegisteredUserMaskDialog * dlg = new RegisteredUserMaskDialog(this, &mk);
	if(dlg->exec() == QDialog::Accepted)
	{
		QString m = mk.nick();
		m += QChar('!');
		m += mk.user();
		m += QChar('@');
		m += mk.host();
		m_pMaskListBox->currentItem()->setText(m);
	}
	delete dlg;
}

void RegisteredUserEntryDialog::editAllPropertiesClicked()
{
	m_pAvatarSelector->commit();

	if(m_pAvatar->isNull())
	{
		m_pPropertyDict->remove("avatar");
	}
	else
	{
		KviCString szPath = m_pAvatar->path();
		if(szPath.isEmpty())
			m_pPropertyDict->remove("avatar");
		else
			m_pPropertyDict->replace("avatar", new QString(szPath));
	}

	if(m_pNotifyCheck->isChecked())
	{
		QString szNicks = m_pNotifyNick->text();

		if(!szNicks.isEmpty())
		{
			m_pPropertyDict->replace("notify", new QString(szNicks));
		}
		else
		{
			m_pPropertyDict->remove("notify");
		}
	}
	else
	{
		m_pPropertyDict->remove("notify");
	}

	RegisteredUserPropertiesDialog * dlg = new RegisteredUserPropertiesDialog(this, m_pPropertyDict);
	if(dlg->exec() != QDialog::Accepted)
	{
		delete dlg;
		return;
	}
	delete dlg;

	QString * notify = m_pPropertyDict->find("notify");
	bool bGotIt = false;
	if(notify)
	{
		if(!notify->isEmpty())
		{
			bGotIt = true;
			m_pNotifyNick->setText(*notify);
		}
	}
	m_pNotifyCheck->setChecked(bGotIt);
	m_pNotifyNick->setEnabled(bGotIt);
	if(!bGotIt)
		m_pNotifyNick->setText("");

	QString * avatar = m_pPropertyDict->find("avatar");
	bGotIt = false;
	if(avatar)
	{
		if(!avatar->isEmpty())
			m_pAvatarSelector->setImagePath(*avatar);
	}
}
