/** Saves the code folding state into the given memento. */ public void saveCodeFolding(org.eclipse.ui.IMemento memento) { java.util.Iterator<?> annotationIt = projectionAnnotationModel.getAnnotationIterator(); while (annotationIt.hasNext()) { org.eclipse.jface.text.source.projection.ProjectionAnnotation annotation = (org.eclipse.jface.text.source.projection.ProjectionAnnotation) annotationIt.next(); org.eclipse.ui.IMemento annotationMemento = memento.createChild(ANNOTATION); org.eclipse.jface.text.Position position = projectionAnnotationModel.getPosition(annotation); annotationMemento.putBoolean(IS_COLLAPSED, annotation.isCollapsed()); annotationMemento.putInteger(OFFSET, position.offset); annotationMemento.putInteger(LENGTH, position.length); } }
/** * Updates the annotations registered with this editor. * * @param positions */ public void updateFoldingStructure(ArrayList<Position> newPositions) { Map<ProjectionAnnotation, Position> saveAllAnnotations = new HashMap<ProjectionAnnotation, Position>(); saveAllAnnotations.putAll(curAnnotations); try { String setDefaultCollapsedProperty = EclipseUtil.getPreferenceStore().getString(PluginConstants.T24_ALWAYS_COLLAPSE_REGION); boolean setDefaultCollapsed = Boolean.parseBoolean(setDefaultCollapsedProperty); // this will hold the new annotations along // with their corresponding positions Map<ProjectionAnnotation, Position> newAnnotations = new HashMap<ProjectionAnnotation, Position>(); for (int i = 0; i < newPositions.size(); i++) { ProjectionAnnotation an = annotationAlreadyExists((Position) newPositions.get(i)); ProjectionAnnotation annotation; if (an == null) { // The annotation doesn't exist yet, so create it brand new. annotation = new ProjectionAnnotation(); annotation.setRangeIndication(false); annotation.setText("Annotation " + i); if (setDefaultCollapsed) { annotation.markCollapsed(); } else { annotation.markExpanded(); } Position pos = newPositions.get(i); newAnnotations.put(annotation, pos); saveAllAnnotations.put(annotation, pos); } else { if (setDefaultCollapsed) { an.markCollapsed(); } else { an.markExpanded(); } newAnnotations.put(an, newPositions.get(i)); saveAllAnnotations.put(an, newPositions.get(i)); } } Set<ProjectionAnnotation> keys = curAnnotations.keySet(); Iterator<ProjectionAnnotation> keyIt = keys.iterator(); Annotation[] annotations = new Annotation[curAnnotations.size()]; int annotationCount = 0; while (keyIt.hasNext()) { ProjectionAnnotation an = (ProjectionAnnotation) keyIt.next(); annotations[annotationCount++] = an; saveAllAnnotations.remove(an); } if (annotationModel != null) { annotationModel.modifyAnnotations(annotations, newAnnotations, null); } else { createAnnotationModel(); } curAnnotations = saveAllAnnotations; } catch (Exception e) { e.printStackTrace(); } }