/* * Created on Oct 19, 2010 * Created by Paul Gardner * * Copyright 2010 Vuze, Inc. 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; version 2 of the License only. * * 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. */ package org.gudy.azureus2.ui.swt.pluginsimpl; import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.Map; import org.gudy.azureus2.core3.util.Debug; import org.gudy.azureus2.plugins.PluginInterface; import org.gudy.azureus2.pluginsimpl.local.PluginCoreUtils; import org.gudy.azureus2.ui.swt.plugins.UISWTView; import org.gudy.azureus2.ui.swt.plugins.UISWTViewEvent; import org.gudy.azureus2.ui.swt.plugins.UISWTViewEventListener; import org.gudy.azureus2.ui.swt.plugins.UISWTInstance.UISWTViewEventListenerWrapper; /** * Holds information to create a real {@link UISWTViewEventListener} from * its {@link Class} * <p> * Holds {@link PluginInterface} reference */ public class UISWTViewEventListenerHolder implements UISWTViewEventListenerWrapper { private final UISWTViewEventListener listener; private final Reference<PluginInterface> pi; private Object datasource; private final String viewID; // when there is no #listener, we create a new #cla for each TYPE_CREATE event Map<UISWTView, UISWTViewEventListener> mapSWTViewToEventListener; private Class<? extends UISWTViewEventListener> cla; public UISWTViewEventListenerHolder( String viewID, Class<? extends UISWTViewEventListener> _cla, Object datasource, PluginInterface _pi ) { this(viewID, (UISWTViewEventListener) null, _pi); cla = _cla; this.datasource = datasource; } protected UISWTViewEventListenerHolder( String viewID, UISWTViewEventListener _listener, PluginInterface _pi ) { this.viewID = viewID; listener = _listener; if ( _pi == null ){ if ( listener instanceof BasicPluginViewImpl ){ _pi = ((BasicPluginViewImpl)listener).getModel().getPluginInterface(); } } if ( _pi != null ){ pi = new WeakReference<PluginInterface>( _pi ); }else{ pi = null; } } public boolean isLogView() { return( listener instanceof BasicPluginViewImpl ); } public PluginInterface getPluginInterface() { return( pi==null?null:pi.get()); } public boolean eventOccurred( UISWTViewEvent event ) { if (listener == null) { UISWTViewEventListener eventListener = null; synchronized( this ){ int type = event.getType(); if (type == UISWTViewEvent.TYPE_CREATE) { try { eventListener = cla.newInstance(); UISWTView view = event.getView(); if (eventListener instanceof UISWTViewCoreEventListener) { if (view instanceof UISWTViewCore) { UISWTViewCore coreView = (UISWTViewCore) view; coreView.setUseCoreDataSource(true); } } if (mapSWTViewToEventListener == null) { mapSWTViewToEventListener = new HashMap<UISWTView, UISWTViewEventListener>(); } mapSWTViewToEventListener.put(view, eventListener); if (datasource != null) { if (view instanceof UISWTViewImpl) { UISWTViewImpl swtView = (UISWTViewImpl) view; swtView.triggerEventRaw( UISWTViewEvent.TYPE_DATASOURCE_CHANGED, PluginCoreUtils.convert(datasource, ((UISWTViewImpl) view).useCoreDataSource())); } else { view.triggerEvent(UISWTViewEvent.TYPE_DATASOURCE_CHANGED, datasource); } } } catch (Exception e) { Debug.out(e); return false; } } else if (mapSWTViewToEventListener != null) { if (type == UISWTViewEvent.TYPE_DESTROY) { eventListener = mapSWTViewToEventListener.remove(event.getView()); } else { eventListener = mapSWTViewToEventListener.get(event.getView()); } } } if (eventListener == null) { return false; } return eventListener.eventOccurred(event); } else if (event.getType() == UISWTViewEvent.TYPE_CREATE && (listener instanceof UISWTViewCoreEventListener)){ if (event.getView() instanceof UISWTViewCore) { UISWTViewCore coreView = (UISWTViewCore) event.getView(); coreView.setUseCoreDataSource(true); } } return( listener.eventOccurred( event )); } public UISWTViewEventListener getDelegatedEventListener(UISWTView view) { if (listener != null) { return listener; } synchronized( this ){ if (mapSWTViewToEventListener == null) { return null; } return mapSWTViewToEventListener.get(view); } } public String getViewID() { return viewID; } }