venice-main-classic/src/com/silverwrist/venice/ui/menus/MenuTemplate.java
2004-07-19 03:44:29 +00:00

244 lines
7.9 KiB
Java

/*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
*
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
* language governing rights and limitations under the License.
*
* The Original Code is the Venice Web Communities System.
*
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
* Copyright (C) 2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
package com.silverwrist.venice.ui.menus;
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import com.silverwrist.util.*;
import com.silverwrist.venice.except.*;
import com.silverwrist.venice.ui.*;
import com.silverwrist.venice.ui.config.RootConfig;
import com.silverwrist.venice.util.XMLLoader;
public class MenuTemplate
{
/*--------------------------------------------------------------------------------
* Attributes
*--------------------------------------------------------------------------------
*/
private String m_identifier; // menu template identifier
private RootConfig m_rootconf; // backreference to root configuration
private Map m_blocks; // blocks defined in menu template
private String m_title_single; // single title block
private String m_title_double; // double title block
private Map m_items; // item templates defined in menu template
private Map m_links; // link templates defined in menu template
/*--------------------------------------------------------------------------------
* Constructor
*--------------------------------------------------------------------------------
*/
public MenuTemplate(Element elt, RootConfig rootconf, String identifier) throws ConfigException
{
XMLLoader loader = XMLLoader.get();
loader.configVerifyNodeName(elt,"menu-template"); // verify the name of the root node
m_identifier = identifier;
m_rootconf = rootconf;
// load the contents of the menu template
HashMap tmp_blocks = new HashMap();
HashMap tmp_items = new HashMap();
HashMap tmp_links = new HashMap();
NodeList nl = elt.getChildNodes();
for (int i=0; i<nl.getLength(); i++)
{ // examine each child node
Node n = nl.item(i);
if (n.getNodeType()==Node.ELEMENT_NODE)
{ // look at the node name
Element ne = (Element)n;
String nn = n.getNodeName();
if (nn.equals("block"))
{ // get block by ID and save it off
String id = ne.getAttribute("id");
if (StringUtil.isStringEmpty(id))
throw new ConfigException("menu template \"" + identifier + "\" has a <block/> with no id",ne);
DOMElementHelper h = new DOMElementHelper(ne);
tmp_blocks.put(id,h.getElementText());
} // end if
else if (nn.equals("title"))
{ // get title type and save it off
String typ = ne.getAttribute("type");
if ((typ==null) || !(typ.equalsIgnoreCase("single") || typ.equalsIgnoreCase("double")))
throw new ConfigException("menu template \"" + identifier + "\" has a <title/> with bad type \""
+ typ + "\"",ne);
DOMElementHelper h = new DOMElementHelper(ne);
if (typ.equalsIgnoreCase("single"))
m_title_single = h.getElementText();
else
m_title_double = h.getElementText();
} // end else if
else if (nn.equals("item"))
{ // save off item template
String typ = ne.getAttribute("type");
if (StringUtil.isStringEmpty(typ))
throw new ConfigException("menu template \"" + identifier + "\" has an <item/> with no type",ne);
DOMElementHelper h = new DOMElementHelper(ne);
tmp_items.put(typ,h.getElementText());
} // end else if
else if (nn.equals("link"))
{ // save off the link template
String typ = ne.getAttribute("type");
if (StringUtil.isStringEmpty(typ))
throw new ConfigException("menu template \"" + identifier + "\" has a <link/> with no type",ne);
DOMElementHelper h = new DOMElementHelper(ne);
tmp_links.put(typ,h.getElementText());
} // end else if
else // unknown item
throw new ConfigException("unknown element <" + nn + "/> inside <menu-template/>",ne);
} // end if (element found)
// else ignore this node
} // end for
if (tmp_blocks.isEmpty())
m_blocks = Collections.EMPTY_MAP;
else
m_blocks = Collections.unmodifiableMap(tmp_blocks);
if (tmp_items.isEmpty())
m_items = Collections.EMPTY_MAP;
else
m_items = Collections.unmodifiableMap(tmp_items);
if (tmp_links.isEmpty())
m_links = Collections.EMPTY_MAP;
else
m_links = Collections.unmodifiableMap(tmp_links);
} // end constructor
/*--------------------------------------------------------------------------------
* External operations
*--------------------------------------------------------------------------------
*/
public String getIdentifier()
{
return m_identifier;
} // end getIdentifier
public String getBlock(String id)
{
String bk = (String)(m_blocks.get(id));
if (StringUtil.isStringEmpty(bk))
return "";
HashMap parms = new HashMap();
m_rootconf.addFormatParams(parms);
String rc = StringUtil.replaceAllVariables(bk,parms);
return (rc==null) ? "" : rc;
} // end getBlock
public void writeBlock(Writer wr, String id) throws IOException
{
String bk = (String)(m_blocks.get(id));
if (StringUtil.isStringEmpty(bk))
return;
HashMap parms = new HashMap();
m_rootconf.addFormatParams(parms);
String out = StringUtil.replaceAllVariables(bk,parms);
if (!(StringUtil.isStringEmpty(out)))
wr.write(out);
} // end writeBlock
public void renderTitle(Writer wr, String title, String subtitle) throws IOException
{
if (StringUtil.isStringEmpty(title))
throw new IllegalArgumentException("title should not be empty!");
String templ = m_title_single;
HashMap parms = new HashMap();
parms.put("title",StringUtil.encodeHTML(title));
if (!(StringUtil.isStringEmpty(subtitle)))
{ // shift to "double" template
templ = m_title_double;
parms.put("subtitle",StringUtil.encodeHTML(subtitle));
} // end if
m_rootconf.addFormatParams(parms);
String out = StringUtil.replaceAllVariables(templ,parms);
if (!(StringUtil.isStringEmpty(out)))
wr.write(out);
} // end renderTitle
public void renderItem(Writer wr, String type, String text, String link, Map params) throws IOException
{
String out = text;
HashMap myparms = new HashMap();
String templ = (String)(m_items.get(type));
if (templ==null)
templ = (String)(m_items.get("*"));
if (templ!=null)
{ // format the item template
if (text!=null)
{ // format the text
m_rootconf.addFormatParams(myparms);
myparms.putAll(params);
myparms.put("text",text);
out = StringUtil.replaceAllVariables(templ,myparms);
} // end if
else // just use the template as the output text
out = templ;
} // end if
if (link!=null)
{ // there's a link - need to look for a link template
templ = (String)(m_links.get(type));
if (templ==null)
templ = (String)(m_links.get("*"));
if (templ!=null)
{ // format the link
myparms.clear();
m_rootconf.addFormatParams(myparms);
myparms.putAll(params);
myparms.put("link",link);
myparms.put("item",out);
if (text!=null)
myparms.put("text",text);
out = StringUtil.replaceAllVariables(templ,myparms);
} // end if
} // end if
if (!(StringUtil.isStringEmpty(out)))
wr.write(out); // write it!
} // end renderItem
public void renderItem(Writer wr, String type, String text, String link) throws IOException
{
this.renderItem(wr,type,text,link,Collections.EMPTY_MAP);
} // end renderItem
} // end class MenuTemplate