]> source.dussan.org Git - vaadin-framework.git/blob
a8fb302443032698bb80695c4288646eb9c5a913
[vaadin-framework.git] /
1 /*
2  * Copyright 2000-2018 Vaadin Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5  * use this file except in compliance with the License. You may obtain a copy of
6  * the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations under
14  * the License.
15  */
16 package com.vaadin.v7.client.ui.calendar.schedule.dd;
17
18 import com.google.gwt.dom.client.Element;
19 import com.google.gwt.user.client.DOM;
20 import com.vaadin.client.WidgetUtil;
21 import com.vaadin.client.ui.dd.VAcceptCallback;
22 import com.vaadin.client.ui.dd.VDragEvent;
23 import com.vaadin.v7.client.ui.calendar.CalendarConnector;
24 import com.vaadin.v7.client.ui.calendar.schedule.DateCell;
25 import com.vaadin.v7.client.ui.calendar.schedule.DateCellDayEvent;
26
27 /**
28  * Handles DD when the weekly view is showing in the Calendar. In the weekly
29  * view, drops are only allowed in the the time slots for each day. The slot
30  * index and the day index are included in the drop details sent to the server.
31  *
32  * @since 7.1
33  * @author Vaadin Ltd.
34  */
35 public class CalendarWeekDropHandler extends CalendarDropHandler {
36
37     private Element currentTargetElement;
38     private DateCell currentTargetDay;
39
40     public CalendarWeekDropHandler(CalendarConnector connector) {
41         super(connector);
42     }
43
44     /*
45      * (non-Javadoc)
46      *
47      * @see
48      * com.vaadin.terminal.gwt.client.ui.dd.VAbstractDropHandler#dragAccepted
49      * (com.vaadin.terminal.gwt.client.ui.dd.VDragEvent)
50      */
51     @Override
52     protected void dragAccepted(VDragEvent drag) {
53         deEmphasis();
54         currentTargetElement = drag.getElementOver();
55         currentTargetDay = WidgetUtil.findWidget(currentTargetElement,
56                 DateCell.class);
57         emphasis();
58     }
59
60     /**
61      * Removes the CSS style name from the emphasized element
62      */
63     private void deEmphasis() {
64         if (currentTargetElement != null) {
65             currentTargetDay.removeEmphasisStyle(currentTargetElement);
66             currentTargetElement = null;
67         }
68     }
69
70     /**
71      * Add a CSS stylen name to current target element
72      */
73     private void emphasis() {
74         currentTargetDay.addEmphasisStyle(currentTargetElement);
75     }
76
77     /*
78      * (non-Javadoc)
79      *
80      * @see
81      * com.vaadin.terminal.gwt.client.ui.dd.VAbstractDropHandler#dragOver(com
82      * .vaadin.terminal.gwt.client.ui.dd.VDragEvent)
83      */
84     @Override
85     public void dragOver(final VDragEvent drag) {
86         if (isLocationValid(drag.getElementOver())) {
87             validate(new VAcceptCallback() {
88                 @Override
89                 public void accepted(VDragEvent event) {
90                     dragAccepted(drag);
91                 }
92             }, drag);
93         }
94     }
95
96     /**
97      * Checks if the location is a valid drop location
98      *
99      * @param elementOver
100      *            The element to check
101      * @return
102      */
103     private boolean isLocationValid(Element elementOver) {
104         Element weekGridElement = calendarConnector.getWidget().getWeekGrid()
105                 .getElement();
106         Element timeBarElement = calendarConnector.getWidget().getWeekGrid()
107                 .getTimeBar().getElement();
108
109         Element todayBarElement = null;
110         if (calendarConnector.getWidget().getWeekGrid().hasToday()) {
111             todayBarElement = calendarConnector.getWidget().getWeekGrid()
112                     .getDateCellOfToday().getTodaybarElement();
113         }
114
115         // drops are not allowed in:
116         // - weekday header
117         // - allday event list
118         // - todaybar
119         // - timebar
120         // - events
121         return DOM.isOrHasChild(weekGridElement, elementOver)
122                 && !DOM.isOrHasChild(timeBarElement, elementOver)
123                 && todayBarElement != elementOver
124                 && (WidgetUtil.findWidget(elementOver,
125                         DateCellDayEvent.class) == null);
126     }
127
128     /*
129      * (non-Javadoc)
130      *
131      * @see
132      * com.vaadin.terminal.gwt.client.ui.dd.VAbstractDropHandler#dragEnter(com
133      * .vaadin.terminal.gwt.client.ui.dd.VDragEvent)
134      */
135     @Override
136     public void dragEnter(VDragEvent drag) {
137         // NOOP, we determine drag acceptance in dragOver
138     }
139
140     /*
141      * (non-Javadoc)
142      *
143      * @see
144      * com.vaadin.terminal.gwt.client.ui.dd.VAbstractDropHandler#drop(com.vaadin
145      * .terminal.gwt.client.ui.dd.VDragEvent)
146      */
147     @Override
148     public boolean drop(VDragEvent drag) {
149         if (isLocationValid(drag.getElementOver())) {
150             updateDropDetails(drag);
151             deEmphasis();
152             return super.drop(drag);
153
154         } else {
155             deEmphasis();
156             return false;
157         }
158     }
159
160     /**
161      * Update the drop details sent to the server
162      *
163      * @param drag
164      *            The drag event
165      */
166     private void updateDropDetails(VDragEvent drag) {
167         int slotIndex = currentTargetDay.getSlotIndex(currentTargetElement);
168         int dayIndex = calendarConnector.getWidget().getWeekGrid()
169                 .getDateCellIndex(currentTargetDay);
170
171         drag.getDropDetails().put("dropDayIndex", dayIndex);
172         drag.getDropDetails().put("dropSlotIndex", slotIndex);
173     }
174
175     /*
176      * (non-Javadoc)
177      *
178      * @see
179      * com.vaadin.terminal.gwt.client.ui.dd.VAbstractDropHandler#dragLeave(com
180      * .vaadin.terminal.gwt.client.ui.dd.VDragEvent)
181      */
182     @Override
183     public void dragLeave(VDragEvent drag) {
184         deEmphasis();
185         super.dragLeave(drag);
186     }
187 }