/**
 * 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.
 */

package org.apache.oodt.cas.filemgr.webapp.browser;

//OODT imports
import org.apache.oodt.cas.webcomponents.filemgr.browser.types.TypeBrowser;

//Wicket imports
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.WebPage;

/**
 * 
 * Exposes the OODT Wicket {@link TypeBrowser} component 
 * in a web page.
 * 
 * @author mattmann
 * @version $Revision$
 * 
 */
public class TypeBrowserPage extends WebPage {

  public TypeBrowserPage(PageParameters parameters) {
    String typeName = parameters.getString("name");
    int pageNum = parameters.getInt("pageNum", 1);

    TypeBrowser browser = new TypeBrowser("type_browser_component",
        ((FMBrowserApp) getApplication()).getFmUrlStr(), typeName, pageNum,
        TypeBrowserPage.class, ProductBrowserPage.class, ProductRefsBrowserPage.class,
        ProductMetBrowserPage.class);
    add(browser);
  }

}
