/*
 * 版权所有 (c) 2010-2011，The MiCode Open Source Community (www.micode.net)
 *
 * 本软件根据 Apache 许可证 2.0 版（"许可证"）发布；
 * 除非符合许可证，否则不得使用此文件。
 * 您可以在以下网址获取许可证副本：
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 * 除非法律要求或书面同意，软件
 * 根据许可证分发的内容按"原样"提供，
 * 不附带任何明示或暗示的保证或条件。
 * 请参阅许可证，了解有关权限和限制的具体语言。
 */

package net.micode.notes.ui;

import android.content.Context;
import android.database.Cursor;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;

import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;

/**
 * 文件夹列表适配器（用于显示笔记文件夹列表）
 * 功能：
 * 1. 将数据库中的文件夹数据映射到列表项视图
 * 2. 处理特殊文件夹（如根文件夹）的显示逻辑
 * 3. 提供获取文件夹名称的接口方法
 */
public class FoldersListAdapter extends CursorAdapter {
    // 查询投影：定义从数据库查询的字段
    public static final String [] PROJECTION = {
        NoteColumns.ID,        // 文件夹ID
        NoteColumns.SNIPPET    // 文件夹名称（此处Snippet用作文件夹名称）
    };

    // 列索引常量（用于快速访问Cursor中的数据）
    public static final int ID_COLUMN   = 0;
    public static final int NAME_COLUMN = 1;

    /**
     * 构造方法：初始化适配器
     * @param context 上下文
     * @param c 包含文件夹数据的Cursor
     */
    public FoldersListAdapter(Context context, Cursor c) {
        super(context, c, 0); // 调用父类构造方法，传递Cursor
    }

    /**
     * 创建新的列表项视图
     * @param context 上下文
     * @param cursor 当前数据Cursor
     * @param parent 父视图组
     * @return 新创建的列表项视图
     */
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return new FolderListItem(context); // 创建自定义文件夹列表项视图
    }

    /**
     * 将数据绑定到已创建的视图
     * @param view 要绑定数据的视图
     * @param context 上下文
     * @param cursor 包含数据的Cursor
     */
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        if (view instanceof FolderListItem) {
            // 获取文件夹名称（特殊处理根文件夹）
            String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER)
                    ? context.getString(R.string.menu_move_parent_folder)  // 根文件夹显示特定名称
                    : cursor.getString(NAME_COLUMN);                       // 普通文件夹显示数据库中的名称

            ((FolderListItem) view).bind(folderName); // 绑定文件夹名称到视图
        }
    }

    /**
     * 获取指定位置的文件夹名称
     * @param context 上下文
     * @param position 列表位置
     * @return 文件夹名称
     */
    public String getFolderName(Context context, int position) {
        Cursor cursor = (Cursor) getItem(position);
        return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER)
                ? context.getString(R.string.menu_move_parent_folder)
                : cursor.getString(NAME_COLUMN);
    }

    /**
     * 文件夹列表项视图（自定义LinearLayout）
     * 功能：
     * 1. 加载列表项布局
     * 2. 提供绑定文件夹名称的方法
     */
    private class FolderListItem extends LinearLayout {
        private TextView mName; // 文件夹名称显示文本框

        public FolderListItem(Context context) {
            super(context);
            // 加载列表项布局并添加到当前视图
            inflate(context, R.layout.folder_list_item, this);
            mName = findViewById(R.id.tv_folder_name); // 初始化名称文本框
        }

        /**
         * 绑定文件夹名称到视图
         * @param name 文件夹名称
         */
        public void bind(String name) {
            mName.setText(name); // 设置文件夹名称
        }
    }
}