/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2008 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.model.table;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import org.jopendocument.model.OpenDocument;
import org.jopendocument.model.office.OfficeForms;
import org.jopendocument.model.office.OfficeSpreadsheet;
import org.jopendocument.model.style.StyleMasterPage;
import org.jopendocument.model.style.StylePageLayout;
import org.jopendocument.model.style.StylePageLayoutProperties;
import org.jopendocument.model.style.StyleStyle;
/**
*
*/
public class TableTable {
Vector<TableTableColumn> allColumns;
// Une colonne ou ligne repeated est dupliquée dans la liste
ArrayList<TableTableColumn> columns = new ArrayList<TableTableColumn>();
protected OfficeForms officeForms;
private int printStartCol = 0;
private int printStartRow = 0;
private int printStopCol = 0;
private int printStopRow = 0;
ArrayList<TableTableRow> rows = new ArrayList<TableTableRow>();
private OfficeSpreadsheet spreadsheet;
protected String tableAutomaticPrintRange;
protected String tableName;
protected String tablePrintRanges;
protected String tableProtected;
protected String tableProtectionKey;
protected TableScenario tableScenario;
protected TableShapes tableShapes;
protected String tableStyleName;
protected List<Object> tableTableColumnsOrTableTableColumnOrTableTableColumnGroupOrTableTableHeaderColumns;
protected List<Object> tableTableRowsOrTableTableRowOrTableTableRowGroupOrTableTableHeaderRows;
protected TableTableSource tableTableSource;
public void addColumn(final TableTableColumn col) {
for (int i = 0; i < col.getTableNumberColumnsRepeated(); i++) {
this.columns.add(col);
}
col.setTable(this);
}
public void addRow(final TableTableRow r) {
for (int i = 0; i < r.getTableNumberRowsRepeated(); i++) {
this.rows.add(r);
}
r.setTable(this);
}
public StyleStyle getCellStyle(final String s) {
return this.spreadsheet.getBody().getDocument().getAutomaticStyles().getCellStyle(s);
}
public TableTableColumn getColumn(final int i) {
return this.columns.get(i);
}
public TableTableColumn getColumnAtPosition(final int colPosition) {
// FIXME: faire idem rows
if (this.allColumns == null) {
this.allColumns = new Vector<TableTableColumn>();
for (int i = 0; i < this.columns.size(); i++) {
final TableTableColumn col = this.getColumn(i);
for (int n = 0; n < col.getTableNumberColumnsRepeated(); n++) {
this.allColumns.add(col);
}
}
}
return this.allColumns.get(colPosition);
}
public List<TableTableColumn> getColumns() {
return this.columns;
}
public List<TableTableColumn> getColumnsInRange(final int startCol, final int stopCol) {
final List<TableTableColumn> colsInRange = new Vector<TableTableColumn>(stopCol - startCol + 1);
for (int i = startCol; i <= stopCol; i++) {
colsInRange.add(this.columns.get(i));
}
return colsInRange;
}
public StyleStyle getColumnStyle(final String s) {
return this.spreadsheet.getBody().getDocument().getAutomaticStyles().getColumnStyle(s);
}
public int getHeight(final int startRow, final int stopRow) {
int h = 0;
for (int i = startRow; i <= stopRow; i++) {
final TableTableRow tableTableRow = this.rows.get(i);
h += tableTableRow.getHeight();
}
return h;
}
/**
* Gets the value of the officeForms property.
*
* @return possible object is {@link OfficeForms }
*
*/
public OfficeForms getOfficeForms() {
return this.officeForms;
}
/**
* Returns the page layout properties
*
* @return the properties
*/
public StylePageLayoutProperties getPageLayoutProperties() {
if (this.tableStyleName == null) {
return null;
}
// Getting page layout... a vibrant story
final OpenDocument doc = this.getSpreadsheet().getBody().getDocument();
final StyleStyle tableStyle = doc.getAutomaticStyles().getTableStyle(this.tableStyleName);
final String styleMasterPageName = tableStyle.getMasterPageName();
final StyleMasterPage styleMasterPage = doc.getMasterStyles().getMasterPageFromStyleName(styleMasterPageName);
final String pageLayoutName = styleMasterPage.getStylePageLayoutName();
final StylePageLayout pageLayout = doc.getAutomaticStyles().getStylePageLayoutFromStyleName(pageLayoutName);
return pageLayout.getPageLayoutProperties();
}
public int getPrintHeight() {
int h = 0;
final List<TableTableRow> rowsInRange = this.getRowsInRange(this.getPrintStartRow(), this.getPrintStopRow());
for (final TableTableRow row : rowsInRange) {
h += row.getHeight();
}
return h;
}
public int getPrintHeight(final double resizeFactor) {
int h = 0;
final List<TableTableRow> rowsInRange = this.getRowsInRange(this.getPrintStartRow(), this.getPrintStopRow());
for (final TableTableRow row : rowsInRange) {
h += row.getHeight() / resizeFactor;
}
return h;
}
public int getPrintStartCol() {
return this.printStartCol;
}
public int getPrintStartRow() {
return this.printStartRow;
}
public int getPrintStopCol() {
return this.printStopCol;
}
public int getPrintStopRow() {
return this.printStopRow;
}
public int getPrintWidth() {
int w = 0;
final List<TableTableColumn> cols = this.getColumnsInRange(this.getPrintStartCol(), this.getPrintStopCol());
for (final TableTableColumn col : cols) {
w += col.getWidth();
}
return w;
}
public int getPrintWidth(final double resizeFactor) {
int w = 0;
final List<TableTableColumn> cols = this.getColumnsInRange(this.getPrintStartCol(), this.getPrintStopCol());
for (final TableTableColumn col : cols) {
w += col.getWidth() / resizeFactor;
}
return w;
}
/**
* Return all the rows (duplicated if repeated)
*/
public List<TableTableRow> getRows() {
return this.rows;
}
public List<TableTableRow> getRowsInRange(final int startRow, final int stopRow) {
final List<TableTableRow> rowsInRange = new ArrayList<TableTableRow>(stopRow - startRow + 1);
for (int i = startRow; i <= stopRow; i++) {
if (i < this.rows.size()) {
rowsInRange.add(this.rows.get(i));
}
}
return rowsInRange;
}
public StyleStyle getRowStyle(final String s) {
return this.spreadsheet.getBody().getDocument().getAutomaticStyles().getRowStyle(s);
}
public OfficeSpreadsheet getSpreadsheet() {
return this.spreadsheet;
}
/**
* Gets the value of the tableAutomaticPrintRange property.
*
* @return possible object is {@link String }
*
*/
public String getTableAutomaticPrintRange() {
return this.tableAutomaticPrintRange;
}
/**
* Gets the value of the tableName property.
*
* @return possible object is {@link String }
*
*/
public String getTableName() {
return this.tableName;
}
/**
* Gets the value of the tableProtected property.
*
* @return possible object is {@link String }
*
*/
public String getTableProtected() {
if (this.tableProtected == null) {
return "false";
} else {
return this.tableProtected;
}
}
/**
* Gets the value of the tableProtectionKey property.
*
* @return possible object is {@link String }
*
*/
public String getTableProtectionKey() {
return this.tableProtectionKey;
}
/**
* Gets the value of the tableScenario property.
*
* @return possible object is {@link TableScenario }
*
*/
public TableScenario getTableScenario() {
return this.tableScenario;
}
/**
* Gets the value of the tableShapes property.
*
* @return possible object is {@link TableShapes }
*
*/
public TableShapes getTableShapes() {
return this.tableShapes;
}
/**
* Gets the value of the tableStyleName property.
*
* @return possible object is {@link String }
*
*/
public String getTableStyleName() {
return this.tableStyleName;
}
/**
* Gets the value of the tableTableSource property.
*
* @return possible object is {@link TableTableSource }
*
*/
public TableTableSource getTableTableSource() {
return this.tableTableSource;
}
/**
* Sets the value of the officeForms property.
*
* @param value allowed object is {@link OfficeForms }
*
*/
public void setOfficeForms(final OfficeForms value) {
this.officeForms = value;
}
public void setSpreadsheet(final OfficeSpreadsheet s) {
this.spreadsheet = s;
}
/**
* Sets the value of the tableAutomaticPrintRange property.
*
* @param value allowed object is {@link String }
*
*/
public void setTableAutomaticPrintRange(final String value) {
this.tableAutomaticPrintRange = value;
}
/**
* Sets the value of the tableName property.
*
* @param value allowed object is {@link String }
*
*/
public void setTableName(final String value) {
this.tableName = value;
}
/**
* Sets the value of the tablePrintRanges property.
*
* @param value allowed object is {@link String }
*
*/
public void setTablePrintRanges(final String value) {
if (value == null || !value.contains(":")) {
throw new IllegalArgumentException("ranges is null");
}
this.tablePrintRanges = value;
final int s = value.indexOf(':');
final String l = value.substring(0, s);
final String r = value.substring(s + 1);
String vl = l.substring(l.indexOf('.') + 1);
String vr = r.substring(r.indexOf('.') + 1);
vl = removeDollars(vl);
vr = removeDollars(vr);
{
int j = 0;
for (int i = vl.length() - 1; i >= 0; i--) {
final int c = vl.charAt(i);
if (Character.isLetter(c)) {
final int val = c - 'A' + 1;
this.printStartCol += val * Math.pow(26, j);
j++;
} else {
this.printStartRow = i;
}
}
final String substring = vl.substring(j);
this.printStartRow = Integer.valueOf(substring) - 1;
this.printStartCol--;
}
{
int j = 0;
for (int i = vr.length() - 1; i >= 0; i--) {
final int c = vr.charAt(i);
if (Character.isLetter(c)) {
final int val = c - 'A' + 1;
this.printStopCol += val * Math.pow(26, j);
j++;
} else {
this.printStopRow = i;
}
}
final String substring = vr.substring(j);
this.printStopRow = Integer.valueOf(substring) - 1;
this.printStopCol--;
}
}
private final String removeDollars(String s) {
final int length = s.length();
final StringBuilder t = new StringBuilder(length);
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
if (c != '$') {
t.append(c);
}
}
return t.toString();
}
/**
* Sets the value of the tableProtected property.
*
* @param value allowed object is {@link String }
*
*/
public void setTableProtected(final String value) {
this.tableProtected = value;
}
/**
* Sets the value of the tableProtectionKey property.
*
* @param value allowed object is {@link String }
*
*/
public void setTableProtectionKey(final String value) {
this.tableProtectionKey = value;
}
/**
* Sets the value of the tableScenario property.
*
* @param value allowed object is {@link TableScenario }
*
*/
public void setTableScenario(final TableScenario value) {
this.tableScenario = value;
}
/**
* Sets the value of the tableShapes property.
*
* @param value allowed object is {@link TableShapes }
*
*/
public void setTableShapes(final TableShapes value) {
this.tableShapes = value;
}
/**
* Sets the value of the tableStyleName property.
*
* @param value allowed object is {@link String }
*
*/
public void setTableStyleName(final String value) {
this.tableStyleName = value;
}
/**
* Sets the value of the tableTableSource property.
*
* @param value allowed object is {@link TableTableSource }
*
*/
public void setTableTableSource(final TableTableSource value) {
this.tableTableSource = value;
}
@Override
public String toString() {
return "TableTable: print:" + this.getPrintStartCol() + "," + this.getPrintStartRow() + " : " + this.getPrintStopCol() + "," + this.getPrintStopRow();
}
}