package gov.nasa.jpl.mbee.mdk.generator; import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Element; import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.NamedElement; import gov.nasa.jpl.mbee.mdk.docgen.DocGenUtils; import gov.nasa.jpl.mbee.mdk.docgen.table.EditableTable; import gov.nasa.jpl.mbee.mdk.model.Container; import gov.nasa.jpl.mbee.mdk.model.*; import javax.swing.*; import javax.swing.table.TableCellRenderer; import java.awt.*; import java.util.ArrayList; import java.util.List; /** * viewer for docgen 3 document someone should make the gui appear nicer * * @author dlam */ public class DocumentViewer { static class ParagraphRenderer extends JTextArea implements TableCellRenderer { private static final long serialVersionUID = 1L; @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { this.setLineWrap(true); this.setWrapStyleWord(true); if (value instanceof String) { this.setText((String) value); } else { this.setText(""); } if (this.getText().length() > 80 || this.getText().contains("\n")) { table.setRowHeight(row, 50); } // JScrollPane pane = new JScrollPane(this); return this; } } public static void view(Document d) { List<List<Object>> body = new ArrayList<List<Object>>(); List<Integer> sections = new ArrayList<Integer>(); List<String> headers = new ArrayList<String>(); headers.add("View/Template"); headers.add("Targets/text (for templates)"); sections.add(1); for (DocGenElement dge : d.getChildren()) { makeBody(dge, sections, body); sections.set(0, sections.get(0) + 1); } EditableTable et = new EditableTable("Document Preview", body, headers, null, null, null); et.prepareTable(); et.getTable().getColumnModel().getColumn(1).setCellRenderer(new ParagraphRenderer()); et.showTable(); } private static void makeBody(DocGenElement dge, List<Integer> sections, List<List<Object>> body) { List<Object> row = new ArrayList<Object>(); int indent = sections.size() - 1; String titlePrefix = dge.getTitlePrefix(); String titleSuffix = dge.getTitleSuffix(); titlePrefix = titlePrefix == null ? "" : titlePrefix; titleSuffix = titleSuffix == null ? "" : titleSuffix; if (dge instanceof Container) { String title = ((Container) dge).getTitle(); title = title == null ? "(no title)" : title; String display = makeStringFromSections(sections) + " " + titlePrefix + title + titleSuffix; display = getIndented(display, indent); row.add(display); row.add(""); body.add(row); sections.add(0); for (DocGenElement dge2 : ((Container) dge).getChildren()) { if (dge2 instanceof Container) { sections.set(sections.size() - 1, sections.get(sections.size() - 1) + 1); } makeBody(dge2, sections, body); } sections.remove(sections.size() - 1); } else if (dge instanceof Query) { String templateType = dge.getClass().getSimpleName(); List<Object> targets = ((Query) dge).getTargets(); List<String> titles = ((Query) dge).getTitles(); String title = (titles != null && titles.size() > 0) ? titles.get(0) : "(no title)"; String display = "(" + templateType + ") " + titlePrefix + title + titleSuffix; display = getIndented(display, indent); row.add(display); if (dge instanceof Paragraph && ((Paragraph) dge).getText() != null) { row.add(((Paragraph) dge).getText()); } else { row.add(stringFromTargets(targets)); } body.add(row); } } private static String stringFromTargets(List<Object> targets) { if (targets == null || targets.isEmpty()) { return "(no targets)"; } String res = ""; for (Object e : targets) { if (e instanceof NamedElement) { res += ((NamedElement) e).getName() + "\n"; } else if (e instanceof Element) { res += "(element)" + "\n"; } else { res += DocGenUtils.fixString(e); } } return res; } private static String makeStringFromSections(List<Integer> sections) { String res = ""; res += Integer.toString(sections.get(0)); for (Integer i : sections.subList(1, sections.size())) { res += "." + Integer.toString(i); } return res; } private static String getIndented(String s, int i) { String res = ""; for (int j = 0; j < i; j++) { res += " "; } return res + s; } }