blob: 158025d7c4688d6cf9670f2caa5bb0b2a2388fc4 [file] [log] [blame]
// Copyright 2004 The Apache Software Foundation
//
// Licensed 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.tapestry.contrib.inspector;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.tapestry.BaseComponent;
import org.apache.tapestry.IComponent;
import org.apache.tapestry.INamespace;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.engine.ISpecificationSource;
import org.apache.tapestry.form.IPropertySelectionModel;
import org.apache.tapestry.form.StringPropertySelectionModel;
/**
* Component of the {@link Inspector} page used to select the page and "crumb trail"
* of the inspected component.
*
*
* @version $Id$
* @author Howard Lewis Ship
*
**/
public class Selector extends BaseComponent
{
/**
* When the form is submitted,
* the inspectedPageName of the {@link Inspector} page will be updated,
* but we need to reset the inspectedIdPath as well.
*
**/
public void formSubmit(IRequestCycle cycle)
{
Inspector inspector = (Inspector) getPage();
inspector.selectComponent((String) null);
}
/**
* Returns an {IPropertySelectionModel} used to select the name of the page
* to inspect. The page names are sorted.
*
**/
public IPropertySelectionModel getPageModel()
{
return new StringPropertySelectionModel(getPageNames());
}
/**
* The crumb trail is all the components from the inspected component up to
* (but not including) the page.
*
**/
public List getCrumbTrail()
{
List result = null;
Inspector inspector = (Inspector) getPage();
IComponent component = inspector.getInspectedComponent();
IComponent container = null;
while (true)
{
container = component.getContainer();
if (container == null)
break;
if (result == null)
result = new ArrayList();
result.add(component);
component = container;
}
if (result == null)
return null;
// Reverse the list, such that the inspected component is last, and the
// top-most container is first.
Collections.reverse(result);
return result;
}
private String[] getPageNames()
{
Set names = new HashSet();
ISpecificationSource source = getPage().getEngine().getSpecificationSource();
addPageNames(names, source.getFrameworkNamespace());
addPageNames(names, source.getApplicationNamespace());
List l = new ArrayList(names);
Collections.sort(l);
return (String[]) l.toArray(new String[l.size()]);
}
private void addPageNames(Set names, INamespace namespace)
{
String idPrefix = namespace.getExtendedId();
List pageNames = namespace.getPageNames();
int count = pageNames.size();
for (int i = 0; i < count; i++)
{
String name = (String) pageNames.get(i);
if (idPrefix == null)
names.add(name);
else
names.add(idPrefix + ":" + name);
}
List ids = namespace.getChildIds();
count = ids.size();
for (int i = 0; i < count; i++)
{
String id = (String) ids.get(i);
addPageNames(names, namespace.getChildNamespace(id));
}
}
}