summaryrefslogtreecommitdiffstats
path: root/src/com/android/calendar/agenda/AgendaListView.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/calendar/agenda/AgendaListView.java')
-rw-r--r--src/com/android/calendar/agenda/AgendaListView.java215
1 files changed, 215 insertions, 0 deletions
diff --git a/src/com/android/calendar/agenda/AgendaListView.java b/src/com/android/calendar/agenda/AgendaListView.java
new file mode 100644
index 00000000..ebf756f2
--- /dev/null
+++ b/src/com/android/calendar/agenda/AgendaListView.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2009 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.agenda;
+
+import com.android.calendar.CalendarController;
+import com.android.calendar.CalendarController.EventType;
+import com.android.calendar.DeleteEventHelper;
+import com.android.calendar.agenda.AgendaAdapter.ViewHolder;
+import com.android.calendar.agenda.AgendaWindowAdapter.EventInfo;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.text.format.Time;
+import android.util.Log;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.AdapterView.OnItemClickListener;
+
+public class AgendaListView extends ListView implements OnItemClickListener {
+
+ private static final String TAG = "AgendaListView";
+ private static final boolean DEBUG = false;
+
+ private AgendaWindowAdapter mWindowAdapter;
+ private DeleteEventHelper mDeleteEventHelper;
+ private Context mContext;
+
+
+ public AgendaListView(Context context) {
+ super(context, null);
+ mContext = context;
+ setOnItemClickListener(this);
+ setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+ setVerticalScrollBarEnabled(false);
+ mWindowAdapter = new AgendaWindowAdapter(context, this);
+ setAdapter(mWindowAdapter);
+ mDeleteEventHelper =
+ new DeleteEventHelper(context, null, false /* don't exit when done */);
+ }
+
+ @Override protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ mWindowAdapter.close();
+ }
+
+ // Implementation of the interface OnItemClickListener
+ public void onItemClick(AdapterView<?> a, View v, int position, long id) {
+ if (id != -1) {
+ // Switch to the EventInfo view
+ EventInfo event = mWindowAdapter.getEventByPosition(position);
+ if (event != null) {
+ CalendarController.getInstance(mContext).sendEventRelatedEvent(this,
+ EventType.VIEW_EVENT, event.id, event.begin, event.end, 0, 0);
+ }
+ }
+ }
+
+ public void goTo(Time time, String searchQuery, boolean forced) {
+ if (time == null) {
+ time = new Time();
+ long goToTime = getFirstVisibleTime();
+ if (goToTime <= 0) {
+ goToTime = System.currentTimeMillis();
+ }
+ time.set(goToTime);
+ }
+ mWindowAdapter.refresh(time, searchQuery, forced);
+ }
+
+ public void refresh(boolean forced) {
+ Time time = new Time();
+ long goToTime = getFirstVisibleTime();
+ if (goToTime <= 0) {
+ goToTime = System.currentTimeMillis();
+ }
+ time.set(goToTime);
+ mWindowAdapter.refresh(time, null, forced);
+ }
+
+ public void deleteSelectedEvent() {
+ int position = getSelectedItemPosition();
+ EventInfo event = mWindowAdapter.getEventByPosition(position);
+ if (event != null) {
+ mDeleteEventHelper.delete(event.begin, event.end, event.id, -1);
+ }
+ }
+
+ @Override
+ public int getFirstVisiblePosition() {
+ // TODO File bug!
+ // getFirstVisiblePosition doesn't always return the first visible
+ // item. Sometimes, it is above the visible one.
+ // instead. I loop through the viewgroup children and find the first
+ // visible one. BTW, getFirstVisiblePosition() == getChildAt(0). I
+ // am not looping through the entire list.
+ View v = getFirstVisibleView();
+ if (v != null) {
+ if (DEBUG) {
+ Log.v(TAG, "getFirstVisiblePosition: " + AgendaWindowAdapter.getViewTitle(v));
+ }
+ return getPositionForView(v);
+ }
+ return -1;
+ }
+
+ public View getFirstVisibleView() {
+ Rect r = new Rect();
+ int childCount = getChildCount();
+ for (int i = 0; i < childCount; ++i) {
+ View listItem = getChildAt(i);
+ listItem.getLocalVisibleRect(r);
+ if (r.top >= 0) { // if visible
+ return listItem;
+ }
+ }
+ return null;
+ }
+
+ public long getSelectedTime() {
+ int position = getSelectedItemPosition();
+ if (position >= 0) {
+ EventInfo event = mWindowAdapter.getEventByPosition(position);
+ if (event != null) {
+ return event.begin;
+ }
+ }
+ return getFirstVisibleTime();
+ }
+
+ public long getFirstVisibleTime() {
+ int position = getFirstVisiblePosition();
+ if (DEBUG) {
+ Log.v(TAG, "getFirstVisiblePosition = " + position);
+ }
+
+ EventInfo event = mWindowAdapter.getEventByPosition(position);
+ if (event != null) {
+ return event.begin;
+ }
+ return 0;
+ }
+
+ // Move the currently selected or visible focus down by offset amount.
+ // offset could be negative.
+ public void shiftSelection(int offset) {
+ shiftPosition(offset);
+ int position = getSelectedItemPosition();
+ if (position != INVALID_POSITION) {
+ setSelectionFromTop(position + offset, 0);
+ }
+ }
+
+ private void shiftPosition(int offset) {
+ if (DEBUG) {
+ Log.v(TAG, "Shifting position "+ offset);
+ }
+
+ View firstVisibleItem = getFirstVisibleView();
+
+ if (firstVisibleItem != null) {
+ Rect r = new Rect();
+ firstVisibleItem.getLocalVisibleRect(r);
+ // if r.top is < 0, getChildAt(0) and getFirstVisiblePosition() is
+ // returning an item above the first visible item.
+ int position = getPositionForView(firstVisibleItem);
+ setSelectionFromTop(position + offset, r.top > 0 ? -r.top : r.top);
+ if (DEBUG) {
+ if (firstVisibleItem.getTag() instanceof AgendaAdapter.ViewHolder) {
+ ViewHolder viewHolder = (AgendaAdapter.ViewHolder)firstVisibleItem.getTag();
+ Log.v(TAG, "Shifting from " + position + " by " + offset + ". Title "
+ + viewHolder.title.getText());
+ } else if (firstVisibleItem.getTag() instanceof AgendaByDayAdapter.ViewHolder) {
+ AgendaByDayAdapter.ViewHolder viewHolder =
+ (AgendaByDayAdapter.ViewHolder)firstVisibleItem.getTag();
+ Log.v(TAG, "Shifting from " + position + " by " + offset + ". Date "
+ + viewHolder.dateView.getText());
+ } else if (firstVisibleItem instanceof TextView) {
+ Log.v(TAG, "Shifting: Looking at header here. " + getSelectedItemPosition());
+ }
+ }
+ } else if (getSelectedItemPosition() >= 0) {
+ if (DEBUG) {
+ Log.v(TAG, "Shifting selection from " + getSelectedItemPosition() + " by " + offset);
+ }
+ setSelection(getSelectedItemPosition() + offset);
+ }
+ }
+
+ public void setHideDeclinedEvents(boolean hideDeclined) {
+ mWindowAdapter.setHideDeclinedEvents(hideDeclined);
+ }
+
+ public void onResume() {
+ mWindowAdapter.notifyDataSetChanged();
+ }
+ public void onPause() {
+ mWindowAdapter.notifyDataSetInvalidated();
+ }
+}