]> source.dussan.org Git - poi.git/commitdiff
sonar fixes
authorAndreas Beeker <kiwiwings@apache.org>
Sat, 2 Jun 2018 13:01:14 +0000 (13:01 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Sat, 2 Jun 2018 13:01:14 +0000 (13:01 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1832735 13f79535-47bb-0310-9956-ffa450edef68

13 files changed:
src/java/org/apache/poi/common/usermodel/fonts/FontGroup.java
src/java/org/apache/poi/sl/draw/SLGraphics.java
src/java/org/apache/poi/ss/formula/EvaluationConditionalFormatRule.java
src/java/org/apache/poi/ss/usermodel/TableStyleType.java
src/ooxml/java/org/apache/poi/openxml4j/opc/EncryptionOption.java [deleted file]
src/ooxml/java/org/apache/poi/openxml4j/opc/PackageRelationshipCollection.java
src/ooxml/java/org/apache/poi/poifs/crypt/dsig/SignatureInfo.java
src/scratchpad/src/org/apache/poi/hpbf/model/HPBFPart.java
src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java
src/scratchpad/src/org/apache/poi/hslf/model/textproperties/HSLFTabStopPropCollection.java
src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java
src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java
src/scratchpad/src/org/apache/poi/hwpf/model/ListTables.java

index c8a1a1cc04645f2bc608e642dc6942f3fbe36fb9..1cfdc3aeca8ec3c2352d0c21284d3f9241f155b8 100644 (file)
@@ -111,18 +111,18 @@ public enum FontGroup {
      * @return the FontGroup
      */
     public static List<FontGroupRange> getFontGroupRanges(final String runText) {
-        List<FontGroupRange> ttrList = new ArrayList<>();
+        final List<FontGroupRange> ttrList = new ArrayList<>();
         if (runText == null || runText.isEmpty()) {
             return ttrList;
         }
         FontGroupRange ttrLast = null;
-        final int rlen = (runText != null) ? runText.length() : 0;
+        final int rlen = runText.length();
         for(int cp, i = 0, charCount; i < rlen; i += charCount) {
             cp = runText.codePointAt(i);
             charCount = Character.charCount(cp);
 
             // don't switch the font group for a few default characters supposedly available in all fonts
-            FontGroup tt;
+            final FontGroup tt;
             if (ttrLast != null && " \n\r".indexOf(cp) > -1) {
                 tt = ttrLast.fontGroup;
             } else {
index c9b70cfba08ae8c2392acf087dba154b3a45ef19..fada4c64314fe7252a5b0ebc741d0eb5b203c101 100644 (file)
@@ -67,12 +67,10 @@ import org.apache.poi.util.SuppressForbidden;
 
 /**
  * Translates Graphics2D calls into PowerPoint.
- *
- * @author Yegor Kozlov
  */
-public final class SLGraphics extends Graphics2D implements Cloneable {
+public class SLGraphics extends Graphics2D implements Cloneable {
 
-    protected POILogger log = POILogFactory.getLogger(this.getClass());
+    private static final POILogger LOG = POILogFactory.getLogger(SLGraphics.class);
 
     //The ppt object to write into.
     private GroupShape<?,?> _group;
@@ -303,7 +301,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
         float ascent = layout.getAscent();
 
         float width = (float) Math.floor(layout.getAdvance());
-        /**
+
+        /*
          * Even if top and bottom margins are set to 0 PowerPoint
          * always sets extra space between the text and its bounding box.
          *
@@ -384,8 +383,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
      */
     @NotImplemented
     public void clip(Shape s){
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
     }
 
@@ -407,8 +406,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
      */
     @NotImplemented
     public Shape getClip(){
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
         return null;
     }
@@ -676,8 +675,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
     public boolean drawImage(Image img, int x, int y,
                              Color bgcolor,
                              ImageObserver observer){
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
 
         return false;
@@ -726,8 +725,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
                              int width, int height,
                              Color bgcolor,
                              ImageObserver observer){
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
 
         return false;
@@ -786,8 +785,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
                              int dx1, int dy1, int dx2, int dy2,
                              int sx1, int sy1, int sx2, int sy2,
                              ImageObserver observer){
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
         return false;
     }
@@ -851,8 +850,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
                              int sx1, int sy1, int sx2, int sy2,
                              Color bgcolor,
                              ImageObserver observer){
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
         return false;
     }
@@ -892,8 +891,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
     @NotImplemented
     public boolean drawImage(Image img, int x, int y,
                              ImageObserver observer) {
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
         return false;
     }
@@ -1079,8 +1078,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
      */
     @NotImplemented
     public void setClip(Shape clip) {
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
     }
 
@@ -1102,11 +1101,10 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
      * @since       JDK1.1
      */
     public Rectangle getClipBounds(){
-        Shape c = getClip();
-        if (c==null) {
-            return null;
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
-        return c.getBounds();
+        return null;
     }
 
     /**
@@ -1379,8 +1377,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
      */
     @NotImplemented
     public void setComposite(Composite comp){
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
     }
 
@@ -1393,8 +1391,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
      */
     @NotImplemented
     public Composite getComposite(){
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
         return null;
     }
@@ -1537,8 +1535,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
      */
     @NotImplemented
     public void drawString(AttributedCharacterIterator iterator, float x, float y) {
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
     }
 
@@ -1644,8 +1642,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
      */
     @NotImplemented
     public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) {
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
         return false;
     }
@@ -1690,8 +1688,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
     public boolean drawImage(Image img, int x, int y,
                              int width, int height,
                              ImageObserver observer) {
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
         return false;
     }
@@ -1741,8 +1739,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
      */
     @NotImplemented
     public void setXORMode(Color c1) {
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
     }
 
@@ -1755,8 +1753,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
      */
     @NotImplemented
     public void setPaintMode() {
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
     }
 
@@ -1793,8 +1791,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
      */
     @NotImplemented
     public void drawRenderedImage(RenderedImage img, AffineTransform xform) {
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
     }
 
@@ -1821,8 +1819,8 @@ public final class SLGraphics extends Graphics2D implements Cloneable {
      */
     @NotImplemented
     public void drawRenderableImage(RenderableImage img, AffineTransform xform) {
-        if (log.check(POILogger.WARN)) {
-            log.log(POILogger.WARN, "Not implemented");
+        if (LOG.check(POILogger.WARN)) {
+            LOG.log(POILogger.WARN, "Not implemented");
         }
     }
 
index 55a684d5cdf210e18990f2dfc71c82877f6ee33b..42c626b512dbfcca7269671eb7927274cdd32051 100644 (file)
@@ -632,7 +632,7 @@ public class EvaluationConditionalFormatRule implements Comparable<EvaluationCon
             for (int c = region.getFirstColumn(); c <= region.getLastColumn(); c++) {
                 Cell cell = row.getCell(c);
                 final ValueAndFormat cv = getCellValue(cell);
-                if (cv != null && (withText || cv.isNumber()) ) {
+                if (withText || cv.isNumber()) {
                     allValues.add(cv);
                 }
             }
@@ -646,13 +646,19 @@ public class EvaluationConditionalFormatRule implements Comparable<EvaluationCon
 
     private ValueAndFormat getCellValue(Cell cell) {
         if (cell != null) {
-            final CellType type = cell.getCellType();
-            if (type == CellType.NUMERIC || (type == CellType.FORMULA && cell.getCachedFormulaResultType() == CellType.NUMERIC) ) {
-                return new ValueAndFormat(Double.valueOf(cell.getNumericCellValue()), cell.getCellStyle().getDataFormatString(), decimalTextFormat);
-            } else if (type == CellType.STRING || (type == CellType.FORMULA && cell.getCachedFormulaResultType() == CellType.STRING) ) {
-                return new ValueAndFormat(cell.getStringCellValue(), cell.getCellStyle().getDataFormatString());
-            } else if (type == CellType.BOOLEAN || (type == CellType.FORMULA && cell.getCachedFormulaResultType() == CellType.BOOLEAN) ) {
-                return new ValueAndFormat(cell.getStringCellValue(), cell.getCellStyle().getDataFormatString());
+            final String format = cell.getCellStyle().getDataFormatString();
+            CellType type = cell.getCellType();
+            if (type == CellType.FORMULA) {
+                type = cell.getCachedFormulaResultType();
+            }
+            switch (type) {
+                case NUMERIC:
+                    return new ValueAndFormat(Double.valueOf(cell.getNumericCellValue()), format, decimalTextFormat);
+                case STRING:
+                case BOOLEAN:
+                    return new ValueAndFormat(cell.getStringCellValue(), format);
+                default:
+                    break;
             }
         }
         return new ValueAndFormat("", "");
index 0bf5a0b56acb17f68888c448190cf372481c17ee..be7c84c69710a514963408e025b8c4ce019beebc 100644 (file)
@@ -59,14 +59,15 @@ public enum TableStyleType {
             
             int firstStart = table.getStartColIndex();
             int secondStart = firstStart + c1Stripe;
-            int c = cell.getCol();
+            final int c = cell.getCol();
             
             // look for the stripe containing c, accounting for the style element stripe size
             // could do fancy math, but tables can't be that wide, a simple loop is fine
             // if not in this type of stripe, return null
-            while (true) {
-                if (firstStart > c) break;
-                if (c >= firstStart && c <= secondStart -1) return new CellRangeAddress(table.getStartRowIndex(), table.getEndRowIndex(), firstStart, secondStart - 1);
+            while (firstStart <= c) {
+                if (c >= firstStart && c <= secondStart -1) {
+                    return new CellRangeAddress(table.getStartRowIndex(), table.getEndRowIndex(), firstStart, secondStart - 1);
+                }
                 firstStart = secondStart + c2Stripe;
                 secondStart = firstStart + c1Stripe;
             }
@@ -86,14 +87,15 @@ public enum TableStyleType {
 
             int firstStart = table.getStartColIndex();
             int secondStart = firstStart + c1Stripe;
-            int c = cell.getCol();
+            final int c = cell.getCol();
             
             // look for the stripe containing c, accounting for the style element stripe size
             // could do fancy math, but tables can't be that wide, a simple loop is fine
             // if not in this type of stripe, return null
-            while (true) {
-                if (firstStart > c) break;
-                if (c >= secondStart && c <= secondStart + c2Stripe -1) return new CellRangeAddress(table.getStartRowIndex(), table.getEndRowIndex(), secondStart, secondStart + c2Stripe - 1);
+            while (firstStart <= c) {
+                if (c >= secondStart && c <= secondStart + c2Stripe -1) {
+                    return new CellRangeAddress(table.getStartRowIndex(), table.getEndRowIndex(), secondStart, secondStart + c2Stripe - 1);
+                }
                 firstStart = secondStart + c2Stripe;
                 secondStart = firstStart + c1Stripe;
             }
@@ -113,14 +115,15 @@ public enum TableStyleType {
 
             int firstStart = table.getStartRowIndex() + table.getHeaderRowCount();
             int secondStart = firstStart + c1Stripe;
-            int c = cell.getRow();
+            final int c = cell.getRow();
             
             // look for the stripe containing c, accounting for the style element stripe size
             // could do fancy math, but tables can't be that wide, a simple loop is fine
             // if not in this type of stripe, return null
-            while (true) {
-                if (firstStart > c) break;
-                if (c >= firstStart && c <= secondStart -1) return new CellRangeAddress(firstStart, secondStart - 1, table.getStartColIndex(), table.getEndColIndex());
+            while (firstStart <= c) {
+                if (c >= firstStart && c <= secondStart -1) {
+                    return new CellRangeAddress(firstStart, secondStart - 1, table.getStartColIndex(), table.getEndColIndex());
+                }
                 firstStart = secondStart + c2Stripe;
                 secondStart = firstStart + c1Stripe;
             }
@@ -140,14 +143,15 @@ public enum TableStyleType {
 
             int firstStart = table.getStartRowIndex() + table.getHeaderRowCount();
             int secondStart = firstStart + c1Stripe;
-            int c = cell.getRow();
+            final int c = cell.getRow();
             
             // look for the stripe containing c, accounting for the style element stripe size
             // could do fancy math, but tables can't be that wide, a simple loop is fine
             // if not in this type of stripe, return null
-            while (true) {
-                if (firstStart > c) break;
-                if (c >= secondStart && c <= secondStart +c2Stripe -1) return new CellRangeAddress(secondStart, secondStart + c2Stripe - 1, table.getStartColIndex(), table.getEndColIndex());
+            while (firstStart <= c) {
+                if (c >= secondStart && c <= secondStart +c2Stripe -1) {
+                    return new CellRangeAddress(secondStart, secondStart + c2Stripe - 1, table.getStartColIndex(), table.getEndColIndex());
+                }
                 firstStart = secondStart + c2Stripe;
                 secondStart = firstStart + c1Stripe;
             }
diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/EncryptionOption.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/EncryptionOption.java
deleted file mode 100644 (file)
index bc994e0..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* ====================================================================
-   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.openxml4j.opc;
-
-/**
- * Specifies the encryption option for parts in a Package.
- *
- * @author Julien Chable
- * @version 0.1
- */
-public enum EncryptionOption {
-    /** No encryption. */
-    NONE
-}
index b70d0aed1651b163546aa08ceaf386f8d43e8f43..9b1bfedb27b4d8ba4e4331b0e8be8d93c699227d 100644 (file)
@@ -244,13 +244,11 @@ public final class PackageRelationshipCollection implements
      *            The relationship ID to remove.
      */
     public void removeRelationship(String id) {
-        if (relationshipsByID != null && relationshipsByType != null) {
-            PackageRelationship rel = relationshipsByID.get(id);
-            if (rel != null) {
-                relationshipsByID.remove(rel.getId());
-                relationshipsByType.values().remove(rel);
-                internalRelationshipsByTargetName.values().remove(rel);
-            }
+        PackageRelationship rel = relationshipsByID.get(id);
+        if (rel != null) {
+            relationshipsByID.remove(rel.getId());
+            relationshipsByType.values().remove(rel);
+            internalRelationshipsByTargetName.values().remove(rel);
         }
     }
 
@@ -413,28 +411,23 @@ public final class PackageRelationshipCollection implements
 
     @Override
     public String toString() {
-        String str;
-        if (relationshipsByID == null) {
-            str = "relationshipsByID=null";
-        } else {
-            str = relationshipsByID.size() + " relationship(s) = [";
-        }
+        String str = relationshipsByID.size() + " relationship(s) = [";
         if ((relationshipPart != null) && (relationshipPart._partName != null)) {
-            str = str + "," + relationshipPart._partName;
+            str += relationshipPart._partName;
         } else {
-            str = str + ",relationshipPart=null";
+            str += "relationshipPart=null";
         }
 
         // Source of this relationship
         if ((sourcePart != null) && (sourcePart._partName != null)) {
-            str = str + "," + sourcePart._partName;
+            str += "," + sourcePart._partName;
         } else {
-            str = str + ",sourcePart=null";
+            str += ",sourcePart=null";
         }
         if (partName != null) {
-            str = str + "," + partName;
+            str += "," + partName;
         } else {
-            str = str + ",uri=null)";
+            str += ",uri=null)";
         }
         return str + "]";
     }
index 730331c72b2d112c6df5a6922b5fbc01462b6856..285e2262008e7e943738f031b79a405ab9d069a9 100644 (file)
@@ -316,7 +316,7 @@ public class SignatureInfo implements SignatureConfigurable {
                             } catch (InvalidFormatException e) {
                                 LOG.log(POILogger.WARN, "Reference to signature is invalid.", e);
                             }
-                        } while (sigPart == null);
+                        } while (sigRelPart == null);
                         return new SignaturePart(sigRelPart, signatureConfig);
                     }
 
index 49e2ac43a25ed4f589bd0a83be1502e4df5a5195..f3fefe55c63a5578cb5b68b9027bafae32fa87e7 100644 (file)
@@ -32,12 +32,15 @@ import org.apache.poi.util.IOUtils;
  */
 public abstract class HPBFPart {
        private byte[] data;
+       private final String[] path;
+
        /**
         * @param path  the path to the part, eg Contents or Quill, QuillSub, CONTENTS
         */
        public HPBFPart(DirectoryNode baseDir, String[] path) throws IOException {
+               this.path = path;
 
-               DirectoryNode dir = getDir(path, baseDir);
+               DirectoryNode dir = getDir(baseDir, path);
                String name = path[path.length-1];
 
                if (!dir.hasEntry(name)) {
@@ -45,11 +48,12 @@ public abstract class HPBFPart {
                }
 
                // Grab the data from the part stream
-               InputStream is = dir.createDocumentInputStream(name);
-               data = IOUtils.toByteArray(is);
-               is.close();
+               try (InputStream is = dir.createDocumentInputStream(name)) {
+                       data = IOUtils.toByteArray(is);
+               }
        }
-       private DirectoryNode getDir(String[] path, DirectoryNode baseDir) {
+
+       private static DirectoryNode getDir(DirectoryNode baseDir, String[] path) {
                DirectoryNode dir = baseDir;
                for(int i=0; i<path.length-1; i++) {
                        try {
@@ -64,9 +68,6 @@ public abstract class HPBFPart {
 
        public void writeOut(DirectoryNode baseDir) throws IOException {
                String[] path = getPath();
-               if (path == null) {
-                       return;
-               }
 
                // Ensure that all parent directories exist
                DirectoryNode dir = baseDir;
@@ -97,7 +98,9 @@ public abstract class HPBFPart {
         * Returns the raw data that makes up
         *  this document part.
         */
-       public final byte[] getData() { return data; }
+       public final byte[] getData() {
+               return data;
+       }
        
        protected final void setData(byte data[]) {
            this.data = data.clone();
@@ -106,5 +109,7 @@ public abstract class HPBFPart {
        /**
         * Returns
         */
-       public final String[] getPath() {return null;}
+       public final String[] getPath() {
+               return path;
+       }
 }
index 2d4e3aeca841eb4f4e48c80867627eaba2c595d2..1375092ac495dfb9aff1665cdce341c7b4fa8f0e 100644 (file)
 package org.apache.poi.hslf.model;
 
 
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Composite;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.GraphicsConfiguration;
-import java.awt.GraphicsEnvironment;
-import java.awt.Image;
-import java.awt.Paint;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.Shape;
-import java.awt.Stroke;
-import java.awt.Toolkit;
-import java.awt.font.FontRenderContext;
-import java.awt.font.GlyphVector;
-import java.awt.font.TextLayout;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Arc2D;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.GeneralPath;
-import java.awt.geom.Line2D;
-import java.awt.geom.Path2D;
-import java.awt.geom.RoundRectangle2D;
-import java.awt.image.BufferedImage;
-import java.awt.image.BufferedImageOp;
-import java.awt.image.ImageObserver;
-import java.awt.image.RenderedImage;
-import java.awt.image.renderable.RenderableImage;
-import java.text.AttributedCharacterIterator;
-import java.util.Map;
-
-import org.apache.poi.hslf.exceptions.HSLFException;
-import org.apache.poi.hslf.usermodel.HSLFFreeformShape;
 import org.apache.poi.hslf.usermodel.HSLFGroupShape;
-import org.apache.poi.hslf.usermodel.HSLFSimpleShape;
-import org.apache.poi.hslf.usermodel.HSLFTextBox;
-import org.apache.poi.hslf.usermodel.HSLFTextRun;
-import org.apache.poi.sl.draw.DrawPaint;
-import org.apache.poi.sl.usermodel.StrokeStyle;
-import org.apache.poi.sl.usermodel.VerticalAlignment;
-import org.apache.poi.util.NotImplemented;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
-import org.apache.poi.util.SuppressForbidden;
+import org.apache.poi.sl.draw.SLGraphics;
+import org.apache.poi.util.Removal;
 
 /**
  * Translates Graphics2D calls into PowerPoint.
+ * @deprecated since 4.0.0 - use SLGraphics
  */
-public final class PPGraphics2D extends Graphics2D implements Cloneable {
-
-    private static final POILogger LOG = POILogFactory.getLogger(PPGraphics2D.class);
-
-    //The ppt object to write into.
-    private HSLFGroupShape _group;
-
-    private AffineTransform _transform;
-    private Stroke _stroke;
-    private Paint _paint;
-    private Font _font;
-    private Color _foreground;
-    private Color _background;
-    private RenderingHints _hints;
-
+@Deprecated
+@Removal(version="5.0.0")
+public final class PPGraphics2D extends SLGraphics {
     /**
      * Construct Java Graphics object which translates graphic calls in ppt drawing layer.
      *
      * @param group           The shape group to write the graphics calls into.
      */
     public PPGraphics2D(HSLFGroupShape group){
-        this._group = group;
-
-        _transform = new AffineTransform();
-        _stroke = new BasicStroke();
-        _paint = Color.black;
-        _font = new Font("Arial", Font.PLAIN, 12);
-        _background = Color.black;
-        _foreground = Color.white;
-        _hints = new RenderingHints(null);
-    }
-
-    /**
-     * @return  the shape group being used for drawing
-     */
-    public HSLFGroupShape getShapeGroup(){
-        return _group;
-    }
-
-    /**
-     * Gets the current font.
-     * @return    this graphics context's current font.
-     * @see       java.awt.Font
-     * @see       java.awt.Graphics#setFont(Font)
-     */
-    public Font getFont(){
-        return _font;
-    }
-
-    /**
-     * Sets this graphics context's font to the specified font.
-     * All subsequent text operations using this graphics context
-     * use this font.
-     * @param  font   the font.
-     * @see     java.awt.Graphics#getFont
-     * @see     java.awt.Graphics#drawString(java.lang.String, int, int)
-     * @see     java.awt.Graphics#drawBytes(byte[], int, int, int, int)
-     * @see     java.awt.Graphics#drawChars(char[], int, int, int, int)
-    */
-    public void setFont(Font font){
-        this._font = font;
-    }
-
-    /**
-     * Gets this graphics context's current color.
-     * @return    this graphics context's current color.
-     * @see       java.awt.Color
-     * @see       java.awt.Graphics#setColor
-     */
-    public Color getColor(){
-        return _foreground;
-    }
-
-    /**
-     * Sets this graphics context's current color to the specified
-     * color. All subsequent graphics operations using this graphics
-     * context use this specified color.
-     * @param     c   the new rendering color.
-     * @see       java.awt.Color
-     * @see       java.awt.Graphics#getColor
-     */
-    public void setColor(Color c) {
-        setPaint(c);
-    }
-
-    /**
-     * Returns the current <code>Stroke</code> in the
-     * <code>Graphics2D</code> context.
-     * @return the current <code>Graphics2D</code> <code>Stroke</code>,
-     *                 which defines the line style.
-     * @see #setStroke
-     */
-    public Stroke getStroke(){
-        return _stroke;
-    }
-
-    /**
-     * Sets the <code>Stroke</code> for the <code>Graphics2D</code> context.
-     * @param s the <code>Stroke</code> object to be used to stroke a
-     * <code>Shape</code> during the rendering process
-     */
-    public void setStroke(Stroke s){
-        this._stroke = s;
-    }
-
-    /**
-     * Returns the current <code>Paint</code> of the
-     * <code>Graphics2D</code> context.
-     * @return the current <code>Graphics2D</code> <code>Paint</code>,
-     * which defines a color or pattern.
-     * @see #setPaint
-     * @see java.awt.Graphics#setColor
-     */
-    public Paint getPaint(){
-        return _paint;
-    }
-
-    /**
-     * Sets the <code>Paint</code> attribute for the
-     * <code>Graphics2D</code> context.  Calling this method
-     * with a <code>null</code> <code>Paint</code> object does
-     * not have any effect on the current <code>Paint</code> attribute
-     * of this <code>Graphics2D</code>.
-     * @param paint the <code>Paint</code> object to be used to generate
-     * color during the rendering process, or <code>null</code>
-     * @see java.awt.Graphics#setColor
-     */
-    public void setPaint(Paint paint){
-        if(paint == null) return;
-
-        this._paint = paint;
-        if (paint instanceof Color) _foreground = (Color)paint;
-    }
-
-    /**
-     * Returns a copy of the current <code>Transform</code> in the
-     * <code>Graphics2D</code> context.
-     * @return the current <code>AffineTransform</code> in the
-     *             <code>Graphics2D</code> context.
-     * @see #_transform
-     * @see #setTransform
-     */
-    public AffineTransform getTransform(){
-        return new AffineTransform(_transform);
-    }
-
-    /**
-     * Sets the <code>Transform</code> in the <code>Graphics2D</code>
-     * context.
-     * @param Tx the <code>AffineTransform</code> object to be used in the
-     * rendering process
-     * @see #_transform
-     * @see AffineTransform
-     */
-    public void setTransform(AffineTransform Tx) {
-        _transform = new AffineTransform(Tx);
-    }
-
-    /**
-     * Strokes the outline of a <code>Shape</code> using the settings of the
-     * current <code>Graphics2D</code> context.  The rendering attributes
-     * applied include the <code>Clip</code>, <code>Transform</code>,
-     * <code>Paint</code>, <code>Composite</code> and
-     * <code>Stroke</code> attributes.
-     * @param shape the <code>Shape</code> to be rendered
-     * @see #setStroke
-     * @see #setPaint
-     * @see java.awt.Graphics#setColor
-     * @see #_transform
-     * @see #setTransform
-     * @see #clip
-     * @see #setClip
-     * @see #setComposite
-     */
-    public void draw(Shape shape){
-        Path2D.Double path = new Path2D.Double(_transform.createTransformedShape(shape));
-        HSLFFreeformShape p = new HSLFFreeformShape(_group);
-        p.setPath(path);
-        p.getFill().setForegroundColor(null);
-        applyStroke(p);
-        if (_paint instanceof Color) {
-            p.setLineColor((Color)_paint);
-        }
-        _group.addShape(p);
-    }
-
-    /**
-     * Renders the text specified by the specified <code>String</code>,
-     * using the current text attribute state in the <code>Graphics2D</code> context.
-     * The baseline of the first character is at position
-     * (<i>x</i>,&nbsp;<i>y</i>) in the User Space.
-     * The rendering attributes applied include the <code>Clip</code>,
-     * <code>Transform</code>, <code>Paint</code>, <code>Font</code> and
-     * <code>Composite</code> attributes. For characters in script systems
-     * such as Hebrew and Arabic, the glyphs can be rendered from right to
-     * left, in which case the coordinate supplied is the location of the
-     * leftmost character on the baseline.
-     * @param s the <code>String</code> to be rendered
-     * @param x the x coordinate of the location where the
-     * <code>String</code> should be rendered
-     * @param y the y coordinate of the location where the
-     * <code>String</code> should be rendered
-     * @throws NullPointerException if <code>str</code> is
-     *         <code>null</code>
-     * @see #setPaint
-     * @see java.awt.Graphics#setColor
-     * @see java.awt.Graphics#setFont
-     * @see #setTransform
-     * @see #setComposite
-     * @see #setClip
-     */
-    public void drawString(String s, float x, float y) {
-        HSLFTextBox txt = new HSLFTextBox(_group);
-        txt.setSheet(_group.getSheet());
-        txt.setText(s);
-
-        HSLFTextRun rt = txt.getTextParagraphs().get(0).getTextRuns().get(0);
-        rt.setFontSize((double)_font.getSize());
-        rt.setFontFamily(_font.getFamily());
-
-        if (getColor() != null) rt.setFontColor(DrawPaint.createSolidPaint(getColor()));
-        if (_font.isBold()) rt.setBold(true);
-        if (_font.isItalic()) rt.setItalic(true);
-
-        txt.setBottomInset(0);
-        txt.setTopInset(0);
-        txt.setLeftInset(0);
-        txt.setRightInset(0);
-        txt.setWordWrap(false);
-        txt.setHorizontalCentered(false);
-        txt.setVerticalAlignment(VerticalAlignment.MIDDLE);
-
-
-        TextLayout layout = new TextLayout(s, _font, getFontRenderContext());
-        float ascent = layout.getAscent();
-
-        float width = (float) Math.floor(layout.getAdvance());
-        /**
-         * Even if top and bottom margins are set to 0 PowerPoint
-         * always sets extra space between the text and its bounding box.
-         *
-         * The approximation height = ascent*2 works good enough in most cases
-         */
-        float height = ascent * 2;
-
-        /*
-          In powerpoint anchor of a shape is its top left corner.
-          Java graphics sets string coordinates by the baseline of the first character
-          so we need to shift up by the height of the textbox
-        */
-        y -= height / 2 + ascent / 2;
-
-        /*
-          In powerpoint anchor of a shape is its top left corner.
-          Java graphics sets string coordinates by the baseline of the first character
-          so we need to shift down by the height of the textbox
-        */
-        txt.setAnchor(new Rectangle((int)x, (int)y, (int)width, (int)height));
-
-        _group.addShape(txt);
-    }
-
-    /**
-     * Fills the interior of a <code>Shape</code> using the settings of the
-     * <code>Graphics2D</code> context. The rendering attributes applied
-     * include the <code>Clip</code>, <code>Transform</code>,
-     * <code>Paint</code>, and <code>Composite</code>.
-     * @param shape the <code>Shape</code> to be filled
-     * @see #setPaint
-     * @see java.awt.Graphics#setColor
-     * @see #_transform
-     * @see #setTransform
-     * @see #setComposite
-     * @see #clip
-     * @see #setClip
-     */
-    public void fill(Shape shape){
-        Path2D.Double path = new Path2D.Double(_transform.createTransformedShape(shape));
-        HSLFFreeformShape p = new HSLFFreeformShape(_group);
-        p.setPath(path);
-        applyPaint(p);
-        p.setLineColor(null);   //Fills must be "No Line"
-        _group.addShape(p);
-    }
-
-    /**
-     * Translates the origin of the graphics context to the point
-     * (<i>x</i>,&nbsp;<i>y</i>) in the current coordinate system.
-     * Modifies this graphics context so that its new origin corresponds
-     * to the point (<i>x</i>,&nbsp;<i>y</i>) in this graphics context's
-     * original coordinate system.  All coordinates used in subsequent
-     * rendering operations on this graphics context will be relative
-     * to this new origin.
-     * @param  x   the <i>x</i> coordinate.
-     * @param  y   the <i>y</i> coordinate.
-     */
-    public void translate(int x, int y){
-        _transform.translate(x, y);
-    }
-
-    /**
-     * Intersects the current <code>Clip</code> with the interior of the
-     * specified <code>Shape</code> and sets the <code>Clip</code> to the
-     * resulting intersection.  The specified <code>Shape</code> is
-     * transformed with the current <code>Graphics2D</code>
-     * <code>Transform</code> before being intersected with the current
-     * <code>Clip</code>.  This method is used to make the current
-     * <code>Clip</code> smaller.
-     * To make the <code>Clip</code> larger, use <code>setClip</code>.
-     * The <i>user clip</i> modified by this method is independent of the
-     * clipping associated with device bounds and visibility.  If no clip has
-     * previously been set, or if the clip has been cleared using
-     * {@link java.awt.Graphics#setClip(Shape) setClip} with a
-     * <code>null</code> argument, the specified <code>Shape</code> becomes
-     * the new user clip.
-     * @param s the <code>Shape</code> to be intersected with the current
-     *          <code>Clip</code>.  If <code>s</code> is <code>null</code>,
-     *          this method clears the current <code>Clip</code>.
-     */
-    @NotImplemented
-    public void clip(Shape s){
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-    }
-
-    /**
-     * Gets the current clipping area.
-     * This method returns the user clip, which is independent of the
-     * clipping associated with device bounds and window visibility.
-     * If no clip has previously been set, or if the clip has been
-     * cleared using <code>setClip(null)</code>, this method returns
-     * <code>null</code>.
-     * @return      a <code>Shape</code> object representing the
-     *              current clipping area, or <code>null</code> if
-     *              no clip is set.
-     * @see         java.awt.Graphics#getClipBounds()
-     * @see         java.awt.Graphics#clipRect
-     * @see         java.awt.Graphics#setClip(int, int, int, int)
-     * @see         java.awt.Graphics#setClip(Shape)
-     * @since       JDK1.1
-     */
-    @NotImplemented
-    public Shape getClip(){
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-        return null;
-    }
-
-    /**
-     * Concatenates the current <code>Graphics2D</code>
-     * <code>Transform</code> with a scaling transformation
-     * Subsequent rendering is resized according to the specified scaling
-     * factors relative to the previous scaling.
-     * This is equivalent to calling <code>transform(S)</code>, where S is an
-     * <code>AffineTransform</code> represented by the following matrix:
-     * <pre>
-     *          [   sx   0    0   ]
-     *          [   0    sy   0   ]
-     *          [   0    0    1   ]
-     * </pre>
-     * @param sx the amount by which X coordinates in subsequent
-     * rendering operations are multiplied relative to previous
-     * rendering operations.
-     * @param sy the amount by which Y coordinates in subsequent
-     * rendering operations are multiplied relative to previous
-     * rendering operations.
-     */
-    public void scale(double sx, double sy){
-        _transform.scale(sx, sy);
-    }
-
-    /**
-     * Draws an outlined round-cornered rectangle using this graphics
-     * context's current color. The left and right edges of the rectangle
-     * are at <code>x</code> and <code>x&nbsp;+&nbsp;width</code>,
-     * respectively. The top and bottom edges of the rectangle are at
-     * <code>y</code> and <code>y&nbsp;+&nbsp;height</code>.
-     * @param      x the <i>x</i> coordinate of the rectangle to be drawn.
-     * @param      y the <i>y</i> coordinate of the rectangle to be drawn.
-     * @param      width the width of the rectangle to be drawn.
-     * @param      height the height of the rectangle to be drawn.
-     * @param      arcWidth the horizontal diameter of the arc
-     *                    at the four corners.
-     * @param      arcHeight the vertical diameter of the arc
-     *                    at the four corners.
-     * @see        java.awt.Graphics#fillRoundRect
-     */
-    public void drawRoundRect(int x, int y, int width, int height,
-                              int arcWidth, int arcHeight){
-        RoundRectangle2D rect = new RoundRectangle2D.Float(x, y, width, height, arcWidth, arcHeight);
-        draw(rect);
-     }
-
-    /**
-     * Draws the text given by the specified string, using this
-     * graphics context's current font and color. The baseline of the
-     * first character is at position (<i>x</i>,&nbsp;<i>y</i>) in this
-     * graphics context's coordinate system.
-     * @param       str      the string to be drawn.
-     * @param       x        the <i>x</i> coordinate.
-     * @param       y        the <i>y</i> coordinate.
-     * @see         java.awt.Graphics#drawBytes
-     * @see         java.awt.Graphics#drawChars
-     */
-    public void drawString(String str, int x, int y){
-        drawString(str, (float)x, (float)y);
-    }
-
-    /**
-     * Fills an oval bounded by the specified rectangle with the
-     * current color.
-     * @param       x the <i>x</i> coordinate of the upper left corner
-     *                     of the oval to be filled.
-     * @param       y the <i>y</i> coordinate of the upper left corner
-     *                     of the oval to be filled.
-     * @param       width the width of the oval to be filled.
-     * @param       height the height of the oval to be filled.
-     * @see         java.awt.Graphics#drawOval
-     */
-    public void fillOval(int x, int y, int width, int height){
-        Ellipse2D oval = new Ellipse2D.Float(x, y, width, height);
-        fill(oval);
-    }
-
-    /**
-     * Fills the specified rounded corner rectangle with the current color.
-     * The left and right edges of the rectangle
-     * are at <code>x</code> and <code>x&nbsp;+&nbsp;width&nbsp;-&nbsp;1</code>,
-     * respectively. The top and bottom edges of the rectangle are at
-     * <code>y</code> and <code>y&nbsp;+&nbsp;height&nbsp;-&nbsp;1</code>.
-     * @param       x the <i>x</i> coordinate of the rectangle to be filled.
-     * @param       y the <i>y</i> coordinate of the rectangle to be filled.
-     * @param       width the width of the rectangle to be filled.
-     * @param       height the height of the rectangle to be filled.
-     * @param       arcWidth the horizontal diameter
-     *                     of the arc at the four corners.
-     * @param       arcHeight the vertical diameter
-     *                     of the arc at the four corners.
-     * @see         java.awt.Graphics#drawRoundRect
-     */
-    public void fillRoundRect(int x, int y, int width, int height,
-                              int arcWidth, int arcHeight){
-
-        RoundRectangle2D rect = new RoundRectangle2D.Float(x, y, width, height, arcWidth, arcHeight);
-        fill(rect);
-    }
-
-    /**
-     * Fills a circular or elliptical arc covering the specified rectangle.
-     * <p>
-     * The resulting arc begins at <code>startAngle</code> and extends
-     * for <code>arcAngle</code> degrees.
-     * Angles are interpreted such that 0&nbsp;degrees
-     * is at the 3&nbsp;o'clock position.
-     * A positive value indicates a counter-clockwise rotation
-     * while a negative value indicates a clockwise rotation.
-     * <p>
-     * The center of the arc is the center of the rectangle whose origin
-     * is (<i>x</i>,&nbsp;<i>y</i>) and whose size is specified by the
-     * <code>width</code> and <code>height</code> arguments.
-     * <p>
-     * The resulting arc covers an area
-     * <code>width&nbsp;+&nbsp;1</code> pixels wide
-     * by <code>height&nbsp;+&nbsp;1</code> pixels tall.
-     * <p>
-     * The angles are specified relative to the non-square extents of
-     * the bounding rectangle such that 45 degrees always falls on the
-     * line from the center of the ellipse to the upper right corner of
-     * the bounding rectangle. As a result, if the bounding rectangle is
-     * noticeably longer in one axis than the other, the angles to the
-     * start and end of the arc segment will be skewed farther along the
-     * longer axis of the bounds.
-     * @param        x the <i>x</i> coordinate of the
-     *                    upper-left corner of the arc to be filled.
-     * @param        y the <i>y</i>  coordinate of the
-     *                    upper-left corner of the arc to be filled.
-     * @param        width the width of the arc to be filled.
-     * @param        height the height of the arc to be filled.
-     * @param        startAngle the beginning angle.
-     * @param        arcAngle the angular extent of the arc,
-     *                    relative to the start angle.
-     * @see         java.awt.Graphics#drawArc
-     */
-    public void fillArc(int x, int y, int width, int height,
-                        int startAngle, int arcAngle){
-        Arc2D arc = new Arc2D.Float(x, y, width, height, startAngle, arcAngle, Arc2D.PIE);
-        fill(arc);
-    }
-
-    /**
-     * Draws the outline of a circular or elliptical arc
-     * covering the specified rectangle.
-     * <p>
-     * The resulting arc begins at <code>startAngle</code> and extends
-     * for <code>arcAngle</code> degrees, using the current color.
-     * Angles are interpreted such that 0&nbsp;degrees
-     * is at the 3&nbsp;o'clock position.
-     * A positive value indicates a counter-clockwise rotation
-     * while a negative value indicates a clockwise rotation.
-     * <p>
-     * The center of the arc is the center of the rectangle whose origin
-     * is (<i>x</i>,&nbsp;<i>y</i>) and whose size is specified by the
-     * <code>width</code> and <code>height</code> arguments.
-     * <p>
-     * The resulting arc covers an area
-     * <code>width&nbsp;+&nbsp;1</code> pixels wide
-     * by <code>height&nbsp;+&nbsp;1</code> pixels tall.
-     * <p>
-     * The angles are specified relative to the non-square extents of
-     * the bounding rectangle such that 45 degrees always falls on the
-     * line from the center of the ellipse to the upper right corner of
-     * the bounding rectangle. As a result, if the bounding rectangle is
-     * noticeably longer in one axis than the other, the angles to the
-     * start and end of the arc segment will be skewed farther along the
-     * longer axis of the bounds.
-     * @param        x the <i>x</i> coordinate of the
-     *                    upper-left corner of the arc to be drawn.
-     * @param        y the <i>y</i>  coordinate of the
-     *                    upper-left corner of the arc to be drawn.
-     * @param        width the width of the arc to be drawn.
-     * @param        height the height of the arc to be drawn.
-     * @param        startAngle the beginning angle.
-     * @param        arcAngle the angular extent of the arc,
-     *                    relative to the start angle.
-     * @see         java.awt.Graphics#fillArc
-     */
-    public void drawArc(int x, int y, int width, int height,
-                        int startAngle, int arcAngle) {
-        Arc2D arc = new Arc2D.Float(x, y, width, height, startAngle, arcAngle, Arc2D.OPEN);
-        draw(arc);
-    }
-
-
-    /**
-     * Draws a sequence of connected lines defined by
-     * arrays of <i>x</i> and <i>y</i> coordinates.
-     * Each pair of (<i>x</i>,&nbsp;<i>y</i>) coordinates defines a point.
-     * The figure is not closed if the first point
-     * differs from the last point.
-     * @param       xPoints an array of <i>x</i> points
-     * @param       yPoints an array of <i>y</i> points
-     * @param       nPoints the total number of points
-     * @see         java.awt.Graphics#drawPolygon(int[], int[], int)
-     * @since       JDK1.1
-     */
-    public void drawPolyline(int[] xPoints, int[] yPoints,
-                             int nPoints){
-        if(nPoints > 0){
-            GeneralPath path = new GeneralPath();
-            path.moveTo(xPoints[0], yPoints[0]);
-            for(int i=1; i<nPoints; i++)
-                path.lineTo(xPoints[i], yPoints[i]);
-
-            draw(path);
-        }
-    }
-
-    /**
-     * Draws the outline of an oval.
-     * The result is a circle or ellipse that fits within the
-     * rectangle specified by the <code>x</code>, <code>y</code>,
-     * <code>width</code>, and <code>height</code> arguments.
-     * <p>
-     * The oval covers an area that is
-     * <code>width&nbsp;+&nbsp;1</code> pixels wide
-     * and <code>height&nbsp;+&nbsp;1</code> pixels tall.
-     * @param       x the <i>x</i> coordinate of the upper left
-     *                     corner of the oval to be drawn.
-     * @param       y the <i>y</i> coordinate of the upper left
-     *                     corner of the oval to be drawn.
-     * @param       width the width of the oval to be drawn.
-     * @param       height the height of the oval to be drawn.
-     * @see         java.awt.Graphics#fillOval
-     */
-    public void drawOval(int x, int y, int width, int height){
-        Ellipse2D oval = new Ellipse2D.Float(x, y, width, height);
-        draw(oval);
-    }
-
-    /**
-     * Draws as much of the specified image as is currently available.
-     * The image is drawn with its top-left corner at
-     * (<i>x</i>,&nbsp;<i>y</i>) in this graphics context's coordinate
-     * space.  Transparent pixels are drawn in the specified
-     * background color.
-     * <p>
-     * This operation is equivalent to filling a rectangle of the
-     * width and height of the specified image with the given color and then
-     * drawing the image on top of it, but possibly more efficient.
-     * <p>
-     * This method returns immediately in all cases, even if the
-     * complete image has not yet been loaded, and it has not been dithered
-     * and converted for the current output device.
-     * <p>
-     * If the image has not yet been completely loaded, then
-     * <code>drawImage</code> returns <code>false</code>. As more of
-     * the image becomes available, the process that draws the image notifies
-     * the specified image observer.
-     * @param    img    the specified image to be drawn.
-     * @param    x      the <i>x</i> coordinate.
-     * @param    y      the <i>y</i> coordinate.
-     * @param    bgcolor the background color to paint under the
-     *                         non-opaque portions of the image.
-     * @param    observer    object to be notified as more of
-     *                          the image is converted.
-     * @see      java.awt.Image
-     * @see      java.awt.image.ImageObserver
-     * @see      java.awt.image.ImageObserver#imageUpdate(java.awt.Image, int, int, int, int, int)
-     */
-    @NotImplemented
-    public boolean drawImage(Image img, int x, int y,
-                             Color bgcolor,
-                             ImageObserver observer){
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-
-        return false;
-    }
-
-    /**
-     * Draws as much of the specified image as has already been scaled
-     * to fit inside the specified rectangle.
-     * <p>
-     * The image is drawn inside the specified rectangle of this
-     * graphics context's coordinate space, and is scaled if
-     * necessary. Transparent pixels are drawn in the specified
-     * background color.
-     * This operation is equivalent to filling a rectangle of the
-     * width and height of the specified image with the given color and then
-     * drawing the image on top of it, but possibly more efficient.
-     * <p>
-     * This method returns immediately in all cases, even if the
-     * entire image has not yet been scaled, dithered, and converted
-     * for the current output device.
-     * If the current output representation is not yet complete then
-     * <code>drawImage</code> returns <code>false</code>. As more of
-     * the image becomes available, the process that draws the image notifies
-     * the specified image observer.
-     * <p>
-     * A scaled version of an image will not necessarily be
-     * available immediately just because an unscaled version of the
-     * image has been constructed for this output device.  Each size of
-     * the image may be cached separately and generated from the original
-     * data in a separate image production sequence.
-     * @param    img       the specified image to be drawn.
-     * @param    x         the <i>x</i> coordinate.
-     * @param    y         the <i>y</i> coordinate.
-     * @param    width     the width of the rectangle.
-     * @param    height    the height of the rectangle.
-     * @param    bgcolor   the background color to paint under the
-     *                         non-opaque portions of the image.
-     * @param    observer    object to be notified as more of
-     *                          the image is converted.
-     * @see      java.awt.Image
-     * @see      java.awt.image.ImageObserver
-     * @see      java.awt.image.ImageObserver#imageUpdate(java.awt.Image, int, int, int, int, int)
-     */
-    @NotImplemented
-    public boolean drawImage(Image img, int x, int y,
-                             int width, int height,
-                             Color bgcolor,
-                             ImageObserver observer){
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-
-        return false;
-    }
-
-
-    /**
-     * Draws as much of the specified area of the specified image as is
-     * currently available, scaling it on the fly to fit inside the
-     * specified area of the destination drawable surface. Transparent pixels
-     * do not affect whatever pixels are already there.
-     * <p>
-     * This method returns immediately in all cases, even if the
-     * image area to be drawn has not yet been scaled, dithered, and converted
-     * for the current output device.
-     * If the current output representation is not yet complete then
-     * <code>drawImage</code> returns <code>false</code>. As more of
-     * the image becomes available, the process that draws the image notifies
-     * the specified image observer.
-     * <p>
-     * This method always uses the unscaled version of the image
-     * to render the scaled rectangle and performs the required
-     * scaling on the fly. It does not use a cached, scaled version
-     * of the image for this operation. Scaling of the image from source
-     * to destination is performed such that the first coordinate
-     * of the source rectangle is mapped to the first coordinate of
-     * the destination rectangle, and the second source coordinate is
-     * mapped to the second destination coordinate. The subimage is
-     * scaled and flipped as needed to preserve those mappings.
-     * @param       img the specified image to be drawn
-     * @param       dx1 the <i>x</i> coordinate of the first corner of the
-     *                    destination rectangle.
-     * @param       dy1 the <i>y</i> coordinate of the first corner of the
-     *                    destination rectangle.
-     * @param       dx2 the <i>x</i> coordinate of the second corner of the
-     *                    destination rectangle.
-     * @param       dy2 the <i>y</i> coordinate of the second corner of the
-     *                    destination rectangle.
-     * @param       sx1 the <i>x</i> coordinate of the first corner of the
-     *                    source rectangle.
-     * @param       sy1 the <i>y</i> coordinate of the first corner of the
-     *                    source rectangle.
-     * @param       sx2 the <i>x</i> coordinate of the second corner of the
-     *                    source rectangle.
-     * @param       sy2 the <i>y</i> coordinate of the second corner of the
-     *                    source rectangle.
-     * @param       observer object to be notified as more of the image is
-     *                    scaled and converted.
-     * @see         java.awt.Image
-     * @see         java.awt.image.ImageObserver
-     * @see         java.awt.image.ImageObserver#imageUpdate(java.awt.Image, int, int, int, int, int)
-     * @since       JDK1.1
-     */
-    @NotImplemented
-    public boolean drawImage(Image img,
-                             int dx1, int dy1, int dx2, int dy2,
-                             int sx1, int sy1, int sx2, int sy2,
-                             ImageObserver observer){
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-        return false;
-    }
-
-    /**
-     * Draws as much of the specified area of the specified image as is
-     * currently available, scaling it on the fly to fit inside the
-     * specified area of the destination drawable surface.
-     * <p>
-     * Transparent pixels are drawn in the specified background color.
-     * This operation is equivalent to filling a rectangle of the
-     * width and height of the specified image with the given color and then
-     * drawing the image on top of it, but possibly more efficient.
-     * <p>
-     * This method returns immediately in all cases, even if the
-     * image area to be drawn has not yet been scaled, dithered, and converted
-     * for the current output device.
-     * If the current output representation is not yet complete then
-     * <code>drawImage</code> returns <code>false</code>. As more of
-     * the image becomes available, the process that draws the image notifies
-     * the specified image observer.
-     * <p>
-     * This method always uses the unscaled version of the image
-     * to render the scaled rectangle and performs the required
-     * scaling on the fly. It does not use a cached, scaled version
-     * of the image for this operation. Scaling of the image from source
-     * to destination is performed such that the first coordinate
-     * of the source rectangle is mapped to the first coordinate of
-     * the destination rectangle, and the second source coordinate is
-     * mapped to the second destination coordinate. The subimage is
-     * scaled and flipped as needed to preserve those mappings.
-     * @param       img the specified image to be drawn
-     * @param       dx1 the <i>x</i> coordinate of the first corner of the
-     *                    destination rectangle.
-     * @param       dy1 the <i>y</i> coordinate of the first corner of the
-     *                    destination rectangle.
-     * @param       dx2 the <i>x</i> coordinate of the second corner of the
-     *                    destination rectangle.
-     * @param       dy2 the <i>y</i> coordinate of the second corner of the
-     *                    destination rectangle.
-     * @param       sx1 the <i>x</i> coordinate of the first corner of the
-     *                    source rectangle.
-     * @param       sy1 the <i>y</i> coordinate of the first corner of the
-     *                    source rectangle.
-     * @param       sx2 the <i>x</i> coordinate of the second corner of the
-     *                    source rectangle.
-     * @param       sy2 the <i>y</i> coordinate of the second corner of the
-     *                    source rectangle.
-     * @param       bgcolor the background color to paint under the
-     *                    non-opaque portions of the image.
-     * @param       observer object to be notified as more of the image is
-     *                    scaled and converted.
-     * @see         java.awt.Image
-     * @see         java.awt.image.ImageObserver
-     * @see         java.awt.image.ImageObserver#imageUpdate(java.awt.Image, int, int, int, int, int)
-     * @since       JDK1.1
-     */
-    @NotImplemented
-    public boolean drawImage(Image img,
-                             int dx1, int dy1, int dx2, int dy2,
-                             int sx1, int sy1, int sx2, int sy2,
-                             Color bgcolor,
-                             ImageObserver observer){
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-        return false;
-    }
-
-    /**
-     * Draws as much of the specified image as is currently available.
-     * The image is drawn with its top-left corner at
-     * (<i>x</i>,&nbsp;<i>y</i>) in this graphics context's coordinate
-     * space. Transparent pixels in the image do not affect whatever
-     * pixels are already there.
-     * <p>
-     * This method returns immediately in all cases, even if the
-     * complete image has not yet been loaded, and it has not been dithered
-     * and converted for the current output device.
-     * <p>
-     * If the image has completely loaded and its pixels are
-     * no longer being changed, then
-     * <code>drawImage</code> returns <code>true</code>.
-     * Otherwise, <code>drawImage</code> returns <code>false</code>
-     * and as more of
-     * the image becomes available
-     * or it is time to draw another frame of animation,
-     * the process that loads the image notifies
-     * the specified image observer.
-     * @param    img the specified image to be drawn. This method does
-     *               nothing if <code>img</code> is null.
-     * @param    x   the <i>x</i> coordinate.
-     * @param    y   the <i>y</i> coordinate.
-     * @param    observer    object to be notified as more of
-     *                          the image is converted.
-     * @return   <code>false</code> if the image pixels are still changing;
-     *           <code>true</code> otherwise.
-     * @see      java.awt.Image
-     * @see      java.awt.image.ImageObserver
-     * @see      java.awt.image.ImageObserver#imageUpdate(java.awt.Image, int, int, int, int, int)
-     */
-    @NotImplemented
-    public boolean drawImage(Image img, int x, int y,
-                             ImageObserver observer) {
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-        return false;
-    }
-
-    /**
-     * Disposes of this graphics context and releases
-     * any system resources that it is using.
-     * A <code>Graphics</code> object cannot be used after
-     * <code>dispose</code>has been called.
-     * <p>
-     * When a Java program runs, a large number of <code>Graphics</code>
-     * objects can be created within a short time frame.
-     * Although the finalization process of the garbage collector
-     * also disposes of the same system resources, it is preferable
-     * to manually free the associated resources by calling this
-     * method rather than to rely on a finalization process which
-     * may not run to completion for a long period of time.
-     * <p>
-     * Graphics objects which are provided as arguments to the
-     * <code>paint</code> and <code>update</code> methods
-     * of components are automatically released by the system when
-     * those methods return. For efficiency, programmers should
-     * call <code>dispose</code> when finished using
-     * a <code>Graphics</code> object only if it was created
-     * directly from a component or another <code>Graphics</code> object.
-     * @see         java.awt.Graphics#finalize
-     * @see         java.awt.Component#paint
-     * @see         java.awt.Component#update
-     * @see         java.awt.Component#getGraphics
-     * @see         java.awt.Graphics#create
-     */
-    public void dispose() {
-    }
-
-    /**
-     * Draws a line, using the current color, between the points
-     * <code>(x1,&nbsp;y1)</code> and <code>(x2,&nbsp;y2)</code>
-     * in this graphics context's coordinate system.
-     * @param   x1  the first point's <i>x</i> coordinate.
-     * @param   y1  the first point's <i>y</i> coordinate.
-     * @param   x2  the second point's <i>x</i> coordinate.
-     * @param   y2  the second point's <i>y</i> coordinate.
-     */
-    public void drawLine(int x1, int y1, int x2, int y2){
-        Line2D line = new Line2D.Float(x1, y1, x2, y2);
-        draw(line);
-    }
-
-    /**
-     * Fills a closed polygon defined by
-     * arrays of <i>x</i> and <i>y</i> coordinates.
-     * <p>
-     * This method draws the polygon defined by <code>nPoint</code> line
-     * segments, where the first <code>nPoint&nbsp;-&nbsp;1</code>
-     * line segments are line segments from
-     * <code>(xPoints[i&nbsp;-&nbsp;1],&nbsp;yPoints[i&nbsp;-&nbsp;1])</code>
-     * to <code>(xPoints[i],&nbsp;yPoints[i])</code>, for
-     * 1&nbsp;&le;&nbsp;<i>i</i>&nbsp;&le;&nbsp;<code>nPoints</code>.
-     * The figure is automatically closed by drawing a line connecting
-     * the final point to the first point, if those points are different.
-     * <p>
-     * The area inside the polygon is defined using an
-     * even-odd fill rule, also known as the alternating rule.
-     * @param        xPoints   a an array of <code>x</code> coordinates.
-     * @param        yPoints   a an array of <code>y</code> coordinates.
-     * @param        nPoints   a the total number of points.
-     * @see          java.awt.Graphics#drawPolygon(int[], int[], int)
-     */
-    public void fillPolygon(int[] xPoints, int[] yPoints,
-                            int nPoints){
-        java.awt.Polygon polygon = new java.awt.Polygon(xPoints, yPoints, nPoints);
-        fill(polygon);
-    }
-
-    /**
-     * Fills the specified rectangle.
-     * The left and right edges of the rectangle are at
-     * <code>x</code> and <code>x&nbsp;+&nbsp;width&nbsp;-&nbsp;1</code>.
-     * The top and bottom edges are at
-     * <code>y</code> and <code>y&nbsp;+&nbsp;height&nbsp;-&nbsp;1</code>.
-     * The resulting rectangle covers an area
-     * <code>width</code> pixels wide by
-     * <code>height</code> pixels tall.
-     * The rectangle is filled using the graphics context's current color.
-     * @param         x   the <i>x</i> coordinate
-     *                         of the rectangle to be filled.
-     * @param         y   the <i>y</i> coordinate
-     *                         of the rectangle to be filled.
-     * @param         width   the width of the rectangle to be filled.
-     * @param         height   the height of the rectangle to be filled.
-     * @see           java.awt.Graphics#clearRect
-     * @see           java.awt.Graphics#drawRect
-     */
-    public void fillRect(int x, int y, int width, int height){
-        Rectangle rect = new Rectangle(x, y, width, height);
-        fill(rect);
-    }
-
-    /**
-     * Draws the outline of the specified rectangle.
-     * The left and right edges of the rectangle are at
-     * <code>x</code> and <code>x&nbsp;+&nbsp;width</code>.
-     * The top and bottom edges are at
-     * <code>y</code> and <code>y&nbsp;+&nbsp;height</code>.
-     * The rectangle is drawn using the graphics context's current color.
-     * @param         x   the <i>x</i> coordinate
-     *                         of the rectangle to be drawn.
-     * @param         y   the <i>y</i> coordinate
-     *                         of the rectangle to be drawn.
-     * @param         width   the width of the rectangle to be drawn.
-     * @param         height   the height of the rectangle to be drawn.
-     * @see          java.awt.Graphics#fillRect
-     * @see          java.awt.Graphics#clearRect
-     */
-    public void drawRect(int x, int y, int width, int height) {
-        Rectangle rect = new Rectangle(x, y, width, height);
-        draw(rect);
-    }
-
-    /**
-     * Draws a closed polygon defined by
-     * arrays of <i>x</i> and <i>y</i> coordinates.
-     * Each pair of (<i>x</i>,&nbsp;<i>y</i>) coordinates defines a point.
-     * <p>
-     * This method draws the polygon defined by <code>nPoint</code> line
-     * segments, where the first <code>nPoint&nbsp;-&nbsp;1</code>
-     * line segments are line segments from
-     * <code>(xPoints[i&nbsp;-&nbsp;1],&nbsp;yPoints[i&nbsp;-&nbsp;1])</code>
-     * to <code>(xPoints[i],&nbsp;yPoints[i])</code>, for
-     * 1&nbsp;&le;&nbsp;<i>i</i>&nbsp;&le;&nbsp;<code>nPoints</code>.
-     * The figure is automatically closed by drawing a line connecting
-     * the final point to the first point, if those points are different.
-     * @param        xPoints   a an array of <code>x</code> coordinates.
-     * @param        yPoints   a an array of <code>y</code> coordinates.
-     * @param        nPoints   a the total number of points.
-     * @see          java.awt.Graphics#fillPolygon(int[],int[],int)
-     * @see          java.awt.Graphics#drawPolyline
-     */
-    public void drawPolygon(int[] xPoints, int[] yPoints,
-                            int nPoints){
-        java.awt.Polygon polygon = new java.awt.Polygon(xPoints, yPoints, nPoints);
-        draw(polygon);
-    }
-
-    /**
-     * Intersects the current clip with the specified rectangle.
-     * The resulting clipping area is the intersection of the current
-     * clipping area and the specified rectangle.  If there is no
-     * current clipping area, either because the clip has never been
-     * set, or the clip has been cleared using <code>setClip(null)</code>,
-     * the specified rectangle becomes the new clip.
-     * This method sets the user clip, which is independent of the
-     * clipping associated with device bounds and window visibility.
-     * This method can only be used to make the current clip smaller.
-     * To set the current clip larger, use any of the setClip methods.
-     * Rendering operations have no effect outside of the clipping area.
-     * @param x the x coordinate of the rectangle to intersect the clip with
-     * @param y the y coordinate of the rectangle to intersect the clip with
-     * @param width the width of the rectangle to intersect the clip with
-     * @param height the height of the rectangle to intersect the clip with
-     * @see #setClip(int, int, int, int)
-     * @see #setClip(Shape)
-     */
-    public void clipRect(int x, int y, int width, int height){
-        clip(new Rectangle(x, y, width, height));
-    }
-
-    /**
-     * Sets the current clipping area to an arbitrary clip shape.
-     * Not all objects that implement the <code>Shape</code>
-     * interface can be used to set the clip.  The only
-     * <code>Shape</code> objects that are guaranteed to be
-     * supported are <code>Shape</code> objects that are
-     * obtained via the <code>getClip</code> method and via
-     * <code>Rectangle</code> objects.  This method sets the
-     * user clip, which is independent of the clipping associated
-     * with device bounds and window visibility.
-     * @param clip the <code>Shape</code> to use to set the clip
-     * @see         java.awt.Graphics#getClip()
-     * @see         java.awt.Graphics#clipRect
-     * @see         java.awt.Graphics#setClip(int, int, int, int)
-     * @since       JDK1.1
-     */
-    @NotImplemented
-    public void setClip(Shape clip) {
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-    }
-
-    /**
-     * Returns the bounding rectangle of the current clipping area.
-     * This method refers to the user clip, which is independent of the
-     * clipping associated with device bounds and window visibility.
-     * If no clip has previously been set, or if the clip has been
-     * cleared using <code>setClip(null)</code>, this method returns
-     * <code>null</code>.
-     * The coordinates in the rectangle are relative to the coordinate
-     * system origin of this graphics context.
-     * @return      the bounding rectangle of the current clipping area,
-     *              or <code>null</code> if no clip is set.
-     * @see         java.awt.Graphics#getClip
-     * @see         java.awt.Graphics#clipRect
-     * @see         java.awt.Graphics#setClip(int, int, int, int)
-     * @see         java.awt.Graphics#setClip(Shape)
-     * @since       JDK1.1
-     */
-    public Rectangle getClipBounds(){
-        Shape c = getClip();
-        if (c==null) {
-            return null;
-        }
-        return c.getBounds();
-    }
-
-    /**
-     * Draws the text given by the specified iterator, using this
-     * graphics context's current color. The iterator has to specify a font
-     * for each character. The baseline of the
-     * first character is at position (<i>x</i>,&nbsp;<i>y</i>) in this
-     * graphics context's coordinate system.
-     * @param       iterator the iterator whose text is to be drawn
-     * @param       x        the <i>x</i> coordinate.
-     * @param       y        the <i>y</i> coordinate.
-     * @see         java.awt.Graphics#drawBytes
-     * @see         java.awt.Graphics#drawChars
-     */
-    public void drawString(AttributedCharacterIterator iterator,
-                           int x, int y){
-        drawString(iterator, (float)x, (float)y);
-    }
-
-    /**
-     * Clears the specified rectangle by filling it with the background
-     * color of the current drawing surface. This operation does not
-     * use the current paint mode.
-     * <p>
-     * Beginning with Java&nbsp;1.1, the background color
-     * of offscreen images may be system dependent. Applications should
-     * use <code>setColor</code> followed by <code>fillRect</code> to
-     * ensure that an offscreen image is cleared to a specific color.
-     * @param       x the <i>x</i> coordinate of the rectangle to clear.
-     * @param       y the <i>y</i> coordinate of the rectangle to clear.
-     * @param       width the width of the rectangle to clear.
-     * @param       height the height of the rectangle to clear.
-     * @see         java.awt.Graphics#fillRect(int, int, int, int)
-     * @see         java.awt.Graphics#drawRect
-     * @see         java.awt.Graphics#setColor(java.awt.Color)
-     * @see         java.awt.Graphics#setPaintMode
-     * @see         java.awt.Graphics#setXORMode(java.awt.Color)
-     */
-    public void clearRect(int x, int y, int width, int height) {
-        Paint paint = getPaint();
-        setColor(getBackground());
-        fillRect(x, y, width, height);
-        setPaint(paint);
-    }
-
-    public void copyArea(int x, int y, int width, int height, int dx, int dy) {
-    }
-
-    /**
-     * Sets the current clip to the rectangle specified by the given
-     * coordinates.  This method sets the user clip, which is
-     * independent of the clipping associated with device bounds
-     * and window visibility.
-     * Rendering operations have no effect outside of the clipping area.
-     * @param       x the <i>x</i> coordinate of the new clip rectangle.
-     * @param       y the <i>y</i> coordinate of the new clip rectangle.
-     * @param       width the width of the new clip rectangle.
-     * @param       height the height of the new clip rectangle.
-     * @see         java.awt.Graphics#clipRect
-     * @see         java.awt.Graphics#setClip(Shape)
-     * @since       JDK1.1
-     */
-    public void setClip(int x, int y, int width, int height){
-        setClip(new Rectangle(x, y, width, height));
-    }
-
-    /**
-     * Concatenates the current <code>Graphics2D</code>
-     * <code>Transform</code> with a rotation transform.
-     * Subsequent rendering is rotated by the specified radians relative
-     * to the previous origin.
-     * This is equivalent to calling <code>transform(R)</code>, where R is an
-     * <code>AffineTransform</code> represented by the following matrix:
-     * <pre>
-     *          [   cos(theta)    -sin(theta)    0   ]
-     *          [   sin(theta)     cos(theta)    0   ]
-     *          [       0              0         1   ]
-     * </pre>
-     * Rotating with a positive angle theta rotates points on the positive
-     * x axis toward the positive y axis.
-     * @param theta the angle of rotation in radians
-     */
-    public void rotate(double theta){
-        _transform.rotate(theta);
-    }
-
-    /**
-     * Concatenates the current <code>Graphics2D</code>
-     * <code>Transform</code> with a translated rotation
-     * transform.  Subsequent rendering is transformed by a transform
-     * which is constructed by translating to the specified location,
-     * rotating by the specified radians, and translating back by the same
-     * amount as the original translation.  This is equivalent to the
-     * following sequence of calls:
-     * <pre>
-     *          translate(x, y);
-     *          rotate(theta);
-     *          translate(-x, -y);
-     * </pre>
-     * Rotating with a positive angle theta rotates points on the positive
-     * x axis toward the positive y axis.
-     * @param theta the angle of rotation in radians
-     * @param x x coordinate of the origin of the rotation
-     * @param y y coordinate of the origin of the rotation
-     */
-    public void rotate(double theta, double x, double y){
-        _transform.rotate(theta, x, y);
-    }
-
-    /**
-     * Concatenates the current <code>Graphics2D</code>
-     * <code>Transform</code> with a shearing transform.
-     * Subsequent renderings are sheared by the specified
-     * multiplier relative to the previous position.
-     * This is equivalent to calling <code>transform(SH)</code>, where SH
-     * is an <code>AffineTransform</code> represented by the following
-     * matrix:
-     * <pre>
-     *          [   1   shx   0   ]
-     *          [  shy   1    0   ]
-     *          [   0    0    1   ]
-     * </pre>
-     * @param shx the multiplier by which coordinates are shifted in
-     * the positive X axis direction as a function of their Y coordinate
-     * @param shy the multiplier by which coordinates are shifted in
-     * the positive Y axis direction as a function of their X coordinate
-     */
-    public void shear(double shx, double shy){
-        _transform.shear(shx, shy);
-    }
-
-    /**
-     * Get the rendering context of the <code>Font</code> within this
-     * <code>Graphics2D</code> context.
-     * The {@link FontRenderContext}
-     * encapsulates application hints such as anti-aliasing and
-     * fractional metrics, as well as target device specific information
-     * such as dots-per-inch.  This information should be provided by the
-     * application when using objects that perform typographical
-     * formatting, such as <code>Font</code> and
-     * <code>TextLayout</code>.  This information should also be provided
-     * by applications that perform their own layout and need accurate
-     * measurements of various characteristics of glyphs such as advance
-     * and line height when various rendering hints have been applied to
-     * the text rendering.
-     *
-     * @return a reference to an instance of FontRenderContext.
-     * @see java.awt.font.FontRenderContext
-     * @see java.awt.Font#createGlyphVector(FontRenderContext,char[])
-     * @see java.awt.font.TextLayout
-     * @since     JDK1.2
-     */
-    public FontRenderContext getFontRenderContext() {
-        boolean isAntiAliased = RenderingHints.VALUE_TEXT_ANTIALIAS_ON.equals(
-                getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING));
-        boolean usesFractionalMetrics = RenderingHints.VALUE_FRACTIONALMETRICS_ON.equals(
-                getRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS));
-
-
-        return new FontRenderContext(new AffineTransform(), isAntiAliased, usesFractionalMetrics);
-    }
-
-    /**
-     * Composes an <code>AffineTransform</code> object with the
-     * <code>Transform</code> in this <code>Graphics2D</code> according
-     * to the rule last-specified-first-applied.  If the current
-     * <code>Transform</code> is Cx, the result of composition
-     * with Tx is a new <code>Transform</code> Cx'.  Cx' becomes the
-     * current <code>Transform</code> for this <code>Graphics2D</code>.
-     * Transforming a point p by the updated <code>Transform</code> Cx' is
-     * equivalent to first transforming p by Tx and then transforming
-     * the result by the original <code>Transform</code> Cx.  In other
-     * words, Cx'(p) = Cx(Tx(p)).  A copy of the Tx is made, if necessary,
-     * so further modifications to Tx do not affect rendering.
-     * @param Tx the <code>AffineTransform</code> object to be composed with
-     * the current <code>Transform</code>
-     * @see #setTransform
-     * @see AffineTransform
-     */
-    public void transform(AffineTransform Tx) {
-        _transform.concatenate(Tx);
-    }
-
-    /**
-     * Renders a <code>BufferedImage</code> that is
-     * filtered with a
-     * {@link BufferedImageOp}.
-     * The rendering attributes applied include the <code>Clip</code>,
-     * <code>Transform</code>
-     * and <code>Composite</code> attributes.  This is equivalent to:
-     * <pre>
-     * img1 = op.filter(img, null);
-     * drawImage(img1, new AffineTransform(1f,0f,0f,1f,x,y), null);
-     * </pre>
-     * @param img the <code>BufferedImage</code> to be rendered
-     * @param op the filter to be applied to the image before rendering
-     * @param x the x coordinate in user space where the image is rendered
-     * @param y the y coordinate in user space where the image is rendered
-     * @see #_transform
-     * @see #setTransform
-     * @see #setComposite
-     * @see #clip
-     * @see #setClip(Shape)
-     */
-    public void drawImage(BufferedImage img,
-                          BufferedImageOp op,
-                          int x,
-                          int y){
-        img = op.filter(img, null);
-        drawImage(img, x, y, null);
-    }
-
-    /**
-     * Sets the background color for the <code>Graphics2D</code> context.
-     * The background color is used for clearing a region.
-     * When a <code>Graphics2D</code> is constructed for a
-     * <code>Component</code>, the background color is
-     * inherited from the <code>Component</code>. Setting the background color
-     * in the <code>Graphics2D</code> context only affects the subsequent
-     * <code>clearRect</code> calls and not the background color of the
-     * <code>Component</code>.  To change the background
-     * of the <code>Component</code>, use appropriate methods of
-     * the <code>Component</code>.
-     * @param color the background color that isused in
-     * subsequent calls to <code>clearRect</code>
-     * @see #getBackground
-     * @see java.awt.Graphics#clearRect
-     */
-    public void setBackground(Color color) {
-        if(color == null)
-            return;
-
-        _background = color;
-    }
-
-    /**
-     * Returns the background color used for clearing a region.
-     * @return the current <code>Graphics2D</code> <code>Color</code>,
-     * which defines the background color.
-     * @see #setBackground
-     */
-    public Color getBackground(){
-        return _background;
-    }
-
-    /**
-     * Sets the <code>Composite</code> for the <code>Graphics2D</code> context.
-     * The <code>Composite</code> is used in all drawing methods such as
-     * <code>drawImage</code>, <code>drawString</code>, <code>draw</code>,
-     * and <code>fill</code>.  It specifies how new pixels are to be combined
-     * with the existing pixels on the graphics device during the rendering
-     * process.
-     * <p>If this <code>Graphics2D</code> context is drawing to a
-     * <code>Component</code> on the display screen and the
-     * <code>Composite</code> is a custom object rather than an
-     * instance of the <code>AlphaComposite</code> class, and if
-     * there is a security manager, its <code>checkPermission</code>
-     * method is called with an <code>AWTPermission("readDisplayPixels")</code>
-     * permission.
-     *
-     * @param comp the <code>Composite</code> object to be used for rendering
-     * @throws SecurityException
-     *         if a custom <code>Composite</code> object is being
-     *         used to render to the screen and a security manager
-     *         is set and its <code>checkPermission</code> method
-     *         does not allow the operation.
-     * @see java.awt.Graphics#setXORMode
-     * @see java.awt.Graphics#setPaintMode
-     * @see java.awt.AlphaComposite
-     */
-    @NotImplemented
-    public void setComposite(Composite comp){
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-    }
-
-    /**
-     * Returns the current <code>Composite</code> in the
-     * <code>Graphics2D</code> context.
-     * @return the current <code>Graphics2D</code> <code>Composite</code>,
-     *              which defines a compositing style.
-     * @see #setComposite
-     */
-    @NotImplemented
-    public Composite getComposite(){
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-        return null;
-    }
-
-    /**
-     * Returns the value of a single preference for the rendering algorithms.
-     * Hint categories include controls for rendering quality and overall
-     * time/quality trade-off in the rendering process.  Refer to the
-     * <code>RenderingHints</code> class for definitions of some common
-     * keys and values.
-     * @param hintKey the key corresponding to the hint to get.
-     * @return an object representing the value for the specified hint key.
-     * Some of the keys and their associated values are defined in the
-     * <code>RenderingHints</code> class.
-     * @see RenderingHints
-     */
-    public Object getRenderingHint(RenderingHints.Key hintKey){
-        return _hints.get(hintKey);
-    }
-
-    /**
-     * Sets the value of a single preference for the rendering algorithms.
-     * Hint categories include controls for rendering quality and overall
-     * time/quality trade-off in the rendering process.  Refer to the
-     * <code>RenderingHints</code> class for definitions of some common
-     * keys and values.
-     * @param hintKey the key of the hint to be set.
-     * @param hintValue the value indicating preferences for the specified
-     * hint category.
-     * @see RenderingHints
-     */
-    public void setRenderingHint(RenderingHints.Key hintKey, Object hintValue){
-        _hints.put(hintKey, hintValue);
-    }
-
-
-    /**
-     * Renders the text of the specified
-     * {@link GlyphVector} using
-     * the <code>Graphics2D</code> context's rendering attributes.
-     * The rendering attributes applied include the <code>Clip</code>,
-     * <code>Transform</code>, <code>Paint</code>, and
-     * <code>Composite</code> attributes.  The <code>GlyphVector</code>
-     * specifies individual glyphs from a {@link Font}.
-     * The <code>GlyphVector</code> can also contain the glyph positions.
-     * This is the fastest way to render a set of characters to the
-     * screen.
-     *
-     * @param g the <code>GlyphVector</code> to be rendered
-     * @param x the x position in user space where the glyphs should be
-     *        rendered
-     * @param y the y position in user space where the glyphs should be
-     *        rendered
-     *
-     * @see java.awt.Font#createGlyphVector(FontRenderContext, char[])
-     * @see java.awt.font.GlyphVector
-     * @see #setPaint
-     * @see java.awt.Graphics#setColor
-     * @see #setTransform
-     * @see #setComposite
-     * @see #setClip(Shape)
-     */
-    public void drawGlyphVector(GlyphVector g, float x, float y) {
-        Shape glyphOutline = g.getOutline(x, y);
-        fill(glyphOutline);
-    }
-
-    /**
-     * Returns the device configuration associated with this
-     * <code>Graphics2D</code>.
-     * @return the device configuration
-     */
-    public GraphicsConfiguration getDeviceConfiguration() {
-        return GraphicsEnvironment.getLocalGraphicsEnvironment().
-                getDefaultScreenDevice().getDefaultConfiguration();
-    }
-
-    /**
-     * Sets the values of an arbitrary number of preferences for the
-     * rendering algorithms.
-     * Only values for the rendering hints that are present in the
-     * specified <code>Map</code> object are modified.
-     * All other preferences not present in the specified
-     * object are left unmodified.
-     * Hint categories include controls for rendering quality and
-     * overall time/quality trade-off in the rendering process.
-     * Refer to the <code>RenderingHints</code> class for definitions of
-     * some common keys and values.
-     * @param hints the rendering hints to be set
-     * @see RenderingHints
-     */
-    public void addRenderingHints(Map<?,?> hints){
-        this._hints.putAll(hints);
-    }
-
-    /**
-     * Concatenates the current
-     * <code>Graphics2D</code> <code>Transform</code>
-     * with a translation transform.
-     * Subsequent rendering is translated by the specified
-     * distance relative to the previous position.
-     * This is equivalent to calling transform(T), where T is an
-     * <code>AffineTransform</code> represented by the following matrix:
-     * <pre>
-     *          [   1    0    tx  ]
-     *          [   0    1    ty  ]
-     *          [   0    0    1   ]
-     * </pre>
-     * @param tx the distance to translate along the x-axis
-     * @param ty the distance to translate along the y-axis
-     */
-    public void translate(double tx, double ty){
-        _transform.translate(tx, ty);
-    }
-
-    /**
-     * Renders the text of the specified iterator, using the
-     * <code>Graphics2D</code> context's current <code>Paint</code>. The
-     * iterator must specify a font
-     * for each character. The baseline of the
-     * first character is at position (<i>x</i>,&nbsp;<i>y</i>) in the
-     * User Space.
-     * The rendering attributes applied include the <code>Clip</code>,
-     * <code>Transform</code>, <code>Paint</code>, and
-     * <code>Composite</code> attributes.
-     * For characters in script systems such as Hebrew and Arabic,
-     * the glyphs can be rendered from right to left, in which case the
-     * coordinate supplied is the location of the leftmost character
-     * on the baseline.
-     * @param iterator the iterator whose text is to be rendered
-     * @param x the x coordinate where the iterator's text is to be
-     * rendered
-     * @param y the y coordinate where the iterator's text is to be
-     * rendered
-     * @see #setPaint
-     * @see java.awt.Graphics#setColor
-     * @see #setTransform
-     * @see #setComposite
-     * @see #setClip
-     */
-    @NotImplemented
-    public void drawString(AttributedCharacterIterator iterator, float x, float y) {
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-    }
-
-    /**
-     * Checks whether or not the specified <code>Shape</code> intersects
-     * the specified {@link Rectangle}, which is in device
-     * space. If <code>onStroke</code> is false, this method checks
-     * whether or not the interior of the specified <code>Shape</code>
-     * intersects the specified <code>Rectangle</code>.  If
-     * <code>onStroke</code> is <code>true</code>, this method checks
-     * whether or not the <code>Stroke</code> of the specified
-     * <code>Shape</code> outline intersects the specified
-     * <code>Rectangle</code>.
-     * The rendering attributes taken into account include the
-     * <code>Clip</code>, <code>Transform</code>, and <code>Stroke</code>
-     * attributes.
-     * @param rect the area in device space to check for a hit
-     * @param s the <code>Shape</code> to check for a hit
-     * @param onStroke flag used to choose between testing the
-     * stroked or the filled shape.  If the flag is <code>true</code>, the
-     * <code>Stroke</code> oultine is tested.  If the flag is
-     * <code>false</code>, the filled <code>Shape</code> is tested.
-     * @return <code>true</code> if there is a hit; <code>false</code>
-     * otherwise.
-     * @see #setStroke
-     * @see #fill(Shape)
-     * @see #draw(Shape)
-     * @see #_transform
-     * @see #setTransform
-     * @see #clip
-     * @see #setClip(Shape)
-     */
-    public boolean hit(Rectangle rect,
-                       Shape s,
-                       boolean onStroke){
-        if (onStroke) {
-            s = getStroke().createStrokedShape(s);
-        }
-
-        s = getTransform().createTransformedShape(s);
-
-        return s.intersects(rect);
-    }
-
-    /**
-     * Gets the preferences for the rendering algorithms.  Hint categories
-     * include controls for rendering quality and overall time/quality
-     * trade-off in the rendering process.
-     * Returns all of the hint key/value pairs that were ever specified in
-     * one operation.  Refer to the
-     * <code>RenderingHints</code> class for definitions of some common
-     * keys and values.
-     * @return a reference to an instance of <code>RenderingHints</code>
-     * that contains the current preferences.
-     * @see RenderingHints
-     */
-    public RenderingHints getRenderingHints(){
-        return _hints;
-    }
-
-    /**
-     * Replaces the values of all preferences for the rendering
-     * algorithms with the specified <code>hints</code>.
-     * The existing values for all rendering hints are discarded and
-     * the new set of known hints and values are initialized from the
-     * specified {@link Map} object.
-     * Hint categories include controls for rendering quality and
-     * overall time/quality trade-off in the rendering process.
-     * Refer to the <code>RenderingHints</code> class for definitions of
-     * some common keys and values.
-     * @param hints the rendering hints to be set
-     * @see RenderingHints
-     */
-    public void setRenderingHints(Map<?,?> hints){
-        this._hints = new RenderingHints(null);
-        this._hints.putAll(hints);
-    }
-
-    /**
-     * Renders an image, applying a transform from image space into user space
-     * before drawing.
-     * The transformation from user space into device space is done with
-     * the current <code>Transform</code> in the <code>Graphics2D</code>.
-     * The specified transformation is applied to the image before the
-     * transform attribute in the <code>Graphics2D</code> context is applied.
-     * The rendering attributes applied include the <code>Clip</code>,
-     * <code>Transform</code>, and <code>Composite</code> attributes.
-     * Note that no rendering is done if the specified transform is
-     * noninvertible.
-     * @param img the <code>Image</code> to be rendered
-     * @param xform the transformation from image space into user space
-     * @param obs the {@link ImageObserver}
-     * to be notified as more of the <code>Image</code>
-     * is converted
-     * @return <code>true</code> if the <code>Image</code> is
-     * fully loaded and completely rendered;
-     * <code>false</code> if the <code>Image</code> is still being loaded.
-     * @see #_transform
-     * @see #setTransform
-     * @see #setComposite
-     * @see #clip
-     * @see #setClip(Shape)
-     */
-    @NotImplemented
-    public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) {
-         if (LOG.check(POILogger.WARN)) {
-             LOG.log(POILogger.WARN, "Not implemented");
-         }
-        return false;
-    }
-
-    /**
-     * Draws as much of the specified image as has already been scaled
-     * to fit inside the specified rectangle.
-     * <p>
-     * The image is drawn inside the specified rectangle of this
-     * graphics context's coordinate space, and is scaled if
-     * necessary. Transparent pixels do not affect whatever pixels
-     * are already there.
-     * <p>
-     * This method returns immediately in all cases, even if the
-     * entire image has not yet been scaled, dithered, and converted
-     * for the current output device.
-     * If the current output representation is not yet complete, then
-     * <code>drawImage</code> returns <code>false</code>. As more of
-     * the image becomes available, the process that loads the image notifies
-     * the image observer by calling its <code>imageUpdate</code> method.
-     * <p>
-     * A scaled version of an image will not necessarily be
-     * available immediately just because an unscaled version of the
-     * image has been constructed for this output device.  Each size of
-     * the image may be cached separately and generated from the original
-     * data in a separate image production sequence.
-     * @param    img    the specified image to be drawn. This method does
-     *                  nothing if <code>img</code> is null.
-     * @param    x      the <i>x</i> coordinate.
-     * @param    y      the <i>y</i> coordinate.
-     * @param    width  the width of the rectangle.
-     * @param    height the height of the rectangle.
-     * @param    observer    object to be notified as more of
-     *                          the image is converted.
-     * @return   <code>false</code> if the image pixels are still changing;
-     *           <code>true</code> otherwise.
-     * @see      java.awt.Image
-     * @see      java.awt.image.ImageObserver
-     * @see      java.awt.image.ImageObserver#imageUpdate(java.awt.Image, int, int, int, int, int)
-     */
-    @NotImplemented
-    public boolean drawImage(Image img, int x, int y,
-                             int width, int height,
-                             ImageObserver observer) {
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-        return false;
-    }
-
-    /**
-     * Creates a new <code>Graphics</code> object that is
-     * a copy of this <code>Graphics</code> object.
-     * @return     a new graphics context that is a copy of
-     *                       this graphics context.
-     */
-    public Graphics create() {
-        try {
-            return (Graphics)clone();
-        } catch (CloneNotSupportedException e){
-            throw new HSLFException(e);
-        }
-    }
-
-    /**
-     * Gets the font metrics for the specified font.
-     * @return    the font metrics for the specified font.
-     * @param     f the specified font
-     * @see       java.awt.Graphics#getFont
-     * @see       java.awt.FontMetrics
-     * @see       java.awt.Graphics#getFontMetrics()
-     */
-    @SuppressWarnings("deprecation")
-    @SuppressForbidden
-    public FontMetrics getFontMetrics(Font f) {
-        return Toolkit.getDefaultToolkit().getFontMetrics(f);
-    }
-
-    /**
-     * Sets the paint mode of this graphics context to alternate between
-     * this graphics context's current color and the new specified color.
-     * This specifies that logical pixel operations are performed in the
-     * XOR mode, which alternates pixels between the current color and
-     * a specified XOR color.
-     * <p>
-     * When drawing operations are performed, pixels which are the
-     * current color are changed to the specified color, and vice versa.
-     * <p>
-     * Pixels that are of colors other than those two colors are changed
-     * in an unpredictable but reversible manner; if the same figure is
-     * drawn twice, then all pixels are restored to their original values.
-     * @param     c1 the XOR alternation color
-     */
-    @NotImplemented
-    public void setXORMode(Color c1) {
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-    }
-
-    /**
-     * Sets the paint mode of this graphics context to overwrite the
-     * destination with this graphics context's current color.
-     * This sets the logical pixel operation function to the paint or
-     * overwrite mode.  All subsequent rendering operations will
-     * overwrite the destination with the current color.
-     */
-    @NotImplemented
-    public void setPaintMode() {
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-    }
-
-    /**
-     * Renders a
-     * {@link RenderableImage},
-     * applying a transform from image space into user space before drawing.
-     * The transformation from user space into device space is done with
-     * the current <code>Transform</code> in the <code>Graphics2D</code>.
-     * The specified transformation is applied to the image before the
-     * transform attribute in the <code>Graphics2D</code> context is applied.
-     * The rendering attributes applied include the <code>Clip</code>,
-     * <code>Transform</code>, and <code>Composite</code> attributes. Note
-     * that no rendering is done if the specified transform is
-     * noninvertible.
-     *<p>
-     * Rendering hints set on the <code>Graphics2D</code> object might
-     * be used in rendering the <code>RenderableImage</code>.
-     * If explicit control is required over specific hints recognized by a
-     * specific <code>RenderableImage</code>, or if knowledge of which hints
-     * are used is required, then a <code>RenderedImage</code> should be
-     * obtained directly from the <code>RenderableImage</code>
-     * and rendered using
-     *{@link #drawRenderedImage(RenderedImage, AffineTransform) drawRenderedImage}.
-     * @param img the image to be rendered. This method does
-     *            nothing if <code>img</code> is null.
-     * @param xform the transformation from image space into user space
-     * @see #_transform
-     * @see #setTransform
-     * @see #setComposite
-     * @see #clip
-     * @see #setClip
-     * @see #drawRenderedImage
-     */
-    @NotImplemented
-    public void drawRenderedImage(RenderedImage img, AffineTransform xform) {
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-    }
-
-    /**
-     * Renders a {@link RenderedImage},
-     * applying a transform from image
-     * space into user space before drawing.
-     * The transformation from user space into device space is done with
-     * the current <code>Transform</code> in the <code>Graphics2D</code>.
-     * The specified transformation is applied to the image before the
-     * transform attribute in the <code>Graphics2D</code> context is applied.
-     * The rendering attributes applied include the <code>Clip</code>,
-     * <code>Transform</code>, and <code>Composite</code> attributes. Note
-     * that no rendering is done if the specified transform is
-     * noninvertible.
-     * @param img the image to be rendered. This method does
-     *            nothing if <code>img</code> is null.
-     * @param xform the transformation from image space into user space
-     * @see #_transform
-     * @see #setTransform
-     * @see #setComposite
-     * @see #clip
-     * @see #setClip
-     */
-    @NotImplemented
-    public void drawRenderableImage(RenderableImage img, AffineTransform xform) {
-        if (LOG.check(POILogger.WARN)) {
-            LOG.log(POILogger.WARN, "Not implemented");
-        }
-    }
-
-    protected void applyStroke(HSLFSimpleShape shape) {
-        if (_stroke instanceof BasicStroke){
-            BasicStroke bs = (BasicStroke)_stroke;
-            shape.setLineWidth(bs.getLineWidth());
-            float[] dash = bs.getDashArray();
-            if (dash != null) {
-                //TODO: implement more dashing styles
-                shape.setLineDash(StrokeStyle.LineDash.DASH);
-            }
-        }
-    }
-
-    protected void applyPaint(HSLFSimpleShape shape) {
-        if (_paint instanceof Color) {
-            shape.getFill().setForegroundColor((Color)_paint);
-        }
+        super(group);
     }
 }
index 7f7f6bd9cff52325ad9c752a41155f2a948a17dd..282b7791e9b6bf4ab9b2f7990ecdf88165c27c21 100644 (file)
@@ -113,11 +113,7 @@ public class HSLFTabStopPropCollection extends TextProp {
 
     @Override
     public int hashCode() {
-        final int prime = 31;
-        int result = super.hashCode();
-        result = prime * result
-                + ((tabStops == null) ? 0 : tabStops.hashCode());
-        return result;
+        return 31 * super.hashCode() + tabStops.hashCode();
     }
 
     @Override
index 976e8550f5f68d4b6af959f2573e688581475f09..b859a4c0992047d39dbfb1c4ce524ff8b4ade857 100644 (file)
@@ -338,7 +338,7 @@ public class TextPropCollection {
         result = prime * result + charactersCovered;
         result = prime * result + maskSpecial;
         result = prime * result + indentLevel;
-        result = prime * result + ((textProps == null) ? 0 : textProps.hashCode());
+        result = prime * result + textProps.hashCode();
         return result;
     }
     /**
index 4e68c63fedfa4c83432c2fd8812ae69469b46032..5b9bdfa5bcedf7dd57fc3f68b77a545dbe6b253d 100644 (file)
@@ -193,9 +193,6 @@ public final class HSLFTextParagraph implements TextParagraph<HSLFShape,HSLFText
     private void supplySheet(HSLFSheet sheet) {
         this._sheet = sheet;
 
-        if (_runs == null) {
-            return;
-        }
         for (HSLFTextRun rt : _runs) {
             rt.updateSheet();
         }
index 00f35d6f1e1772181a0286fb1c11d8db52bd4e14..c9d689564a0a9a09e59db2165c91d69bcca704bf 100644 (file)
@@ -27,9 +27,6 @@ import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 
-/**
- * @author Ryan Ackley
- */
 @Internal
 public final class ListTables
 {
@@ -169,10 +166,8 @@ public final class ListTables
     {
         final int prime = 31;
         int result = 1;
-        result = prime * result
-                + ( ( _listMap == null ) ? 0 : _listMap.hashCode() );
-        result = prime * result
-                + ( ( _plfLfo == null ) ? 0 : _plfLfo.hashCode() );
+        result = prime * result + _listMap.hashCode();
+        result = prime * result + ( ( _plfLfo == null ) ? 0 : _plfLfo.hashCode() );
         return result;
     }
 
@@ -186,12 +181,7 @@ public final class ListTables
         if ( getClass() != obj.getClass() )
             return false;
         ListTables other = (ListTables) obj;
-        if ( _listMap == null )
-        {
-            if ( other._listMap != null )
-                return false;
-        }
-        else if ( !_listMap.equals( other._listMap ) )
+        if ( !_listMap.equals( other._listMap ) )
             return false;
         if ( _plfLfo == null )
         {