/*
* Copyright (c) 2011, 2012 Roberto Tyley
*
* This file is part of 'Agit' - an Android Git client.
*
* Agit is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Agit is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/ .
*/
package com.madgag.agit.diff;
import static com.madgag.agit.R.layout.file_change_header_expanded_view;
import static com.madgag.agit.R.layout.file_change_header_view;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import com.madgag.agit.diff.DiffSliderView.OnStateUpdateListener;
import java.util.List;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
public class CommitChangeListAdapter extends BaseExpandableListAdapter implements OnStateUpdateListener,
DiffStateProvider {
private static final String TAG = "CommitChangeListAdapter";
private LayoutInflater mInflater;
private final DiffSliderView diffSlider;
private final ExpandableListView expandableList;
private final Context context;
private final Repository repository;
private final RevCommit afterCommit, beforeCommit;
private final List<FileDiff> fileDiffs;
private float state = 0.5f;
public CommitChangeListAdapter(Repository repository, RevCommit afterCommit, RevCommit beforeCommit,
DiffSliderView diffSlider, ExpandableListView expandableList, Context context) {
Log.d(TAG, "before : "+ beforeCommit);
Log.d(TAG, "after : "+ afterCommit);
this.repository = repository;
this.afterCommit = afterCommit;
this.beforeCommit = beforeCommit;
this.diffSlider = diffSlider;
this.expandableList = expandableList;
this.context = context;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
diffSlider.setStateUpdateListener(this);
try {
fileDiffs = new CommitDiffer().calculateCommitDiffs(repository, beforeCommit, afterCommit);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public Object getChild(int groupPosition, int childPosition) {
return fileDiffs.get(groupPosition).getHunks().get(childPosition);
}
public long getChildId(int arg0, int arg1) {
return 0;
}
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
Hunk hunk = fileDiffs.get(groupPosition).getHunks().get(childPosition);
return new HunkDiffView(context, hunk, this);
}
public int getChildrenCount(int groupPosition) {
return fileDiffs.get(groupPosition).getHunks().size();
}
public Object getGroup(int index) {
return fileDiffs.get(index);
}
public int getGroupCount() {
return fileDiffs.size();
}
public long getGroupId(int index) {
return fileDiffs.get(index).hashCode(); // Pretty lame
}
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
View v;
if (convertView == null) {
v = newGroupView(isExpanded, parent);
} else {
v = convertView;
}
FileHeaderViewHolder viewHolder = (FileHeaderViewHolder) v.getTag();
if (viewHolder != null && viewHolder.isExpanded() != isExpanded) {
v = newGroupView(isExpanded, parent);
viewHolder = null;
}
if (viewHolder == null) {
v.setTag(viewHolder = new FileHeaderViewHolder(v, isExpanded));
}
viewHolder.updateViewFor(fileDiffs.get(groupPosition));
return v;
}
private View newGroupView(boolean isExpanded, ViewGroup parent) {
return mInflater.inflate(isExpanded ? file_change_header_expanded_view : file_change_header_view, parent,
false);
}
public boolean hasStableIds() {
return false;
}
public boolean isChildSelectable(int arg0, int arg1) {
return false;
}
public void onStateChanged(DiffSliderView diffSliderView, float state) {
setDiffState(state);
}
private void setDiffState(float state) {
this.state = state;
expandableList.invalidate();
expandableList.requestLayout();
Log.d(TAG, "list invalidated state=" + state);
}
public float getDiffState() {
return state;
}
}