/*
* Copyright (C) 2010 beworx.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.bwx.bequick.renderers;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;
import com.bwx.bequick.R;
import com.bwx.bequick.fwk.RangeSetting;
import com.bwx.bequick.fwk.Setting;
import com.bwx.bequick.fwk.SettingRenderer;
public class MinMaxSliderSettingRenderer implements SettingRenderer, OnClickListener, OnSeekBarChangeListener {
private LayoutInflater mInflater;
private RangeSetting mSetting;
private Context mContext;
private LinearLayout mView;
private ImageButton mMaxButton;
private ImageButton mMinButton;
private TextView mDescr;
// seek bar
private SeekBar mSlider;
private PopupWindow mPreviewPopup;
private TextView mPreviewText;
public View getView(LayoutInflater inflater, Setting setting, View convertView, Context context) {
// reuse if view already created
if (mView != null) return mView;
mInflater = inflater;
mContext = context;
RangeSetting set = (RangeSetting) setting;
LinearLayout view = mView = (LinearLayout) inflater.inflate(R.layout.row_setting_minmax_slider, null);
// re-initialize views
SeekBar slider = mSlider = (SeekBar) view.findViewById(R.id.slider_view);
mDescr = (TextView) view.findViewById(R.id.descr_view);
ImageButton minButton = (ImageButton) view.findViewById(R.id.min_button);
ImageButton maxButton = (ImageButton) view.findViewById(R.id.max_button);
// set listeners
slider.setOnSeekBarChangeListener(this);
slider.setOnClickListener(this);
maxButton.setOnClickListener(this);
minButton.setOnClickListener(this);
// set values
minButton.setImageResource(set.minIconId);
maxButton.setImageResource(set.maxIconId);
mMinButton = minButton;
mMaxButton = maxButton;
mSetting = set;
// update view
updateView();
return view;
}
/**
* a button min or max is clicked
*/
public void onClick(View view) {
RangeSetting setting = mSetting;
if (view.equals(mMinButton)) {
setting.value = setting.min;
mSlider.setProgress(setting.value);
} else if (view.equals(mMaxButton)) {
setting.value = setting.max;
mSlider.setProgress(setting.value);
}
updatePreviewText(setting);
setting.notifySettingValueChanged(setting.value);
setting.notifyButtonClicked(1);
}
public void notifySettingUpdated() {
updateView();
}
void updateView() {
SeekBar slider = mSlider;
RangeSetting setting = mSetting;
// ignore for now
/*
boolean enabled = setting.enabled;
mMinButton.setEnabled(enabled);
mMaxButton.setEnabled(enabled);
slider.setEnabled(enabled);
*/
slider.setMax(setting.max);
slider.setProgress(setting.value);
// update description
final String descr = setting.descr;
final TextView descrView = mDescr;
descrView.setText(descr);
descrView.setVisibility(descr == null ? View.GONE : View.VISIBLE);
updatePreviewText(setting);
}
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
mSetting.notifySettingValueChanged(progress);
updatePreviewText(mSetting);
}
}
private void updatePreviewText(RangeSetting setting) {
TextView preview = mPreviewText;
if (preview != null) {
int min = setting.min;
int max = setting.max;
int progress = setting.value;
if (max != 100 || min != 0) {
// calculate progress in %
int range = max - min;
progress = progress * 100 / range;
}
preview.setText(String.valueOf(progress) + " %");
}
}
public void onStartTrackingTouch(SeekBar seekBar) {
LinearLayout view = mView;
// create preview popup
PopupWindow popup = mPreviewPopup;
if (popup == null) {
Context context = mContext;
TextView text = mPreviewText = (TextView) mInflater.inflate(R.layout.popup_text, null);
final float scale = context.getResources().getDisplayMetrics().density;
popup = new PopupWindow(text, (int) (70 * scale), (int) (56 * scale));
popup.setBackgroundDrawable(context.getResources().getDrawable(android.R.drawable.alert_dark_frame));
popup.setContentView(text);
mPreviewPopup = popup;
updatePreviewText(mSetting);
}
int xoff = (view.getWidth() - popup.getWidth() ) / 2;
int yoff = view.getHeight() + (int) (popup.getHeight() / 1.2);
popup.showAsDropDown(view, xoff, -yoff);
}
public void onStopTrackingTouch(SeekBar seekBar) {
mPreviewPopup.dismiss();
mSetting.notifyButtonClicked(1); // update value
}
}