package com.stardust.scriptdroid.ui.edit.completion;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import android.workground.WrapContentLinearLayoutManager;
import com.google.gson.Gson;
import com.stardust.pio.UncheckedIOException;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Created by Stardust on 2017/2/17.
*/
public class InputMethodEnhanceBar extends RecyclerView implements CodeCompletion.OnCodeCompletionChangeListener {
public InputMethodEnhanceBar(Context context) {
super(context);
init();
}
public InputMethodEnhanceBar(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public InputMethodEnhanceBar(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public interface EditTextBridge {
void appendText(CharSequence text);
void backspace(int count);
com.jecelyin.editor.v2.core.widget.TextView getEditText();
}
EditTextBridge mEditTextBridge;
private CodeCompletion mCodeCompletion = new CodeCompletion(this);
private List<CodeCompletion.CodeCompletionItem> mCodeCompletionList = new ArrayList<>();
private final OnClickListener mOnCodeCompletionItemClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
int position = getChildViewHolder(v).getAdapterPosition();
if (position >= 0 && position < mCodeCompletionList.size())
mEditTextBridge.appendText(mCodeCompletionList.get(position).getAppendText());
}
};
private final OnLongClickListener mOnCodeCompletionItemLongClickListener = new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int position = getChildViewHolder(v).getAdapterPosition();
if (position < 0 || position >= mCodeCompletionList.size())
return false;
((ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("", mCodeCompletionList.get(position).getDisplayText()));
Toast.makeText(getContext(), R.string.text_copied, Toast.LENGTH_SHORT).show();
return true;
}
};
private void init() {
setAdapter(new CodeCompletionAdapter());
setLayoutManager(new WrapContentLinearLayoutManager(getContext(), HORIZONTAL, false));
mCodeCompletion.setFunctions(readFunctions(getContext(), "js/functions.json"));
}
public void setEditTextBridge(EditTextBridge editTextBridge) {
mEditTextBridge = editTextBridge;
mCodeCompletion.setEditText(mEditTextBridge.getEditText());
}
@Override
public void OnCodeCompletionChange(Collection<CodeCompletion.CodeCompletionItem>... lists) {
mCodeCompletionList.clear();
for (Collection<CodeCompletion.CodeCompletionItem> list : lists) {
mCodeCompletionList.addAll(list);
}
getAdapter().notifyDataSetChanged();
}
private class CodeCompletionAdapter extends RecyclerView.Adapter<ViewHolder> {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(getContext()).inflate(R.layout.input_method_enhance_bar_item, parent, false));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
((TextView) holder.itemView).setText(mCodeCompletionList.get(position).getDisplayText());
}
@Override
public int getItemCount() {
return mCodeCompletionList.size();
}
}
private class ViewHolder extends RecyclerView.ViewHolder {
ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(mOnCodeCompletionItemClickListener);
itemView.setOnLongClickListener(mOnCodeCompletionItemLongClickListener);
}
}
private static String[] readFunctions(Context context, String path) {
Gson gson = new Gson();
try {
return gson.fromJson(new InputStreamReader(context.getAssets().open(path)), String[].class);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}