/* * Copyright (C) 2008 The Android Open Source Project * * 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.android.calendar; import android.graphics.Rect; public class EventGeometry { // This is the space from the grid line to the event rectangle. private int mCellMargin = 0; private float mMinuteHeight; private float mHourGap; private float mMinEventHeight; void setCellMargin(int cellMargin) { mCellMargin = cellMargin; } public void setHourGap(float gap) { mHourGap = gap; } public void setMinEventHeight(float height) { mMinEventHeight = height; } public void setHourHeight(float height) { mMinuteHeight = height / 60.0f; } // Computes the rectangle coordinates of the given event on the screen. // Returns true if the rectangle is visible on the screen. public boolean computeEventRect(int date, int left, int top, int cellWidth, Event event) { if (event.drawAsAllday()) { return false; } float cellMinuteHeight = mMinuteHeight; int startDay = event.startDay; int endDay = event.endDay; if (startDay > date || endDay < date) { return false; } int startTime = event.startTime; int endTime = event.endTime; // If the event started on a previous day, then show it starting // at the beginning of this day. if (startDay < date) { startTime = 0; } // If the event ends on a future day, then show it extending to // the end of this day. if (endDay > date) { endTime = DayView.MINUTES_PER_DAY; } int col = event.getColumn(); int maxCols = event.getMaxColumns(); int startHour = startTime / 60; int endHour = endTime / 60; // If the end point aligns on a cell boundary then count it as // ending in the previous cell so that we don't cross the border // between hours. if (endHour * 60 == endTime) endHour -= 1; event.top = top; event.top += (int) (startTime * cellMinuteHeight); event.top += startHour * mHourGap; event.bottom = top; event.bottom += (int) (endTime * cellMinuteHeight); event.bottom += endHour * mHourGap - 1; // Make the rectangle be at least mMinEventHeight pixels high if (event.bottom < event.top + mMinEventHeight) { event.bottom = event.top + mMinEventHeight; } float colWidth = (float) (cellWidth - (maxCols + 1) * mCellMargin) / (float) maxCols; event.left = left + col * (colWidth + mCellMargin); event.right = event.left + colWidth; return true; } /** * Returns true if this event intersects the selection region. */ boolean eventIntersectsSelection(Event event, Rect selection) { if (event.left < selection.right && event.right >= selection.left && event.top < selection.bottom && event.bottom >= selection.top) { return true; } return false; } /** * Computes the distance from the given point to the given event. */ float pointToEvent(float x, float y, Event event) { float left = event.left; float right = event.right; float top = event.top; float bottom = event.bottom; if (x >= left) { if (x <= right) { if (y >= top) { if (y <= bottom) { // x,y is inside the event rectangle return 0f; } // x,y is below the event rectangle return y - bottom; } // x,y is above the event rectangle return top - y; } // x > right float dx = x - right; if (y < top) { // the upper right corner float dy = top - y; return (float) Math.sqrt(dx * dx + dy * dy); } if (y > bottom) { // the lower right corner float dy = y - bottom; return (float) Math.sqrt(dx * dx + dy * dy); } // x,y is to the right of the event rectangle return dx; } // x < left float dx = left - x; if (y < top) { // the upper left corner float dy = top - y; return (float) Math.sqrt(dx * dx + dy * dy); } if (y > bottom) { // the lower left corner float dy = y - bottom; return (float) Math.sqrt(dx * dx + dy * dy); } // x,y is to the left of the event rectangle return dx; } }