blob: 17b566361d8b5681d825d7ed2484ffe6236fc318 [file] [log] [blame]
package org.eclipse.jst.jsf.designtime.internal.view;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jst.jsf.common.internal.RunOnCompletionPattern;
import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
import org.eclipse.jst.jsf.designtime.internal.view.DefaultDTViewHandler.DefaultViewDefnAdapterFactory;
import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler.ViewHandlerException;
import org.w3c.dom.Node;
/**
* The default view root implementation
*
* @author cbateman
*
*/
class DefaultDTUIViewRoot extends DTUIViewRoot
{
/**
* serializable
*/
private static final long serialVersionUID = -6948413077931237435L;
private final DefaultDTViewHandler _viewHandler;
private final DTFacesContext _context;
private DefaultViewDefnAdapterFactory _viewDefnAdapterFactory;
private String _viewId;
private XMLComponentTreeConstructionStrategy _constructionStrategy;
/**
* @param viewHandler
* TODO: should we decouple from the viewHandler by creating and
* update proxy?
*/
DefaultDTUIViewRoot(final DTFacesContext context,
final DefaultDTViewHandler viewHandler)
{
// TODO: refactor constants
super(null, null, new ComponentTypeInfo("javax.faces.ViewRoot",
"javax.faces.component.UIViewRoot", "javax.faces.ViewRoot",
null));
_context = context;
_viewHandler = viewHandler;
try
{
_viewDefnAdapterFactory =
// TODO: not extensible
(DefaultViewDefnAdapterFactory) _viewHandler
.getViewMetadataAdapterFactory(context);
}
catch (final ViewHandlerException e)
{
JSFCorePlugin.log(e, "Trying to get view adapter factory");
}
}
@Override
public String getViewId()
{
return _viewId;
}
@Override
public void setViewId(final String viewId)
{
_viewId = viewId;
}
@Override
public void refresh(final Runnable runAfter)
{
if (_constructionStrategy == null)
{
final IViewDefnAdapter<Node, IDocument> adapter = _viewDefnAdapterFactory
.createAdapter(_context, _viewId);
_constructionStrategy = new XMLComponentTreeConstructionStrategy(
(XMLViewDefnAdapter) adapter, _context.adaptContextObject()
.getProject());
}
final Job refreshTreeJob = new RefreshTreeJob(_constructionStrategy,
_context, this);
new RunOnCompletionPattern(refreshTreeJob, runAfter).run();
}
private static class RefreshTreeJob extends Job
{
private final XMLComponentTreeConstructionStrategy _strategy;
private final DTFacesContext _facesContext;
private final DTUIViewRoot _root;
public RefreshTreeJob(
final XMLComponentTreeConstructionStrategy strategy,
final DTFacesContext facesContext, final DTUIViewRoot root)
{
super("Refresh Tree Job");
_strategy = strategy;
_facesContext = facesContext;
_root = root;
}
@Override
protected IStatus run(final IProgressMonitor monitor)
{
_strategy.createComponentTree(_facesContext, _root);
return Status.OK_STATUS;
}
}
}