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

Reply via email to