package com.aelitis.azureus.ui.swt.mdi;
import java.util.*;
import org.eclipse.swt.SWT;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.global.GlobalManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.plugins.ui.UIPluginView;
import org.gudy.azureus2.ui.swt.mainwindow.PluginsMenuHelper;
import org.gudy.azureus2.ui.swt.mainwindow.PluginsMenuHelper.IViewInfo;
import org.gudy.azureus2.ui.swt.mainwindow.PluginsMenuHelper.PluginAddedViewListener;
import org.gudy.azureus2.ui.swt.plugins.UISWTInstance;
import org.gudy.azureus2.ui.swt.plugins.UISWTViewEventListener;
import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTInstanceImpl;
import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTViewEventListenerHolder;
import org.gudy.azureus2.ui.swt.shells.MessageBoxShell;
import org.gudy.azureus2.ui.swt.views.IView;
import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.AzureusCoreRunningListener;
import com.aelitis.azureus.ui.common.updater.UIUpdatable;
import com.aelitis.azureus.ui.common.viewtitleinfo.ViewTitleInfo;
import com.aelitis.azureus.ui.mdi.*;
import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
import com.aelitis.azureus.ui.swt.skin.SWTSkinObject;
import com.aelitis.azureus.ui.swt.views.skin.SkinView;
import com.aelitis.azureus.ui.swt.views.skin.sidebar.SideBar;
import com.aelitis.azureus.util.ConstantsVuze;
import com.aelitis.azureus.util.ContentNetworkUtils;
import com.aelitis.azureus.util.MapUtils;
public abstract class BaseMDI
extends SkinView
implements MultipleDocumentInterfaceSWT, UIUpdatable
{
protected MdiEntrySWT currentEntry;
protected Map<String, MdiEntryCreationListener> mapIdToCreationListener = new LightHashMap<String, MdiEntryCreationListener>();
// Sync changes to entry maps on mapIdEntry
protected Map<String, MdiEntrySWT> mapIdToEntry = new LightHashMap<String, MdiEntrySWT>();
private List<MdiListener> listeners = new ArrayList<MdiListener>();
private List<MdiEntryLoadedListener> listLoadListeners = new ArrayList<MdiEntryLoadedListener>();
private static Map<String, Object> mapAutoOpen = new LightHashMap<String, Object>();
private String[] preferredOrder;
public void addListener(MdiListener l) {
synchronized (listeners) {
if (listeners.contains(l)) {
return;
}
listeners.add(l);
}
}
public void removeListener(MdiListener l) {
synchronized (listeners) {
listeners.remove(l);
}
}
public void addListener(MdiEntryLoadedListener l) {
synchronized (listLoadListeners) {
if (listLoadListeners.contains(l)) {
return;
}
listLoadListeners.add(l);
}
// might be a very rare thread issue here if entry gets loaded while
// we are walking through entries
MdiEntry[] entries = getEntries();
for (MdiEntry entry : entries) {
if (entry.isAdded()) {
l.mdiEntryLoaded(entry);
}
}
}
public void removeListener(MdiEntryLoadedListener l) {
synchronized (listLoadListeners) {
listLoadListeners.remove(l);
}
}
protected void triggerSelectionListener(MdiEntry newEntry, MdiEntry oldEntry) {
MdiListener[] array = listeners.toArray(new MdiListener[0]);
for (MdiListener l : array) {
try {
l.mdiEntrySelected(newEntry, oldEntry);
} catch (Exception e) {
Debug.out(e);
}
}
}
public void triggerEntryLoadedListeners(MdiEntry entry) {
MdiEntryLoadedListener[] array = listLoadListeners.toArray(new MdiEntryLoadedListener[0]);
for (MdiEntryLoadedListener l : array) {
try {
l.mdiEntryLoaded(entry);
} catch (Exception e) {
Debug.out(e);
}
}
}
public void closeEntry(final String id) {
MdiEntry entry = getEntry(id);
if (entry != null) {
entry.close(false);
}
}
public abstract MdiEntry createEntryFromEventListener(String parentID,
UISWTViewEventListener l, String id, boolean closeable, Object datasource);
public abstract MdiEntry createEntryFromIView(String parentID, IView iview,
String id, Object datasource, boolean closeable, boolean show,
boolean expand);
public abstract MdiEntry createEntryFromIViewClass(String parent, String id,
String title, Class<?> iviewClass, Class<?>[] iviewClassArgs,
Object[] iviewClassVals, Object datasource, ViewTitleInfo titleInfo,
boolean closeable);
/**
* @deprecated
*/
public abstract MdiEntry createEntryFromSkinRef(String parentID, String id,
String configID, String title, ViewTitleInfo titleInfo, Object params,
boolean closeable, int index);
public abstract MdiEntry createEntryFromSkinRef(String parentID, String id,
String configID, String title, ViewTitleInfo titleInfo, Object params,
boolean closeable, String preferedAfterID);
public MdiEntry getCurrentEntry() {
return currentEntry;
}
public MdiEntrySWT getCurrentEntrySWT() {
return currentEntry;
}
public MdiEntry[] getEntries() {
return mapIdToEntry.values().toArray(new MdiEntry[0]);
}
public MdiEntrySWT[] getEntriesSWT() {
return mapIdToEntry.values().toArray(new MdiEntrySWT[0]);
}
public MdiEntry getEntry(String id) {
if ("Browse".equalsIgnoreCase(id)) {
id = ContentNetworkUtils.getTarget(ConstantsVuze.getDefaultContentNetwork());
}
MdiEntry entry = mapIdToEntry.get(id);
return entry;
}
public MdiEntrySWT getEntrySWT(String id) {
if ("Browse".equalsIgnoreCase(id)) {
id = ContentNetworkUtils.getTarget(ConstantsVuze.getDefaultContentNetwork());
}
MdiEntrySWT entry = mapIdToEntry.get(id);
return entry;
}
/**
* @param skinView
* @return
*
* @since 3.1.1.1
*/
public MdiEntry getEntryBySkinView(Object skinView) {
SWTSkinObject so = ((SkinView)skinView).getMainSkinObject();
Object[] sideBarEntries = mapIdToEntry.values().toArray();
for (int i = 0; i < sideBarEntries.length; i++) {
//MdiEntrySWT entry = (MdiEntrySWT) sideBarEntries[i];
BaseMdiEntry entry = (BaseMdiEntry) sideBarEntries[i];
SWTSkinObject entrySO = entry.getSkinObject();
SWTSkinObject entrySOParent = entrySO == null ? entrySO
: entrySO.getParent();
if (entrySO == so || entrySO == so.getParent() || entrySOParent == so) {
return entry;
}
}
return null;
}
public IView getIViewFromID(String id) {
if (id == null) {
return null;
}
MdiEntrySWT entry = getEntrySWT(id);
if (entry == null) {
return null;
}
return entry.getIView();
}
public String getUpdateUIName() {
if (currentEntry == null || currentEntry.getIView() == null) {
return "MDI";
}
if (currentEntry.getIView() instanceof UIPluginView) {
UIPluginView uiPluginView = (UIPluginView) currentEntry.getIView();
return uiPluginView.getViewID();
}
return currentEntry.getIView().getFullTitle();
}
public void registerEntry(String id, MdiEntryCreationListener l) {
mapIdToCreationListener.put(id, l);
Object o = mapAutoOpen.get(id);
if (o instanceof Map<?, ?>) {
MdiEntryCreationListener mdiEntryCreationListener = mapIdToCreationListener.get(id);
if (mdiEntryCreationListener != null) {
try {
mdiEntryCreationListener.createMDiEntry(id);
} catch (Exception e) {
Debug.out(e);
}
}
}
}
public abstract boolean showEntryByID(String id);
@Override
public Object skinObjectInitialShow(SWTSkinObject skinObject, Object params) {
return null;
}
public void updateUI() {
MdiEntry currentEntry = getCurrentEntry();
if (currentEntry != null) {
currentEntry.updateUI();
}
}
public boolean entryExists(String id) {
if ("Browse".equalsIgnoreCase(id)) {
id = ContentNetworkUtils.getTarget(ConstantsVuze.getDefaultContentNetwork());
}
MdiEntry entry = mapIdToEntry.get(id);
if (entry == null) {
return false;
}
return entry.isAdded();
}
protected MdiEntry createWelcomeSection() {
MdiEntry entry = createEntryFromSkinRef(
SIDEBAR_HEADER_VUZE,
SIDEBAR_SECTION_WELCOME,
"main.area.welcome",
MessageText.getString("v3.MainWindow.menu.getting_started").replaceAll(
"&", ""), null, null, true, 0);
entry.setImageLeftID("image.sidebar.welcome");
addDropTest(entry);
return entry;
}
protected void addDropTest(MdiEntry entry) {
if (!Constants.isCVSVersion()) {
return;
}
entry.addListener(new MdiEntryDropListener() {
public boolean mdiEntryDrop(MdiEntry entry, Object droppedObject) {
String s = "You just dropped " + droppedObject.getClass() + "\n"
+ droppedObject + "\n\n";
if (droppedObject.getClass().isArray()) {
Object[] o = (Object[]) droppedObject;
for (int i = 0; i < o.length; i++) {
s += "" + i + ": ";
Object object = o[i];
if (object == null) {
s += "null";
} else {
s += object.getClass() + ";" + object;
}
s += "\n";
}
}
new MessageBoxShell(SWT.OK, "test", s).open(null);
return true;
}
});
}
public void setEntryAutoOpen(String id, boolean autoOpen) {
if (!autoOpen) {
mapAutoOpen.remove(id);
} else {
mapAutoOpen.put(id, new LightHashMap(0));
}
}
protected void setupPluginViews() {
UISWTInstanceImpl uiSWTInstance = (UISWTInstanceImpl) UIFunctionsManagerSWT.getUIFunctionsSWT().getUISWTInstance();
if (uiSWTInstance != null) {
Map<String, Map<String, UISWTViewEventListenerHolder>> allViews = uiSWTInstance.getAllViews();
Object[] parentIDs = allViews.keySet().toArray();
for (int i = 0; i < parentIDs.length; i++) {
String parentID = (String) parentIDs[i];
String sidebarParentID = null;
if (UISWTInstance.VIEW_MYTORRENTS.equals(parentID)) {
sidebarParentID = SideBar.SIDEBAR_HEADER_TRANSFERS;
} else if (UISWTInstance.VIEW_MAIN.equals(parentID)) {
sidebarParentID = MultipleDocumentInterface.SIDEBAR_HEADER_PLUGINS;
}
Map<String, UISWTViewEventListenerHolder> mapSubViews = allViews.get(parentID);
if (mapSubViews != null) {
Object[] viewIDs = mapSubViews.keySet().toArray();
for (int j = 0; j < viewIDs.length; j++) {
String viewID = (String) viewIDs[j];
UISWTViewEventListener l = (UISWTViewEventListener) mapSubViews.get(viewID);
if (l != null) {
// TODO: Datasource
// TODO: Multiple open
boolean open = COConfigurationManager.getBooleanParameter(
"SideBar.AutoOpen." + viewID, false);
if (open) {
createEntryFromEventListener(sidebarParentID, l, viewID, true, null);
}
}
}
}
}
}
// When a new Plugin View is added, check out auto-open list to see if
// the user had it open
PluginsMenuHelper.getInstance().addPluginAddedViewListener(
new PluginAddedViewListener() {
// @see org.gudy.azureus2.ui.swt.mainwindow.PluginsMenuHelper.PluginAddedViewListener#pluginViewAdded(org.gudy.azureus2.ui.swt.mainwindow.PluginsMenuHelper.IViewInfo)
public void pluginViewAdded(IViewInfo viewInfo) {
//System.out.println("PluginView Added: " + viewInfo.viewID);
Object o = mapAutoOpen.get(viewInfo.viewID);
if (o instanceof Map<?, ?>) {
processAutoOpenMap(viewInfo.viewID, (Map<?, ?>) o, viewInfo);
}
}
});
}
public void informAutoOpenSet(MdiEntry entry, Map<String, Object> autoOpenInfo) {
mapAutoOpen.put(entry.getId(), autoOpenInfo);
}
public void loadCloseables() {
Map<?,?> loadedMap = FileUtil.readResilientConfigFile("sidebarauto.config", true);
if (loadedMap.isEmpty()) {
return;
}
BDecoder.decodeStrings(loadedMap);
for (Iterator<?> iter = loadedMap.keySet().iterator(); iter.hasNext();) {
String id = (String) iter.next();
Object o = loadedMap.get(id);
if (o instanceof Map<?, ?>) {
if (!processAutoOpenMap(id, (Map<?, ?>) o, null)) {
mapAutoOpen.put(id, o);
}
}
}
}
@SuppressWarnings("unchecked")
public void saveCloseables() {
// update title
for (Iterator<?> iter = mapAutoOpen.keySet().iterator(); iter.hasNext();) {
String id = (String) iter.next();
Object o = mapAutoOpen.get(id);
MdiEntry entry = getEntry(id);
if (entry != null && entry.isAdded() && (o instanceof Map)) {
Map autoOpenInfo = (Map) o;
String s = entry.getTitle();
if (s != null) {
autoOpenInfo.put("title", s);
}
}
}
FileUtil.writeResilientConfigFile("sidebarauto.config", mapAutoOpen);
}
private boolean processAutoOpenMap(String id, Map<?, ?> autoOpenInfo,
IViewInfo viewInfo) {
//System.out.println("processAutoOpenMap " + id + " via " + Debug.getCompressedStackTrace());
try {
MdiEntry entry = getEntry(id);
if (entry != null) {
return true;
}
if (id.equals(SIDEBAR_SECTION_WELCOME)) {
createWelcomeSection();
}
MdiEntryCreationListener mdiEntryCreationListener = mapIdToCreationListener.get(id);
if (mdiEntryCreationListener != null) {
try {
mdiEntryCreationListener.createMDiEntry(id);
return true;
} catch (Exception e) {
Debug.out(e);
}
}
String title = MapUtils.getMapString(autoOpenInfo, "title", id);
String parentID = MapUtils.getMapString(autoOpenInfo, "parentID", SIDEBAR_HEADER_PLUGINS);
Object datasource = autoOpenInfo.get("datasource");
if (viewInfo != null) {
if (viewInfo.view != null) {
entry = createEntryFromIView(parentID, viewInfo.view, id, datasource,
true, false, true);
return true;
} else if (viewInfo.event_listener != null) {
entry = createEntryFromEventListener(parentID,
viewInfo.event_listener, id, true, datasource);
return true;
}
}
Class<?> cla = Class.forName(MapUtils.getMapString(autoOpenInfo,
"iviewClass", ""));
if (cla != null) {
entry = createEntryFromIViewClass(parentID, id, title, cla, null, null,
datasource, null, true);
if (datasource == null) {
final MdiEntry fEntry = entry;
final String dmHash = MapUtils.getMapString(autoOpenInfo, "dm", null);
if (dmHash != null) {
AzureusCoreFactory.addCoreRunningListener(new AzureusCoreRunningListener() {
public void azureusCoreRunning(AzureusCore core) {
GlobalManager gm = core.getGlobalManager();
HashWrapper hw = new HashWrapper(Base32.decode(dmHash));
DownloadManager dm = gm.getDownloadManager(hw);
if (dm != null) {
fEntry.setDatasource(dm);
}
}
});
} else {
final List listHashes = MapUtils.getMapList(autoOpenInfo, "dms",
null);
if (listHashes != null) {
AzureusCoreFactory.addCoreRunningListener(new AzureusCoreRunningListener() {
public void azureusCoreRunning(AzureusCore core) {
List<DownloadManager> listDMS = new ArrayList<DownloadManager>(
1);
GlobalManager gm = core.getGlobalManager();
for (Object oDM : listHashes) {
if (oDM instanceof String) {
String hash = (String) oDM;
DownloadManager dm = gm.getDownloadManager(new HashWrapper(
Base32.decode(hash)));
if (dm != null) {
listDMS.add(dm);
}
}
fEntry.setDatasource(listDMS.toArray(new DownloadManager[0]));
}
}
});
}
}
}
return true;
}
} catch (ClassNotFoundException ce) {
// ignore
} catch (Throwable e) {
Debug.out(e);
}
return false;
}
public void removeItem(MdiEntry entry) {
String id = entry.getId();
synchronized (mapIdToEntry) {
mapIdToEntry.remove(id);
removeChildrenOf(id);
}
}
private void removeChildrenOf(String id) {
if (id == null) {
return;
}
synchronized (mapIdToEntry) {
MdiEntrySWT[] entriesSWT = getEntriesSWT();
for (MdiEntrySWT entry : entriesSWT) {
if (id.equals(entry.getParentID())) {
mapIdToEntry.remove(entry);
removeChildrenOf(entry.getId());
}
}
}
}
public List<MdiEntry> getChildrenOf(String id) {
if (id == null) {
return Collections.emptyList();
}
List<MdiEntry> list = new ArrayList<MdiEntry>(1);
synchronized (mapIdToEntry) {
MdiEntrySWT[] entriesSWT = getEntriesSWT();
for (MdiEntrySWT entry : entriesSWT) {
if (id.equals(entry.getParentID())) {
list.add(entry);
}
}
}
return list;
}
public Object updateLanguage(SWTSkinObject skinObject, Object params) {
MdiEntrySWT[] entries = getEntriesSWT();
for (MdiEntrySWT entry : entries) {
if (entry == null) {
continue;
}
IView view = entry.getIView();
if (view != null) {
try {
view.updateLanguage();
view.refresh();
}
catch (Exception e) {
Debug.printStackTrace(e);
}
}
}
return null;
}
public void setPreferredOrder(String[] preferredOrder) {
this.preferredOrder = preferredOrder;
}
public String[] getPreferredOrder() {
return preferredOrder == null ? new String[0] : preferredOrder;
}
}