if (getEndTime().getTime()
- getStartTime().getTime() > DateConstants.DAYINMILLIS) {
isSeveralDays = true;
- } else { // if difference <= day -> there can be different cases
- if (getStart().compareTo(getEnd()) != 0
- && getEndTime().compareTo(getEnd()) != 0) {
- isSeveralDays = true;
- }
+ } else { // if difference <= day ->
+ isSeveralDays = (getStart().compareTo(getEnd()) != 0)
+ && !((getEndTime().getHours() == 0
+ && getEndTime().getMinutes() == 0));
}
return isSeveralDays;
}
private boolean disabled = false;
private int height;
private final Element[] slotElements;
- private final List<DateCellSlot> slots = new ArrayList<DateCell.DateCellSlot>();
+ private final List<DateCellSlot> slots = new ArrayList<>();
private int[] slotElementHeights;
private int startingSlotHeight;
private Date today;
addStyleName("v-calendar-day-times");
- handlers = new LinkedList<HandlerRegistration>();
+ handlers = new LinkedList<>();
// 2 slots / hour
firstHour = weekgrid.getFirstHour();
}
public void recalculateEventWidths() {
- List<DateCellGroup> groups = new ArrayList<DateCellGroup>();
+ List<DateCellGroup> groups = new ArrayList<>();
int count = getWidgetCount();
- List<Integer> handled = new ArrayList<Integer>();
+ List<Integer> handled = new ArrayList<>();
// Iterate through all events and group them. Events that overlaps
// with each other, are added to the same group.
for (DateCellGroup g : groups) {
int col = 0;
int colCount = 0;
- List<Integer> order = new ArrayList<Integer>();
- Map<Integer, Integer> columns = new HashMap<Integer, Integer>();
+ List<Integer> order = new ArrayList<>();
+ Map<Integer, Integer> columns = new HashMap<>();
for (Integer eventIndex : g.getItems()) {
DateCellDayEvent d = (DateCellDayEvent) getWidget(eventIndex);
d.setMoveWidth(width);
public void addEvent(DateCellDayEvent dayEvent) {
Element main = getElement();
int index = 0;
- List<CalendarEvent> events = new ArrayList<CalendarEvent>();
+ List<CalendarEvent> events = new ArrayList<>();
// events are the only widgets in this panel
// slots are just elements
int eventStartHours = eventStart.getHours();
int eventEndHours = eventEnd.getHours();
+ /*
+ * Special case (#14737): if event end time is 00:00 of the
+ * following day then isTimeOnDifferentDays() returns false
+ * (according to logic of this method), so this case should be
+ * handled here
+ */
+ if (!event.getStart().equals(event.getEnd())
+ && (event.getEndTime().getHours() == 0
+ && event.getEndTime().getMinutes() == 0)) {
+ eventEndHours = 23;
+ }
+
display = !(eventEndHours < firstHour
|| eventStartHours > lastHour);
}
--- /dev/null
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * 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.vaadin.tests.components.calendar;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+
+import com.vaadin.annotations.Theme;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.v7.ui.Calendar;
+import com.vaadin.v7.ui.Calendar.TimeFormat;
+import com.vaadin.v7.ui.components.calendar.event.BasicEvent;
+
+@Theme("tests-calendar")
+public class SetFirstVisibleHourOfDaySpecialCase extends AbstractTestUI {
+
+ private Calendar calendar;
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ calendar = new Calendar();
+
+ try {
+ BasicEvent event = new BasicEvent("EVENT NAME 1", "EVENT TOOLTIP 1",
+ new SimpleDateFormat("yyyy-MM-dd HH:mm")
+ .parse("2013-09-05 16:00"),
+ new SimpleDateFormat("yyyy-MM-dd HH:mm")
+ .parse("2013-09-06 00:00"));
+ event.setStyleName("color1");
+ calendar.addEvent(event);
+ } catch (ParseException e1) { // Nothing to do
+ e1.printStackTrace();
+ }
+
+ try {
+ calendar.setStartDate(
+ new SimpleDateFormat("yyyy-MM-dd").parse("2013-09-01"));
+ calendar.setEndDate(
+ new SimpleDateFormat("yyyy-MM-dd").parse("2013-09-30"));
+ } catch (ParseException e) { // Nothing to do
+
+ }
+
+ calendar.setImmediate(true);
+ calendar.setTimeFormat(TimeFormat.Format24H);
+ calendar.setLocale(new Locale("en", "US"));
+
+ calendar.setFirstVisibleHourOfDay(15);
+
+ addComponent(calendar);
+ calendar.setSizeFull();
+ setSizeFull();
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Calendar week and day views should work correctly when using setFirstVisibleHourOfDay() and "
+ + "setting the end time of event to 00:00 of the following day";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 14737;
+ }
+
+}
--- /dev/null
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * 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.vaadin.tests.components.calendar;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.StaleElementReferenceException;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.parallel.BrowserUtil;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * Tests that calendar week and day views are correct when using
+ * setFirstVisibleHourOfDay() and the end event time is 00:00 of the following
+ * day
+ */
+public class SetFirstVisibleHourOfDaySpecialCaseTest extends MultiBrowserTest {
+
+ @Override
+ protected boolean requireWindowFocusForIE() {
+ return true;
+ }
+
+ @Test
+ public void testDayView() {
+ openTestURL();
+
+ // open day view
+ clickElement("v-calendar-day-number", "5");
+
+ // first of all check if event is present in calendar view
+ waitForElementPresent(By.className("v-calendar-event-content"));
+
+ // check that event has correct height
+ WebElement event = getDriver()
+ .findElement(By.className("v-calendar-event-content"));
+ WebElement dateSlot = getDriver()
+ .findElement(By.className("v-datecellslot"));
+
+ Assert.assertEquals(
+ "The height of shown part of calendar event should be equal to 16 datecell slots",
+ dateSlot.getSize().getHeight() * 16,
+ event.getSize().getHeight());
+ }
+
+ @Test
+ public void testWeekView() {
+ openTestURL();
+
+ // open week view
+ clickElement("v-calendar-week-number", "36");
+
+ // first of all check if event is present in calendar view
+ waitForElementPresent(By.className("v-calendar-event-content"));
+
+ // check that event has correct height
+ WebElement event = getDriver()
+ .findElement(By.className("v-calendar-event-content"));
+ WebElement dateSlot = getDriver()
+ .findElement(By.className("v-datecellslot"));
+
+ Assert.assertEquals(
+ "The height of shown part of calendar event should be equal to 16 datecell slots",
+ dateSlot.getSize().getHeight() * 16,
+ event.getSize().getHeight());
+ }
+
+ private void clickElement(String className, String text) {
+ List<WebElement> elements = findElements(By.className(className));
+
+ boolean found = false;
+ for (WebElement webElement : elements) {
+ if (webElement.getText().equals(text)) {
+ webElement.click();
+ if (BrowserUtil.isIE8(getDesiredCapabilities())) {
+ try {
+ // sometimes the element only gets focus from click and
+ // we need to click the text, which is in the right edge
+ // of the element
+ testBenchElement(webElement)
+ .click(webElement.getSize().getWidth() - 5, 9);
+ } catch (StaleElementReferenceException e) {
+ // the first click succeeded after all
+ }
+ }
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ Assert.fail("Element " + className + " with text " + text
+ + " not found.");
+ }
+ }
+}