From 7d3a4860535e365703baf87dc0944485044d3af2 Mon Sep 17 00:00:00 2001 From: "stefan.haustein@gmail.com" Date: Sun, 2 Jun 2019 18:38:00 +0200 Subject: [PATCH] improve documentation --- .../basic/internal/servlet/WebAppServlet.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/bundles/org.openhab.ui.basic/src/main/java/org/openhab/ui/basic/internal/servlet/WebAppServlet.java b/bundles/org.openhab.ui.basic/src/main/java/org/openhab/ui/basic/internal/servlet/WebAppServlet.java index d3a6c40984..63bddb06e7 100644 --- a/bundles/org.openhab.ui.basic/src/main/java/org/openhab/ui/basic/internal/servlet/WebAppServlet.java +++ b/bundles/org.openhab.ui.basic/src/main/java/org/openhab/ui/basic/internal/servlet/WebAppServlet.java @@ -14,6 +14,7 @@ import java.io.IOException; import java.io.PrintWriter; +import java.util.Comparator; import java.util.Map; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; @@ -25,7 +26,11 @@ import javax.servlet.http.HttpServletResponse; import org.eclipse.emf.common.util.EList; +import org.eclipse.jdt.annotation.NonNull; import org.eclipse.smarthome.config.core.ConfigurableService; +import org.eclipse.smarthome.core.items.GroupItem; +import org.eclipse.smarthome.core.items.Item; +import org.eclipse.smarthome.core.items.ItemNotFoundException; import org.eclipse.smarthome.core.items.ItemRegistry; import org.eclipse.smarthome.io.http.HttpContextFactoryService; import org.eclipse.smarthome.io.rest.sitemap.SitemapSubscriptionService; @@ -206,6 +211,22 @@ protected void service(HttpServletRequest req, HttpServletResponse res) throws S throw new RenderException("Widget '" + w + "' can not have any content"); } EList children = renderer.getItemUIRegistry().getChildren((LinkableWidget) w); + + // Figure out if the item is a group and -- if so -- sort by child label. + String itemId = w.getItem(); + if (itemId != null && !itemId.isEmpty()) { + try { + @NonNull + Item item = renderer.getItemUIRegistry().getItem(w.getItem()); + if (item instanceof GroupItem) { + // Ideally, the comparator would be depending on a (new) group widget property. + children.sort(new LabelComparator()); + } + } catch (ItemNotFoundException e) { + throw new RenderException("Item not found: " + itemId); + } + } + result.append(renderer.processPage(renderer.getItemUIRegistry().getWidgetId(w), sitemapName, label, children, async)); } @@ -255,4 +276,19 @@ public void unsetHttpContextFactoryService(HttpContextFactoryService HttpContext super.unsetHttpContextFactoryService(HttpContextFactoryService); } + // Can't be static: accesses the renderer. + class LabelComparator implements Comparator { + + @Override + public int compare(Widget w1, Widget w2) { + // Not using renderer.getLabel() here because it might contain HTML. + try { + @NonNull Item i1 = renderer.getItemUIRegistry().getItem(w1.getItem()); + @NonNull Item i2 = renderer.getItemUIRegistry().getItem(w2.getItem()); + return i1.getLabel().compareToIgnoreCase(i2.getLabel()); + } catch (ItemNotFoundException e) { + throw new RuntimeException(e); + } + } + } }