Как определить узел XML, который изменился в структурированном документе Eclipse? - PullRequest
1 голос
/ 29 июня 2011

В моем собственном плагине Eclipse я могу перехватывать события редактирования в IStructuredDocument с

IStructuredDocumentListener => void regionChanged(RegionChangedEvent event)

или с IModelStateListener => void modelChanged(IStructuredModel model)

Но я не вижу ни одного из них, как я мог узнать, какой узел в DOM изменился.

например, со следующим документом ...

<?xml version="1.0" encoding="UTF-8"?>
<doc>
    <element anAttr="fish">blah</element>
</doc>

Я хотел бы получить событие с соответствующим узлом DOM, если я отредактировал значение anAttr или дочерний текстовый узел element

1 Ответ

1 голос
/ 29 июня 2011

Вот фрагмент кода, который я написал для этой цели:

    final ISourceEditingTextTools sourceEditingTextTools = (ISourceEditingTextTools) this.sourceEditor.getAdapter( ISourceEditingTextTools.class );
    final IDOMSourceEditingTextTools domSourceEditingTextTools = (IDOMSourceEditingTextTools) sourceEditingTextTools;
    final Document document = domSourceEditingTextTools.getDOMDocument();

    final INodeAdapter adapter = new INodeAdapter()
    {
        public boolean isAdapterForType( final Object type )
        {
            return false;
        }

        public void notifyChanged( final INodeNotifier notifier,
                                   final int eventType,
                                   final Object changedFeature,
                                   final Object oldValue,
                                   final Object newValue,
                                   final int pos )
        {
            /* System.err.println( "notifyChanged" );
            System.err.println( "  notifier = " + notifier.getClass().getName() );
            System.err.println( "  eventType = " + eventType );
            System.err.println( "  changedFeature = " + ( changedFeature == null ? "null" : changedFeature.getClass().getName() ) );
            System.err.println( "  oldValue = " + ( oldValue == null ? "null" : oldValue.getClass().getName() ) );
            System.err.println( "  newValue = " + ( newValue == null ? "null" : newValue.getClass().getName() ) );
            System.err.println( "  pos = " + pos ); */

            if( eventType == INodeNotifier.ADD && newValue instanceof IDOMNode )
            {
                addAdapter( (IDOMNode) newValue, this );
            }

            handleXmlNodeChange( (Node) notifier );
        }
    };

    addAdapter( (IDOMNode) document, adapter );

    ...

private static void addAdapter( final IDOMNode node,
                                final INodeAdapter adapter )
{
    node.addAdapter( adapter );

    final NodeList children = node.getChildNodes();

    for( int i = 0, n = children.getLength(); i < n; i++ )
    {
        addAdapter( (IDOMNode) children.item( i ), adapter );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...