package com.gh4a.widget;
import android.content.Context;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.gh4a.R;
import java.util.ArrayList;
import java.util.List;
public class PathBreadcrumbs extends HorizontalScrollView implements View.OnClickListener {
private List<String> mItems;
private LinearLayout mChildFrame;
private int mActive;
private SelectionCallback mCallback;
private LayoutInflater mInflater;
public PathBreadcrumbs(Context context) {
super(context);
init();
}
public PathBreadcrumbs(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public PathBreadcrumbs(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
setClipToPadding(false);
mInflater = LayoutInflater.from(getContext());
mItems = new ArrayList<>();
mChildFrame = new LinearLayout(getContext());
mChildFrame.setMinimumHeight((int) getResources().getDimension(R.dimen.breadcrumb_height));
addView(mChildFrame, new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
}
public void setPath(@NonNull String path) {
mItems.clear();
mChildFrame.removeAllViews();
addCrumb("", "/");
String[] paths = path.split("/");
StringBuilder combinedPath = new StringBuilder();
for (String splitPath : paths) {
combinedPath.append(splitPath);
addCrumb(combinedPath.toString(), splitPath);
combinedPath.append("/");
}
int active = mItems.indexOf(path);
if (active >= 0) {
mActive = active;
for (int i = 0; i < mChildFrame.getChildCount(); i++) {
ViewGroup child = (ViewGroup) mChildFrame.getChildAt(i);
TextView tv = (TextView) child.getChildAt(0);
tv.setActivated(i == mActive);
}
}
}
private void addCrumb(@NonNull String path, String title) {
ViewGroup view = (ViewGroup) mInflater.inflate(R.layout.breadcrumb, mChildFrame, false);
view.setTag(mItems.size());
view.setOnClickListener(this);
TextView tv = (TextView) view.getChildAt(0);
tv.setText(title);
if (mChildFrame.getChildCount() > 0) {
ViewGroup lastChild = (ViewGroup) mChildFrame.getChildAt(mChildFrame.getChildCount() - 1);
lastChild.getChildAt(1).setVisibility(View.VISIBLE);
}
mChildFrame.addView(view);
mItems.add(path);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
//RTL works fine like this
View child = mChildFrame.getChildAt(mActive);
if (child != null) {
smoothScrollTo(child.getLeft(), 0);
}
}
public void setCallback(SelectionCallback callback) {
mCallback = callback;
}
@Override
public void onClick(View v) {
if (mCallback != null) {
int index = (Integer) v.getTag();
int size = mItems.size();
if (index >= 0 && index < size) {
mCallback.onCrumbSelection(mItems.get(index), index, size);
}
}
}
public interface SelectionCallback {
void onCrumbSelection(String absolutePath, int index, int count);
}
}