org.jopendocument.dom.spreadsheet.TableGroup Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jOpenDocument Show documentation
Show all versions of jOpenDocument Show documentation
jOpenDocument is a free library for developers looking to use
Open Document files without OpenOffice.org.
The newest version!
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2008-2013 jOpenDocument, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU
* General Public License Version 3 only ("GPL").
* You may not use this file except in compliance with the License.
* You can obtain a copy of the License at http://www.gnu.org/licenses/gpl-3.0.html
* 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.
*
*/
package org.jopendocument.dom.spreadsheet;
import org.jopendocument.dom.ODNode;
import org.jopendocument.dom.StyleProperties;
import org.jopendocument.util.Tuple2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.jdom.Element;
/**
* A group of columns/rows that can be hidden.
*
* @author Sylvain CUAZ
*/
public class TableGroup extends ODNode {
static Tuple2> createRoot(final Table table, final Axis col) {
final TableGroup group = new TableGroup(table, col);
return Tuple2.create(group, group.flatten());
}
private final Table table;
private final Axis axis;
private final TableGroup parent;
private final List children;
private int headerCount;
private int first;
private int size;
// root group
private TableGroup(final Table table, final Axis col) {
this(table, col, null, table.getElement(), 0);
}
private TableGroup(Table table, TableGroup parent, Element elem, final int first) {
this(table, parent.axis, parent, elem, first);
}
private TableGroup(Table table, final Axis col, TableGroup parent, Element elem, final int first) {
super(elem);
if (table == null)
throw new NullPointerException("null table");
this.table = table;
this.axis = col;
this.parent = parent;
this.first = first;
this.children = new ArrayList();
}
private List flatten() {
// max() since a group can have only group children
final List res = new ArrayList(Math.max(128, getElement().getContentSize()));
final String fullName = this.axis.getElemName();
final String groupName = this.axis.getGroupName();
final String pluralName = this.axis.getPluralName();
// A table shall not contain more than one element.
final Element header = this.getElement().getChild(this.axis.getHeaderName(), getElement().getNamespace());
if (header != null)
this.headerCount = Table.flattenChildren(res, header, this.axis);
else
this.headerCount = 0;
int size = this.headerCount;
this.children.clear();
@SuppressWarnings("unchecked")
final List content = new ArrayList(getElement().getChildren());
for (final Element child : content) {
if (child.getName().equals(fullName)) {
size += Table.flatten1(res, child, this.axis);
} else if (child.getName().equals(pluralName)) {
// ignore table-rows element (but add its children)
size += Table.flattenChildren(res, child, this.axis);
} else if (child.getName().equals(groupName)) {
final TableGroup g = new TableGroup(getTable(), this, child, this.first + size);
this.children.add(g);
res.addAll(g.flatten());
size += g.getSize();
}
// else nothing to do (header or soft-page-break)
}
this.size = size;
return res;
}
public final Table getTable() {
return this.table;
}
/**
* The parent of this group.
*
* @return the parent, null
if this is the root group.
*/
public final TableGroup getParent() {
return this.parent;
}
public final List getChildren() {
return Collections.unmodifiableList(this.children);
}
final TableGroup getDescendentOrSelfContaining(final int y) {
if (!this.contains(y))
return null;
for (final TableGroup g : this.getChildren()) {
final TableGroup res = g.getDescendentOrSelfContaining(y);
if (res != null)
return res;
}
return this;
}
public final boolean isDisplayed() {
if (this.getParent() == null)
return true;
else
// from table:display : the default value for this attribute is true
return StyleProperties.parseBoolean(getElement().getAttributeValue("display", getElement().getNamespace()), true);
}
/**
* The index of the first row/column in this group.
*
* @return index of the first element.
*/
public final int getFirst() {
return this.first;
}
public final int getHeaderCount() {
return this.headerCount;
}
public final int getSize() {
return this.size;
}
public final boolean contains(final int i) {
return i >= this.getFirst() && i < this.getFirst() + this.getSize();
}
final int getFollowingHeaderCount() {
int res = this.getHeaderCount();
// the table and each distinct group may contain one element, if
// and only if the table rows contained in the elements are
// adjacent.
for (final TableGroup g : this.getChildren()) {
if (g.getFirst() != this.getFirst() + res)
break;
res += g.getFollowingHeaderCount();
}
return res;
}
}