DockPlugin::DockPlugin(unsigned base, Buffer *config) : Plugin(base) { load_data(dockData, &data, config); dock = NULL; inactiveTime = 0; m_popup = NULL; Event ePlugin(EventGetPluginInfo, (void*)"_core"); pluginInfo *info = (pluginInfo*)(ePlugin.process()); core = static_cast<CorePlugin*>(info->plugin); DockMenu = registerType(); CmdTitle = registerType(); CmdToggle = registerType(); CmdCustomize = registerType(); Event eMenu(EventMenuCreate, (void*)DockMenu); eMenu.process(); Command cmd; cmd->id = CmdTitle; cmd->text = I18N_NOOP("SIM"); cmd->icon = "ICQ"; cmd->menu_id = DockMenu; cmd->menu_grp = 0x1000; cmd->flags = COMMAND_TITLE; Event eCmd(EventCommandCreate, cmd); eCmd.process(); cmd->id = CmdCustomize; cmd->text = I18N_NOOP("Customize menu"); cmd->icon = "configure"; cmd->menu_id = DockMenu; cmd->menu_grp = 0x10000; cmd->accel = 0; cmd->flags = COMMAND_DEFAULT; eCmd.process(); Event eDef(EventGetMenuDef, (void*)MenuMain); CommandsDef *def = (CommandsDef*)(eDef.process()); if (def){ CommandsList list(*def, true); CommandDef *s; while ((s = ++list) != NULL){ if (s->id == 0) continue; cmd = *s; if (!(cmd->flags & COMMAND_IMPORTANT)) cmd->menu_grp = 0; cmd->bar_id = 0; cmd->menu_id = DockMenu; eCmd.process(); } } cmd->id = CmdToggle; cmd->text = I18N_NOOP("Toggle main window"); cmd->icon = NULL; cmd->menu_id = MenuMain; cmd->menu_grp = 0; cmd->accel = "Ctrl+Shift+A"; cmd->flags = COMMAND_CHECK_STATE | COMMAND_GLOBAL_ACCEL | COMMAND_IMPORTANT; eCmd.process(); init(); QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(timer())); timer->start(2000); }
void *MsgViewBase::processEvent(Event *e) { if ((e->type() == EventRewriteMessage) || (e->type() == EventMessageRead)){ Message *msg = (Message*)(e->param()); if (msg->contact() != m_id) return NULL; unsigned i; for (i = 0; i < (unsigned)paragraphs(); i++){ QString s = text(i); int n = s.find(MSG_ANCHOR); if (n < 0) continue; s = s.mid(n + strlen(MSG_ANCHOR)); n = s.find("\""); if (n < 0) continue; string client; if ((messageId(s.left(n), client) == msg->id()) && (client == msg->client())) break; } if (i >= (unsigned)paragraphs()) return NULL; Msg_Id id; id.id = msg->id(); id.client = msg->client(); m_updated.push_back(id); QTimer::singleShot(0, this, SLOT(update())); return NULL; } if (e->type() == EventCutHistory){ CutHistory *ch = (CutHistory*)(e->param()); if (ch->contact != m_id) return NULL; bool bDelete = false; vector<unsigned> start_pos; vector<unsigned> end_pos; for (unsigned i = 0; i < (unsigned)paragraphs(); i++){ QString s = text(i); int n = s.find(MSG_ANCHOR); if (n < 0) continue; s = s.mid(n + strlen(MSG_ANCHOR)); n = s.find("\""); if (n < 0) continue; string client; unsigned id = messageId(s.left(n), client); if ((client == ch->client) && (id >= ch->from) && (id < ch->from + ch->size)){ if (!bDelete){ bDelete = true; start_pos.push_back(i); } }else{ if (bDelete){ bDelete = false; end_pos.push_back(i); } } } if (bDelete) end_pos.push_back(paragraphs()); if (start_pos.size()){ int paraFrom, indexFrom; int paraTo, indexTo; getSelection(¶From, &indexFrom, ¶To, &indexTo); QPoint p = QPoint(0, 0); p = mapToGlobal(p); p = viewport()->mapFromGlobal(p); int x, y; viewportToContents(p.x(), p.y(), x, y); int para; int pos = charAt(QPoint(x, y), ¶); setReadOnly(false); for (unsigned i = 0; i < start_pos.size(); i++){ setSelection(start_pos[i], 0, end_pos[i], 0); removeSelectedText(); if ((unsigned)pos >= start_pos[i]) pos = end_pos[i] - start_pos[i]; } if ((paraFrom == -1) && (paraTo == -1)){ if (pos == -1){ scrollToBottom(); }else{ setCursorPosition(para, pos); ensureCursorVisible(); } }else{ setSelection(paraFrom, indexFrom, paraTo, indexTo); } setReadOnly(true); repaint(); } m_cut.push_back(*ch); return NULL; } if (e->type() == EventMessageDeleted){ Message *msg = (Message*)(e->param()); if (msg->contact() != m_id) return NULL; for (unsigned i = 0; i < (unsigned)paragraphs(); i++){ QString s = text(i); int n = s.find(MSG_ANCHOR); if (n < 0) continue; s = s.mid(n + strlen(MSG_ANCHOR)); n = s.find("\""); if (n < 0) continue; string client; if ((messageId(s.left(n), client) != msg->id()) || (client != msg->client())) continue; string ss; ss = text(i).local8Bit(); log(L_DEBUG, "?: %s", ss.c_str()); unsigned j; for (j = i + 1; j < (unsigned)paragraphs(); j++){ QString s = text(j); ss = text(j).local8Bit(); log(L_DEBUG, ">: %s", ss.c_str()); int n = s.find(MSG_ANCHOR); if (n < 0) continue; s = s.mid(n + strlen(MSG_ANCHOR)); n = s.find("\""); if (n < 0) continue; string client; if ((messageId(s.left(n), client) != msg->id()) || (client != msg->client())) break; } int paraFrom, indexFrom; int paraTo, indexTo; getSelection(¶From, &indexFrom, ¶To, &indexTo); unsigned pos = 0xFFFF; if (j == (unsigned)paragraphs()){ j++; pos = 0; } setSelection(i, 0, j - 1, pos); setReadOnly(false); removeSelectedText(); setReadOnly(true); if ((paraFrom == -1) && (paraTo == -1)){ scrollToBottom(); }else{ setSelection(paraFrom, indexFrom, paraTo, indexTo); } break; } return NULL; } if (e->type() == EventHistoryConfig){ unsigned id = (unsigned)(e->param()); if (id && (id != m_id)) return NULL; reload(); } if (e->type() == EventHistoryColors) setColors(); if (e->type() == EventCheckState){ CommandDef *cmd = (CommandDef*)(e->param()); if ((cmd->param != this) || (cmd->menu_id != MenuMsgView)) return NULL; Message *msg; switch (cmd->id){ case CmdCopy: cmd->flags &= ~(COMMAND_DISABLED | COMMAND_CHECKED); if (!hasSelectedText()) cmd->flags |= COMMAND_DISABLED; return e->param(); case CmdMsgOpen: msg = currentMessage(); if (msg){ unsigned type = msg->baseType(); delete msg; CommandDef *def = CorePlugin::m_plugin->messageTypes.find(type); if (def == NULL) return NULL; cmd->icon = def->icon; cmd->flags &= ~COMMAND_CHECKED; return e->param(); } return NULL; case CmdMsgSpecial: msg = currentMessage(); if (msg){ Event eMenu(EventGetMenuDef, (void*)MenuMsgCommand); CommandsDef *cmdsMsg = (CommandsDef*)(eMenu.process()); unsigned n = 0; MessageDef *mdef = NULL; unsigned type = msg->baseType(); const CommandDef *cmdsSpecial = NULL; CommandDef *msgCmd = CorePlugin::m_plugin->messageTypes.find(type); if (msgCmd) mdef = (MessageDef*)(msgCmd->param); if (mdef){ if (msg->getFlags() & MESSAGE_RECEIVED){ cmdsSpecial = mdef->cmdReceived; }else{ cmdsSpecial = mdef->cmdSent; } if (cmdsSpecial) for (const CommandDef *d = cmdsSpecial; d->text; d++) n++; } { CommandsList it(*cmdsMsg, true); while (++it) n++; } if (n == 0) return NULL; n++; CommandDef *cmds = new CommandDef[n]; memset(cmds, 0, sizeof(CommandDef) * n); n = 0; if (cmdsSpecial){ for (const CommandDef *d = cmdsSpecial; d->text; d++){ cmds[n] = *d; cmds[n].id = CmdMsgSpecial + n; n++; } } CommandDef *c; CommandsList it(*cmdsMsg, true); while ((c = ++it) != NULL){ CommandDef cmd = *c; cmd.menu_id = MenuMsgCommand; cmd.param = msg; Event e(EventCheckState, &cmd); if (!e.process()) continue; cmd.flags &= ~COMMAND_CHECK_STATE; cmds[n++] = cmd; } cmd->param = cmds; cmd->flags |= COMMAND_RECURSIVE; delete msg; return e->param(); } return NULL; } } if (e->type() == EventCommandExec){ CommandDef *cmd = (CommandDef*)(e->param()); if ((cmd->param != this) || (cmd->menu_id != MenuMsgView)) return NULL; Message *msg; switch (cmd->id){ case CmdCutHistory: msg = currentMessage(); if (msg){ History::cut(msg, 0, 0); delete msg; return e->param(); } return NULL; case CmdDeleteMessage: msg = currentMessage(); if (msg){ History::del(msg); delete msg; return e->param(); } return NULL; case CmdCopy: copy(); return e->param(); case CmdMsgOpen: msg = currentMessage(); if (msg){ msg->setFlags(msg->getFlags() | MESSAGE_OPEN); Event eOpen(EventOpenMessage, &msg); eOpen.process(); delete msg; return e->param(); } return NULL; default: msg = currentMessage(); if (msg){ if (cmd->id >= CmdMsgSpecial){ MessageDef *mdef = NULL; unsigned type = msg->baseType(); CommandDef *msgCmd = CorePlugin::m_plugin->messageTypes.find(type); if (msgCmd) mdef = (MessageDef*)(msgCmd->param); const CommandDef *cmds = NULL; if (mdef){ if (msg->getFlags() & MESSAGE_RECEIVED){ cmds = mdef->cmdReceived; }else{ cmds = mdef->cmdSent; } } if (cmds){ unsigned n = cmd->id - CmdMsgSpecial; for (const CommandDef *d = cmds; d->text; d++){ if (n-- == 0){ CommandDef cmd = *d; cmd.param = msg; Event eCmd(EventCommandExec, &cmd); eCmd.process(); return e->param(); } } } } Command c; c->id = cmd->id; c->menu_id = MenuMsgCommand; c->param = msg; Event e(EventCommandExec, c); void *res = e.process(); delete msg; return res; } return NULL; } } return NULL; }
void *MsgViewBase::processEvent(Event *e) { if (e->type() == EventMessageRead) { Message *msg = (Message*)(e->param()); if (msg->contact() != m_id) return NULL; for (unsigned i = 0; i < (unsigned)paragraphs(); i++) { QString s = text(i); int n = s.find(MSG_HREF); if (n < 0) continue; s = s.mid(n + strlen(MSG_HREF)); n = s.find("\""); if (n < 0) continue; s = s.left(n); unsigned id = atol(getToken(s, ',').latin1()); if (id != msg->id()) continue; getToken(s, ','); if (s != msg->client()) continue; int paraFrom, indexFrom; int paraTo, indexTo; getSelection(¶From, &indexFrom, ¶To, &indexTo); setSelection(i, 0, i, 0xFFFF); setBold(false); if ((paraFrom == -1) && (paraTo == -1)) { removeSelection(); scrollToBottom(); } else { setSelection(paraFrom, indexFrom, paraTo, indexTo); } break; } return NULL; } if (e->type() == EventHistoryConfig) { unsigned id = (unsigned)(e->param()); if (id && (id != m_id)) return NULL; QString t; for (unsigned i = 0; i < (unsigned)paragraphs(); i++) { QString s = text(i); int n = s.find(MSG_HREF); if (n < 0) continue; s = s.mid(n + strlen(MSG_HREF)); n = s.find("\""); if (n < 0) continue; s = s.left(n); unsigned id = atol(getToken(s, ',').latin1()); getToken(s, ','); Message *msg = History::load(id, s.utf8(), m_id); if (msg == NULL) continue; t += messageText(msg); delete msg; } QPoint p = QPoint(0, height()); p = mapToGlobal(p); p = viewport()->mapFromGlobal(p); int x, y; viewportToContents(p.x(), p.y(), x, y); int para; int pos = charAt(QPoint(x, y), ¶); setText(t); if (!CorePlugin::m_plugin->getOwnColors()) setBackground(0); if (pos == -1) { scrollToBottom(); } else { setCursorPosition(para, pos); ensureCursorVisible(); } } if (e->type() == EventCheckState) { CommandDef *cmd = (CommandDef*)(e->param()); if ((cmd->param != this) || (cmd->menu_id != MenuMsgView)) return NULL; Message *msg; switch (cmd->id) { case CmdCopy: cmd->flags &= ~(COMMAND_DISABLED | COMMAND_CHECKED); if (!hasSelectedText()) cmd->flags |= COMMAND_DISABLED; return e->param(); case CmdMsgOpen: msg = currentMessage(); if (msg) { unsigned type = msg->type(); delete msg; for (;;) { CommandDef *def = CorePlugin::m_plugin->messageTypes.find(type); if (def == NULL) { return NULL; } MessageDef *mdef = (MessageDef*)(def->param); if (mdef->base_type) { type = mdef->base_type; continue; } cmd->icon = def->icon; cmd->flags &= ~COMMAND_CHECKED; return e->param(); } } return NULL; case CmdMsgSpecial: msg = currentMessage(); if (msg) { Event eMenu(EventGetMenuDef, (void*)MenuMsgCommand); CommandsDef *cmdsMsg = (CommandsDef*)(eMenu.process()); unsigned n = 0; MessageDef *mdef = NULL; if (msg->getFlags() & MESSAGE_RECEIVED) { unsigned type = msg->type(); for (;;) { CommandDef *msgCmd = CorePlugin::m_plugin->messageTypes.find(type); if (msgCmd == NULL) break; mdef = (MessageDef*)(msgCmd->param); if (mdef->base_type == 0) break; type = mdef->base_type; } } if (mdef && mdef->cmd) { for (const CommandDef *d = mdef->cmd; d->text; d++) n++; } { CommandsList it(*cmdsMsg, true); while (++it) n++; } if (n == 0) return NULL; n++; CommandDef *cmds = new CommandDef[n]; memset(cmds, 0, sizeof(CommandDef) * n); n = 0; if (mdef && mdef->cmd) { for (const CommandDef *d = mdef->cmd; d->text; d++) { cmds[n] = *d; cmds[n].id = CmdMsgSpecial + n; n++; } } CommandDef *c; CommandsList it(*cmdsMsg, true); while ((c = ++it) != NULL) { CommandDef cmd = *c; cmd.menu_id = MenuMsgCommand; cmd.param = msg; Event e(EventCheckState, &cmd); if (!e.process()) continue; cmd.flags &= ~COMMAND_CHECK_STATE; cmds[n++] = cmd; } cmd->param = cmds; cmd->flags |= COMMAND_RECURSIVE; delete msg; return e->param(); } return NULL; } } if (e->type() == EventCommandExec) { CommandDef *cmd = (CommandDef*)(e->param()); if ((cmd->param != this) || (cmd->menu_id != MenuMsgView)) return NULL; Message *msg; switch (cmd->id) { case CmdCopy: copy(); return e->param(); case CmdMsgOpen: msg = currentMessage(); if (msg) { Event eOpen(EventOpenMessage, msg); eOpen.process(); delete msg; return e->param(); } return NULL; default: msg = currentMessage(); if (msg) { if (cmd->id >= CmdMsgSpecial) { MessageDef *mdef = NULL; unsigned type = msg->type(); for (;;) { CommandDef *msgCmd = CorePlugin::m_plugin->messageTypes.find(type); if (msgCmd == NULL) break; mdef = (MessageDef*)(msgCmd->param); if (mdef->base_type == 0) break; type = mdef->base_type; } if (mdef && mdef->cmd) { unsigned n = cmd->id - CmdMsgSpecial; for (const CommandDef *d = mdef->cmd; d->text; d++) { if (n-- == 0) { CommandDef cmd = *d; cmd.param = msg; Event eCmd(EventCommandExec, &cmd); eCmd.process(); return e->param(); } } } } Command c; c->id = cmd->id; c->menu_id = MenuMsgCommand; c->param = msg; Event e(EventCommandExec, c); void *res = e.process(); delete msg; return res; } return NULL; } } return NULL; }
void *MsgEdit::processEvent(Event *e) { if ((e->type() == EventContactChanged) && !m_bReceived){ Command cmd; cmd->id = m_type; cmd->menu_id = MenuMessage; cmd->param = (void*)(m_userWnd->m_id); Event e(EventCheckState, cmd); if (e.process()) return NULL; Event eMenu(EventGetMenuDef, (void*)MenuMessage); CommandsDef *cmdsMsg = (CommandsDef*)(eMenu.process()); CommandsList itc(*cmdsMsg, true); CommandDef *c; while ((c = ++itc) != NULL){ c->param = (void*)(m_userWnd->m_id); Event eCheck(EventCheckState, c); if (!eCheck.process()) continue; CommandDef *def; def = CorePlugin::m_plugin->messageTypes.find(c->id); if (def == NULL) continue; MessageDef *mdef = (MessageDef*)(def->param); if (mdef->flags & MESSAGE_SILENT) continue; if (mdef->create == NULL) continue; Message *msg = mdef->create(NULL); if (msg == NULL) continue; setMessage(msg, false); delete msg; break; } return NULL; } if (e->type() == EventMessageReceived){ Message *msg = (Message*)(e->param()); if (msg->getFlags() & MESSAGE_NOVIEW) return NULL; if ((msg->contact() == m_userWnd->id()) && (msg->type() != MessageStatus)){ if (CorePlugin::m_plugin->getContainerMode()){ bool bSetFocus = false; if (topLevelWidget() && topLevelWidget()->inherits("Container")){ Container *container = static_cast<Container*>(topLevelWidget()); if (container->wnd() == m_userWnd) bSetFocus = true; } setMessage(msg, bSetFocus); }else{ if (m_edit->isReadOnly()) QTimer::singleShot(0, this, SLOT(setupNext())); } } } if (e->type() == EventRealSendMessage){ MsgSend *s = (MsgSend*)(e->param()); if (s->edit == this){ sendMessage(s->msg); return e->param(); } } if (e->type() == EventCheckState){ CommandDef *cmd = (CommandDef*)(e->param()); if ((cmd->param == this) && (cmd->id == CmdTranslit)){ Contact *contact = getContacts()->contact(m_userWnd->id()); if (contact){ TranslitUserData *data = (TranslitUserData*)(contact->getUserData(CorePlugin::m_plugin->translit_data_id)); if (data){ cmd->flags &= ~COMMAND_CHECKED; if (data->Translit) cmd->flags |= COMMAND_CHECKED; } } return NULL; } if ((cmd->menu_id != MenuTextEdit) || (cmd->param != this)) return NULL; cmd->flags &= ~(COMMAND_CHECKED | COMMAND_DISABLED); switch (cmd->id){ case CmdUndo: if (m_edit->isReadOnly()) return NULL; if (!m_edit->isUndoAvailable()) cmd->flags |= COMMAND_DISABLED; return e->param(); case CmdRedo: if (m_edit->isReadOnly()) return NULL; if (!m_edit->isRedoAvailable()) cmd->flags |= COMMAND_DISABLED; return e->param(); case CmdCut: if (m_edit->isReadOnly()) return NULL; case CmdCopy: if (!m_edit->hasSelectedText()) cmd->flags |= COMMAND_DISABLED; return e->param(); case CmdPaste: if (m_edit->isReadOnly()) return NULL; if (QApplication::clipboard()->text().isEmpty()) cmd->flags |= COMMAND_DISABLED; return e->param(); case CmdClear: if (m_edit->isReadOnly()) return NULL; case CmdSelectAll: if (m_edit->text().isEmpty()) cmd->flags |= COMMAND_DISABLED; return e->param(); } return NULL; } if (e->type() == EventCommandExec){ CommandDef *cmd = (CommandDef*)(e->param()); if ((cmd->id == CmdSmile) && (cmd->param == this)){ Event eBtn(EventCommandWidget, cmd); QToolButton *btnSmile = (QToolButton*)(eBtn.process()); if (btnSmile){ SmilePopup *popup = new SmilePopup(this); QSize s = popup->minimumSizeHint(); popup->resize(s); connect(popup, SIGNAL(insert(int)), this, SLOT(insertSmile(int))); QPoint p = CToolButton::popupPos(btnSmile, popup); popup->move(p); popup->show(); } return e->param(); }
LiveJournalPlugin::LiveJournalPlugin(unsigned base) : Plugin(base) { IconDef icon; icon.name = "LiveJournal"; icon.xpm = livejournal; Event eIcon(EventAddIcon, &icon); eIcon.process(); icon.name = "upd"; icon.xpm = NULL; icon.flags = 160; eIcon.process(); m_protocol = new LiveJournalProtocol(this); Event eMenu(EventMenuCreate, (void*)MenuWeb); eMenu.process(); Command cmd; cmd->id = CmdMenuWeb; cmd->text = "_"; cmd->menu_id = MenuWeb; cmd->menu_grp = 0x1000; cmd->flags = COMMAND_CHECK_STATE; Event eCmd(EventCommandCreate, cmd); eCmd.process(); cmd->id = MessageJournal; cmd->text = I18N_NOOP("LiveJournal &post"); cmd->icon = "LiveJournal"; cmd->accel = "Ctrl+P"; cmd->menu_grp = 0x3080; cmd->flags = COMMAND_DEFAULT; cmd->param = &defJournalMessage; Event eMsg(EventCreateMessageType, cmd); eMsg.process(); cmd->id = CmdMenuWeb; cmd->text = I18N_NOOP("LiveJournal &WWW"); cmd->icon = NULL; cmd->accel = NULL; cmd->menu_grp = 0x3090; cmd->popup_id = MenuWeb; cmd->flags = COMMAND_DEFAULT; cmd->param = &defWWWJournalMessage; eMsg.process(); cmd->id = MessageUpdated; cmd->text = I18N_NOOP("Friends updated"); cmd->icon = "LiveJournal_upd"; cmd->accel = NULL; cmd->menu_grp = 0; cmd->popup_id = 0; cmd->flags = COMMAND_DEFAULT; cmd->param = &defUpdatedMessage; eMsg.process(); Event ePlugin(EventGetPluginInfo, (void*)"_core"); pluginInfo *info = (pluginInfo*)(ePlugin.process()); core = static_cast<CorePlugin*>(info->plugin); }
void *LiveJournalClient::processEvent(Event *e) { TCPClient::processEvent(e); if (e->type() == EventOpenMessage){ Message **msg = (Message**)(e->param()); if ((*msg)->type() != MessageUpdated) return NULL; if (dataName(&data.owner) != (*msg)->client()) return NULL; Event eDel(EventMessageDeleted, msg); eDel.process(); string url = "http://"; url += getServer(); if (getPort() != 80){ url += ":"; url += number(getPort()); } url += "/"; Event eGo(EventGoURL, (void*)url.c_str()); eGo.process(); if (getState() == Connected) m_timer->start(getInterval() * 60 * 1000, true); return e->param(); } if (e->type() == EventCommandExec){ CommandDef *cmd = (CommandDef*)(e->param()); if (cmd->id == CmdDeleteJournalMessage){ Message *msg = (Message*)(cmd->param); Contact *contact = getContacts()->contact(msg->contact()); if (contact == NULL) return NULL; LiveJournalUserData *data; ClientDataIterator it(contact->clientData, this); while ((data = (LiveJournalUserData*)(++it)) != NULL){ if (dataName(data) == msg->client()){ JournalMessage *m = new JournalMessage(msg->save().c_str()); m->setContact(msg->contact()); m->setOldID(msg->id()); m->setText(""); if (!send(m, data)) delete m; return e->param(); } } return NULL; } unsigned menu_id = cmd->menu_id - MenuWeb; if (menu_id > LiveJournalPlugin::MenuCount) return NULL; unsigned item_id = cmd->id - CmdMenuWeb; if ((item_id == 0) || (item_id >= 0x100)) return NULL; const char *url = getMenuUrl(menu_id * 0x100 + item_id); if ((url == NULL) || (*url == 0)) return NULL; Event eUrl(EventGoURL, (void*)url); eUrl.process(); return e->param(); } if (e->type() == EventCheckState){ CommandDef *cmd = (CommandDef*)(e->param()); if (cmd->id == CmdMenuWeb){ unsigned menu_id = cmd->menu_id - MenuWeb; if (menu_id > LiveJournalPlugin::MenuCount) return NULL; unsigned nItems = 0; unsigned list_id = menu_id * 0x100 + 1; for (;;){ const char *text = getMenu(list_id); if ((text == NULL) || (*text == 0)) break; nItems++; list_id++; } if (nItems == 0) return NULL; CommandDef *cmds = new CommandDef[nItems + 1]; memset(cmds, 0, sizeof(CommandDef) * (nItems + 1)); list_id = menu_id * 0x100 + 1; for (unsigned i = 0;; i++){ const char *text = getMenu(list_id); if ((text == NULL) || (*text == 0)) break; cmds[i].text = "_"; if (strcmp(text, "-")){ cmds[i].id = CmdMenuWeb + i + 1; cmds[i].text = "_"; QString s = i18n(text); cmds[i].text_wrk = strdup(s.utf8()); const char *url = getMenuUrl(list_id); if (url && (*url == '@')){ unsigned nSub = atol(url + 1); while (nSub > LiveJournalPlugin::MenuCount){ unsigned menu_id = MenuWeb + (++LiveJournalPlugin::MenuCount); Event eMenu(EventMenuCreate, (void*)menu_id); eMenu.process(); Command cmd; cmd->id = CmdMenuWeb; cmd->text = "_"; cmd->menu_id = menu_id; cmd->menu_grp = 0x1000; cmd->flags = COMMAND_CHECK_STATE; Event e(EventCommandCreate, cmd); e.process(); } cmds[i].popup_id = MenuWeb + nSub; } }else{ cmds[i].id = 0; } list_id++; } cmd->param = cmds; cmd->flags |= COMMAND_RECURSIVE; return e->param(); } } return NULL; }