package com.arpitonline.freeflow.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.comcast.freeflow.core.FreeFlowItem; import com.comcast.freeflow.core.Section; import com.comcast.freeflow.core.SectionedAdapter; import com.comcast.freeflow.layouts.FreeFlowLayout; import com.comcast.freeflow.layouts.FreeFlowLayout.FreeFlowLayoutParams; import com.comcast.freeflow.layouts.FreeFlowLayoutBase; import com.comcast.freeflow.utils.ViewUtils; public class DribbbleQuiltLayout extends FreeFlowLayoutBase implements FreeFlowLayout { private static final String TAG = "ArtbookLayout"; private int largeItemWidth; private int largeItemHeight; private int regularItemWidth; private int regularItemHeight; @Override public void setDimensions(int measuredWidth, int measuredHeight) { super.setDimensions(measuredWidth, measuredHeight); largeItemWidth = measuredWidth / 2; largeItemHeight = (int)(0.75 * largeItemWidth); regularItemWidth = measuredWidth / 4; regularItemHeight = ((int)(0.75 * regularItemWidth)); } 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 * largeItemHeight; r.right = largeItemWidth; r.bottom = r.top + largeItemHeight; if(rowIndex % 2 != 0){ r.offset(largeItemWidth, 0); } break; case (1): r.left = largeItemWidth; r.right = largeItemWidth + regularItemWidth; r.top = rowIndex * largeItemHeight; r.bottom = r.top + regularItemHeight; if(rowIndex % 2 != 0){ r.offset(-largeItemWidth, 0); } break; case (2): r.left = 3 * regularItemWidth; r.right = width; r.top = rowIndex * largeItemHeight; r.bottom = r.top + regularItemHeight; if(rowIndex % 2 != 0){ r.offset(-largeItemWidth, 0); } break; case (3): r.left = largeItemWidth; r.right = largeItemWidth + regularItemWidth; r.top = rowIndex * largeItemHeight + regularItemHeight; r.bottom = r.top + regularItemHeight; if(rowIndex % 2 != 0){ r.offset(-largeItemWidth, 0); } break; case (4): r.left = 3 * regularItemWidth; r.right = width; r.top = rowIndex * largeItemHeight + regularItemHeight; r.bottom = r.top + regularItemHeight; if(rowIndex % 2 != 0){ r.offset(-largeItemWidth, 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 * largeItemHeight; } @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; } }