All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.netbeans.swing.tabcontrol.plaf.EqualPolygon Maven / Gradle / Ivy

There is a newer version: RELEASE230
Show newest version
/*
 * 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.
 */
/*
 * EqualPolygon.java
 *
 * Created on February 10, 2004, 1:17 PM
 */

package org.netbeans.swing.tabcontrol.plaf;

import java.awt.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;


/**
 * A Polygon which implements a proper equals/hashcode contract.  In order to
 * optimize drag and drop repainting, it is necessary that the Shape objects
 * returned by getTabIndication() be able to be compared properly.
 * 

* To ease migration of older code, this class also implements a couple methods * of GeneralPath, which was used before. These methods just delegate to * addPoint(), so the full functionality of GeneralPath is not replicated * (specifically, a polygon must be contiguous and closed). *

* * @author Tim Boudreau */ public final class EqualPolygon extends Polygon { /** * Creates a new instance of EqualGeneralPath */ public EqualPolygon() { } /** * Copy constructor will copy the xpoints/ypoints arrays so the caller can * later modify them without changing the polygon constructor here. */ public EqualPolygon(int[] x, int[] y, int n) { //Must clone the arrays, or transforms on the source of the polygon //will also transform this one xpoints = new int[n]; ypoints = new int[n]; System.arraycopy(x, 0, xpoints, 0, xpoints.length); System.arraycopy(y, 0, ypoints, 0, ypoints.length); npoints = n; } /** * Copy constructor - takes either another EqualPolygon or a Polygon. Copies * the points arrays of the original polygon, so the passed polygon may be * modified without affecting the instance constructed here. * * @param p */ public EqualPolygon(Polygon p) { super(p.xpoints, p.ypoints, p.npoints); } /** Convenience constructor which takes a Rectangle */ public EqualPolygon(Rectangle r) { super ( new int[] {r.x, r.x + r.width, r.x + r.width, r.x}, new int[] {r.y, r.y, r.y + r.height, r.y + r.height}, 4 ); } /** * Non copy constructor based on fixed arrays. Takes the point count * parameter fromx.length. */ public EqualPolygon(int[] x, int[] y) { super(x, y, x.length); } /** * Delegates to Polygon.addPoint(). * * @param x x coordinate * @param y y coordinate */ public void moveTo(int x, int y) { addPoint(x, y); } /** * Delegates to Polygon.addPoint(). * * @param x x coordinate * @param y y coordinate */ public void lineTo(int x, int y) { addPoint(x, y); } /** * Creates a new EqualPolygon using the copy constructor - the resulting * polygon may be modified without affecting the original. * * @return A new instance of EqualPolygon with the same point values */ public Object clone() { return new EqualPolygon(xpoints, ypoints, xpoints.length); } /** * Overridden to produce a meaningful result. * * @return A string representation of the EqualPolygon */ public String toString() { StringBuffer sb = new StringBuffer("EqualPolygon: "); //NOI18N for (int i = 0; i < npoints; i++) { sb.append(' '); //NOI18N sb.append(xpoints[i]); sb.append(','); //NOI18N sb.append(ypoints[i]); } return sb.toString(); } /** * Computes a hashCode based on the points arrays. * * @return The hash code */ public int hashCode() { return arrayHashCode(xpoints) ^ arrayHashCode(ypoints); } private int arrayHashCode(int[] o) { int result = 0; for (int i = 0; i < npoints; i++) { result += o[i] ^ i; } return result; } /** * Returns true if the argument is a Polygon (does not need to be * EqualPolygon) and its point arrays and number of points matches. * * @param o Another polygon * @return whether or not they are equal */ public boolean equals(Object o) { if (o == this) { return true; } if (o instanceof Polygon) { Polygon p = (Polygon) o; int[] ox = p.xpoints; int[] oy = p.ypoints; boolean result = Arrays.equals(xpoints, ox) && Arrays.equals(ypoints, oy); result &= p.npoints == npoints; return result; } else { return false; } } private Point[] sortPoints(Point[] p) { //Prune duplicates HashSet set = new HashSet(Arrays.asList(p)); p = new Point[set.size()]; p = set.toArray(p); //Then sort Arrays.sort(p, comparator); return p; } private static final Comparator comparator = new PointsComparator(); private static class PointsComparator implements Comparator { public int compare(Point a, Point b) { int result = (a.y * (a.x - b.x)) - (b.y * (b.x - a.x)); return result; } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy