// 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 com.cloud.consoleproxy.util; import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; public class Region { private Rectangle bound; private List<Rectangle> rectList; public Region() { bound = new Rectangle(0, 0, 0, 0); rectList = new ArrayList<Rectangle>(); } public Region(Rectangle rect) { bound = new Rectangle(rect.x, rect.y, rect.width, rect.height); rectList = new ArrayList<Rectangle>(); rectList.add(rect); } public Rectangle getBound() { return bound; } public void clearBound() { assert (rectList.size() == 0); bound.x = bound.y = bound.width = bound.height = 0; } public List<Rectangle> getRectangles() { return rectList; } public boolean add(Rectangle rect) { if (bound.isEmpty()) { assert (rectList.size() == 0); bound.x = rect.x; bound.y = rect.y; bound.width = rect.width; bound.height = rect.height; rectList.add(rect); return true; } Rectangle rcInflated = new Rectangle(rect.x - 1, rect.y - 1, rect.width + 2, rect.height + 2); if (!bound.intersects(rcInflated)) return false; for (Rectangle r : rectList) { if (r.intersects(rcInflated)) { if (!r.contains(rect)) { enlargeBound(rect); rectList.add(rect); return true; } } } return false; } private void enlargeBound(Rectangle rect) { int boundLeft = Math.min(bound.x, rect.x); int boundTop = Math.min(bound.y, rect.y); int boundRight = Math.max(bound.x + bound.width, rect.x + rect.width); int boundBottom = Math.max(bound.y + bound.height, rect.y + rect.height); bound.x = boundLeft; bound.y = boundTop; bound.width = boundRight - boundLeft; bound.height = boundBottom - boundTop; } }