@Override
protected void populateItem(ListItem<ComponentFactory> item) {
final int underlyingViewNum = item.getIndex();
final ComponentFactory componentFactory = item.getModelObject();
final AbstractLink link = new AjaxLink<Void>(ID_VIEW_LINK) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
LinksSelectorPanelAbstract<T> linksSelectorPanel = LinksSelectorPanelAbstract.this;
linksSelectorPanel.setViewHintAndBroadcast(underlyingViewNum, target);
final T dummyModel = dummyOf(model);
for(int i=0; i<MAX_NUM_UNDERLYING_VIEWS; i++) {
final Component component = underlyingViews[i];
if(component == null) {
continue;
}
final boolean isSelected = i == underlyingViewNum;
applyCssVisibility(component, isSelected);
component.setDefaultModel(isSelected? model: dummyModel);
}
selectorPanel.selectedComponentFactory = componentFactory;
selectorPanel.selectedComponent = underlyingViews[underlyingViewNum];
selectorPanel.onSelect(target);
target.add(selectorPanel, views);
}
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
Buttons.fixDisabledState(this, tag);
}
};
IModel<String> title = nameFor(componentFactory);
Label viewItemTitleLabel = new Label(ID_VIEW_ITEM_TITLE, title);
link.add(viewItemTitleLabel);
Label viewItemIcon = new Label(ID_VIEW_ITEM_ICON, "");
link.add(viewItemIcon);
boolean isEnabled = componentFactory != selectorPanel.selectedComponentFactory;
if (!isEnabled) {
viewButtonTitle.setDefaultModel(title);
IModel<String> cssClass = cssClassFor(componentFactory, viewButtonIcon);
viewButtonIcon.add(AttributeModifier.replace("class", "ViewLinkItem " + cssClass.getObject()));
link.setVisible(false);
} else {
IModel<String> cssClass = cssClassFor(componentFactory, viewItemIcon);
viewItemIcon.add(new CssClassAppender(cssClass));
}
item.add(link);
}
private IModel<String> cssClassFor(final ComponentFactory componentFactory, Label viewIcon) {
IModel<String> cssClass = null;
if (componentFactory instanceof CollectionContentsAsFactory) {
CollectionContentsAsFactory collectionContentsAsFactory = (CollectionContentsAsFactory) componentFactory;
cssClass = collectionContentsAsFactory.getCssClass();
viewIcon.setDefaultModelObject("");
viewIcon.setEscapeModelStrings(true);
}
if (cssClass == null) {
String name = componentFactory.getName();
cssClass = Model.of(StringExtensions.asLowerDashed(name));
// Small hack: if there is no specific CSS class then we assume that background-image is used
// the span.ViewItemLink should have some content to show it
// FIX: find a way to do this with CSS (width and height don't seems to help)
viewIcon.setDefaultModelObject("     ");
viewIcon.setEscapeModelStrings(false);
}
return cssClass;
}
private IModel<String> nameFor(final ComponentFactory componentFactory) {
IModel<String> name = null;
if (componentFactory instanceof CollectionContentsAsFactory) {
CollectionContentsAsFactory collectionContentsAsFactory = (CollectionContentsAsFactory) componentFactory;
name = collectionContentsAsFactory.getTitleLabel();
}
if (name == null) {
name = Model.of(componentFactory.getName());
}
return name;
}
};
container.add(listView);