Mercurial > projects > dwt-addons
diff dwtx/jface/text/source/projection/ProjectionAnnotationModel.d @ 129:eb30df5ca28b
Added JFace Text sources
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sat, 23 Aug 2008 19:10:48 +0200 |
parents | |
children | c4fb132a086c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dwtx/jface/text/source/projection/ProjectionAnnotationModel.d Sat Aug 23 19:10:48 2008 +0200 @@ -0,0 +1,190 @@ +/******************************************************************************* + * Copyright (c) 2000, 2008 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * Port to the D programming language: + * Frank Benoit <benoit@tionex.de> + *******************************************************************************/ +module dwtx.jface.text.source.projection.ProjectionAnnotationModel; + +import dwt.dwthelper.utils; + +import java.util.Iterator; +import java.util.Map; + +import dwtx.jface.text.BadLocationException; +import dwtx.jface.text.Position; +import dwtx.jface.text.source.Annotation; +import dwtx.jface.text.source.AnnotationModel; + + +/** + * A projection annotation model. It provides methods for modifying the + * expansion state of the managed projection annotations. + * <p> + * Do not subclass. Use it as is. + * </p> + * + * @since 3.0 + * @noextend This class is not intended to be subclassed by clients. + */ +public class ProjectionAnnotationModel : AnnotationModel { + + + /** + * Creates a new, empty projection annotation model. + */ + public ProjectionAnnotationModel() { + } + + /** + * Changes the state of the given annotation to collapsed. An appropriate + * annotation model change event is sent out. + * + * @param annotation the annotation + */ + public void collapse(Annotation annotation) { + if (annotation instanceof ProjectionAnnotation) { + ProjectionAnnotation projection= (ProjectionAnnotation) annotation; + if (!projection.isCollapsed()) { + projection.markCollapsed(); + modifyAnnotation(projection, true); + } + } + } + + /** + * Changes the state of the given annotation to expanded. An appropriate + * annotation model change event is sent out. + * + * @param annotation the annotation + */ + public void expand(Annotation annotation) { + if (annotation instanceof ProjectionAnnotation) { + ProjectionAnnotation projection= (ProjectionAnnotation) annotation; + if (projection.isCollapsed()) { + projection.markExpanded(); + modifyAnnotation(projection, true); + } + } + } + + /** + * Toggles the expansion state of the given annotation. An appropriate + * annotation model change event is sent out. + * + * @param annotation the annotation + */ + public void toggleExpansionState(Annotation annotation) { + if (annotation instanceof ProjectionAnnotation) { + ProjectionAnnotation projection= (ProjectionAnnotation) annotation; + + if (projection.isCollapsed()) + projection.markExpanded(); + else + projection.markCollapsed(); + + modifyAnnotation(projection, true); + } + } + + /** + * Expands all annotations that overlap with the given range and are collapsed. + * + * @param offset the range offset + * @param length the range length + * @return <code>true</code> if any annotation has been expanded, <code>false</code> otherwise + */ + public bool expandAll(int offset, int length) { + return expandAll(offset, length, true); + } + + /** + * Collapses all annotations that overlap with the given range and are collapsed. + * + * @param offset the range offset + * @param length the range length + * @return <code>true</code> if any annotation has been collapse, <code>false</code> + * otherwise + * @since 3.2 + */ + public bool collapseAll(int offset, int length) { + + bool collapsing= false; + + Iterator iterator= getAnnotationIterator(); + while (iterator.hasNext()) { + ProjectionAnnotation annotation= (ProjectionAnnotation) iterator.next(); + if (!annotation.isCollapsed()) { + Position position= getPosition(annotation); + if (position !is null && position.overlapsWith(offset, length) /* || is a delete at the boundary */ ) { + annotation.markCollapsed(); + modifyAnnotation(annotation, false); + collapsing= true; + } + } + } + + if (collapsing) + fireModelChanged(); + + return collapsing; + } + + /** + * Expands all annotations that overlap with the given range and are collapsed. Fires a model change event if + * requested. + * + * @param offset the offset of the range + * @param length the length of the range + * @param fireModelChanged <code>true</code> if a model change event + * should be fired, <code>false</code> otherwise + * @return <code>true</code> if any annotation has been expanded, <code>false</code> otherwise + */ + protected bool expandAll(int offset, int length, bool fireModelChanged) { + + bool expanding= false; + + Iterator iterator= getAnnotationIterator(); + while (iterator.hasNext()) { + ProjectionAnnotation annotation= (ProjectionAnnotation) iterator.next(); + if (annotation.isCollapsed()) { + Position position= getPosition(annotation); + if (position !is null && position.overlapsWith(offset, length) /* || is a delete at the boundary */ ) { + annotation.markExpanded(); + modifyAnnotation(annotation, false); + expanding= true; + } + } + } + + if (expanding && fireModelChanged) + fireModelChanged(); + + return expanding; + } + + /** + * Modifies the annotation model. + * + * @param deletions the list of deleted annotations + * @param additions the set of annotations to add together with their associated position + * @param modifications the list of modified annotations + */ + public void modifyAnnotations(Annotation[] deletions, Map additions, Annotation[] modifications) { + try { + replaceAnnotations(deletions, additions, false); + if (modifications !is null) { + for (int i= 0; i < modifications.length; i++) + modifyAnnotation(modifications[i], false); + } + } catch (BadLocationException x) { + } + fireModelChanged(); + } +}