/* * ConferenceParticipants.java * * Created on 12 Апрель 2009 г., 22:20 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ // #sijapp cond.if protocols_JABBER is "true" # package protocol.xmpp; import jimmui.Clipboard; import jimm.Jimm; import jimmui.HotKeys; import jimmui.view.base.touch.*; import jimmui.view.icons.*; import java.util.Vector; import jimmui.view.*; import jimmui.view.base.*; import jimmui.view.menu.*; import jimm.util.JLocale; import jimm.comm.*; import protocol.*; import protocol.ui.InfoFactory; import protocol.ui.MessageEditor; import javax.microedition.lcdui.Font; /** * * @author Vladimir Krukov */ public final class ConferenceParticipants extends SomeContent { private static ImageList affiliationIcons = ImageList.createImageList("/jabber-affiliations.png"); private Font[] fontSet; private Xmpp protocol; private XmppServiceContact conference; private Vector<Object> contacts = new Vector<Object>(); private final Icon[] leftIcons = new Icon[2]; private final Icon[] rightIcons = new Icon[1]; /** Creates a new instance of ConferenceParticipants */ private static final int COMMAND_REPLY = 0; private static final int COMMAND_PRIVATE = 1; private static final int COMMAND_INFO = 2; private static final int COMMAND_STATUS = 3; private static final int COMMAND_COPY = 4; private static final int COMMAND_KICK = 5; private static final int COMMAND_BAN = 6; private static final int COMMAND_DEVOICE = 7; private static final int COMMAND_VOICE = 8; private int myRole; public ConferenceParticipants(Xmpp xmpp, XmppServiceContact conf) { fontSet = GraphicsEx.chatFontSet; protocol = xmpp; conference = conf; myRole = getRole(conference.getMyName()); update(); } protected final int getSize() { return contacts.size(); } // #sijapp cond.if modules_TOUCH is "true"# protected void touchItemTaped(int item, int x, TouchState state) { int itemHeight = getItemHeight(item); if (state.isLong || (view.getWidth() - itemHeight < x)) { view.showMenu(getContextMenu()); } else { execJimmAction(NativeCanvas.JIMM_SELECT); } } // #sijapp cond.end# private String getCurrentContact() { int contactIndex = getCurrItem(); if ((contactIndex < 0) || (getSize() <= contactIndex)) { return null; } Object o = contacts.elementAt(contactIndex); if (o instanceof XmppContact.SubContact) { XmppContact.SubContact c = (XmppContact.SubContact)o; return c.resource; } return null; } protected void doJimmAction(int action) { switch (action) { case NativeCanvas.JIMM_SELECT: if (conference.canWrite()) { execJimmAction(COMMAND_REPLY); } return; case NativeCanvas.JIMM_BACK: view.back(); return; case NativeCanvas.JIMM_MENU: view.showMenu(getContextMenu()); return; } String nick = getCurrentContact(); if (null == nick) { return; } switch (action) { case COMMAND_COPY: Clipboard.setClipBoardText(nick); view.restore(); break; case COMMAND_REPLY: MessageEditor editor = Jimm.getJimm().getMessageEditor(); if (editor.isActive(conference)) { InputTextBox box = editor.getTextBox(); String text = box.getRawString(); if (!StringUtils.isEmpty(text)) { String space = box.getSpace(); if (text.endsWith(space)) { // do nothing } else if (1 == space.length()) { text += space; } else { text += text.endsWith(" ") ? " " : space; } if (text.endsWith("," + space)) { text += nick + "," + space; } else { text += nick + space; } box.setString(text); box.show(); return; } } Jimm.getJimm().getChatUpdater().writeMessageTo(protocol, conference, nick); break; case COMMAND_PRIVATE: nickSelected(nick); break; case COMMAND_INFO: protocol.showUserInfo(getContactForVCard(nick)); break; case COMMAND_STATUS: protocol.showStatus(getPrivateContact(nick)); break; case COMMAND_KICK: setMucRole(nick, "n" + "o" + "ne"); update(); view.restore(); break; case COMMAND_BAN: setMucAffiliation(nick, "o" + "utcast"); update(); view.restore(); break; case COMMAND_DEVOICE: setMucRole(nick, "v" + "isitor"); update(); view.restore(); break; case COMMAND_VOICE: setMucRole(nick, "partic" + "ipant"); update(); view.restore(); break; } } @Override protected boolean doKeyReaction(int keyCode, int actionCode, int type) { if (HotKeys.isHotKey(keyCode)) { String nick = getCurrentContact(); Contact c = (null == nick) ? null : getPrivateContact(nick); if (HotKeys.execHotKey(protocol, c, keyCode, type)) { return true; } } return super.doKeyReaction(keyCode, actionCode, type); } protected final MenuModel getContextMenu() { MenuModel menu = new MenuModel(); menu.setActionListener(new Binder(this)); String nick = getCurrentContact(); if (null == nick) { return menu; } if (conference.canWrite()) { menu.addItem("reply", COMMAND_REPLY); } menu.addItem("private_chat", COMMAND_PRIVATE); menu.addItem("info", COMMAND_INFO); menu.addItem("user_statuses", COMMAND_STATUS); menu.addItem("copy_text", COMMAND_COPY); if (XmppServiceContact.ROLE_MODERATOR == myRole) { int role = getRole(nick); if (XmppServiceContact.ROLE_MODERATOR != role) { if (XmppServiceContact.ROLE_PARTICIPANT == role) { menu.addItem("devoice", COMMAND_DEVOICE); } else { menu.addItem("voice", COMMAND_VOICE); } menu.addItem("kick", COMMAND_KICK); menu.addItem("ban", COMMAND_BAN); } } return menu; } private void update() { if (null != view) view.lock(); int currentIndex = getCurrItem(); contacts.removeAllElements(); addLayerToListOfSubcontacts("list_of_moderators", XmppServiceContact.ROLE_MODERATOR); addLayerToListOfSubcontacts("list_of_participants", XmppServiceContact.ROLE_PARTICIPANT); addLayerToListOfSubcontacts("list_of_visitors", XmppServiceContact.ROLE_VISITOR); setCurrentItemIndex(currentIndex); if (null != view) view.unlock(); } private int getRole(String nick) { XmppContact.SubContact c = conference.getContact(nick); int priority = (null == c) ? XmppServiceContact.ROLE_VISITOR : c.priority; return priority & XmppServiceContact.ROLE_MASK; } private void addLayerToListOfSubcontacts(String layer, byte priority) { boolean hasLayer = false; contacts.addElement(JLocale.getString(layer)); Vector subcontacts = conference.subContacts; for (int i = 0; i < subcontacts.size(); ++i) { XmppContact.SubContact contact = (XmppContact.SubContact)subcontacts.elementAt(i); if ((contact.priority & XmppServiceContact.ROLE_MASK) == priority) { contacts.addElement(contact); hasLayer = true; } } if (!hasLayer) { contacts.removeElementAt(contacts.size() - 1); } } protected int getItemHeight(int itemIndex) { Object o = contacts.elementAt(itemIndex); if (o instanceof XmppContact.SubContact) { XmppContact.SubContact c = (XmppContact.SubContact)o; int height = fontSet[CanvasEx.FONT_STYLE_PLAIN].getHeight() + 1; // #sijapp cond.if modules_CLIENTS is "true" # Icon client = InfoFactory.factory.getClientInfo(protocol).getIcon(c.client); if (null != client) { height = Math.max(height, client.getHeight()); } // #sijapp cond.end # Icon icon = InfoFactory.factory.getStatusInfo(protocol).getIcon(c.status); if (null != icon) { height = Math.max(height, icon.getHeight()); } height = Math.max(height, CanvasEx.minItemHeight); return height; } return fontSet[CanvasEx.FONT_STYLE_BOLD].getHeight() + 1; } protected void drawItemData(GraphicsEx g, int index, int x, int y, int w, int h, int skip, int to) { g.setThemeColor(CanvasEx.THEME_TEXT); Object o = contacts.elementAt(index); if (o instanceof XmppContact.SubContact) { XmppContact.SubContact c = (XmppContact.SubContact)o; g.setFont(fontSet[CanvasEx.FONT_STYLE_PLAIN]); leftIcons[0] = InfoFactory.factory.getStatusInfo(protocol).getIcon(c.status); leftIcons[1] = affiliationIcons.iconAt(c.priority & XmppServiceContact.AFFILIATION_MASK); // #sijapp cond.if modules_CLIENTS is "true" # rightIcons[0] = InfoFactory.factory.getClientInfo(protocol).getIcon(c.client); // #sijapp cond.end # g.drawString(leftIcons, c.resource, rightIcons, x, y, w, h); return; } String header = (String)o; g.setFont(fontSet[CanvasEx.FONT_STYLE_BOLD]); g.drawString(header, x, y, w, h); } private Contact getPrivateContact(String nick) { String jid = Jid.realJidToJimmJid(conference.getUserId() + "/" + nick); return protocol.createTempContact(jid); } private Contact getContactForVCard(String nick) { String jid = Jid.realJidToJimmJid(conference.getUserId() + "/" + nick); return protocol.createTempContact(jid); } private void nickSelected(String nick) { String jid = Jid.realJidToJimmJid(conference.getUserId() + "/" + nick); XmppServiceContact c = (XmppServiceContact)protocol.getItemByUID(jid); if (null == c) { c = (XmppServiceContact)protocol.createTempContact(jid); protocol.addTempContact(c); } c.activate(protocol); } public void setMucRole(String nick, String role) { protocol.getConnection().setMucRole(conference.getUserId(), nick, role); } public void setMucAffiliation(String nick, String affiliation) { XmppContact.SubContact c = conference.getExistSubContact(nick); if ((null == c) || (null == c.realJid)) { return; } protocol.getConnection().setMucAffiliation(conference.getUserId(), c.realJid, affiliation); } } // #sijapp cond.end #