//=============================================================================
//
// File : class_popupmenu.cpp
// Creation date : Fri Mar 18 21:30:48 CEST 2005
// by Tonino Imbesi(Grifisx) and Alessandro Carbone(Noldor)
//
// This file is part of the KVirc irc client distribution
// Copyright (C) 2005-2008 Alessandro Carbone (elfonol at gmail dot com)
//
// 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 opinion) 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.
//
//=============================================================================
#include "class_popupmenu.h"
#include "kvi_error.h"
#include "kvi_debug.h"
#include "kvi_locale.h"
#include "kvi_iconmanager.h"
#include "kvi_tal_popupmenu.h"
#include <QCursor>
#include <QMenu>
#include <QAction>
/*
@doc: popupmenu
@keyterms:
popupmenu object class,
@title:
popupmenu class
@type:
class
@short:
Provides a popup menu.
@inherits:
[class]object[/class]
[class]widget[/class]
@description:
This widget can be used to display a popup menu.Technically, a popup menu consists of a list of menu items.[br]
You add items with insertItem(). An item is either a string. In addition, items can have an optional icon drawn on the very left side.[br]
@functions:
!fn: $insertItem(<text:string>,[icon_id:string])
Inserts menu items into a popup menu with optional icon and return the popup identifier.
!fn: $insertWidget(<widget:object>)[br]
Inserts widget items int a popup menu and return the popup identifier.[br]
The widget is treats as a separator; this means that the item is not selectable and you can, for example, simply insert a label if you need a popup menu with a title.
!fn: $insertHandle(<text_label:string>,<popupmenu:object>,[icon])
Inserts a submenu with optional icon into the popup menu.
!fn: $exec([<widget:objects>,<x:uinteger>,<y:integer>])
If called without paramaters show the popup menu at the current pointer position.[br]
With the optional parameters show the popup menu at the coordinate x,y widget parameter relative.
!fn: $removeItem(<popup_id:Uinteger>)
Removes the menu item that has the identifier id.
!fn: $removeItemAt(<index:uinteger>)
Removes the menu item at position index.
!fn: $insertSeparator(<index:uinteger>)
Inserts a separator at position index.[br]
If the index is negative the separator becomes the last menu item.
!fn: $activatedEvent(<popup_id:uinteger>)
This function is called when a menu item and return the the item id.[br]
The default implementation emits the [classfnc]$activated[/classfnc]() signal.
!fn: $highligthtedEvent(<popup_id:uinteger>)
This function is called when a menu item is highlighted and return the item id.[br]
The default implementation emits the [classfnc]$highlighted[/classfnc]() signal.
@signals:
!sg: $activated()
This signal is emitted by the default implementation of [classfnc]$activatedEvent[/classfnc]().
!sg: $highlighted()
This signal is emitted by the default implementation of [classfnc]$highlightedEvent[/classfnc]().
[br]
|-EXAMPLE POPUP MENU-|[br]
|--Start:
# First of all we create an array wich will be used to create random colors.[br]
%Hex[]=$array(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)[br]
[br]
class (ws,widget)[br]
{[br]
#In the constructor we create everything that belong to the single widget.[br]
constructor[br]
{[br]
#Geometry of the widget and setting-up of popupmenu [br]
$$->$setGeometry(%X,%Y,100,100)[br]
$$->%lay=$new(layout,$$)[br]
#Here we generate a cicle to create our labels inside the widget.[br]
%i=0[br]
while (%i<10)[br]
{[br]
$$->%label=$new(label,$$)[br]
$$->%label->$settext("Another class by N\&G")[br]
#We set our foreground's coulor using the hex arrey in random way.[br]
%color=%Hex[$rand(14)]%Hex[$rand(14)]%Hex[$rand(14)]%Hex[$rand(14)]%Hex[$rand(14)]%Hex[$rand(14)][br]
$$->%label->$setforegroundcolor(%color)[br]
$$->%label->$setautoresize(1)[br]
#We add the label to the widget's popupmenu.[br]
$$->%lay->$addwidget($$->%label,%i,0)[br]
%i++;[br]
}[br]
#We make the popupmenu relative to this widget: this is merely demonstrative.[br]
#because it creates 25 identical popups.[br]
$$->%Popupmenu=$new(popupmenu,$$)[br]
#we create the label widget wich will be used as popup's title[br]
$$->%Popuptitle=$new(label)[br]
$$->%Popuptitle->$settext(<B><U>"Windows Options"</B></U>)[br]
$$->%Popuptitle->$setAlignment(Center)[br]
#and we add it.[br]
%A=$$->%Popuptitle[br]
$$->%Popupmenu->$insertwidget(%A)[br]
#Here we keep the various IDs in the arrays[br]
%Tile[%I]=$$->%Popupmenu->$insertItem("Tile",118)[br]
%Cascade[%I]=$$->%Popupmenu->$insertItem("Cascade",115)[br]
$$->%Popupmenu->$insertSeparator(3)[br]
%Closeactw[%I]=$$->%Popupmenu->$insertItem("Close Active Window",08)[br]
%Closeallw[%I]=$$->%Popupmenu->$insertItem("Close All Window",58)[br]
$$->$show()[br]
privateimpl($$->%Popupmenu,activatedEvent)[br]
{[br]
%id=$0[br]
%i = 0[br]
#with this cicle we control wich of the items has been called comparing the id given back by the event with our arrays created before;[br]
while (%i<20)[br]
{[br]
if (%id == %Tile[%i]) return %Workspace->$tile()[br]
if (%id == %Cascade[%i]) return %Workspace->$cascade()[br]
if (%id == %Closeactw[%i]) return %Workspace->$closeactivewindow()[br]
if (%id == %Closeallw[%i]) return %Workspace->$closeallwindows()[br]
%i ++[br]
}[br]
}[br]
}[br]
#we activate the popup pushing the right mouse button on the widget[br]
mousepressevent[br]
{[br]
if ($0 == 1) $$->%Popupmenu->$exec()[br]
}[br]
}[br]
%Workspace=$new(workspace)[br]
%Workspace->$resize(640,480)[br]
%I=0[br]
%Cicle=1[br]
while (%I<20)[br]
{[br]
%X=$rand(500)[br]
%Y=$rand(480)[br]
%Widget=$new(ws,%Workspace)[br]
%I++[br]
}[br]
#Let's show!
%Workspace->$show[br]
|--End.[br][br]
*/
KVSO_BEGIN_REGISTERCLASS(KviKvsObject_popupmenu,"popupmenu","widget")
KVSO_REGISTER_HANDLER_BY_NAME(KviKvsObject_popupmenu,insertItem)
//KVSO_REGISTER_HANDLER_BY_NAME(KviKvsObject_popupmenu,"insertWidget", functioninsertWidget)
// KVSO_REGISTER_HANDLER_BY_NAME(KviKvsObject_popupmenu,"setTitle", functionsetTitle)
KVSO_REGISTER_HANDLER_BY_NAME(KviKvsObject_popupmenu,exec)
KVSO_REGISTER_HANDLER_BY_NAME(KviKvsObject_popupmenu,insertSeparator)
KVSO_REGISTER_HANDLER_BY_NAME(KviKvsObject_popupmenu,removeItem)
// events
KVSO_REGISTER_HANDLER_BY_NAME(KviKvsObject_popupmenu,highlightedEvent)
KVSO_REGISTER_HANDLER_BY_NAME(KviKvsObject_popupmenu,activatedEvent)
KVSO_END_REGISTERCLASS(KviKvsObject_popupmenu)
KVSO_BEGIN_CONSTRUCTOR(KviKvsObject_popupmenu,KviKvsObject_widget)pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888 } /* Comment */
.highlight .err { color: #A61717; background-color: #E3D2D2 } /* Error */
.highlight .k { color: #080; font-weight: bold } /* Keyword */
.highlight .ch { color: #888 } /* Comment.Hashbang */
.highlight .cm { color: #888 } /* Comment.Multiline */
.highlight .cp { color: #C00; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888 } /* Comment.Single */
.highlight .cs { color: #C00; font-weight: bold; background-color: #FFF0F0 } /* Comment.Special */
.highlight .gd { color: #000; background-color: #FDD } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #A00 } /* Generic.Error */
.highlight .gh { color: #333 } /* Generic.Heading */
.highlight .gi { color: #000; background-color: #DFD } /* Generic.Inserted */
.highlight .go { color: #888 } /* Generic.Output */
.highlight .gp { color: #555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666 } /* Generic.Subheading */
.highlight .gt { color: #A00 } /* Generic.Traceback */
.highlight .kc { color: #080; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #080; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #080; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #080 } /* Keyword.Pseudo */
.highlight .kr { color: #080; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #00D; font-weight: bold } /* Literal.Number */
.highlight .s { color: #D20; background-color: #FFF0F0 } /* Literal.String */
.highlight .na { color: #369 } /* Name.Attribute */
.highlight .nb { color: #038 } /* Name.Builtin */
.highlight .nc { color: #B06; font-weight: bold } /* Name.Class */
.highlight .no { color: #036; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555 } /* Name.Decorator */
.highlight .ne { color: #B06; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #06B; font-weight: bold } /* Name.Function */
.highlight .nl { color: #369; font-style: italic } /* Name.Label */
.highlight .nn { color: #B06; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #369; font-weight: bold } /* Name.Property */
.highlight .nt { color: #B06; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #369 } /* Name.Variable */
.highlight .ow { color: #080 } /* Operator.Word */
.highlight .w { color: #BBB } /* Text.Whitespace */
.highlight .mb { color: #00D; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #00D; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #00D; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #00D; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #00D; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #D20; background-color: #FFF0F0 } /* Literal.String.Affix */
.highlight .sb { color: #D20; background-color: #FFF0F0 } /* Literal.String.Backtick */
.highlight .sc { color: #D20; background-color: #FFF0F0 } /* Literal.String.Char */
.highlight .dl { color: #D20; background-color: #FFF0F0 } /* Literal.String.Delimiter */
.highlight .sd { color: #D20; background-color: #FFF0F0 } /* Literal.String.Doc */
.highlight .s2 { color: #D20; background-color: #FFF0F0 } /* Literal.String.Double */
.highlight .se { color: #04D; background-color: #FFF0F0 } /* Literal.String.Escape */
.highlight .sh { color: #D20; background-color: #FFF0F0 } /* Literal.String.Heredoc */
.highlight .si { color: #33B; background-color: #FFF0F0 } /* Literal.String.Interpol */
.highlight .sx { color: #2B2; background-color: #F0FFF0 } /* Literal.String.Other */
.highlight .sr { color: #080; background-color: #FFF0FF } /* Literal.String.Regex */
.highlight .s1 { color: #D20; background-color: #FFF0F0 } /* Literal.String.Single */
.highlight .ss { color: #A60; background-color: #FFF0F0 } /* Literal.String.Symbol */
.highlight .bp { color: #038 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #06B; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #369 } /* Name.Variable.Class */
.highlight .vg { color: #D70 } /* Name.Variable.Global */
.highlight .vi { color: #33B } /* Name.Variable.Instance */
.highlight .vm { color: #369 } /* Name.Variable.Magic */
.highlight .il { color: #00D; font-weight: bold } /* Literal.Number.Integer.Long *///=============================================================================
//
// 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 opinion) 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_
#include "RegisteredUserEntryDialog.h"
#include "RegistrationWizard.h"
#include "RegisteredUsersDialog.h"
#include "KviRegisteredUserDataBase.h"
#include "KviLocale.h"
#include "KviIrcMask.h"
#include "kvi_debug.h"
#include "KviMainWindow.h"
#include "KviIconManager.h"
#include "KviApplication.h"
#include "KviOptions.h"
#include "KviFile.h"
#include "KviFileDialog.h"
#include "KviMessageBox.h"
#include "KviFileUtils.h"
#include "kvi_settings.h"
#include "KviStringConversion.h"
#include "KviOptions.h"
#include "KviPointerHashTable.h"
#include "KviTalHBox.h"
#include "KviTalVBox.h"
#include <QLayout>
#include <QLabel>
#include <QImageWriter>
#include <QImageReader>
#include <QImage>
#include <QString>
#include <QDesktopWidget>
#include <QComboBox>
#include <QToolTip>
#include <QStyle>
#include <QPainter>
#include <QInputDialog>
#include <QEvent>
#include <QCloseEvent>
#include <QAbstractItemView>
#include <QTextDocument>
#include <QAbstractTextDocumentLayout>
#define LVI_ICON_SIZE 32
#define LVI_BORDER 4
#define LVI_SPACING 8
#define LVI_MINIMUM_TEXT_WIDTH 300
#define LVI_MINIMUM_CELL_WIDTH (LVI_MINIMUM_TEXT_WIDTH + LVI_BORDER + LVI_ICON_SIZE + LVI_SPACING + LVI_BORDER)
extern RegisteredUsersDialog * g_pRegisteredUsersDialog;
KviRegisteredUsersListView::KviRegisteredUsersListView(QWidget * par)
: QTreeWidget(par)
{
setColumnCount(2);
QStringList labels;
labels << __tr2qs_ctx("Name","register") << __tr2qs_ctx("Flags","register");
setHeaderLabels(labels);
setColumnWidth(0,360);
setColumnWidth(1,20);
setAllColumnsShowFocus(true);
setSelectionBehavior(QAbstractItemView::SelectRows);
setSelectionMode(QAbstractItemView::ExtendedSelection);
setRootIsDecorated(TRUE);
setSortingEnabled(true);
setToolTip(__tr2qs_ctx("<center>This is the list of registered users. " \
"KVIrc can automatically recognize and associate properties to them.<br>" \
"Use the buttons on the right to add, edit and remove entries. " \
"The \"notify\" column allows you to quickly add users to the notify list. " \
"Notify list fine-tuning can be performed by editing the entry properties.</center>","register"));
}
void KviRegisteredUsersListView::mousePressEvent (QMouseEvent *e)
{
if (e->button() == Qt::RightButton)
{
QTreeWidgetItem *i= itemAt(e->pos());
if (i) emit rightButtonPressed(i,QCursor::pos());
}
QTreeWidget::mousePressEvent(e);
}
RegisteredUsersDialogItem::RegisteredUsersDialogItem(QTreeWidgetItem * par,KviRegisteredUser * u)
: RegisteredUsersDialogItemBase(User,par), m_pUser(u)
{
QString szTmp;
QString t = "<nobr><b>";
t += u->name();
t += "</b> [";
szTmp = m_pUser->getProperty("notify");
if(szTmp.isEmpty())
{
t += __tr2qs_ctx("Notify disabled","register");
} else {
t += __tr2qs_ctx("Notify as:","register");
t += " ";
t += szTmp;
}
t += "]</nobr>";
t += "<br><nobr><font size=\"-1\">";
szTmp = m_pUser->getProperty("comment");
if(szTmp.isEmpty())
{
t += __tr2qs_ctx("No comment set","register");
} else {
t += __tr2qs_ctx("Comment:","register");
t += " ";
t += m_pUser->getProperty("comment");
}
t += "</font></nobr>";
m_pText.setHtml(t);
m_pText.setTextWidth(-1);
// setText(0,t);
}
RegisteredUsersDialogItem::~RegisteredUsersDialogItem()
{
}
QString RegisteredUsersDialogItem::key(int,bool) const
{
return m_pUser->name();
}
void RegisteredUsersDialogItemDelegate::paint( QPainter * p, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
RegisteredUsersDialogItemBase *item=static_cast<RegisteredUsersDialogItemBase *>(index.internalPointer());
if(item->type()==RegisteredUsersDialogItemBase::Group)
{
//groups
QStyledItemDelegate::paint(p, option, index);
} else {
QStyleOptionViewItemV4 opt = option;
initStyleOption(&opt, index);
if (opt.state & QStyle::State_Selected)
QApplication::style()->drawPrimitive(QStyle::PE_PanelItemViewItem,&opt, p);
RegisteredUsersDialogItem *it=(RegisteredUsersDialogItem*)item;
if(index.column()==0)
{
QPoint pt=opt.rect.topLeft();
pt.setX(pt.x()+LVI_BORDER);
pt.setY(pt.y()+LVI_BORDER);
p->drawPixmap(pt, *(g_pIconManager->getBigIcon(KVI_BIGICON_REGUSERS)));
QRect cliprect=QRect(QPoint(0,0),QSize(opt.rect.width()-(LVI_ICON_SIZE+LVI_SPACING+LVI_BORDER),opt.rect.height()));
p->save();
p->translate(opt.rect.x()+LVI_ICON_SIZE+LVI_SPACING, opt.rect.y());
it->m_pText.drawContents(p, cliprect);
p->restore();
} else {
if(it->user())
{
if(!it->user()->getProperty("notify").isEmpty())
p->drawPixmap(opt.rect.topLeft().x()+LVI_BORDER,opt.rect.topLeft().y()+LVI_BORDER,*(g_pIconManager->getSmallIcon(KviIconManager::NotifyOnLine)));
else
p->drawPixmap(opt.rect.topLeft().x()+LVI_BORDER,opt.rect.topLeft().y()+LVI_BORDER,*(g_pIconManager->getSmallIcon(KviIconManager::NotifyOffLine)));
if(it->user()->ignoreEnagled())
p->drawPixmap(opt.rect.topLeft().x()+LVI_BORDER,opt.rect.topLeft().y()+2*LVI_BORDER+16,*(g_pIconManager->getSmallIcon(KviIconManager::Ignore)));
}
}
}
}
QSize RegisteredUsersDialogItemDelegate::sizeHint( const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
RegisteredUsersDialogItemBase *item=static_cast<RegisteredUsersDialogItemBase *>(index.internalPointer());
if(item->type()==RegisteredUsersDialogItemBase::Group)
{
//groups
return QStyledItemDelegate::sizeHint(option, index);
} else {
//users
// RegisteredUsersDialogItem *it=(RegisteredUsersDialogItem*)item;
return QSize(300, LVI_ICON_SIZE+2*LVI_BORDER);
}
}
RegisteredUsersDialog::RegisteredUsersDialog(QWidget * par)
: QWidget(par)
{
g_pRegisteredUsersDialog = this;
g_pLocalRegisteredUserDataBase = new KviRegisteredUserDataBase();
g_pLocalRegisteredUserDataBase->copyFrom(g_pRegisteredUserDataBase);
setWindowIcon(*(g_pIconManager->getSmallIcon(KviIconManager::RegUsers)));
setWindowTitle(__tr2qs_ctx("Registered Users - KVIrc","register"));
QGridLayout * g = new QGridLayout(this);
m_pListView = new KviRegisteredUsersListView(this);
m_pListView->setItemDelegate(new RegisteredUsersDialogItemDelegate());
connect(m_pListView,SIGNAL(itemPressed(QTreeWidgetItem *,int)),this,SLOT(itemPressed(QTreeWidgetItem *,int)));
connect(m_pListView,SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),this,SLOT(itemDoubleClicked(QTreeWidgetItem *, int)));
g->addWidget(m_pListView,0,0,2,2);
KviTalVBox * vbox = new KviTalVBox(this);
vbox->setSpacing(4);
g->addWidget(vbox,0,2);
m_pWizardAddButton = new QPushButton(__tr2qs_ctx("Add (Wizard)...","register"),vbox);
connect(m_pWizardAddButton,SIGNAL(clicked()),this,SLOT(addWizardClicked()));
m_pWizardAddButton->setToolTip(__tr2qs_ctx("Add a registered user by means of a user-friendly wizard.","register"));
m_pWizardAddButton->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::NewItemByWizard)));
m_pAddButton = new QPushButton(__tr2qs_ctx("&Add...","register"),vbox);
connect(m_pAddButton,SIGNAL(clicked()),this,SLOT(addClicked()));
m_pAddButton->setToolTip(__tr2qs_ctx("Open the edit dialog to create a new user entry.","register"));
m_pAddButton->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::NewItem)));
m_pAddGroupButton = new QPushButton(__tr2qs_ctx("&Add Group...","register"),vbox);
connect(m_pAddGroupButton,SIGNAL(clicked()),this,SLOT(addGroupClicked()));
m_pAddGroupButton->setToolTip(__tr2qs_ctx("Adds a new group","register"));
m_pAddGroupButton->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::NewItem)));
m_pRemoveButton = new QPushButton(__tr2qs_ctx("Re&move","register"),vbox);
connect(m_pRemoveButton,SIGNAL(clicked()),this,SLOT(removeClicked()));
m_pRemoveButton->setEnabled(false);
m_pRemoveButton->setToolTip(__tr2qs_ctx("Remove the currently selected entries.","register"));
m_pRemoveButton->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::DeleteItem)));
m_pEditButton = new QPushButton(__tr2qs_ctx("&Edit...","register"),vbox);
connect(m_pEditButton,SIGNAL(clicked()),this,SLOT(editClicked()));
m_pEditButton->setEnabled(false);
m_pEditButton->setToolTip(__tr2qs_ctx("Edit the first selected entry.","register"));
m_pEditButton->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::EditItem)));
QFrame * f = new QFrame(vbox);
f->setFrameStyle(QFrame::HLine | QFrame::Sunken);
m_pSelectAllButton = new QPushButton(__tr2qs_ctx("Select all","register"),vbox);
connect(m_pSelectAllButton,SIGNAL(clicked()),this,SLOT(selectAllClicked()));
m_pSelectAllButton->setToolTip(__tr2qs_ctx("Select all the entries","register"));
m_pSelectAllButton->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::Plus)));
m_pExportButton = new QPushButton(__tr2qs_ctx("Export To...","register"),vbox);
m_pExportButton->setEnabled(false);
connect(m_pExportButton,SIGNAL(clicked()),this,SLOT(exportClicked()));
m_pExportButton->setToolTip(__tr2qs_ctx("Export the selected entries to a file.<br>All the data associated with the selected registered users will be exported.<br>You (or anyone else) can later import the entries by using the \"Import\" button.","register"));
m_pExportButton->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::Floppy)));
m_pImportButton = new QPushButton(__tr2qs_ctx("Import From...","register"),vbox);
connect(m_pImportButton,SIGNAL(clicked()),this,SLOT(importClicked()));
m_pImportButton->setToolTip(__tr2qs_ctx("Import entries from a file exported earlier by the \"export\" function of this dialog.","register"));
m_pImportButton->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::Folder)));
KviTalHBox * hbox = new KviTalHBox(this);
hbox->setSpacing(4);
g->addWidget(hbox,3,1,1,2);
QPushButton * b;
b = new QPushButton(__tr2qs_ctx("&OK","register"),hbox);
connect(b,SIGNAL(clicked()),this,SLOT(okClicked()));
b->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::Accept)));
//b->setMinimumWidth(120);
b = new QPushButton(__tr2qs_ctx("Cancel","register"),hbox);
connect(b,SIGNAL(clicked()),this,SLOT(cancelClicked()));
b->setIcon(*(g_pIconManager->getSmallIcon(KviIconManager::Discard)));
//b->setMinimumWidth(120);
g->addItem(new QSpacerItem(0, 15), 2, 0);
g->setColumnStretch(0,1);
g->setRowStretch(1,1);
connect(m_pListView,SIGNAL(itemSelectionChanged()),this,SLOT(selectionChanged()));
connect(m_pListView,SIGNAL(rightButtonPressed(QTreeWidgetItem *, QPoint)),this,SLOT(rightButtonPressed(QTreeWidgetItem *, QPoint)));
fillList();
if(!parent())
{
if(KVI_OPTION_RECT(KviOption_rectRegisteredUsersDialogGeometry).y() < 5)
KVI_OPTION_RECT(KviOption_rectRegisteredUsersDialogGeometry).setY(5);
//setGeometry(KVI_OPTION_RECT(KviOption_rectRegisteredUsersDialogGeometry));
resize(KVI_OPTION_RECT(KviOption_rectRegisteredUsersDialogGeometry).width(),
KVI_OPTION_RECT(KviOption_rectRegisteredUsersDialogGeometry).height());
QRect rect = g_pApp->desktop()->screenGeometry(g_pMainWindow);
move(rect.x() + ((rect.width() - KVI_OPTION_RECT(KviOption_rectRegisteredUsersDialogGeometry).width())/2),rect.y() + ((rect.height() - KVI_OPTION_RECT(KviOption_rectRegisteredUsersDialogGeometry).height())/2));
}
}
RegisteredUsersDialog::~RegisteredUsersDialog()
{
#ifndef COMPILE_ON_MAC
if(!parent())KVI_OPTION_RECT(KviOption_rectRegisteredUsersDialogGeometry) = QRect(pos().x(),pos().y(),size().width(),size().height());
#else
if(!parent())KVI_OPTION_RECT(KviOption_rectRegisteredUsersDialogGeometry) = geometry();
#endif
g_pRegisteredUsersDialog = 0;
delete g_pLocalRegisteredUserDataBase;
g_pLocalRegisteredUserDataBase = 0;
}
void RegisteredUsersDialog::itemPressed(QTreeWidgetItem *it,int c)
{
if(!it)return;
RegisteredUsersDialogItemBase* b=(RegisteredUsersDialogItemBase*)it;
if(b->type()==RegisteredUsersDialogItemBase::User)
{
RegisteredUsersDialogItem *i = (RegisteredUsersDialogItem *)it;
QRect r = m_pListView->visualItemRect(i);
int daw = m_pListView->columnWidth(0);
QPoint ppp = m_pListView->mapFromGlobal(QCursor::pos());
if((c == 1) && (ppp.x() < (r.height() + 5 + daw)))
{
// notify list toggle
if(i->user()->getProperty("notify").isEmpty())
{
// try to find the nicknames to be notified
QString szMask;
for(KviIrcMask * m = i->user()->maskList()->first();m;m = i->user()->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 = i->user()->name();
szMask.replace(" ","");
szMask.replace("'","");
szMask.replace("&","");
szMask.replace(",","");
}
i->user()->setProperty("notify",szMask);
} else {
i->user()->setProperty("notify",QString("")); // kill that
}
m_pListView->repaint(r);
}
}
}
void RegisteredUsersDialog::itemDoubleClicked(QTreeWidgetItem *it, int)
{
if(!it)return;
RegisteredUsersDialogItemBase* b=(RegisteredUsersDialogItemBase*)it;
if(b->type()==RegisteredUsersDialogItemBase::User)
{
editItem((RegisteredUsersDialogItem *)it);
} else {
RegisteredUsersGroupItem *i = (RegisteredUsersGroupItem *)b;
editGroup(i->group());
}
}
void RegisteredUsersDialog::addGroupClicked()
{
bool ok;
QString text = QInputDialog::getText( this,
"KVIrc", __tr2qs_ctx("Group name:","register"), QLineEdit::Normal,
QString(), &ok );
if ( ok && !text.isEmpty() ) {
g_pLocalRegisteredUserDataBase->addGroup(text);
fillList();
}
}
void RegisteredUsersDialog::editGroup(KviRegisteredUserGroup* group)
{
bool ok;
QString text = QInputDialog::getText( this,
"KVIrc", __tr2qs_ctx("Group name:","register"), QLineEdit::Normal,
group->name(), &ok );
if ( ok && !text.isEmpty() ) {
QString szOldGroup=group->name();
g_pLocalRegisteredUserDataBase->groupDict()->setAutoDelete(0);
g_pLocalRegisteredUserDataBase->groupDict()->remove(szOldGroup);
g_pLocalRegisteredUserDataBase->groupDict()->setAutoDelete(1);
group->setName(text);
g_pLocalRegisteredUserDataBase->groupDict()->insert(text,group);
KviPointerHashTable<QString,KviRegisteredUser> * d = g_pLocalRegisteredUserDataBase->userDict();
for(KviRegisteredUser * u = d->first();u;u = d->next())
{
if(u->group()==szOldGroup)
u->setGroup(text);
}
fillList();
// select the last edited item
for(int c=0;c<m_pListView->topLevelItemCount();c++)
{
QTreeWidgetItem * pGroup = m_pListView->topLevelItem(c);
if(KviQString::equalCI(pGroup->text(0),text))
{
pGroup->setSelected(true);
m_pListView->setCurrentItem(pGroup);
break;
}
}
}
}
void RegisteredUsersDialog::rightButtonPressed ( QTreeWidgetItem * pItem, QPoint pnt)
{
if(pItem)
{
RegisteredUsersDialogItemBase* b=(RegisteredUsersDialogItemBase*)pItem;
if(b->type()==RegisteredUsersDialogItemBase::User)
{
KviTalPopupMenu *groups = new KviTalPopupMenu;
KviPointerHashTable<QString,KviRegisteredUserGroup> * pGroups = g_pLocalRegisteredUserDataBase->groupDict();
m_TmpDict.clear();
for(KviPointerHashTableEntry<QString,KviRegisteredUserGroup> * g = pGroups->firstEntry();g;g = pGroups->nextEntry())
{
int id=groups->insertItem(g->key());
m_TmpDict.replace(id,g->data());
}
connect(groups,SIGNAL(activated ( int )),this,SLOT(moveToGroupMenuClicked(int)));
KviTalPopupMenu *mainPopup = new KviTalPopupMenu;
mainPopup->insertItem(__tr2qs_ctx("Move to group","register"),groups);
mainPopup->exec(pnt);
}
}
}
void RegisteredUsersDialog::moveToGroupMenuClicked(int id)
{
QString szGroup=(*(m_TmpDict.find(id)))->name();
QList<QTreeWidgetItem *> list = m_pListView->selectedItems();
for(int i=0; i<list.count(); i++)
{
RegisteredUsersDialogItemBase* b=(RegisteredUsersDialogItemBase*)(list.at(i));
if(b->type()==RegisteredUsersDialogItemBase::User)
{
((RegisteredUsersDialogItem *)list.at(i))->user()->setGroup(szGroup);
}
}
fillList();
}
void RegisteredUsersDialog::fillList()
{
m_pListView->clear();
KviPointerHashTable<QString,RegisteredUsersGroupItem> groupItems(5,false);
groupItems.setAutoDelete(false);
KviPointerHashTable<QString,KviRegisteredUserGroup> * pGroups = g_pLocalRegisteredUserDataBase->groupDict();
for(KviRegisteredUserGroup * g = pGroups->first();g;g = pGroups->next())
{
RegisteredUsersGroupItem* pCur = new RegisteredUsersGroupItem(m_pListView,g);
groupItems.insert(g->name(),pCur);
pCur->setExpanded(TRUE);
}
KviPointerHashTable<QString,KviRegisteredUser> * d = g_pLocalRegisteredUserDataBase->userDict();
RegisteredUsersDialogItem * item;
for(KviRegisteredUser * u = d->first();u;u = d->next())
{
if(u->group().isEmpty())
u->setGroup(__tr2qs_ctx("Default","register"));
if(groupItems.find(u->group()))
{
item = new RegisteredUsersDialogItem(groupItems.find(u->group()),u);
} else if(groupItems.find(__tr2qs_ctx("Default","register"))) {
item = new RegisteredUsersDialogItem(groupItems.find(__tr2qs_ctx("Default","register")),u);
} else { //should never be called
KviRegisteredUserGroup* pGroup = g_pLocalRegisteredUserDataBase->addGroup(__tr2qs_ctx("Default","register"));
RegisteredUsersGroupItem* pCur = new RegisteredUsersGroupItem(m_pListView,pGroup);
groupItems.insert(__tr2qs_ctx("Default","register"),pCur);
item = new RegisteredUsersDialogItem(pCur,u);
}
}
if(m_pListView->topLevelItem(0))
{
m_pListView->topLevelItem(0)->setSelected(true);
m_pListView->setCurrentItem(m_pListView->topLevelItem(0));
}
}
void RegisteredUsersDialog::closeEvent(QCloseEvent *e)
{
m_pListView->clear();
e->accept();
okClicked();
//delete this;
}
void RegisteredUsersDialog::okClicked()
{
m_pListView->clear();
g_pRegisteredUserDataBase->copyFrom(g_pLocalRegisteredUserDataBase);
g_pApp->restartNotifyLists();
delete this;
}
void RegisteredUsersDialog::cancelClicked()
{
m_pListView->clear();
delete this;
}
void RegisteredUsersDialog::addClicked()
{
RegisteredUserEntryDialog * dlg = new RegisteredUserEntryDialog(this,0);
int ret = dlg->exec();
delete dlg;
if(!g_pRegisteredUsersDialog)return; // we have been deleted!
if(ret == QDialog::Accepted)
{
fillList();
}
}
void RegisteredUsersDialog::addWizardClicked()
{
RegistrationWizard * w = new RegistrationWizard("",g_pLocalRegisteredUserDataBase,this,true);
int ret = w->exec();
delete w;
if(!g_pRegisteredUsersDialog)return; // we have been deleted!
if(ret == QDialog::Accepted)
{
fillList();
}
}
void RegisteredUsersDialog::removeClicked()
{
QList<QTreeWidgetItem *> list = m_pListView->selectedItems();
for(int i=0; i<list.count(); i++)
{
RegisteredUsersDialogItemBase* b=(RegisteredUsersDialogItemBase*)(list.at(i));
if(b->type()==RegisteredUsersDialogItemBase::User)
{
g_pLocalRegisteredUserDataBase->removeUser(((RegisteredUsersDialogItem *)list.at(i))->user()->name());
} else {
g_pLocalRegisteredUserDataBase->removeGroup(((RegisteredUsersGroupItem *)list.at(i))->group()->name());
}
}
fillList();
// RegisteredUsersDialogItem *it = (RegisteredUsersDialogItem *)m_pListView->firstChild();
// RegisteredUsersDialogItemBase* b=(RegisteredUsersDialogItemBase*)it;
// if(b->type()==RegisteredUsersDialogItemBase::User)
// {
// KviPointerList<RegisteredUsersDialogItem> l;
// l.setAutoDelete(false);
// while(it)
// {
// if(it->isSelected())l.append(it);
// it = (RegisteredUsersDialogItem *)it->nextSibling();
// }
//
// for(RegisteredUsersDialogItem * i = l.first();i;i = l.next())
// {
// //g_pLocalRegisteredUserDataBase->removeUser(i->user()->name());
// delete i;
// }
// } else {
//
// }
}
void RegisteredUsersDialog::editClicked()
{
RegisteredUsersDialogItemBase* b=(RegisteredUsersDialogItemBase*)(m_pListView->currentItem());
if(!b)return;
if(b->type()==RegisteredUsersDialogItemBase::User)
{
RegisteredUsersDialogItem *i = (RegisteredUsersDialogItem *)b;
editItem(i);
} else {
RegisteredUsersGroupItem *i = (RegisteredUsersGroupItem *)b;
editGroup(i->group());
}
}
void RegisteredUsersDialog::editItem(RegisteredUsersDialogItem * i)
{
KviRegisteredUser * u = i->user();
i->setUser(0);
QString szName = u->name();
RegisteredUserEntryDialog * dlg = new RegisteredUserEntryDialog(this,u);
int res = dlg->exec();
delete dlg;
if(!g_pRegisteredUsersDialog)return; // we have been deleted!
if(res == QDialog::Accepted)
{
fillList();
// select the last edited item
for(int c=0;c<m_pListView->topLevelItemCount();c++)
{
QTreeWidgetItem * pGroup = m_pListView->topLevelItem(c);
for(int d=0;d<pGroup->childCount();d++)
{
RegisteredUsersDialogItem * pUser = (RegisteredUsersDialogItem*) pGroup->child(d);
if(KviQString::equalCI(pUser->user()->name(),szName))
{
pUser->setSelected(true);
m_pListView->setCurrentItem(pUser);
break;
}
}
}
return;
}
i->setUser(u);
m_pListView->update();
}
void RegisteredUsersDialog::selectionChanged()
{
bool bHaveSelected = !m_pListView->selectedItems().empty();
m_pEditButton->setEnabled(bHaveSelected);
m_pRemoveButton->setEnabled(bHaveSelected);
m_pExportButton->setEnabled(bHaveSelected);
}
#define KVI_REGUSER_DB_FILE_MAGIC 0x5334DBDB
#define KVI_REGUSER_DB_FILE_VERSION 1
typedef struct _KviReguserDbFileHeader
{
kvi_u32_t magic;
kvi_u32_t version;
kvi_u32_t nentries;
} KviReguserDbFileHeader;
void RegisteredUsersDialog::exportClicked()
{
unsigned int nEntries = 0;
QList<QTreeWidgetItem *> list = m_pListView->selectedItems();
//only "user" entries matters, discard groups from count
for(int i=0; i<list.count(); i++)
{
if(((RegisteredUsersDialogItemBase *)list.at(i))->type() == RegisteredUsersDialogItemBase::User)
nEntries++;
}
if(nEntries < 1)
{
KviMessageBox::warning(__tr2qs_ctx("No entries selected.","register"));
return;
}
QString buffer;
if(!KviFileDialog::askForSaveFileName(buffer,__tr2qs_ctx("Choose a Filename - KVIrc","register"),0,0,true,true))return;
if(!g_pRegisteredUsersDialog)return; // we have been deleted!
KviFile f(buffer);
if(!f.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
KviMessageBox::warning(__tr2qs_ctx("Can't open file %Q for writing.","register"),&buffer);
return;
}
KviReguserDbFileHeader hf;
hf.magic = KVI_REGUSER_DB_FILE_MAGIC;
hf.version = KVI_REGUSER_DB_FILE_VERSION;
hf.nentries = nEntries;
if(f.write((const char *)&hf,sizeof(KviReguserDbFileHeader)) != sizeof(KviReguserDbFileHeader))goto write_error;
for(int i=0; i<list.count(); i++)
{
RegisteredUsersDialogItemBase *pBase = (RegisteredUsersDialogItemBase *)list.at(i);
if(pBase->type()!=RegisteredUsersDialogItemBase::User)
continue;
KviRegisteredUser * u = ((RegisteredUsersDialogItem *)list.at(i))->user();
if(u)
{
if(!f.save(u->name()))goto write_error;
KviPointerHashTable<QString,QString> * pd = u->propertyDict();
if(pd)
{
if(!f.save(pd->count()))goto write_error;
for(KviPointerHashTableEntry<QString,QString> * pCur = pd->firstEntry();pCur;pCur = pd->nextEntry())
{
QString key = pCur->key();
if(!f.save(key))goto write_error;
if(!f.save(*(pCur->data())))goto write_error;
}
} else {
if(!f.save(0))goto write_error;
}
KviPointerList<KviIrcMask> * ml = u->maskList();
if(ml)
{
if(!f.save(ml->count()))goto write_error;
for(KviIrcMask * m = ml->first();m;m = ml->next())
{
QString fullMask;
m->mask(fullMask,KviIrcMask::NickUserHost);
if(!f.save(fullMask))goto write_error;
}
} else {
if(!f.save(0))goto write_error;
}
QString avatar;
if(u->getProperty("avatar",avatar))
{
KviAvatar * av = g_pIconManager->getAvatar(QString(),avatar);
if(av)
{
if(!av->pixmap()->isNull())
{
if(!f.save(1))goto write_error;
QImageWriter io;
io.setDevice(&f);
io.setFormat("PNG");
if(!io.write(av->pixmap()->toImage()))goto write_error;
} else {
if(!f.save(0))goto write_error;
}
} else {
if(!f.save(0))goto write_error;
}
} else {
if(!f.save(0))goto write_error;
}
}
}
goto succesfull_export;
write_error:
KviMessageBox::warning(__tr2qs_ctx("Can't export the registered users database: Write error.","register"));
f.close();
return;
succesfull_export:
f.close();
}
void RegisteredUsersDialog::selectAllClicked()
{
m_pListView->selectAll();
}
void RegisteredUsersDialog::importClicked()
{
//KviCString buffer;
QString buffer;
if(!KviFileDialog::askForOpenFileName(buffer,__tr2qs_ctx("Choose a Filename - KVIrc","register")))return;
if(!g_pRegisteredUsersDialog)return; // we have been deleted!
KviFile f(buffer);
if(!f.open(QIODevice::ReadOnly))
{
KviMessageBox::warning(__tr2qs_ctx("Can't open file %s for reading.","register"),&buffer);
return;
}
KviReguserDbFileHeader hf;
unsigned int idx;
if(f.read((char *)&hf,sizeof(KviReguserDbFileHeader)) != sizeof(KviReguserDbFileHeader))goto read_error;
if(hf.magic != KVI_REGUSER_DB_FILE_MAGIC)
{
KviMessageBox::warning(__tr2qs_ctx("The file %s doesn't appear to be a valid registered users database.","register"),&buffer);
f.close();
return;
}
if(hf.version != KVI_REGUSER_DB_FILE_VERSION)
{
KviMessageBox::warning(__tr2qs_ctx("The file %s contains an invalid registered users database version.","register"),&buffer);
f.close();
return;
}
for(idx = 0;idx < hf.nentries;idx++)
{
QString szName;
if(!f.load(szName))goto read_error;
KviRegisteredUser * u = g_pLocalRegisteredUserDataBase->getUser(szName);
if(!u) goto read_error;
unsigned int count = 0;
if(!f.load(count))goto read_error;
for(unsigned int up = 0;up < count;up++)
{
QString szKey,szValue;
if(!f.load(szKey))goto read_error;
if(!f.load(szValue))goto read_error;
u->setProperty(szKey,szValue);
}
if(!f.load(count))goto read_error;
for(unsigned int um = 0;um < count;um++)
{
QString szMask;
if(!f.load(szMask))goto read_error;
if(!szMask.isEmpty())
{
KviIrcMask * m = new KviIrcMask(szMask);
g_pLocalRegisteredUserDataBase->addMask(u,m);
}
}
if(!f.load(count))goto read_error;
if(count)
{
// there is an avatar
QImage img;
QImageReader io;
io.setDevice(&f);
io.setFormat("PNG");
img=io.read();
// if(io.read())goto read_error;
if(img.isNull())qDebug("Ops.. readed a null image ?");
QString fName = u->name();
KviFileUtils::adjustFilePath(fName);
QString fPath;
int rnm = 0 ;
do
{
g_pApp->getLocalKvircDirectory(fPath,KviApplication::Avatars,fName);
fPath.append(QString("%1.png").arg(rnm));
rnm++;
} while(KviFileUtils::fileExists(fPath));
if(!img.save(fPath,"PNG"))
{
qDebug("Can't save image %s",fPath.toUtf8().data());
} else {
u->setProperty("avatar",fPath);
}
}
}
goto succesfull_import;
read_error:
KviMessageBox::warning(__tr2qs_ctx("Can't import the registered users database: Read error.","register"));
f.close();
return;
succesfull_import:
f.close();
fillList();
}
#ifndef COMPILE_USE_STANDALONE_MOC_SOURCES
#include "dialog.moc"
#endif //!COMPILE_USE_STANDALONE_MOC_SOURCES