package com.aelitis.azureus.ui.swt.mdi; import java.util.*; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.gudy.azureus2.core3.config.COConfigurationManager; import org.gudy.azureus2.core3.config.impl.ConfigurationDefaults; import org.gudy.azureus2.core3.config.impl.ConfigurationParameterNotFoundException; import org.gudy.azureus2.core3.download.DownloadManager; import org.gudy.azureus2.core3.internat.MessageText; import org.gudy.azureus2.core3.util.AERunnable; import org.gudy.azureus2.core3.util.Debug; import org.gudy.azureus2.core3.util.LightHashMap; import org.gudy.azureus2.plugins.ui.UIPluginView; import org.gudy.azureus2.plugins.ui.UIPluginViewToolBarListener; import org.gudy.azureus2.plugins.ui.toolbar.UIToolBarEnablerBase; import org.gudy.azureus2.pluginsimpl.local.PluginCoreUtils; import org.gudy.azureus2.ui.swt.Utils; import org.gudy.azureus2.ui.swt.plugins.UISWTViewEvent; import org.gudy.azureus2.ui.swt.plugins.UISWTViewEventListener; import org.gudy.azureus2.ui.swt.pluginsimpl.*; import com.aelitis.azureus.ui.common.ToolBarEnabler; import com.aelitis.azureus.ui.common.viewtitleinfo.*; import com.aelitis.azureus.ui.mdi.*; import com.aelitis.azureus.ui.selectedcontent.SelectedContentManager; import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT; import com.aelitis.azureus.ui.swt.UIFunctionsSWT; import com.aelitis.azureus.ui.swt.imageloader.ImageLoader; import com.aelitis.azureus.ui.swt.skin.SWTSkinObject; import com.aelitis.azureus.ui.swt.skin.SWTSkinObjectContainer; import com.aelitis.azureus.ui.swt.skin.SWTSkinObjectListener; public abstract class BaseMdiEntry implements MdiEntrySWT, ViewTitleInfoListener { protected final MultipleDocumentInterface mdi; protected final String id; protected String logID; protected Object datasource; protected Class<? extends UIPluginView> viewClass; protected UISWTViewCore view; private String skinRef; private List<MdiCloseListener> listCloseListeners = null; private List<MdiChildCloseListener> listChildCloseListeners = null; private List<MdiEntryLogIdListener> listLogIDListeners = null; private List<MdiEntryOpenListener> listOpenListeners = null; private List<MdiEntryDropListener> listDropListeners = null; private List<MdiEntryDatasourceListener> listDatasourceListeners = null; protected ViewTitleInfo viewTitleInfo; private SWTSkinObject skinObject; private String title; private String titleID; private UISWTViewEventListener eventListener; private String parentID; private boolean pullTitleFromView; private boolean closeable; private Boolean isExpanded = null; private boolean disposed = false; private boolean added = false; private String imageLeftID; private Image imageLeft; private boolean collapseDisabled = false; private SWTSkinObject soMaster; private Set<UIToolBarEnablerBase> setToolBarEnablers = new HashSet<UIToolBarEnablerBase>(1); private String preferredAfterID; private Map<Object,Object> user_data; @SuppressWarnings("unused") private BaseMdiEntry() { mdi = null; id = null; setDefaultExpanded(false); } public BaseMdiEntry(MultipleDocumentInterface mdi, String id) { this.mdi = mdi; this.id = id; this.pullTitleFromView = true; if (id == null) { logID = "null"; } else { int i = id.indexOf('_'); if (i > 0) { logID = id.substring(0, i); } else { logID = id; } } setDefaultExpanded(false); } public String getId() { return id; } public MdiEntryVitalityImage addVitalityImage(String imageID) { return null; } /* (non-Javadoc) * @see com.aelitis.azureus.ui.mdi.MdiEntry#close() */ public boolean close(boolean forceClose) { if (!forceClose && view instanceof UISWTViewImpl) { if (!((UISWTViewImpl) view).requestClose()) { return false; } } setCloseable(closeable); disposed = true; ViewTitleInfoManager.removeListener(this); return true; } public Object getDatasourceCore() { return datasource; } public String getExportableDatasource() { if (viewTitleInfo != null) { Object ds = viewTitleInfo.getTitleInfoProperty(ViewTitleInfo2.TITLE_EXPORTABLE_DATASOURCE); if (ds != null) { return ds.toString(); } } return null; } public Object getDatasource() { return PluginCoreUtils.convert(datasource, false); } public void setDatasource(Object datasource) { this.datasource = datasource; triggerDatasourceListeners(); if (view != null) { view.triggerEvent(UISWTViewEvent.TYPE_DATASOURCE_CHANGED, datasource); } if (isAdded()) { if (skinObject != null) { skinObject.triggerListeners( SWTSkinObjectListener.EVENT_DATASOURCE_CHANGED, datasource); } } } public UIPluginView getView() { return view; } public UISWTViewCore getCoreView() { return view; } public Class<? extends UIPluginView> getViewClass() { return viewClass; } public void setViewClass(Class<? extends UIPluginView> viewClass) { this.viewClass = viewClass; } public String getLogID() { return logID; } public MultipleDocumentInterface getMDI() { return mdi; } public String getParentID() { return parentID; } public void setParentID(String id) { if (id == null || "Tools".equals(id)) { if (getId().equals(MultipleDocumentInterface.SIDEBAR_HEADER_DVD) && id == null) { id = ""; } else { id = MultipleDocumentInterface.SIDEBAR_HEADER_PLUGINS; } } if (id.equals(getId())) { Debug.out("Setting Parent to same ID as child! " + id); return; } parentID = id; // ensure parent gets created if it isn't there already mdi.loadEntryByID(parentID, false); } public MdiEntryVitalityImage[] getVitalityImages() { return null; } public boolean isCloseable() { return closeable; } public boolean isCollapseDisabled() { return collapseDisabled; } public void setCollapseDisabled(boolean collapseDisabled) { this.collapseDisabled = collapseDisabled; setExpanded(true); } public void addListener(MdiCloseListener l) { synchronized (this) { if (listCloseListeners == null) { listCloseListeners = new ArrayList<MdiCloseListener>(1); } listCloseListeners.add(l); } } public void removeListener(MdiCloseListener l) { synchronized (this) { if (listCloseListeners != null) { listCloseListeners.remove(l); } } } public void triggerCloseListeners(boolean user) { Object[] list = {}; synchronized (this) { if (listCloseListeners != null) { list = listCloseListeners.toArray(); } } for (int i = 0; i < list.length; i++) { MdiCloseListener l = (MdiCloseListener) list[i]; try { l.mdiEntryClosed(this, user); } catch (Exception e) { Debug.out(e); } } MdiEntry parentEntry = mdi.getEntry(parentID); if (parentEntry instanceof BaseMdiEntry) { ((BaseMdiEntry) parentEntry).triggerChildCloseListeners(this, user); } } public void addListener(MdiChildCloseListener l) { synchronized (this) { if (listChildCloseListeners == null) { listChildCloseListeners = new ArrayList<MdiChildCloseListener>(1); } listChildCloseListeners.add(l); } } public void removeListener(MdiChildCloseListener l) { synchronized (this) { if (listChildCloseListeners != null) { listChildCloseListeners.remove(l); } } } public void triggerChildCloseListeners(MdiEntry child, boolean user) { Object[] list; synchronized (this) { if (listChildCloseListeners == null) { return; } list = listChildCloseListeners.toArray(); } for (int i = 0; i < list.length; i++) { MdiChildCloseListener l = (MdiChildCloseListener) list[i]; try { l.mdiChildEntryClosed(this, child, user); } catch (Exception e) { Debug.out(e); } } } public void addListener(MdiEntryLogIdListener l) { synchronized (this) { if (listLogIDListeners == null) { listLogIDListeners = new ArrayList<MdiEntryLogIdListener>(1); } listLogIDListeners.add(l); } } public void removeListener(MdiEntryLogIdListener sideBarLogIdListener) { synchronized (this) { if (listLogIDListeners != null) { listLogIDListeners.remove(sideBarLogIdListener); } } } protected void triggerLogIDListeners(String oldID) { Object[] list; synchronized (this) { if (listLogIDListeners == null) { return; } list = listLogIDListeners.toArray(); } for (int i = 0; i < list.length; i++) { MdiEntryLogIdListener l = (MdiEntryLogIdListener) list[i]; l.mdiEntryLogIdChanged(this, oldID, logID); } } public void addListener(MdiEntryOpenListener l) { synchronized (this) { if (listOpenListeners == null) { listOpenListeners = new ArrayList<MdiEntryOpenListener>(1); } listOpenListeners.add(l); } if (view != null) { l.mdiEntryOpen(this); } } public void removeListener(MdiEntryOpenListener l) { synchronized (this) { if (listOpenListeners != null) { listOpenListeners.remove(l); } } } public void triggerOpenListeners() { Object[] list; synchronized (this) { if (listOpenListeners == null) { return; } list = listOpenListeners.toArray(); } for (int i = 0; i < list.length; i++) { MdiEntryOpenListener l = (MdiEntryOpenListener) list[i]; try { l.mdiEntryOpen(this); } catch (Exception e) { Debug.out(e); } } } public void addListener(MdiEntryDatasourceListener l) { synchronized (this) { if (listDatasourceListeners == null) { listDatasourceListeners = new ArrayList<MdiEntryDatasourceListener>(1); } listDatasourceListeners.add(l); } l.mdiEntryDatasourceChanged(this); } public void removeListener(MdiEntryDatasourceListener l) { synchronized (this) { if (listDatasourceListeners != null) { listDatasourceListeners.remove(l); } } } public void triggerDatasourceListeners() { Object[] list; synchronized (this) { if (listDatasourceListeners == null) { return; } list = listDatasourceListeners.toArray(); } for (int i = 0; i < list.length; i++) { MdiEntryDatasourceListener l = (MdiEntryDatasourceListener) list[i]; try { l.mdiEntryDatasourceChanged(this); } catch (Exception e) { Debug.out(e); } } } public void addListener(MdiEntryDropListener l) { synchronized (this) { if (listDropListeners == null) { listDropListeners = new ArrayList<MdiEntryDropListener>(1); } listDropListeners.add(l); } } public void removeListener(MdiEntryDropListener l) { synchronized (this) { if (listDropListeners != null) { listDropListeners.remove(l); } } } public boolean hasDropListeners() { synchronized (this) { return listDropListeners != null && listDropListeners.size() > 0; } } /** * * @param o * @return true: handled; false: not handled */ public boolean triggerDropListeners(Object o) { boolean handled = false; Object[] list; synchronized (this) { if (listDropListeners == null) { return handled; } list = listDropListeners.toArray(); } for (int i = 0; i < list.length; i++) { MdiEntryDropListener l = (MdiEntryDropListener) list[i]; handled = l.mdiEntryDrop(this, o); if (handled) { break; } } return handled; } public void setLogID(String logID) { if (logID == null || logID.equals("" + this.logID)) { return; } String oldID = this.logID; this.logID = logID; triggerLogIDListeners(oldID); } /* (non-Javadoc) * @see com.aelitis.azureus.ui.mdi.MdiEntry#getViewTitleInfo() */ public ViewTitleInfo getViewTitleInfo() { return viewTitleInfo; } /* (non-Javadoc) * @see com.aelitis.azureus.ui.mdi.MdiEntry#setViewTitleInfo(com.aelitis.azureus.ui.common.viewtitleinfo.ViewTitleInfo) */ public void setViewTitleInfo(ViewTitleInfo viewTitleInfo) { if (this.viewTitleInfo == viewTitleInfo) { return; } this.viewTitleInfo = viewTitleInfo; // TODO: Need to listen for viewTitleInfo triggers so we can refresh items below if (viewTitleInfo != null) { if (viewTitleInfo instanceof ViewTitleInfo2) { ViewTitleInfo2 vti2 = (ViewTitleInfo2) viewTitleInfo; try { vti2.titleInfoLinked(mdi, this); } catch (Exception e) { Debug.out(e); } } String newTitle = (String) viewTitleInfo.getTitleInfoProperty(ViewTitleInfo.TITLE_TEXT); if (newTitle != null) { setPullTitleFromView(false); setTitle(newTitle); } String imageID = (String) viewTitleInfo.getTitleInfoProperty(ViewTitleInfo.TITLE_IMAGEID); if (imageID != null) { setImageLeftID(imageID.length() == 0 ? null : imageID); } ViewTitleInfoManager.addListener(this); } } /** * @deprecated For azburn */ // @see com.aelitis.azureus.ui.mdi.MdiEntry#addToolbarEnabler(com.aelitis.azureus.ui.common.ToolBarEnabler) public void addToolbarEnabler(ToolBarEnabler enabler) { addToolbarEnabler((UIToolBarEnablerBase) enabler); } public void addToolbarEnabler(UIToolBarEnablerBase enabler) { setToolBarEnablers.add(enabler); setToolbarVisibility(setToolBarEnablers.size() > 0); } protected void setToolbarVisibility(boolean visible) { } public void removeToolbarEnabler(UIToolBarEnablerBase enabler) { setToolBarEnablers.remove(enabler); setToolbarVisibility(setToolBarEnablers.size() > 0); } public UIToolBarEnablerBase[] getToolbarEnablers() { if (view != null) { UIPluginViewToolBarListener listener = view.getToolBarListener(); if (listener != null) { return new UIToolBarEnablerBase[] { listener }; } } return setToolBarEnablers.toArray(new UIToolBarEnablerBase[0]); } public void setCoreView(UISWTViewCore view) { if (this.view != null && view == null) { this.view.triggerEvent(UISWTViewEvent.TYPE_DESTROY, null); } this.view = view; if (view == null) { return; } UISWTViewEventListener eventListener = view.getEventListener(); if (view instanceof ViewTitleInfo) { setViewTitleInfo((ViewTitleInfo) view); } else if (eventListener instanceof ViewTitleInfo) { setViewTitleInfo((ViewTitleInfo) eventListener); } if (view instanceof UIToolBarEnablerBase) { addToolbarEnabler((UIToolBarEnablerBase) view); } else if (eventListener instanceof UIToolBarEnablerBase) { addToolbarEnabler((UIToolBarEnablerBase) eventListener); } if (datasource != null) { view.triggerEvent(UISWTViewEvent.TYPE_DATASOURCE_CHANGED, datasource); } } public SWTSkinObject getSkinObject() { return skinObject; } public void setSkinObject(SWTSkinObject skinObject, SWTSkinObject soMaster) { this.skinObject = skinObject; this.soMaster = soMaster; if (datasource != null) { if (skinObject != null) { skinObject.triggerListeners( SWTSkinObjectListener.EVENT_DATASOURCE_CHANGED, datasource); } if (view != null) { view.triggerEvent(UISWTViewEvent.TYPE_DATASOURCE_CHANGED, datasource); } } if (skinObject != null) { setToolbarVisibility(setToolBarEnablers.size() > 0); } } public SWTSkinObject getSkinObjectMaster() { if (soMaster == null) { return skinObject; } return soMaster; } public void setSkinRef(String configID, Object params) { skinRef = configID; if (params != null) { setDatasource(params); } } public String getSkinRef() { return skinRef; } public String getTitle() { if (title != null && !isPullTitleFromView()) { return title; } if (view != null) { return view.getFullTitle(); } return title; } public void setTitle(String title) { if (title == null) { return; } if (title.startsWith("{") && title.endsWith("}") && title.length() > 2) { setTitleID(title.substring(1, title.length() - 1)); return; } if (title.equals(this.title)) { return; } this.title = title; this.titleID = null; redraw(); } public void setTitleID(String titleID) { String title = MessageText.getString(titleID); setTitle(title.startsWith("{") ? title.substring(1) : title); this.titleID = titleID; } public void updateLanguage() { if (view != null) { view.triggerEvent(UISWTViewEvent.TYPE_LANGUAGEUPDATE, null); } if (titleID != null) { setTitleID(titleID); } else { if (viewTitleInfo != null) { viewTitleInfoRefresh(viewTitleInfo); } updateUI(); } } public void show() { if (skinObject == null) { return; } SelectedContentManager.clearCurrentlySelectedContent(); UIFunctionsSWT uif = UIFunctionsManagerSWT.getUIFunctionsSWT(); if (uif != null) { //uif.refreshIconBar(); // needed? uif.refreshTorrentMenu(); } SWTSkinObject skinObject = getSkinObjectMaster(); skinObject.setVisible(true); if (skinObject instanceof SWTSkinObjectContainer) { SWTSkinObjectContainer container = (SWTSkinObjectContainer) skinObject; Composite composite = container.getComposite(); if (composite != null && !composite.isDisposed()) { composite.setVisible(true); composite.moveAbove(null); //composite.setFocus(); //container.getParent().relayout(); composite.getParent().layout(); } // This causes double show because createSkinObject already calls show //container.triggerListeners(SWTSkinObjectListener.EVENT_SHOW); } if (view != null) { Composite c = view.getComposite(); if (c != null && !c.isDisposed()) { c.setData("BaseMDIEntry", this); c.setVisible(true); c.getParent().layout(); } try { view.triggerEvent(UISWTViewEvent.TYPE_FOCUSGAINED, null); } catch (Exception e) { Debug.out(e); } } } public void hide() { Utils.execSWTThread(new AERunnable() { public void runSupport() { swt_hide(); } }); } public void requestAttention() { } protected void swt_hide() { SWTSkinObject skinObjectMaster = getSkinObjectMaster(); if (skinObjectMaster instanceof SWTSkinObjectContainer) { SWTSkinObjectContainer container = (SWTSkinObjectContainer) skinObjectMaster; Control oldComposite = container.getControl(); container.setVisible(false); if (oldComposite != null && !oldComposite.isDisposed()) { oldComposite.getShell().update(); } } if (view != null) { Composite oldComposite = view.getComposite(); if (oldComposite != null && !oldComposite.isDisposed()) { oldComposite.setVisible(false); oldComposite.getShell().update(); } try { view.triggerEvent(UISWTViewEvent.TYPE_FOCUSLOST, null); } catch (Exception e) { Debug.out(e); } } } public UISWTViewEventListener getEventListener() { return eventListener; } public void setEventListener(UISWTViewEventListener _eventListener) { this.eventListener = _eventListener; if (view != null) { return; } try { setCoreView(new UISWTViewImpl(parentID, id, _eventListener, datasource)); } catch (Exception e) { Debug.out(e); } if (_eventListener instanceof UISWTViewEventListenerHolder) { UISWTViewEventListenerHolder h = (UISWTViewEventListenerHolder) _eventListener; UISWTViewEventListener delegatedEventListener = h.getDelegatedEventListener(view); if (delegatedEventListener != null) { this.eventListener = delegatedEventListener; } } if (eventListener instanceof UIToolBarEnablerBase) { addToolbarEnabler((UIToolBarEnablerBase) eventListener); } if ((eventListener instanceof ViewTitleInfo) && viewTitleInfo == null) { setViewTitleInfo((ViewTitleInfo) eventListener); } if (eventListener instanceof BasicPluginViewImpl) { if ("image.sidebar.plugin".equals(getImageLeftID())) { setImageLeftID("image.sidebar.logview"); } } } public boolean isPullTitleFromView() { return pullTitleFromView; } public void setPullTitleFromView(boolean pullTitleFromView) { this.pullTitleFromView = pullTitleFromView; } public void updateUI() { if (view == null) { return; } Utils.execSWTThread(new AERunnable() { public void runSupport() { if (view != null && !isDisposed()) { view.triggerEvent(UISWTViewEvent.TYPE_REFRESH, null); } if (isPullTitleFromView() && isAdded()) { setTitle(view.getFullTitle()); } } }); } public boolean isDisposed() { return disposed; } public Map<String, Object> getAutoOpenInfo() { Map<String, Object> autoOpenInfo = new LightHashMap<String, Object>(); if (getParentID() != null) { autoOpenInfo.put("parentID", getParentID()); } UISWTViewEventListener eventListener = getEventListener(); if (eventListener != null) { autoOpenInfo.put("eventListenerClass", eventListener.getClass().getName()); } autoOpenInfo.put("title", getTitle()); Object datasource = getDatasourceCore(); if (datasource instanceof DownloadManager) { try { autoOpenInfo.put( "dm", ((DownloadManager) datasource).getTorrent().getHashWrapper().toBase32String()); } catch (Throwable t) { } } else if (datasource instanceof DownloadManager[]) { DownloadManager[] dms = (DownloadManager[]) datasource; List<String> list = new ArrayList<String>(); for (DownloadManager dm : dms) { try { list.add(dm.getTorrent().getHashWrapper().toBase32String()); } catch (Throwable e) { } } autoOpenInfo.put("dms", list); } String eds = getExportableDatasource(); if (eds != null) { autoOpenInfo.put("datasource", eds.toString()); } return autoOpenInfo; } public void setCloseable(boolean closeable) { this.closeable = closeable; if (closeable) { mdi.informAutoOpenSet(this, getAutoOpenInfo()); COConfigurationManager.setParameter("SideBar.AutoOpen." + id, true); } else { COConfigurationManager.removeParameter("SideBar.AutoOpen." + id); } } // @see com.aelitis.azureus.ui.mdi.MdiEntry#setDefaultExpanded(boolean) public void setDefaultExpanded(boolean defaultExpanded) { COConfigurationManager.setBooleanDefault("SideBar.Expanded." + id, defaultExpanded); } public boolean isExpanded() { return isExpanded == null ? COConfigurationManager.getBooleanParameter("SideBar.Expanded." + id) : isExpanded; } public void setExpanded(boolean expanded) { isExpanded = expanded; boolean defExpanded = true; try { defExpanded = ConfigurationDefaults.getInstance().getBooleanParameter( "SideBar.Expanded." + id); } catch (ConfigurationParameterNotFoundException e) { } if (isExpanded == defExpanded) { COConfigurationManager.removeParameter("SideBar.Expanded." + id); } else { COConfigurationManager.setParameter("SideBar.Expanded." + id, isExpanded); } } public boolean isAdded() { return added; } public void setDisposed(boolean b) { disposed = b; added = !b; } public void setImageLeftID(String id) { imageLeftID = id; imageLeft = null; redraw(); } public String getImageLeftID() { return imageLeftID; } /** * @param imageLeft the imageLeft to set */ public void setImageLeft(Image imageLeft) { this.imageLeft = imageLeft; imageLeftID = null; redraw(); } public Image getImageLeft(String suffix) { if (imageLeft != null) { return imageLeft; } if (imageLeftID == null) { return null; } Image img = null; if (suffix == null) { img = ImageLoader.getInstance().getImage(imageLeftID); } else { img = ImageLoader.getInstance().getImage(imageLeftID + suffix); } if (ImageLoader.isRealImage(img)) { // System.out.println("real" + getTitle() + "/" + img.getBounds() + Debug.getCompressedStackTrace()); return img; } return null; } public void releaseImageLeft(String suffix) { if (imageLeft != null) { ImageLoader.getInstance().releaseImage( imageLeftID + (suffix == null ? "" : suffix)); } } public void viewTitleInfoRefresh(ViewTitleInfo titleInfoToRefresh) { if (titleInfoToRefresh == null || this.viewTitleInfo != titleInfoToRefresh) { return; } if (isDisposed()) { return; } String newText = (String) viewTitleInfo.getTitleInfoProperty(ViewTitleInfo.TITLE_TEXT); if (newText != null) { setPullTitleFromView(false); setTitle(newText); } String imageID = (String) viewTitleInfo.getTitleInfoProperty(ViewTitleInfo.TITLE_IMAGEID); if (imageID != null) { setImageLeftID(imageID.length() == 0 ? null : imageID); } redraw(); String logID = (String) viewTitleInfo.getTitleInfoProperty(ViewTitleInfo.TITLE_LOGID); if (logID != null) { setLogID(logID); } } public void build() { } public void setPreferredAfterID(String preferredAfterID) { this.preferredAfterID = preferredAfterID; } public String getPreferredAfterID() { return preferredAfterID; } public void setUserData( Object key, Object data ) { synchronized( this ){ if ( user_data == null ){ user_data = new LightHashMap<Object,Object>(); } user_data.put( key, data ); } } public Object getUserData( Object key ) { synchronized( this ){ if ( user_data == null ){ return( null ); } return( user_data.get( key )); } } }