/*
* Created on 19-Apr-2004
* Created by Paul Gardner
* Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package org.gudy.azureus2.pluginsimpl.local.ui;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.gudy.azureus2.core3.util.AEMonitor;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.pluginsimpl.local.ui.SWT.SWTManagerImpl;
import org.gudy.azureus2.pluginsimpl.local.ui.model.BasicPluginConfigModelImpl;
import org.gudy.azureus2.pluginsimpl.local.ui.model.BasicPluginViewModelImpl;
import org.gudy.azureus2.pluginsimpl.local.ui.menus.MenuManagerImpl;
import org.gudy.azureus2.pluginsimpl.local.ui.tables.TableManagerImpl;
import org.gudy.azureus2.plugins.PluginConfig;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.PluginView;
import org.gudy.azureus2.plugins.ui.*;
import org.gudy.azureus2.plugins.ui.menus.MenuManager;
import org.gudy.azureus2.plugins.ui.SWT.SWTManager;
import org.gudy.azureus2.plugins.ui.config.ConfigSection;
import org.gudy.azureus2.plugins.ui.model.BasicPluginConfigModel;
import org.gudy.azureus2.plugins.ui.model.BasicPluginViewModel;
import org.gudy.azureus2.plugins.ui.model.PluginConfigModel;
import org.gudy.azureus2.plugins.ui.model.PluginViewModel;
import org.gudy.azureus2.plugins.ui.tables.TableManager;
import com.aelitis.azureus.core.util.CopyOnWriteList;
/**
* @author parg
*
*/
public class
UIManagerImpl
implements UIManager
{
protected static AEMonitor class_mon = new AEMonitor( "UIManager:class" );
protected static boolean initialisation_complete;
protected static CopyOnWriteList ui_listeners = new CopyOnWriteList();
protected static CopyOnWriteList ui_event_listeners = new CopyOnWriteList();
protected static List ui_factories = new ArrayList();
protected static List ui_event_history = new ArrayList();
protected static List configModels = new ArrayList();
protected PluginInterface pi;
protected PluginConfig plugin_config;
protected String key_prefix;
protected TableManager table_manager;
protected MenuManager menu_manager;
public
UIManagerImpl(
PluginInterface _pi )
{
pi =_pi;
plugin_config = pi.getPluginconfig();
key_prefix = plugin_config.getPluginConfigKeyPrefix();
table_manager = new TableManagerImpl( this );
menu_manager = new MenuManagerImpl( this );
}
public PluginInterface
getPluginInterface()
{
return( pi );
}
public BasicPluginViewModel
getBasicPluginViewModel(
String name )
{
// grrr, RSSImport plugin directly uses this method
return( createBasicPluginViewModel( name ));
// throw( new RuntimeException( "Deprecated method - use createBasicPluginViewModel"));
}
public PluginView
createPluginView(
PluginViewModel model )
{
try{
return( SWTManagerImpl.getSingleton().createPluginView( model ));
}catch( Throwable e ){
return( null );
}
}
public BasicPluginViewModel
createBasicPluginViewModel(
String name )
{
final BasicPluginViewModel model = new BasicPluginViewModelImpl( this, name );
fireEvent( UIManagerEvent.ET_PLUGIN_VIEW_MODEL_CREATED, model );
return( model );
}
public void
destroy(
final BasicPluginViewModel model )
{
fireEvent( UIManagerEvent.ET_PLUGIN_VIEW_MODEL_DESTROYED, model );
}
public BasicPluginConfigModel
createBasicPluginConfigModel(
String section_name )
{
return( createBasicPluginConfigModel( ConfigSection.SECTION_PLUGINS, section_name ));
}
public BasicPluginConfigModel
createBasicPluginConfigModel(
String parent_section,
String section_name )
{
final BasicPluginConfigModel model = new BasicPluginConfigModelImpl( this, parent_section, section_name );
configModels.add(model);
fireEvent( UIManagerEvent.ET_PLUGIN_CONFIG_MODEL_CREATED, model );
return( model );
}
public void
destroy(
final BasicPluginConfigModel model )
{
configModels.remove(model);
fireEvent( UIManagerEvent.ET_PLUGIN_CONFIG_MODEL_DESTROYED, model );
}
public PluginConfigModel[] getPluginConfigModels() {
return (PluginConfigModel[]) configModels.toArray(new PluginConfigModel[0]);
}
public void
copyToClipBoard(
final String data )
throws UIException
{
boolean ok = fireEvent( UIManagerEvent.ET_COPY_TO_CLIPBOARD, data );
if ( !ok ){
throw( new UIException("Failed to deliver request to UI" ));
}
}
public void
openURL(
final URL url )
throws UIException
{
boolean ok = fireEvent( UIManagerEvent.ET_OPEN_URL, url );
if ( !ok ){
throw( new UIException("Failed to deliver request to UI" ));
}
}
public TableManager getTableManager() {
return( table_manager );
}
public MenuManager getMenuManager() {
return menu_manager;
}
public SWTManager getSWTManager() {
return SWTManagerImpl.getSingleton();
}
public static void
initialisationComplete()
{
try{
class_mon.enter();
initialisation_complete = true;
for (int j=0;j<ui_factories.size();j++){
UIInstanceFactory instance = (UIInstanceFactory)ui_factories.get(j);
Iterator it = ui_listeners.iterator();
while( it.hasNext()){
Object[] entry = (Object[])it.next();
try{
((UIManagerListener)entry[0]).UIAttached(
instance.getInstance((PluginInterface)entry[1]) );
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
}finally{
class_mon.exit();
}
}
public void
attachUI(
UIInstanceFactory factory )
{
try{
class_mon.enter();
ui_factories.add( factory );
if ( initialisation_complete ){
Iterator it = ui_listeners.iterator();
while( it.hasNext()){
Object[] entry = (Object[])it.next();
try{
((UIManagerListener)entry[0]).UIAttached(
factory.getInstance((PluginInterface)entry[1]));
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
}finally{
class_mon.exit();
}
}
public void
detachUI(
UIInstanceFactory instance )
throws UIException
{
try{
class_mon.enter();
instance.detach();
ui_factories.remove( instance );
if ( initialisation_complete ){
Iterator it = ui_listeners.iterator();
while( it.hasNext()){
Object[] entry = (Object[])it.next();
try{
((UIManagerListener)entry[0]).UIDetached(
instance.getInstance((PluginInterface)entry[1]));
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
}finally{
class_mon.exit();
}
}
public void
addUIListener(
UIManagerListener listener )
{
try{
class_mon.enter();
ui_listeners.add( new Object[]{ listener, pi });
if ( initialisation_complete ){
for (int i=0;i<ui_factories.size();i++){
UIInstanceFactory instance = (UIInstanceFactory)ui_factories.get(i);
try{
listener.UIAttached( instance.getInstance( pi ));
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
}finally{
class_mon.exit();
}
}
public void
removeUIListener(
UIManagerListener listener )
{
try{
class_mon.enter();
Iterator it = ui_listeners.iterator();
while( it.hasNext()){
Object[] entry = (Object[])it.next();
if ( entry[0] == listener ){
it.remove();
}
}
}finally{
class_mon.exit();
}
}
public void
addUIEventListener(
UIManagerEventListener listener )
{
try{
class_mon.enter();
ui_event_listeners.add( listener );
}finally{
class_mon.exit();
}
for (int i=0;i<ui_event_history.size();i++){
try{
listener.eventOccurred((UIManagerEvent)ui_event_history.get(i));
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
public void
removeUIEventListener(
UIManagerEventListener listener )
{
try{
class_mon.enter();
ui_event_listeners.remove( listener );
}finally{
class_mon.exit();
}
}
public boolean hasUIInstances() {return !ui_factories.isEmpty();}
public UIInstance[] getUIInstances() {
try {
class_mon.enter();
ArrayList result = new ArrayList(ui_factories.size());
for (int i=0;i<ui_factories.size();i++){
UIInstanceFactory instance = (UIInstanceFactory)ui_factories.get(i);
result.add(instance.getInstance(pi));
}
return (UIInstance[])result.toArray(new UIInstance[result.size()]);
}
finally {
class_mon.exit();
}
}
public static boolean
fireEvent(
int type,
Object data )
{
return( fireEvent( new UIManagerEventAdapter( type, data )));
}
public static boolean
fireEvent(
UIManagerEvent event )
{
boolean delivered = false;
Iterator event_it = ui_event_listeners.iterator();
while( event_it.hasNext()){
try{
if (((UIManagerEventListener)event_it.next()).eventOccurred( event )){
delivered = true;
break;
}
}catch( Throwable e ){
e.printStackTrace();
}
}
int type = event.getType();
// some events need to be replayed when new UIs attach
if ( type == UIManagerEvent.ET_PLUGIN_VIEW_MODEL_CREATED ||
type == UIManagerEvent.ET_PLUGIN_CONFIG_MODEL_CREATED ||
type == UIManagerEvent.ET_ADD_TABLE_CONTEXT_MENU_ITEM ||
type == UIManagerEvent.ET_ADD_MENU_ITEM ||
type == UIManagerEvent.ET_REMOVE_TABLE_CONTEXT_MENU_ITEM ||
type == UIManagerEvent.ET_REMOVE_MENU_ITEM) {
delivered = true;
ui_event_history.add( event );
}else if ( type == UIManagerEvent.ET_PLUGIN_VIEW_MODEL_DESTROYED ||
type == UIManagerEvent.ET_PLUGIN_CONFIG_MODEL_DESTROYED ){
// remove any corresponding history events for creation of these entities
delivered = true;
Iterator history_it = ui_event_history.iterator();
while( history_it.hasNext()){
UIManagerEvent e = (UIManagerEvent)history_it.next();
int e_type = e.getType();
if ( e_type == UIManagerEvent.ET_PLUGIN_VIEW_MODEL_CREATED ||
e_type == UIManagerEvent.ET_PLUGIN_CONFIG_MODEL_CREATED ){
if ( e.getData() == event.getData()){
history_it.remove();
break;
}
}
}
}
return( delivered );
}
public void
showTextMessage(
final String title_resource,
final String message_resource,
final String contents )
{
fireEvent( UIManagerEvent.ET_SHOW_TEXT_MESSAGE, new String[]{ title_resource, message_resource, contents });
}
public boolean showConfigSection(String sectionID) {
UIManagerEventAdapter event = new UIManagerEventAdapter(
UIManagerEvent.ET_SHOW_CONFIG_SECTION, sectionID);
if (!fireEvent(event))
return false;
if (event.getResult() instanceof Boolean)
return false;
return ((Boolean)event.getResult()).booleanValue();
}
}