diff --git a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/AbstractContentPresenterBase.java b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/AbstractContentPresenterBase.java index d83747b..3666d4c 100644 --- a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/AbstractContentPresenterBase.java +++ b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/AbstractContentPresenterBase.java @@ -201,13 +201,9 @@ public abstract class AbstractContentPresenterBase implements ContentPresenter, } protected Iterator getColumnsIterator() { - Iterator viewsIterator = workbenchDefinition.getContentViews().iterator(); - while (viewsIterator.hasNext()) { - ContentPresenterDefinition contentView = viewsIterator.next(); - String viewType = contentView.getViewType(); - if (viewType != null && viewType.equals(viewTypeName)) { - return getAvailableColumns(contentView.getColumns()).iterator(); - } + final ContentPresenterDefinition presenterDefinition = getPresenterDefinition(); + if (presenterDefinition != null) { + return getAvailableColumns(presenterDefinition.getColumns()).iterator(); } return null; } diff --git a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/column/definition/AbstractColumnDefinition.java b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/column/definition/AbstractColumnDefinition.java index 82b3a0c..1b055a4 100644 --- a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/column/definition/AbstractColumnDefinition.java +++ b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/column/definition/AbstractColumnDefinition.java @@ -33,6 +33,8 @@ */ package info.magnolia.ui.workbench.column.definition; +import com.vaadin.ui.Table; + /** * Base implementation for all special ColumnDefinitions. Some subclass do not add additional * behavior but still are required because in jcr we configure ColumnDefinition to Column mappings @@ -52,6 +54,8 @@ public abstract class AbstractColumnDefinition implements ColumnDefinition { private Class formatterClass; + private Class styleGenerator; + private String propertyName; private boolean displayInChooseDialog = true; @@ -127,6 +131,15 @@ public abstract class AbstractColumnDefinition implements ColumnDefinition { this.formatterClass = formatterClass; } + @Override + public Class getStyleGenerator() { + return styleGenerator; + } + + public void setStyleGenerator(Class styleGenerator) { + this.styleGenerator = styleGenerator; + } + /** * The concrete type represented in this column, ie Long, Double, Date, etc. By default, it * assumes a String (which should be a good match in most cases). Subclasses are responsible for diff --git a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/column/definition/ColumnDefinition.java b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/column/definition/ColumnDefinition.java index 94f1511..0b33b7a 100644 --- a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/column/definition/ColumnDefinition.java +++ b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/column/definition/ColumnDefinition.java @@ -36,6 +36,8 @@ package info.magnolia.ui.workbench.column.definition; import info.magnolia.i18nsystem.I18nable; import info.magnolia.i18nsystem.I18nText; +import com.vaadin.ui.Table; + /** * Defines a column in a workbench. * @@ -69,6 +71,8 @@ public interface ColumnDefinition { Class getFormatterClass(); + Class getStyleGenerator(); + Class getType(); boolean isDisplayInChooseDialog(); diff --git a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/definition/ConfiguredContentPresenterDefinition.java b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/definition/ConfiguredContentPresenterDefinition.java index 904d67e..591be81 100644 --- a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/definition/ConfiguredContentPresenterDefinition.java +++ b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/definition/ConfiguredContentPresenterDefinition.java @@ -39,6 +39,8 @@ import info.magnolia.ui.workbench.column.definition.ColumnDefinition; import java.util.ArrayList; import java.util.List; +import com.vaadin.ui.Table; + /** * Default configured implementation for {@link ContentPresenterDefinition}. */ @@ -52,6 +54,8 @@ public class ConfiguredContentPresenterDefinition implements ContentPresenterDef private boolean active; + private Class styleGenerator; + private List columns = new ArrayList(); @Override @@ -91,6 +95,15 @@ public class ConfiguredContentPresenterDefinition implements ContentPresenterDef } @Override + public Class getStyleGenerator() { + return styleGenerator; + } + + public void setStyleGenerator(Class styleGenerator) { + this.styleGenerator = styleGenerator; + } + + @Override public List getColumns() { return columns; } diff --git a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/definition/ContentPresenterDefinition.java b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/definition/ContentPresenterDefinition.java index 7f0bc39..59c98ef 100644 --- a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/definition/ContentPresenterDefinition.java +++ b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/definition/ContentPresenterDefinition.java @@ -39,6 +39,8 @@ import info.magnolia.ui.workbench.column.definition.ColumnDefinition; import java.util.List; +import com.vaadin.ui.Table; + /** * Definition for a workbench generic content view. */ @@ -54,4 +56,7 @@ public interface ContentPresenterDefinition { String getIcon(); boolean isActive(); + + Class getStyleGenerator(); + } diff --git a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/list/ListPresenter.java b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/list/ListPresenter.java index 3e2b724..aaf87d1 100644 --- a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/list/ListPresenter.java +++ b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/list/ListPresenter.java @@ -29,7 +29,6 @@ * * Any modifications to this file must keep this entire header * intact. - * */ package info.magnolia.ui.workbench.list; @@ -45,12 +44,14 @@ import info.magnolia.ui.workbench.definition.ContentPresenterDefinition; import info.magnolia.ui.workbench.definition.WorkbenchDefinition; import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; import java.util.List; import javax.inject.Inject; import com.vaadin.data.Container; +import com.vaadin.ui.Table; /** * The ListPresenter is responsible for creating, configuring and updating a list of items according to the workbench definition. @@ -73,6 +74,12 @@ public class ListPresenter extends AbstractContentPresenter implements ListView. view.setContainer(container); view.clearColumns(); + final Collection styleGenerators = new ArrayList<>(); + final Class tableStyleGen = getPresenterDefinition().getStyleGenerator(); + if (tableStyleGen != null) { + styleGenerators.add(getComponentProvider().newInstance(tableStyleGen)); + } + // build columns Iterator it = getColumnsIterator(); @@ -97,8 +104,14 @@ public class ListPresenter extends AbstractContentPresenter implements ListView. if (column.getFormatterClass() != null) { view.setColumnFormatter(propertyId, getComponentProvider().newInstance(column.getFormatterClass(), column)); } + + if (column.getStyleGenerator() != null) { + styleGenerators.add(getComponentProvider().newInstance(column.getStyleGenerator())); + } } + view.setStyleGenerators(styleGenerators); + return view; } diff --git a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/list/ListView.java b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/list/ListView.java index b6660fa..7d68339 100644 --- a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/list/ListView.java +++ b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/list/ListView.java @@ -36,7 +36,10 @@ package info.magnolia.ui.workbench.list; import info.magnolia.ui.workbench.ContentView; import info.magnolia.ui.workbench.column.definition.ColumnFormatter; +import java.util.Collection; + import com.vaadin.data.Container; +import com.vaadin.ui.Table; /** * List view interface. @@ -53,5 +56,7 @@ public interface ListView extends ContentView { void setColumnFormatter(String propertyId, ColumnFormatter formatter); + void setStyleGenerators(Collection styleGenerators); + void clearColumns(); } diff --git a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/list/ListViewImpl.java b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/list/ListViewImpl.java index e2356a7..a50deed 100644 --- a/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/list/ListViewImpl.java +++ b/magnolia-ui-workbench/src/main/java/info/magnolia/ui/workbench/list/ListViewImpl.java @@ -39,11 +39,13 @@ import info.magnolia.ui.workbench.column.definition.ColumnFormatter; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -87,24 +89,6 @@ public class ListViewImpl implements ListView { table.setColumnReorderingAllowed(false); table.setSortEnabled(true); - table.setCellStyleGenerator(new Table.CellStyleGenerator() { - - - @Override - public String getStyle(Table source, Object itemId, Object propertyId) { - // icon style is expected on the whole table row, not on a column matching a specific propertyId - if (propertyId == null && itemId != null) { - final Item item = source.getContainerDataSource().getItem(itemId); - if (item == null) { - return DELETED_ROW_STYLENAME; - } else { - return listener.getIcon(item); - } - } - return null; - } - }); - // this one was re-added since the check-all worked for tree only but nor for list- and search-view, see MGNLUI-1958 // TODO fgrilli: a workaround for MGNLUI-1651 table.addStyleName("no-header-checkbox"); @@ -226,6 +210,20 @@ public class ListViewImpl implements ListView { } @Override + public void setStyleGenerators(Collection styleGenerators) { + final Collection styleGeneratorsWithDefaults = new ArrayList<>(); + // Default style generators + styleGeneratorsWithDefaults.addAll(defaultStyleGenerators()); + // Configured custom style generators + styleGeneratorsWithDefaults.addAll(styleGenerators); + table.setCellStyleGenerator(new AggregateCellStyleGenerator(styleGeneratorsWithDefaults)); + } + + protected Collection defaultStyleGenerators() { + return Collections.singleton(new IconRowStyleGenerator(listener)); + } + + @Override public void clearColumns() { table.setVisibleColumns(new Object[]{}); } @@ -262,4 +260,46 @@ public class ListViewImpl implements ListView { } } + private static class AggregateCellStyleGenerator implements Table.CellStyleGenerator { + private final Collection styleGenerators; + + public AggregateCellStyleGenerator(Collection styleGenerators) { + this.styleGenerators = styleGenerators; + } + + @Override + public String getStyle(Table source, Object itemId, Object propertyId) { + final List result = new ArrayList<>(); + for (Table.CellStyleGenerator styleGenerator : styleGenerators) { + final String style = styleGenerator.getStyle(source, itemId, propertyId); + if (style != null && !style.equals("")) { + result.add(style); + } + } + return StringUtils.join(result, ' '); + } + } + + private static class IconRowStyleGenerator implements Table.CellStyleGenerator { + + private final ListView.Listener listener; + + public IconRowStyleGenerator(Listener listener) { + this.listener = listener; + } + + @Override + public String getStyle(Table source, Object itemId, Object propertyId) { + // icon style is expected on the whole table row, not on a column matching a specific propertyId + if (propertyId == null && itemId != null) { + final Item item = source.getContainerDataSource().getItem(itemId); + if (item == null) { + return DELETED_ROW_STYLENAME; + } else { + return listener.getIcon(item); + } + } + return null; + } + } }