/** * $RCSfile: ,v $ * $Revision: $ * $Date: $ * * Copyright (C) 2004-2011 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.fastpath.workspace.panes; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Collection; import java.util.Date; import java.util.Iterator; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import org.jivesoftware.fastpath.FastpathPlugin; import org.jivesoftware.fastpath.FpRes; import org.jivesoftware.fastpath.resources.FastpathRes; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smackx.workgroup.agent.AgentSession; import org.jivesoftware.smackx.workgroup.ext.history.AgentChatHistory; import org.jivesoftware.smackx.workgroup.ext.history.AgentChatSession; import org.jivesoftware.smackx.workgroup.packet.Transcript; import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.util.ModelUtil; import org.jivesoftware.spark.util.log.Log; public class ChatHistory extends JPanel { private static final long serialVersionUID = 1L; private DefaultListModel model = new DefaultListModel(); private AgentSession agentSession; private JList list; private JFrame mainFrame; private JFrame frame; public ChatHistory() { list = new JList(model); list.setCellRenderer(new HistoryItemRenderer()); final JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); mainPanel.setBackground(Color.white); final BackgroundPane titlePane = new BackgroundPane() { public Dimension getPreferredSize() { final Dimension size = super.getPreferredSize(); size.width = 0; return size; } }; titlePane.setLayout(new GridBagLayout()); titlePane.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.LIGHT_GRAY)); JLabel userImage = new JLabel(); userImage.setHorizontalAlignment(JLabel.LEFT); userImage.setText(FpRes.getString("title.previous.chats")); userImage.setIcon(FastpathRes.getImageIcon(FastpathRes.FASTPATH_IMAGE_24x24)); titlePane.add(userImage, new GridBagConstraints(0, 0, 4, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); userImage.setFont(new Font("Dialog", Font.BOLD, 12)); mainPanel.add(titlePane, BorderLayout.NORTH); mainPanel.add(list, BorderLayout.CENTER); setLayout(new BorderLayout()); add(mainPanel, BorderLayout.CENTER); init(); list.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { HistoryItem historyItem = (HistoryItem)list.getSelectedValue(); showTranscript(historyItem.getSessionID()); } } }); } public void showDialog() { AgentSession agentSession = FastpathPlugin.getAgentSession(); String workgroupName = StringUtils.parseName(agentSession.getWorkgroupJID()); if (mainFrame == null) { mainFrame = new JFrame(FpRes.getString("title.personal.chats")); } if (mainFrame.isVisible()) { return; } mainFrame.setIconImage(SparkManager.getMainWindow().getIconImage()); mainFrame.getContentPane().setLayout(new BorderLayout()); final JScrollPane scrollPane = new JScrollPane(this); scrollPane.getVerticalScrollBar().setBlockIncrement(50); scrollPane.getVerticalScrollBar().setUnitIncrement(20); mainFrame.getContentPane().add(scrollPane); mainFrame.pack(); mainFrame.setSize(400, 400); mainFrame.setLocationRelativeTo(SparkManager.getMainWindow()); mainFrame.setVisible(true); } public void init() { model.removeAllElements(); AgentChatHistory history = null; agentSession = FastpathPlugin.getAgentSession(); String jid = SparkManager.getSessionManager().getBareAddress(); try { history = agentSession.getAgentHistory(jid, 10, null); } catch (XMPPException e1) { Log.error("Error retrieving chat history.", e1); } try { model.removeAllElements(); Collection sessions = history.getAgentChatSessions(); Iterator iter = sessions.iterator(); while (iter.hasNext()) { AgentChatSession chatSession = (AgentChatSession)iter.next(); // Then were in a group chat final String nickname = chatSession.getVisitorsName(); String email = chatSession.getVisitorsEmail(); String sessionID = chatSession.getSessionID(); String duration = ModelUtil.getTimeFromLong(chatSession.getDuration()); String question = chatSession.getQuestion(); if (!ModelUtil.hasLength(question)) { question = "No question was asked."; } Date startDate = chatSession.getStartDate(); HistoryItem historyItem = new HistoryItem(nickname, startDate, email, question, duration); historyItem.setSessionID(sessionID); model.addElement(historyItem); } list.validate(); list.repaint(); } catch (Exception e1) { Log.error("Error retrieving chat history.", e1); } } private void showTranscript(String sessionID) { if (frame == null) { frame = new JFrame(FpRes.getString("title.chat.transcript")); frame.setIconImage(SparkManager.getMainWindow().getIconImage()); } if (frame.isVisible()) { return; } Transcript transcript = null; try { transcript = FastpathPlugin.getAgentSession().getTranscript(sessionID); } catch (XMPPException e) { Log.error("Error showing transcripts.", e); } if (transcript == null) { JOptionPane.showMessageDialog(this, FpRes.getString("message.transcript.not.found.error"), FpRes.getString("title.error"), JOptionPane.ERROR_MESSAGE); return; } final ChatViewer chatViewer = new ChatViewer(transcript); frame.getContentPane().removeAll(); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(chatViewer, BorderLayout.CENTER); frame.pack(); frame.setSize(600, 400); frame.setLocationRelativeTo(mainFrame); frame.setVisible(true); } /** * Lets make sure that the panel doesn't stretch past the * scrollpane view pane. * * @return the preferred dimension */ public Dimension getPreferredSize() { final Dimension size = super.getPreferredSize(); size.width = 0; return size; } }