Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   *
   * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
   *
   * The contents of this file are subject to the terms of either the GNU
   * General Public License Version 2 only ("GPL") or the Common
   * Development and Distribution License("CDDL") (collectively, the
   * "License"). You may not use this file except in compliance with the
  * License. You can obtain a copy of the License at
  * http://www.netbeans.org/cddl-gplv2.html
  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
  * specific language governing permissions and limitations under the
  * License.  When distributing the software, include this License Header
  * Notice in each file and include the License file at
  * nbbuild/licenses/CDDL-GPL-2-CP.  Sun designates this
  * particular file as subject to the "Classpath" exception as provided
  * by Sun in the GPL Version 2 section of the License file that
  * accompanied this code. If applicable, add the following below the
  * License Header, with the fields enclosed by brackets [] replaced by
  * your own identifying information:
  * "Portions Copyrighted [year] [name of copyright owner]"
  *
  * Contributor(s):
  *
  * The Original Software is NetBeans. The Initial Developer of the Original
  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
  * Microsystems, Inc. All Rights Reserved.
  *
  * If you wish your version of this file to be governed by only the CDDL
  * or only the GPL Version 2, indicate your decision by adding
  * "[Contributor] elects to include this software in this distribution
  * under the [CDDL or GPL Version 2] license." If you do not indicate a
  * single choice of license, a recipient has the option to distribute
  * your version of this file under either the CDDL, the GPL Version 2 or
  * to extend the choice of license to its licensees as provided above.
  * However, if you add GPL Version 2 code and therefore, elected the GPL
  * Version 2 license, then the option applies only if the new code is
  * made subject to such option by the copyright holder.
  */
 package org.netbeans.modules.vmd.api.codegen;
 
 

Author(s):
David Kaspar
 
 public final class MultiGuardedSection {
 
     // TODO - no other guarded-section (besides MultiGuardedSection) must start with '|' character
     // TODO - add support for deleting whole MultiGuardedSection
 
     private StyledDocument document;
     private String multiGuardedID;
 
     private ArrayList<StringeditableSectionIDs = new ArrayList<String> ();
     private int index = 0;
     private boolean guarded = true;
     private CodeWriter writer;
 
     private MultiGuardedSection (StyledDocument documentString multiGuardedID) {
         assert multiGuardedID.indexOf ('|') < 0;
         this. = document;
         this. = multiGuardedID;
         initialize ();
         JavaCodeGenerator.getDefault ().registerUsedMultiGuardedSection (documentthis);
     }
 
     private void initialize () {
         GuardedSectionManager instance = GuardedSectionManager.getInstance ();
         Iterable<GuardedSectionallSections = instance.getGuardedSections ();
         // TODO - check if any other section of multiGuardedID is still there
         for (; ;) {
             String prefix = createSectionID (.size (), null);
             SimpleSection section = CodeUtils.findSectionByPrefix (allSectionsprefix);
             if (section == null)
                 break;
             String editableSectionID = section.getName ().substring (prefix.length ());
             addSection (sectioneditableSectionID);
         }
         if (.size () <= 0) {
             String sectionID = createSectionID (0, null);
             addSection (CodeUtils.createSimpleSectionAfter (, CodeUtils.findLast (allSections), sectionID), null);
         }
     }
 
    public void switchToGuarded () {
        if ( < 0)
            throw Debug.illegalState ("Section is closed already"); // NOI18N
        if ()
            throw Debug.illegalState ("Cannot switch to guarded from guarded"); // NOI18N
        if (! isWriterCommitted ())
            throw Debug.illegalState ("Writer is not committed yet"); // NOI18N
         = null;
         ++;
         = ! ;
    }
    public void switchToEditable (String editableSectionID) {
        if ( < 0)
            throw Debug.illegalState ("Section is already closed"); // NOI18N
        if (! )
            throw Debug.illegalState ("Cannot switch from editable to editable"editableSectionID); // NOI18N
        if (! isWriterCommitted ())
            throw Debug.illegalState ("Writer is not committed yet"); // NOI18N
         = null;
        if ( + 1 >= .size ()) {
            GuardedSection last = CodeUtils.findLast ();
            String sectionID = createSectionID (.size (), null);
            SimpleSection newGuardedSection = CodeUtils.createSimpleSectionAfter (lastsectionID);
            addSection (newGuardedSectionnull);
        }
        .set (editableSectionID);
         = ! ;
    }
    public CodeWriter getWriter () {
        if ( < 0)
            throw Debug.illegalState ("Section is closed already"); // NOI18N
        if ( == null) {
            if () {
                 = new CodeWriter (.get ());
            } else {
                String editableID = .get ();
                 = new CodeWriter (.get (), .get ( + 1), JavaCodeGenerator.getDefault ().getUserCode (editableID));
            }
        }
        return ;
    }
    public void close () {
        if ( < 0)
            throw Debug.illegalState ("Section is closed already"); // NOI18N
        if (!   ||  ! isWriterCommitted ())
            throw Debug.illegalState ("Cannot close - last section is not properly commited"isWriterCommitted ()); // NOI18N
        int size = .size ();
        if (size > 0)
            .set (size - 1, ""); // NOI18N
        for (int a = 0; a < sizea ++)
            try {
                .get (a).setName (createSectionID (a.get (a)));
            } catch (PropertyVetoException e) {
                throw Debug.error (e);
            }
        Position begin = .get ().getEndPosition ();
        Position end = .get (size - 1).getEndPosition ();
        for (int a =  + 1; a < sizea ++)
            .get (a).removeSection ();
        try {
            // TODO - check if there is no gurded section between begin and end. if so, then do not do anything to prevent data-lost
            .remove (begin.getOffset () + 1, end.getOffset () - (begin.getOffset () + 1));
        } catch (BadLocationException e) {
            throw Debug.error (e);
        }
         = -1;
    }
    public static MultiGuardedSection create (StyledDocument documentString multiGuardedID) {
        return multiGuardedID != null ? new MultiGuardedSection (documentmultiGuardedID) : null;
    }
        return ;
    }
    private void addSection (SimpleSection sectionString editableSectionID) {
        .add (section);
        .add (editableSectionID);
    }
    private String createSectionID (int indexString editableID) {
        return '|' +  + '|' + index + '|' + (editableID != null ? editableID : ""); // NOI18N
    }
    static String createSectionIDPrefix (String multiGuardedID) {
        return '|' + multiGuardedID + '|';
    }
    private static String createSectionID (String multiGuardedIDint indexString editableID) {
        return '|' + multiGuardedID + '|' + index + '|' + (editableID != null ? editableID : ""); // NOI18N
    }
    private boolean isWriterCommitted () {
        return  != null  &&  .isCommitted ();
    }
    public boolean isGuarded () {
        return ;
    }
    public static boolean isPartOfMultiGuardedSection (GuardedSection section) {
        return section.getName ().startsWith ("|"); // NOI18N
    }

    
Parses the section name.

Parameters:
section the guarded section
Returns:
the array of 3 objects: multiGuardedID:String, index:Integer, editableID:String
    static Object[] parsePartOfMultiGuardedSection (GuardedSection section) {
        assert isPartOfMultiGuardedSection (section);
        String name = section.getName ();
        Object[] result = new Object[3];
        int secondSeparator = name.indexOf ('|', 1); // NOI18N
        assert secondSeparator >= 1;
        result[0] = name.substring (1, secondSeparator);
        secondSeparator ++;
        int thirdSeparator = name.indexOf ('|'secondSeparator); // NOI18N
        assert thirdSeparator >= 1;
        result[1] = Integer.parseInt (name.substring (secondSeparatorthirdSeparator));
        thirdSeparator ++;
        result[2] = name.substring (thirdSeparator);
        return result;
    }
    public static boolean matches (GuardedSection sectionString multiGuardedIDint index) {
        Object[] objects = parsePartOfMultiGuardedSection (section);
        return multiGuardedID.equals (objects[0])  &&  index == (Integerobjects[1];
    }
    public static boolean matches (GuardedSection sectionString multiGuardedIDString editableID) {
        Object[] objects = parsePartOfMultiGuardedSection (section);
        return multiGuardedID.equals (objects[0])  &&  editableID.equals (objects[2]);
    }
        GuardedSectionManager instance = GuardedSectionManager.getInstance (document);
        return CodeUtils.findSectionByPrefix (instance.getGuardedSections (), createSectionID ((Stringinfo[0], (Integerinfo[1] + 1, null));
    }
    public static void remove (StyledDocument documentString multiGuardedID) {
        Iterable<GuardedSectionallSections = GuardedSectionManager.getInstance (document).getGuardedSections ();
        // TODO - check if there is any other section in between the guarded-section of multiGuardedID
        ArrayList<SimpleSectionsections = CodeUtils.findSectionsByPrefix (allSections, MultiGuardedSection.createSectionIDPrefix (multiGuardedID));
        CodeUtils.sortSections (sections);
        Iterator<SimpleSectioniterator = sections.iterator ();
        if (! iterator.hasNext ())
            return;
        SimpleSection firstSection = iterator.next ();
        ArrayList<SimpleSectionsectionsBlock = new ArrayList<SimpleSection> ();
        sectionsBlock.add (firstSection);
        int lastIndex = (Integer) MultiGuardedSection.parsePartOfMultiGuardedSection (firstSection)[1];
        while (iterator.hasNext ()) {
            SimpleSection nextSection = iterator.next ();
            int nextIndex = (Integer) MultiGuardedSection.parsePartOfMultiGuardedSection (nextSection)[1];
            if (lastIndex + 1 != nextIndex) {
                removeSectionsBlock (documentsectionsBlock);
                Debug.warning ("Broken multi-guarded-section""Missing sections between"lastIndexnextIndex); // NOI18N
            }
            sectionsBlock.add (nextSection);
            lastIndex = nextIndex;
        }
        removeSectionsBlock (documentsectionsBlock);
    }
    private static void removeSectionsBlock (StyledDocument documentArrayList<SimpleSectionsectionsBlock) {
        Position begin = sectionsBlock.get (0).getStartPosition ();
        Position end = sectionsBlock.get (sectionsBlock.size () - 1).getEndPosition ();
        for (SimpleSection section : sectionsBlock)
            section.removeSection ();
        try {
            document.remove (begin.getOffset (), end.getOffset () - begin.getOffset ());
        } catch (BadLocationException e) {
            ErrorManager.getDefault ().notify (e);
        }
        sectionsBlock.clear ();
    }
New to GrepCode? Check out our FAQ X