On 07/24/2011 06:42 PM, Fabián Mandelbaum wrote:
> Hello Hussein, thanks again for your ideas. It's still not working
> though. I've changed the 'algorithm' and am now marking the whole
> document read-only, and a certain list of elements as read-write (to
> achieve the "read-write islands in a read-only ocean" concept).
I've managed to reproduce the problem. Choosing "read-write islands in
a read-only ocean" rather than "read-write document with some read-only
elements" cannot solve your problem. See below.
>
> The list of r/w elements is provided in an external text file, one ID
> per line, which is read by the extension class constructor. I'm
> pasting the full code fo that class below, and am also including
> screenshots of what I get, and what I expect to get.
>
> I remind you that the document is effectively read-only, with only the
> parts (one in my test doc so far) matching the list of IDs read-write,
> the problem is that there's no visual feedback (appart from the node
> path at the top) on the read-only parts.
>
> Thanks in advance.
XXE's CSS engine does not automatically react to property changes like
it automatically reacts to attribute and/or child element changes. You
need to explicitly invoke DocumentView.rebuildView after you change a
``visual'' property of a node (I mean, which like property readOnly is
rendered in the CSS).
If you add this snippet at the end of your checkingDocument(), this
should solve your problem:
---
import com.xmlmind.xml.doc.DocumentListener;
import com.xmlmind.xmledit.view.DocumentView;
@Override
public void checkingDocument(Document doc, Reason reason,
URL saveAsURL) {
if (Reason.OPEN.equals(reason)) {
...
doc.endEdit();
DocumentListener[] docListeners =
doc.getDocumentListeners(true);
for (DocumentListener docListener : docListeners) {
if (docListener instanceof DocumentView) {
((DocumentView) docListener).rebuildView(doc);
brseak;
}
}
}
}
---
Reference:
*
http://www.xmlmind.com/xmleditor/_distrib/doc/api/com/xmlmind/xml/doc/Document.html#getDocumentListeners(boolean)
*
http://www.xmlmind.com/xmleditor/_distrib/doc/api/com/xmlmind/xmledit/view/DocumentView.html#rebuildView(com.xmlmind.xml.doc.Node)
>
> /**
> * (C) 2011 by NeoDoc SARL. All Rights Reserved
> */
> package biz.neodoc.xxe.nexto;
>
> import java.io.BufferedReader;
> import java.io.File;
> import java.io.FileInputStream;
> import java.io.InputStreamReader;
> import java.net.URL;
> import java.util.ArrayList;
> import java.util.List;
>
> import com.xmlmind.xml.doc.Document;
> import com.xmlmind.xml.doc.Element;
> import com.xmlmind.xml.doc.Traversal;
> import com.xmlmind.xml.name.Name;
> import com.xmlmind.xmleditapp.validatehook.Reason;
> import com.xmlmind.xmleditapp.validatehook.ValidateHookBase;
>
> /**
> * This marks the whole book as read-only, and then marks only
> * specific parts of it as read-write
> *
> * @author fabman
> *
> */
> public class MarkReadWriteParts extends ValidateHookBase {
> // Read-only XXE property
> private static final Name RO_PROP = Name.get(
> "http://www.xmlmind.com/xmleditor/namespace/property",
> "readOnly");
>
> // Identifiers of the items to mark R/W
> private List<String> RW_ITEMS = new ArrayList<String>();
>
> public MarkReadWriteParts() {
> System.out.println("Building up the list of items...");
> List<String> items = new ArrayList<String>();
> try {
> File addOnHome = new
> File(getClass().getProtectionDomain().getCodeSource().getLocation().toURI()).getParentFile();
> BufferedReader breader = new BufferedReader(
> new InputStreamReader(
> new FileInputStream(new
> File(addOnHome, "rwitems.list"))));
> String line;
> while ((line = breader.readLine()) != null) {
> line = line.trim(); // Chop off whitespace
> if (!line.startsWith("#")&& !line.isEmpty()) {
> items.add(line);
> }
> }
> breader.close();
> } catch (Exception ex) {
> System.err.println("Cannot process rwitems.list : " +
> ex.getMessage());
> } finally {
> RW_ITEMS.addAll(items);
> }
> }
>
> @Override
> public void checkingDocument(Document doc, Reason reason, URL
> saveAsURL) {
> if (Reason.OPEN.equals(reason)) {
> final ArrayList<Element> rwItems = new
> ArrayList<Element>();
> Traversal.traverse(doc.getRootElement(), new
> Traversal.HandlerBase() {
> @Override
> public Object enterElement(Element element) {
> if
> (RW_ITEMS.contains(element.getAttribute(Name.XML_ID))) {
> rwItems.add(element);
> }
> return null;
> }
> });
> doc.beginEdit();
> // Mark the whole doc as R/O
> doc.getRootElement().putProperty(RO_PROP, Boolean.TRUE);
> // Mark specific parts as R/W
> for (Element rwItem: rwItems) {
> rwItem.putProperty(RO_PROP, Boolean.FALSE);
> }
> doc.endEdit();
> }
> }
>
> }
>
--
XMLmind XML Editor Support List
[email protected]
http://www.xmlmind.com/mailman/listinfo/xmleditor-support