<?xml version="1.0"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (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.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<!-- $Id: generic.xsp 155806 2005-03-01 17:55:42Z andreas $ -->

<xsp:page 
    language="java" 
    xmlns:xsp="http://apache.org/xsp"
    xmlns:xsp-request="http://apache.org/xsp/request/2.0"
    xmlns:input="http://apache.org/cocoon/xsp/input/1.0"
    xmlns:i18n="http://apache.org/cocoon/i18n/2.1"    
    xmlns:wf="http://apache.org/cocoon/lenya/workflow/1.0"
    xmlns:uc="http://apache.org/cocoon/lenya/usecase/1.0"
    xmlns="http://apache.org/cocoon/lenya/menubar/1.0"
>

  <xsp:structure>
    <xsp:include>org.apache.lenya.cms.publication.Document</xsp:include>
    <xsp:include>org.apache.lenya.cms.publication.Publication</xsp:include>
  </xsp:structure>
  
  <menu>

    <menus>
      <menu i18n:attr="name" name="File">
        <block areas="site authoring" id="create">
          <item uc:usecase="sitemanagement.create" href="?doctype=links">
            <i18n:translate>
              <i18n:text>New ... Document</i18n:text>
              <i18n:param><i18n:text>resourceType-links</i18n:text></i18n:param>
            </i18n:translate>
          </item>
        </block>
      </menu>
      
      <menu i18n:attr="name" name="Edit">
          <xsp:logic>
            try {
                Object doc = <input:get-attribute module="page-envelope" as="object" name="document"/>;
                if (doc instanceof Document &amp;&amp; ((Document) doc).exists()) {
                    String doctype = <input:get-attribute module="page-envelope" as="string" name="document-type"/>;
                    if ("links".equals(doctype)) {
                        <block areas="authoring">
                          <item wf:event="edit" uc:usecase="editors.oneform" href="?"><i18n:text>With one Form</i18n:text></item>
                        </block>
                    }
                }
            }
            catch (Exception e) {
                throw new ProcessingException("Error during menu generation: ", e);
            }
          </xsp:logic>
      </menu>
      
    </menus>
    
  </menu>
</xsp:page>
