Description
I have been using my own custom Shell component for a while now, and have come up with an improvement along the lines of the AjaxDelegate.
On most sites you would want a common setup for :
doctype
stylesheet
stylesheets
You might even want to implement a skinnable concept and vary the stylesheets depending on the user.
How about new parameter IShellDefaults getShellDefaults().
<parameter
name="shellDefaults">
<description>
If specified, the defaults can provide a common layout and encoding for the site overall or by user preference.
</description>
</parameter>
public abstract IShellDefaults getShellDefaults();
interface IShellDefault {
String getDoctype(IRequestCycle cycle);
boolean getRenderContentType(IRequestCycle cycle);
Object getBaseStylesheets(IRequestCycle cycle); // Always used before getStylesheet() or those specified in Shell tag
Object getStylesheets(IRequestCycle cycle); // Used if none are specified in the Shell tag
IAsset getFavicon(IRequestCycle cycle);
IDelegate getDelegate(); // Can be used for additional meta tags/links
}
I expect the changes to be something like this(favicon excluded)
---------
IShellDefaults defs = getShellDefaults();
boolean renderCT = getRenderContentType();
if (defs != null)
renderCT &= defs.getRenderContentType(cycle);
if (renderCT)
writeMetaTag(writer, "http-equiv", "Content-Type", writer.getContentType());
if (defs != null) {
IRender delegate = defs.getDelegate(cycle);
if (delegate != null)
delegate.render(writer, cycle);
}
if (defs != null) {
Iterator i = (Iterator) getValueConverter().coerceValue(defs.getBaseStylesheets(cycle),Iterator.class);
while (i.hasNext())
}
if (defs != null && getStylesheet()==null && getStylesheets()==null) {
Iterator i = (Iterator) getValueConverter().coerceValue(defs.getStylesheets(cycle),Iterator.class);
while (i.hasNext())
{ stylesheet = (IAsset) i.next(); writeStylesheetLink(writer, cycle, stylesheet); }
}
IAsset stylesheet = getStylesheet();
if (stylesheet != null)
writeStylesheetLink(writer, cycle, stylesheet);
Iterator i = (Iterator) getValueConverter().coerceValue(getStylesheets(), Iterator.class);
while (i.hasNext())
{
stylesheet = (IAsset) i.next();
writeStylesheetLink(writer, cycle, stylesheet);
}
....
private void writeDocType(IMarkupWriter writer, IRequestCycle cycle)
{
String doctype = getDoctype();
if (! HiveMind.isNonBlank(doctype) && getShellDefaults() != null)
doctype = getShellDefaults().getDoctype(cycle);
if (HiveMind.isNonBlank(doctype))