/******************************************************************************* * Copyright 2013 Comcast Cable Communications Management, LLC * * 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.marshalchen.common.demoofui.artbook.layouts; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import android.graphics.Rect; import android.util.Log; import com.marshalchen.common.uimodule.freeflow.core.FreeFlowItem; import com.marshalchen.common.uimodule.freeflow.core.Section; import com.marshalchen.common.uimodule.freeflow.core.SectionedAdapter; import com.marshalchen.common.uimodule.freeflow.layouts.FreeFlowLayout; import com.marshalchen.common.uimodule.freeflow.layouts.FreeFlowLayout.FreeFlowLayoutParams; import com.marshalchen.common.uimodule.freeflow.layouts.FreeFlowLayoutBase; import com.marshalchen.common.uimodule.freeflow.utils.ViewUtils; public class ArtbookLayout extends FreeFlowLayoutBase implements FreeFlowLayout { private static final String TAG = "ArtbookLayout"; private int largeItemSide; private int regularItemSide; @Override public void setDimensions(int measuredWidth, int measuredHeight) { super.setDimensions(measuredWidth, measuredHeight); largeItemSide = measuredWidth / 2; regularItemSide = measuredWidth / 4; } private HashMap<Object, FreeFlowItem> map; private Section s; @Override public void prepareLayout(){ Log.d(TAG, "prepare layout!!!"); map = new HashMap<Object, FreeFlowItem>(); s = itemsAdapter.getSection(0); int rowIndex; Log.d(TAG, "prepare layout for: "+s.getDataCount()); for (int i = 0; i < s.getDataCount(); i++) { rowIndex = i / 5; FreeFlowItem p = new FreeFlowItem(); p.isHeader = false; p.itemIndex = i; p.itemSection = 0; p.data = s.getDataAtIndex(i); Rect r = new Rect(); switch (i % 5) { case (0): r.left = 0; r.top = rowIndex * largeItemSide; r.right = largeItemSide; r.bottom = r.top + largeItemSide; if(rowIndex % 2 != 0){ r.offset(largeItemSide, 0); } break; case (1): r.left = largeItemSide; r.right = largeItemSide + regularItemSide; r.top = rowIndex * largeItemSide; r.bottom = r.top + regularItemSide; if(rowIndex % 2 != 0){ r.offset(-largeItemSide, 0); } break; case (2): r.left = 3 * regularItemSide; r.right = width; r.top = rowIndex * largeItemSide; r.bottom = r.top + regularItemSide; if(rowIndex % 2 != 0){ r.offset(-largeItemSide, 0); } break; case (3): r.left = largeItemSide; r.right = largeItemSide + regularItemSide; r.top = rowIndex * largeItemSide + regularItemSide; r.bottom = r.top + regularItemSide; if(rowIndex % 2 != 0){ r.offset(-largeItemSide, 0); } break; case (4): r.left = 3 * regularItemSide; r.right = width; r.top = rowIndex * largeItemSide + regularItemSide; r.bottom = r.top + regularItemSide; if(rowIndex % 2 != 0){ r.offset(-largeItemSide, 0); } break; default: break; } p.frame = r; map.put(s.getDataAtIndex(i), p); } } @Override public HashMap<Object, FreeFlowItem> getItemProxies( int viewPortLeft, int viewPortTop) { Rect viewport = new Rect(viewPortLeft, viewPortTop, viewPortLeft + width, viewPortTop + height); //Log.d(TAG, "Viewport: "+viewPortLeft+", "+viewPortTop+", "+viewport.width()+","+viewport.height()); HashMap<Object, FreeFlowItem> ret = new HashMap<Object, FreeFlowItem>(); Iterator<Entry<Object, FreeFlowItem>> it = map.entrySet().iterator(); while (it.hasNext()) { Entry<Object, FreeFlowItem> pairs = it.next(); FreeFlowItem p = (FreeFlowItem) pairs.getValue(); if ( Rect.intersects(p.frame, viewport) ) { ret.put(pairs.getKey(), p); } } return ret; } @Override public FreeFlowItem getFreeFlowItemForItem(Object item) { Log.d(TAG, " returing item: " + map.get(item)); return map.get(item); } @Override public int getContentWidth() { return 0; } @Override public int getContentHeight() { return s.getDataCount() / 5 * largeItemSide; } @Override public FreeFlowItem getItemAt(float x, float y) { return (FreeFlowItem) ViewUtils.getItemAt(map, (int) x, (int) y); } @Override public void setLayoutParams(FreeFlowLayoutParams params) { // TODO Auto-generated method stub } @Override public boolean verticalScrollEnabled() { return true; } @Override public boolean horizontalScrollEnabled(){ return false; } }