/*
 * 版权所有 (c) 2010-2011，MiCode 开源社区 (www.micode.net)
 * 根据 Apache 许可证 2.0 版本（"许可证"）授权；
 * 除非符合许可证的规定，否则不得使用本文件。
 * 您可以从以下网址获取许可证副本：
 * http://www.apache.org/licenses/LICENSE-2.0
 * 除非适用法律要求或书面同意，本软件按"原样"分发，
 * 没有任何明示或暗示的保证或条件。
 * 详见许可证中规定的权限和限制。
 * （注：这是一份标准的Apache许可证2.0版本的开源声明）
 */
// 定义包路径
package net.micode.notes.ui;

// 导入Android相关类库
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;              // 资源ID引用
// 导入数据类
import net.micode.notes.data.Notes;      // 笔记常量
import net.micode.notes.data.Notes.NoteColumns;  // 笔记表列名

/**
 * 文件夹列表适配器
 * 继承自CursorAdapter，用于将文件夹数据绑定到列表视图
 */
public class FoldersListAdapter extends CursorAdapter {
    // 查询投影列（需要获取的字段）
    public static final String [] PROJECTION = {
            NoteColumns.ID,        // 笔记ID
            NoteColumns.SNIPPET    // 文件夹名称（使用SNIPPET字段存储）
    };

    // 列索引常量
    public static final int ID_COLUMN   = 0;  // ID列索引
    public static final int NAME_COLUMN = 1;  // 名称列索引

    /**
     * 构造函数
     * @param context 上下文对象
     * @param c       数据库游标
     */
    public FoldersListAdapter(Context context, Cursor c) {
        super(context, c);
        // TODO: 可在此处添加额外初始化代码
    }

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

    /**
     * 绑定数据到已有视图
     * @param view    要绑定的视图
     * @param context 上下文
     * @param cursor  数据游标
     */
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        // 确保视图是FolderListItem类型
        if (view instanceof FolderListItem) {
            String folderName;
            // 判断是否为根文件夹（特殊处理）
            if (cursor.getLong(ID_COLUMN)  == Notes.ID_ROOT_FOLDER) {
                folderName = context.getString(R.string.menu_move_parent_folder);
            } else {
                folderName = cursor.getString(NAME_COLUMN);
            }
            // 调用视图的bind方法设置名称
            ((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);
    }

    /**
     * 自定义文件夹列表项视图（内部类）
     */
    private static class FolderListItem extends LinearLayout {
        private final TextView mName;  // 显示文件夹名称的文本视图

        /**
         * 构造函数
         * @param context 上下文
         */
        public FolderListItem(Context context) {
            super(context);
            // 加载布局文件
            inflate(context, R.layout.folder_list_item,  this);
            // 获取名称文本视图
            mName = (TextView) findViewById(R.id.tv_folder_name);
        }

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