/*******************************************************************************
* Copyright (c) 2008 Ralf Ebert
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Ralf Ebert - initial API and implementation
*******************************************************************************/
package com.swtxml.swt;
import java.util.Locale;
import org.eclipse.swt.widgets.Composite;
import com.swtxml.adapter.IAdaptable;
import com.swtxml.definition.INamespaceResolver;
import com.swtxml.events.internal.SwtEvents;
import com.swtxml.events.visitor.AddEventListeners;
import com.swtxml.extensions.DefaultNamespaceResolver;
import com.swtxml.extensions.ExtensionsNamespaceResolver;
import com.swtxml.i18n.ILabelTranslator;
import com.swtxml.i18n.ResourceBundleLabelTranslator;
import com.swtxml.resources.ClassResource;
import com.swtxml.resources.IDocumentResource;
import com.swtxml.swt.byid.ByIdInjector;
import com.swtxml.swt.visitor.BuildWidgets;
import com.swtxml.swt.visitor.CollectIds;
import com.swtxml.swt.visitor.SetAttributes;
import com.swtxml.swt.visitor.TagContextVisitor;
import com.swtxml.tinydom.ITagVisitor;
import com.swtxml.tinydom.Tag;
import com.swtxml.tinydom.TinyDomParser;
import com.swtxml.util.context.Context;
import com.swtxml.util.eclipse.EclipseEnvironment;
public class SwtXmlParser extends TinyDomParser implements IAdaptable {
private Composite rootComposite;
private Object view;
private SwtResourceManager resourceManager;
private ResourceBundleLabelTranslator labelTranslator;
public SwtXmlParser(Composite rootComposite, IDocumentResource resource, Object view) {
super(getSwtNamespaceResolver(), resource);
this.rootComposite = rootComposite;
this.view = view;
}
public SwtXmlParser(Composite rootComposite, Object view) {
this(rootComposite, ClassResource.coLocated(view.getClass(), "swtxml"), view);
}
private static INamespaceResolver getSwtNamespaceResolver() {
if (EclipseEnvironment.isAvailable()) {
return new ExtensionsNamespaceResolver();
} else {
return new DefaultNamespaceResolver();
}
}
@Override
@SuppressWarnings("unchecked")
public <A> A getAdapter(Class<A> adapterClass) {
Object result = super.getAdapter(adapterClass);
if (result != null) {
return (A) result;
}
if (SwtResourceManager.class.isAssignableFrom(adapterClass)) {
if (this.resourceManager == null) {
this.resourceManager = new SwtResourceManager(rootComposite);
}
return (A) this.resourceManager;
}
if (ILabelTranslator.class.isAssignableFrom(adapterClass)) {
if (this.labelTranslator == null) {
this.labelTranslator = new ResourceBundleLabelTranslator(document, Locale
.getDefault());
}
return (A) this.labelTranslator;
}
return null;
}
@Override
protected void onParseCompleted(final Tag root) {
final CollectIds ids = new CollectIds();
final ITagVisitor buildWidgets = new TagContextVisitor(new BuildWidgets(rootComposite));
final ITagVisitor setAttributes = new TagContextVisitor(new SetAttributes());
root.visitDepthFirst(ids);
Context.runWith(new Runnable() {
public void run() {
Context.addAdapter(ids);
Context.addAdapter(SwtXmlParser.this);
root.visitDepthFirst(buildWidgets);
root.visitDepthFirst(setAttributes);
}
});
if (view != null) {
root.visitDepthFirst(new AddEventListeners(view, SwtEvents.getNamespace()));
new ByIdInjector().inject(view, ids);
}
}
}