//From the desk of Frank P. Westlake; public domain.
package jackpal.androidterm.shortcuts;
import jackpal.androidterm.R;
import jackpal.androidterm.compat.AlertDialogCompat;
import android.app. AlertDialog;
import android.content. Context;
import android.content. DialogInterface;
import android.graphics. Typeface;
import android.view. Gravity;
import android.widget. CheckBox;
import android.widget. CompoundButton;
import android.widget. ImageView;
import android.widget. LinearLayout;
import android.widget. ScrollView;
import android.widget. SeekBar;
import android.widget. TextView;
import android.widget. EditText;
//////////////////////////////////////////////////////////////////////
public class ColorValue
implements CompoundButton.OnCheckedChangeListener
{
private final Context context;
private EditText value;
private final int[] color= {0xFF, 0, 0, 0};
private boolean started= false;
private AlertDialogCompat.Builder builder;
private boolean barLock= false;
private final boolean[] locks= {false, false, false, false};
private final int FP= LinearLayout.LayoutParams.FILL_PARENT;
private final int WC= LinearLayout.LayoutParams.WRAP_CONTENT;
private final ImageView imgview;
private final String result[];
private String imgtext="";
////////////////////////////////////////////////////////////
public ColorValue(Context context, final ImageView imgview, final String result[])
{
this.context=context;
this.imgtext=result[0];
this.imgview=imgview;
this.result=result;
colorValue();
}
public void colorValue()
{
final int arraySizes= 4;
builder= AlertDialogCompat.newInstanceBuilder(context, AlertDialogCompat.THEME_HOLO_DARK);
LinearLayout lv=new LinearLayout(context);
lv.setOrientation(LinearLayout.VERTICAL);
String lab[]={
context.getString(R.string.colorvalue_letter_alpha) +" " //"α "
, context.getString(R.string.colorvalue_letter_red) +" " //"R "
, context.getString(R.string.colorvalue_letter_green) +" " //"G "
, context.getString(R.string.colorvalue_letter_blue) +" " //"B "
};
int clr[]={0xFFFFFFFF, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF};
for(int i=0, n=(Integer)imgview.getTag(); i<arraySizes; i++) color[i]=(n>>(24-i*8))&0xFF;
TextView lt=new TextView(context);
lt.setText(context.getString(R.string.colorvalue_label_lock_button_column));//"LOCK");
lt.setPadding(lt.getPaddingLeft(), lt.getPaddingTop(), 5, lt.getPaddingBottom());
lt.setGravity(Gravity.RIGHT);
value=new EditText(context);
value.setText(imgtext);
value.setSingleLine(false);
value.setGravity(Gravity.CENTER);
value.setTextColor((Integer)imgview.getTag());
value.setBackgroundColor((0xFF<<24)|0x007799);
LinearLayout vh=new LinearLayout(context);
vh.setOrientation(LinearLayout.HORIZONTAL);
vh.setGravity(Gravity.CENTER_HORIZONTAL);
vh.addView(value);
value.setHint(context.getString(R.string.colorvalue_icon_text_entry_hint));//"Enter icon text");
lv.addView(vh);
lv.addView(lt);
final SeekBar sb[]= new SeekBar[arraySizes+1];
final CheckBox lk[]= new CheckBox[arraySizes];
final TextView hexWindow[]= new TextView[arraySizes];
for(int i=0; i<arraySizes; i++)
{
LinearLayout lh=new LinearLayout(context);
lh.setGravity(Gravity.CENTER_VERTICAL);
final TextView tv=new TextView(context);
tv.setTypeface(Typeface.MONOSPACE);
tv.setText(lab[i]);
tv.setTextColor(clr[i]);
sb[i]=new SeekBar(context);
sb[i].setMax(0xFF);
sb[i].setProgress(color[i]);
sb[i].setSecondaryProgress(color[i]);
sb[i].setTag(i);
sb[i].setBackgroundColor(0xFF<<24|(color[i]<<(24-i*8)));
sb[i].setLayoutParams(new LinearLayout.LayoutParams(WC, WC, 1));
sb[i].setOnSeekBarChangeListener(
new SeekBar.OnSeekBarChangeListener()
{
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
doProgressChanged(seekBar, progress, fromUser);
}
private void doProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
if(fromUser && started)
{
int me=(Integer)seekBar.getTag();
int k=(color[0]<<24)|(color[1]<<16)|(color[2]<<8)|color[3];
value.setTextColor(k);
int start, end;
if(barLock && locks[me]) {start=0; end=arraySizes-1;}
else start=end=(Integer)seekBar.getTag();
for(int i=start; i<=end; i++)
{
if(i==me || (barLock && locks[i]))
{
color[i]=progress;
toHexWindow(hexWindow[i], color[i]);
sb[i].setBackgroundColor(0xFF<<24|(progress<<(24-i*8)));
sb[i].setProgress(progress);
}
}
}
}
public void onStartTrackingTouch(SeekBar seekBar)
{
doProgressChanged(seekBar, seekBar.getProgress(), true);
}
public void onStopTrackingTouch(SeekBar seekBar)
{
doProgressChanged(seekBar, seekBar.getProgress(), true);
}
}
);
lk[i]=new CheckBox(context);
lk[i].setLayoutParams(new LinearLayout.LayoutParams(WC, WC, 0));
lk[i].setOnCheckedChangeListener(this);
lk[i].setTag(i);
lh.addView(tv);
lh.addView(sb[i]);
lh.addView(lk[i]);
lv.addView(lh, FP, WC);
}
{//Evaluating hex windows.
LinearLayout lh=new LinearLayout(context);
lh.setGravity(Gravity.CENTER);
for(int i=0; i<arraySizes; i++)
{
hexWindow[i]=new TextView(context);
toHexWindow(hexWindow[i], color[i]);
lh.addView(hexWindow[i]);
}
lv.addView(lh);
}//Evaluating hex windows.
ScrollView sv=new ScrollView(context);
sv.addView(lv);
builder.setView(sv);
DialogInterface.OnClickListener ocl=new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
buttonHit(which, (color[0]<<24)|(color[1]<<16)|(color[2]<<8)|color[3]);
}
};
String Title = context.getString(R.string.addshortcut_make_text_icon);
builder.setTitle(Title);
builder.setPositiveButton(android.R.string.yes, ocl);
builder.setNegativeButton(android.R.string.cancel, ocl);
builder.show();
started=true;
}
//////////////////////////////////////////////////////////////////////
public void toHexWindow(TextView tv, int k)
{
String HEX="0123456789ABCDEF";
String s="";
int n=8;
k&=(1L<<8)-1L;
for(n-=4; n>=0; n-=4) s+=HEX.charAt((k>>n)&0xF);
tv.setText(s);
}
////////////////////////////////////////////////////////////
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
int view=(Integer)buttonView.getTag();
locks[view]=isChecked;
barLock=false;
for(int i=0; i<locks.length; i++) if(locks[i]) barLock=true;
}
////////////////////////////////////////////////////////////
private void buttonHit(int hit, int color)
{
switch(hit)
{
case AlertDialog.BUTTON_NEGATIVE: // CANCEL
return;
case AlertDialog.BUTTON_POSITIVE: // OK == set
imgtext=value.getText().toString();
result[1]=imgtext;
imgview.setTag(color);
if(!imgtext.equals(""))
{
imgview.setImageBitmap(
TextIcon.getTextIcon(
imgtext
, color
, 96
, 96
)
);
}
return;
}
}
////////////////////////////////////////////////////////////
}