From 4c4a33c5de1380533790182ef8a38509e5fa4b70 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Mon, 9 Dec 2019 20:56:52 +0000 Subject: [PATCH] Remove POIBrowser and SViewer and remove references to it git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1871102 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/hssf/view/SVBorder.java | 559 ------------------ .../poi/hssf/view/SVFractionalFormat.java | 229 ------- .../org/apache/poi/hssf/view/SVRowHeader.java | 109 ---- .../apache/poi/hssf/view/SVSheetTable.java | 261 -------- .../poi/hssf/view/SVTableCellEditor.java | 215 ------- .../poi/hssf/view/SVTableCellRenderer.java | 286 --------- .../apache/poi/hssf/view/SVTableModel.java | 97 --- .../apache/poi/hssf/view/SVTableUtils.java | 94 --- .../src/org/apache/poi/hssf/view/SViewer.java | 197 ------ .../apache/poi/hssf/view/SViewerPanel.java | 343 ----------- .../poi/hssf/view/brush/BasicBrush.java | 72 --- .../org/apache/poi/hssf/view/brush/Brush.java | 31 - .../poi/hssf/view/brush/DoubleStroke.java | 64 -- .../poi/hssf/view/brush/PendingPaintings.java | 178 ------ .../poi/hssf/view/brush/package-info.java | 21 - .../poifs/poibrowser/DocumentDescriptor.java | 77 --- .../DocumentDescriptorRenderer.java | 72 --- .../ExtendableTreeCellRenderer.java | 144 ----- .../poi/poifs/poibrowser/POIBrowser.java | 119 ---- .../poibrowser/PropertySetDescriptor.java | 75 --- .../PropertySetDescriptorRenderer.java | 170 ------ .../poifs/poibrowser/TreeReaderListener.java | 215 ------- .../org/apache/poi/poifs/poibrowser/Util.java | 41 -- 23 files changed, 3669 deletions(-) delete mode 100644 src/examples/src/org/apache/poi/hssf/view/SVBorder.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/SVFractionalFormat.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/SVRowHeader.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/SVSheetTable.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/SVTableCellEditor.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/SVTableCellRenderer.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/SVTableModel.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/SVTableUtils.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/SViewer.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/SViewerPanel.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/brush/BasicBrush.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/brush/Brush.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/brush/DoubleStroke.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/brush/PendingPaintings.java delete mode 100644 src/examples/src/org/apache/poi/hssf/view/brush/package-info.java delete mode 100644 src/examples/src/org/apache/poi/poifs/poibrowser/DocumentDescriptor.java delete mode 100644 src/examples/src/org/apache/poi/poifs/poibrowser/DocumentDescriptorRenderer.java delete mode 100644 src/examples/src/org/apache/poi/poifs/poibrowser/ExtendableTreeCellRenderer.java delete mode 100644 src/examples/src/org/apache/poi/poifs/poibrowser/POIBrowser.java delete mode 100644 src/examples/src/org/apache/poi/poifs/poibrowser/PropertySetDescriptor.java delete mode 100644 src/examples/src/org/apache/poi/poifs/poibrowser/PropertySetDescriptorRenderer.java delete mode 100644 src/examples/src/org/apache/poi/poifs/poibrowser/TreeReaderListener.java delete mode 100644 src/examples/src/org/apache/poi/poifs/poibrowser/Util.java diff --git a/src/examples/src/org/apache/poi/hssf/view/SVBorder.java b/src/examples/src/org/apache/poi/hssf/view/SVBorder.java deleted file mode 100644 index dd0fe35d73..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/SVBorder.java +++ /dev/null @@ -1,559 +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.hssf.view; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Graphics; - -import javax.swing.border.AbstractBorder; - -import org.apache.poi.ss.usermodel.BorderStyle; - -/** - * This is an attempt to implement Excel style borders for the SheetViewer. - * Mostly just overrides stuff so the javadoc won't appear here but will - * appear in the generated stuff. - * - * @author Andrew C. Oliver (acoliver at apache dot org) - * @author Jason Height - */ -public class SVBorder extends AbstractBorder { - private Color northColor; - private Color eastColor; - private Color southColor; - private Color westColor; - private BorderStyle northBorderType = BorderStyle.NONE; - private BorderStyle eastBorderType = BorderStyle.NONE; - private BorderStyle southBorderType = BorderStyle.NONE; - private BorderStyle westBorderType = BorderStyle.NONE; - private boolean northBorder; - private boolean eastBorder; - private boolean southBorder; - private boolean westBorder; - private boolean selected; - - public void setBorder(Color northColor, Color eastColor, - Color southColor, Color westColor, - BorderStyle northBorderType, BorderStyle eastBorderType, - BorderStyle southBorderType, BorderStyle westBorderType, - boolean selected) { - this.eastColor = eastColor; - this.southColor = southColor; - this.westColor = westColor; - this.northBorderType = northBorderType; - this.eastBorderType = eastBorderType; - this.southBorderType = southBorderType; - this.westBorderType = westBorderType; - this.northBorder = northBorderType != BorderStyle.NONE; - this.eastBorder = eastBorderType != BorderStyle.NONE; - this.southBorder = southBorderType != BorderStyle.NONE; - this.westBorder = westBorderType != BorderStyle.NONE; - this.selected = selected; - } - - @Override - public void paintBorder(Component c, Graphics g, int x, int y, int width, - int height) { - Color oldColor = g.getColor(); - - - paintSelectedBorder(g, x, y, width, height); - paintNormalBorders(g, x, y, width, height); - paintDottedBorders(g, x, y, width, height); - paintDashedBorders(g, x, y, width, height); - paintDoubleBorders(g, x, y, width, height); - paintDashDotDotBorders(g, x, y, width, height); - - - g.setColor(oldColor); - } - - /** - * Called by paintBorder to paint the border of a selected cell. - * The paramaters are the Graphics object, location and dimensions of the - * cell. - */ - private void paintSelectedBorder(Graphics g, int x, int y, int width, - int height) { - if (selected) { - //Need to setup thickness of 2 - g.setColor(Color.black); - //paint the border - g.drawRect(x, y, width - 1, height - 1); - - //paint the filled rectangle at the bottom left hand position - g.fillRect(x + width - 5, y + height - 5, 5, 5); - } - } - - - /** - * Called by paintBorder to paint the various versions of normal line - * borders for a cell. - */ - private void paintNormalBorders(Graphics g, int x, int y, int width, - int height) { - - if (northBorder && - ((northBorderType == BorderStyle.THIN) || - (northBorderType == BorderStyle.MEDIUM) || - (northBorderType == BorderStyle.THICK) - ) - ) { - - int thickness = getThickness(northBorderType); - - g.setColor(northColor); - - for (int k = 0; k < thickness; k++) { - g.drawLine(x, y + k, width, y + k); - } - } - - if (eastBorder && - ((eastBorderType == BorderStyle.THIN) || - (eastBorderType == BorderStyle.MEDIUM) || - (eastBorderType == BorderStyle.THICK) - ) - ) { - - int thickness = getThickness(eastBorderType); - - g.setColor(eastColor); - - for (int k = 0; k < thickness; k++) { - g.drawLine(width - k, y, width - k, height); - } - } - - if (southBorder && - ((southBorderType == BorderStyle.THIN) || - (southBorderType == BorderStyle.MEDIUM) || - (southBorderType == BorderStyle.THICK) - ) - ) { - - int thickness = getThickness(southBorderType); - - g.setColor(southColor); - for (int k = 0; k < thickness; k++) { - g.drawLine(x, height - k, width, height - k); - } - } - - if (westBorder && - ((westBorderType == BorderStyle.THIN) || - (westBorderType == BorderStyle.MEDIUM) || - (westBorderType == BorderStyle.THICK) - ) - ) { - - int thickness = getThickness(westBorderType); - - g.setColor(westColor); - - for (int k = 0; k < thickness; k++) { - g.drawLine(x + k, y, x + k, height); - } - } - } - - /** - * Called by paintBorder to paint the dotted line - * borders for a cell. - */ - private void paintDottedBorders(Graphics g, int x, int y, int width, - int height) { - if (northBorder && - northBorderType == BorderStyle.DOTTED) { - int thickness = getThickness(northBorderType); - - g.setColor(northColor); - - for (int k = 0; k < thickness; k++) { - for (int xc = x; xc < width; xc = xc + 2) { - g.drawLine(xc, y + k, xc, y + k); - } - } - } - - if (eastBorder && - eastBorderType == BorderStyle.DOTTED - ) { - - int thickness = getThickness(eastBorderType); - thickness++; //need for dotted borders to show up east - - g.setColor(eastColor); - - for (int k = 0; k < thickness; k++) { - for (int yc = y; yc < height; yc = yc + 2) { - g.drawLine(width - k, yc, width - k, yc); - } - } - } - - if (southBorder && - southBorderType == BorderStyle.DOTTED - ) { - - int thickness = getThickness(southBorderType); - thickness++; - g.setColor(southColor); - for (int k = 0; k < thickness; k++) { - for (int xc = x; xc < width; xc = xc + 2) { - g.drawLine(xc, height - k, xc, height - k); - } - } - } - - if (westBorder && - westBorderType == BorderStyle.DOTTED - ) { - - int thickness = getThickness(westBorderType); -// thickness++; - - g.setColor(westColor); - - for (int k = 0; k < thickness; k++) { - for (int yc = y; yc < height; yc = yc + 2) { - g.drawLine(x + k, yc, x + k, yc); - } - } - } - } - - /** - * Called by paintBorder to paint the various versions of dotted line - * borders for a cell. - */ - private void paintDashedBorders(Graphics g, int x, int y, int width, - int height) { - if (northBorder && - ((northBorderType == BorderStyle.DASHED) || - (northBorderType == BorderStyle.HAIR)) - ) { - int thickness = getThickness(northBorderType); - - int dashlength = 1; - - if (northBorderType == BorderStyle.DASHED) - dashlength = 2; - - g.setColor(northColor); - - for (int k = 0; k < thickness; k++) { - for (int xc = x; xc < width; xc = xc + 5) { - g.drawLine(xc, y + k, xc + dashlength, y + k); - } - } - } - - if (eastBorder && - ((eastBorderType == BorderStyle.DASHED) || - (eastBorderType == BorderStyle.HAIR)) - ) { - - int thickness = getThickness(eastBorderType); - thickness++; //need for dotted borders to show up east - - - int dashlength = 1; - - if (eastBorderType == BorderStyle.DASHED) - dashlength = 2; - - g.setColor(eastColor); - - for (int k = 0; k < thickness; k++) { - for (int yc = y; yc < height; yc = yc + 5) { - g.drawLine(width - k, yc, width - k, yc + dashlength); - } - } - } - - if (southBorder && - ((southBorderType == BorderStyle.DASHED) || - (southBorderType == BorderStyle.HAIR)) - ) { - - int thickness = getThickness(southBorderType); - thickness++; - - int dashlength = 1; - - if (southBorderType == BorderStyle.DASHED) - dashlength = 2; - - g.setColor(southColor); - for (int k = 0; k < thickness; k++) { - for (int xc = x; xc < width; xc = xc + 5) { - g.drawLine(xc, height - k, xc + dashlength, height - k); - } - } - } - - if (westBorder && - ((westBorderType == BorderStyle.DASHED) || - (westBorderType == BorderStyle.HAIR)) - ) { - - int thickness = getThickness(westBorderType); -// thickness++; - - int dashlength = 1; - - if (westBorderType == BorderStyle.DASHED) - dashlength = 2; - - g.setColor(westColor); - - for (int k = 0; k < thickness; k++) { - for (int yc = y; yc < height; yc = yc + 5) { - g.drawLine(x + k, yc, x + k, yc + dashlength); - } - } - } - } - - /** - * Called by paintBorder to paint the double line - * borders for a cell. - */ - private void paintDoubleBorders(Graphics g, int x, int y, int width, - int height) { - if (northBorder && - northBorderType == BorderStyle.DOUBLE) { - - g.setColor(northColor); - - int leftx = x; - int rightx = width; - - // if there are borders on the west or east then - // the second line shouldn't cross them - if (westBorder) { - leftx = x + 3; - } - - if (eastBorder) { - rightx = width - 3; - } - - g.drawLine(x, y, width, y); - g.drawLine(leftx, y + 2, rightx, y + 2); - } - - if (eastBorder && - eastBorderType == BorderStyle.DOUBLE - ) { - - int thickness = getThickness(eastBorderType); - thickness++; //need for dotted borders to show up east - - g.setColor(eastColor); - - int topy = y; - int bottomy = height; - - if (northBorder) { - topy = y + 3; - } - - if (southBorder) { - bottomy = height - 3; - } - - g.drawLine(width - 1, y, width - 1, height); - g.drawLine(width - 3, topy, width - 3, bottomy); - } - - if (southBorder && - southBorderType == BorderStyle.DOUBLE - ) { - - g.setColor(southColor); - - int leftx = y; - int rightx = width; - - if (westBorder) - leftx = x + 3; - - if (eastBorder) - rightx = width - 3; - - - g.drawLine(x, height - 1, width, height - 1); - g.drawLine(leftx, height - 3, rightx, height - 3); - } - - if (westBorder && - westBorderType == BorderStyle.DOUBLE - ) { - - int thickness = getThickness(westBorderType); -// thickness++; - - g.setColor(westColor); - - int topy = y; - int bottomy = height - 3; - - if (northBorder) - topy = y + 2; - - if (southBorder) - bottomy = height - 3; - - g.drawLine(x, y, x, height); - g.drawLine(x + 2, topy, x + 2, bottomy); - } - } - - /** - * Called by paintBorder to paint the various versions of dash dot dot line - * borders for a cell. - */ - private void paintDashDotDotBorders(Graphics g, int x, int y, int width, - int height) { - if (northBorder && - ((northBorderType == BorderStyle.DASH_DOT_DOT) || - (northBorderType == BorderStyle.MEDIUM_DASH_DOT_DOT)) - ) { - int thickness = getThickness(northBorderType); - - g.setColor(northColor); - for (int l = x; l < width; ) { - l = l + drawDashDotDot(g, l, y, thickness, true, true); - } - - } - - if (eastBorder && - ((eastBorderType == BorderStyle.DASH_DOT_DOT) || - (eastBorderType == BorderStyle.MEDIUM_DASH_DOT_DOT)) - ) { - - int thickness = getThickness(eastBorderType); - - g.setColor(eastColor); - - for (int l = y; l < height; ) { - //System.err.println("drawing east"); - l = l + drawDashDotDot(g, width - 1, l, thickness, false, false); - } - } - - if (southBorder && - ((southBorderType == BorderStyle.DASH_DOT_DOT) || - (southBorderType == BorderStyle.MEDIUM_DASH_DOT_DOT)) - ) { - - int thickness = getThickness(southBorderType); - - g.setColor(southColor); - - for (int l = x; l < width; ) { - //System.err.println("drawing south"); - l = l + drawDashDotDot(g, l, height - 1, thickness, true, false); - } - } - - if (westBorder && - ((westBorderType == BorderStyle.DASH_DOT_DOT) || - (westBorderType == BorderStyle.MEDIUM_DASH_DOT_DOT)) - ) { - - int thickness = getThickness(westBorderType); - - g.setColor(westColor); - - for (int l = y; l < height; ) { - //System.err.println("drawing west"); - l = l + drawDashDotDot(g, x, l, thickness, false, true); - } - - } - } - - /** - * Draws one dash dot dot horizontally or vertically with thickness drawn - * incrementally to either the right or left. - * - * @param g graphics object for drawing with - * @param x the x origin of the line - * @param y the y origin of the line - * @param thickness the thickness of the line - * @param horizontal or vertical (true for horizontal) - * @param rightBottom or left/top thickness (true for right or top), - * if true then the x or y origin will be incremented to provide - * thickness, if false, they'll be decremented. For vertical - * borders, x is incremented or decremented, for horizontal its y. - * Just set to true for north and west, and false for east and - * south. - * @return length - returns the length of the line. - */ - private int drawDashDotDot(Graphics g, int x, int y, int thickness, - boolean horizontal, - boolean rightBottom) { - - for (int t = 0; t < thickness; t++) { - if (!rightBottom) { - t = 0 - t; //add negative thickness so we go the other way - //then we'll decrement instead of increment. - } - if (horizontal) { - g.drawLine(x, y + t, x + 5, y + t); - g.drawLine(x + 8, y + t, x + 10, y + t); - g.drawLine(x + 13, y + t, x + 15, y + t); - } else { - g.drawLine(x + t, y, x + t, y + 5); - g.drawLine(x + t, y + 8, x + t, y + 10); - g.drawLine(x + t, y + 13, x + t, y + 15); - } - } - return 18; - } - - /** - * @return the line thickness for a border based on border type - */ - private int getThickness(BorderStyle thickness) { - switch (thickness) { - case DASH_DOT_DOT: - case DASHED: - case HAIR: - return 1; - case THIN: - return 2; - case MEDIUM: - case MEDIUM_DASH_DOT_DOT: - return 3; - case THICK: - return 4; - default: - return 1; - } - } - - -} diff --git a/src/examples/src/org/apache/poi/hssf/view/SVFractionalFormat.java b/src/examples/src/org/apache/poi/hssf/view/SVFractionalFormat.java deleted file mode 100644 index 9f2d1a2b52..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/SVFractionalFormat.java +++ /dev/null @@ -1,229 +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.hssf.view; - -import java.text.FieldPosition; -import java.text.Format; -import java.text.ParseException; -import java.text.ParsePosition; - -/** - * This class is used to format cells into their fractional format. - *

- * I cant be 100% sure that the same fractional value will be displayed as in - * excel but then again it is a lossy formating mode anyway - * - * @author Jason Height - * @since 15 July 2002 - */ -public class SVFractionalFormat extends Format { - private short ONE_DIGIT = 1; - private short TWO_DIGIT = 2; - private short THREE_DIGIT = 3; - private short UNITS = 4; - private int units = 1; - private short mode = -1; - - /** - * Constructs a new FractionalFormatter - *

- * The formatStr defines how the number will be formatted - * # ?/? Up to one digit - * # ??/?? Up to two digits - * # ???/??? Up to three digits - * # ?/2 In halves - * # ?/4 In quarters - * # ?/8 In eighths - * # ?/16 In sixteenths - * # ?/10 In tenths - * # ?/100 In hundredths - */ - public SVFractionalFormat(String formatStr) { - if ("# ?/?".equals(formatStr)) - mode = ONE_DIGIT; - else if ("# ??/??".equals(formatStr)) - mode = TWO_DIGIT; - else if ("# ???/???".equals(formatStr)) - mode = THREE_DIGIT; - else if ("# ?/2".equals(formatStr)) { - mode = UNITS; - units = 2; - } else if ("# ?/4".equals(formatStr)) { - mode = UNITS; - units = 4; - } else if ("# ?/8".equals(formatStr)) { - mode = UNITS; - units = 8; - } else if ("# ?/16".equals(formatStr)) { - mode = UNITS; - units = 16; - } else if ("# ?/10".equals(formatStr)) { - mode = UNITS; - units = 10; - } else if ("# ?/100".equals(formatStr)) { - mode = UNITS; - units = 100; - } - } - - /** - * Returns a fractional string representation of a double to a maximum denominator size - *

- * This code has been translated to java from the following web page. - * http://www.codeproject.com/cpp/fraction.asp - * Originally coded in c++ By Dean Wyant dwyant@mindspring.com - * The code on the web page is freely available. - * - * @param f Description of the Parameter - * @param MaxDen Description of the Parameter - * @return Description of the Return Value - */ - private String format(final double f, final int MaxDen) { - long Whole = (long) f; - int sign = 1; - if (f < 0) { - sign = -1; - } - double Precision = 0.00001; - double AllowedError = Precision; - double d = Math.abs(f); - d -= Whole; - double Frac = d; - double Diff = Frac; - long Num = 1; - long Den = 0; - long A = 0; - long B = 0; - long i = 0; - if (Frac > Precision) { - while (true) { - d = 1.0 / d; - i = (long) (d + Precision); - d -= i; - if (A > 0) { - Num = i * Num + B; - } - Den = (long) (Num / Frac + 0.5); - Diff = Math.abs((double) Num / Den - Frac); - if (Den > MaxDen) { - if (A > 0) { - Num = A; - Den = (long) (Num / Frac + 0.5); - Diff = Math.abs((double) Num / Den - Frac); - } else { - Den = MaxDen; - Num = 1; - Diff = Math.abs((double) Num / Den - Frac); - if (Diff > Frac) { - Num = 0; - Den = 1; - // Keeps final check below from adding 1 and keeps Den from being 0 - Diff = Frac; - } - } - break; - } - if ((Diff <= AllowedError) || (d < Precision)) { - break; - } - Precision = AllowedError / Diff; - // This calculation of Precision does not always provide results within - // Allowed Error. It compensates for loss of significant digits that occurs. - // It helps to round the imprecise reciprocal values to i. - B = A; - A = Num; - } - } - if (Num == Den) { - Whole++; - Num = 0; - Den = 0; - } else if (Den == 0) { - Num = 0; - } - if (sign < 0) { - if (Whole == 0) { - Num = -Num; - } else { - Whole = -Whole; - } - } - return new StringBuilder().append(Whole).append(" ").append(Num).append("/").append(Den).toString(); - } - - /** - * This method formats the double in the units specified. - * The usints could be any number but in this current implementation it is - * halves (2), quaters (4), eigths (8) etc - */ - private String formatUnit(double f, int units) { - long Whole = (long) f; - f -= Whole; - long Num = Math.round(f * units); - - return new StringBuilder().append(Whole).append(" ").append(Num).append("/").append(units).toString(); - } - - public final String format(double val) { - if (mode == ONE_DIGIT) { - return format(val, 9); - } else if (mode == TWO_DIGIT) { - return format(val, 99); - } else if (mode == THREE_DIGIT) { - return format(val, 999); - } else if (mode == UNITS) { - return formatUnit(val, units); - } - throw new RuntimeException("Unexpected Case"); - } - - @Override - public StringBuffer format(Object obj, - StringBuffer toAppendTo, - FieldPosition pos) { - if (obj instanceof Number) { - toAppendTo.append(format(((Number) obj).doubleValue())); - return toAppendTo; - } - throw new IllegalArgumentException("Can only handle Numbers"); - } - - @Override - public Object parseObject(String source, - ParsePosition status) { - //JMH TBD - return null; - } - - @Override - public Object parseObject(String source) - throws ParseException { - //JMH TBD - return null; - } - - @Override - public Object clone() { - //JMH TBD - return null; - } - - -} diff --git a/src/examples/src/org/apache/poi/hssf/view/SVRowHeader.java b/src/examples/src/org/apache/poi/hssf/view/SVRowHeader.java deleted file mode 100644 index 834d0a0068..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/SVRowHeader.java +++ /dev/null @@ -1,109 +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.hssf.view; - -import java.awt.Component; -import java.awt.Dimension; - -import javax.swing.AbstractListModel; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JTable; -import javax.swing.ListCellRenderer; -import javax.swing.ListModel; -import javax.swing.UIManager; -import javax.swing.table.JTableHeader; - -import org.apache.poi.hssf.usermodel.HSSFRow; -import org.apache.poi.hssf.usermodel.HSSFSheet; - -/** - * This class presents the row header to the table. - * - * @author Jason Height - */ -public class SVRowHeader extends JList { - /** - * This model simply returns an integer number up to the number of rows - * that are present in the sheet. - */ - private class SVRowHeaderModel extends AbstractListModel { - private HSSFSheet sheet; - - public SVRowHeaderModel(HSSFSheet sheet) { - this.sheet = sheet; - } - - @Override - public int getSize() { - return sheet.getLastRowNum() + 1; - } - - @Override - public Object getElementAt(int index) { - return Integer.toString(index + 1); - } - } - - /** - * Renderes the row number - */ - private class RowHeaderRenderer extends JLabel implements ListCellRenderer { - private HSSFSheet sheet; - private int extraHeight; - - RowHeaderRenderer(HSSFSheet sheet, JTable table, int extraHeight) { - this.sheet = sheet; - this.extraHeight = extraHeight; - JTableHeader header = table.getTableHeader(); - setOpaque(true); - setBorder(UIManager.getBorder("TableHeader.cellBorder")); - setHorizontalAlignment(CENTER); - setForeground(header.getForeground()); - setBackground(header.getBackground()); - setFont(header.getFont()); - } - - @Override - public Component getListCellRendererComponent(JList list, - Object value, int index, boolean isSelected, boolean cellHasFocus) { - Dimension d = getPreferredSize(); - HSSFRow row = sheet.getRow(index); - int rowHeight; - if (row == null) { - rowHeight = (int) sheet.getDefaultRowHeightInPoints(); - } else { - rowHeight = (int) row.getHeightInPoints(); - } - d.height = rowHeight + extraHeight; - setPreferredSize(d); - setText((value == null) ? "" : value.toString()); - return this; - } - } - - public SVRowHeader(HSSFSheet sheet, JTable table, int extraHeight) { - ListModel lm = new SVRowHeaderModel(sheet); - this.setModel(lm); - - setFixedCellWidth(50); - setCellRenderer(new RowHeaderRenderer(sheet, table, extraHeight)); - } -} diff --git a/src/examples/src/org/apache/poi/hssf/view/SVSheetTable.java b/src/examples/src/org/apache/poi/hssf/view/SVSheetTable.java deleted file mode 100644 index 7c41cad868..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/SVSheetTable.java +++ /dev/null @@ -1,261 +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.hssf.view; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.RenderingHints; -import java.awt.Toolkit; -import java.awt.event.HierarchyEvent; -import java.awt.event.HierarchyListener; - -import javax.swing.BorderFactory; -import javax.swing.JLabel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.JViewport; -import javax.swing.ListSelectionModel; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.table.JTableHeader; -import javax.swing.table.TableCellRenderer; -import javax.swing.table.TableColumn; -import javax.swing.table.TableColumnModel; -import javax.swing.table.TableModel; -import javax.swing.text.JTextComponent; - -import org.apache.poi.hssf.usermodel.HSSFCell; -import org.apache.poi.hssf.usermodel.HSSFSheet; -import org.apache.poi.hssf.view.brush.PendingPaintings; -import org.apache.poi.ss.usermodel.CellType; -import org.apache.poi.ss.usermodel.Row; - -/** - * This class is a table that represents the values in a single worksheet. - * - * @author Ken Arnold, Industrious Media LLC - */ -public class SVSheetTable extends JTable { - private final HSSFSheet sheet; - private final PendingPaintings pendingPaintings; - private FormulaDisplayListener formulaListener; - private JScrollPane scroll; - - private static final Color HEADER_BACKGROUND = new Color(235, 235, 235); - - /** - * This field is the magic number to convert from a Character width to a java - * pixel width. - *

- * When the "normal" font size in a workbook changes, this effects all of the - * heights and widths. Unfortunately there is no way to retrieve this - * information, hence the MAGIC number. - *

- * This number may only work for the normal style font size of Arial size 10. - */ - private static final int magicCharFactor = 7; - - private class HeaderCell extends JLabel { - private final int row; - - public HeaderCell(Object value, int row) { - super(value.toString(), CENTER); - this.row = row; - setBackground(HEADER_BACKGROUND); - setOpaque(true); - setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY)); - setRowSelectionAllowed(false); - } - - @Override - public Dimension getPreferredSize() { - Dimension d = super.getPreferredSize(); - if (row >= 0) { - d.height = getRowHeight(row); - } - return d; - } - - @Override - public Dimension getMaximumSize() { - Dimension d = super.getMaximumSize(); - if (row >= 0) { - d.height = getRowHeight(row); - } - return d; - } - - @Override - public Dimension getMinimumSize() { - Dimension d = super.getMinimumSize(); - if (row >= 0) { - d.height = getRowHeight(row); - } - return d; - } - } - - private class HeaderCellRenderer implements TableCellRenderer { - @Override - public Component getTableCellRendererComponent(JTable table, Object value, - boolean isSelected, boolean hasFocus, int row, int column) { - - return new HeaderCell(value, row); - } - } - - private class FormulaDisplayListener implements ListSelectionListener { - private final JTextComponent formulaDisplay; - - public FormulaDisplayListener(JTextComponent formulaDisplay) { - this.formulaDisplay = formulaDisplay; - } - - @Override - public void valueChanged(ListSelectionEvent e) { - int row = getSelectedRow(); - int col = getSelectedColumn(); - if (row < 0 || col < 0) { - return; - } - - if (e.getValueIsAdjusting()) { - return; - } - - HSSFCell cell = (HSSFCell) getValueAt(row, col); - String formula = ""; - if (cell != null) { - if (cell.getCellType() == CellType.FORMULA) { - formula = cell.getCellFormula(); - } else { - formula = cell.toString(); - } - if (formula == null) - formula = ""; - } - formulaDisplay.setText(formula); - } - } - - public SVSheetTable(HSSFSheet sheet) { - super(new SVTableModel(sheet)); - this.sheet = sheet; - - setIntercellSpacing(new Dimension(0, 0)); - setAutoResizeMode(AUTO_RESIZE_OFF); - JTableHeader header = getTableHeader(); - header.setDefaultRenderer(new HeaderCellRenderer()); - pendingPaintings = new PendingPaintings(this); - - //Set the columns the correct size - TableColumnModel columns = getColumnModel(); - for (int i = 0; i < columns.getColumnCount(); i++) { - TableColumn column = columns.getColumn(i); - int width = sheet.getColumnWidth(i); - //256 is because the width is in 256ths of a character - column.setPreferredWidth(width / 256 * magicCharFactor); - } - - Toolkit t = getToolkit(); - int res = t.getScreenResolution(); - TableModel model = getModel(); - for (int i = 0; i < model.getRowCount(); i++) { - Row row = sheet.getRow(i - sheet.getFirstRowNum()); - if (row != null) { - short h = row.getHeight(); - int height = Math.toIntExact(Math.round(Math.max(1., h / (res / 70. * 20.) + 3.))); - System.out.printf("%d: %d (%d @ %d)%n", i, height, h, res); - setRowHeight(i, height); - } - } - - addHierarchyListener(new HierarchyListener() { - @Override - public void hierarchyChanged(HierarchyEvent e) { - if ((e.getChangeFlags() & HierarchyEvent.PARENT_CHANGED) != 0) { - Container changedParent = e.getChangedParent(); - if (changedParent instanceof JViewport) { - Container grandparent = changedParent.getParent(); - if (grandparent instanceof JScrollPane) { - JScrollPane jScrollPane = (JScrollPane) grandparent; - setupScroll(jScrollPane); - } - } - } - } - }); - } - - public void setupScroll(JScrollPane scroll) { - if (scroll == this.scroll) - return; - - this.scroll = scroll; - if (scroll == null) - return; - - SVRowHeader rowHeader = new SVRowHeader(sheet, this, 0); - scroll.setRowHeaderView(rowHeader); - scroll.setCorner(JScrollPane.UPPER_LEADING_CORNER, headerCell("?")); - } - - public void setFormulaDisplay(JTextComponent formulaDisplay) { - ListSelectionModel rowSelMod = getSelectionModel(); - ListSelectionModel colSelMod = getColumnModel().getSelectionModel(); - - if (formulaDisplay == null) { - rowSelMod.removeListSelectionListener(formulaListener); - colSelMod.removeListSelectionListener(formulaListener); - formulaListener = null; - } - - if (formulaDisplay != null) { - formulaListener = new FormulaDisplayListener(formulaDisplay); - rowSelMod.addListSelectionListener(formulaListener); - colSelMod.addListSelectionListener(formulaListener); - } - } - - public JTextComponent getFormulaDisplay() { - if (formulaListener == null) - return null; - else - return formulaListener.formulaDisplay; - } - - public Component headerCell(String text) { - return new HeaderCell(text, -1); - } - - @Override - public void paintComponent(Graphics g1) { - Graphics2D g = (Graphics2D) g1; - - pendingPaintings.clear(); - - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - super.paintComponent(g); - - pendingPaintings.paint(g); - } -} \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/hssf/view/SVTableCellEditor.java b/src/examples/src/org/apache/poi/hssf/view/SVTableCellEditor.java deleted file mode 100644 index 484df3b9e4..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/SVTableCellEditor.java +++ /dev/null @@ -1,215 +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.hssf.view; - -import static org.apache.poi.hssf.view.SVTableUtils.getAWTColor; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Font; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; -import java.util.EventObject; - -import javax.swing.AbstractCellEditor; -import javax.swing.JTable; -import javax.swing.JTextField; -import javax.swing.SwingConstants; -import javax.swing.table.TableCellEditor; - -import org.apache.poi.hssf.usermodel.HSSFCell; -import org.apache.poi.hssf.usermodel.HSSFCellStyle; -import org.apache.poi.hssf.usermodel.HSSFFont; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.hssf.util.HSSFColor.HSSFColorPredefined; -import org.apache.poi.ss.usermodel.FillPatternType; -import org.apache.poi.util.POILogFactory; -import org.apache.poi.util.POILogger; - -/** - * Sheet Viewer Table Cell Editor -- not commented via javadoc as it - * nearly completely consists of overridden methods. - * - * @author Jason Height - */ -public class SVTableCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener { - private static final Color black = getAWTColor(HSSFColorPredefined.BLACK); - private static final Color white = getAWTColor(HSSFColorPredefined.WHITE); - private static final POILogger logger = POILogFactory.getLogger(SVTableCellEditor.class); - - private HSSFWorkbook wb; - private JTextField editor; - - public SVTableCellEditor(HSSFWorkbook wb) { - this.wb = wb; - this.editor = new JTextField(); - } - - - /** - * Gets the cellEditable attribute of the SVTableCellEditor object - * - * @return The cellEditable value - */ - @Override - public boolean isCellEditable(java.util.EventObject e) { - if (e instanceof MouseEvent) { - return ((MouseEvent) e).getClickCount() >= 2; - } - return false; - } - - - @Override - public boolean shouldSelectCell(EventObject anEvent) { - return true; - } - - - public boolean startCellEditing(EventObject anEvent) { - logger.log(POILogger.INFO, "Start Cell Editing"); - return true; - } - - - @Override - public boolean stopCellEditing() { - logger.log(POILogger.INFO, "Stop Cell Editing"); - fireEditingStopped(); - return true; - } - - - @Override - public void cancelCellEditing() { - logger.log(POILogger.INFO, "Cancel Cell Editing"); - fireEditingCanceled(); - } - - - @Override - public void actionPerformed(ActionEvent e) { - logger.log(POILogger.INFO, "Action performed"); - stopCellEditing(); - } - - - /** - * Gets the cellEditorValue attribute of the SVTableCellEditor object - * - * @return The cellEditorValue value - */ - @Override - public Object getCellEditorValue() { - logger.log(POILogger.INFO, "GetCellEditorValue"); - //JMH Look at when this method is called. Should it return a HSSFCell? - return editor.getText(); - } - - - /** - * Gets the tableCellEditorComponent attribute of the SVTableCellEditor object - * - * @return The tableCellEditorComponent value - */ - @Override - public Component getTableCellEditorComponent(JTable table, Object value, - boolean isSelected, - int row, - int column) { - logger.log(POILogger.INFO, "GetTableCellEditorComponent"); - HSSFCell cell = (HSSFCell) value; - if (cell != null) { - HSSFCellStyle style = cell.getCellStyle(); - HSSFFont f = wb.getFontAt(style.getFontIndexAsInt()); - boolean isbold = f.getBold(); - boolean isitalics = f.getItalic(); - - int fontstyle = Font.PLAIN; - - if (isbold) { - fontstyle = Font.BOLD; - } - if (isitalics) { - fontstyle = fontstyle | Font.ITALIC; - } - - int fontheight = f.getFontHeightInPoints(); - if (fontheight == 9) { - fontheight = 10; //fix for stupid ol Windows - } - - Font font = new Font(f.getFontName(), fontstyle, fontheight); - editor.setFont(font); - - if (style.getFillPattern() == FillPatternType.SOLID_FOREGROUND) { - editor.setBackground(getAWTColor(style.getFillForegroundColor(), white)); - } else { - editor.setBackground(white); - } - - editor.setForeground(getAWTColor(f.getColor(), black)); - - - //Set the value that is rendered for the cell - switch (cell.getCellType()) { - case BLANK: - editor.setText(""); - break; - case BOOLEAN: - if (cell.getBooleanCellValue()) { - editor.setText("true"); - } else { - editor.setText("false"); - } - break; - case NUMERIC: - editor.setText(Double.toString(cell.getNumericCellValue())); - break; - case STRING: - editor.setText(cell.getRichStringCellValue().getString()); - break; - case FORMULA: - default: - editor.setText("?"); - } - switch (style.getAlignment()) { - case LEFT: - case JUSTIFY: - case FILL: - editor.setHorizontalAlignment(SwingConstants.LEFT); - break; - case CENTER: - case CENTER_SELECTION: - editor.setHorizontalAlignment(SwingConstants.CENTER); - break; - case GENERAL: - case RIGHT: - editor.setHorizontalAlignment(SwingConstants.RIGHT); - break; - default: - editor.setHorizontalAlignment(SwingConstants.LEFT); - break; - } - - } - return editor; - } -} diff --git a/src/examples/src/org/apache/poi/hssf/view/SVTableCellRenderer.java b/src/examples/src/org/apache/poi/hssf/view/SVTableCellRenderer.java deleted file mode 100644 index 04351e35f8..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/SVTableCellRenderer.java +++ /dev/null @@ -1,286 +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.hssf.view; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Rectangle; -import java.io.Serializable; -import java.text.DecimalFormat; -import java.text.Format; -import java.text.SimpleDateFormat; - -import javax.swing.JLabel; -import javax.swing.JTable; -import javax.swing.SwingConstants; -import javax.swing.UIManager; -import javax.swing.border.Border; -import javax.swing.border.EmptyBorder; -import javax.swing.table.TableCellRenderer; - -import org.apache.poi.hssf.usermodel.HSSFCell; -import org.apache.poi.hssf.usermodel.HSSFCellStyle; -import org.apache.poi.hssf.usermodel.HSSFFont; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.BorderStyle; -import org.apache.poi.ss.usermodel.FillPatternType; - - -/** - * Sheet Viewer Table Cell Render -- not commented via javadoc as it - * nearly completely consists of overridden methods. - * - * @author Andrew C. Oliver - */ -public class SVTableCellRenderer extends JLabel - implements TableCellRenderer, Serializable { - protected static final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); - protected SVBorder cellBorder = new SVBorder(); - - private HSSFWorkbook wb; - - /** - * This class holds the references to the predefined cell formats. - */ - private class CellFormatter { - private Format[] textFormatter; - - private DecimalFormat generalNumberFormat = new DecimalFormat("0"); - - public CellFormatter() { - textFormatter = new Format[0x31]; - - textFormatter[0x01] = new DecimalFormat("0"); - textFormatter[0x02] = new DecimalFormat("0.00"); - textFormatter[0x03] = new DecimalFormat("#,##0"); - textFormatter[0x04] = new DecimalFormat("#,##0.00"); - textFormatter[0x05] = new DecimalFormat("$#,##0;$#,##0"); - textFormatter[0x06] = new DecimalFormat("$#,##0;$#,##0"); - textFormatter[0x07] = new DecimalFormat("$#,##0.00;$#,##0.00"); - textFormatter[0x08] = new DecimalFormat("$#,##0.00;$#,##0.00"); - textFormatter[0x09] = new DecimalFormat("0%"); - textFormatter[0x0A] = new DecimalFormat("0.00%"); - textFormatter[0x0B] = new DecimalFormat("0.00E0"); - textFormatter[0x0C] = new SVFractionalFormat("# ?/?"); - textFormatter[0x0D] = new SVFractionalFormat("# ??/??"); - textFormatter[0x0E] = new SimpleDateFormat("M/d/yy"); - textFormatter[0x0F] = new SimpleDateFormat("d-MMM-yy"); - textFormatter[0x10] = new SimpleDateFormat("d-MMM"); - textFormatter[0x11] = new SimpleDateFormat("MMM-yy"); - textFormatter[0x12] = new SimpleDateFormat("h:mm a"); - textFormatter[0x13] = new SimpleDateFormat("h:mm:ss a"); - textFormatter[0x14] = new SimpleDateFormat("h:mm"); - textFormatter[0x15] = new SimpleDateFormat("h:mm:ss"); - textFormatter[0x16] = new SimpleDateFormat("M/d/yy h:mm"); - // 0x17 - 0x24 reserved for international and undocumented 0x25, "(#,##0_);(#,##0)" - //start at 0x26 - //jmh need to do colour - //"(#,##0_);[Red](#,##0)" - textFormatter[0x26] = new DecimalFormat("#,##0;#,##0"); - //jmh need to do colour - //(#,##0.00_);(#,##0.00) - textFormatter[0x27] = new DecimalFormat("#,##0.00;#,##0.00"); - textFormatter[0x28] = new DecimalFormat("#,##0.00;#,##0.00"); -//?? textFormatter[0x29] = new DecimalFormat("_(*#,##0_);_(*(#,##0);_(* \"-\"_);_(@_)"); -//?? textFormatter[0x2A] = new DecimalFormat("_($*#,##0_);_($*(#,##0);_($* \"-\"_);_(@_)"); -//?? textFormatter[0x2B] = new DecimalFormat("_(*#,##0.00_);_(*(#,##0.00);_(*\"-\"??_);_(@_)"); -//?? textFormatter[0x2C] = new DecimalFormat("_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)"); - textFormatter[0x2D] = new SimpleDateFormat("mm:ss"); -//?? textFormatter[0x2E] = new SimpleDateFormat("[h]:mm:ss"); - textFormatter[0x2F] = new SimpleDateFormat("mm:ss.0"); - textFormatter[0x30] = new DecimalFormat("##0.0E0"); - } - - public String format(short index, double value) { - if (index <= 0) - return generalNumberFormat.format(value); - if (textFormatter[index] == null) - throw new RuntimeException("Sorry. I cant handle the format code :" + Integer.toHexString(index)); - if (textFormatter[index] instanceof DecimalFormat) { - return ((DecimalFormat) textFormatter[index]).format(value); - } - if (textFormatter[index] instanceof SVFractionalFormat) { - return ((SVFractionalFormat) textFormatter[index]).format(value); - } - throw new RuntimeException("Sorry. I cant handle a non decimal formatter for a decimal value :" + Integer.toHexString(index)); - } - - public boolean useRedColor(short index, double value) { - return (((index == 0x06) || (index == 0x08) || (index == 0x26) || (index == 0x27)) && (value < 0)); - } - } - - private final CellFormatter cellFormatter = new CellFormatter(); - - public SVTableCellRenderer(HSSFWorkbook wb) { - super(); - setOpaque(true); - setBorder(noFocusBorder); - this.wb = wb; - } - - @Override - public Component getTableCellRendererComponent(JTable table, Object value, - boolean isSelected, boolean hasFocus, int row, int column) { - boolean isBorderSet = false; - - //If the JTables default cell renderer has been setup correctly the - //value will be the HSSFCell that we are trying to render - HSSFCell c = (HSSFCell) value; - - if (c != null) { - HSSFCellStyle s = c.getCellStyle(); - HSSFFont f = wb.getFontAt(s.getFontIndexAsInt()); - setFont(SVTableUtils.makeFont(f)); - - if (s.getFillPattern() == FillPatternType.SOLID_FOREGROUND) { - setBackground(SVTableUtils.getAWTColor(s.getFillForegroundColor(), SVTableUtils.white)); - } else setBackground(SVTableUtils.white); - - setForeground(SVTableUtils.getAWTColor(f.getColor(), SVTableUtils.black)); - - cellBorder.setBorder(SVTableUtils.getAWTColor(s.getTopBorderColor(), SVTableUtils.black), - SVTableUtils.getAWTColor(s.getRightBorderColor(), SVTableUtils.black), - SVTableUtils.getAWTColor(s.getBottomBorderColor(), SVTableUtils.black), - SVTableUtils.getAWTColor(s.getLeftBorderColor(), SVTableUtils.black), - s.getBorderTop(), s.getBorderRight(), - s.getBorderBottom(), s.getBorderLeft(), - hasFocus); - setBorder(cellBorder); - isBorderSet = true; - - //Set the value that is rendered for the cell - switch (c.getCellType()) { - case BLANK: - setValue(""); - break; - case BOOLEAN: - if (c.getBooleanCellValue()) { - setValue("true"); - } else { - setValue("false"); - } - break; - case NUMERIC: - short format = s.getDataFormat(); - double numericValue = c.getNumericCellValue(); - if (cellFormatter.useRedColor(format, numericValue)) - setForeground(Color.red); - else setForeground(null); - setValue(cellFormatter.format(format, c.getNumericCellValue())); - break; - case STRING: - setValue(c.getRichStringCellValue().getString()); - break; - case FORMULA: - default: - setValue("?"); - } - //Set the text alignment of the cell - switch (s.getAlignment()) { - case LEFT: - case JUSTIFY: - case FILL: - setHorizontalAlignment(SwingConstants.LEFT); - break; - case CENTER: - case CENTER_SELECTION: - setHorizontalAlignment(SwingConstants.CENTER); - break; - case GENERAL: - case RIGHT: - setHorizontalAlignment(SwingConstants.RIGHT); - break; - default: - setHorizontalAlignment(SwingConstants.LEFT); - break; - } - } else { - setValue(""); - setBackground(SVTableUtils.white); - } - - - if (hasFocus) { - if (!isBorderSet) { - //This is the border to paint when there is no border - //and the cell has focus - cellBorder.setBorder(SVTableUtils.black, - SVTableUtils.black, - SVTableUtils.black, - SVTableUtils.black, - BorderStyle.NONE, - BorderStyle.NONE, - BorderStyle.NONE, - BorderStyle.NONE, - isSelected); - setBorder(cellBorder); - } - if (table.isCellEditable(row, column)) { - setForeground(UIManager.getColor("Table.focusCellForeground")); - setBackground(UIManager.getColor("Table.focusCellBackground")); - } - } else if (!isBorderSet) { - setBorder(noFocusBorder); - } - - // ---- begin optimization to avoid painting background ---- - Color back = getBackground(); - boolean colorMatch = (back != null) && (back.equals(table.getBackground())) && table.isOpaque(); - setOpaque(!colorMatch); - // ---- end optimization to aviod painting background ---- - return this; - } - - @Override - public void validate() { - } - - @Override - public void revalidate() { - } - - @Override - public void repaint(long tm, int x, int y, int width, int height) { - } - - @Override - public void repaint(Rectangle r) { - } - - @Override - protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { - // Strings get interned... - if (propertyName == "text") { - super.firePropertyChange(propertyName, oldValue, newValue); - } - } - - @Override - public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) { - } - - /** - * Sets the string to either the value or "" if the value is null. - */ - protected void setValue(Object value) { - setText((value == null) ? "" : value.toString()); - } -} diff --git a/src/examples/src/org/apache/poi/hssf/view/SVTableModel.java b/src/examples/src/org/apache/poi/hssf/view/SVTableModel.java deleted file mode 100644 index 14c06a70bd..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/SVTableModel.java +++ /dev/null @@ -1,97 +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.hssf.view; - -import java.util.Iterator; - -import javax.swing.table.AbstractTableModel; - -import org.apache.poi.hssf.usermodel.HSSFCell; -import org.apache.poi.hssf.usermodel.HSSFRow; -import org.apache.poi.hssf.usermodel.HSSFSheet; -import org.apache.poi.ss.usermodel.Row; - -/** - * Sheet Viewer Table Model - The model for the Sheet Viewer just overrides things. - * - * @author Andrew C. Oliver - */ - -public class SVTableModel extends AbstractTableModel { - private HSSFSheet st; - int maxcol; - - public SVTableModel(HSSFSheet st, int maxcol) { - this.st = st; - this.maxcol = maxcol; - } - - public SVTableModel(HSSFSheet st) { - this.st = st; - Iterator i = st.rowIterator(); - - while (i.hasNext()) { - HSSFRow row = (HSSFRow) i.next(); - if (maxcol < (row.getLastCellNum() + 1)) { - this.maxcol = row.getLastCellNum(); - } - } - } - - - @Override - public int getColumnCount() { - return this.maxcol + 1; - } - - @Override - public Object getValueAt(int row, int col) { - HSSFRow r = st.getRow(row); - HSSFCell c = null; - if (r != null) { - c = r.getCell(col); - } - return c; - } - - @Override - public int getRowCount() { - return st.getLastRowNum() + 1; - } - - @Override - public Class getColumnClass(int c) { - return HSSFCell.class; - } - - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - return true; - } - - @Override - public void setValueAt(Object aValue, int rowIndex, int columnIndex) { - if (aValue != null) - System.out.println("SVTableModel.setValueAt. value type = " + aValue.getClass().getName()); - else System.out.println("SVTableModel.setValueAt. value type = null"); - } - - -} diff --git a/src/examples/src/org/apache/poi/hssf/view/SVTableUtils.java b/src/examples/src/org/apache/poi/hssf/view/SVTableUtils.java deleted file mode 100644 index 57ba3956fe..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/SVTableUtils.java +++ /dev/null @@ -1,94 +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.hssf.view; - -import java.awt.Color; -import java.awt.Font; -import java.util.Map; - -import javax.swing.border.Border; -import javax.swing.border.EmptyBorder; - -import org.apache.poi.hssf.usermodel.HSSFFont; -import org.apache.poi.hssf.util.HSSFColor; -import org.apache.poi.hssf.util.HSSFColor.HSSFColorPredefined; - -/** - * SVTableCell Editor and Renderer helper functions. - * - * @author Jason Height - */ -public class SVTableUtils { - private final static Map colors = HSSFColor.getIndexHash(); - /** - * Description of the Field - */ - public final static Color black = getAWTColor(HSSFColorPredefined.BLACK); - /** - * Description of the Field - */ - public final static Color white = getAWTColor(HSSFColorPredefined.WHITE); - /** - * Description of the Field - */ - public static final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); - - - /** - * Creates a new font for a specific cell style - */ - public static Font makeFont(HSSFFont font) { - boolean isbold = font.getBold(); - boolean isitalics = font.getItalic(); - int fontstyle = Font.PLAIN; - if (isbold) { - fontstyle = Font.BOLD; - } - if (isitalics) { - fontstyle = fontstyle | Font.ITALIC; - } - - int fontheight = font.getFontHeightInPoints(); - if (fontheight == 9) { - //fix for stupid ol Windows - fontheight = 10; - } - - return new Font(font.getFontName(), fontstyle, fontheight); - } - - /** - * This method retrieves the AWT Color representation from the colour hash table - */ - /* package */ - static Color getAWTColor(int index, Color deflt) { - HSSFColor clr = colors.get(index); - if (clr == null) { - return deflt; - } - short[] rgb = clr.getTriplet(); - return new Color(rgb[0], rgb[1], rgb[2]); - } - - /* package */ - static Color getAWTColor(HSSFColorPredefined clr) { - short[] rgb = clr.getTriplet(); - return new Color(rgb[0], rgb[1], rgb[2]); - } -} diff --git a/src/examples/src/org/apache/poi/hssf/view/SViewer.java b/src/examples/src/org/apache/poi/hssf/view/SViewer.java deleted file mode 100644 index d3c4cbecaa..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/SViewer.java +++ /dev/null @@ -1,197 +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.hssf.view; - -import java.awt.AWTEvent; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.Toolkit; -import java.awt.event.WindowEvent; -import java.io.BufferedInputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - -import javax.swing.JApplet; - -import org.apache.poi.hssf.usermodel.HSSFWorkbook; - -/** - * Sheet Viewer - Views XLS files via HSSF. Can be used as an applet with - * filename="" or as a applications (pass the filename as the first parameter). - * Or you can pass it a URL in a "url" parameter when run as an applet or just - * that first parameter must start with http:// and it will guess its a url. I - * only tested it as an applet though, so it probably won't work...you fix it. - * - * @author Andrew C. Oliver - * @author Jason Height - */ -public class SViewer extends JApplet { - private SViewerPanel panel; - boolean isStandalone; - String filename; - - /** - * Get a parameter value - */ - public String getParameter(String key, String def) { - return isStandalone ? System.getProperty(key, def) : - (getParameter(key) != null ? getParameter(key) : def); - } - - /** - * Construct the applet - */ - public SViewer() { - } - - /** - * Initialize the applet - */ - @Override - @SuppressWarnings("squid:S1148") - public void init() { - try { - jbInit(); - } catch (Exception e) { - e.printStackTrace(); - System.exit(1); - } - } - - /** - * Component initialization - */ - private void jbInit() throws Exception { - boolean isurl = false; - if (filename == null) { - filename = getParameter("filename"); - } - - if (filename == null || filename.contains("://")) { - isurl = true; - if (filename == null) { - filename = getParameter("url"); - } - } - - final HSSFWorkbook wb; - try (InputStream is = isurl ? getXLSFromURL(filename) : new FileInputStream(filename)) { - wb = new HSSFWorkbook(is); - } - - panel = new SViewerPanel(wb, false); - getContentPane().setLayout(new BorderLayout()); - getContentPane().add(panel, BorderLayout.CENTER); - } - - /** - * Start the applet - */ - @Override - public void start() { - } - - /** - * Stop the applet - */ - @Override - public void stop() { - } - - /** - * Destroy the applet - */ - @Override - public void destroy() { - } - - /** - * Get Applet information - */ - @Override - public String getAppletInfo() { - return "Applet Information"; - } - - /** - * Get parameter info - */ - @Override - public String[][] getParameterInfo() { - return null; - } - - /** - * opens a url and returns an inputstream - */ - private InputStream getXLSFromURL(String urlstring) throws MalformedURLException, IOException { - URL url = new URL(urlstring); - URLConnection uc = url.openConnection(); - String field = uc.getHeaderField(0); - for (int i = 0; field != null; i++) { - System.out.println(field); - field = uc.getHeaderField(i); - } - return new BufferedInputStream(uc.getInputStream()); - } - - - /** - * Main method - */ - public static void main(String[] args) { - if (args.length < 1) { - throw new IllegalArgumentException("A filename to view must be supplied as the first argument, but none was given"); - } - - SViewer applet = new SViewer(); - applet.isStandalone = true; - applet.filename = args[0]; - Frame frame; - frame = new Frame() { - @Override - protected void processWindowEvent(WindowEvent e) { - super.processWindowEvent(e); - if (e.getID() == WindowEvent.WINDOW_CLOSING) { - System.exit(0); - } - } - - @Override - public synchronized void setTitle(String title) { - super.setTitle(title); - enableEvents(AWTEvent.WINDOW_EVENT_MASK); - } - }; - frame.setTitle("Applet Frame"); - frame.add(applet, BorderLayout.CENTER); - applet.init(); - applet.start(); - frame.setSize(400, 320); - Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2); - frame.setVisible(true); - } -} diff --git a/src/examples/src/org/apache/poi/hssf/view/SViewerPanel.java b/src/examples/src/org/apache/poi/hssf/view/SViewerPanel.java deleted file mode 100644 index 09332b13f8..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/SViewerPanel.java +++ /dev/null @@ -1,343 +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.hssf.view; - -import java.awt.AWTEvent; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.WindowEvent; -import java.io.FileInputStream; -import java.io.IOException; - -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.JComponent; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; -import javax.swing.JTable; -import javax.swing.table.JTableHeader; -import javax.swing.table.TableColumn; -import javax.swing.table.TableColumnModel; - -import org.apache.poi.hssf.usermodel.HSSFCell; -import org.apache.poi.hssf.usermodel.HSSFRow; -import org.apache.poi.hssf.usermodel.HSSFSheet; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; - -/** - * This class presents the sheets to the user. - */ -public class SViewerPanel extends JPanel { - /** - * This field is the magic number to convert from a Character width to a - * java pixel width. - *

- * When the "normal" font size in a workbook changes, this effects all - * of the heights and widths. Unfortunately there is no way to retrieve this - * information, hence the MAGIC number. - *

- * This number may only work for the normal style font size of Arial size 10. - */ - private static final int magicCharFactor = 7; - /** - * Reference to the wookbook that is being displayed - */ - /* package */ HSSFWorkbook wb; - /** - * Reference to the tabs component - */ - /* package */ JTabbedPane sheetPane; - /** - * Reference to the cell renderer that is used to render all cells - */ - private SVTableCellRenderer cellRenderer; - /** - * Reference to the cell editor that is used to edit all cells. - * Only constructed if editing is allowed - */ - private SVTableCellEditor cellEditor; - /** - * Flag indicating if editing is allowed. Otherwise the viewer is in - * view only mode. - */ - private boolean allowEdits; - - /** - * Construct the representation of the workbook - */ - public SViewerPanel(HSSFWorkbook wb, boolean allowEdits) { - this.wb = wb; - this.allowEdits = allowEdits; - - initialiseGui(); - } - - private void initialiseGui() { - cellRenderer = new SVTableCellRenderer(this.wb); - if (allowEdits) - cellEditor = new SVTableCellEditor(this.wb); - - //Initialise the Panel - sheetPane = new JTabbedPane(JTabbedPane.BOTTOM); - - if (allowEdits) - sheetPane.addMouseListener(createTabListener()); - int sheetCount = wb.getNumberOfSheets(); - for (int i = 0; i < sheetCount; i++) { - String sheetName = wb.getSheetName(i); - //Add the new sheet to the tabbed pane - sheetPane.addTab(sheetName, makeSheetView(wb.getSheetAt(i))); - } - setLayout(new BorderLayout()); - add(sheetPane, BorderLayout.CENTER); - } - - protected JComponent makeSheetView(HSSFSheet sheet) { - JTable sheetView = new JTable(new SVTableModel(sheet)); - sheetView.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); - sheetView.setDefaultRenderer(HSSFCell.class, cellRenderer); - if (allowEdits) - sheetView.setDefaultEditor(HSSFCell.class, cellEditor); - JTableHeader header = sheetView.getTableHeader(); - //Dont allow column reordering - header.setReorderingAllowed(false); - //Only allow column resizing if editing is allowed - header.setResizingAllowed(allowEdits); - - //Set the columns the correct size - TableColumnModel columns = sheetView.getColumnModel(); - for (int i = 0; i < columns.getColumnCount(); i++) { - TableColumn column = columns.getColumn(i); - int width = sheet.getColumnWidth(i); - //256 is because the width is in 256ths of a character - column.setPreferredWidth(width / 256 * magicCharFactor); - } - - //Set the rows to the correct size - int rows = sheet.getPhysicalNumberOfRows(); - Insets insets = cellRenderer.getInsets(); - //Need to include the insets in the calculation of the row height to use. - int extraHeight = insets.bottom + insets.top; - for (int i = 0; i < rows; i++) { - HSSFRow row = sheet.getRow(i); - if (row == null) { - sheetView.setRowHeight(i, (int) sheet.getDefaultRowHeightInPoints() + extraHeight); - } else { - sheetView.setRowHeight(i, (int) row.getHeightInPoints() + extraHeight); - } - } - - //Add the row header to the sheet - SVRowHeader rowHeader = new SVRowHeader(sheet, sheetView, extraHeight); - JScrollPane scroll = new JScrollPane(sheetView); - scroll.setRowHeaderView(rowHeader); - return scroll; - } - - @Override - public void paint(Graphics g) { - //JMH I am only overriding this to get a picture of the time taken to paint - long start = System.currentTimeMillis(); - super.paint(g); - long elapsed = System.currentTimeMillis() - start; - System.out.println("Paint time = " + elapsed); - } - - protected MouseListener createTabListener() { - return new TabListener(); - } - - /** - * This class defines the default MouseListener that listens to - * mouse events in the tabbed pane - *

- * The default is to popup a menu when the event occurs over a tab - */ - private class TabListener implements MouseListener { - private final JPopupMenu popup; - - public TabListener() { - popup = new JPopupMenu("Sheet"); - popup.add(createInsertSheetAction()); - popup.add(createDeleteSheetAction()); - popup.add(createRenameSheetAction()); - } - - protected Action createInsertSheetAction() { - return new InsertSheetAction(); - } - - protected Action createDeleteSheetAction() { - return new DeleteSheetAction(); - } - - protected Action createRenameSheetAction() { - return new RenameSheetAction(); - } - - - /** - * This method will display the popup if the mouseevent is a popup event - * and the event occurred over a tab - */ - protected void checkPopup(MouseEvent e) { - if (e.isPopupTrigger()) { - int tab = sheetPane.getUI().tabForCoordinate(sheetPane, e.getX(), e.getY()); - if (tab != -1) { - popup.show(sheetPane, e.getX(), e.getY()); - } - } - } - - @Override - public void mouseClicked(MouseEvent e) { - checkPopup(e); - } - - @Override - public void mousePressed(MouseEvent e) { - checkPopup(e); - } - - @Override - public void mouseReleased(MouseEvent e) { - checkPopup(e); - } - - @Override - public void mouseEntered(MouseEvent e) { - } - - @Override - public void mouseExited(MouseEvent e) { - } - } - - /** - * This class defines the action that is performed when the sheet is renamed - */ - private class RenameSheetAction extends AbstractAction { - public RenameSheetAction() { - super("Rename"); - } - - @Override - public void actionPerformed(ActionEvent e) { - int tabIndex = sheetPane.getSelectedIndex(); - if (tabIndex != -1) { - String newSheetName = JOptionPane.showInputDialog(sheetPane, "Enter a new Sheetname", "Rename Sheet", JOptionPane.QUESTION_MESSAGE); - if (newSheetName != null) { - wb.setSheetName(tabIndex, newSheetName); - sheetPane.setTitleAt(tabIndex, newSheetName); - } - } - } - } - - /** - * This class defines the action that is performed when a sheet is inserted - */ - private class InsertSheetAction extends AbstractAction { - public InsertSheetAction() { - super("Insert"); - } - - @Override - public void actionPerformed(ActionEvent e) { - //Create a new sheet then search for the sheet and make sure that the - //sheetPane shows it. - HSSFSheet newSheet = wb.createSheet(); - for (int i = 0; i < wb.getNumberOfSheets(); i++) { - HSSFSheet sheet = wb.getSheetAt(i); - if (newSheet == sheet) { - sheetPane.insertTab(wb.getSheetName(i), null, makeSheetView(sheet), null, i); - } - } - } - } - - /** - * This class defines the action that is performed when the sheet is deleted - */ - private class DeleteSheetAction extends AbstractAction { - public DeleteSheetAction() { - super("Delete"); - } - - @Override - public void actionPerformed(ActionEvent e) { - int tabIndex = sheetPane.getSelectedIndex(); - if (tabIndex != -1) { - if (JOptionPane.showConfirmDialog(sheetPane, "Are you sure that you want to delete the selected sheet", "Delete Sheet?", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) { - wb.removeSheetAt(tabIndex); - sheetPane.remove(tabIndex); - } - } - } - } - - public boolean isEditable() { - return allowEdits; - } - - /** - * Main method - */ - public static void main(String[] args) throws IOException { - if (args.length < 1) { - throw new IllegalArgumentException("A filename to view must be supplied as the first argument, but none was given"); - } - - try (FileInputStream in = new FileInputStream(args[0]); - HSSFWorkbook wb = new HSSFWorkbook(in)) { - SViewerPanel p = new SViewerPanel(wb, true); - JFrame frame; - frame = new JFrame() { - @Override - protected void processWindowEvent(WindowEvent e) { - super.processWindowEvent(e); - if (e.getID() == WindowEvent.WINDOW_CLOSING) { - System.exit(0); - } - } - - @Override - public synchronized void setTitle(String title) { - super.setTitle(title); - enableEvents(AWTEvent.WINDOW_EVENT_MASK); - } - }; - frame.setTitle("Viewer Frame"); - frame.getContentPane().add(p, BorderLayout.CENTER); - frame.setSize(800, 640); - Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2); - frame.setVisible(true); - } - } -} diff --git a/src/examples/src/org/apache/poi/hssf/view/brush/BasicBrush.java b/src/examples/src/org/apache/poi/hssf/view/brush/BasicBrush.java deleted file mode 100644 index db36b83265..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/brush/BasicBrush.java +++ /dev/null @@ -1,72 +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.hssf.view.brush; - -import java.awt.*; - -/** - * This is a basic brush that just draws the line with the given parameters. - * This is a {@link BasicStroke} object that can be used as a {@link Brush}. - * - * @author Ken Arnold, Industrious Media LLC - * @see BasicStroke - */ -public class BasicBrush extends BasicStroke implements Brush { - /** - * Creates a new basic brush with the given width. Invokes {@link - * BasicStroke#BasicStroke(float)} - * - * @param width The brush width. - * - * @see BasicStroke#BasicStroke(float) - */ - public BasicBrush(float width) { - super(width); - } - - /** - * Creates a new basic brush with the given width, cap, and join. Invokes - * {@link BasicStroke#BasicStroke(float,int,int)} - * - * @param width The brush width. - * @param cap The capping style. - * @param join The join style. - * - * @see BasicStroke#BasicStroke(float, int, int) - */ - public BasicBrush(float width, int cap, int join) { - super(width, cap, join); - } - - /** - * Creates a new basic brush with the given parameters. Invokes {@link - * BasicStroke#BasicStroke(float,int,int,float,float[],float)} with a miter - * limit of 11 (the normal default value). - * - * @param width The brush width. - * @param cap The capping style. - * @param join The join style. - * @param dashes The dash intervals. - * @param dashPos The intial dash position in the dash intervals. - * - * @see BasicStroke#BasicStroke(float, int, int, float, float[], float) - */ - public BasicBrush(float width, int cap, int join, float[] dashes, - int dashPos) { - super(width, cap, join, 11.0f, dashes, dashPos); - } -} \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/hssf/view/brush/Brush.java b/src/examples/src/org/apache/poi/hssf/view/brush/Brush.java deleted file mode 100644 index 2a8964a512..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/brush/Brush.java +++ /dev/null @@ -1,31 +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.hssf.view.brush; - -import java.awt.*; - -/** - * This is the type you must implement to create a brush that will be used for a - * spreadsheet border. - * - * @author Ken Arnold, Industrious Media LLC - */ -public interface Brush extends Stroke { - /** Returns the width of the brush. */ - float getLineWidth(); -} diff --git a/src/examples/src/org/apache/poi/hssf/view/brush/DoubleStroke.java b/src/examples/src/org/apache/poi/hssf/view/brush/DoubleStroke.java deleted file mode 100644 index 01b17ef4d0..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/brush/DoubleStroke.java +++ /dev/null @@ -1,64 +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.hssf.view.brush; - -import java.awt.*; - -/** - * This Stroke implementation applies a BasicStroke to a shape twice. If you - * draw with this Stroke, then instead of outlining the shape, you're outlining - * the outline of the shape. - * - * @author Ken Arnold, Industrious Media LLC - */ -public class DoubleStroke implements Brush { - BasicStroke stroke1, stroke2; // the two strokes to use - - /** - * Creates a new double-stroke brush. This surrounds a cell with a two - * lines separated by white space between. - * - * @param width1 The width of the blank space in the middle - * @param width2 The width of the each of the two drawn strokes. - */ - public DoubleStroke(float width1, float width2) { - stroke1 = new BasicStroke(width1); // Constructor arguments specify - stroke2 = new BasicStroke(width2); // the line widths for the strokes - } - - /** - * Stroke the outline. - * - * @param s The shape in which to stroke. - * - * @return The created stroke as a new shape. - */ - @Override - public Shape createStrokedShape(Shape s) { - // Use the first stroke to create an outline of the shape - Shape outline = stroke1.createStrokedShape(s); - // Use the second stroke to create an outline of that outline. - // It is this outline of the outline that will be filled in - return stroke2.createStrokedShape(outline); - } - - /** {@inheritDoc} */ - @Override - public float getLineWidth() { - return stroke1.getLineWidth() + 2 * stroke2.getLineWidth(); - } -} \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/hssf/view/brush/PendingPaintings.java b/src/examples/src/org/apache/poi/hssf/view/brush/PendingPaintings.java deleted file mode 100644 index dcbf8b35c3..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/brush/PendingPaintings.java +++ /dev/null @@ -1,178 +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.hssf.view.brush; - -import javax.swing.*; -import java.awt.*; -import java.awt.geom.*; -import java.util.ArrayList; -import java.util.List; - -/** - * This class is used to hold pending brush paintings. The model is that some - * border drawing requires drawing strokes after all the cells have been - * painted. The list of pending paintings can be put in this object during the - * initial paint of the component, and then executed at the appropriate time, - * such as at the end of the containing object's {@link - * JComponent#paintChildren(Graphics)} method. - *

- * It is up to the parent component to invoke the {@link #paint(Graphics2D)} - * method of this objet at that appropriate time. - * - * @author Ken Arnold, Industrious Media LLC - */ -public class PendingPaintings { - /** - * The name of the client property that holds this object in the parent - * component. - */ - public static final String PENDING_PAINTINGS = - PendingPaintings.class.getSimpleName(); - - private final List paintings; - - /** A single painting description. */ - public static class Painting { - final Stroke stroke; - final Color color; - final Shape shape; - final AffineTransform transform; - - /** - * Creates a new painting description. - * - * @param stroke The stroke to paint. - * @param color The color of the stroke. - * @param shape The shape of the stroke. - * @param transform The transformation matrix to use. - */ - public Painting(Stroke stroke, Color color, Shape shape, - AffineTransform transform) { - - this.color = color; - this.shape = shape; - this.stroke = stroke; - this.transform = transform; - } - - /** - * Draw the painting. - * - * @param g The graphics object to use to draw with. - */ - public void draw(Graphics2D g) { - g.setTransform(transform); - g.setStroke(stroke); - g.setColor(color); - g.draw(shape); - } - } - - /** - * Creates a new object on the given parent. The created object will be - * stored as a client property. - * - * @param parent - */ - public PendingPaintings(JComponent parent) { - paintings = new ArrayList<>(); - parent.putClientProperty(PENDING_PAINTINGS, this); - } - - /** Drops all pending paintings. */ - public void clear() { - paintings.clear(); - } - - /** - * Paints all pending paintings. Once they have been painted they are - * removed from the list of pending paintings (they aren't pending anymore, - * after all). - * - * @param g The graphics object to draw with. - */ - public void paint(Graphics2D g) { - g.setBackground(Color.CYAN); - AffineTransform origTransform = g.getTransform(); - for (Painting c : paintings) { - c.draw(g); - } - g.setTransform(origTransform); - - clear(); - } - - /** - * Adds a new pending painting to the list on the given component. This - * will find the first ancestor that has a {@link PendingPaintings} client - * property, starting with the component itself. - * - * @param c The component for which the painting is being added. - * @param g The graphics object to draw with. - * @param stroke The stroke to draw. - * @param color The color to draw with. - * @param shape The shape to stroke. - */ - public static void add(JComponent c, Graphics2D g, Stroke stroke, - Color color, Shape shape) { - - add(c, new Painting(stroke, color, shape, g.getTransform())); - } - - /** - * Adds a new pending painting to the list on the given component. This - * will find the first ancestor that has a {@link PendingPaintings} client - * property, starting with the component itself. - * - * @param c The component for which the painting is being added. - * @param newPainting The new painting. - */ - public static void add(JComponent c, Painting newPainting) { - PendingPaintings pending = pendingPaintingsFor(c); - if (pending != null) { - pending.paintings.add(newPainting); - } - } - - /** - * Returns the pending painting object for the given component, if any. This - * is retrieved from the first object found that has a {@link - * #PENDING_PAINTINGS} client property, starting with this component and - * looking up its ancestors (parent, parent's parent, etc.) - *

- * This allows any descendant of a component that has a {@link - * PendingPaintings} property to add its own pending paintings. - * - * @param c The component for which the painting is being added. - * - * @return The pending painting object for that component, or null - * if there is none. - */ - public static PendingPaintings pendingPaintingsFor(JComponent c) { - for (Component parent = c; - parent != null; - parent = parent.getParent()) { - if (parent instanceof JComponent) { - JComponent jc = (JComponent) parent; - Object pd = jc.getClientProperty(PENDING_PAINTINGS); - if (pd != null) - return (PendingPaintings) pd; - } - } - return null; - } -} \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/hssf/view/brush/package-info.java b/src/examples/src/org/apache/poi/hssf/view/brush/package-info.java deleted file mode 100644 index cf71cf6a13..0000000000 --- a/src/examples/src/org/apache/poi/hssf/view/brush/package-info.java +++ /dev/null @@ -1,21 +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. -==================================================================== */ - -/** - * This package contains some brushes that are used when drawing borders for Excel cells. - */ -package org.apache.poi.hssf.view.brush; \ No newline at end of file diff --git a/src/examples/src/org/apache/poi/poifs/poibrowser/DocumentDescriptor.java b/src/examples/src/org/apache/poi/poifs/poibrowser/DocumentDescriptor.java deleted file mode 100644 index e93c23b79a..0000000000 --- a/src/examples/src/org/apache/poi/poifs/poibrowser/DocumentDescriptor.java +++ /dev/null @@ -1,77 +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.poifs.poibrowser; - -import java.io.IOException; - -import org.apache.poi.poifs.filesystem.DocumentInputStream; -import org.apache.poi.poifs.filesystem.POIFSDocumentPath; -import org.apache.poi.util.IOUtils; - -/** - *

Describes the most important (whatever that is) features of a - * {@link POIFSDocumentPath}.

- */ -class DocumentDescriptor -{ - - //arbitrarily selected; may need to increase - private static final int MAX_RECORD_LENGTH = 100_000; - - String name; - POIFSDocumentPath path; - DocumentInputStream stream; - - int size; - byte[] bytes; - - - /** - *

Creates a {@link DocumentDescriptor}.

- * - * @param name The stream's name. - * - * @param path The stream's path in the POI filesystem hierarchy. - * - * @param stream The stream. - * - * @param nrOfBytes The maximum number of bytes to display in a - * dump starting at the beginning of the stream. - */ - public DocumentDescriptor(final String name, - final POIFSDocumentPath path, - final DocumentInputStream stream, - final int nrOfBytes) { - this.name = name; - this.path = path; - this.stream = stream; - try { - if (stream.markSupported()) { - stream.mark(nrOfBytes); - bytes = IOUtils.toByteArray(stream, nrOfBytes, MAX_RECORD_LENGTH); - stream.reset(); - } else { - bytes = new byte[0]; - } - size = bytes.length + stream.available(); - } catch (IOException ex) { - System.out.println(ex); - } - } - -} diff --git a/src/examples/src/org/apache/poi/poifs/poibrowser/DocumentDescriptorRenderer.java b/src/examples/src/org/apache/poi/poifs/poibrowser/DocumentDescriptorRenderer.java deleted file mode 100644 index f3f805c9f3..0000000000 --- a/src/examples/src/org/apache/poi/poifs/poibrowser/DocumentDescriptorRenderer.java +++ /dev/null @@ -1,72 +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.poifs.poibrowser; - -import java.awt.*; -import javax.swing.*; -import javax.swing.tree.*; - -import org.apache.poi.util.HexDump; - -/** - *

{@link TreeCellRenderer} for a {@link DocumentDescriptor}. The - * renderer is extremly rudimentary since displays only the document's - * name, its size and its fist few bytes.

- */ -public class DocumentDescriptorRenderer extends DefaultTreeCellRenderer -{ - - @Override - public Component getTreeCellRendererComponent(final JTree tree, - final Object value, - final boolean selectedCell, - final boolean expanded, - final boolean leaf, - final int row, - final boolean hasCellFocus) - { - final DocumentDescriptor d = (DocumentDescriptor) - ((DefaultMutableTreeNode) value).getUserObject(); - final JPanel p = new JPanel(); - final JTextArea text = new JTextArea(); - text.append(renderAsString(d)); - text.setFont(new Font("Monospaced", Font.PLAIN, 10)); - p.add(text); - if (selectedCell) { - Util.invert(text); - } - return p; - } - - - /** - *

Renders {@link DocumentDescriptor} as a string.

- */ - protected String renderAsString(final DocumentDescriptor d) { - return "Name: " + - d.name + - " " + - HexDump.toHex(d.name) + - "\n" + - "Size: " + - d.size + - " bytes\n" + - "First bytes: " + - HexDump.toHex(d.bytes); - } -} diff --git a/src/examples/src/org/apache/poi/poifs/poibrowser/ExtendableTreeCellRenderer.java b/src/examples/src/org/apache/poi/poifs/poibrowser/ExtendableTreeCellRenderer.java deleted file mode 100644 index a2a0339b51..0000000000 --- a/src/examples/src/org/apache/poi/poifs/poibrowser/ExtendableTreeCellRenderer.java +++ /dev/null @@ -1,144 +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.poifs.poibrowser; - -import java.awt.*; -import javax.swing.*; -import javax.swing.tree.*; -import java.util.*; - -/** - *

This is a {@link TreeCellRenderer} implementation which is able - * to render arbitrary objects. The {@link ExtendableTreeCellRenderer} - * does not do the rendering itself but instead dispatches to - * class-specific renderers. A class/renderer pair must be registered - * using the {@link #register} method. If a class has no registered - * renderer, the renderer of its closest superclass is used. Since the - * {@link ExtendableTreeCellRenderer} always has a default renderer - * for the {@link Object} class, rendering is always possible. The - * default {@link Object} renderer can be replaced by another renderer - * but it cannot be unregistered.

- */ -public class ExtendableTreeCellRenderer implements TreeCellRenderer -{ - - /** - *

Maps classes to renderers.

- */ - protected Map,TreeCellRenderer> renderers; - - - - public ExtendableTreeCellRenderer() - { - renderers = new HashMap<>(); - register(Object.class, new DefaultTreeCellRenderer() - { - @Override - public Component getTreeCellRendererComponent - (JTree tree, Object value, boolean selectedCell, - boolean expanded, boolean leaf, int row, boolean hasCellFocus) - { - final String s = value.toString(); - final JLabel l = new JLabel(s + " "); - if (selected) - { - Util.invert(l); - l.setOpaque(true); - } - return l; - } - }); - } - - - - /** - *

Registers a renderer for a class.

- **/ - public void register(final Class c, final TreeCellRenderer renderer) - { - renderers.put(c, renderer); - } - - - - /** - *

Unregisters a renderer for a class. The renderer for the - * {@link Object} class cannot be unregistered.

- */ - public void unregister(final Class c) - { - if (c == Object.class) - throw new IllegalArgumentException - ("Renderer for Object cannot be unregistered."); - renderers.put(c, null); - } - - - - /** - *

Renders an object in a tree cell depending of the object's - * class.

- * - * @see TreeCellRenderer#getTreeCellRendererComponent - */ - @Override - public Component getTreeCellRendererComponent - (final JTree tree, final Object value, final boolean selected, - final boolean expanded, final boolean leaf, final int row, - final boolean hasFocus) - { - final String NULL = "null"; - TreeCellRenderer r; - Object userObject; - if (value == null) - userObject = NULL; - else - { - userObject = ((DefaultMutableTreeNode) value).getUserObject(); - if (userObject == null) - userObject = NULL; - } - r = findRenderer(userObject.getClass()); - return r.getTreeCellRendererComponent - (tree, value, selected, expanded, leaf, row, - hasFocus); - } - - - - /** - *

Find the renderer for the specified class.

- */ - protected TreeCellRenderer findRenderer(final Class c) - { - final TreeCellRenderer r = renderers.get(c); - if (r != null) - /* The class has a renderer. */ - return r; - - /* The class has no renderer, try the superclass, if any. */ - final Class superclass = c.getSuperclass(); - if (superclass != null) { - return findRenderer(superclass); - } - return null; - } - -} diff --git a/src/examples/src/org/apache/poi/poifs/poibrowser/POIBrowser.java b/src/examples/src/org/apache/poi/poifs/poibrowser/POIBrowser.java deleted file mode 100644 index a70f5edd00..0000000000 --- a/src/examples/src/org/apache/poi/poifs/poibrowser/POIBrowser.java +++ /dev/null @@ -1,119 +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.poifs.poibrowser; - -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.File; -import java.io.IOException; - -import javax.swing.JFrame; -import javax.swing.JScrollPane; -import javax.swing.JTree; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.MutableTreeNode; - -import org.apache.poi.poifs.eventfilesystem.POIFSReader; - -/** - *

The main class of the POI Browser. It shows the structure of POI - * filesystems (Microsoft Office documents) in a {@link - * JTree}. Specify their filenames on the command line!

- * - * @see POIFSReader - */ -@SuppressWarnings("serial") -public class POIBrowser extends JFrame -{ - - - /** - *

Takes a bunch of file names as command line parameters, - * opens each of them as a POI filesystem and displays their - * internal structures in a {@link JTree}.

- */ - public static void main(String[] args) - { - new POIBrowser().run(args); - } - - protected void run(String[] args) - { - addWindowListener(new WindowAdapter() - { - @Override - public void windowClosing(WindowEvent e) - { - System.exit(0); - } - }); - - /* Create the tree model with a root node. The latter is - * invisible but it must be present because a tree model - * always needs a root. - * - * The tree's root node must be visible to all methods. - */ - MutableTreeNode rootNode = new DefaultMutableTreeNode("POI Filesystems"); - DefaultTreeModel treeModel = new DefaultTreeModel(rootNode); - - /* Create the tree UI element. */ - final JTree treeUI = new JTree(treeModel); - getContentPane().add(new JScrollPane(treeUI)); - - /* Add the POI filesystems to the tree. */ - int displayedFiles = 0; - for (final String filename : args) { - try { - POIFSReader r = new POIFSReader(); - r.registerListener(new TreeReaderListener(filename, rootNode)); - r.read(new File(filename)); - displayedFiles++; - } catch (IOException ex) { - System.err.println(filename + ": " + ex); - } catch (Exception t) { - System.err.println("Unexpected exception while reading \"" + - filename + "\":"); - t.printStackTrace(System.err); - } - } - - /* Exit if there is no file to display (none specified or only - * files with problems). */ - if (displayedFiles == 0) - { - System.out.println("No POI filesystem(s) to display."); - System.exit(0); - } - - /* Make the tree UI element visible. */ - treeUI.setRootVisible(true); - treeUI.setShowsRootHandles(true); - ExtendableTreeCellRenderer etcr = new ExtendableTreeCellRenderer(); - etcr.register(DocumentDescriptor.class, - new DocumentDescriptorRenderer()); - etcr.register(PropertySetDescriptor.class, - new PropertySetDescriptorRenderer()); - treeUI.setCellRenderer(etcr); - setSize(600, 450); - setTitle("POI Browser 0.09"); - setVisible(true); - } - -} diff --git a/src/examples/src/org/apache/poi/poifs/poibrowser/PropertySetDescriptor.java b/src/examples/src/org/apache/poi/poifs/poibrowser/PropertySetDescriptor.java deleted file mode 100644 index f9658ae03f..0000000000 --- a/src/examples/src/org/apache/poi/poifs/poibrowser/PropertySetDescriptor.java +++ /dev/null @@ -1,75 +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.poifs.poibrowser; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; - -import org.apache.poi.hpsf.MarkUnsupportedException; -import org.apache.poi.hpsf.NoPropertySetStreamException; -import org.apache.poi.hpsf.PropertySet; -import org.apache.poi.hpsf.PropertySetFactory; -import org.apache.poi.poifs.filesystem.DocumentInputStream; -import org.apache.poi.poifs.filesystem.POIFSDocumentPath; - -/** - *

Describes the most important (whatever that is) features of a - * stream containing a {@link PropertySet}.

- */ -public class PropertySetDescriptor extends DocumentDescriptor -{ - - protected PropertySet propertySet; - - /** - *

Returns this {@link PropertySetDescriptor}'s {@link - * PropertySet}.

- */ - public PropertySet getPropertySet() - { - return propertySet; - } - - - - /** - *

Creates a {@link PropertySetDescriptor} by reading a {@link - * PropertySet} from a {@link DocumentInputStream}.

- * - * @param name The stream's name. - * - * @param path The stream's path in the POI filesystem hierarchy. - * - * @param stream The stream. - * - * @param nrOfBytesToDump The maximum number of bytes to display in a - * dump starting at the beginning of the stream. - */ - public PropertySetDescriptor(final String name, - final POIFSDocumentPath path, - final DocumentInputStream stream, - final int nrOfBytesToDump) - throws NoPropertySetStreamException, - MarkUnsupportedException, UnsupportedEncodingException, - IOException - { - super(name, path, stream, nrOfBytesToDump); - propertySet = PropertySetFactory.create(stream); - } - -} diff --git a/src/examples/src/org/apache/poi/poifs/poibrowser/PropertySetDescriptorRenderer.java b/src/examples/src/org/apache/poi/poifs/poibrowser/PropertySetDescriptorRenderer.java deleted file mode 100644 index 153dc5e205..0000000000 --- a/src/examples/src/org/apache/poi/poifs/poibrowser/PropertySetDescriptorRenderer.java +++ /dev/null @@ -1,170 +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.poifs.poibrowser; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Font; -import java.util.Iterator; -import java.util.List; - -import javax.swing.JPanel; -import javax.swing.JTextArea; -import javax.swing.JTree; -import javax.swing.tree.DefaultMutableTreeNode; - -import org.apache.poi.hpsf.Property; -import org.apache.poi.hpsf.PropertySet; -import org.apache.poi.hpsf.Section; -import org.apache.poi.hpsf.SummaryInformation; -import org.apache.poi.util.HexDump; - -/** - *

Renders a {@link PropertySetDescriptor} by more or less dumping - * the stuff into a {@link JTextArea}.

- */ -public class PropertySetDescriptorRenderer extends DocumentDescriptorRenderer -{ - - @Override - public Component getTreeCellRendererComponent(final JTree tree, - final Object value, - final boolean selectedCell, - final boolean expanded, - final boolean leaf, - final int row, - final boolean hasCellFocus) - { - final PropertySetDescriptor d = (PropertySetDescriptor) - ((DefaultMutableTreeNode) value).getUserObject(); - final PropertySet ps = d.getPropertySet(); - final JPanel p = new JPanel(); - final JTextArea text = new JTextArea(); - text.setBackground(new Color(200, 255, 200)); - text.setFont(new Font("Monospaced", Font.PLAIN, 10)); - text.append(renderAsString(d)); - text.append("\nByte order: "); - text.append(HexDump.toHex((short) ps.getByteOrder())); - text.append("\nFormat: "); - text.append(HexDump.toHex((short) ps.getFormat())); - text.append("\nOS version: "); - text.append(HexDump.toHex(ps.getOSVersion())); - text.append("\nClass ID: "); - text.append(HexDump.toHex(ps.getClassID().getBytes())); - text.append("\nSection count: " + ps.getSectionCount()); - text.append(sectionsToString(ps.getSections())); - p.add(text); - - if (ps instanceof SummaryInformation) - { - /* Use the convenience methods. */ - final SummaryInformation si = (SummaryInformation) ps; - text.append("\n"); - text.append("\nTitle: " + si.getTitle()); - text.append("\nSubject: " + si.getSubject()); - text.append("\nAuthor: " + si.getAuthor()); - text.append("\nKeywords: " + si.getKeywords()); - text.append("\nComments: " + si.getComments()); - text.append("\nTemplate: " + si.getTemplate()); - text.append("\nLast Author: " + si.getLastAuthor()); - text.append("\nRev. Number: " + si.getRevNumber()); - text.append("\nEdit Time: " + si.getEditTime()); - text.append("\nLast Printed: " + si.getLastPrinted()); - text.append("\nCreate Date/Time: " + si.getCreateDateTime()); - text.append("\nLast Save Date/Time: " + si.getLastSaveDateTime()); - text.append("\nPage Count: " + si.getPageCount()); - text.append("\nWord Count: " + si.getWordCount()); - text.append("\nChar Count: " + si.getCharCount()); - // text.append("\nThumbnail: " + si.getThumbnail()); - text.append("\nApplication Name: " + si.getApplicationName()); - text.append("\nSecurity: " + si.getSecurity()); - } - - if (selectedCell) - Util.invert(text); - return p; - } - - - - /** - *

Returns a string representation of a list of {@link - * Section}s.

- */ - protected String sectionsToString(final List
sections) - { - final StringBuilder b = new StringBuilder(); - int count = 1; - for (Iterator
i = sections.iterator(); i.hasNext();) - { - Section s = i.next(); - String d = toString(s, "Section " + count++); - b.append(d); - } - return b.toString(); - } - - - - /** - *

Returns a string representation of a {@link Section}.

- * @param s the section - * @param name the section's name - * @return a string representation of the {@link Section} - */ - protected String toString(final Section s, final String name) - { - final StringBuilder b = new StringBuilder(); - b.append("\n" + name + " Format ID: "); - b.append(HexDump.toHex(s.getFormatID().getBytes())); - b.append("\n" + name + " Offset: " + s.getOffset()); - b.append("\n" + name + " Section size: " + s.getSize()); - b.append("\n" + name + " Property count: " + s.getPropertyCount()); - - final Property[] properties = s.getProperties(); - for (int i = 0; i < properties.length; i++) - { - final Property p = properties[i]; - final long id = p.getID(); - final long type = p.getType(); - final Object value = p.getValue(); - b.append('\n'); - b.append(name); - b.append(", Name: "); - b.append(id); - b.append(" ("); - b.append(s.getPIDString(id)); - b.append("), Type: "); - b.append(type); - b.append(", Value: "); - if (value instanceof byte[]) { - byte[] buf = new byte[4]; - System.arraycopy(value, 0, buf, 0, 4); - b.append(HexDump.toHex(buf)); - b.append(' '); - System.arraycopy(value, ((byte[])value).length - 4, buf, 0, 4); - } else if (value != null) { - b.append(value); - } else { - b.append("null"); - } - } - return b.toString(); - } - -} diff --git a/src/examples/src/org/apache/poi/poifs/poibrowser/TreeReaderListener.java b/src/examples/src/org/apache/poi/poifs/poibrowser/TreeReaderListener.java deleted file mode 100644 index a7d978d234..0000000000 --- a/src/examples/src/org/apache/poi/poifs/poibrowser/TreeReaderListener.java +++ /dev/null @@ -1,215 +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.poifs.poibrowser; - -import java.util.HashMap; -import java.util.Map; - -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.MutableTreeNode; - -import org.apache.poi.hpsf.HPSFException; -import org.apache.poi.poifs.eventfilesystem.POIFSReaderEvent; -import org.apache.poi.poifs.eventfilesystem.POIFSReaderListener; -import org.apache.poi.poifs.filesystem.DocumentInputStream; -import org.apache.poi.poifs.filesystem.POIFSDocumentPath; - -/** - *

Organizes document information in a tree model in order to be - * e.g. displayed in a Swing {@link javax.swing.JTree}. An instance of this - * class is created with a root tree node ({@link MutableTreeNode}) and - * registered as a {@link POIFSReaderListener} with a {@link - * org.apache.poi.poifs.eventfilesystem.POIFSReader}. While the latter processes - * a POI filesystem it calls this class' {@link #processPOIFSReaderEvent} for - * each document it has been registered for. This method appends the document it - * processes at the appropriate position into the tree rooted at the - * above mentioned root tree node.

- * - *

The root tree node should be the root tree node of a {@link - * javax.swing.tree.TreeModel}.

- * - *

A top-level element in the tree model, i.e. an immediate child - * node of the root node, describes a POI filesystem as such. It is - * suggested to use the file's name (as seen by the operating system) - * but it could be any other string.

- * - *

The value of a tree node is a {@link DocumentDescriptor}. Unlike - * a {@link org.apache.poi.poifs.filesystem.OPOIFSDocument} which may be as heavy - * as many megabytes, an instance of {@link DocumentDescriptor} is a - * light-weight object and contains only some meta-information about a - * document.

- */ -public class TreeReaderListener implements POIFSReaderListener -{ - - /** - *

The tree's root node. POI filesystems get attached to this - * node as children.

- */ - protected MutableTreeNode rootNode; - - /** - *

Maps filenames and POI document paths to their associated - * tree nodes.

- */ - protected Map pathToNode; - - /** - *

The name of the file this {@link TreeReaderListener} - * processes. It is used to identify a top-level element in the - * tree. Alternatively any other string can be used. It is just a - * label which should identify a POI filesystem.

- */ - protected String filename; - - - - /** - *

Creates a {@link TreeReaderListener} which should then be - * registered with a - * {@link org.apache.poi.poifs.eventfilesystem.POIFSReader}.

- * - * @param filename The name of the POI filesystem, i.e. the name - * of the file the POI filesystem resides in. Alternatively any - * other string can be used. - * - * @param rootNode All document information will be attached as - * descendands to this tree node. - */ - public TreeReaderListener(final String filename, - final MutableTreeNode rootNode) - { - this.filename = filename; - this.rootNode = rootNode; - pathToNode = new HashMap<>(15); // Should be a reasonable guess. - } - - - - /**

The number of bytes to dump.

*/ - private int nrOfBytes = 50; - - public void setNrOfBytes(final int nrOfBytes) - { - this.nrOfBytes = nrOfBytes; - } - - public int getNrOfBytes() - { - return nrOfBytes; - } - - - - /** - *

A document in the POI filesystem has been opened for - * reading. This method retrieves properties of the document and - * adds them to a tree model.

- */ - @Override - public void processPOIFSReaderEvent(final POIFSReaderEvent event) - { - DocumentDescriptor d; - final DocumentInputStream is = event.getStream(); - if (!is.markSupported()) { - throw new UnsupportedOperationException(is.getClass().getName() + - " does not support mark()."); - } - - /* Try do handle this document as a property set. We receive - * an exception if is no property set and handle it as a - * document of some other format. We are not concerned about - * that document's details. */ - try - { - d = new PropertySetDescriptor(event.getName(), event.getPath(), - is, nrOfBytes); - } - catch (HPSFException ex) - { - d = new DocumentDescriptor(event.getName(), event.getPath(), - is, nrOfBytes); - } - catch (Exception t) - { - throw new RuntimeException("Unexpected exception while processing " + event.getName() + " in " + event.getPath(), t); - } - - is.close(); - - final MutableTreeNode parentNode = getNode(d.path, filename, rootNode); - final MutableTreeNode nameNode = new DefaultMutableTreeNode(d.name); - parentNode.insert(nameNode, 0); - final MutableTreeNode dNode = new DefaultMutableTreeNode(d); - nameNode.insert(dNode, 0); - } - - - - /** - *

Locates the parent node for a document entry in the tree - * model. If the parent node does not yet exist it will be - * created, too. This is done recursively, if needed.

- * - * @param path The tree node for this path is located. - * - * @param fsName The name of the POI filesystem. This is just a - * string which is displayed in the tree at the top lovel. - * - * @param root The root node. - */ - private MutableTreeNode getNode(final POIFSDocumentPath path, - final String fsName, - final MutableTreeNode root) - { - MutableTreeNode n = pathToNode.get(path); - if (n != null) { - /* Node found in map, just return it. */ - return n; - } - if (path.length() == 0) - { - /* This is the root path of the POI filesystem. Its tree - * node is resp. must be located below the tree node of - * the POI filesystem itself. This is a tree node with the - * POI filesystem's name (this the operating system file's - * name) as its key it the path-to-node map. */ - n = pathToNode.get(fsName); - if (n == null) - { - /* A tree node for the POI filesystem does not yet - * exist. */ - n = new DefaultMutableTreeNode(fsName); - pathToNode.put(fsName, n); - root.insert(n, 0); - } - return n; - } - /* else - The path is somewhere down in the POI filesystem's - * hierarchy. We need the tree node of this path's parent - * and attach our new node to it. */ - final String name = path.getComponent(path.length() - 1); - final POIFSDocumentPath parentPath = path.getParent(); - final MutableTreeNode parentNode = - getNode(parentPath, fsName, root); - n = new DefaultMutableTreeNode(name); - pathToNode.put(path, n); - parentNode.insert(n, 0); - return n; - } -} diff --git a/src/examples/src/org/apache/poi/poifs/poibrowser/Util.java b/src/examples/src/org/apache/poi/poifs/poibrowser/Util.java deleted file mode 100644 index 8e86b18735..0000000000 --- a/src/examples/src/org/apache/poi/poifs/poibrowser/Util.java +++ /dev/null @@ -1,41 +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.poifs.poibrowser; - -import java.awt.*; -import javax.swing.*; - -/** - *

Contains various (well, just one at the moment) static utility - * methods.

- */ -public class Util { - - /** - *

Makes a Swing component inverted by swapping its foreground - * and background colors. Hint: Depending on your needs it might - * also be a good idea to call c.setOpaque(true).

- */ - public static void invert(JComponent c) { - Color invBackground = c.getForeground(); - Color invForeground = c.getBackground(); - c.setBackground(invBackground); - c.setForeground(invForeground); - } -} - -- 2.39.5