blob: 7c949b3fde3e4bde897875d5980b205adfb06270 [file] [log] [blame]
package com.gitblit.models;
import java.io.Serializable;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import com.gitblit.utils.StringUtils;
public class Menu {
/**
* A MenuItem for a drop down menu.
*
* @author James Moger
* @since 1.6.0
*/
public abstract static class MenuItem implements Serializable {
private static final long serialVersionUID = 1L;
final String displayText;
MenuItem(String displayText) {
this.displayText = displayText;
}
@Override
public int hashCode() {
return displayText.hashCode();
}
@Override
public boolean equals(Object o) {
if (o instanceof MenuItem) {
return hashCode() == o.hashCode();
}
return false;
}
@Override
public String toString() {
return displayText;
}
}
/**
* A divider for the menu.
*
* @since 1.6.0
*/
public static class MenuDivider extends MenuItem {
private static final long serialVersionUID = 1L;
public MenuDivider() {
super("");
}
}
/**
* A MenuItem for setting a parameter of the current url.
*
* @author James Moger
*
*/
public static class ParameterMenuItem extends MenuItem {
private static final long serialVersionUID = 1L;
final PageParameters parameters;
final String parameter;
final String value;
final boolean isSelected;
/**
* @param displayText
*/
public ParameterMenuItem(String displayText) {
this(displayText, null, null, null);
}
/**
* @param displayText
* @param parameter
* @param value
*/
public ParameterMenuItem(String displayText, String parameter, String value) {
this(displayText, parameter, value, null);
}
/**
* @param displayText
* @param parameter
* @param value
*/
public ParameterMenuItem(String displayText, String parameter, String value,
PageParameters params) {
super(displayText);
this.parameter = parameter;
this.value = value;
if (params == null) {
// no parameters specified
parameters = new PageParameters();
setParameter(parameter, value);
isSelected = false;
} else {
parameters = new PageParameters(params);
if (parameters.containsKey(parameter)) {
isSelected = params.getString(parameter).equals(value);
// set the new selection value
setParameter(parameter, value);
} else {
// not currently selected
isSelected = false;
setParameter(parameter, value);
}
}
}
protected void setParameter(String parameter, String value) {
if (!StringUtils.isEmpty(parameter)) {
if (StringUtils.isEmpty(value)) {
this.parameters.remove(parameter);
} else {
this.parameters.put(parameter, value);
}
}
}
public String formatParameter() {
if (StringUtils.isEmpty(parameter) || StringUtils.isEmpty(value)) {
return "";
}
return parameter + "=" + value;
}
public PageParameters getPageParameters() {
return parameters;
}
public boolean isSelected() {
return isSelected;
}
@Override
public int hashCode() {
if (StringUtils.isEmpty(displayText)) {
return value.hashCode() + parameter.hashCode();
}
return displayText.hashCode();
}
@Override
public boolean equals(Object o) {
if (o instanceof MenuItem) {
return hashCode() == o.hashCode();
}
return false;
}
@Override
public String toString() {
if (StringUtils.isEmpty(displayText)) {
return formatParameter();
}
return displayText;
}
}
/**
* Menu item for toggling a parameter.
*
*/
public static class ToggleMenuItem extends ParameterMenuItem {
private static final long serialVersionUID = 1L;
/**
* @param displayText
* @param parameter
* @param value
*/
public ToggleMenuItem(String displayText, String parameter, String value,
PageParameters params) {
super(displayText, parameter, value, params);
if (isSelected) {
// already selected, so remove this enables toggling
parameters.remove(parameter);
}
}
}
/**
* Menu item for linking to another Wicket page.
*
* @since 1.6.0
*/
public static class PageLinkMenuItem extends MenuItem {
private static final long serialVersionUID = 1L;
private final Class<? extends WebPage> pageClass;
private final PageParameters params;
/**
* Page Link Item links to another page.
*
* @param displayText
* @param pageClass
* @since 1.6.0
*/
public PageLinkMenuItem(String displayText, Class<? extends WebPage> pageClass) {
this(displayText, pageClass, null);
}
/**
* Page Link Item links to another page.
*
* @param displayText
* @param pageClass
* @param params
* @since 1.6.0
*/
public PageLinkMenuItem(String displayText, Class<? extends WebPage> pageClass, PageParameters params) {
super(displayText);
this.pageClass = pageClass;
this.params = params;
}
/**
* @return the page class
* @since 1.6.0
*/
public Class<? extends WebPage> getPageClass() {
return pageClass;
}
/**
* @return the page parameters
* @since 1.6.0
*/
public PageParameters getPageParameters() {
return params;
}
}
/**
* Menu item to link to an external page.
*
* @since 1.6.0
*/
public static class ExternalLinkMenuItem extends MenuItem {
private static final long serialVersionUID = 1L;
private final String href;
private final boolean newWindow;
/**
* External Link Item links to something else.
*
* @param displayText
* @param href
* @since 1.6.0
*/
public ExternalLinkMenuItem(String displayText, String href) {
this(displayText, href, false);
}
/**
* External Link Item links to something else.
*
* @param displayText
* @param href
* @since 1.6.0
*/
public ExternalLinkMenuItem(String displayText, String href, boolean newWindow) {
super(displayText);
this.href = href;
this.newWindow = newWindow;
}
/**
* @since 1.6.0
*/
public String getHref() {
return href;
}
/**
* @since 1.6.0
*/
public boolean openInNewWindow() {
return newWindow;
}
}
}