From: <ker...@us...> - 2010-08-27 06:53:45
|
Revision: 18427 http://jedit.svn.sourceforge.net/jedit/?rev=18427&view=rev Author: kerik-sf Date: 2010-08-27 06:53:38 +0000 (Fri, 27 Aug 2010) Log Message: ----------- implement feature request #1591422 - XMLPlugin with entity preview https://sourceforge.net/tracker/?func=detail&aid=1591422&group_id=588&atid=997936 Entities must now be accessed from the XmlParsedData, not the NoNamespaceCompletionInfo Modified Paths: -------------- plugins/XML/trunk/docs/users-guide.xml plugins/XML/trunk/test/build.xml plugins/XML/trunk/test/xml/SchemaMappingManagerTest.java plugins/XML/trunk/test/xml/TagUtilsTest.java plugins/XML/trunk/test/xml/XmlPluginTest.java plugins/XML/trunk/test_data/dtd/dtdwithxsd.xml plugins/XML/trunk/xml/XmlActions.java plugins/XML/trunk/xml/XmlInsert.java plugins/XML/trunk/xml/XmlListCellRenderer.java plugins/XML/trunk/xml/XmlParsedData.java plugins/XML/trunk/xml/parser/XercesParserImpl.java plugins/XML/trunk/xml/parser/XmlParser.java Modified: plugins/XML/trunk/docs/users-guide.xml =================================================================== --- plugins/XML/trunk/docs/users-guide.xml 2010-08-27 06:42:52 UTC (rev 18426) +++ plugins/XML/trunk/docs/users-guide.xml 2010-08-27 06:53:38 UTC (rev 18427) @@ -978,6 +978,8 @@ <listitem><para>Suppress error message from Resolver (cannot find CatalogManager.properties) (bug #1090658 - Eric Le Lay)</para></listitem> <listitem><para>Fix NPE in XmlParsedData (bug #3053499 - Matthieu Casanova)</para></listitem> + <listitem><para>XML Insert and the completion popup show a preview of entity values + (feature request #1591422 - Eric Le Lay).</para></listitem> </itemizedlist> </listitem> Modified: plugins/XML/trunk/test/build.xml =================================================================== --- plugins/XML/trunk/test/build.xml 2010-08-27 06:42:52 UTC (rev 18426) +++ plugins/XML/trunk/test/build.xml 2010-08-27 06:53:38 UTC (rev 18427) @@ -84,7 +84,7 @@ <!-- this selector holds just one test. This is optional. --> <selector id="testcases.current"> - <filename name="xml/XmlPluginTest.java"/> + <filename name="xml/SchemaMappingManagerTest.java"/> </selector> <!-- this selector controls which tests to run, set the refid to either Modified: plugins/XML/trunk/test/xml/SchemaMappingManagerTest.java =================================================================== --- plugins/XML/trunk/test/xml/SchemaMappingManagerTest.java 2010-08-27 06:42:52 UTC (rev 18426) +++ plugins/XML/trunk/test/xml/SchemaMappingManagerTest.java 2010-08-27 06:53:38 UTC (rev 18427) @@ -169,6 +169,12 @@ listen.waitForMessage(10000); try{t.join();}catch(InterruptedException ie){} + + // XmlPlugin is not activated for some reason ?? + action("sidekick.parser.xml-switch"); + parseAndWait(); + FrameFixture sidekick = TestUtils.findFrameByTitle("Sidekick"); + sidekick.close(); assertThat(new File(relax_ng,"schemas.xml")).exists(); Modified: plugins/XML/trunk/test/xml/TagUtilsTest.java =================================================================== --- plugins/XML/trunk/test/xml/TagUtilsTest.java 2010-08-27 06:42:52 UTC (rev 18426) +++ plugins/XML/trunk/test/xml/TagUtilsTest.java 2010-08-27 06:53:38 UTC (rev 18427) @@ -78,11 +78,7 @@ // after bbbb - GuiActionRunner.execute(new GuiTask(){ - protected void executeInEDT(){ - TestUtils.view().getTextArea().setCaretPosition(48); - } - }); + gotoPositionAndWait(48); action("xml-split-tag",1); assertEquals("<a> bbbb</a>",b.getLineText(1)); @@ -90,11 +86,7 @@ // just after <a> : was causing an issue since split() believed that it was // inside <a> - GuiActionRunner.execute(new GuiTask(){ - protected void executeInEDT(){ - TestUtils.view().getTextArea().setCaretPosition(43); - } - }); + gotoPositionAndWait(43); action("xml-split-tag",1); assertEquals("<a></a>",b.getLineText(1)); @@ -103,11 +95,7 @@ // just after </b> : was causing an issue since split() believed that it was // inside <a> - GuiActionRunner.execute(new GuiTask(){ - protected void executeInEDT(){ - TestUtils.view().getTextArea().setCaretPosition(56); - } - }); + gotoPositionAndWait(56); action("xml-split-tag",1); assertEquals("<b></b></a>",b.getLineText(2)); @@ -128,22 +116,14 @@ // <c:c |xmlns:c="urn:hello">you could - GuiActionRunner.execute(new GuiTask(){ - protected void executeInEDT(){ - TestUtils.view().getTextArea().setCaretPosition(62); - } - }); + gotoPositionAndWait(62); action("xml-split-tag"); String text = b.getText(0,b.getLength()); action("undo",1); assertThat(text).contains("xmlns:c"); - GuiActionRunner.execute(new GuiTask(){ - protected void executeInEDT(){ - TestUtils.view().getTextArea().setCaretPosition(131); - } - }); + gotoPositionAndWait(131); action("xml-split-tag"); text = b.getText(0,b.getLength()); @@ -151,11 +131,7 @@ assertThat(text).contains("<"); // <simple |a="1" b="2" - GuiActionRunner.execute(new GuiTask(){ - protected void executeInEDT(){ - TestUtils.view().getTextArea().setCaretPosition(204); - } - }); + gotoPositionAndWait(204); action("xml-split-tag"); assertEquals(" c = \"3\"",b.getLineText(9)); Modified: plugins/XML/trunk/test/xml/XmlPluginTest.java =================================================================== --- plugins/XML/trunk/test/xml/XmlPluginTest.java 2010-08-27 06:42:52 UTC (rev 18426) +++ plugins/XML/trunk/test/xml/XmlPluginTest.java 2010-08-27 06:53:38 UTC (rev 18427) @@ -24,7 +24,8 @@ import org.fest.swing.finder.*; import org.fest.swing.edt.*; import org.fest.swing.timing.*; - +import org.fest.swing.driver.*; +import org.fest.swing.cell.*; import static org.fest.assertions.Assertions.*; import org.gjt.sp.jedit.testframework.Log; @@ -43,6 +44,7 @@ import java.io.*; +import java.awt.Component; import java.awt.event.KeyEvent; import java.awt.event.InputEvent; import org.gjt.sp.jedit.gui.CompletionPopup; @@ -86,19 +88,16 @@ // go into the file gotoPositionAndWait(530); - assertThat(insert.list("elements").contents()).contains("ipo:shipComment"); - assertThat(insert.list("elements").contents()).excludes("ipo:comment").excludes("comment"); - assertThat(insert.list("elements").contents()).excludes("ipo:otherComment").excludes("otherComment"); - assertThat(insert.list("elements").contents()).contains("ipo:concreteOtherComment"); + assertThat(xmlListContents(insert.list("elements"))).contains("ipo:shipComment"); + assertThat(xmlListContents(insert.list("elements"))).excludes("ipo:comment").excludes("comment"); + assertThat(xmlListContents(insert.list("elements"))).excludes("ipo:otherComment").excludes("otherComment"); + assertThat(xmlListContents(insert.list("elements"))).contains("ipo:concreteOtherComment"); // go into the customerComment - GuiActionRunner.execute(new GuiTask(){ - protected void executeInEDT(){ - TestUtils.view().getTextArea().setCaretPosition(483); - } - }); + gotoPositionAndWait(483); + Pause.pause(500); - assertThat(insert.list("elements").contents()).contains("customerId"); + assertThat(xmlListContents(insert.list("elements"))).contains("customerId"); insert.close(); } @@ -122,7 +121,7 @@ JWindowFixture completion = XMLTestUtils.completionPopup(); completion.requireVisible(); - assertThat(completion.list().contents()).containsOnly("aa","ab"); + assertThat(xmlListContents(completion.list())).containsOnly("aa","ab"); completion.list().pressAndReleaseKeys(KeyEvent.VK_ESCAPE); Pause.pause(500); @@ -143,7 +142,7 @@ completion = XMLTestUtils.completionPopup(); completion.requireVisible(); - assertThat(completion.list().contents()).containsOnly("aa","ab"); + assertThat(xmlListContents(completion.list())).containsOnly("aa","ab"); completion.list().pressAndReleaseKeys(KeyEvent.VK_ESCAPE); Pause.pause(500); @@ -153,7 +152,7 @@ completion = XMLTestUtils.completionPopup(); completion.requireVisible(); - assertThat(completion.list().contents()).containsOnly("aa","ab"); + assertThat(xmlListContents(completion.list())).containsOnly("aa","ab"); completion.list().pressAndReleaseKeys(KeyEvent.VK_ESCAPE); Pause.pause(500); @@ -234,9 +233,9 @@ gotoPositionAndWait(341); // entities declared in the root document appear here - assertThat(insert.list("entities").contents()).contains("frag2"); + assertThat(xmlListContents(insert.list("entities"))).contains("frag2"); // ids declared in other fragment appear heare - assertThat(insert.list("ids").contents()).contains("testing [element: <chapter>]"); + assertThat(xmlListContents(insert.list("ids"))).contains("testing [element: <chapter>]"); insert.list("ids").item("testing [element: <chapter>]").click(MouseButton.RIGHT_BUTTON); @@ -299,7 +298,7 @@ gotoPositionAndWait(151); action("xml-insert-float",1); FrameFixture insert = TestUtils.findFrameByTitle("XML Insert"); - assertThat(insert.list("elements").contents()).containsOnly("ACTION"); + assertThat(xmlListContents(insert.list("elements"))).containsOnly("ACTION"); insert.close(); gotoPositionAndWait(244); @@ -307,7 +306,7 @@ // inside CODE action("xml-insert-float",1); insert = TestUtils.findFrameByTitle("XML Insert"); - assertThat(insert.list("elements").contents()).isEmpty(); + assertThat(xmlListContents(insert.list("elements"))).isEmpty(); insert.close(); } @@ -366,15 +365,11 @@ assertTrue("got '"+selected+"'",selected.contains("<CODDE")); // inside ACTIONS - GuiActionRunner.execute(new GuiTask(){ - protected void executeInEDT(){ - TestUtils.view().getTextArea().setCaretPosition(219); - } - }); + gotoPositionAndWait(219); action("xml-insert-float",1); FrameFixture insert = TestUtils.findFrameByTitle("XML Insert"); - assertThat(insert.list("elements").contents()).containsOnly("ACTION"); + assertThat(xmlListContents(insert.list("elements"))).containsOnly("ACTION"); insert.close(); gotoPositionAndWait(286); @@ -382,7 +377,7 @@ // inside CODE action("xml-insert-float",1); insert = TestUtils.findFrameByTitle("XML Insert"); - assertThat(insert.list("elements").contents()).isEmpty(); + assertThat(xmlListContents(insert.list("elements"))).isEmpty(); insert.close(); xml = new File(testData,"relax_ng/actions_valid.xml"); @@ -423,7 +418,7 @@ action("xml-insert-float",1); FrameFixture insert = TestUtils.findFrameByTitle("XML Insert"); - assertThat(insert.list("elements").contents()).containsOnly("ACTION"); + assertThat(xmlListContents(insert.list("elements"))).containsOnly("ACTION"); insert.close(); } @@ -442,7 +437,7 @@ action("xml-insert-float",1); FrameFixture insert = TestUtils.findFrameByTitle("XML Insert"); - assertThat(insert.list("elements").contents()).containsOnly("p","table"); + assertThat(xmlListContents(insert.list("elements"))).containsOnly("p","table"); insert.close(); // inside td @@ -450,7 +445,7 @@ action("xml-insert-float",1); insert = TestUtils.findFrameByTitle("XML Insert"); - assertThat(insert.list("elements").contents()).containsOnly("em"); + assertThat(xmlListContents(insert.list("elements"))).containsOnly("em"); insert.close(); } @@ -480,7 +475,7 @@ // inside body gotoPositionAndWait(166); - assertThat(insert.list("elements").contents()).contains("ACTION"); + assertThat(xmlListContents(insert.list("elements"))).contains("ACTION"); insert.close(); } @@ -512,12 +507,12 @@ // inside body gotoPositionAndWait(208); - assertThat(insert.list("elements").contents()).isEmpty(); + assertThat(xmlListContents(insert.list("elements"))).isEmpty(); // inside second comment (succeeds now !) gotoPositionAndWait(276); - assertThat(insert.list("elements").contents()).contains("p"); + assertThat(xmlListContents(insert.list("elements"))).contains("p"); // demonstrate a limitation of local scope when Sidekick tree becomes // out of sync : no completion is available because the parent <comment> @@ -530,7 +525,7 @@ gotoPositionAndWait(376); - assertThat(insert.list("elements").contents()).isEmpty(); + assertThat(xmlListContents(insert.list("elements"))).isEmpty(); insert.close(); @@ -542,7 +537,7 @@ File xml = new File(testData,"import_schema/instance.xml"); - TestUtils.openFile(xml.getPath()); + final Buffer b = TestUtils.openFile(xml.getPath()); action("xml-insert-float",1); FrameFixture insert = TestUtils.findFrameByTitle("XML Insert"); @@ -566,22 +561,22 @@ gotoPositionAndWait(391); // fails for the moment - assertThat(insert.list("elements").contents()).contains("ipo:comment"); + assertThat(xmlListContents(insert.list("elements"))).contains("ipo:comment"); gotoPositionAndWait(472); // inside ipo:comment - assertThat(insert.list("elements").contents()).isEmpty(); + assertThat(xmlListContents(insert.list("elements"))).isEmpty(); insert.close(); - + close(view(),b); } @Test public void testImportSchemaRNG(){ File xml = new File(testData,"import_schema/relax_ng/instance.xml"); - TestUtils.openFile(xml.getPath()); + final Buffer b = TestUtils.openFile(xml.getPath()); parseAndWait(); @@ -602,14 +597,16 @@ gotoPositionAndWait(320); // fails for the moment - assertThat(insert.list("elements").contents()).contains("ipo:comment"); + assertThat(xmlListContents(insert.list("elements"))).contains("ipo:comment"); gotoPositionAndWait(391); // inside ipo:comment - assertThat(insert.list("elements").contents()).isEmpty(); + assertThat(xmlListContents(insert.list("elements"))).isEmpty(); insert.close(); + + close(view(),b); } @Test @@ -617,19 +614,84 @@ File xml = new File(testData,"malformed/actions.xml"); - TestUtils.openFile(xml.getPath()); + final Buffer b = TestUtils.openFile(xml.getPath()); - action("xml-insert-float",1); - FrameFixture insert = TestUtils.findFrameByTitle("XML Insert"); - + // XmlPlugin is not activated for some reason ?? + action("sidekick.parser.xml-switch"); parseAndWait(); // inside ACTIONS gotoPositionAndWait(731); - assertThat(insert.list("elements").contents()).contains("ACTION"); + action("xml-insert-float",1); + FrameFixture insert = TestUtils.findFrameByTitle("XML Insert"); + + assertThat(xmlListContents(insert.list("elements"))).contains("ACTION"); insert.close(); + + close(view(),b); + FrameFixture sidekick = TestUtils.findFrameByTitle("Sidekick"); + sidekick.close(); + + } + + @Test + public void testDTDWithXSD(){ + File xml = new File(testData,"dtd/dtdwithxsd.xml"); + + final Buffer b = TestUtils.openFile(xml.getPath()); + + action("xml-insert-float",1); + FrameFixture insert = TestUtils.findFrameByTitle("XML Insert"); + + // will be prompted to download docbook.xsd + ClickT clickT = new ClickT(Option.NO); + clickT.start(); + + parseAndWait(); + clickT.waitForClick(); + // inside ACTIONS + gotoPositionAndWait(783); + + assertThat(xmlListContents(insert.list("entities"))).contains("ecirc"); + assertThat(xmlListContents(insert.list("entities"))).excludes("ang"); + + insert.close(); + + GuiActionRunner.execute(new GuiTask(){ + protected void executeInEDT(){ + b.insert(538, "\n%isoamso;"); + } + }); + + parseAndWait(); + gotoPositionAndWait(795); + + action("xml-insert-float",1); + insert = TestUtils.findFrameByTitle("XML Insert"); + + assertThat(xmlListContents(insert.list("entities"))).contains("ang"); + + insert.close(); + close(view(),b); } + + private static final JListCellReader instance = new BasicJListCellReader( + new CellRendererReader(){ + public String valueFrom(Component c) { + if(c instanceof XmlListCellRenderer){ + return ((XmlListCellRenderer)c).getMainText(); + }else return null; + } + }); + + public static JListCellReader xmlListCellReader(){ + return instance; + } + + public static String[] xmlListContents(JListFixture list){ + return list.cellReader(xmlListCellReader()).contents(); + } } Modified: plugins/XML/trunk/test_data/dtd/dtdwithxsd.xml =================================================================== --- plugins/XML/trunk/test_data/dtd/dtdwithxsd.xml 2010-08-27 06:42:52 UTC (rev 18426) +++ plugins/XML/trunk/test_data/dtd/dtdwithxsd.xml 2010-08-27 06:53:38 UTC (rev 18427) @@ -2,6 +2,10 @@ <!DOCTYPE article [ <!ENTITY % isolat1 PUBLIC "ISO 8879:1986//ENTITIES Added Latin 1//EN//XML" "http://www.oasis-open.org/docbook/xmlcharent/0.3/iso-lat1.ent" > <!ENTITY % isogrk1 PUBLIC "ISO 8879:1986//ENTITIES Greek Letters//EN//XML" "http://www.oasis-open.org/docbook/xmlcharent/0.3/iso-grk1.ent" > + <!ENTITY % isoamso PUBLIC + "ISO 8879:1986//ENTITIES Added Math Symbols: Ordinary//EN//XML" + "http://www.w3.org/2003/entities/iso8879/isoamso.ent" + > %isolat1; %isogrk1; ]> Modified: plugins/XML/trunk/xml/XmlActions.java =================================================================== --- plugins/XML/trunk/xml/XmlActions.java 2010-08-27 06:42:52 UTC (rev 18426) +++ plugins/XML/trunk/xml/XmlActions.java 2010-08-27 06:53:38 UTC (rev 18427) @@ -131,7 +131,7 @@ st.ordinaryChar('/'); st.ordinaryChar('='); - Map entityHash = data.getNoNamespaceCompletionInfo().entityHash; + Map entityHash = data.entityHash; //{{{ parse tag try @@ -993,7 +993,7 @@ XmlParsedData data = (XmlParsedData)_data; - Map entityHash = data.getNoNamespaceCompletionInfo().entityHash; + Map entityHash = data.entityHash; Selection[] selection = textArea.getSelection(); for(int i = 0; i < selection.length; i++) @@ -1053,7 +1053,7 @@ XmlParsedData data = (XmlParsedData)_data; - Map entityHash = data.getNoNamespaceCompletionInfo().entityHash; + Map entityHash = data.entityHash; Selection[] selection = textArea.getSelection(); for(int i = 0; i < selection.length; i++) Modified: plugins/XML/trunk/xml/XmlInsert.java =================================================================== --- plugins/XML/trunk/xml/XmlInsert.java 2010-08-27 06:42:52 UTC (rev 18426) +++ plugins/XML/trunk/xml/XmlInsert.java 2010-08-27 06:53:38 UTC (rev 18427) @@ -202,7 +202,7 @@ else { XmlParsedData data = (XmlParsedData)_data; - setDeclaredEntities(data.getNoNamespaceCompletionInfo().entities); + setDeclaredEntities(data.entities); setDeclaredIDs(data.ids); html = data.html; } Modified: plugins/XML/trunk/xml/XmlListCellRenderer.java =================================================================== --- plugins/XML/trunk/xml/XmlListCellRenderer.java 2010-08-27 06:42:52 UTC (rev 18426) +++ plugins/XML/trunk/xml/XmlListCellRenderer.java 2010-08-27 06:53:38 UTC (rev 18427) @@ -18,11 +18,14 @@ //{{{ Imports import javax.swing.*; import java.awt.Component; +import java.awt.BorderLayout; +import java.awt.Rectangle; import xml.completion.*; import xml.completion.ElementDecl.AttributeDecl; //}}} -public class XmlListCellRenderer extends DefaultListCellRenderer +/** displays an icon corresponding to the kind of item and a preview for entities. */ +public class XmlListCellRenderer extends JPanel implements ListCellRenderer { public static final XmlListCellRenderer INSTANCE = new XmlListCellRenderer(); @@ -43,6 +46,19 @@ XmlListCellRenderer.class.getResource("/xml/ID.png")); //}}} + private DefaultListCellRenderer left; + private DefaultListCellRenderer right; + + public XmlListCellRenderer() + { + left = new DefaultListCellRenderer(); + right = new DefaultListCellRenderer(); + setLayout(new BorderLayout()); + right.setHorizontalAlignment(SwingConstants.TRAILING); + add(left,BorderLayout.LINE_START); + add(right,BorderLayout.LINE_END); + } + //{{{ getListCellRendererComponent() method public Component getListCellRendererComponent( JList list, @@ -51,60 +67,134 @@ boolean isSelected, boolean cellHasFocus) { - super.getListCellRendererComponent(list,null,index, + left.getListCellRendererComponent(list,null,index, isSelected,cellHasFocus); - + right.getListCellRendererComponent(list,null,index, + isSelected,cellHasFocus); + setBackground(left.getBackground()); + setBorder(left.getBorder()); + left.setBorder(null); + right.setBorder(null); if(value instanceof Comment) { - setIcon(COMMENT_ICON); - setText("!--"); + left.setIcon(COMMENT_ICON); + left.setText("!--"); } else if(value instanceof CDATA) { - setIcon(CDATA_ICON); - setText("![CDATA["); + left.setIcon(CDATA_ICON); + left.setText("![CDATA["); } else if(value instanceof ClosingTag) { - setIcon(ELEMENT_ICON); - setText("/" + ((ClosingTag)value).name); + left.setIcon(ELEMENT_ICON); + left.setText("/" + ((ClosingTag)value).name); } else if(value instanceof ElementDecl) { ElementDecl element = (ElementDecl)value; - setIcon(element.empty ? EMPTY_ELEMENT_ICON : ELEMENT_ICON); - setText(element.name); + left.setIcon(element.empty ? EMPTY_ELEMENT_ICON : ELEMENT_ICON); + left.setText(element.name); } /* Add a case for AttribDecl */ else if(value instanceof AttributeDecl) { AttributeDecl ad = (AttributeDecl)value; - setText(ad.name); + left.setText(ad.name); } else if(value instanceof EntityDecl) { EntityDecl entity = (EntityDecl)value; - setIcon(entity.type == EntityDecl.INTERNAL + left.setIcon(entity.type == EntityDecl.INTERNAL ? INTERNAL_ENTITY_ICON : EXTERNAL_ENTITY_ICON); - setText(entity.name); + String entityValue = entity.value; + if(entityValue==null) + { + entityValue = entity.publicId; + if(entityValue == null) + entityValue = entity.systemId; + } + if(entityValue == null) + { + right.setText(""); + } + else + { + if(entityValue.length() > 60) + { + entityValue = entityValue.substring(0,30)+"..."+entityValue.substring(entityValue.length()-20); + } + right.setText(" "+entityValue); + } + left.setText(entity.name); } else if(value instanceof IDDecl) { - setIcon(ID_ICON); + left.setIcon(ID_ICON); // it's toString() already does this cos I'm too // lazy to write a custom renderer for the edit tag // dialog box. - setText(value.toString()); + left.setText(value.toString()); } else /* What is it? Dunno. Try toString(). */ { - setText(value.toString()); - setIcon(null); + left.setText(value.toString()); + left.setIcon(null); } return this; } //}}} + /** @return the name of the tag, comment, etc.*/ + public String getMainText() + { + return left.getText(); + } + + /** @return the preview of the entity or empty string */ + public String getValueText() + { + return right.getText(); + } + + // {{{ Overridden for performance reasons + /** Overridden for performance reasons. */ + public void repaint() {} + + /** Overridden for performance reasons. */ + public void repaint(long tm, int x, int y, int width, int height) {} + + /** Overridden for performance reasons. */ + public void repaint(Rectangle r) {} + + /** Overridden for performance reasons. */ + protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {} + + /** Overridden for performance reasons. */ + public void firePropertyChange(String propertyName, byte oldValue, byte newValue) {} + + /** Overridden for performance reasons. */ + public void firePropertyChange(String propertyName, char oldValue, char newValue) {} + + /** Overridden for performance reasons. */ + public void firePropertyChange(String propertyName, short oldValue, short newValue) {} + + /** Overridden for performance reasons. */ + public void firePropertyChange(String propertyName, int oldValue, int newValue) {} + + /** Overridden for performance reasons. */ + public void firePropertyChange(String propertyName, long oldValue, long newValue) {} + + /** Overridden for performance reasons. */ + public void firePropertyChange(String propertyName, float oldValue, float newValue) {} + + /** Overridden for performance reasons. */ + public void firePropertyChange(String propertyName, double oldValue, double newValue) {} + + /** Overridden for performance reasons. */ + public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {} + // }}} + public static class ClosingTag { public String name; Modified: plugins/XML/trunk/xml/XmlParsedData.java =================================================================== --- plugins/XML/trunk/xml/XmlParsedData.java 2010-08-27 06:42:52 UTC (rev 18426) +++ plugins/XML/trunk/xml/XmlParsedData.java 2010-08-27 06:53:38 UTC (rev 18427) @@ -39,6 +39,7 @@ import xml.completion.CompletionInfo; import xml.completion.ElementDecl; +import xml.completion.EntityDecl; import xml.completion.IDDecl; import xml.parser.TagParser; import xml.parser.XmlTag; @@ -84,9 +85,25 @@ */ public List<IDDecl> ids; + public List<EntityDecl> entities; + public Map entityHash; + + /** entities are added to the noNamespaceCompletionInfo, so if a schema is used + * on top of DTD, the entities are lost. + * To prevent this, the entities are copied into the parsed data + */ public void setCompletionInfo(String namespace, CompletionInfo info) { if(namespace == null)namespace = ""; mappings.put(namespace, info); + + // if this append, should remove entities declared in this CompletionInfo + // and nowhere else. + if(info == null)throw new UnsupportedOperationException("setCompletionInfo("+namespace+",null"); + for(EntityDecl en : info.entities) + { + // avoid duplicates of <, & etc. + if(!entityHash.containsKey(en.name)) addEntity(en); + } } //{{{ XmlParsedData constructor @@ -97,6 +114,8 @@ mappings = new HashMap<String, CompletionInfo>(); ids = new ArrayList<IDDecl>(); allNamespacesBindingsAtTop = true; + entities = new ArrayList<EntityDecl>(); + entityHash = new HashMap(); } //}}} //{{{ getNoNamespaceCompletionInfo() method @@ -785,6 +804,19 @@ } //}}} + //{{{ addEntity() method + public void addEntity(EntityDecl entity) + { + entities.add(entity); + if(entity.type == EntityDecl.INTERNAL + && entity.value.length() == 1) + { + Character ch = new Character(entity.value.charAt(0)); + entityHash.put(entity.name, ch); + entityHash.put(ch, entity.name); + } + } //}}} + //{{{ Private members //{{{ getElementPrefix() method Modified: plugins/XML/trunk/xml/parser/XercesParserImpl.java =================================================================== --- plugins/XML/trunk/xml/parser/XercesParserImpl.java 2010-08-27 06:42:52 UTC (rev 18426) +++ plugins/XML/trunk/xml/parser/XercesParserImpl.java 2010-08-27 06:53:38 UTC (rev 18427) @@ -428,6 +428,9 @@ /** used to retrieve CompletionInfos for different namespaces (RNG) */ SchemaAutoLoader schemaAutoLoader; + /** used to register entities with the XmlParsedData at endDTD() */ + CompletionInfo dtdCompletionInfo; + // }}} // {{{ Handler constructor Handler(Buffer buffer, String text, ErrorListErrorHandler errorHandler, @@ -440,7 +443,7 @@ this.currentNodeStack = new Stack<DefaultMutableTreeNode>(); this.empty = true; this.schemaAutoLoader = null; - + this.dtdCompletionInfo = null; } // }}} private void setSchemaAutoLoader(SchemaAutoLoader sal){ @@ -554,7 +557,7 @@ for(Map.Entry<String,CompletionInfo> en: infos.entrySet()){ String nsC = en.getKey(); Log.log(Log.DEBUG,Handler.class,"setting completion info for :'"+nsC+"'"); - data.setCompletionInfo(nsC, en.getValue()); + data.setCompletionInfo(nsC,en.getValue()); } } @@ -575,8 +578,7 @@ && schemaAutoLoader.getCompletionInfo() != null && schemaAutoLoader.getCompletionInfo().containsKey("")) { - data.setCompletionInfo("", - schemaAutoLoader.getCompletionInfo().get("")); + data.setCompletionInfo("",schemaAutoLoader.getCompletionInfo().get("")); // TODO: what about no-namespace ? } @@ -766,6 +768,7 @@ { // DTD in the document itself, don't cache it as it will parsed again anyway if(DEBUG_CACHE)Log.log(Log.DEBUG,Handler.class,"DTD in the document, not caching"); + dtdCompletionInfo = data.getNoNamespaceCompletionInfo(); } else { @@ -776,14 +779,16 @@ if(ce == null) { if(DEBUG_CACHE)Log.log(Log.DEBUG,Handler.class,"CompletionInfo not in cache for DTD, caching"); - ce = Cache.instance().put(realLocation,COMPLETION_INFO_CACHE_ENTRY,data.getNoNamespaceCompletionInfo()); + dtdCompletionInfo = data.getNoNamespaceCompletionInfo(); + ce = Cache.instance().put(realLocation,COMPLETION_INFO_CACHE_ENTRY,dtdCompletionInfo); ce.getRequestingBuffers().add(buffer); } else { if(DEBUG_CACHE)Log.log(Log.DEBUG,Handler.class,"CompletionInfo in cache for DTD, reusing"); ce.getRequestingBuffers().add(buffer); - data.setCompletionInfo("", (CompletionInfo)ce.getCachedItem()); + dtdCompletionInfo = (CompletionInfo)ce.getCachedItem(); + data.setCompletionInfo("", dtdCompletionInfo); } } catch(IOException ioe) @@ -794,6 +799,17 @@ } //}}} + //{{{ endDTD() method + /** + * register the entities in XmlParsedData + */ + @Override + public void endDTD() + { + data.setCompletionInfo("", dtdCompletionInfo); + } + //}}} + //{{{ elementDecl() method public void elementDecl(String name, String model) { @@ -851,6 +867,7 @@ //{{{ internalEntityDecl() method public void internalEntityDecl(String name, String value) { + if(DEBUG_DTD)Log.log(Log.DEBUG,XercesParserImpl.class,"internalEntityDecl("+name+","+value+")"); // this is a bit of a hack if(name.startsWith("%")) return; @@ -863,6 +880,7 @@ public void externalEntityDecl(String name, String publicId, String systemId) { + if(DEBUG_DTD)Log.log(Log.DEBUG,XercesParserImpl.class,"externalEntityDecl("+name+","+publicId+","+systemId+")"); if(name.startsWith("%")) return; Modified: plugins/XML/trunk/xml/parser/XmlParser.java =================================================================== --- plugins/XML/trunk/xml/parser/XmlParser.java 2010-08-27 06:42:52 UTC (rev 18426) +++ plugins/XML/trunk/xml/parser/XmlParser.java 2010-08-27 06:53:38 UTC (rev 18427) @@ -281,12 +281,14 @@ } else if (mode == ENTITY_COMPLETE) { - List<EntityDecl> completions = data.getNoNamespaceCompletionInfo().entities; + List<EntityDecl> completions = data.entities; for(int i = 0; i < completions.size(); i++) { EntityDecl entity = completions.get(i); if(entity.name.startsWith(word)) + { allowedCompletions.add(entity); + } } } else if (mode == ATTRIB_COMPLETE) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |