/**
* $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.sparkimpl.plugin.bookmarks;
import java.awt.event.ActionEvent;
import java.util.Collection;
import java.util.TimerTask;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JMenu;
import org.jivesoftware.resource.Res;
import org.jivesoftware.resource.SparkRes;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smackx.bookmark.BookmarkManager;
import org.jivesoftware.smackx.bookmark.BookmarkedConference;
import org.jivesoftware.smackx.bookmark.BookmarkedURL;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.plugin.Plugin;
import org.jivesoftware.spark.ui.conferences.BookmarksListener;
import org.jivesoftware.spark.ui.conferences.BookmarksUI;
import org.jivesoftware.spark.ui.conferences.ConferenceServices;
import org.jivesoftware.spark.ui.conferences.ConferenceUtils;
import org.jivesoftware.spark.util.BrowserLauncher;
import org.jivesoftware.spark.util.SwingTimerTask;
import org.jivesoftware.spark.util.SwingWorker;
import org.jivesoftware.spark.util.TaskEngine;
import org.jivesoftware.spark.util.log.Log;
/**
* Allows for adding and removal of Bookmarks within Spark.
*/
public class BookmarkPlugin implements Plugin {
@Override
public void initialize() {
final SwingWorker bookmarkThreadWorker = new SwingWorker() {
@Override
public Object construct() {
return this;
}
/**
* Installing menu into spark menu and adding events to bookmarks
*/
@Override
public void finished() {
try {
initialize();
} catch (Exception e) {
Log.error(e);
}
}
/**
*
*/
public void initialize() {
final JMenu bookmarkMenu = new JMenu(Res.getString("menuitem.bookmarks"));
createMenu(bookmarkMenu);
if (bookmarkMenu.getMenuComponentCount() > 0) {
int menuCount = SparkManager.getMainWindow().getMenu().getMenuCount();
SparkManager.getMainWindow().getMenu().add(bookmarkMenu, menuCount - 1);
}
BookmarksUI bookmarksUi = ConferenceServices.getBookmarkedConferences();
bookmarksUi.addBookmarksListener(new BookmarksListener() {
@Override
public void bookmarkAdded(String roomJID) {
rescan(bookmarkMenu);
}
@Override
public void bookmarkRemoved(String roomJID) {
rescan(bookmarkMenu);
}
});
}
/**
* Rescaning our bookmarks and remaking menu items
*
* @param Bookmark menu Jmenu
*/
public void rescan(JMenu bookmarkMenu) {
bookmarkMenu.removeAll(); // removing old menus
try {
setBookmarks(bookmarkMenu); // making new
int onPanel = SparkManager.getMainWindow().getMenu().getComponentIndex(bookmarkMenu);
if (onPanel < 0) {
if (bookmarkMenu.getMenuComponentCount() > 0) {
int menuCount = SparkManager.getMainWindow().getMenu().getMenuCount();
SparkManager.getMainWindow().getMenu().add(bookmarkMenu, menuCount - 2);
}
}
if (onPanel >= 0) {
if (bookmarkMenu.getMenuComponentCount() <= 0) {
SparkManager.getMainWindow().getMenu().remove(bookmarkMenu);
}
}
SparkManager.getMainWindow().getMenu().invalidate();
SparkManager.getMainWindow().getMenu().validate();
SparkManager.getMainWindow().getMenu().repaint();
} catch (XMPPException ex) {
Log.error(ex);
}
}
/**
* Updating statusbar and generating menu items
*
* @param Bookmark menu Jmenu
*/
public void createMenu(JMenu bookmarkMenu) {
try {
setBookmarks(bookmarkMenu);
} catch (XMPPException ex) {
Log.error(ex);
}
}
/**
* loading menu items and setting bookmarks listeners
*
* @param Bookmark menu Jmenu
*/
public void setBookmarks(JMenu bookmarkMenu) throws XMPPException {
BookmarkManager manager = BookmarkManager.getBookmarkManager(SparkManager.getConnection());
if (manager != null) {
Collection<BookmarkedConference> bookmarkedConferences = manager.getBookmarkedConferences();
final Collection<BookmarkedURL> bookmarkedLinks = manager.getBookmarkedURLs();
for (Object bookmarkedLink : bookmarkedLinks) {
final BookmarkedURL link = (BookmarkedURL) bookmarkedLink;
Action urlAction = new AbstractAction() {
private static final long serialVersionUID = 4246574779205966917L;
@Override
public void actionPerformed(ActionEvent actionEvent) {
try {
BrowserLauncher.openURL(link.getURL());
} catch (Exception e) {
Log.error(e);
}
}
};
urlAction.putValue(Action.NAME, link.getName());
urlAction.putValue(Action.SMALL_ICON, SparkRes.getImageIcon(SparkRes.LINK_16x16));
bookmarkMenu.add(urlAction);
}
for (Object bookmarkedConference : bookmarkedConferences) {
final BookmarkedConference conferences = (BookmarkedConference) bookmarkedConference;
Action conferenceAction = new AbstractAction() {
private static final long serialVersionUID = 5964584172262968704L;
@Override
public void actionPerformed(ActionEvent actionEvent) {
final TimerTask task = new SwingTimerTask() {
@Override
public void doRun() {
ConferenceUtils.joinConferenceOnSeperateThread(conferences.getName(), conferences.getJid(), conferences.getPassword());
}
};
TaskEngine.getInstance().schedule(task, 10);
}
};
conferenceAction.putValue(Action.NAME, conferences.getName());
conferenceAction.putValue(Action.SMALL_ICON, SparkRes.getImageIcon(SparkRes.CONFERENCE_IMAGE_16x16));
bookmarkMenu.add(conferenceAction);
}
}
}
};
bookmarkThreadWorker.start();
}
@Override
public void shutdown() {
}
@Override
public boolean canShutDown() {
return false;
}
@Override
public void uninstall() {
}
}