Skip to content

Commit 009aa54

Browse files
committed
Merge branch 'pr/34'
2 parents dd8c4f3 + 620a94a commit 009aa54

File tree

1 file changed

+66
-4
lines changed

1 file changed

+66
-4
lines changed

library/src/main/java/com/alamkanak/weekview/WeekView.java

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
/**
3535
* Created by Raquib-ul-Alam Kanak on 7/21/2014.
36-
* Website: http://april-shower.com
36+
* Website: http://alamkanak.me
3737
*/
3838
public class WeekView extends View {
3939

@@ -102,6 +102,8 @@ public class WeekView extends View {
102102
private EventClickListener mEventClickListener;
103103
private EventLongPressListener mEventLongPressListener;
104104
private MonthChangeListener mMonthChangeListener;
105+
private TimeClickListener mTimeClickListener;
106+
105107
private final GestureDetector.SimpleOnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() {
106108

107109
@Override
@@ -148,17 +150,28 @@ else if (mCurrentFlingDirection == Direction.VERTICAL){
148150

149151
@Override
150152
public boolean onSingleTapConfirmed(MotionEvent e) {
153+
// If the tap was on an event then trigger the callback.
151154
if (mEventRects != null && mEventClickListener != null) {
152155
List<EventRect> reversedEventRects = mEventRects;
153156
Collections.reverse(reversedEventRects);
154157
for (EventRect event : reversedEventRects) {
155158
if (event.rectF != null && e.getX() > event.rectF.left && e.getX() < event.rectF.right && e.getY() > event.rectF.top && e.getY() < event.rectF.bottom) {
156159
mEventClickListener.onEventClick(event.originalEvent, event.rectF);
157160
playSoundEffect(SoundEffectConstants.CLICK);
158-
break;
161+
return super.onSingleTapConfirmed(e);
159162
}
160163
}
161164
}
165+
166+
// If the tap was on in an empty space, then trigger the callback.
167+
if (mTimeClickListener != null && e.getX() > mHeaderColumnWidth && e.getY() > (mHeaderTextHeight + mHeaderRowPadding * 2 + mHeaderMarginBottom)) {
168+
Calendar selectedTime = getTimeFromPoint(e.getX(), e.getY());
169+
if (selectedTime != null) {
170+
playSoundEffect(SoundEffectConstants.CLICK);
171+
mTimeClickListener.onTimeClicked(selectedTime);
172+
}
173+
}
174+
162175
return super.onSingleTapConfirmed(e);
163176
}
164177

@@ -375,7 +388,7 @@ private void drawHeaderRowAndEvents(Canvas canvas) {
375388
lineCount = (lineCount) * (mNumberOfVisibleDays+1);
376389
float[] hourLines = new float[lineCount * 4];
377390

378-
// Clear the cache for events rectangles.
391+
// Clear the cache for event rectangles.
379392
if (mEventRects != null) {
380393
for (EventRect eventRect: mEventRects) {
381394
eventRect.rectF = null;
@@ -450,6 +463,37 @@ private void drawHeaderRowAndEvents(Canvas canvas) {
450463

451464
}
452465

466+
/**
467+
* Get the time and date where the user clicked on.
468+
* @param x The x position of the touch event.
469+
* @param y The y position of the touch event.
470+
* @return The time and date at the clicked position.
471+
*/
472+
private Calendar getTimeFromPoint(float x, float y){
473+
int leftDaysWithGaps = (int) -(Math.ceil(mCurrentOrigin.x / (mWidthPerDay + mColumnGap)));
474+
float startPixel = mCurrentOrigin.x + (mWidthPerDay + mColumnGap) * leftDaysWithGaps +
475+
mHeaderColumnWidth;
476+
for (int dayNumber = leftDaysWithGaps + 1;
477+
dayNumber <= leftDaysWithGaps + mNumberOfVisibleDays + 1;
478+
dayNumber++) {
479+
float start = (startPixel < mHeaderColumnWidth ? mHeaderColumnWidth : startPixel);
480+
if (mWidthPerDay + startPixel - start> 0
481+
&& x>start && x<startPixel + mWidthPerDay){
482+
Calendar day = (Calendar) mToday.clone();
483+
day.add(Calendar.DATE, dayNumber - 1);
484+
float pixelsFromZero = y - mCurrentOrigin.y - mHeaderTextHeight
485+
- mHeaderRowPadding * 2 - mTimeTextHeight/2 - mHeaderMarginBottom;
486+
int hour = (int)(pixelsFromZero / mHourHeight);
487+
int minute = (int) (60 * (pixelsFromZero - hour * mHourHeight) / mHourHeight);
488+
day.add(Calendar.HOUR, hour);
489+
day.set(Calendar.MINUTE, minute);
490+
return day;
491+
}
492+
startPixel += mWidthPerDay + mColumnGap;
493+
}
494+
return null;
495+
}
496+
453497
/**
454498
* Draw all the events of a particular day.
455499
* @param date The day.
@@ -660,13 +704,17 @@ private void getMoreEvents(Calendar day) {
660704
}
661705
}
662706

707+
/**
708+
* Cache the event for smooth scrolling functionality.
709+
* @param event The event to cache.
710+
*/
663711
private void cacheEvent(WeekViewEvent event) {
664712
if (!isSameDay(event.getStartTime(), event.getEndTime())) {
665713
Calendar endTime = (Calendar) event.getStartTime().clone();
666714
endTime.set(Calendar.HOUR_OF_DAY, 23);
667715
endTime.set(Calendar.MINUTE, 59);
668716
Calendar startTime = (Calendar) event.getEndTime().clone();
669-
startTime.set(Calendar.HOUR_OF_DAY, 00);
717+
startTime.set(Calendar.HOUR_OF_DAY, 0);
670718
startTime.set(Calendar.MINUTE, 0);
671719
WeekViewEvent event1 = new WeekViewEvent(event.getId(), event.getName(), event.getStartTime(), endTime);
672720
event1.setColor(event.getColor());
@@ -869,6 +917,15 @@ public void setEventLongPressListener(EventLongPressListener eventLongPressListe
869917
this.mEventLongPressListener = eventLongPressListener;
870918
}
871919

920+
public TimeClickListener getHourClickListener(){
921+
return mTimeClickListener;
922+
}
923+
924+
public void setHourClickListener(TimeClickListener mTimeClickListener){
925+
this.mTimeClickListener = mTimeClickListener;
926+
}
927+
928+
872929
/**
873930
* Get the number of visible days in a week.
874931
* @return The number of visible days in a week.
@@ -1275,6 +1332,11 @@ public interface EventLongPressListener {
12751332
public void onEventLongPress(WeekViewEvent event, RectF eventRect);
12761333
}
12771334

1335+
public interface TimeClickListener {
1336+
public void onTimeClicked(Calendar time);
1337+
}
1338+
1339+
12781340
/////////////////////////////////////////////////////////////////
12791341
//
12801342
// Helper methods.

0 commit comments

Comments
 (0)