/*
* 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.isis.applib.annotation;
import javax.xml.bind.annotation.XmlType;
import org.apache.isis.applib.util.Enums;
/**
* Represents the location in the user interface where a class member is to be rendered.
*
* <p>
* Used to control visibility (eg using the {@link Hidden} annotation) and enablement
* (eg using the {@link Disabled} annotation) in different regions of the user interface.
*
* <p>
* The application programmer may use any of the values of this enum. Some represent
* concrete locations (eg {@link #OBJECT_FORMS}, {@link #PARENTED_TABLES}), whereas some
* represent a combination of locations (eg {@link #ALL_TABLES}, {@link #ANYWHERE}).
*
* <h4>Framework Implementation Notes</h4>
* <p>
* This enum is also used internally within the framework. When rendering an element,
* the framework developer should only use those values that represent concrete locations.
*/
@XmlType(
namespace = "http://isis.apache.org/applib/layout/component"
)
public enum Where {
/**
* The member should be disabled/hidden everywhere.
*
* <p>
* Synonym for {@link #ANYWHERE}.
*/
EVERYWHERE {
@Override
public boolean includes(Where context) {
return true;
}
},
/**
* The member should be disabled/hidden everywhere.
*
* <p>
* Synonym for {@link #EVERYWHERE}.
*/
ANYWHERE {
@Override
public boolean includes(Where context) {
return true;
}
},
/**
* The member should be disabled/hidden when displayed within an object form.
*
* <p>
* For most viewers, this applies to property and collection members, not actions.
*/
OBJECT_FORMS,
/**
* The member should be disabled/hidden when displayed as a column of a table
* within parent object's collection, and references that parent.
*
* <p>
* For most (all?) viewers, this will have meaning only if applied to a property member.
*/
REFERENCES_PARENT,
/**
* The member should be disabled/hidden when displayed as a column of a table within
* a parent object's collection.
*
* <p>
* For most (all?) viewers, this will have meaning only if applied to a property member.
*/
PARENTED_TABLES ,
/**
* The member should be disabled/hidden when displayed as a column of a table showing a standalone list
* of objects, for example as returned by a repository query.
*
* <p>
* For most (all?) viewers, this will have meaning only if applied to a property member.
*/
STANDALONE_TABLES,
/**
* The member should be disabled/hidden when displayed as a column of a table, either an object's
* collection or a standalone list.
*
* <p>
* This combines {@link #PARENTED_TABLES} and {@link #STANDALONE_TABLES}.
*/
ALL_TABLES {
@Override
public boolean includes(Where context) {
return context == this || context == PARENTED_TABLES || context == STANDALONE_TABLES;
}
},
/**
* The member should be disabled/hidden except when displayed as a column of a standalone table.
*
* <p>
* This is the inverse of {@link #STANDALONE_TABLES}.
*/
ALL_EXCEPT_STANDALONE_TABLES {
@Override
public boolean includes(Where context) {
return context != STANDALONE_TABLES;
}
},
/**
* To act as an override if a member would normally be hidden as a result of some other convention.
*
* <p>
* For example, if a property is annotated with <tt>@Title</tt>, then normally this should be hidden
* from all tables. Additionally annotating with <tt>@Hidden(where=Where.NOWHERE)</tt> overrides this.
*/
NOWHERE {
@Override
public boolean includes(Where context) {
return false;
}
},
/**
* Acts as the default no-op value for {@link PropertyLayout#hidden()}, {@link CollectionLayout#hidden()} and {@link ActionLayout#hidden()}.
*/
NOT_SPECIFIED {
@Override
public boolean includes(Where context) {
return false;
}
};
public String getFriendlyName() {
return Enums.getFriendlyNameOf(this);
}
public boolean inParentedTable() {
return this == PARENTED_TABLES || this == ALL_TABLES;
}
public boolean inStandaloneTable() {
return this == STANDALONE_TABLES || this == ALL_TABLES;
}
/**
* Whether this <tt>Where</tt> is a superset of the context <tt>Where</tt> provided.
*
* <p>
* For example, {@link #ALL_TABLES} includes {@link #STANDALONE_TABLES}; {@link #ANYWHERE} includes all others.
*/
public boolean includes(Where context) {
return context == this;
}
}