LRESULT FavoriteHubsFrame::onSpeaker(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) { if(wParam == HUB_CONNECTED) { auto_ptr<string> hub(reinterpret_cast<string*>(lParam)); onlineHubs.push_back(*hub); for(int i = 0; i < ctrlHubs.GetItemCount(); ++i) { FavoriteHubEntry* e = (FavoriteHubEntry*)ctrlHubs.GetItemData(i); if(e->getServer() == *hub) { ctrlHubs.SetItem(i,0,LVIF_IMAGE, NULL, 0, 0, 0, NULL); ctrlHubs.Update(i); return 0; } } } else if(wParam == HUB_DISCONNECTED) { auto_ptr<string> hub(reinterpret_cast<string*>(lParam)); onlineHubs.erase(remove(onlineHubs.begin(), onlineHubs.end(), *hub), onlineHubs.end()); for(int i = 0; i < ctrlHubs.GetItemCount(); ++i) { FavoriteHubEntry* e = (FavoriteHubEntry*)ctrlHubs.GetItemData(i); if(e->getServer() == *hub) { ctrlHubs.SetItem(i,0,LVIF_IMAGE, NULL, 1, 0, 0, NULL); ctrlHubs.Update(i); return 0; } } } return 0; }
LRESULT FavoriteHubsFrame::onNew(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { FavoriteHubEntry e; FavHubProperties dlg(&e); while (true) { if (dlg.DoModal((HWND)*this) == IDOK) { if (FavoriteManager::getFavoriteHubEntry(e.getServer())) { MessageBox( CTSTRING(FAVORITE_HUB_ALREADY_EXISTS), _T(" "), MB_ICONWARNING | MB_OK); } else { FavoriteManager::getInstance()->addFavorite(e); break; } } else { break; } } return 0; }
LRESULT FavoriteHubsFrame::onItemChanged(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) { NMITEMACTIVATE* l = (NMITEMACTIVATE*)pnmh; if(!nosave && l->iItem != -1 && ((l->uNewState & LVIS_STATEIMAGEMASK) != (l->uOldState & LVIS_STATEIMAGEMASK))) { FavoriteHubEntry* f = (FavoriteHubEntry*)ctrlHubs.GetItemData(l->iItem); f->setConnect(ctrlHubs.GetCheckState(l->iItem) != FALSE); FavoriteManager::getInstance()->save(); } return 0; }
virtual void onLoad(int& version, FavoriteHubEntry::List& favoriteHubs) const { checkHub(favoriteHubs, PeersUtils::PEERS_HUB, _T("Пирс"), _T("Файлообменная сеть Электронного города"), true, 0); // Always set mode auto for PEERS_HUB FavoriteHubEntry *peers = findHub(favoriteHubs, PeersUtils::PEERS_HUB); peers->setMode(0); if (version < BUILDID) { version = BUILDID; } }
void FavoriteHubsFrame::openSelected() { if(!checkNick()) return; int i = -1; while( (i = ctrlHubs.GetNextItem(i, LVNI_SELECTED)) != -1) { FavoriteHubEntry* entry = (FavoriteHubEntry*)ctrlHubs.GetItemData(i); HubFrame::openWindow(Text::toT(entry->getServer())); } return; }
LRESULT FavoriteHubsFrame::onItemChanged(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) { NMITEMACTIVATE* l = (NMITEMACTIVATE*)pnmh; ::EnableWindow(GetDlgItem(IDC_CONNECT), ctrlHubs.GetItemState(l->iItem, LVIS_SELECTED)); ::EnableWindow(GetDlgItem(IDC_REMOVE), ctrlHubs.GetItemState(l->iItem, LVIS_SELECTED)); ::EnableWindow(GetDlgItem(IDC_EDIT), ctrlHubs.GetItemState(l->iItem, LVIS_SELECTED)); if(!nosave && l->iItem != -1 && ((l->uNewState & LVIS_STATEIMAGEMASK) != (l->uOldState & LVIS_STATEIMAGEMASK))) { FavoriteHubEntry* f = (FavoriteHubEntry*)ctrlHubs.GetItemData(l->iItem); f->setAutoConnect(ctrlHubs.GetCheckState(l->iItem) != FALSE); FavoriteManager::getInstance()->save(); } return 0; }
void FavoriteHubs::slotDblClicked(){ FavoriteHubItem *item = getItem(); if (!item) return; QString address = item->data(COLUMN_HUB_ADDRESS).toString(); FavoriteHubEntry *entry = FavoriteManager::getInstance()->getFavoriteHubEntry(address.toStdString()); QString encoding = WulforUtil::getInstance()->dcEnc2QtEnc(_q(entry->getEncoding())); MainWindow::getInstance()->newHubFrame(address, encoding); }
LRESULT RecentHubsFrame::onAdd(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { if (ctrlHubs.GetSelectedCount() == 1) { int i = ctrlHubs.GetNextItem(-1, LVNI_SELECTED); FavoriteHubEntry e; e.setName(ctrlHubs.ExGetItemText(i, COLUMN_NAME)); e.setDescription(ctrlHubs.ExGetItemText(i, COLUMN_DESCRIPTION)); e.setServer(ctrlHubs.ExGetItemText(i, COLUMN_SERVER)); FavoriteManager::getInstance()->addFavorite(e); } return 0; }
LRESULT FavoriteHubsFrame::onOpenHubLog(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { if (ctrlHubs.GetSelectedCount() == 1) { int i = ctrlHubs.GetNextItem(-1, LVNI_SELECTED); FavoriteHubEntry* entry = (FavoriteHubEntry*)ctrlHubs.GetItemData(i); StringMap params; params["hubNI"] = entry->getName(); params["hubURL"] = entry->getServer(); params["myNI"] = entry->getNick(); WinUtil::openLog(SETTING(LOG_FILE_MAIN_CHAT), params, TSTRING(NO_LOG_FOR_HUB)); } return 0; }
void FavoriteHubsFrame::openSelected() { if(!checkNick()) return; int i = -1; while( (i = ctrlHubs.GetNextItem(i, LVNI_SELECTED)) != -1) { FavoriteHubEntry* entry = (FavoriteHubEntry*)ctrlHubs.GetItemData(i); RecentHubEntryPtr r = new RecentHubEntry(entry->getServer()); r->setName(entry->getName()); r->setDescription(entry->getDescription()); ClientManager::getInstance()->createClient(r); // no multithreading because of disorder! } return; }
LRESULT FavoriteHubsFrame::onContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (reinterpret_cast<HWND>(wParam) == ctrlHubs) { POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; CRect rc; ctrlHubs.GetHeader().GetWindowRect(&rc); if (PtInRect(&rc, pt)) { return 0; } if (pt.x == -1 && pt.y == -1) { WinUtil::getContextMenuPos(ctrlHubs, pt); } int status = ctrlHubs.GetSelectedCount() > 0 ? MFS_ENABLED : MFS_DISABLED; hubsMenu.EnableMenuItem(IDC_OPEN_HUB_LOG, status); hubsMenu.EnableMenuItem(IDC_CONNECT, status); hubsMenu.EnableMenuItem(IDC_EDIT, status); hubsMenu.EnableMenuItem(IDC_MOVE_UP, status); hubsMenu.EnableMenuItem(IDC_MOVE_DOWN, status); hubsMenu.EnableMenuItem(IDC_REMOVE, status); tstring x; if (ctrlHubs.GetSelectedCount() == 1) { FavoriteHubEntry* f = (FavoriteHubEntry*)ctrlHubs.GetItemData(ctrlHubs.GetSelectedIndex()); x = Text::toT(f->getName()); } if (!x.empty()) hubsMenu.InsertSeparatorFirst(x); hubsMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd); if (!x.empty()) hubsMenu.RemoveFirstItem(); return TRUE; } bHandled = FALSE; return FALSE; }
LRESULT FavoriteHubsFrame::onOpenHubLog(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { if(ctrlHubs.GetSelectedCount() == 1) { int i = ctrlHubs.GetNextItem(-1, LVNI_SELECTED); FavoriteHubEntry* entry = (FavoriteHubEntry*)ctrlHubs.GetItemData(i); ParamMap params; params["hubNI"] = entry->getName(); params["hubURL"] = entry->getServer(); params["myNI"] = entry->get(HubSettings::Nick); string file = LogManager::getInstance()->getPath(LogManager::CHAT, params); if(Util::fileExists(file)){ WinUtil::viewLog(file); } else { WinUtil::showMessageBox(TSTRING(NO_LOG_FOR_HUB)); } } return 0; }
LRESULT FavoriteHubsFrame::onOpenHubLog(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { if(ctrlHubs.GetSelectedCount() == 1) { int i = ctrlHubs.GetNextItem(-1, LVNI_SELECTED); FavoriteHubEntry* entry = (FavoriteHubEntry*)ctrlHubs.GetItemData(i); StringMap params; params["hubNI"] = entry->getName(); params["hubURL"] = entry->getServer(); params["myNI"] = entry->getNick(); tstring filename = Text::toT(Util::validateFileName(SETTING(LOG_DIRECTORY) + Util::formatParams(SETTING(LOG_FILE_MAIN_CHAT), params, false))); if(Util::fileExists(Text::fromT(filename))){ ShellExecute(NULL, NULL, filename.c_str(), NULL, NULL, SW_SHOWNORMAL); } else { MessageBox(CTSTRING(NO_LOG_FOR_HUB), CTSTRING(NO_LOG_FOR_HUB), MB_OK ); } } return 0; }
FavoriteHubEntry* findHub(FavoriteHubEntry::List& favoriteHubs, const string& server) const { if (!favoriteHubs.empty()) { for (FavoriteHubEntry::Iter i = favoriteHubs.begin(); i != favoriteHubs.end(); ++i) { FavoriteHubEntry* entry = *i; if (Util::stricmp(entry->getServer(), server) == 0) { return entry; } } const string fullServerName = "dchub://" + server; for (FavoriteHubEntry::Iter i = favoriteHubs.begin(); i != favoriteHubs.end(); ++i) { FavoriteHubEntry* entry = *i; if (Util::stricmp(entry->getServer(), fullServerName) == 0) { return entry; } } } return NULL; }
LRESULT PublicHubsFrame::onAdd(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { if(!checkNick()) return 0; TCHAR buf[256]; if(ctrlHubs.GetSelectedCount() == 1) { int i = ctrlHubs.GetNextItem(-1, LVNI_SELECTED); FavoriteHubEntry e; ctrlHubs.GetItemText(i, COLUMN_NAME, buf, 256); e.setName(Text::fromT(buf)); ctrlHubs.GetItemText(i, COLUMN_DESCRIPTION, buf, 256); e.setDescription(Text::fromT(buf)); ctrlHubs.GetItemText(i, COLUMN_SERVER, buf, 256); e.setServer(Text::fromT(buf)); FavoriteManager::getInstance()->addFavorite(e); } return 0; }
void FavoriteHubs::slotClicked(const QModelIndex &index){ if (!index.isValid() || index.column() != COLUMN_HUB_AUTOCONNECT || !index.internalPointer()) return; FavoriteHubItem *item = reinterpret_cast<FavoriteHubItem*>(index.internalPointer()); QString address = item->data(COLUMN_HUB_ADDRESS).toString(); FavoriteHubEntry *entry = FavoriteManager::getInstance()->getFavoriteHubEntry(address.toStdString()); if (entry){ bool autoconnect = !item->data(COLUMN_HUB_AUTOCONNECT).toBool(); entry->setConnect(autoconnect); item->updateColumn(COLUMN_HUB_AUTOCONNECT, autoconnect); model->repaint(); FavoriteManager::getInstance()->save(); } }
void QuickConnect::slotAccept() { QString hub = comboBox_HUB->currentText(); QString encoding = ""; hub.replace(" ", ""); if (hub.isEmpty()){ accept(); return; } if (hub.startsWith("adc://") || hub.startsWith("adcs://")) encoding = "UTF-8"; if (!hub.isEmpty()) { if (encoding.isEmpty()){//Has favorite entry for hub? FavoriteHubEntry* entry = FavoriteManager::getInstance()->getFavoriteHubEntry(_tq(hub)); if (entry) encoding = WulforUtil::getInstance()->dcEnc2QtEnc(_q(entry->getEncoding())); } MainWindow::getInstance()->newHubFrame(hub, (encoding.isEmpty())? (WSGET(WS_DEFAULT_LOCALE)) : (encoding)); QStringList list = WulforSettings::getInstance()->getStr(WS_QCONNECT_HISTORY).split(" ", QString::SkipEmptyParts); if (!list.contains(hub)) list.push_back(hub); else{ accept(); return; } QString hist = ""; foreach (const QString &i, list) hist += (i + " "); WulforSettings::getInstance()->setStr(WS_QCONNECT_HISTORY, hist); } accept(); }
void checkHub(FavoriteHubEntry::List& favoriteHubs, const string& server, const tstring& name, const tstring& description, bool forceAutoConnect, int mode) const { FavoriteHubEntry* e = findHub(favoriteHubs, server); if (e == NULL) { e = new FavoriteHubEntry(); e->setName(Text::fromT(name)); e->setConnect(true); e->setDescription(Text::fromT(description)); e->setNick(Util::emptyString); e->setPassword(Util::emptyString); e->setServer(server); e->setUserDescription(Util::emptyString); e->setMode(mode); favoriteHubs.push_back(e); } else if (forceAutoConnect) { #ifndef _DEBUG e->setConnect(true); #endif } }
LRESULT PublicHubsFrame::onAdd(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { if (!checkNick()) return 0; int i = -1; while ((i = m_ctrlHubs.GetNextItem(i, LVNI_SELECTED)) != -1) { FavoriteHubEntry e; e.setName(m_ctrlHubs.ExGetItemText(i, COLUMN_NAME)); e.setDescription(m_ctrlHubs.ExGetItemText(i, COLUMN_DESCRIPTION)); e.setServer(Util::formatDchubUrl(m_ctrlHubs.ExGetItemText(i, COLUMN_SERVER))); // if (!client->getPassword().empty()) // ToDo: Use SETTINGS Nick and Password // { // e.setNick(client->getMyNick()); // e.setPassword(client->getPassword()); // } FavoriteManager::getInstance()->addFavorite(e); } return 0; }
LRESULT FavoriteHubsFrame::onItemChanged(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) { const NMITEMACTIVATE* l = (NMITEMACTIVATE*)pnmh; if (l->iItem != -1) { const auto l_enabled = ctrlHubs.GetItemState(l->iItem, LVIS_SELECTED); ::EnableWindow(GetDlgItem(IDC_CONNECT), l_enabled); ::EnableWindow(GetDlgItem(IDC_REMOVE), l_enabled); ::EnableWindow(GetDlgItem(IDC_EDIT), l_enabled); ::EnableWindow(GetDlgItem(IDC_MOVE_UP), l_enabled); ::EnableWindow(GetDlgItem(IDC_MOVE_DOWN), l_enabled); if (!m_nosave && ((l->uNewState & LVIS_STATEIMAGEMASK) != (l->uOldState & LVIS_STATEIMAGEMASK))) { FavoriteHubEntry* f = (FavoriteHubEntry*)ctrlHubs.GetItemData(l->iItem); const bool l_connect = ctrlHubs.GetCheckState(l->iItem) != FALSE; f->setConnect(l_connect); FavoriteManager::getInstance()->save(); } } return 0; }
void FavoriteHubsFrame::openSelected() { if(!checkNick()) return; int i = -1; while( (i = ctrlHubs.GetNextItem(i, LVNI_SELECTED)) != -1) { FavoriteHubEntry* entry = (FavoriteHubEntry*)ctrlHubs.GetItemData(i); RecentHubEntry r; r.setName(entry->getName()); r.setDescription(entry->getDescription()); r.setUsers("*"); r.setShared("*"); r.setServer(entry->getServer()); FavoriteManager::getInstance()->addRecent(r); HubFrame::openWindow(Text::toT(entry->getServer()) , entry->getChatUserSplit(), entry->getUserListState()); } return; }
LRESULT FavoriteHubsFrame::onEdit(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { int i = -1; if((i = ctrlHubs.GetNextItem(i, LVNI_SELECTED)) != -1) { FavoriteHubEntry* e = (FavoriteHubEntry*)ctrlHubs.GetItemData(i); dcassert(e != NULL); FavHubProperties dlg(e); if(dlg.DoModal(m_hWnd) == IDOK) { ctrlHubs.SetItemText(i, COLUMN_NAME, Text::toT(e->getName()).c_str()); ctrlHubs.SetItemText(i, COLUMN_DESCRIPTION, Text::toT(e->getDescription()).c_str()); ctrlHubs.SetItemText(i, COLUMN_SERVER, Text::toT(e->getServer()).c_str()); ctrlHubs.SetItemText(i, COLUMN_NICK, Text::toT(e->getNick(false)).c_str()); ctrlHubs.SetItemText(i, COLUMN_PASSWORD, tstring(e->getPassword().size(), '*').c_str()); ctrlHubs.SetItemText(i, COLUMN_USERDESCRIPTION, Text::toT(e->getUserDescription()).c_str()); } } return 0; }
void Client::reloadSettings(bool updateNick) { FavoriteHubEntry* hub = FavoriteManager::getInstance()->getFavoriteHubEntry(getHubUrl()); if(hub) { if(updateNick) { setCurrentNick(checkNick(hub->getNick(true))); } if(!hub->getUserDescription().empty()) { setCurrentDescription(hub->getUserDescription()); } else { setCurrentDescription(SETTING(DESCRIPTION)); } if(!hub->getPassword().empty()) setPassword(hub->getPassword()); } else { if(updateNick) { setCurrentNick(checkNick(SETTING(NICK))); } setCurrentDescription(SETTING(DESCRIPTION)); } }
void FavoriteHubs::init(){ model = new FavoriteHubModel(); setUnload(false); treeView->setModel(model); fakeNMDCTags = QStringList(); fakeADCTags = QStringList(); fakeNMDCTags << QString("%1").arg(fullVersionString) << "++ V:0.782" << "++ V:0.791" << "StrgDC++ V:2.42" << "ApexDC++ V:1.3.6" << "ApexDC++ V:1.5.1" << "FlylinkDC++ V:r500" << "FlylinkDC++ V:r500-x64" << "FlylinkDC++ V:r501-beta60" << "HomeDC++ V:2.22" << "FakeDC++ V:1.3"; fakeADCTags << QString("%1").arg(fullADCVersionString) << "++ 0.782" << "++ 0.791" << "StrgDC++ 2.42" << "ApexDC++ 1.3.6" << "ApexDC++ 1.5.1" << "FlylinkDC++ r500" << "FlylinkDC++ r500-x64" << "FlylinkDC++ r501-beta60" << "HomeDC++ 2.22" << "FakeDC++ 1.3"; const FavoriteHubEntryList& fl = FavoriteManager::getInstance()->getFavoriteHubs(); for(FavoriteHubEntryList::const_iterator i = fl.begin(); i != fl.end(); ++i) { FavoriteHubEntry* entry = *i; QList<QVariant> data; data << entry->getConnect() << _q(entry->getName()) << _q(entry->getDescription()) << _q(entry->getServer()) << _q(entry->getNick()) << _q(entry->getPassword()) << _q(entry->getUserDescription()) << WulforUtil::getInstance()->dcEnc2QtEnc(_q(entry->getEncoding())); model->addResult(data); } treeView->setRootIsDecorated(false); treeView->setContextMenuPolicy(Qt::CustomContextMenu); treeView->header()->setContextMenuPolicy(Qt::CustomContextMenu); treeView->viewport()->setAcceptDrops(false); // temporary treeView->setDragEnabled(false); // temporary treeView->setAcceptDrops(false); // temporary WulforUtil *WU = WulforUtil::getInstance(); add_newButton->setIcon(WU->getPixmap(WulforUtil::eiBOOKMARK_ADD)); changeButton->setIcon(WU->getPixmap(WulforUtil::eiEDIT)); removeButton->setIcon(WU->getPixmap(WulforUtil::eiEDITDELETE)); connectButton->setIcon(WU->getPixmap(WulforUtil::eiCONNECT)); load(); int row_num = model->rowCount(); if (row_num == 0){ changeButton->setEnabled(false); removeButton->setEnabled(false); connectButton->setEnabled(false); } connect(treeView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(slotContexMenu(const QPoint&))); connect(treeView, SIGNAL(clicked(QModelIndex)), this, SLOT(slotClicked(QModelIndex))); connect(treeView->header(), SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotHeaderMenu())); connect(treeView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotDblClicked())); connect(add_newButton, SIGNAL(clicked()), this, SLOT(slotAdd_newButtonClicked())); connect(changeButton, SIGNAL(clicked()), this, SLOT(slotChangeButtonClicked())); connect(removeButton, SIGNAL(clicked()), this, SLOT(slotRemoveButtonClicked())); connect(connectButton, SIGNAL(clicked()), this, SLOT(slotConnectButtonClicked())); connect(WulforSettings::getInstance(), SIGNAL(strValueChanged(QString,QString)), this, SLOT(slotSettingsChanged(QString,QString))); ArenaWidget::setState( ArenaWidget::Flags(ArenaWidget::state() | ArenaWidget::Singleton | ArenaWidget::Hidden) ); }
void FavoriteHubs::updateEntry(FavoriteHubEntry &entry, StrMap &map){ entry.setConnect((int)map["AUTO"].toBool()); entry.setName(map["NAME"].toString().toStdString()); entry.setServer(map["ADDR"].toString().toStdString()); entry.setEncoding(map["ENC"].toString().toStdString()); entry.setNick(map["NICK"].toString().toStdString()); entry.setPassword(map["PASS"].toString().toStdString()); entry.setUserDescription(map["UDESC"].toString().toStdString()); entry.setDescription(map["DESC"].toString().toStdString()); entry.setExternalIP(map["IP"].toString().toStdString()); entry.setClientId(map["TAG"].toString().toStdString()); entry.setOverrideId(map["OVERTAG"].toBool()); entry.setUseInternetIP(map["IIP"].toBool()); entry.setDisableChat(map["DCHAT"].toBool()); entry.setMode(map["MODE"].toInt()); entry.setSearchInterval(map["SINT"].toInt()); }
void FavoriteHubsFrame::openSelected() { if (!checkNick()) return; int i = -1; while ((i = ctrlHubs.GetNextItem(i, LVNI_SELECTED)) != -1) { FavoriteHubEntry* entry = (FavoriteHubEntry*)ctrlHubs.GetItemData(i); RecentHubEntry r; r.setName(entry->getName()); r.setDescription(entry->getDescription()); r.setUsers("*"); r.setShared("*"); r.setServer(entry->getServer()); FavoriteManager::getInstance()->addRecent(r); HubFrame::openWindow(true, entry->getServer(), entry->getName(), entry->getRawOne(), entry->getRawTwo(), entry->getRawThree(), entry->getRawFour(), entry->getRawFive(), entry->getWindowPosX(), entry->getWindowPosY(), entry->getWindowSizeX(), entry->getWindowSizeY(), entry->getWindowType(), entry->getChatUserSplit(), entry->getUserListState(), entry->getSuppressChatAndPM()); } return; }