package org.xmind.ui.internal.resourcemanager;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Map;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.osgi.framework.Bundle;
import org.xmind.ui.internal.MindMapMessages;
import org.xmind.ui.internal.e4models.IContextRunnable;
import org.xmind.ui.internal.e4models.IModelConstants;
import org.xmind.ui.internal.e4models.IModelPartContext;
import org.xmind.ui.internal.e4models.ModelPart;
import org.xmind.ui.tabfolder.MTabFolder;
import org.xmind.ui.tabfolder.MTabItem;
public class ResourceManagerDialogPart extends ModelPart
implements IModelPartContext {
private static final int TITLE_AREA_LABEL_MARGIN = 10;
private static final String RESOURCE_MANAGER_EXTENSION_ID = "org.xmind.ui.resourceManager"; //$NON-NLS-1$
private static final String DATA_ID = "org.xmind.ui.resourceManager.itemId"; //$NON-NLS-1$
private static final String ATTR_LABEL = "label"; //$NON-NLS-1$
private static final String ATTR_ICON_URI = "iconURI"; //$NON-NLS-1$
private static final String ATTR_CONTRIBUTION_URI = "contributionURI"; //$NON-NLS-1$
private static final String ATTR_ID = "id"; //$NON-NLS-1$
private static final String TITLE_IMAGE_PATH = "platform:/plugin/org.xmind.ui.mindmap/icons/title.png"; //$NON-NLS-1$
private MTabFolder tabFolder;
private ResourceManager resourceManagerForPart;
private ArrayList<IResourceManagerDialogPage> registedPages;
@Override
protected void createContent(Composite parent) {
final Composite composite = new Composite(parent, SWT.NONE);
GridLayoutFactory.fillDefaults().margins(0, 0).spacing(0, 0)
.applyTo(composite);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
composite.setBackground(parent.getBackground());
resourceManagerForPart = new LocalResourceManager(
JFaceResources.getResources(), parent);
createTitleComposite(composite);
createContentComposite(composite);
parent.layout(true, true);
}
private void createTitleComposite(Composite parent) {
Composite title = new Composite(parent, SWT.NONE);
GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false)
.margins(0, 0).spacing(0, 0).extendedMargins(0, 0, 0, 0)
.applyTo(title);
title.setBackground(
parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
GridDataFactory.fillDefaults().grab(true, false).applyTo(title);
((GridData) title.getLayoutData()).heightHint = 70;
Composite labelsComposite = new Composite(title, SWT.NONE);
GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(true)
.margins(0, 0).spacing(0, 0)
.extendedMargins(TITLE_AREA_LABEL_MARGIN, 0, 0, 0)
.applyTo(labelsComposite);
GridDataFactory.fillDefaults().grab(true, true)
.applyTo(labelsComposite);
Label text = new Label(labelsComposite, SWT.NONE);
GridDataFactory.fillDefaults().grab(true, true)
.align(SWT.FILL, SWT.BOTTOM).applyTo(text);
text.setFont(JFaceResources.getBannerFont());
text.setText(MindMapMessages.ResourceManagerPart_title);
Label message = new Label(labelsComposite, SWT.WRAP);
GridDataFactory.fillDefaults().grab(true, true)
.align(SWT.FILL, SWT.CENTER).applyTo(message);
message.setFont(JFaceResources.getDialogFont());
message.setText(MindMapMessages.ResourceManagerPart_message);
Composite imageComposite = new Composite(title, SWT.NONE);
imageComposite.setLayout(new GridLayout(1, true));
Label titleImageLabel = new Label(imageComposite, SWT.CENTER);
GridDataFactory.fillDefaults().grab(true, true)
.applyTo(titleImageLabel);
ImageDescriptor imageDescriptor = null;
try {
imageDescriptor = ImageDescriptor
.createFromURL(new URL(TITLE_IMAGE_PATH));
} catch (MalformedURLException e) {
e.printStackTrace();
}
if (imageDescriptor != null) {
Image img = resourceManagerForPart.createImage(imageDescriptor);
titleImageLabel.setImage(img);
} else {
titleImageLabel.setImage(JFaceResources
.getImage(TitleAreaDialog.DLG_IMG_TITLE_BANNER));
}
}
private void createContentComposite(Composite composite) {
Composite content = new Composite(composite, SWT.NONE);
GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false)
.margins(0, 0).spacing(0, 0).applyTo(content);
GridDataFactory.fillDefaults().grab(true, true).applyTo(content);
tabFolder = new MTabFolder(content, SWT.BORDER);
tabFolder.setStyleProvider(
new ResourceManagerStyleProvider(resourceManagerForPart));
tabFolder.setBackground(
composite.getDisplay().getSystemColor(SWT.COLOR_TRANSPARENT));
tabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
tabFolder.addListener(SWT.Selection, new Listener() {
public void handleEvent(org.eclipse.swt.widgets.Event event) {
showPage((MTabItem) event.item);
}
});
final Map<String, String> persistedState = getAdapter(MPart.class)
.getPersistedState();
tabFolder.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
MTabItem item = tabFolder.getSelection();
String pageId = (String) item.getData(DATA_ID);
if (pageId != null) {
persistedState.put(
IModelConstants.KEY_MODEL_PART_CURRENT_PAGE_ID,
pageId);
}
}
});
String persistedSelectedPageId = persistedState
.get(IModelConstants.KEY_MODEL_PART_CURRENT_PAGE_ID);
MTabItem selectedItem = null;
for (final IResourceManagerDialogPage page : registedPages) {
MTabItem item = new MTabItem(tabFolder, SWT.RADIO);
item.setText(page.getTitle());
item.setImage(page.getImage());
item.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
Control pageControl = page.getControl();
if (pageControl != null) {
pageControl.dispose();
}
page.dispose();
}
});
item.setData(page);
item.setData(DATA_ID, page.getId());
if (page.getId().equals(persistedSelectedPageId)) {
selectedItem = item;
}
}
if (selectedItem == null && tabFolder.getItemCount() > 0) {
selectedItem = tabFolder.getItem(0);
}
tabFolder.setSelection(selectedItem);
showPage(selectedItem);
}
@Override
protected void init() {
super.init();
registedPages = new ArrayList<IResourceManagerDialogPage>();
IExtensionPoint extPoint = Platform.getExtensionRegistry()
.getExtensionPoint(RESOURCE_MANAGER_EXTENSION_ID);
IConfigurationElement[] elements = extPoint.getConfigurationElements();
for (IConfigurationElement ele : elements) {
try {
IResourceManagerDialogPage page = readPage(ele);
if (page != null) {
registedPages.add(page);
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
getAdapter(MPart.class).getContext().set(
IModelConstants.KEY_MODEL_PART_REFRESH_PAGE,
new IContextRunnable() {
@Override
public void run() {
if (tabFolder != null && !tabFolder.isDisposed()) {
Object page = tabFolder.getSelection().getData();
if (page instanceof IResourceManagerDialogPage) {
((IResourceManagerDialogPage) page).refresh();
}
}
}
});
}
private IResourceManagerDialogPage readPage(IConfigurationElement element)
throws InstantiationException, IllegalAccessException,
MalformedURLException {
String id = element.getAttribute(ATTR_ID);
if (id == null || "".equals(id)) //$NON-NLS-1$
throw new IllegalArgumentException("No id for page."); //$NON-NLS-1$
String contributionURI = element.getAttribute(ATTR_CONTRIBUTION_URI);
if (contributionURI == null
|| !contributionURI.startsWith("bundleclass://")) //$NON-NLS-1$
throw new IllegalArgumentException(
"Invalid contributionURI: " + contributionURI); //$NON-NLS-1$
String[] contributionPaths = contributionURI.substring(14).split("/"); //$NON-NLS-1$
if (contributionPaths.length != 2)
throw new IllegalArgumentException(
"Invalid contributionURI: " + contributionURI); //$NON-NLS-1$
String bundleId = contributionPaths[0];
String className = contributionPaths[1];
Class<?> cls;
try {
Bundle bundle = Platform.getBundle(bundleId);
if (bundle == null)
throw new ClassNotFoundException();
cls = bundle.loadClass(className);
} catch (ClassNotFoundException e) {
// ignore errors caused contribution not found
return null;
}
Object contribution = ContextInjectionFactory.make(cls,
getAdapter(MPart.class).getContext());
if (!(contribution instanceof IResourceManagerDialogPage))
return null;
final IResourceManagerDialogPage page = (IResourceManagerDialogPage) contribution;
page.setId(id);
String label = element.getAttribute(ATTR_LABEL);
page.setTitle(label);
ImageDescriptor icon = readIcon(element);
page.setImageDescriptor(icon);
return page;
}
private ImageDescriptor readIcon(IConfigurationElement element)
throws MalformedURLException {
String iconURI = element.getAttribute(ATTR_ICON_URI);
ImageDescriptor icon = (iconURI == null || "".equals(iconURI)) //$NON-NLS-1$
? null : ImageDescriptor.createFromURL(new URL(iconURI));
return icon;
}
@Override
protected void handleBringToTop() {
super.handleBringToTop();
if (tabFolder != null && !tabFolder.isDisposed()) {
String pageId = getAdapter(MPart.class).getPersistedState()
.get(IModelConstants.KEY_MODEL_PART_CURRENT_PAGE_ID);
MTabItem itemToShow = null;
MTabItem[] items = tabFolder.getItems();
for (MTabItem item : items) {
if (item.getData(DATA_ID).equals(pageId)) {
itemToShow = item;
break;
}
}
if (itemToShow == null && tabFolder.getItemCount() > 0) {
itemToShow = tabFolder.getItem(0);
}
tabFolder.setSelection(itemToShow);
showPage(itemToShow);
}
}
private void showPage(MTabItem item) {
Object resourcePage = item.getData();
if (resourcePage instanceof IResourceManagerDialogPage) {
IResourceManagerDialogPage page = (IResourceManagerDialogPage) resourcePage;
Control control = page.getControl();
if (control == null || control.isDisposed()) {
page.createControl(this.tabFolder.getBody());
item.setControl(page.getControl());
}
setSelectionProvider(page.getAdapter(ISelectionProvider.class));
MPart part = getAdapter(MPart.class);
part.getPersistedState().put(
IModelConstants.KEY_MODEL_PART_CURRENT_PAGE_ID,
page.getId());
part.getContext().set(
IModelConstants.KEY_MODEL_PART_CURRENT_PAGE_ID,
page.getId());
}
}
}