]> source.dussan.org Git - poi.git/commitdiff
44523 - fixed workbook sheet selection and focus
authorJosh Micich <josh@apache.org>
Thu, 15 May 2008 23:30:08 +0000 (23:30 +0000)
committerJosh Micich <josh@apache.org>
Thu, 15 May 2008 23:30:08 +0000 (23:30 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@656893 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/model/Sheet.java
src/java/org/apache/poi/hssf/record/WindowOneRecord.java
src/java/org/apache/poi/hssf/record/WindowTwoRecord.java
src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java

index 2f0c4280ca8497813cbbdbea73129d4a6889f298..7a44109601a1113fec991072505ee56a5fc2bafb 100644 (file)
@@ -37,6 +37,7 @@
 
                <!-- Don't forget to update status.xml too! -->
         <release version="3.1-beta2" date="2008-05-??">
+           <action dev="POI-DEVELOPERS" type="fix">44523 - fixed workbook sheet selection and focus</action>
            <action dev="POI-DEVELOPERS" type="fix">45000 - Fixed NPE in ListLevel when numberText is null</action>
            <action dev="POI-DEVELOPERS" type="fix">44985 - Properly update TextSpecInfoAtom when the parent text is changed</action>
            <action dev="POI-DEVELOPERS" type="fix">41187 - fixed HSSFSheet to properly read xls files without ROW records</action>
index 854df3b0e2b4dc0270fd3e23181f469a95155f4e..200c62e1272b09c14f1c77fbeea701d1d3c76560 100644 (file)
@@ -34,6 +34,7 @@
        <!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.1-beta2" date="2008-05-??">
+           <action dev="POI-DEVELOPERS" type="fix">44523 - fixed workbook sheet selection and focus</action>
            <action dev="POI-DEVELOPERS" type="fix">45000 - Fixed NPE in ListLevel when numberText is null</action>
            <action dev="POI-DEVELOPERS" type="fix">44985 - Properly update TextSpecInfoAtom when the parent text is changed</action>
            <action dev="POI-DEVELOPERS" type="fix">41187 - fixed HSSFSheet to properly read xls files without ROW records</action>
index 2dac8b1d06878d4371704617cbb16c424f538e9f..45090e85cf161bcd22ed837434e0a7a74b1710e4 100644 (file)
@@ -2131,6 +2131,9 @@ public final class Sheet implements Model {
     return header;
     }
 
+    public WindowTwoRecord getWindowTwo() {
+        return windowTwo;
+    }
     /**
      * Sets the HeaderRecord.
      * @param newHeader The new HeaderRecord for the sheet.
index f101cb59af8ef94f742af7de635fb99e9593fa25..4c836f2ee83e731d15ba44c6b2d1780cc3826fbb 100644 (file)
@@ -57,8 +57,8 @@ public class WindowOneRecord
         BitFieldFactory.getInstance(0x20);                                        // display tabs at the bottom
 
     // all the rest are "reserved"
-    private short                 field_6_selected_tab;
-    private short                 field_7_displayed_tab;
+    private int                   field_6_active_sheet;
+    private int                   field_7_first_visible_tab;
     private short                 field_8_num_selected_tabs;
     private short                 field_9_tab_width_ratio;
 
@@ -91,8 +91,8 @@ public class WindowOneRecord
         field_3_width             = in.readShort();
         field_4_height            = in.readShort();
         field_5_options           = in.readShort();
-        field_6_selected_tab      = in.readShort();
-        field_7_displayed_tab     = in.readShort();
+        field_6_active_sheet      = in.readShort();
+        field_7_first_visible_tab     = in.readShort();
         field_8_num_selected_tabs = in.readShort();
         field_9_tab_width_ratio   = in.readShort();
     }
@@ -202,24 +202,33 @@ public class WindowOneRecord
 
     // end bitfields
 
+    public void setActiveSheetIndex(int index) {
+       field_6_active_sheet = index;
+       }
     /**
-     * set the selected tab number
-     * @param s  tab number
+     * deprecated May 2008
+     * @deprecated - Misleading name - use setActiveSheetIndex() 
      */
-
     public void setSelectedTab(short s)
     {
-        field_6_selected_tab = s;
+        setActiveSheetIndex(s);
     }
 
     /**
-     * set the displayed tab number
-     * @param t  tab number
+     * Sets the first visible sheet in the worksheet tab-bar.  This method does <b>not</b>
+     *  hide, select or focus sheets.  It just sets the scroll position in the tab-bar.
+     * @param t the sheet index of the tab that will become the first in the tab-bar
      */
+    public void setFirstVisibleTab(int t) {
+        field_7_first_visible_tab = t;
+    }
 
-    public void setDisplayedTab(short t)
-    {
-        field_7_displayed_tab = t;
+    /**
+     * deprecated May 2008
+     * @deprecated - Misleading name - use setFirstVisibleTab() 
+     */
+    public void setDisplayedTab(short t) {
+        setFirstVisibleTab(t);
     }
 
     /**
@@ -347,24 +356,36 @@ public class WindowOneRecord
 
     // end options bitfields
 
+    
     /**
-     * get the selected tab number
-     * @return Tab number
+     * @return the index of the currently displayed sheet 
+     */
+    public int getActiveSheetIndex() {
+       return field_6_active_sheet;
+    }
+    /**
+     * deprecated May 2008
+     * @deprecated - Misleading name - use getActiveSheetIndex() 
      */
-
     public short getSelectedTab()
     {
-        return field_6_selected_tab;
+        return (short) getActiveSheetIndex();
     }
 
     /**
-     * get the displayed tab number
-     * @return Tab number
+     * @return the first visible sheet in the worksheet tab-bar. 
+     * I.E. the scroll position of the tab-bar.
+     */
+    public int getFirstVisibleTab() {
+        return field_7_first_visible_tab;
+    }
+    /**
+     * deprecated May 2008
+     * @deprecated - Misleading name - use getFirstVisibleTab() 
      */
-
     public short getDisplayedTab()
     {
-        return field_7_displayed_tab;
+        return (short) getFirstVisibleTab();
     }
 
     /**
@@ -412,10 +433,10 @@ public class WindowOneRecord
             .append(getDisplayVerticalScrollbar()).append("\n");
         buffer.append("        .tabs        = ").append(getDisplayTabs())
             .append("\n");
-        buffer.append("    .selectedtab     = ")
-            .append(Integer.toHexString(getSelectedTab())).append("\n");
-        buffer.append("    .displayedtab    = ")
-            .append(Integer.toHexString(getDisplayedTab())).append("\n");
+        buffer.append("    .activeSheet     = ")
+            .append(Integer.toHexString(getActiveSheetIndex())).append("\n");
+        buffer.append("    .firstVisibleTab    = ")
+            .append(Integer.toHexString(getFirstVisibleTab())).append("\n");
         buffer.append("    .numselectedtabs = ")
             .append(Integer.toHexString(getNumSelectedTabs())).append("\n");
         buffer.append("    .tabwidthratio   = ")
@@ -434,8 +455,8 @@ public class WindowOneRecord
         LittleEndian.putShort(data, 8 + offset, getWidth());
         LittleEndian.putShort(data, 10 + offset, getHeight());
         LittleEndian.putShort(data, 12 + offset, getOptions());
-        LittleEndian.putShort(data, 14 + offset, getSelectedTab());
-        LittleEndian.putShort(data, 16 + offset, getDisplayedTab());
+        LittleEndian.putUShort(data, 14 + offset, getActiveSheetIndex());
+        LittleEndian.putUShort(data, 16 + offset, getFirstVisibleTab());
         LittleEndian.putShort(data, 18 + offset, getNumSelectedTabs());
         LittleEndian.putShort(data, 20 + offset, getTabWidthRatio());
         return getRecordSize();
index f6b51996d5d01ce281cbce09c4b8b21066aa8d86..e2bb6d5609d618f20911e576333dc251faa9bc0c 100644 (file)
@@ -54,7 +54,7 @@ public class WindowTwoRecord
     private BitField          displayGuts             = BitFieldFactory.getInstance(0x80);
     private BitField          freezePanesNoSplit      = BitFieldFactory.getInstance(0x100);
     private BitField          selected                = BitFieldFactory.getInstance(0x200);
-    private BitField          paged                   = BitFieldFactory.getInstance(0x400);
+    private BitField          active                  = BitFieldFactory.getInstance(0x400);
     private BitField          savedInPageBreakPreview = BitFieldFactory.getInstance(0x800);
 
     // 4-7 reserved
@@ -222,12 +222,16 @@ public class WindowTwoRecord
      * is the sheet currently displayed in the window
      * @param p  displayed or not
      */
-
-    public void setPaged(boolean p)
-    {
-        field_1_options = paged.setShortBoolean(field_1_options, p);
+    public void setActive(boolean p) {
+        field_1_options = active.setShortBoolean(field_1_options, p);
+    }
+    /**
+     * deprecated May 2008
+     * @deprecated use setActive()
+     */
+    public void setPaged(boolean p) {
+       setActive(p);
     }
-
     /**
      * was the sheet saved in page break view
      * @param p  pagebreaksaved or not
@@ -416,9 +420,15 @@ public class WindowTwoRecord
      * @return displayed or not
      */
 
-    public boolean getPaged()
-    {
-        return paged.isSet(field_1_options);
+    public boolean isActive() {
+        return active.isSet(field_1_options);
+    }
+    /**
+     * deprecated May 2008
+     * @deprecated use isActive()
+     */
+    public boolean getPaged() {
+        return isActive();
     }
 
     /**
@@ -520,7 +530,7 @@ public class WindowTwoRecord
             .append(getFreezePanesNoSplit()).append("\n");
         buffer.append("       .selected    = ").append(getSelected())
             .append("\n");
-        buffer.append("       .paged       = ").append(getPaged())
+        buffer.append("       .active       = ").append(isActive())
             .append("\n");
         buffer.append("       .svdinpgbrkpv= ")
             .append(getSavedInPageBreakPreview()).append("\n");
index 44185cdfd8f56593afb398ab4b7576399d9fc5bf..ced8719809bf56d825c2fd35133f907065e4e19e 100644 (file)
@@ -977,13 +977,34 @@ public final class HSSFSheet {
         return new HSSFFooter( getSheet().getFooter() );
     }
 
+    /**
+     * Note - this is not the same as whether the sheet is focused (isActive)
+     * @return <code>true</code> if this sheet is currently selected
+     */
+    public boolean isSelected() {
+        return getSheet().getWindowTwo().getSelected();
+    }
     /**
      * Sets whether sheet is selected.
      * @param sel Whether to select the sheet or deselect the sheet.
      */
     public void setSelected( boolean sel )
     {
-        getSheet().setSelected( sel );
+        getSheet().getWindowTwo().setSelected(sel);
+    }
+    /**
+     * @return <code>true</code> if this sheet is currently focused
+     */
+    public boolean isActive() {
+        return getSheet().getWindowTwo().isActive();
+    }
+    /**
+     * Sets whether sheet is selected.
+     * @param sel Whether to select the sheet or deselect the sheet.
+     */
+    public void setActive(boolean sel )
+    {
+        getSheet().getWindowTwo().setActive(sel);
     }
 
     /**
index 78fe260136fb91e030b48f12eb0125a2995bea55..d49c601dcb7716be4a478de8b484507d373102c8 100644 (file)
@@ -365,16 +365,66 @@ public class HSSFWorkbook extends POIDocument
         workbook.setSheetOrder(sheetname, pos);
     }
 
+    private void validateSheetIndex(int index) {
+        int lastSheetIx = sheets.size() - 1;
+        if (index < 0 || index > lastSheetIx) {
+            throw new IllegalArgumentException("Sheet index (" 
+                    + index +") is out of range (0.." +    lastSheetIx + ")");
+        }
+    }
+    
     /**
-     * sets the tab whose data is actually seen when the sheet is opened.
-     * This may be different from the "selected sheet" since excel seems to
-     * allow you to show the data of one sheet when another is seen "selected"
-     * in the tabs (at the bottom).
-     * @see org.apache.poi.hssf.usermodel.HSSFSheet#setSelected(boolean)
-     * @param index
+     * Selects a single sheet. This may be different to
+     * the 'active' sheet (which is the sheet with focus).  
+     */
+    public void setSelectedTab(int index) {
+        
+        validateSheetIndex(index);
+        int nSheets = sheets.size();
+        for (int i=0; i<nSheets; i++) {
+               getSheetAt(i).setSelected(i == index);
+        }
+        workbook.getWindowOne().setNumSelectedTabs((short)1);
+    }
+    /**
+     * deprecated May 2008
+     * @deprecated use setSelectedTab(int)
      */
     public void setSelectedTab(short index) {
-        workbook.getWindowOne().setSelectedTab(index);
+        setSelectedTab((int)index);
+    }
+    public void setSelectedTabs(int[] indexes) {
+        
+        for (int i = 0; i < indexes.length; i++) {
+            validateSheetIndex(indexes[i]);
+        }
+        int nSheets = sheets.size();
+        for (int i=0; i<nSheets; i++) {
+            boolean bSelect = false;
+            for (int j = 0; j < indexes.length; j++) {
+                if (indexes[j] == i) {
+                    bSelect = true;
+                    break;
+                }
+                
+            }
+               getSheetAt(i).setSelected(bSelect);
+        }
+        workbook.getWindowOne().setNumSelectedTabs((short)indexes.length);
+    }
+    /**
+     * Convenience method to set the active sheet.  The active sheet is is the sheet
+     * which is currently displayed when the workbook is viewed in Excel.
+     * 'Selected' sheet(s) is a distinct concept.
+     */
+    public void setActiveSheet(int index) {
+        
+        validateSheetIndex(index);
+        int nSheets = sheets.size();
+        for (int i=0; i<nSheets; i++) {
+             getSheetAt(i).setActive(i == index);
+        }
+        workbook.getWindowOne().setActiveSheetIndex(index);
     }
 
     /**
@@ -384,25 +434,46 @@ public class HSSFWorkbook extends POIDocument
      * in the tabs (at the bottom).
      * @see org.apache.poi.hssf.usermodel.HSSFSheet#setSelected(boolean)
      */
+    public int getActiveSheetIndex() {
+        return workbook.getWindowOne().getActiveSheetIndex();
+    }
+    /**
+     * deprecated May 2008
+     * @deprecated - Misleading name - use getActiveSheetIndex() 
+     */
     public short getSelectedTab() {
-        return workbook.getWindowOne().getSelectedTab();
+        return (short) getActiveSheetIndex();
     }
 
+    
     /**
      * sets the first tab that is displayed in the list of tabs
      * in excel.
      * @param index
      */
+    public void setFirstVisibleTab(int index) {
+        workbook.getWindowOne().setFirstVisibleTab(index);
+    }
+    /**
+     * deprecated May 2008
+     * @deprecated - Misleading name - use setFirstVisibleTab() 
+     */
     public void setDisplayedTab(short index) {
-        workbook.getWindowOne().setDisplayedTab(index);
+       setFirstVisibleTab(index);
     }
 
     /**
-     * sets the first tab that is displayed in the list of tabs
-     * in excel.
+     * sets the first tab that is displayed in the list of tabs in excel.
+     */
+    public int getFirstVisibleTab() {
+        return workbook.getWindowOne().getFirstVisibleTab();
+    }
+    /**
+     * deprecated May 2008
+     * @deprecated - Misleading name - use getFirstVisibleTab() 
      */
     public short getDisplayedTab() {
-        return workbook.getWindowOne().getDisplayedTab();
+        return (short) getFirstVisibleTab();
     }
 
     /**
@@ -563,17 +634,13 @@ public class HSSFWorkbook extends POIDocument
 
     public HSSFSheet createSheet()
     {
-
-//        if (getNumberOfSheets() == 3)
-//            throw new RuntimeException("You cannot have more than three sheets in HSSF 1.0");
         HSSFSheet sheet = new HSSFSheet(this);
 
         sheets.add(sheet);
-        workbook.setSheetName(sheets.size() - 1,
-                "Sheet" + (sheets.size() - 1));
-        WindowTwoRecord windowTwo = (WindowTwoRecord) sheet.getSheet().findFirstRecordBySid(WindowTwoRecord.sid);
-        windowTwo.setSelected(sheets.size() == 1);
-        windowTwo.setPaged(sheets.size() == 1);
+        workbook.setSheetName(sheets.size() - 1, "Sheet" + (sheets.size() - 1));
+        boolean isOnlySheet = sheets.size() == 1;
+        sheet.setSelected(isOnlySheet);
+        sheet.setActive(isOnlySheet);
         return sheet;
     }
 
@@ -584,23 +651,24 @@ public class HSSFWorkbook extends POIDocument
      */
 
     public HSSFSheet cloneSheet(int sheetNum) {
-      HSSFSheet srcSheet = (HSSFSheet)sheets.get(sheetNum);
-      String srcName = workbook.getSheetName(sheetNum);
-      if (srcSheet != null) {
+        validateSheetIndex(sheetNum);
+        HSSFSheet srcSheet = (HSSFSheet) sheets.get(sheetNum);
+        String srcName = workbook.getSheetName(sheetNum);
         HSSFSheet clonedSheet = srcSheet.cloneSheet(this);
-        WindowTwoRecord windowTwo = (WindowTwoRecord) clonedSheet.getSheet().findFirstRecordBySid(WindowTwoRecord.sid);
-        windowTwo.setSelected(sheets.size() == 1);
-        windowTwo.setPaged(sheets.size() == 1);
+        clonedSheet.setSelected(false);
+        clonedSheet.setActive(false);
 
         sheets.add(clonedSheet);
-        int i=1;
+        int i = 1;
         while (true) {
-            //Try and find the next sheet name that is unique
+            // Try and find the next sheet name that is unique
             String name = srcName;
             String index = Integer.toString(i++);
-            if (name.length()+index.length()+2<31)
-              name = name + "("+index+")";
-            else name = name.substring(0, 31-index.length()-2)+"("+index+")";
+            if (name.length() + index.length() + 2 < 31) {
+                name = name + "(" + index + ")";
+            } else {
+                name = name.substring(0, 31 - index.length() - 2) + "(" + index + ")";
+            }
 
             //If the sheet name is unique, then set it otherwise move on to the next number.
             if (workbook.getSheetIndex(name) == -1) {
@@ -609,18 +677,18 @@ public class HSSFWorkbook extends POIDocument
             }
         }
         return clonedSheet;
-      }
-      return null;
     }
 
     /**
-     * create an HSSFSheet for this HSSFWorkbook, adds it to the sheets and returns
-     * the high level representation.  Use this to create new sheets.
-     *
-     * @param sheetname     sheetname to set for the sheet.
+     * create an HSSFSheet for this HSSFWorkbook, adds it to the sheets and
+     * returns the high level representation. Use this to create new sheets.
+     * 
+     * @param sheetname
+     *            sheetname to set for the sheet.
      * @return HSSFSheet representing the new sheet.
-     * @throws IllegalArgumentException if there is already a sheet present with a case-insensitive
-     *  match for the specified name.
+     * @throws IllegalArgumentException
+     *             if there is already a sheet present with a case-insensitive
+     *             match for the specified name.
      */
 
     public HSSFSheet createSheet(String sheetname)
@@ -632,9 +700,9 @@ public class HSSFWorkbook extends POIDocument
 
         sheets.add(sheet);
         workbook.setSheetName(sheets.size() - 1, sheetname);
-        WindowTwoRecord windowTwo = (WindowTwoRecord) sheet.getSheet().findFirstRecordBySid(WindowTwoRecord.sid);
-        windowTwo.setSelected(sheets.size() == 1);
-        windowTwo.setPaged(sheets.size() == 1);
+        boolean isOnlySheet = sheets.size() == 1;
+        sheet.setSelected(isOnlySheet);
+        sheet.setActive(isOnlySheet);
         return sheet;
     }
 
@@ -834,8 +902,7 @@ public class HSSFWorkbook extends POIDocument
         HSSFPrintSetup printSetup = sheet.getPrintSetup();
         printSetup.setValidSettings(false);
 
-        WindowTwoRecord w2 = (WindowTwoRecord) sheet.getSheet().findFirstRecordBySid(WindowTwoRecord.sid);
-        w2.setPaged(true);
+        sheet.setActive(true);
     }
 
     private NameRecord findExistingRowColHeaderNameRecord( int sheetIndex )