Methods Summary |
---|
protected javax.swing.text.View | createZone(int p0, int p1)Create a view to represent a zone for the given
range within the model (which should be within
the range of this objects responsibility). This
is called by the zone management logic to create
new zones. Subclasses can provide a different
implementation for a zone by changing this method.
Document doc = getDocument();
View zone = null;
try {
zone = new Zone(getElement(),
doc.createPosition(p0),
doc.createPosition(p1));
} catch (BadLocationException ble) {
// this should puke in some way.
throw new StateInvariantError(ble.getMessage());
}
return zone;
|
int | getDesiredZoneEnd(int pos)Returns the zone position to use for the
end of a zone that starts at the given
position. By default this returns something
close to half the max zone size.
Element elem = getElement();
int index = elem.getElementIndex(pos + (maxZoneSize / 2));
Element child = elem.getElement(index);
int offs0 = child.getStartOffset();
int offs1 = child.getEndOffset();
if ((offs1 - pos) > maxZoneSize) {
if (offs0 > pos) {
return offs0;
}
}
return offs1;
|
public int | getMaxZonesLoaded()Get the current setting of the number of zones
allowed to be loaded at the same time.
return maxZonesLoaded;
|
public int | getMaximumZoneSize()Get the current maximum zone size.
return maxZoneSize;
|
protected int | getViewIndexAtPosition(int pos)Returns the child view index representing the given position in
the model.
// PENDING(prinz) this could be done as a binary
// search, and probably should be.
int n = getViewCount();
if (pos == getEndOffset()) {
return n - 1;
}
for(int i = 0; i < n; i++) {
View v = getView(i);
if(pos >= v.getStartOffset() &&
pos < v.getEndOffset()) {
return i;
}
}
return -1;
|
void | handleInsert(int pos, int length)
int index = getViewIndex(pos, Position.Bias.Forward);
View v = getView(index);
int offs0 = v.getStartOffset();
int offs1 = v.getEndOffset();
if ((offs1 - offs0) > maxZoneSize) {
splitZone(index, offs0, offs1);
}
|
void | handleRemove(int pos, int length)
// IMPLEMENT
|
public void | insertUpdate(javax.swing.event.DocumentEvent changes, java.awt.Shape a, javax.swing.text.ViewFactory f)Gives notification that something was inserted into the document
in a location that this view is responsible for. This is largely
delegated to the superclass, but is reimplemented to update the
relevant zone (i.e. determine if a zone needs to be split into a
set of 2 or more zones).
handleInsert(changes.getOffset(), changes.getLength());
super.insertUpdate(changes, a, f);
|
protected boolean | isZoneLoaded(javax.swing.text.View zone)Determine if a zone is in the loaded state.
The zones are expected to represent a subset of the
child elements of the element this view is responsible for.
Therefore, the default implementation is to return
true if the view has children.
return (zone.getViewCount() > 0);
|
protected void | loadChildren(javax.swing.text.ViewFactory f)Loads all of the children to initialize the view.
This is called by the setParent method.
This is reimplemented to not load any children directly
(as they are created by the zones). This method creates
the initial set of zones. Zones don't actually get
populated however until an attempt is made to display
them or to do model/view coordinate translation.
// build the first zone.
Document doc = getDocument();
int offs0 = getStartOffset();
int offs1 = getEndOffset();
append(createZone(offs0, offs1));
handleInsert(offs0, offs1 - offs0);
|
public void | removeUpdate(javax.swing.event.DocumentEvent changes, java.awt.Shape a, javax.swing.text.ViewFactory f)Gives notification that something was removed from the document
in a location that this view is responsible for. This is largely
delegated to the superclass, but is reimplemented to update the
relevant zones (i.e. determine if zones need to be removed or
joined with another zone).
handleRemove(changes.getOffset(), changes.getLength());
super.removeUpdate(changes, a, f);
|
public void | setMaxZonesLoaded(int mzl)Sets the current setting of the number of zones
allowed to be loaded at the same time. This will throw an
IllegalArgumentException if mzl is less
than 1.
if (mzl < 1) {
throw new IllegalArgumentException("ZoneView.setMaxZonesLoaded must be greater than 0.");
}
maxZonesLoaded = mzl;
unloadOldZones();
|
public void | setMaximumZoneSize(int size)Set the desired maximum zone size. A
zone may get larger than this size if
a single child view is larger than this
size since zones are formed on child view
boundaries.
maxZoneSize = size;
|
void | splitZone(int index, int offs0, int offs1)Break up the zone at the given index into pieces
of an acceptable size.
// divide the old zone into a new set of bins
Element elem = getElement();
Document doc = elem.getDocument();
Vector zones = new Vector();
int offs = offs0;
do {
offs0 = offs;
offs = Math.min(getDesiredZoneEnd(offs0), offs1);
zones.addElement(createZone(offs0, offs));
} while (offs < offs1);
View oldZone = getView(index);
View[] newZones = new View[zones.size()];
zones.copyInto(newZones);
replace(index, 1, newZones);
|
void | unloadOldZones()
while (loadedZones.size() > getMaxZonesLoaded()) {
View zone = (View) loadedZones.elementAt(0);
loadedZones.removeElementAt(0);
unloadZone(zone);
}
|
protected void | unloadZone(javax.swing.text.View zone)Unload a zone (Convert the zone to its memory saving state).
The zones are expected to represent a subset of the
child elements of the element this view is responsible for.
Therefore, the default implementation is to simple remove
all the children.
//System.out.println("unloading: " + zone.getStartOffset() + "," + zone.getEndOffset());
zone.removeAll();
|
protected boolean | updateChildren(javax.swing.event.DocumentEvent$ElementChange ec, javax.swing.event.DocumentEvent e, javax.swing.text.ViewFactory f)The superclass behavior will try to update the child views
which is not desired in this case, since the children are
zones and not directly effected by the changes to the
associated element. This is reimplemented to do nothing
and return false.
return false;
|
protected void | zoneWasLoaded(javax.swing.text.View zone)Called by a zone when it gets loaded. This happens when
an attempt is made to display or perform a model/view
translation on a zone that was in an unloaded state.
This is imlemented to check if the maximum number of
zones was reached and to unload the oldest zone if so.
//System.out.println("loading: " + zone.getStartOffset() + "," + zone.getEndOffset());
loadedZones.addElement(zone);
unloadOldZones();
|