/**
* $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.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.List;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.text.BadLocationException;
import org.jivesoftware.fastpath.FastpathPlugin;
import org.jivesoftware.fastpath.FpRes;
import org.jivesoftware.fastpath.workspace.macros.MacrosEditor;
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.ui.ChatRoom;
import org.jivesoftware.spark.util.ResourceUtils;
import org.jivesoftware.spark.util.log.Log;
/**
* Creates a drop down menu list of all macros, both personal and global.
*/
public class ChatMacroMenu {
private final JPopupMenu popup = new JPopupMenu();
private final ChatRoom chatRoom;
private final JMenuItem editMacros;
/**
* Create a new ChatMacroMenu to use in the specified ChatRoom.
*
* @param room the <code>ChatRoom</code> to use the menu with.
*/
public ChatMacroMenu(ChatRoom room) {
// Set the chat room we are working with.
chatRoom = room;
// Load global folder
MacroGroup globalMacros = null;
try {
globalMacros = FastpathPlugin.getAgentSession().getMacros(true);
}
catch (XMPPException e) {
// Not Global Macros Set
Log.error("No global macros have been set.");
}
if (globalMacros != null) {
JMenu globalMenu = new JMenu(FpRes.getString("menuitem.global.canned.responses"));
addSubMenus(globalMenu, globalMacros.getMacroGroups());
addMenuItems(globalMenu, globalMacros.getMacros());
popup.add(globalMenu);
// Iterator through objects and look for JMenu with JMenuItem
Component[] components = globalMenu.getMenuComponents();
final int no = components != null ? components.length : 0;
if (no == 0) {
addNoMacroItem(globalMenu);
}
}
MacroGroup personalGroup = null;
try {
personalGroup = FastpathPlugin.getAgentSession().getMacros(false);
}
catch (XMPPException e) {
Log.error("No personal macros set.");
}
if (personalGroup != null) {
JMenu personalMenu = new JMenu(personalGroup.getTitle());
addSubMenus(personalMenu, personalGroup.getMacroGroups());
addMenuItems(personalMenu, personalGroup.getMacros());
popup.add(personalMenu);
Component[] components = personalMenu.getMenuComponents();
final int noPersonal = components != null ? components.length : 0;
for (int i = 0; i < noPersonal; i++) {
Component comp = components[i];
if (comp instanceof JMenu) {
JMenu jmenu = (JMenu)comp;
if (jmenu.getMenuComponentCount() == 0) {
addNoMacroItem(jmenu);
}
}
}
if (noPersonal == 0) {
addNoMacroItem(personalMenu);
}
}
editMacros = new JMenuItem();
ResourceUtils.resButton(editMacros, FpRes.getString("button.edit.canned.responses"));
popup.addSeparator();
popup.add(editMacros);
editMacros.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MacrosEditor editor = new MacrosEditor();
editor.showEditor(editMacros);
}
});
}
private void addSubMenus(JMenu menu, List<MacroGroup> macroGroups) {
Iterator<MacroGroup> subFolders = macroGroups.iterator();
while (subFolders.hasNext()) {
MacroGroup folder = subFolders.next();
JMenu subMenu = new JMenu(folder.getTitle());
menu.add(subMenu);
addMenuItems(subMenu, folder.getMacros());
addSubMenus(subMenu, folder.getMacroGroups());
}
}
private void addMenuItems(JMenu menu, List<Macro> macros) {
Iterator<Macro> items = macros.iterator();
while (items.hasNext()) {
final Macro newItem = items.next();
final JMenuItem item = new JMenuItem(newItem.getTitle());
menu.add(item);
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String text = newItem.getResponse() + " ";
try {
chatRoom.getChatInputEditor().insertText(text);
}
catch (BadLocationException e1) {
Log.error("Error inserting macro", e1);
}
}
});
}
}
private void addNoMacroItem(JMenu menu) {
final JMenuItem item = new JMenuItem(FpRes.getString("menuitem.no.entries"));
item.setEnabled(false);
menu.add(item);
}
/**
* Show the macro menu.
*
* @param comp the parent component.
* @param x the mouse x pos.
* @param y the mouse y pos.
*/
public void show(Component comp, int x, int y) {
popup.show(comp, x, y);
}
}