diff --git a/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy b/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy index 9528ea7b..3187d125 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy @@ -22,6 +22,8 @@ import com.muwire.core.chat.ChatAction import com.muwire.core.chat.ChatConnection import com.muwire.core.chat.ChatMessageEvent import com.muwire.core.chat.ChatServer +import com.muwire.core.trust.TrustEvent +import com.muwire.core.trust.TrustLevel @Log @ArtifactProviderFor(GriffonController) @@ -94,6 +96,50 @@ class ChatRoomController { model.core.eventBus.publish(event) } + @ControllerAction + void privateMessage() { + Persona p = view.getSelectedPersona() + if (p == null) + return + if (p != model.core.me && !mvcGroup.parentGroup.childrenGroups.containsKey(p.getHumanReadableName()+"-private-chat")) { + def params = [:] + params['core'] = model.core + params['tabName'] = model.tabName + params['room'] = p.toBase64() + params['privateChat'] = true + params['host'] = model.host + params['roomTabName'] = p.getHumanReadableName() + + mvcGroup.parentGroup.createMVCGroup("chat-room", p.getHumanReadableName()+"-private-chat", params) + } + } + + void markTrusted() { + Persona p = view.getSelectedPersona() + if (p == null) + return + String reason = JOptionPane.showInputDialog("Enter reason (optional)") + model.core.eventBus.publish(new TrustEvent(persona : p, level : TrustLevel.TRUSTED, reason : reason)) + view.refreshMembersTable() + } + + void markDistrusted() { + Persona p = view.getSelectedPersona() + if (p == null) + return + String reason = JOptionPane.showInputDialog("Enter reason (optional)") + model.core.eventBus.publish(new TrustEvent(persona : p, level : TrustLevel.DISTRUSTED, reason : reason)) + view.refreshMembersTable() + } + + void markNeutral() { + Persona p = view.getSelectedPersona() + if (p == null) + return + model.core.eventBus.publish(new TrustEvent(persona : p, level : TrustLevel.NEUTRAL)) + view.refreshMembersTable() + } + void leaveRoom() { if (leftRoom) return diff --git a/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy b/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy index 3b90b2f0..d734cbf4 100644 --- a/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy @@ -4,6 +4,8 @@ import griffon.core.artifact.GriffonView import griffon.inject.MVCMember import griffon.metadata.ArtifactProviderFor +import javax.swing.JMenuItem +import javax.swing.JPopupMenu import javax.swing.JSplitPane import javax.swing.ListSelectionModel import javax.swing.SwingConstants @@ -113,27 +115,51 @@ class ChatRoomView { membersTable.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.button == MouseEvent.BUTTON1 && e.clickCount > 1) { - int selectedRow = membersTable.getSelectedRow() - if (lastMembersTableSortEvent != null) - selectedRow = membersTable.rowSorter.convertRowIndexToModel(selectedRow) - Persona p = model.members[selectedRow] - if (p != model.core.me && !mvcGroup.parentGroup.childrenGroups.containsKey(p.getHumanReadableName()+"-private-chat")) { - def params = [:] - params['core'] = model.core - params['tabName'] = model.tabName - params['room'] = p.toBase64() - params['privateChat'] = true - params['host'] = model.host - params['roomTabName'] = p.getHumanReadableName() - - mvcGroup.parentGroup.createMVCGroup("chat-room", p.getHumanReadableName()+"-private-chat", params) - } - } + controller.privateMessage() + } else if (e.isPopupTrigger() || e.button == MouseEvent.BUTTON3) + showPopupMenu(e) + } + + public void mouseReleased(MouseEvent e) { + if (e.isPopupTrigger() || e.button == MouseEvent.BUTTON3) + showPopupMenu(e) } }) } } + private void showPopupMenu(MouseEvent e) { + JPopupMenu menu = new JPopupMenu() + JMenuItem privateChat = new JMenuItem("Start Private Chat") + privateChat.addActionListener({controller.privateMessage()}) + menu.add(privateChat) + JMenuItem markTrusted = new JMenuItem("Mark Trusted") + markTrusted.addActionListener({controller.markTrusted()}) + menu.add(markTrusted) + JMenuItem markNeutral = new JMenuItem("Mark Neutral") + markNeutral.addActionListener({controller.markNeutral()}) + menu.add(markNeutral) + JMenuItem markDistrusted = new JMenuItem("Mark Distrusted") + markDistrusted.addActionListener({controller.markDistrusted()}) + menu.add(markDistrusted) + menu.show(e.getComponent(), e.getX(), e.getY()) + } + + Persona getSelectedPersona() { + int selectedRow = membersTable.getSelectedRow() + if (selectedRow < 0) + return null + if (lastMembersTableSortEvent != null) + selectedRow = membersTable.rowSorter.convertRowIndexToModel(selectedRow) + model.members[selectedRow] + } + + void refreshMembersTable() { + int selectedRow = membersTable.getSelectedRow() + membersTable.model.fireTableDataChanged() + membersTable.selectionModel.setSelectionInterval(selectedRow, selectedRow) + } + def closeTab = { int index = parent.indexOfComponent(pane) parent.removeTabAt(index)