You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ye...@apache.org on 2010/08/08 13:11:40 UTC
svn commit: r983382 - in /poi/trunk/src: documentation/content/xdocs/
documentation/content/xdocs/spreadsheet/ java/org/apache/poi/hssf/dev/
java/org/apache/poi/hssf/model/ java/org/apache/poi/hssf/record/
java/org/apache/poi/hssf/usermodel/ java/org/a...
Author: yegor
Date: Sun Aug 8 11:11:38 2010
New Revision: 983382
URL: http://svn.apache.org/viewvc?rev=983382&view=rev
Log:
initial support for excel auto-filters
Added:
poi/trunk/src/java/org/apache/poi/hssf/model/ComboboxShape.java (with props)
poi/trunk/src/java/org/apache/poi/hssf/record/AutoFilterInfoRecord.java (with props)
poi/trunk/src/java/org/apache/poi/hssf/record/FtCblsSubRecord.java (with props)
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFAutoFilter.java (with props)
poi/trunk/src/java/org/apache/poi/ss/usermodel/AutoFilter.java (with props)
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFAutoFilter.java (with props)
poi/trunk/src/testcases/org/apache/poi/hssf/record/TestAutoFilterInfoRecord.java (with props)
poi/trunk/src/testcases/org/apache/poi/hssf/record/TestFtCblsSubRecord.java (with props)
Modified:
poi/trunk/src/documentation/content/xdocs/spreadsheet/quick-guide.xml
poi/trunk/src/documentation/content/xdocs/status.xml
poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java
poi/trunk/src/java/org/apache/poi/hssf/model/AbstractShape.java
poi/trunk/src/java/org/apache/poi/hssf/record/LbsDataSubRecord.java
poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java
poi/trunk/src/java/org/apache/poi/hssf/record/SubRecord.java
poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java
poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java
Modified: poi/trunk/src/documentation/content/xdocs/spreadsheet/quick-guide.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/spreadsheet/quick-guide.xml?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/spreadsheet/quick-guide.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/spreadsheet/quick-guide.xml Sun Aug 8 11:11:38 2010
@@ -70,6 +70,7 @@
<li><link href="#Hyperlinks">Hyperlinks</link></li>
<li><link href="#Validation">Data Validation</link></li>
<li><link href="#Embedded">Embedded Objects</link></li>
+ <li><link href="#Autofilter">Autofilters</link></li>
</ul>
</section>
<section><title>Features</title>
@@ -1638,5 +1639,14 @@ Examples:
}
</source>
</section>
+ <anchor id="Autofilter"/>
+ <p>(Since POI-3.7)</p>
+ <section><title>Autofilters</title>
+ <source>
+ Workbook wb = new HSSFWorkbook(); //or new XSSFWorkbook();
+ Sheet sheet = wb.createSheet();
+ sheet.setAutoFilter(CellRangeAddress.valueOf("C5:F200"));
+ </source>
+ </section>
</body>
</document>
Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Sun Aug 8 11:11:38 2010
@@ -33,10 +33,9 @@
</developers>
<changes>
-<!--
- <release version="3.7-beta2" date="2010-??-??">
+ <release version="3.7-beta3" date="2010-??-??">
+ <action dev="POI-DEVELOPERS" type="add">initial support for Excel autofilter</action>
</release>
--->
<release version="3.7-beta2" date="2010-08-09">
<action dev="POI-DEVELOPERS" type="add">47990 - Support for .msg attachments within a MAPIMessage .msg</action>
<action dev="POI-DEVELOPERS" type="fix">Improve handling and warnings when closing OPCPackage objects</action>
Modified: poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/dev/BiffViewer.java Sun Aug 8 11:11:38 2010
@@ -122,6 +122,7 @@ public final class BiffViewer {
case AxisParentRecord.sid: return new AxisParentRecord(in);
case AxisRecord.sid: return new AxisRecord(in);
case AxisUsedRecord.sid: return new AxisUsedRecord(in);
+ case AutoFilterInfoRecord.sid: return new AutoFilterInfoRecord(in);
case BOFRecord.sid: return new BOFRecord(in);
case BackupRecord.sid: return new BackupRecord(in);
case BarRecord.sid: return new BarRecord(in);
Modified: poi/trunk/src/java/org/apache/poi/hssf/model/AbstractShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/AbstractShape.java?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/AbstractShape.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/AbstractShape.java Sun Aug 8 11:11:38 2010
@@ -63,6 +63,9 @@ public abstract class AbstractShape
case HSSFSimpleShape.OBJECT_TYPE_RECTANGLE:
shape = new SimpleFilledShape( simpleShape, shapeId );
break;
+ case HSSFSimpleShape.OBJECT_TYPE_COMBO_BOX:
+ shape = new ComboboxShape( simpleShape, shapeId );
+ break;
default:
throw new IllegalArgumentException("Do not know how to handle this type of shape");
}
Added: poi/trunk/src/java/org/apache/poi/hssf/model/ComboboxShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/ComboboxShape.java?rev=983382&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/ComboboxShape.java (added)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/ComboboxShape.java Sun Aug 8 11:11:38 2010
@@ -0,0 +1,114 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+
+package org.apache.poi.hssf.model;
+
+import org.apache.poi.ddf.*;
+import org.apache.poi.hssf.record.*;
+import org.apache.poi.hssf.usermodel.*;
+
+/**
+ * Represents a combobox shape.
+ *
+ * @author Yegor Kozlov
+ */
+public class ComboboxShape
+ extends AbstractShape {
+ private EscherContainerRecord spContainer;
+ private ObjRecord objRecord;
+
+ /**
+ * Creates the low evel records for a combobox.
+ *
+ * @param hssfShape The highlevel shape.
+ * @param shapeId The shape id to use for this shape.
+ */
+ ComboboxShape(HSSFSimpleShape hssfShape, int shapeId) {
+ spContainer = createSpContainer(hssfShape, shapeId);
+ objRecord = createObjRecord(hssfShape, shapeId);
+ }
+
+ /**
+ * Creates the low level OBJ record for this shape.
+ */
+ private ObjRecord createObjRecord(HSSFSimpleShape shape, int shapeId) {
+ ObjRecord obj = new ObjRecord();
+ CommonObjectDataSubRecord c = new CommonObjectDataSubRecord();
+ c.setObjectType(HSSFSimpleShape.OBJECT_TYPE_COMBO_BOX);
+ c.setObjectId(shapeId);
+ c.setLocked(true);
+ c.setPrintable(false);
+ c.setAutofill(true);
+ c.setAutoline(false);
+
+ LbsDataSubRecord l = LbsDataSubRecord.newAutoFilterInstance();
+
+ EndSubRecord e = new EndSubRecord();
+
+ obj.addSubRecord(c);
+ obj.addSubRecord(l);
+ obj.addSubRecord(e);
+
+ return obj;
+ }
+
+ /**
+ * Generates the escher shape records for this shape.
+ */
+ private EscherContainerRecord createSpContainer(HSSFSimpleShape shape, int shapeId) {
+ EscherContainerRecord spContainer = new EscherContainerRecord();
+ EscherSpRecord sp = new EscherSpRecord();
+ EscherOptRecord opt = new EscherOptRecord();
+ EscherClientDataRecord clientData = new EscherClientDataRecord();
+
+ spContainer.setRecordId(EscherContainerRecord.SP_CONTAINER);
+ spContainer.setOptions((short) 0x000F);
+ sp.setRecordId(EscherSpRecord.RECORD_ID);
+ sp.setOptions((short) ((EscherAggregate.ST_HOSTCONTROL << 4) | 0x2));
+
+ sp.setShapeId(shapeId);
+ sp.setFlags(EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_HASSHAPETYPE);
+ opt.setRecordId(EscherOptRecord.RECORD_ID);
+ opt.addEscherProperty(new EscherBoolProperty(EscherProperties.PROTECTION__LOCKAGAINSTGROUPING, 17039620));
+ opt.addEscherProperty(new EscherBoolProperty(EscherProperties.TEXT__SIZE_TEXT_TO_FIT_SHAPE, 0x00080008));
+ opt.addEscherProperty(new EscherBoolProperty(EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x00080000));
+ opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.GROUPSHAPE__PRINT, 0x00020000));
+
+ HSSFClientAnchor userAnchor = (HSSFClientAnchor) shape.getAnchor();
+ userAnchor.setAnchorType(1);
+ EscherRecord anchor = createAnchor(userAnchor);
+ clientData.setRecordId(EscherClientDataRecord.RECORD_ID);
+ clientData.setOptions((short) 0x0000);
+
+ spContainer.addChildRecord(sp);
+ spContainer.addChildRecord(opt);
+ spContainer.addChildRecord(anchor);
+ spContainer.addChildRecord(clientData);
+
+ return spContainer;
+ }
+
+ public EscherContainerRecord getSpContainer() {
+ return spContainer;
+ }
+
+ public ObjRecord getObjRecord() {
+ return objRecord;
+ }
+
+}
\ No newline at end of file
Propchange: poi/trunk/src/java/org/apache/poi/hssf/model/ComboboxShape.java
------------------------------------------------------------------------------
svn:executable = *
Added: poi/trunk/src/java/org/apache/poi/hssf/record/AutoFilterInfoRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/AutoFilterInfoRecord.java?rev=983382&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/AutoFilterInfoRecord.java (added)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/AutoFilterInfoRecord.java Sun Aug 8 11:11:38 2010
@@ -0,0 +1,101 @@
+
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+
+package org.apache.poi.hssf.record;
+
+import org.apache.poi.util.LittleEndianOutput;
+
+/**
+ * The AutoFilterInfo record specifies the number of columns that have AutoFilter enabled
+ * and indicates the beginning of the collection of AutoFilter records.
+ *
+ * @author Yegor Kozlov
+ */
+
+public final class AutoFilterInfoRecord
+ extends StandardRecord
+{
+ public final static short sid = 0x9D;
+ /**
+ * Number of AutoFilter drop-down arrows on the sheet
+ */
+ private short _cEntries; // = 0;
+
+ public AutoFilterInfoRecord()
+ {
+ }
+
+ public AutoFilterInfoRecord(RecordInputStream in)
+ {
+ _cEntries = in.readShort();
+ }
+
+ /**
+ * set the number of AutoFilter drop-down arrows on the sheet
+ *
+ * @param num the number of AutoFilter drop-down arrows on the sheet
+ */
+
+ public void setNumEntries(short num)
+ {
+ _cEntries = num;
+ }
+
+ /**
+ * get the number of AutoFilter drop-down arrows on the sheet
+ *
+ * @return the number of AutoFilter drop-down arrows on the sheet
+ */
+
+ public short getNumEntries()
+ {
+ return _cEntries;
+ }
+
+ public String toString()
+ {
+ StringBuffer buffer = new StringBuffer();
+
+ buffer.append("[AUTOFILTERINFO]\n");
+ buffer.append(" .numEntries = ")
+ .append(_cEntries).append("\n");
+ buffer.append("[/AUTOFILTERINFO]\n");
+ return buffer.toString();
+ }
+
+ public void serialize(LittleEndianOutput out) {
+ out.writeShort(_cEntries);
+ }
+
+ protected int getDataSize() {
+ return 2;
+ }
+
+ public short getSid()
+ {
+ return sid;
+ }
+
+ @Override
+ public Object clone()
+ {
+ return cloneViaReserialise();
+ }
+
+}
\ No newline at end of file
Propchange: poi/trunk/src/java/org/apache/poi/hssf/record/AutoFilterInfoRecord.java
------------------------------------------------------------------------------
svn:executable = *
Added: poi/trunk/src/java/org/apache/poi/hssf/record/FtCblsSubRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/FtCblsSubRecord.java?rev=983382&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/FtCblsSubRecord.java (added)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/FtCblsSubRecord.java Sun Aug 8 11:11:38 2010
@@ -0,0 +1,101 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hssf.record;
+
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.LittleEndianInput;
+import org.apache.poi.util.LittleEndianOutput;
+
+
+/**
+ * This structure appears as part of an Obj record that represents a checkbox or radio button.
+ *
+ * @author Yegor Kozlov
+ */
+public final class FtCblsSubRecord extends SubRecord {
+ public final static short sid = 0x0C;
+ private static final int ENCODED_SIZE = 20;
+
+ private byte[] reserved;
+
+ /**
+ * Construct a new <code>FtCblsSubRecord</code> and
+ * fill its data with the default values
+ */
+ public FtCblsSubRecord()
+ {
+ reserved = new byte[ENCODED_SIZE];
+ }
+
+ public FtCblsSubRecord(LittleEndianInput in, int size) {
+ if (size != ENCODED_SIZE) {
+ throw new RecordFormatException("Unexpected size (" + size + ")");
+ }
+ //just grab the raw data
+ byte[] buf = new byte[size];
+ in.readFully(buf);
+ reserved = buf;
+ }
+
+ /**
+ * Convert this record to string.
+ * Used by BiffViewer and other utilities.
+ */
+ public String toString()
+ {
+ StringBuffer buffer = new StringBuffer();
+
+ buffer.append("[FtCbls ]").append("\n");
+ buffer.append(" size = ").append(getDataSize()).append("\n");
+ buffer.append(" reserved = ").append(HexDump.toHex(reserved)).append("\n");
+ buffer.append("[/FtCbls ]").append("\n");
+ return buffer.toString();
+ }
+
+ /**
+ * Serialize the record data into the supplied array of bytes
+ *
+ * @param out the stream to serialize into
+ */
+ public void serialize(LittleEndianOutput out) {
+ out.writeShort(sid);
+ out.writeShort(reserved.length);
+ out.write(reserved);
+ }
+
+ protected int getDataSize() {
+ return reserved.length;
+ }
+
+ /**
+ * @return id of this record.
+ */
+ public short getSid()
+ {
+ return sid;
+ }
+
+ public Object clone() {
+ FtCblsSubRecord rec = new FtCblsSubRecord();
+ byte[] recdata = new byte[reserved.length];
+ System.arraycopy(reserved, 0, recdata, 0, recdata.length);
+ rec.reserved = recdata;
+ return rec;
+ }
+
+}
\ No newline at end of file
Propchange: poi/trunk/src/java/org/apache/poi/hssf/record/FtCblsSubRecord.java
------------------------------------------------------------------------------
svn:executable = *
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/LbsDataSubRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/LbsDataSubRecord.java?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/LbsDataSubRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/LbsDataSubRecord.java Sun Aug 8 11:11:38 2010
@@ -150,6 +150,29 @@ public class LbsDataSubRecord extends Su
}
+ LbsDataSubRecord(){
+
+ }
+
+ /**
+ *
+ * @return a new instance of LbsDataSubRecord to construct auto-filters
+ * @see org.apache.poi.hssf.model.ComboboxShape#createObjRecord(org.apache.poi.hssf.usermodel.HSSFSimpleShape, int)
+ */
+ public static LbsDataSubRecord newAutoFilterInstance(){
+ LbsDataSubRecord lbs = new LbsDataSubRecord();
+ lbs._cbFContinued = 0x1FEE; //autofilters seem to alway have this magic number
+ lbs._iSel = 0x000;
+
+ lbs._flags = 0x0301;
+ lbs._dropData = new LbsDropData();
+ lbs._dropData._wStyle = LbsDropData.STYLE_COMBO_SIMPLE_DROPDOWN;
+
+ // the number of lines to be displayed in the dropdown
+ lbs._dropData._cLine = 8;
+ return lbs;
+ }
+
/**
* @return true as LbsDataSubRecord is always the last sub-record
*/
@@ -273,6 +296,19 @@ public class LbsDataSubRecord extends Su
*/
public static class LbsDropData {
/**
+ * Combo dropdown control
+ */
+ public static int STYLE_COMBO_DROPDOWN = 0;
+ /**
+ * Combo Edit dropdown control
+ */
+ public static int STYLE_COMBO_EDIT_DROPDOWN = 1;
+ /**
+ * Simple dropdown control (just the dropdown button)
+ */
+ public static int STYLE_COMBO_SIMPLE_DROPDOWN = 2;
+
+ /**
* An unsigned integer that specifies the style of this dropdown.
*/
private int _wStyle;
@@ -298,6 +334,11 @@ public class LbsDataSubRecord extends Su
*/
private Byte _unused;
+ public LbsDropData(){
+ _str = "";
+ _unused = 0;
+ }
+
public LbsDropData(LittleEndianInput in){
_wStyle = in.readUShort();
_cLine = in.readUShort();
@@ -308,6 +349,27 @@ public class LbsDataSubRecord extends Su
}
}
+ /**
+ * Set the style of this dropdown.
+ *
+ * Possible values:
+ * <p>
+ * 0 Combo dropdown control
+ * 1 Combo Edit dropdown control
+ * 2 Simple dropdown control (just the dropdown button)
+ *
+ */
+ public void setStyle(int style){
+ _wStyle = style;
+ }
+
+ /**
+ * Set the number of lines to be displayed in the dropdown.
+ */
+ public void setNumLines(int num){
+ _cLine = num;
+ }
+
public void serialize(LittleEndianOutput out) {
out.writeShort(_wStyle);
out.writeShort(_cLine);
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/RecordFactory.java Sun Aug 8 11:11:38 2010
@@ -107,7 +107,8 @@ public final class RecordFactory {
@SuppressWarnings("unchecked")
private static final Class<? extends Record>[] recordClasses = new Class[] {
ArrayRecord.class,
- BackupRecord.class,
+ AutoFilterInfoRecord.class,
+ BackupRecord.class,
BlankRecord.class,
BOFRecord.class,
BookBoolRecord.class,
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/SubRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/SubRecord.java?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/SubRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/SubRecord.java Sun Aug 8 11:11:38 2010
@@ -57,6 +57,8 @@ public abstract class SubRecord {
return new NoteStructureSubRecord(in, secondUShort);
case LbsDataSubRecord.sid:
return new LbsDataSubRecord(in, secondUShort, cmoOt);
+ case FtCblsSubRecord.sid:
+ return new FtCblsSubRecord(in, secondUShort);
}
return new UnknownSubRecord(in, sid, secondUShort);
}
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/UnknownRecord.java Sun Aug 8 11:11:38 2010
@@ -139,7 +139,6 @@ public final class UnknownRecord extends
case SORT_0090: return "SORT"; // Sorting Options
case 0x0094: return "LHRECORD"; // .WK? File Conversion Information
case STANDARDWIDTH_0099: return "STANDARDWIDTH"; //Standard Column Width
- case 0x009D: return "AUTOFILTERINFO"; // Drop-Down Arrow Count
case SCL_00A0: return "SCL"; // Window Zoom Magnification
case 0x00AE: return "SCENMAN"; // Scenario Output Data
@@ -241,6 +240,7 @@ public final class UnknownRecord extends
case 0x101B:
case 0x101D:
case 0x101E:
+ case 0x101F:
case 0x1020:
case 0x1021:
case 0x1022:
Added: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFAutoFilter.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFAutoFilter.java?rev=983382&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFAutoFilter.java (added)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFAutoFilter.java Sun Aug 8 11:11:38 2010
@@ -0,0 +1,32 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hssf.usermodel;
+import org.apache.poi.ss.usermodel.AutoFilter;
+
+/**
+ * Represents autofiltering for the specified worksheet.
+ *
+ * @author Yegor Kozlov
+ */
+public final class HSSFAutoFilter implements AutoFilter {
+ private HSSFSheet _sheet;
+
+ HSSFAutoFilter(HSSFSheet sheet){
+ _sheet = sheet;
+ }
+}
\ No newline at end of file
Propchange: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFAutoFilter.java
------------------------------------------------------------------------------
svn:executable = *
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java Sun Aug 8 11:11:38 2010
@@ -157,6 +157,20 @@ public final class HSSFPatriarch impleme
return shape;
}
+ /**
+ * YK: used to create autofilters
+ *
+ * @see org.apache.poi.hssf.usermodel.HSSFSheet#setAutoFilter(int, int, int, int)
+ */
+ HSSFSimpleShape createComboBox(HSSFAnchor anchor)
+ {
+ HSSFSimpleShape shape = new HSSFSimpleShape(null, anchor);
+ shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_COMBO_BOX);
+ shape.anchor = anchor;
+ _shapes.add(shape);
+ return shape;
+ }
+
public HSSFComment createCellComment(ClientAnchor anchor) {
return createComment((HSSFAnchor)anchor);
}
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java Sun Aug 8 11:11:38 2010
@@ -34,21 +34,13 @@ import org.apache.poi.ddf.EscherRecord;
import org.apache.poi.hssf.model.HSSFFormulaParser;
import org.apache.poi.hssf.model.InternalSheet;
import org.apache.poi.hssf.model.InternalWorkbook;
-import org.apache.poi.hssf.record.CellValueRecordInterface;
-import org.apache.poi.hssf.record.DVRecord;
-import org.apache.poi.hssf.record.EscherAggregate;
-import org.apache.poi.hssf.record.ExtendedFormatRecord;
-import org.apache.poi.hssf.record.NoteRecord;
-import org.apache.poi.hssf.record.Record;
-import org.apache.poi.hssf.record.RowRecord;
-import org.apache.poi.hssf.record.SCLRecord;
-import org.apache.poi.hssf.record.WSBoolRecord;
-import org.apache.poi.hssf.record.WindowTwoRecord;
+import org.apache.poi.hssf.record.*;
import org.apache.poi.hssf.record.aggregates.DataValidityTable;
import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
import org.apache.poi.hssf.record.aggregates.WorksheetProtectionBlock;
import org.apache.poi.hssf.record.formula.FormulaShifter;
import org.apache.poi.hssf.record.formula.Ptg;
+import org.apache.poi.hssf.record.formula.Area3DPtg;
import org.apache.poi.hssf.util.PaneInformation;
import org.apache.poi.hssf.util.Region;
import org.apache.poi.ss.SpreadsheetVersion;
@@ -1573,15 +1565,17 @@ public final class HSSFSheet implements
* @return The new patriarch.
*/
public HSSFPatriarch createDrawingPatriarch() {
- // Create the drawing group if it doesn't already exist.
- _book.createDrawingGroup();
-
- _sheet.aggregateDrawingRecords(_book.getDrawingManager(), true);
- EscherAggregate agg = (EscherAggregate) _sheet.findFirstRecordBySid(EscherAggregate.sid);
- _patriarch = new HSSFPatriarch(this, agg);
- agg.clear(); // Initially the behaviour will be to clear out any existing shapes in the sheet when
- // creating a new patriarch.
- agg.setPatriarch(_patriarch);
+ if(_patriarch == null){
+ // Create the drawing group if it doesn't already exist.
+ _book.createDrawingGroup();
+
+ _sheet.aggregateDrawingRecords(_book.getDrawingManager(), true);
+ EscherAggregate agg = (EscherAggregate) _sheet.findFirstRecordBySid(EscherAggregate.sid);
+ _patriarch = new HSSFPatriarch(this, agg);
+ agg.clear(); // Initially the behaviour will be to clear out any existing shapes in the sheet when
+ // creating a new patriarch.
+ agg.setPatriarch(_patriarch);
+ }
return _patriarch;
}
@@ -2000,5 +1994,39 @@ public final class HSSFSheet implements
return new HSSFDataValidationHelper(this);
}
-
+ public HSSFAutoFilter setAutoFilter(CellRangeAddress range) {
+
+
+ InternalWorkbook workbook = _workbook.getWorkbook();
+ int sheetIndex = _workbook.getSheetIndex(this);
+
+ NameRecord name = workbook.getSpecificBuiltinRecord(NameRecord.BUILTIN_FILTER_DB, sheetIndex+1);
+
+ if (name == null) {
+ name = workbook.createBuiltInName(NameRecord.BUILTIN_FILTER_DB, sheetIndex+1);
+ }
+
+ // The built-in name must consist of a single Area3d Ptg.
+ Area3DPtg ptg = new Area3DPtg(range.getFirstRow(), range.getLastRow(),
+ range.getFirstColumn(), range.getLastColumn(),
+ false, false, false, false, sheetIndex);
+ name.setNameDefinition(new Ptg[]{ptg});
+
+ AutoFilterInfoRecord r = new AutoFilterInfoRecord();
+ // the number of columns that have AutoFilter enabled.
+ int numcols = 1 + range.getLastColumn() - range.getFirstColumn();
+ r.setNumEntries((short)numcols);
+ int idx = _sheet.findFirstRecordLocBySid(DimensionsRecord.sid);
+ _sheet.getRecords().add(idx, r);
+
+ //create a combobox control for each column
+ HSSFPatriarch p = createDrawingPatriarch();
+ for(int col = range.getFirstColumn(); col <= range.getLastColumn(); col++){
+ p.createComboBox(new HSSFClientAnchor(0,0,0,0,
+ (short)col, range.getFirstRow(), (short)(col+1), range.getFirstRow()+1));
+ }
+
+ return new HSSFAutoFilter(this);
+ }
+
}
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java Sun Aug 8 11:11:38 2010
@@ -46,7 +46,7 @@ public class HSSFSimpleShape
// public final static short OBJECT_TYPE_SCROLL_BAR = 17;
// public final static short OBJECT_TYPE_LIST_BOX = 18;
// public final static short OBJECT_TYPE_GROUP_BOX = 19;
-// public final static short OBJECT_TYPE_COMBO_BOX = 20;
+ public final static short OBJECT_TYPE_COMBO_BOX = 20;
public final static short OBJECT_TYPE_COMMENT = 25;
// public final static short OBJECT_TYPE_MICROSOFT_OFFICE_DRAWING = 30;
Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/AutoFilter.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/AutoFilter.java?rev=983382&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/AutoFilter.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/AutoFilter.java Sun Aug 8 11:11:38 2010
@@ -0,0 +1,79 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+package org.apache.poi.ss.usermodel;
+
+/**
+ * Represents autofiltering for the specified worksheet.
+ *
+ * <p>
+ * Filtering data is a quick and easy way to find and work with a subset of data in a range of cells or table.
+ * For example, you can filter to see only the values that you specify, filter to see the top or bottom values,
+ * or filter to quickly see duplicate values.
+ * </p>
+ *
+ * TODO YK: For now (Aug 2010) POI only supports setting a basic autofilter on a range of cells.
+ * In future, when we support more auto-filter functions like custom criteria, sort, etc. we will add
+ * corresponding methods to this interface.
+ */
+public interface AutoFilter {
+ /**
+ * Apply a custom filter
+ *
+ * <p>
+ * A custom AutoFilter specifies an operator and a value.
+ * There can be at most two customFilters specified, and in that case the parent element
+ * specifies whether the two conditions are joined by 'and' or 'or'. For any cells whose
+ * values do not meet the specified criteria, the corresponding rows shall be hidden from
+ * view when the filter is applied.
+ * </p>
+ *
+ * <p>
+ * Example:
+ * <blockquote><pre>
+ * AutoFilter filter = sheet.setAutoFilter(CellRangeAddress.valueOf("A1:F200"));
+ * filter.applyFilter(0, FilterOperator.GreaterThanOrEqual", "0.2");
+ * filter.applyFilter(1, FilterOperator.LessThanOrEqual"", "0.5");
+ * </pre></blockquote>
+ * </p>
+ *
+ * @param columnIndex 0-based column index
+ * @param operator the operator to apply
+ * @param criteria top or bottom value used in the filter criteria.
+ *
+ * TODO YK: think how to combine AutoFilter with with DataValidationConstraint, they are really close relatives
+ * void applyFilter(int columnIndex, FilterOperator operator, String criteria);
+ */
+
+
+ /**
+ * Apply a filter against a list of values
+ *
+ * <p>
+ * Example:
+ * <blockquote><pre>
+ * AutoFilter filter = sheet.setAutoFilter(CellRangeAddress.valueOf("A1:F200"));
+ * filter.applyFilter(0, "apache", "poi", "java", "api");
+ * </pre></blockquote>
+ * </p>
+ *
+ * @param columnIndex 0-based column index
+ * @param values the filter values
+ *
+ * void applyFilter(int columnIndex, String ... values);
+ */
+
+}
Propchange: poi/trunk/src/java/org/apache/poi/ss/usermodel/AutoFilter.java
------------------------------------------------------------------------------
svn:executable = *
Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/Sheet.java Sun Aug 8 11:11:38 2010
@@ -806,4 +806,12 @@ public interface Sheet extends Iterable<
* @param dataValidation The Data validation object settings
*/
public void addValidationData(DataValidation dataValidation);
+
+ /**
+ * Enable filtering for a range of cells
+ *
+ * @param range the range of cells to filter
+ */
+ AutoFilter setAutoFilter(CellRangeAddress range);
+
}
Added: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFAutoFilter.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFAutoFilter.java?rev=983382&view=auto
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFAutoFilter.java (added)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFAutoFilter.java Sun Aug 8 11:11:38 2010
@@ -0,0 +1,33 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.xssf.usermodel;
+import org.apache.poi.ss.usermodel.AutoFilter;
+
+/**
+ * Represents autofiltering for the specified worksheet.
+ *
+ * @author Yegor Kozlov
+ */
+public final class XSSFAutoFilter implements AutoFilter {
+ private XSSFSheet _sheet;
+
+ XSSFAutoFilter(XSSFSheet sheet){
+ _sheet = sheet;
+ }
+
+}
\ No newline at end of file
Propchange: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFAutoFilter.java
------------------------------------------------------------------------------
svn:executable = *
Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java Sun Aug 8 11:11:38 2010
@@ -61,41 +61,7 @@ import org.apache.poi.xssf.usermodel.hel
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlOptions;
import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBreak;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellFormula;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTComment;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCommentList;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDataValidation;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDataValidations;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDrawing;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHeaderFooter;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHyperlink;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTLegacyDrawing;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTMergeCell;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTMergeCells;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTOutlinePr;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageBreak;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageMargins;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageSetUpPr;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPane;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPrintOptions;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSelection;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetData;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetFormatPr;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetPr;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetProtection;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetView;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetViews;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellFormulaType;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPane;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPaneState;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.*;
/**
* High level representation of a SpreadsheetML worksheet.
@@ -2918,4 +2884,16 @@ public class XSSFSheet extends POIXMLDoc
dataValidations.setCount(currentCount + 1);
}
+
+ public XSSFAutoFilter setAutoFilter(CellRangeAddress range) {
+ CTAutoFilter af = worksheet.getAutoFilter();
+ if(af == null) af = worksheet.addNewAutoFilter();
+
+ CellRangeAddress norm = new CellRangeAddress(range.getFirstRow(), range.getLastRow(),
+ range.getFirstColumn(), range.getLastColumn());
+ String ref = norm.formatAsString();
+ af.setRef(ref);
+
+ return new XSSFAutoFilter(this);
+ }
}
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java Sun Aug 8 11:11:38 2010
@@ -971,4 +971,12 @@ public final class TestXSSFSheet extends
assertEquals(3, xrow[2].getR());
}
+
+ public void testSetAutoFilter() {
+ XSSFWorkbook wb = new XSSFWorkbook();
+ XSSFSheet sheet = wb.createSheet();
+ sheet.setAutoFilter(CellRangeAddress.valueOf("A1:D100"));
+
+ assertEquals("A1:D100", sheet.getCTWorksheet().getAutoFilter().getRef());
+ }
}
Added: poi/trunk/src/testcases/org/apache/poi/hssf/record/TestAutoFilterInfoRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/TestAutoFilterInfoRecord.java?rev=983382&view=auto
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/TestAutoFilterInfoRecord.java (added)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/TestAutoFilterInfoRecord.java Sun Aug 8 11:11:38 2010
@@ -0,0 +1,77 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hssf.record;
+
+import junit.framework.TestCase;
+import org.apache.poi.ddf.EscherClientDataRecord;
+import org.apache.poi.ddf.EscherContainerRecord;
+import org.apache.poi.ddf.EscherDggRecord;
+import org.apache.poi.ddf.EscherSpRecord;
+import org.apache.poi.hssf.model.DrawingManager2;
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.HexRead;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Arrays;
+
+/**
+ * Tests the AutoFilterInfoRecord class.
+ *
+ * @author Yegor Kozlov
+ */
+public final class TestAutoFilterInfoRecord extends TestCase {
+ private byte[] data = new byte[] {
+ 0x05, 0x00
+ };
+
+ public void testRead() {
+
+ AutoFilterInfoRecord record = new AutoFilterInfoRecord(TestcaseRecordInputStream.create(AutoFilterInfoRecord.sid, data));
+
+ assertEquals(AutoFilterInfoRecord.sid, record.getSid());
+ assertEquals(data.length, record.getDataSize());
+ assertEquals(5, record.getNumEntries());
+ record.setNumEntries((short)3);
+ assertEquals(3, record.getNumEntries());
+ }
+
+ public void testWrite() {
+ AutoFilterInfoRecord record = new AutoFilterInfoRecord();
+ record.setNumEntries((short)3);
+
+ byte [] ser = record.serialize();
+ assertEquals(ser.length - 4, data.length);
+ record = new AutoFilterInfoRecord(TestcaseRecordInputStream.create(ser));
+ assertEquals(3, record.getNumEntries());
+ }
+
+ public void testClone()
+ {
+ AutoFilterInfoRecord record = new AutoFilterInfoRecord();
+ record.setNumEntries((short)3);
+ byte[] src = record.serialize();
+
+ AutoFilterInfoRecord cloned = (AutoFilterInfoRecord)record.clone();
+ assertEquals(3, record.getNumEntries());
+ byte[] cln = cloned.serialize();
+
+ assertEquals(record.getDataSize(), cloned.getDataSize());
+ assertTrue(Arrays.equals(src, cln));
+ }
+}
\ No newline at end of file
Propchange: poi/trunk/src/testcases/org/apache/poi/hssf/record/TestAutoFilterInfoRecord.java
------------------------------------------------------------------------------
svn:executable = *
Added: poi/trunk/src/testcases/org/apache/poi/hssf/record/TestFtCblsSubRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/TestFtCblsSubRecord.java?rev=983382&view=auto
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/TestFtCblsSubRecord.java (added)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/TestFtCblsSubRecord.java Sun Aug 8 11:11:38 2010
@@ -0,0 +1,66 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hssf.record;
+
+
+import junit.framework.TestCase;
+
+import java.util.Arrays;
+
+/**
+ * Tests the serialization and deserialization of the FtCblsSubRecord
+ * class works correctly.
+ *
+ * @author Yegor Kozlov
+ */
+public final class TestFtCblsSubRecord extends TestCase {
+ private byte[] data = new byte[] {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00,
+ 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00
+ };
+
+ public void testRead() {
+
+ FtCblsSubRecord record = new FtCblsSubRecord(TestcaseRecordInputStream.create(FtCblsSubRecord.sid, data), data.length);
+
+ assertEquals(FtCblsSubRecord.sid, record.getSid());
+ assertEquals(data.length, record.getDataSize());
+ }
+
+ public void testWrite() {
+ FtCblsSubRecord record = new FtCblsSubRecord();
+ assertEquals(FtCblsSubRecord.sid, record.getSid());
+ assertEquals(data.length, record.getDataSize());
+
+ byte [] ser = record.serialize();
+ assertEquals(ser.length - 4, data.length);
+
+ }
+
+ public void testClone()
+ {
+ FtCblsSubRecord record = new FtCblsSubRecord();
+ byte[] src = record.serialize();
+
+ FtCblsSubRecord cloned = (FtCblsSubRecord)record.clone();
+ byte[] cln = cloned.serialize();
+
+ assertEquals(record.getDataSize(), cloned.getDataSize());
+ assertTrue(Arrays.equals(src, cln));
+ }
+}
\ No newline at end of file
Propchange: poi/trunk/src/testcases/org/apache/poi/hssf/record/TestFtCblsSubRecord.java
------------------------------------------------------------------------------
svn:executable = *
Modified: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java?rev=983382&r1=983381&r2=983382&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java Sun Aug 8 11:11:38 2010
@@ -27,18 +27,11 @@ import org.apache.poi.ddf.EscherDgRecord
import org.apache.poi.hssf.HSSFITestDataProvider;
import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.model.DrawingManager2;
-import org.apache.poi.hssf.record.DimensionsRecord;
-import org.apache.poi.hssf.record.GridsetRecord;
-import org.apache.poi.hssf.record.HCenterRecord;
-import org.apache.poi.hssf.record.ObjectProtectRecord;
-import org.apache.poi.hssf.record.PasswordRecord;
-import org.apache.poi.hssf.record.ProtectRecord;
-import org.apache.poi.hssf.record.Record;
-import org.apache.poi.hssf.record.SCLRecord;
-import org.apache.poi.hssf.record.ScenarioProtectRecord;
-import org.apache.poi.hssf.record.VCenterRecord;
-import org.apache.poi.hssf.record.WSBoolRecord;
-import org.apache.poi.hssf.record.WindowTwoRecord;
+import org.apache.poi.hssf.model.InternalWorkbook;
+import org.apache.poi.hssf.model.InternalSheet;
+import org.apache.poi.hssf.record.*;
+import org.apache.poi.hssf.record.formula.Ptg;
+import org.apache.poi.hssf.record.formula.Area3DPtg;
import org.apache.poi.hssf.record.aggregates.WorksheetProtectionBlock;
import org.apache.poi.hssf.usermodel.RecordInspector.RecordCollector;
import org.apache.poi.ss.usermodel.BaseTestSheet;
@@ -291,13 +284,23 @@ public final class TestHSSFSheet extends
assertEquals(0, r6.getOutlineLevel());
}
+ public void testCreateDrawings() {
+ HSSFWorkbook workbook = new HSSFWorkbook();
+ HSSFSheet sheet = workbook.createSheet();
+ HSSFPatriarch p1 = sheet.createDrawingPatriarch();
+ HSSFPatriarch p2 = sheet.createDrawingPatriarch();
+ assertSame(p1, p2);
+ }
+
public void testGetDrawings() {
HSSFWorkbook wb1c = HSSFTestDataSamples.openSampleWorkbook("WithChart.xls");
HSSFWorkbook wb2c = HSSFTestDataSamples.openSampleWorkbook("WithTwoCharts.xls");
// 1 chart sheet -> data on 1st, chart on 2nd
assertNotNull(wb1c.getSheetAt(0).getDrawingPatriarch());
+ assertSame(wb1c.getSheetAt(0).getDrawingPatriarch(), wb1c.getSheetAt(0).getDrawingPatriarch());
assertNotNull(wb1c.getSheetAt(1).getDrawingPatriarch());
+ assertSame(wb1c.getSheetAt(1).getDrawingPatriarch(), wb1c.getSheetAt(1).getDrawingPatriarch());
assertFalse(wb1c.getSheetAt(0).getDrawingPatriarch().containsChart());
assertTrue(wb1c.getSheetAt(1).getDrawingPatriarch().containsChart());
@@ -860,4 +863,37 @@ public final class TestHSSFSheet extends
s.setRightToLeft(true);
assertEquals(true, s.isRightToLeft());
}
+
+ public void testAutoFilter(){
+ HSSFWorkbook wb = new HSSFWorkbook();
+ HSSFSheet sh = wb.createSheet();
+ InternalWorkbook iwb = wb.getWorkbook();
+ InternalSheet ish = sh.getSheet();
+
+ assertNull( iwb.getSpecificBuiltinRecord(NameRecord.BUILTIN_FILTER_DB, 1) );
+ assertNull( ish.findFirstRecordBySid(AutoFilterInfoRecord.sid) );
+
+ CellRangeAddress range = CellRangeAddress.valueOf("A1:B10");
+ sh.setAutoFilter(range);
+
+ NameRecord name = iwb.getSpecificBuiltinRecord(NameRecord.BUILTIN_FILTER_DB, 1);
+ assertNotNull( name );
+
+ // The built-in name for auto-filter must consist of a single Area3d Ptg.
+ Ptg[] ptg = name.getNameDefinition();
+ assertEquals("The built-in name for auto-filter must consist of a single Area3d Ptg", 1, ptg.length);
+ assertTrue("The built-in name for auto-filter must consist of a single Area3d Ptg", ptg[0] instanceof Area3DPtg);
+
+ Area3DPtg aref = (Area3DPtg)ptg[0];
+ assertEquals(range.getFirstColumn(), aref.getFirstColumn());
+ assertEquals(range.getFirstRow(), aref.getFirstRow());
+ assertEquals(range.getLastColumn(), aref.getLastColumn());
+ assertEquals(range.getLastRow(), aref.getLastRow());
+
+ // verify AutoFilterInfoRecord
+ AutoFilterInfoRecord afilter = (AutoFilterInfoRecord)ish.findFirstRecordBySid(AutoFilterInfoRecord.sid);
+ assertNotNull(afilter );
+ assertEquals(2, afilter.getNumEntries()); //filter covers two columns
+
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org