blob: b2f6c3fbe25b6cf0ba4b4c7fc3176d4b42c31912 [file] [log] [blame]
/*
* Copyright (C) 2010 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.gallery3d.ui;
import android.content.Context;
import android.graphics.Rect;
import com.android.gallery3d.ui.PositionRepository.Position;
public class AlbumView implements SlotView.Listener {
private static final String TAG = "AlbumView";
private static final int SLOT_WIDTH = 162;
private static final int SLOT_HEIGHT = 132;
private static final int HORIZONTAL_GAP = 5;
private static final int VERTICAL_GAP = 5;
private final SlotView mSlotView;
private int mVisibleStart = 0;
private int mVisibleEnd = 0;
private AlbumDataAdapter mModel;
public AlbumView(Context context, AlbumDataAdapter model, SlotView slotView) {
mSlotView = slotView;
mModel = model;
mModel.setListener(new MyDataModelListener());
mSlotView.setSlotSize(SLOT_WIDTH, SLOT_HEIGHT);
mSlotView.setSlotCount(model.size());
mSlotView.setSlotGaps(HORIZONTAL_GAP, VERTICAL_GAP);
}
private void putSlotContent(int slotIndex, DisplayItem item) {
Rect rect = mSlotView.getSlotRect(slotIndex);
Position position = new Position(
(rect.left + rect.right) / 2, (rect.top + rect.bottom) / 2, 0);
mSlotView.putDisplayItem(position, item);
}
private void updateVisibleRange(int start, int end) {
if (start == mVisibleStart && end == mVisibleEnd) return;
Log.v(TAG, String.format("visible range: %s - %s", start, end));
if (start >= mVisibleEnd || mVisibleStart >= end) {
for (int i = mVisibleStart, n = mVisibleEnd; i < n; ++i) {
mSlotView.removeDisplayItem(mModel.get(i));
}
mModel.setActiveWindow(start, end);
for (int i = start; i < end; ++i) {
putSlotContent(i, mModel.get(i));
}
} else {
for (int i = mVisibleStart; i < start; ++i) {
mSlotView.removeDisplayItem(mModel.get(i));
}
for (int i = end, n = mVisibleEnd; i < n; ++i) {
mSlotView.removeDisplayItem(mModel.get(i));
}
mModel.setActiveWindow(start, end);
for (int i = start, n = mVisibleStart; i < n; ++i) {
putSlotContent(i, mModel.get(i));
}
for (int i = mVisibleEnd; i < end; ++i) {
putSlotContent(i, mModel.get(i));
}
}
mVisibleStart = start;
mVisibleEnd = end;
}
public void onLayoutChanged(int width, int height) {
updateVisibleRange(0, 0);
updateVisibleRange(mSlotView.getVisibleStart(), mSlotView.getVisibleEnd());
}
public void onScrollPositionChanged(int position) {
updateVisibleRange(mSlotView.getVisibleStart(), mSlotView.getVisibleEnd());
}
private class MyDataModelListener implements AlbumDataAdapter.Listener {
public void onContentInvalidated() {
mSlotView.invalidate();
}
public void onSizeChanged(int size) {
SlotView slotView = mSlotView;
slotView.setSlotCount(size);
updateVisibleRange(
slotView.getVisibleStart(), slotView.getVisibleEnd());
}
public void onWindowContentChanged(
int slotIndex, DisplayItem old, DisplayItem update) {
mSlotView.removeDisplayItem(old);
putSlotContent(slotIndex, update);
}
}
}