/*
 * 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; //引入需要用到的tool包
                                                                     
import android.content.Context; //导入各种类
import android.text.format.DateUtils; 
import android.view.View; //导入类
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout; //标签列表项目选项
import android.widget.TextView;

import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.tool.DataUtils;
import net.micode.notes.tool.ResourceParser.NoteItemBgResources;
                                                                     // 引用包库
                                                                     //创建列表项目选项，拓展功能为线性布局
public class NotesListItem extends LinearLayout { //构建便签列表的各个项目的详细具体信息
    private ImageView mAlert; //闹钟图片
    private TextView mTitle; //标题的文本视图
    private TextView mTime; //最后修改的时间的文本视图
    private TextView mCallName; //呼叫名称
    private NoteItemData mItemData; //标签数据
    private CheckBox mCheckBox; //勾选框
                                                                        //初始化
    public NotesListItem(Context context) { //初始化基本信息
        super(context); //调用父类具有相同形参的构造函数
        inflate(context, R.layout.note_item, this); //Inflate()作用就是将xml定义的一个布局找出来，但仅仅是找出来而且隐藏的，没有找到的同时并显示功能，这里的xml是R.layout
        mAlert = (ImageView) findViewById(R.id.iv_alert_icon); //findViewById用于从contentView中查找指定ID的View，转换出来的形式根据需要而定
        mTitle = (TextView) findViewById(R.id.tv_title); //获取题目
        mTime = (TextView) findViewById(R.id.tv_time); //获取创建或修改时间
        mCallName = (TextView) findViewById(R.id.tv_name); //获取联系人姓名
        mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); //获取复选框
    } //findViewById用于从contentView中查找指定ID的View，转换出来的形式根据需要而定

    public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) { //根据data的属性对各个控件的属性的控制，主要是可见性Visibility，内容setText，格式setTextAppearance
        if (choiceMode && data.getType() == Notes.TYPE_NOTE) { //如果处于选择模式并且是便签类型时，设置为可见及勾选，否则设置为不可见
            mCheckBox.setVisibility(View.VISIBLE); //设置View可见
            mCheckBox.setChecked(checked); // 设置当前项目被选中
        } else {
            mCheckBox.setVisibility(View.GONE); //设置复选框不可见
        }

        mItemData = data; //把数据传给标签
        if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { //设置控件属性，通过判断保存到文件夹的ID、当前ID以及父ID之间关系决定
            mCallName.setVisibility(View.GONE); //设置联系人名字不可见
            mAlert.setVisibility(View.VISIBLE); //设置闹钟图标可见
            mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); //设置外观风格 
            mTitle.setText(context.getString(R.string.call_record_folder_name) //设置内容
                    + context.getString(R.string.format_folder_files_count, data.getNotesCount()));
            mAlert.setImageResource(R.drawable.call_record); //设置图片来源
        } else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) { //设置闹钟
            mCallName.setVisibility(View.VISIBLE); //设置联系人姓名可见
            mCallName.setText(data.getCallName()); //设置联系人姓名的文本内容
            mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem); //设置title文本风格
            mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); //设置title的文本内容为便签内容的前面片段
            if (data.hasAlert()) { // 如果时间提醒存在，设置图片来源，将时间提醒图标定为可见
                mAlert.setImageResource(R.drawable.clock); //图片来源的设置
                mAlert.setVisibility(View.VISIBLE); //将提醒图标设置为可见
            } else { 
                mAlert.setVisibility(View.GONE); //否则将提醒图标设置为不可见
            } //上面的设置均在ID_CALL_RECORD_FOLDER文件下
        } else { //如果父类和当前id均与保存在文件夹中的id不同
            mCallName.setVisibility(View.GONE);//设置联系人姓名不可见
            mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); //设置title的文本格式

            if (data.getType() == Notes.TYPE_FOLDER) { //设置Type格式
                mTitle.setText(data.getSnippet() //设置便签标题内容为便签的前面部分的内容+文件数+便签数
                        + context.getString(R.string.format_folder_files_count, //设置文件夹的title为“名字+（count）”
                                data.getNotesCount())); //设置时间，从data编辑的日期获取
                mAlert.setVisibility(View.GONE); //设置图标不可见
            } else { //设置便签的title为便签内容的前面片段
                mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); //如果是便签，则设置便签标题内容为便签的前面部分的内容
                if (data.hasAlert()) { //如果当前便签存在提醒闹钟时间
                    mAlert.setImageResource(R.drawable.clock); //将提醒图标设置为闹钟样式
                    mAlert.setVisibility(View.VISIBLE);//设置提醒闹钟可见
                } else {
                    mAlert.setVisibility(View.GONE);//否则设置提醒图标不可见
                }
            }
        }
        mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); //将时间设置为编辑便签的时间
                                                                                    //设置项目修改时间
        setBackground(data); //设置背景
    }

    private void setBackground(NoteItemData data) { //根据data的文件属性来设置背景
        int id = data.getBgColorId(); //获取id，用此id用来获取背景颜色
        if (data.getType() == Notes.TYPE_NOTE) { //若是note型文件，则4种情况，对于4种不同情况的背景来源
            if (data.isSingle() || data.isOneFollowingFolder()) { //单个数据或只有一个子文件夹
                setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id)); //单个数据或只有一个子文件夹
            } else if (data.isLast()) { //最后一个数据
                setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id)); //设置背景来源为id的最后一个数据
            } else if (data.isFirst() || data.isMultiFollowingFolder()) { //是第一个数据并有多个子文件夹
                setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id)); //若不是Note类型则使用文件夹背景来源
            } else {
                setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id)); //将便签设置为普通类型便签的背景
            }
        } else { //如果不是note直接调用文件夹的背景来源
            setBackgroundResource(NoteItemBgResources.getFolderBgRes()); // 设置背景来源为文件夹
        }
    }
                                                                      //返回当前便签的数据信息
    public NoteItemData getItemData() { // 返回当前便签的数据信息
        return mItemData;
    }
}
