package org.xmind.ui.preference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.FontDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
import org.xmind.ui.resources.FontUtils;
public class MultiSectionPreferencePage extends PreferencePage
implements IWorkbenchPreferencePage, IExecutableExtension {
private String pageId = null;
private List<IPreferenceSection> pageSections = new ArrayList<IPreferenceSection>();
private List<IConfigurationElement> elments = new ArrayList<IConfigurationElement>();
@Override
protected Control createContents(Composite parent) {
if (pageId != null) {
for (IExtension extension : Platform.getExtensionRegistry()
.getExtensionPoint(
"org.xmind.ui.toolkit.preferencePageSections") //$NON-NLS-1$
.getExtensions()) {
for (IConfigurationElement element : extension
.getConfigurationElements()) {
String sectionPageId = element.getAttribute("pageId"); //$NON-NLS-1$
if (pageId.equals(sectionPageId)) {
elments.add(element);
// createSectionControl(container, element);
}
}
}
} else {
///TODO no page id available
}
return createSectionControlAsIndex(parent);
}
private class IndexComparator implements Comparator {
public int compare(Object o1, Object o2) {
IConfigurationElement element1 = (IConfigurationElement) o1;
IConfigurationElement element2 = (IConfigurationElement) o2;
String indexString1 = element1.getAttribute("index"); //$NON-NLS-1$
String indexString2 = element2.getAttribute("index"); //$NON-NLS-1$
int index1 = Integer.MAX_VALUE;
int index2 = Integer.MAX_VALUE;
if (null != indexString1 && !("".equals(indexString1))) //$NON-NLS-1$
index1 = Integer.parseInt(indexString1);
if (null != indexString2 && !("".equals(indexString2))) //$NON-NLS-1$
index2 = Integer.parseInt(indexString2);
return new Integer(index1).compareTo(new Integer(index2));
}
}
@SuppressWarnings("unchecked")
private Composite createSectionControlAsIndex(Composite parent) {
Collections.sort(elments, new IndexComparator());
Composite container = new Composite(parent, SWT.NONE);
GridLayoutFactory.fillDefaults().applyTo(container);
for (IConfigurationElement element : elments) {
createSectionControl(container, element);
}
return container;
}
private void createSectionControl(Composite parent,
IConfigurationElement element) {
String labelName = element
.getAttribute(IWorkbenchRegistryConstants.ATT_LABEL);
if (labelName != null && !("".equals(labelName))) { //$NON-NLS-1$
Label label = new Label(parent, SWT.NONE);
label.setText(labelName);
configLabelFont(label);
}
Composite sectionContent = new Composite(parent, SWT.NONE);
GridDataFactory.fillDefaults().grab(true, false)
.applyTo(sectionContent);
GridLayoutFactory.fillDefaults().extendedMargins(0, 0, 0, 15)
.applyTo(sectionContent);
Object prefPage;
try {
prefPage = element.createExecutableExtension(
IWorkbenchRegistryConstants.ATT_CLASS);
} catch (CoreException e) {
e.printStackTrace();
return;
}
if (!(prefPage instanceof IWorkbenchPreferencePage))
return;
if (!(prefPage instanceof IPreferenceSection))
return;
pageSections.add(((IPreferenceSection) prefPage));
((IWorkbenchPreferencePage) prefPage).init(PlatformUI.getWorkbench());
((IWorkbenchPreferencePage) prefPage).createControl(sectionContent);
}
private void configLabelFont(Label label) {
LocalResourceManager resource = new LocalResourceManager(
JFaceResources.getResources(), label);
FontData[] fontData = Display.getDefault().getSystemFont()
.getFontData();
label.setFont((Font) resource.get(
FontDescriptor.createFrom(FontUtils.bold(fontData, true))));
}
public void setInitializationData(IConfigurationElement config,
String propertyName, Object data) throws CoreException {
pageId = config.getAttribute(IWorkbenchRegistryConstants.ATT_ID);
}
public void init(IWorkbench workbench) {
}
@Override
public boolean performCancel() {
if (null != pageSections && pageSections.size() > 0)
for (IPreferenceSection pageSection : pageSections)
if (!pageSection.cancel())
return false;
return true;
}
@Override
protected void performApply() {
this.performOk();
if (null != pageSections && pageSections.size() > 0)
for (IPreferenceSection pageSection : pageSections)
pageSection.apply();
}
@Override
protected void performDefaults() {
super.performDefaults();
if (null != pageSections && pageSections.size() > 0)
for (IPreferenceSection pageSection : pageSections)
pageSection.excuteDefault();
}
@Override
public boolean performOk() {
if (null != pageSections && pageSections.size() > 0)
for (IPreferenceSection pageSection : pageSections)
if (!pageSection.ok())
return false;
return true;
}
}