blob: 3838ad50bf183e6086d3e9bed344bf948cac6fd1 [file] [log] [blame]
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed 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 com.intellij.ui.tabs.impl;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.geom.GeneralPath;
import java.awt.geom.Line2D;
public abstract class ShapeTransform {
protected GeneralPath myPath = new GeneralPath();
private Rectangle myShapeRect;
private final int myXTransform;
private final int myYTransform;
private final boolean mySwap;
protected ShapeTransform(Rectangle shapeRect, int xTransform, int yTransform, boolean swap) {
myShapeRect = shapeRect;
myXTransform = xTransform;
myYTransform = yTransform;
mySwap = swap;
}
protected final Rectangle getShapeRect() {
return myShapeRect;
}
public abstract int getX();
public abstract int getY();
public abstract int getMaxX();
public abstract int getMaxY();
public final int deltaX(int deltaX) {
return deltaX * myXTransform;
}
public final int deltaY(int deltaY) {
return deltaY * myYTransform;
}
public final <T> T transformY1(T o1, T o2) {
return (mySwap ? myXTransform : myYTransform) == 1 ? o1: o2;
}
public abstract Insets transformInsets(Insets insets);
public abstract Line2D.Float transformLine(int x1, int y1, int x2, int y2);
public abstract ShapeTransform createTransform(Rectangle innerRec);
public abstract ShapeTransform copy();
public final int getWidth() {
return Math.abs(getMaxX() - getX());
}
public final int getHeight() {
return Math.abs(getMaxY() - getY());
}
public final ShapeTransform moveTo(int x, int y) {
if (mySwap) {
//noinspection SuspiciousNameCombination
myPath.moveTo(y, x);
} else {
myPath.moveTo(x, y);
}
return this;
}
public final ShapeTransform quadTo(int x1, int y1, int x2, int y2) {
if (mySwap) {
//noinspection SuspiciousNameCombination
myPath.quadTo(y1, x1, y2, x2);
} else {
myPath.quadTo(x1, y1, x2, y2);
}
return this;
}
public final ShapeTransform lineTo(int x, int y) {
if (mySwap) {
//noinspection SuspiciousNameCombination
myPath.lineTo(y, x);
} else {
myPath.lineTo(x, y);
}
return this;
}
public final GeneralPath getShape() {
return myPath;
}
public final ShapeTransform reset() {
return reset(null);
}
protected final ShapeTransform reset(Rectangle shapeRec) {
myPath = new GeneralPath();
if (shapeRec != null) {
myShapeRect = shapeRec;
}
return this;
}
public final ShapeTransform closePath() {
myPath.closePath();
return this;
}
public final ShapeTransform doRect(int x, int y, int width, int height) {
if (width <= 0 || height <= 0) return this;
return moveTo(x, y).lineTo(x + deltaX(width), y).lineTo(x + deltaX(width), y + deltaY(height)).lineTo(x, y + deltaY(height)).closePath();
}
public static class Top extends ShapeTransform {
public Top() {
this(null);
}
public Top(Rectangle shapeRect) {
this(shapeRect, new GeneralPath());
}
public Top(Rectangle shapeRect, GeneralPath path) {
super(shapeRect, 1, 1, false);
myPath = path;
}
public int getX() {
return getShapeRect().x;
}
public int getY() {
return getShapeRect().y;
}
public int getMaxX() {
return (int)getShapeRect().getMaxX();
}
public int getMaxY() {
return (int)getShapeRect().getMaxY();
}
@Override
public ShapeTransform createTransform(Rectangle innerRec) {
return new Top(innerRec);
}
@Override
public Insets transformInsets(Insets insets) {
return new Insets(insets.top, insets.left, insets.bottom, insets.right);
}
@Override
public Line2D.Float transformLine(int x1, int y1, int x2, int y2) {
return new Line2D.Float(x1, y1, x2, y2);
}
public ShapeTransform copy() {
return new Top((Rectangle)getShapeRect().clone(), (GeneralPath)myPath.clone());
}
}
public static class Left extends ShapeTransform {
public Left() {
this(null);
}
public Left(Rectangle shapeRect) {
this(shapeRect, new GeneralPath());
}
public Left(Rectangle shapeRect, GeneralPath path) {
super(shapeRect, 1, 1, true);
myPath = path;
}
public int getX() {
return getShapeRect().y;
}
public int getY() {
return getShapeRect().x;
}
public int getMaxX() {
return (int)getShapeRect().getMaxY();
}
public int getMaxY() {
return (int)getShapeRect().getMaxX();
}
@Override
public ShapeTransform createTransform(Rectangle innerRec) {
return new Left(innerRec);
}
@Override
public Line2D.Float transformLine(int x1, int y1, int x2, int y2) {
return new Line2D.Float(y1, x1, y2, x2);
}
@Override
public Insets transformInsets(Insets insets) {
return new Insets(insets.left, insets.top, insets.right, insets.bottom);
}
public ShapeTransform copy() {
return new Left((Rectangle)getShapeRect().clone(), (GeneralPath)myPath.clone());
}
}
public static class Bottom extends ShapeTransform {
public Bottom(Rectangle shapeRect, GeneralPath path) {
super(shapeRect, 1, -1, false);
myPath = path;
}
public Bottom(Rectangle shapeRect) {
this(shapeRect, new GeneralPath());
}
public Bottom() {
this(null);
}
public int getX() {
return getShapeRect().x;
}
public int getY() {
return (int)getShapeRect().getMaxY();
}
public int getMaxX() {
return (int)getShapeRect().getMaxX();
}
public int getMaxY() {
return getShapeRect().y;
}
public ShapeTransform copy() {
return new Bottom((Rectangle)getShapeRect().clone(), (GeneralPath)myPath.clone());
}
@Override
public ShapeTransform createTransform(Rectangle innerRec) {
return new Bottom(innerRec);
}
@Override
public Insets transformInsets(Insets insets) {
return new Insets(insets.bottom, insets.right, insets.top, insets.left);
}
@Override
public Line2D.Float transformLine(int x1, int y1, int x2, int y2) {
return new Line2D.Float(x2,
Math.abs(y2),
x1,
Math.abs(y1));
}
}
public static class Right extends ShapeTransform {
public Right(Rectangle shapeRect, GeneralPath path) {
super(shapeRect, 1, -1, true);
myPath = path;
}
public Right(Rectangle rec) {
this(rec, new GeneralPath());
}
public Right() {
this(null);
}
public int getX() {
return getShapeRect().y;
}
public int getY() {
return (int)getShapeRect().getMaxX();
}
public int getMaxX() {
return (int)getShapeRect().getMaxY();
}
public int getMaxY() {
return getShapeRect().x;
}
public ShapeTransform copy() {
return new Right((Rectangle)getShapeRect().clone(), (GeneralPath)myPath.clone());
}
@Override
public Insets transformInsets(Insets insets) {
return new Insets(insets.right, insets.top, insets.left, insets.bottom);
}
@Override
public ShapeTransform createTransform(Rectangle innerRec) {
return new Right(innerRec);
}
public Line2D.Float transformLine(int x1, int y1, int x2, int y2) {
return new Line2D.Float(y1, x1, y2, x2);
}
}
}