1 19 20 28 29 package org.netbeans.modules.xml.schema.refactoring.query.readers; 30 31 32 import java.awt.Color ; 33 import java.text.MessageFormat ; 34 import java.util.ArrayList ; 35 import java.util.Collection ; 36 import java.util.HashMap ; 37 import java.util.List ; 38 import java.util.Map ; 39 import java.util.Set ; 40 import org.netbeans.modules.xml.nbprefuse.AnalysisConstants; 41 import org.netbeans.modules.xml.refactoring.RefactoringManager; 42 import org.netbeans.modules.xml.refactoring.spi.UIHelper; 43 import org.netbeans.modules.xml.refactoring.ui.util.AnalysisUtilities; 44 import org.netbeans.modules.xml.schema.model.GlobalElement; 45 import org.netbeans.modules.xml.schema.model.SchemaModel; 46 import org.netbeans.modules.xml.xam.Component; 47 import org.openide.ErrorManager; 48 import org.openide.awt.StatusDisplayer; 49 import org.openide.util.NbBundle; 50 import org.netbeans.modules.xml.xam.dom.NamedComponentReference; 51 import prefuse.data.Edge; 52 import prefuse.data.Graph; 53 import prefuse.data.Node; 54 55 59 public class QuerySubstitutionGroupsReader { 60 61 private SchemaModel model; 62 64 private Map <GlobalElement,List <GlobalElement>> sGroups; 67 68 69 public static final prefuse.data.Schema FIND_USAGES_NODES_SCHEMA = new prefuse.data.Schema(); static { 71 FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.LABEL, String .class, AnalysisConstants.EMPTY_STRING); 72 FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.ID, String .class, AnalysisConstants.EMPTY_STRING); 73 FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.COMPONENT_TYPE_NAME, String .class, AnalysisConstants.EMPTY_STRING); 74 FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.ELEMENT_TYPE, String .class, AnalysisConstants.EMPTY_STRING); FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.XML_FILENAME, String .class, AnalysisConstants.EMPTY_STRING); 76 FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.TOOLTIP, String .class, AnalysisConstants.EMPTY_STRING); FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.XAM_COMPONENT, Component.class); FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.IS_PRIMITIVE, boolean.class, false); FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.IS_QUERY_NODE, boolean.class, false); 81 FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.IS_USAGE_NODE, boolean.class, false); 82 FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.IS_HEAD_ELEMENT, boolean.class, false); 83 FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.OPENIDE_NODE, 84 org.openide.nodes.Node.class); 85 } 86 87 public static final prefuse.data.Schema FIND_USAGES_EDGES_SCHEMA = new prefuse.data.Schema(); static { 89 FIND_USAGES_EDGES_SCHEMA.addColumn(AnalysisConstants.LABEL, String .class, AnalysisConstants.EMPTY_STRING); 90 FIND_USAGES_EDGES_SCHEMA.addColumn(AnalysisConstants.EDGE_TYPE, String .class, AnalysisConstants.EMPTY_STRING); FIND_USAGES_EDGES_SCHEMA.addColumn(AnalysisConstants.TOOLTIP, String .class, AnalysisConstants.EMPTY_STRING); 92 } 93 94 95 98 public QuerySubstitutionGroupsReader(SchemaModel model) { 99 this.model = model; 100 } 101 102 103 public Graph loadGraph() { 104 Graph graph = new Graph(true); graph.getNodeTable().addColumns(FIND_USAGES_NODES_SCHEMA); 106 graph.getEdgeTable().addColumns(FIND_USAGES_EDGES_SCHEMA); 107 sGroups = new HashMap <GlobalElement,List <GlobalElement>>(); 112 Collection <GlobalElement> ges = model.getSchema().getElements(); 113 for (GlobalElement ge:ges){ 114 NamedComponentReference<GlobalElement> headElemRef = ge.getSubstitutionGroup(); 115 if (headElemRef != null){ 120 GlobalElement headElem = headElemRef.get(); 121 if (headElem != null){ 122 List <GlobalElement> members = sGroups.get(headElem); 123 if (members == null){ 124 members = new ArrayList <GlobalElement>(); 125 sGroups.put(headElem, members); 126 } 127 members.add(ge); 128 } else { 129 ErrorManager.getDefault().log(ErrorManager.ERROR,"QuerySubstitutionGroupsReader.loadGraph ignoring GE w/ invalid substGrp ref " + ge.getName()); 130 } 131 } 132 } 133 int numGroups = sGroups.size(); 134 135 if (numGroups == 1) { 136 StatusDisplayer.getDefault().setStatusText( 137 NbBundle.getMessage(QuerySubstitutionGroupsReader.class, 138 "LBL_SubstitutionGroup_Found")); 139 } else { 140 StatusDisplayer.getDefault().setStatusText( 141 MessageFormat.format(NbBundle.getMessage(QuerySubstitutionGroupsReader.class, 142 "LBL_SubstitutionGroups_Found"), 143 new Object [] {numGroups, 144 } 145 )); 146 } 147 Set <GlobalElement> headElems = sGroups.keySet(); 149 for (GlobalElement head: headElems){ 150 List <GlobalElement> geList = sGroups.get(head); 151 assert geList != null:"Error is finding substitution group for "+ head; 153 Node headNode = createHeadElementNode(graph, head); 154 for (GlobalElement ge: geList){ 155 Node elemNode = createNode(graph, ge); 156 157 163 AnalysisUtilities.ToolTipLine topLine = null; 164 topLine = new AnalysisUtilities.ToolTipLine(( 165 MessageFormat.format( 166 NbBundle.getMessage(QuerySubstitutionGroupsReader.class, 167 "LBL_Substitutable_Element"), new Object [] {headNode.getString(AnalysisConstants.LABEL)})), 169 100, 170 Color.BLACK.getRGB(), 171 AnalysisUtilities.ToolTipLine.HorizontalAlignment.CENTER); 172 String compType = elemNode.getString(AnalysisConstants.COMPONENT_TYPE_NAME); 173 AnalysisUtilities.ToolTipLine typeLine = new AnalysisUtilities.ToolTipLine(compType, 174 100, 175 Color.BLACK.getRGB(), 176 AnalysisUtilities.ToolTipLine.HorizontalAlignment.CENTER); 177 String toolTip = AnalysisUtilities.createHTMLToolTip(new AnalysisUtilities.ToolTipLine[] {topLine, typeLine}); 178 elemNode.setString(AnalysisConstants.TOOLTIP, toolTip); 179 180 Edge edge = createEdge(graph, elemNode, headNode); 181 } 182 } 183 return graph; 185 } 186 187 188 189 190 191 private Node createHeadElementNode(Graph graph, GlobalElement head) { 192 Node headElementNode = createNode(graph, head); 193 headElementNode.setBoolean(AnalysisConstants.IS_HEAD_ELEMENT, true); 194 195 199 AnalysisUtilities.ToolTipLine topLine = new AnalysisUtilities.ToolTipLine(( 200 NbBundle.getMessage(QuerySubstitutionGroupsReader.class, 201 "LBL_Head_Element")), 202 100, 203 Color.BLACK.getRGB(), 204 AnalysisUtilities.ToolTipLine.HorizontalAlignment.CENTER); 205 206 AnalysisUtilities.ToolTipLine typeLine = new AnalysisUtilities.ToolTipLine( 207 NbBundle.getMessage(QuerySubstitutionGroupsReader.class,"LBL_Global_Element"), 208 100, 209 Color.BLACK.getRGB(), 210 AnalysisUtilities.ToolTipLine.HorizontalAlignment.CENTER); 211 212 String toolTip = AnalysisUtilities.createHTMLToolTip(new AnalysisUtilities.ToolTipLine[] {topLine, typeLine}); 213 headElementNode.setString(AnalysisConstants.TOOLTIP, toolTip); 214 215 return headElementNode; 216 217 218 } 219 220 private Edge createEdge(Graph graph, Node elemNode, Node headNode){ 221 Edge edge = graph.addEdge(elemNode, headNode); 224 edge.setString(AnalysisConstants.EDGE_TYPE, AnalysisConstants.GENERALIZATION); 225 return edge; 226 } 227 228 private Node createNode(Graph graph, GlobalElement ge){ 229 Node n = graph.addNode(); 230 UIHelper uiHleper = RefactoringManager.getInstance().getTargetComponentUIHelper(ge); 231 org.openide.nodes.Node displayNode = uiHleper.getDisplayNode(ge); 232 n.set(AnalysisConstants.OPENIDE_NODE, displayNode ); 233 n.set(AnalysisConstants.XAM_COMPONENT, ge); 234 n.setString(AnalysisConstants.COMPONENT_TYPE_NAME, displayNode.getShortDescription()); 235 n.setString(AnalysisConstants.LABEL, displayNode.getName()); 236 n.setString(AnalysisConstants.ELEMENT_TYPE, displayNode.getDisplayName()); 237 238 return n; 239 } 240 241 242 243 } 244 | Popular Tags |