/*
* Copyright 2012 Kevin Sawicki <kevinsawicki@gmail.com>
*
* 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 com.github.kevinsawicki.wishlist;
import android.app.Activity;
import android.content.res.Resources;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TextView;
/**
* Helper for finding and tweaking a view's children
*/
public class ViewFinder {
private static interface FindWrapper {
View findViewById(int id);
Resources getResources();
}
private static class WindowWrapper implements FindWrapper {
private final Window window;
WindowWrapper(final Window window) {
this.window = window;
}
public View findViewById(final int id) {
return window.findViewById(id);
}
public Resources getResources() {
return window.getContext().getResources();
}
}
private static class ViewWrapper implements FindWrapper {
private final View view;
ViewWrapper(final View view) {
this.view = view;
}
public View findViewById(final int id) {
return view.findViewById(id);
}
public Resources getResources() {
return view.getResources();
}
}
private final FindWrapper wrapper;
/**
* Create finder wrapping given view
*
* @param view
*/
public ViewFinder(final View view) {
wrapper = new ViewWrapper(view);
}
/**
* Create finder wrapping given window
*
* @param window
*/
public ViewFinder(final Window window) {
wrapper = new WindowWrapper(window);
}
/**
* Create finder wrapping given activity
*
* @param activity
*/
public ViewFinder(final Activity activity) {
this(activity.getWindow());
}
/**
* Find view with id
*
* @param id
* @return found view
*/
@SuppressWarnings("unchecked")
public <V extends View> V find(final int id) {
return (V) wrapper.findViewById(id);
}
/**
* Get image view with id
*
* @param id
* @return image view
*/
public ImageView imageView(final int id) {
return find(id);
}
/**
* Get compound button with id
*
* @param id
* @return image view
*/
public CompoundButton compoundButton(final int id) {
return find(id);
}
/**
* Get text view with id
*
* @param id
* @return text view
*/
public TextView textView(final int id) {
return find(id);
}
/**
* Set text of child view with given id
*
* @param id
* @param content
* @return text view
*/
public TextView setText(final int id, final CharSequence content) {
final TextView text = find(id);
text.setText(content);
return text;
}
/**
* Set text of child view with given id
*
* @param id
* @param content
* @return text view
*/
public TextView setText(final int id, final int content) {
return setText(id, wrapper.getResources().getString(content));
}
/**
* Register on click listener to child view with given id
*
* @param id
* @param listener
* @return view registered with listener
*/
public View onClick(final int id, final OnClickListener listener) {
View clickable = find(id);
clickable.setOnClickListener(listener);
return clickable;
}
/**
* Register runnable to be invoked when child view with given id is clicked
*
* @param id
* @param runnable
* @return view registered with runnable
*/
public View onClick(final int id, final Runnable runnable) {
return onClick(id, new OnClickListener() {
public void onClick(View v) {
runnable.run();
}
});
}
/**
* Register on click listener with all given child view ids
*
* @param ids
* @param listener
*/
public void onClick(final OnClickListener listener, final int... ids) {
for (int id : ids)
find(id).setOnClickListener(listener);
}
/**
* Register runnable to be invoked when all given child view ids are clicked
*
* @param ids
* @param runnable
*/
public void onClick(final Runnable runnable, final int... ids) {
onClick(new OnClickListener() {
public void onClick(View v) {
runnable.run();
}
}, ids);
}
/**
* Set drawable on child image view
*
* @param id
* @param drawable
* @return image view
*/
public ImageView setDrawable(final int id, final int drawable) {
ImageView image = imageView(id);
image.setImageDrawable(image.getResources().getDrawable(drawable));
return image;
}
/**
* Register on checked change listener to child view with given id
*
* @param id
* @param listener
* @return view registered with listener
*/
public CompoundButton onCheck(final int id,
final OnCheckedChangeListener listener) {
CompoundButton checkable = find(id);
checkable.setOnCheckedChangeListener(listener);
return checkable;
}
/**
* Register runnable to be invoked when child view with given id is
* checked/unchecked
*
* @param id
* @param runnable
* @return view registered with runnable
*/
public CompoundButton onCheck(final int id, final Runnable runnable) {
return onCheck(id, new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
runnable.run();
}
});
}
/**
* Register on checked change listener with all given child view ids
*
* @param ids
* @param listener
*/
public void onCheck(final OnCheckedChangeListener listener, final int... ids) {
for (int id : ids)
compoundButton(id).setOnCheckedChangeListener(listener);
}
/**
* Register runnable to be invoked when all given child view ids are
* checked/unchecked
*
* @param ids
* @param runnable
*/
public void onCheck(final Runnable runnable, final int... ids) {
onCheck(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
runnable.run();
}
}, ids);
}
}