]> source.dussan.org Git - poi.git/commitdiff
bug 58570: add get/setActiveCell to Sheet interface, add Cell.getAddress,
authorJaven O'Neal <onealj@apache.org>
Fri, 4 Dec 2015 06:36:27 +0000 (06:36 +0000)
committerJaven O'Neal <onealj@apache.org>
Fri, 4 Dec 2015 06:36:27 +0000 (06:36 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1717900 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/usermodel/HSSFCell.java
src/java/org/apache/poi/ss/usermodel/Cell.java
src/java/org/apache/poi/ss/usermodel/Sheet.java
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestCell.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestSheet.java

index ad3635de6c0de45b6849d2109db2dd7f38081f31..15540bc0c92b56c71bd41e568f1986e7078a5baa 100644 (file)
@@ -48,6 +48,7 @@ import org.apache.poi.ss.usermodel.Comment;
 import org.apache.poi.ss.usermodel.FormulaError;
 import org.apache.poi.ss.usermodel.Hyperlink;
 import org.apache.poi.ss.usermodel.RichTextString;
+import org.apache.poi.ss.util.CellAddress;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.ss.util.NumberToTextConverter;
@@ -223,18 +224,10 @@ public class HSSFCell implements Cell {
     /**
      * @return the (zero based) index of the row containing this cell
      */
+    @Override
     public int getRowIndex() {
         return _record.getRow();
     }
-    /**
-     * Set the cell's number within the row (0 based).
-     * @param num  short the cell number
-     * @deprecated (Jan 2008) Doesn't update the row's idea of what cell this is, use {@link HSSFRow#moveCell(HSSFCell, short)} instead
-     */
-    public void setCellNum(short num)
-    {
-        _record.setColumn(num);
-    }
 
     /**
      * Updates the cell record's idea of what
@@ -246,17 +239,20 @@ public class HSSFCell implements Cell {
         _record.setColumn(num);
     }
 
-    /**
-     * @deprecated (Oct 2008) use {@link #getColumnIndex()}
-     */
-    public short getCellNum() {
-        return (short) getColumnIndex();
-    }
-
+    @Override
     public int getColumnIndex() {
         return _record.getColumn() & 0xFFFF;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public CellAddress getAddress() {
+        return new CellAddress(this);
+    }
+    
+
     /**
      * Set the cells type (numeric, formula or string).
      * If the cell currently contains a value, the value will
@@ -950,8 +946,9 @@ public class HSSFCell implements Cell {
     }
 
     /**
-     * Sets this cell as the active cell for the worksheet
+     * {@inheritDoc}
      */
+    @Override
     public void setAsActiveCell()
     {
         int row=_record.getRow();
index e3dcae0bb17c5d5dc7f40a699309909272ba20ad..ca7738a32a65c04e043343d87ddfede237ccfdf8 100644 (file)
@@ -21,6 +21,7 @@ import java.util.Calendar;
 import java.util.Date;
 
 import org.apache.poi.ss.formula.FormulaParseException;
+import org.apache.poi.ss.util.CellAddress;
 import org.apache.poi.ss.util.CellRangeAddress;
 
 /**
@@ -349,6 +350,14 @@ public interface Cell {
      */
     void setAsActiveCell();
 
+   /**
+     * Gets the address of this cell
+     *
+     * @return <code>A1</code> style address of this cell
+     * @since 3.14beta2
+     */
+    CellAddress getAddress();
+
     /**
      * Assign a comment to this cell
      *
index b75922450194a2fc05b3c37de1f5a4321877c298..56758c6c0805ca354bfd7b3f610b2c6084696aa8 100644 (file)
@@ -1118,4 +1118,20 @@ public interface Sheet extends Iterable<Row> {
      * @return Hyperlinks for the sheet
      */
     public List<? extends Hyperlink> getHyperlinkList();
+
+    /**
+     * Return location of the active cell, e.g. <code>A1</code>.
+     *
+     * @return the location of the active cell.
+     * @since 3.14beta2
+     */
+    public CellAddress getActiveCell();
+
+    /**
+      * Sets location of the active cell
+      *
+      * @param cellRef the location of the active cell, e.g. <code>A1</code>.
+      * @since 3.14beta2
+      */
+    public void setActiveCell(CellAddress addr);
 }
index 6a4cba4c7cf2f479f70f29bbe285a9a71f6b794e..d4036c6fbfe349c2c7fed728b0d7047e2695d59f 100644 (file)
@@ -33,6 +33,7 @@ import org.apache.poi.ss.usermodel.FormulaError;
 import org.apache.poi.ss.usermodel.Hyperlink;
 import org.apache.poi.ss.usermodel.RichTextString;
 import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.util.CellAddress;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.util.LocaleUtil;
@@ -83,6 +84,14 @@ public class SXSSFCell implements Cell {
         return _row.getRowNum();
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public CellAddress getAddress() {
+        return new CellAddress(this);
+    }
+
     /**
      * Returns the sheet this cell belongs to
      *
@@ -564,15 +573,12 @@ public class SXSSFCell implements Cell {
     }
 
     /**
-     * Sets this cell as the active cell for the worksheet
+     * {@inheritDoc}
      */
-    @NotImplemented
     @Override
     public void setAsActiveCell()
     {
-        throw new RuntimeException("NotImplemented");
-        //TODO: What needs to be done here? Is there a "the active cell" at the sheet or even the workbook level?
-        //getRow().setAsActiveCell(this);
+        getSheet().setActiveCell(getAddress());
     }
 
     /**
index 4c86a759446045710ab44aebb11d23d23bccf4e9..3b4bd76e1338dc79d3dda30f72398c9359a2a639 100644 (file)
@@ -1874,4 +1874,20 @@ public class SXSSFSheet implements Sheet, Cloneable
     public int getColumnOutlineLevel(int columnIndex) {
         return _sh.getColumnOutlineLevel(columnIndex);
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public CellAddress getActiveCell() {
+        return _sh.getActiveCell();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setActiveCell(CellAddress addr) {
+        _sh.setActiveCell(addr);
+    }
 }
index 040ccc7eed9ee169d12120ee08d1903655e3560e..b4a17688bf50d9cb58288942756a2a851d8de575 100644 (file)
@@ -586,11 +586,19 @@ public final class XSSFCell implements Cell {
     public String getReference() {
         String ref = _cell.getR();
         if(ref == null) {
-            return new CellAddress(this).formatAsString();
+            return getAddress().formatAsString();
         }
         return ref;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public CellAddress getAddress() {
+        return new CellAddress(this);
+    }
+
     /**
      * Return the cell's style.
      *
@@ -816,11 +824,11 @@ public final class XSSFCell implements Cell {
     }
 
     /**
-     * Sets this cell as the active cell for the worksheet.
+     * {@inheritDoc}
      */
     @Override
     public void setAsActiveCell() {
-        getSheet().setActiveCell(getReference());
+        getSheet().setActiveCell(getAddress());
     }
 
     /**
index 1d927ec67252a3c514c36b818902efd184e731e4..d1a652bb97348ab58d4e04817f2c80551815d733 100644 (file)
@@ -3110,14 +3110,20 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
      *
      * @return the location of the active cell.
      */
-    public String getActiveCell() {
-        return getSheetTypeSelection().getActiveCell();
+    @Override
+    public CellAddress getActiveCell() {
+        String address = getSheetTypeSelection().getActiveCell();
+        if (address == null) {
+            return null;
+        }
+        return new CellAddress(address);
     }
 
     /**
      * Sets location of the active cell
      *
      * @param cellRef the location of the active cell, e.g. <code>A1</code>..
+     * @deprecated 3.14beta2 (circa 2015-12-05). Use {@link #setActiveCell(CellAddress)} instead.
      */
     public void setActiveCell(String cellRef) {
         CTSelection ctsel = getSheetTypeSelection();
@@ -3125,6 +3131,17 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
         ctsel.setSqref(Arrays.asList(cellRef));
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setActiveCell(CellAddress address) {
+        String ref = address.formatAsString();
+        CTSelection ctsel = getSheetTypeSelection();
+        ctsel.setActiveCell(ref);
+        ctsel.setSqref(Arrays.asList(ref));
+    }
+
     /**
      * Does this sheet have any comments on it? We need to know,
      *  so we can decide about writing it to disk or not
index 336901a13d20a53f4a8c8241e04aa6de67882e74..1ae86e434763bc4517c413963f01422c61a8f7c9 100644 (file)
@@ -50,6 +50,7 @@ import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.util.AreaReference;
+import org.apache.poi.ss.util.CellAddress;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.ss.util.CellUtil;
@@ -235,9 +236,10 @@ public final class TestXSSFSheet extends BaseTestSheet {
     public void getActiveCell() throws IOException {
         XSSFWorkbook workbook = new XSSFWorkbook();
         XSSFSheet sheet = workbook.createSheet();
-        sheet.setActiveCell("R5");
+        CellAddress R5 = new CellAddress("R5");
+        sheet.setActiveCell(R5);
 
-        assertEquals("R5", sheet.getActiveCell());
+        assertEquals(R5, sheet.getActiveCell());
         workbook.close();
     }
 
index de405f77b95847953913992e4c4345f3b225204c..1d20d6c2250b8dd6c32ee63edf122e90de490da1 100644 (file)
@@ -936,4 +936,22 @@ public abstract class BaseTestCell {
         }
         wb.close();
     }
+
+    /**
+     * Tests that the setAsActiveCell and getActiveCell function pairs work together
+     */
+    @Test
+    public void setAsActiveCell() throws IOException {
+        Workbook wb = _testDataProvider.createWorkbook();
+        Sheet sheet = wb.createSheet();
+        Row row = sheet.createRow(0);
+        Cell A1 = row.createCell(0);
+        Cell B1 = row.createCell(1);
+
+        A1.setAsActiveCell();
+        assertEquals(A1.getAddress(), sheet.getActiveCell());
+
+        B1.setAsActiveCell();
+        assertEquals(B1.getAddress(), sheet.getActiveCell());
+    }
 }
index 0f0c92c2a15fd1c6e6e4560e1c8990ceedcf3dbc..4929659f5007f35e946ef9cc3b4fed71657d6b80 100644 (file)
@@ -1152,4 +1152,29 @@ public abstract class BaseTestSheet {
         assertTrue(sheet.getMergedRegions().isEmpty());
         wb.close();
     }
+
+    /**
+     * Tests that the setAsActiveCell and getActiveCell function pairs work together
+     */
+    @Test
+    public void setActiveCell() throws IOException {
+        Workbook wb1 = _testDataProvider.createWorkbook();
+        Sheet sheet = wb1.createSheet();
+        CellAddress B42 = new CellAddress("B42");
+        
+        // active cell behavior is undefined if not set.
+        // HSSFSheet defaults to A1 active cell, while XSSFSheet defaults to null.
+        if (sheet.getActiveCell() != null && !sheet.getActiveCell().equals(CellAddress.A1)) {
+            fail("If not set, active cell should default to null or A1");
+        }
+
+        sheet.setActiveCell(B42);
+
+        Workbook wb2 = _testDataProvider.writeOutAndReadBack(wb1);
+
+        assertEquals(B42, sheet.getActiveCell());
+
+        wb1.close();
+        wb2.close();
+    }
 }