001 /* 002 * Copyright (C) 2012 eXo Platform SAS. 003 * 004 * This is free software; you can redistribute it and/or modify it 005 * under the terms of the GNU Lesser General Public License as 006 * published by the Free Software Foundation; either version 2.1 of 007 * the License, or (at your option) any later version. 008 * 009 * This software is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 012 * Lesser General Public License for more details. 013 * 014 * You should have received a copy of the GNU Lesser General Public 015 * License along with this software; if not, write to the Free 016 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 017 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 018 */ 019 020 package org.crsh.text.renderers; 021 022 import org.crsh.text.Color; 023 import org.crsh.text.Decoration; 024 import org.crsh.text.LineRenderer; 025 import org.crsh.text.Renderer; 026 import org.crsh.text.ui.LabelElement; 027 import org.crsh.text.ui.RowElement; 028 import org.crsh.text.ui.TableElement; 029 030 import java.util.ArrayList; 031 import java.util.Iterator; 032 import java.util.LinkedHashSet; 033 import java.util.Map; 034 035 public class MapRenderer extends Renderer<Map<?, ?>> { 036 037 @Override 038 public Class<Map<?, ?>> getType() { 039 Object mapClass = Map.class; 040 return (Class<Map<?,?>>)mapClass; 041 } 042 043 @Override 044 public LineRenderer renderer(Iterator<Map<?, ?>> stream) { 045 046 TableElement table = new TableElement(); 047 LinkedHashSet<String> current = new LinkedHashSet<String>(); 048 LinkedHashSet<String> bilto = new LinkedHashSet<String>(); 049 050 ArrayList<LineRenderer> renderers = new ArrayList<LineRenderer>(); 051 052 while (stream.hasNext()) { 053 054 Map<?, ?> row = stream.next(); 055 056 if (row.size() > 0) { 057 058 bilto.clear(); 059 for (Map.Entry<?, ?> entry : row.entrySet()) { 060 bilto.add(String.valueOf(entry.getKey())); 061 } 062 063 // Create a new table if needed 064 if (!current.equals(bilto)) { 065 if (table.getRows().size() > 0) { 066 renderers.add(table.renderer()); 067 } 068 table = new TableElement().rightCellPadding(1); 069 RowElement header = new RowElement(true); 070 header.style(Decoration.bold.fg(Color.black).bg(Color.white)); 071 for (String s : bilto) { 072 header.add(s); 073 } 074 table.add(header); 075 current = bilto; 076 } 077 078 // 079 RowElement r = new RowElement(); 080 for (String s : bilto) { 081 r.add(String.valueOf(row.get(s))); 082 } 083 table.add(r); 084 } 085 } 086 087 // 088 if (table.getRows().size() > 0) { 089 renderers.add(table.renderer()); 090 } 091 092 // 093 return LineRenderer.vertical(renderers); 094 } 095 }