/*
 * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
 *
 * 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 net.micode.notes.ui;

import android.content.Context;  
// 引入 Context 类，用于访问应用的环境、资源、启动活动等。
import android.database.Cursor;  
// 引入 Cursor 类，表示查询结果集，通常用于访问数据库中的记录。
import android.view.View;  
// 引入 View 类，所有 UI 控件的基类。
import android.view.ViewGroup;  
// 引入 ViewGroup 类，表示可以包含其他视图的容器类。
import android.widget.CursorAdapter; 
 // 引入 CursorAdapter 类，用于绑定数据库查询结果与 UI 元素。
import android.widget.LinearLayout;  
// 引入 LinearLayout 类，线性布局容器，用于按顺序排列视图。
import android.widget.TextView;  
// 引入 TextView 类，用于显示文本。

import net.micode.notes.R;  
// 引入 R 类，自动生成的资源类，访问应用的资源（如字符串、布局、ID 等）。
import net.micode.notes.data.Notes; 
 // 引入 Notes 类，表示笔记相关的数据模型。
import net.micode.notes.data.Notes.NoteColumns; 
 // 引入 NoteColumns 类，表示与笔记相关的数据库字段。

// FoldersListAdapter 类是一个自定义的 CursorAdapter，用于展示文件夹列表。
public class FoldersListAdapter extends CursorAdapter {

    // 定义查询投影（即数据库查询时需要返回的列）。
    public static final String[] PROJECTION = {
        NoteColumns.ID,        // 文件夹的唯一 ID
        NoteColumns.SNIPPET    // 文件夹的简短名称（或者其他相关信息）
    };

    // 定义列的索引，方便后续获取对应列的数据。
    public static final int ID_COLUMN   = 0;  // ID 列索引
    public static final int NAME_COLUMN = 1;  // 文件夹名称列索引

    // 构造函数，接收 Context 和 Cursor，传递给父类的构造函数。
    public FoldersListAdapter(Context context, Cursor c) {
        super(context, c);  // 调用父类 CursorAdapter 的构造函数
    }

    // newView 方法负责创建新的视图（即每一行的数据项）。
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return new FolderListItem(context);  
        // 返回一个新的 FolderListItem 视图（表示文件夹项）。
    }

    // bindView 方法负责绑定数据到视图上，通常是处理显示和数据的绑定。
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        if (view instanceof FolderListItem) {  
            // 确保视图是 FolderListItem 类型
            // 获取文件夹的名称。如果是根文件夹，则显示特定的名称（菜单中的 "父文件夹"），否则显示文件夹名称。
            String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) 
                ? context.getString(R.string.menu_move_parent_folder) 
                : cursor.getString(NAME_COLUMN);
            
            // 将获取的名称绑定到 FolderListItem 中
            ((FolderListItem) view).bind(folderName);
        }
    }

    // getFolderName 方法用于根据位置获取文件夹名称。
    public String getFolderName(Context context, int position) {
        Cursor cursor = (Cursor) getItem(position); 
         // 获取指定位置的 Cursor 数据
        // 根据文件夹的 ID 返回对应的名称
        return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) 
            ? context.getString(R.string.menu_move_parent_folder) 
            : cursor.getString(NAME_COLUMN);
    }

    // FolderListItem 类表示文件夹列表项的视图，它是一个 LinearLayout。
    private class FolderListItem extends LinearLayout {
        private TextView mName;  
        // 用于显示文件夹名称的 TextView 控件。

        // FolderListItem 的构造函数，初始化视图和控件。
        public FolderListItem(Context context) {
            super(context);
            inflate(context, R.layout.folder_list_item, this); 
             // 加载 folder_list_item 布局文件
            mName = (TextView) findViewById(R.id.tv_folder_name); 
             // 获取文件夹名称显示控件
        }

        // bind 方法用于将文件夹名称绑定到 TextView 上。
        public void bind(String name) {
            mName.setText(name);  // 设置文件夹名称
        }
    }
}
