com.vaadin.addon.spreadsheet.elements.AddressUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.vaadin.addon.spreadsheet.elements.AddressUtil.java

Source

package com.vaadin.addon.spreadsheet.elements;

/*
 * #%L
 * Vaadin Spreadsheet Testbench API
 * %%
 * Copyright (C) 2013 - 2016 Vaadin Ltd
 * %%
 * This program is available under Commercial Vaadin Add-On License 3.0
 * (CVALv3).
 * 
 * See the file license.html distributed with this software for more
 * information about licensing.
 * 
 * You should have received a copy of the CVALv3 along with this program.
 * If not, see <http://vaadin.com/license/cval-3>.
 * #L%
 */

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.openqa.selenium.Point;

/**
 * An utility class that converts Excel cell addresses to integer coordinates.
 * 
 * @author Vaadin Ltd.
 */
public class AddressUtil implements Serializable {

    private static final Pattern ADDRESS_RANGE_PATTERN = Pattern.compile("([A-Z]+)(\\d+):([A-Z]+)(\\d+)");
    private static final Pattern ADDRESS_PATTERN = Pattern.compile("([A-Z]+)(\\d+)");

    /**
     * Converts a single cell address to its integer coordinates (Point)
     * 
     * @param address
     *            The address of the cell, e.g. A3
     * @return the coordinates of the cell
     */
    public static Point addressToPoint(String address) {
        Matcher m = ADDRESS_PATTERN.matcher(address);
        m.find();

        int col = charAddressToInt(m.group(1));
        int row = Integer.valueOf(m.group(2));

        return new Point(col, row);
    }

    /**
     * Converts an address range to a set of coordinates (Points)
     * 
     * @param addressRange
     *            The address range, e.g. A1:B3, AA20:AZ98, etc.
     * @return A set of integer coordinates for all cells in the specified
     *         range.
     */
    public static Set<Point> addressRangeToPoints(String addressRange) {
        Matcher m = ADDRESS_RANGE_PATTERN.matcher(addressRange);
        m.find();

        int left = charAddressToInt(m.group(1));
        int top = Integer.valueOf(m.group(2));

        int right = charAddressToInt(m.group(3));
        int bottom = Integer.valueOf(m.group(4));

        HashSet<Point> points = new HashSet<Point>();
        for (int col = left; col <= right; col++) {
            for (int row = top; row <= bottom; row++) {
                points.add(new Point(col, row));
            }
        }
        return points;
    }

    /**
     * Converts a character address (like "A", "BA", "AFK") to a numeric one
     * 
     * @param address
     *            The character address
     * @return The numeric value of the address
     */
    private static int charAddressToInt(String address) {
        address = address.toUpperCase();
        int result = 0;
        String reversed = new StringBuffer(address).reverse().toString();
        for (int i = 0; i < reversed.length(); i++) {
            result += ((reversed.charAt(i) - 'A') + 1) * Math.pow(26, i);
        }
        return result;
    }
}