/*
* 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.view.animation.AnimationUtils;
import android.widget.LinearLayout;
import android.widget.ToggleButton;
import android.widget.ViewSwitcher;
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 SwitchableSliderRenderer implements SettingRenderer, OnClickListener {
private LayoutInflater mInflater;
private RangeSetting mSetting;
private Context mContext;
// view structure
//private LinearLayout mView;
private ViewSwitcher mSwitcher;
private ToggleButton mToggle;
// controlled renderers
private MinMaxSliderSettingRenderer mSliderRenderer;
private LinkSettingRenderer mBaseRenderer;
private int mChildView = -1;
public View getView(LayoutInflater inflater, Setting setting, View convertView, Context context) {
// reuse if view already created
//if (mView != null) return mView;
// re-create view every time to disable unwanted animation every time window is opened
mSliderRenderer = null;
mBaseRenderer = null;
mChildView = -1;
mInflater = inflater;
mContext = context;
mSetting = (RangeSetting) setting;
RangeSetting rangeSetting = (RangeSetting) setting;
LinearLayout view = /*mView =*/ (LinearLayout) inflater.inflate(R.layout.row_switchable_slider_view, null);
ViewSwitcher switcher = mSwitcher = (ViewSwitcher) view.findViewById(R.id.switcher);
switcher.setOutAnimation(AnimationUtils.loadAnimation(mContext, R.anim.slide_out_down));
switcher.setInAnimation(AnimationUtils.loadAnimation(mContext, R.anim.slide_in_up));
switcher.setAnimateFirstView(false);
ToggleButton toggle = mToggle = (ToggleButton) view.findViewById(R.id.toggle);
toggle.setOnClickListener(this);
// initialize currently active view
updateView(rangeSetting, toggle);
return view;
}
private void updateView(RangeSetting setting, ToggleButton toggle) {
boolean checked = setting.checked;
ViewSwitcher switcher = mSwitcher;
// update view
if (checked) {
LinkSettingRenderer renderer = mBaseRenderer;
if (renderer == null) {
renderer = mBaseRenderer = new LinkSettingRenderer();
View child = renderer.getView(mInflater, setting, null, mContext);
switcher.addView(child);
if (mChildView == -1) mChildView = 0;
}
renderer.updateView();
} else {
MinMaxSliderSettingRenderer renderer = mSliderRenderer;
if (renderer == null) {
renderer = mSliderRenderer = new MinMaxSliderSettingRenderer();
View child = renderer.getView(mInflater, setting, null, mContext);
switcher.addView(child);
if (mChildView == -1) mChildView = 0;
}
renderer.updateView();
}
switcher.setDisplayedChild(mChildView);
// update toggle
toggle.setChecked(checked);
toggle.setEnabled(setting.enabled);
}
public void notifySettingUpdated() {
updateView(mSetting, mToggle);
}
public void onClick(View v) {
mChildView = ~ mChildView & 0x1; // 0 or 1
final ToggleButton toggle = mToggle;
final RangeSetting setting = mSetting;
boolean checked = toggle.isChecked();
toggle.toggle(); // preserve state
setting.notifySwitchClicked(checked);
}
}