/* * Copyright (C) 2008 Romain Guy * * 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 org.ebookdroid.ui.library.views; import org.sufficientlysecure.viewer.R; import org.ebookdroid.common.bitmaps.BitmapManager; import org.ebookdroid.ui.library.IBrowserActivity; import org.ebookdroid.ui.library.adapters.BookNode; import org.ebookdroid.ui.library.adapters.BookShelfAdapter; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.drawable.StateListDrawable; import android.net.Uri; import android.util.TypedValue; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; import java.io.File; import java.util.Calendar; import java.util.GregorianCalendar; import org.emdev.ui.drawable.SpotlightDrawable; import org.emdev.ui.drawable.TransitionDrawable; import org.emdev.utils.LayoutUtils; public class BookshelfView extends GridView implements OnItemClickListener { private static Bitmap mShelfBackground; private static Bitmap mShelfBackgroundLeft; private static Bitmap mShelfBackgroundRight; private static int mShelfWidth; private static int mShelfHeight; private static final Decoration web; private static final Decoration pine; private final IBrowserActivity base; private final BookShelfAdapter adapter; private final Calendar now; final String path; static { final Bitmap shelfBackground = BitmapManager.getResource(R.drawable.recent_bookcase_shelf_panel); if (shelfBackground != null) { mShelfWidth = shelfBackground.getWidth(); mShelfHeight = shelfBackground.getHeight(); mShelfBackground = shelfBackground; } mShelfBackgroundLeft = BitmapManager.getResource(R.drawable.recent_bookcase_shelf_panel_left); mShelfBackgroundRight = BitmapManager.getResource(R.drawable.recent_bookcase_shelf_panel_right); web = new Decoration(R.drawable.recent_bookcase_web_left, R.drawable.recent_bookcase_web_right, 15, 15); pine = new Decoration(R.drawable.recent_bookcase_pine_left, R.drawable.recent_bookcase_pine_right, 0, 0); } public BookshelfView(final IBrowserActivity base, final View shelves, final BookShelfAdapter adapter) { super(base.getContext()); this.now = new GregorianCalendar(); this.base = base; this.adapter = adapter; this.path = adapter != null ? adapter.getPath() : ""; setCacheColorHint(0); setSelector(android.R.color.transparent); setNumColumns(AUTO_FIT); setStretchMode(STRETCH_SPACING); if (adapter != null) { setAdapter(adapter); } LayoutUtils.fillInParent(shelves, this); final Resources r = getResources(); final float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 160, r.getDisplayMetrics()); setColumnWidth((int) px); init(base.getContext()); setOnItemClickListener(this); base.getActivity().registerForContextMenu(this); } private void init(final Context context) { final StateListDrawable selector = new StateListDrawable(); final SpotlightDrawable start = new SpotlightDrawable(context, this); start.disableOffset(); final SpotlightDrawable end = new SpotlightDrawable(context, this, R.drawable.components_spotlight_blue); end.disableOffset(); final TransitionDrawable transition = new TransitionDrawable(start, end); selector.addState(new int[] { android.R.attr.state_pressed }, transition); final SpotlightDrawable normal = new SpotlightDrawable(context, this); selector.addState(new int[] {}, normal); normal.setParent(selector); transition.setParent(selector); setSelector(selector); setDrawSelectorOnTop(false); } @Override protected void dispatchDraw(final Canvas canvas) { final int count = getChildCount(); int top = count > 0 ? getChildAt(0).getTop() : 0; final int shelfWidth = mShelfWidth; final int shelfHeight = mShelfHeight; final int width = getWidth(); final int height = getHeight(); for (int y = top; y < height; y += shelfHeight) { for (int x = 0; x < width; x += shelfWidth) { canvas.drawBitmap(mShelfBackground, x, y, null); } canvas.drawBitmap(mShelfBackgroundLeft, 0, y, null); canvas.drawBitmap(mShelfBackgroundRight, width - 15, y, null); } top = (count > 0) ? getChildAt(count - 1).getTop() + shelfHeight : 0; drawDecorations(canvas, top, shelfHeight, width); super.dispatchDraw(canvas); } public void drawDecorations(final Canvas canvas, final int top, final int shelfHeight, final int width) { now.setTimeInMillis(System.currentTimeMillis()); final int date = now.get(Calendar.DATE); final int month = now.get(Calendar.MONTH); if ((date >= 23 && month == Calendar.DECEMBER) || (date <= 13 && month == Calendar.JANUARY)) { pine.draw(canvas, top, shelfHeight, width); } else { web.draw(canvas, top, shelfHeight, width); } } @Override public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) { final BookNode node = adapter != null ? (BookNode) adapter.getItem(position) : null; if (node != null) { final File file = new File(node.path); if (!file.isDirectory()) { base.showDocument(Uri.fromFile(file), null); } } } @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { if (adapter != null) { adapter.measuring = true; } super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (adapter != null) { adapter.measuring = false; } } private static class Decoration { final Bitmap left; final Bitmap right; final int lOffset; final int rOffset; public Decoration(int leftId, int rightId, int leftOffset, int rightOffset) { this.left = BitmapManager.getResource(leftId); this.right = BitmapManager.getResource(rightId); this.lOffset = leftOffset; this.rOffset = right.getWidth() + rightOffset; } public void draw(final Canvas canvas, final int top, final int shelfHeight, final int width) { canvas.drawBitmap(left, lOffset, top + 1, null); canvas.drawBitmap(right, width - rOffset, top + shelfHeight + 1, null); } } }