]> source.dussan.org Git - vaadin-framework.git/blob
a7c1741eb13b39498875a5d4110b35bc7d404447
[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.SimpleDayCell;
25
26 /**
27  * Handles DD when the monthly view is showing in the Calendar. In the monthly
28  * view, drops are only allowed in the the day cells. Only the day index is
29  * included in the drop details sent to the server.
30  *
31  * @since 7.1
32  * @author Vaadin Ltd.
33  */
34 public class CalendarMonthDropHandler extends CalendarDropHandler {
35
36     public CalendarMonthDropHandler(CalendarConnector connector) {
37         super(connector);
38     }
39
40     private Element currentTargetElement;
41     private SimpleDayCell currentTargetDay;
42
43     /*
44      * (non-Javadoc)
45      *
46      * @see
47      * com.vaadin.terminal.gwt.client.ui.dd.VAbstractDropHandler#dragAccepted
48      * (com.vaadin.terminal.gwt.client.ui.dd.VDragEvent)
49      */
50     @Override
51     protected void dragAccepted(VDragEvent drag) {
52         deEmphasis();
53         currentTargetElement = drag.getElementOver();
54         currentTargetDay = WidgetUtil.findWidget(currentTargetElement,
55                 SimpleDayCell.class);
56         emphasis();
57     }
58
59     /**
60      * Removed the emphasis CSS style name from the currently emphasized day
61      */
62     private void deEmphasis() {
63         if (currentTargetElement != null && currentTargetDay != null) {
64             currentTargetDay.removeEmphasisStyle();
65             currentTargetElement = null;
66         }
67     }
68
69     /**
70      * Add CSS style name for the currently emphasized day
71      */
72     private void emphasis() {
73         if (currentTargetElement != null && currentTargetDay != null) {
74             currentTargetDay.addEmphasisStyle();
75         }
76     }
77
78     /*
79      * (non-Javadoc)
80      *
81      * @see
82      * com.vaadin.terminal.gwt.client.ui.dd.VAbstractDropHandler#dragOver(com
83      * .vaadin.terminal.gwt.client.ui.dd.VDragEvent)
84      */
85     @Override
86     public void dragOver(final VDragEvent drag) {
87         if (isLocationValid(drag.getElementOver())) {
88             validate(new VAcceptCallback() {
89                 @Override
90                 public void accepted(VDragEvent event) {
91                     dragAccepted(drag);
92                 }
93             }, drag);
94         }
95     }
96
97     /**
98      * Checks if the one can perform a drop in a element
99      *
100      * @param elementOver
101      *            The element to check
102      * @return
103      */
104     private boolean isLocationValid(Element elementOver) {
105         Element monthGridElement = calendarConnector.getWidget().getMonthGrid()
106                 .getElement();
107
108         // drops are not allowed in:
109         // - weekday header
110         // - week number bart
111         return DOM.isOrHasChild(monthGridElement, elementOver);
112     }
113
114     /*
115      * (non-Javadoc)
116      *
117      * @see
118      * com.vaadin.terminal.gwt.client.ui.dd.VAbstractDropHandler#dragEnter(com
119      * .vaadin.terminal.gwt.client.ui.dd.VDragEvent)
120      */
121     @Override
122     public void dragEnter(VDragEvent drag) {
123         // NOOP, we determine drag acceptance in dragOver
124     }
125
126     /*
127      * (non-Javadoc)
128      *
129      * @see
130      * com.vaadin.terminal.gwt.client.ui.dd.VAbstractDropHandler#drop(com.vaadin
131      * .terminal.gwt.client.ui.dd.VDragEvent)
132      */
133     @Override
134     public boolean drop(VDragEvent drag) {
135         if (isLocationValid(drag.getElementOver())) {
136             updateDropDetails(drag);
137             deEmphasis();
138             return super.drop(drag);
139
140         } else {
141             deEmphasis();
142             return false;
143         }
144     }
145
146     /**
147      * Updates the drop details sent to the server
148      *
149      * @param drag
150      *            The drag event
151      */
152     private void updateDropDetails(VDragEvent drag) {
153         int dayIndex = calendarConnector.getWidget().getMonthGrid()
154                 .getDayCellIndex(currentTargetDay);
155
156         drag.getDropDetails().put("dropDayIndex", dayIndex);
157     }
158
159     /*
160      * (non-Javadoc)
161      *
162      * @see
163      * com.vaadin.terminal.gwt.client.ui.dd.VAbstractDropHandler#dragLeave(com
164      * .vaadin.terminal.gwt.client.ui.dd.VDragEvent)
165      */
166     @Override
167     public void dragLeave(VDragEvent drag) {
168         deEmphasis();
169         super.dragLeave(drag);
170     }
171 }