/** * $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.assistants; import java.awt.BorderLayout; 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 javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.JToolBar; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.jivesoftware.fastpath.FastpathPlugin; import org.jivesoftware.fastpath.FpRes; import org.jivesoftware.fastpath.resources.FastpathRes; import org.jivesoftware.fastpath.workspace.panes.BackgroundPane; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smackx.workgroup.agent.AgentSession; import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.component.RolloverButton; import org.jivesoftware.spark.ui.ChatRoom; import org.jivesoftware.spark.ui.ChatRoomClosingListener; import org.jivesoftware.spark.util.ModelUtil; import org.jivesoftware.spark.util.ResourceUtils; import org.jivesoftware.spark.util.SwingWorker; import org.jivesoftware.spark.util.log.Log; public class Notes extends JPanel { private static final long serialVersionUID = -7789684145607565950L; private JFrame notesFrame; private JScrollPane scrollPane; private JTextPane textPane; private JToolBar toolBar; private RolloverButton saveButton; private String sessionID; private boolean hasClickedInPane; private JLabel statusLabel; private ChatRoom chatRoom; private boolean updated; public Notes(String sessionID, ChatRoom room) { setLayout(new BorderLayout()); this.chatRoom = room; this.sessionID = sessionID; textPane = new JTextPane(); textPane.setText(FpRes.getString("message.click.to.add.notes")); textPane.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (!hasClickedInPane) { textPane.setText(""); hasClickedInPane = true; } } }); scrollPane = new JScrollPane(textPane); this.add(scrollPane, BorderLayout.CENTER); toolBar = new JToolBar(); toolBar.setFloatable(false); saveButton = new RolloverButton(FastpathRes.getImageIcon(FastpathRes.SAVE_AS_16x16)); toolBar.add(saveButton); ResourceUtils.resButton(saveButton, FpRes.getString("button.save.note")); final BackgroundPane titlePanel = new BackgroundPane(); titlePanel.setLayout(new GridBagLayout()); JLabel notesLabel = new JLabel(); notesLabel.setFont(new Font("Dialog", Font.BOLD, 11)); ResourceUtils.resLabel(notesLabel, textPane, FpRes.getString("label.notes")); JLabel descriptionLabel = new JLabel(); descriptionLabel.setText(FpRes.getString("message.chat.notes")); titlePanel.add(notesLabel, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); titlePanel.add(descriptionLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 10, 5, 5), 0, 0)); titlePanel.add(saveButton, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 10, 5, 5), 0, 0)); //add(titlePanel, BorderLayout.NORTH); textPane.getDocument().addDocumentListener(new DocumentListener() { public void changedUpdate(DocumentEvent e) { saveButton.setEnabled(true); updated = true; } public void insertUpdate(DocumentEvent e) { saveButton.setEnabled(true); updated = true; } public void removeUpdate(DocumentEvent e) { saveButton.setEnabled(true); updated = true; } }); saveButton.setEnabled(false); // Add status label statusLabel = new JLabel(); this.add(statusLabel, BorderLayout.SOUTH); chatRoom.addClosingListener(new ChatRoomClosingListener() { public void closing() { if (updated) { saveNotes(); } } }); } public void showDialog() { if (notesFrame != null && notesFrame.isVisible()) { return; } notesFrame = new JFrame(FpRes.getString("title.chat.notes")); notesFrame.setIconImage(SparkManager.getMainWindow().getIconImage()); notesFrame.getContentPane().setLayout(new BorderLayout()); notesFrame.getContentPane().add(new JScrollPane(this), BorderLayout.CENTER); notesFrame.pack(); notesFrame.setSize(500, 400); notesFrame.setLocationRelativeTo(SparkManager.getChatManager().getChatContainer()); notesFrame.setVisible(true); textPane.requestFocusInWindow(); } private void saveNotes() { String note = textPane.getText(); // Check for empty note. if (!ModelUtil.hasLength(note)) { return; } // Save note. AgentSession agentSession = FastpathPlugin.getAgentSession(); try { agentSession.setNote(sessionID, note); saveButton.setEnabled(false); statusLabel.setText(" "+ FpRes.getString("message.notes.updated")); SwingWorker worker = new SwingWorker() { public Object construct() { try { Thread.sleep(3000); } catch (InterruptedException e1) { Log.error(e1); } return true; } public void finished() { statusLabel.setText(""); } }; worker.start(); } catch (XMPPException e1) { showError(FpRes.getString("message.unable.to.update.notes")); Log.error("Could not commit note.", e1); } } public void showError(String error) { JOptionPane.showMessageDialog(this, error, FpRes.getString("title.notes"), JOptionPane.ERROR_MESSAGE); } /** * Replaces all instances of oldString with newString in string. * * @param string the String to search to perform replacements on * @param oldString the String that should be replaced by newString * @param newString the String that will replace all instances of oldString * @return a String will all instances of oldString replaced by newString */ public static final String replace(String string, String oldString, String newString) { if (string == null) { return null; } // If the newString is null or zero length, just return the string since there's nothing // to replace. if (newString == null) { return string; } int i = 0; // Make sure that oldString appears at least once before doing any processing. if ((i = string.indexOf(oldString, i)) >= 0) { // Use char []'s, as they are more efficient to deal with. char[] string2 = string.toCharArray(); char[] newString2 = newString.toCharArray(); int oLength = oldString.length(); StringBuffer buf = new StringBuffer(string2.length); buf.append(string2, 0, i).append(newString2); i += oLength; int j = i; // Replace all remaining instances of oldString with newString. while ((i = string.indexOf(oldString, i)) > 0) { buf.append(string2, j, i - j).append(newString2); i += oLength; j = i; } buf.append(string2, j, string2.length - j); return buf.toString(); } return string; } public Dimension getPreferredSize() { final Dimension size = super.getPreferredSize(); size.width = 0; size.height = 300; return size; } }