+
+void ContextMenuActionProvider::addIgnoreMenu(QMenu *menu, const QString &hostmask, const QMap<QString, bool> &ignoreMap) {
+ QMenu *ignoreMenu = _nickIgnoreMenuAction->menu();
+ ignoreMenu->clear();
+ QString nick = nickFromMask(hostmask);
+ QString ident = userFromMask(hostmask);
+ QString host = hostFromMask(hostmask);
+ QString domain = host;
+ QRegExp domainRx = QRegExp("(\\.[^.]+\\.\\w+\\D)$");
+ if(domainRx.indexIn(host) != -1)
+ domain = domainRx.cap(1);
+ // we can't rely on who-data
+ // if we don't have the data, we skip actions where we would need it
+ bool haveWhoData = !ident.isEmpty() && !host.isEmpty();
+
+ // add "Add Ignore Rule" description
+ ignoreMenu->addAction(_ignoreDescriptions.at(0));
+
+ if(haveWhoData) {
+ QString text;
+ text = QString("*!%1@%2").arg(ident, host);
+ action(NickIgnoreUser)->setText(text);
+ action(NickIgnoreUser)->setProperty("ignoreRule", text);
+
+ text = QString("*!*@%1").arg(host);
+ action(NickIgnoreHost)->setText(text);
+ action(NickIgnoreHost)->setProperty("ignoreRule", text);
+
+ text = domain.at(0) == '.' ? QString("*!%1@*%2").arg(ident, domain)
+ : QString("*!%1@%2").arg(ident, domain);
+
+ action(NickIgnoreDomain)->setText(text);
+ action(NickIgnoreDomain)->setProperty("ignoreRule", text);
+
+ if(!ignoreMap.contains(action(NickIgnoreUser)->property("ignoreRule").toString()))
+ ignoreMenu->addAction(action(NickIgnoreUser));
+ if(!ignoreMap.contains(action(NickIgnoreHost)->property("ignoreRule").toString()))
+ ignoreMenu->addAction(action(NickIgnoreHost));
+ // we only add that NickIgnoreDomain if it isn't the same as NickIgnoreUser
+ // as happens with @foobar.com hostmasks and ips
+ if(!ignoreMap.contains(action(NickIgnoreDomain)->property("ignoreRule").toString())
+ && action(NickIgnoreUser)->property("ignoreRule").toString() != action(NickIgnoreDomain)->property("ignoreRule").toString())
+ ignoreMenu->addAction(action(NickIgnoreDomain));
+ }
+
+ action(NickIgnoreCustom)->setProperty("ignoreRule", hostmask);
+ ignoreMenu->addAction(action(NickIgnoreCustom));
+
+ ignoreMenu->addSeparator();
+
+ if(haveWhoData) {
+ QMap<QString, bool>::const_iterator ruleIter = ignoreMap.begin();
+ int counter = 0;
+ if(!ignoreMap.isEmpty())
+ // add "Existing Rules" description
+ ignoreMenu->addAction(_ignoreDescriptions.at(1));
+ while(ruleIter != ignoreMap.constEnd()) {
+ if(counter < 5) {
+ ActionType type = static_cast<ActionType>(NickIgnoreToggleEnabled0 + counter*0x100000);
+ Action *act = action(type);
+ act->setText(ruleIter.key());
+ act->setProperty("ignoreRule", ruleIter.key());
+ act->setChecked(ruleIter.value());
+ ignoreMenu->addAction(act);
+ }
+ counter++;
+ ruleIter++;
+ }
+ if(counter)
+ ignoreMenu->addSeparator();
+ }
+ ignoreMenu->addAction(action(ShowIgnoreList));
+ addAction(_nickIgnoreMenuAction, menu);
+}