/** * $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.macros; import java.awt.Color; import java.awt.Component; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Iterator; import java.util.List; import java.util.Properties; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.ListSelectionModel; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import org.jivesoftware.fastpath.FastpathPlugin; import org.jivesoftware.fastpath.FpRes; import org.jivesoftware.fastpath.resources.FastpathRes; import org.jivesoftware.fastpath.workspace.Workpane; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smackx.workgroup.ext.macros.Macro; import org.jivesoftware.smackx.workgroup.ext.macros.MacroGroup; import org.jivesoftware.spark.component.MessageDialog; import org.jivesoftware.spark.component.RolloverButton; import org.jivesoftware.spark.component.Table; import org.jivesoftware.spark.util.ModelUtil; import org.jivesoftware.spark.util.ResourceUtils; import org.jivesoftware.spark.util.log.Log; public class MacrosEditor extends JPanel { private static final long serialVersionUID = 1L; private JLabel initialResponseLabel = new JLabel(); private JTextArea initialResponseField = new JTextArea(); private RolloverButton newButton = new RolloverButton(FastpathRes.getImageIcon(FastpathRes.SMALL_ADD_IMAGE)); private RolloverButton deleteButton = new RolloverButton(FastpathRes.getImageIcon(FastpathRes.SMALL_DELETE)); private JButton saveButton = new JButton(); private MacroTable table; private MacroGroup personalGroup = null; private JDialog dialog; public MacrosEditor() { table = new MacroTable(); setLayout(new GridBagLayout()); add(initialResponseLabel, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); add(new JScrollPane(initialResponseField), new GridBagConstraints(0, 1, 1, 1, 1.0, .5, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 5, 5, 5), 0, 0)); ResourceUtils.resLabel(initialResponseLabel, initialResponseField, FpRes.getString("label.initial.response")); ResourceUtils.resButton(newButton, FpRes.getString("button.new")); ResourceUtils.resButton(deleteButton, FpRes.getString("button.delete")); ResourceUtils.resButton(saveButton, FpRes.getString("button.save")); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); buttonPanel.add(newButton); buttonPanel.add(deleteButton); //buttonPanel.add(saveButton); add(buttonPanel, new GridBagConstraints(0, 2, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); JScrollPane pane = new JScrollPane(table); pane.getViewport().setBackground(Color.white); // add table add(pane, new GridBagConstraints(0, 3, 1, 1, 1.0, 0.5, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); newButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { createNewResponse(); } }); saveButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { save(); } }); deleteButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { deleteRow(); } }); } public void showEditor(Component parent) { try { personalGroup = FastpathPlugin.getAgentSession().getMacros(false); } catch (XMPPException e) { Log.error("No personal macros set."); personalGroup = new MacroGroup(); } Properties props = FastpathPlugin.getLitWorkspace().getWorkgroupProperties(); String initialResponse = props.getProperty(Workpane.INITIAL_RESPONSE_PROPERTY); if (ModelUtil.hasLength(initialResponse)) { initialResponseField.setText(initialResponse); } List<Macro> macros = personalGroup.getMacros(); Iterator<Macro> iter = macros.iterator(); while (iter.hasNext()) { Macro macro = (Macro)iter.next(); String title = macro.getTitle(); String response = macro.getResponse(); table.getTableModel().addRow(new Object[]{title, response}); } dialog = MessageDialog.showComponent(FpRes.getString("title.personal.macros"), FpRes.getString("message.specify.personal.macros"), FastpathRes.getImageIcon(FastpathRes.FASTPATH_IMAGE_24x24), this, parent, 600, 400, true); save(); } /** * Private implementation of table for the CustomerTable. */ private static final class MacroTable extends Table { private static final long serialVersionUID = 4777649199509083939L; MacroTable() { super(new String[]{FpRes.getString("title.response.name"), FpRes.getString("title.response.text")}); getColumnModel().setColumnMargin(0); setSelectionBackground(SELECTION_COLOR); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); setRowSelectionAllowed(true); } // Handle image rendering correctly public TableCellRenderer getCellRenderer(int row, int column) { if (column == 10) { return new JLabelRenderer(false); } else { return super.getCellRenderer(row, column); } } } private void save() { // Save Personal Macros MacroGroup macroGroup = new MacroGroup(); int count = table.getRowCount(); for (int i = 0; i < count; i++) { Macro macro = new Macro(); String title = (String)table.getValueAt(i, 0); String value = (String)table.getValueAt(i, 1); macro.setTitle(title); macro.setResponse(value); macroGroup.addMacro(macro); } macroGroup.setTitle(FpRes.getString("title.personal")); try { FastpathPlugin.getAgentSession().saveMacros(macroGroup); } catch (Exception ex) { JOptionPane.showMessageDialog(dialog, FpRes.getString("message.macros.not.saved"), FpRes.getString("title.error"), JOptionPane.ERROR_MESSAGE); } String initialResponse = initialResponseField.getText(); Properties props = FastpathPlugin.getLitWorkspace().getWorkgroupProperties(); if (ModelUtil.hasLength(initialResponse)) { props.setProperty(Workpane.INITIAL_RESPONSE_PROPERTY, initialResponse); FastpathPlugin.getLitWorkspace().saveProperties(props); } } private void deleteRow() { int selectedRow = table.getSelectedRow(); if (selectedRow != -1) { table.getTableModel().removeRow(selectedRow); ((DefaultTableModel)table.getModel()).fireTableRowsDeleted(selectedRow, selectedRow); } } private void createNewResponse() { final MacroPanel macroPanel = new MacroPanel(); MessageDialog.showComponent(FpRes.getString("title.create.canned.response"), FpRes.getString("message.add.new.response"), FastpathRes.getImageIcon(FastpathRes.HELP2_24x24), macroPanel, dialog, 500, 400, true); String title = macroPanel.getTitle(); String response = macroPanel.getResponse(); if (ModelUtil.hasLength(title) && ModelUtil.hasLength(response)) { // add to table. table.getTableModel().addRow(new Object[]{title, response}); } } }