/*
* Copyright © 2016 TIBCO Software,Inc.All rights reserved.
* http://community.jaspersoft.com/project/jaspermobile-android
*
* Unless you have purchased a commercial license agreement from TIBCO Jaspersoft,
* the following license terms apply:
*
* This program is part of TIBCO Jaspersoft Mobile for Android.
*
* TIBCO Jaspersoft Mobile is free software:you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation,either version 3of the License,or
* (at your option)any later version.
*
* TIBCO Jaspersoft Mobile is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY;without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with TIBCO Jaspersoft Mobile for Android.If not,see
* <http://www.gnu.org/licenses/lgpl>.
*/
package com.jaspersoft.android.jaspermobile.activities.inputcontrols.adapters;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.jaspersoft.android.jaspermobile.R;
import com.jaspersoft.android.jaspermobile.activities.inputcontrols.viewholders.BaseInputControlViewHolder;
import com.jaspersoft.android.jaspermobile.activities.inputcontrols.viewholders.BooleanInputControlViewHolder;
import com.jaspersoft.android.jaspermobile.activities.inputcontrols.viewholders.DateTimeInputControlViewHolder;
import com.jaspersoft.android.jaspermobile.activities.inputcontrols.viewholders.MultiSelectInputControlViewHolder;
import com.jaspersoft.android.jaspermobile.activities.inputcontrols.viewholders.SingleSelectInputControlViewHolder;
import com.jaspersoft.android.jaspermobile.activities.inputcontrols.viewholders.TextInputControlViewHolder;
import com.jaspersoft.android.jaspermobile.activities.inputcontrols.viewholders.ValueInputControlViewHolder;
import com.jaspersoft.android.jaspermobile.widget.DateTimeView;
import com.jaspersoft.android.sdk.client.oxm.control.InputControl;
import java.util.ArrayList;
import java.util.List;
/**
* @author Andrew Tivodar
* @since 2.2
*/
public class InputControlsAdapter extends RecyclerView.Adapter<BaseInputControlViewHolder> {
private final static int IC_UNSUPPORTED = -1;
private final static int IC_BOOLEAN = 0;
private final static int IC_VALUE = 1;
private final static int IC_NUMBER_VALUE = 2;
private final static int IC_DATE_TIME = 3;
private final static int IC_DATE = 4;
private final static int IC_TIME = 5;
private final static int IC_SINGLE_SELECT = 6;
private final static int IC_MULTI_SELECT = 7;
private List<InputControl> mInputControls;
private boolean mIsBinding;
private LayoutInflater mLayoutInflater;
private InputControlInteractionListener mInteractionListener;
public InputControlsAdapter(List<InputControl> inputControls) {
if (inputControls == null) {
throw new IllegalArgumentException("Input Controls can not be null!");
}
updateInputControlList(inputControls);
}
public void setInteractionListener(InputControlInteractionListener interactionListener) {
this.mInteractionListener = interactionListener;
}
public void updateInputControlList(List<InputControl> inputControls) {
mInputControls = new ArrayList<>();
for (InputControl inputControl : inputControls) {
if (inputControl.isVisible()) {
mInputControls.add(inputControl);
}
}
notifyItemRangeChanged(0, mInputControls.size());
}
public void updateInputControl(InputControl inputControl){
int position = mInputControls.indexOf(inputControl);
if (position != -1) {
hideError(position);
notifyItemChanged(position);
}
}
@Override
public BaseInputControlViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View listItem;
switch (viewType) {
case IC_BOOLEAN:
listItem = layoutInflater.inflate(R.layout.item_input_control_boolean, parent, false);
BooleanInputControlViewHolder booleanInputControlViewHolder = new BooleanInputControlViewHolder(listItem);
booleanInputControlViewHolder.setStateChangeListener(new BooleanIcInteractionListener());
return booleanInputControlViewHolder;
case IC_VALUE:
case IC_NUMBER_VALUE:
listItem = layoutInflater.inflate(R.layout.item_input_control_value, parent, false);
TextInputControlViewHolder textInputControlViewHolder = new TextInputControlViewHolder(listItem);
textInputControlViewHolder.setOnSelectListener(new ValueIcInteractionListener());
return textInputControlViewHolder;
case IC_DATE_TIME:
DateTimeView dateTimeItem = new DateTimeView(parent.getContext());
dateTimeItem.setDateType(DateTimeView.DateType.DATE_TIME);
DateTimeInputControlViewHolder dateTimeInputControlViewHolder = new DateTimeInputControlViewHolder(dateTimeItem);
dateTimeInputControlViewHolder.setDateTimeClickListener(new DateIcInteractionListener());
return dateTimeInputControlViewHolder;
case IC_DATE:
DateTimeView dateItem = new DateTimeView(parent.getContext());
dateItem.setDateType(DateTimeView.DateType.DATE);
DateTimeInputControlViewHolder dateInputControlViewHolder = new DateTimeInputControlViewHolder(dateItem);
dateInputControlViewHolder.setDateTimeClickListener(new DateIcInteractionListener());
return dateInputControlViewHolder;
case IC_TIME:
DateTimeView timeItem = new DateTimeView(parent.getContext());
timeItem.setDateType(DateTimeView.DateType.TIME);
DateTimeInputControlViewHolder timeInputControlViewHolder = new DateTimeInputControlViewHolder(timeItem);
timeInputControlViewHolder.setDateTimeClickListener(new DateIcInteractionListener());
return timeInputControlViewHolder;
case IC_SINGLE_SELECT:
listItem = layoutInflater.inflate(R.layout.item_input_control_value, parent, false);
SingleSelectInputControlViewHolder singleSelectInputControlViewHolder = new SingleSelectInputControlViewHolder(listItem);
singleSelectInputControlViewHolder.setOnSelectListener(new SingleSelectIcInteractionListener());
return singleSelectInputControlViewHolder;
case IC_MULTI_SELECT:
listItem = layoutInflater.inflate(R.layout.item_input_control_value, parent, false);
MultiSelectInputControlViewHolder multiSelectInputControlViewHolder = new MultiSelectInputControlViewHolder(listItem);
multiSelectInputControlViewHolder.setOnSelectListener(new MultiSelectIcInteractionListener());
return multiSelectInputControlViewHolder;
default:
return null;
}
}
@Override
public void onBindViewHolder(BaseInputControlViewHolder viewHolder, int position) {
mIsBinding = true;
viewHolder.populateView(mInputControls.get(position));
mIsBinding = false;
}
@Override
public int getItemCount() {
return mInputControls.size();
}
@Override
public int getItemViewType(int position) {
switch (mInputControls.get(position).getType()) {
case bool:
return IC_BOOLEAN;
case singleValueText:
return IC_VALUE;
case singleValueNumber:
return IC_NUMBER_VALUE;
case singleValueTime:
return IC_TIME;
case singleValueDate:
return IC_DATE;
case singleValueDatetime:
return IC_DATE_TIME;
case singleSelect:
case singleSelectRadio:
return IC_SINGLE_SELECT;
case multiSelect:
case multiSelectCheckbox:
return IC_MULTI_SELECT;
default:
return IC_UNSUPPORTED;
}
}
private void hideError(int position) {
mInputControls.get(position).getState().setError(null);
}
public interface InputControlInteractionListener {
void onBooleanStateChanged(InputControl inputControl, boolean newState);
void onValueTextChanged(InputControl inputControl);
void onSingleSelectIcClicked(InputControl inputControl);
void onMultiSelectIcClicked(InputControl inputControl);
void onDateIcClicked(InputControl inputControl);
void onTimeIcClicked(InputControl inputControl);
void onDateClear(InputControl inputControl);
}
private class BooleanIcInteractionListener implements BooleanInputControlViewHolder.StateChangeListener{
@Override
public void onStateChanged(int position, boolean state) {
if (mIsBinding) return;
if (mInteractionListener != null) {
mInteractionListener.onBooleanStateChanged(mInputControls.get(position), state);
}
}
}
private class ValueIcInteractionListener implements ValueInputControlViewHolder.ClickListener{
@Override
public void onClick(int position) {
if (mIsBinding) return;
if (mInteractionListener != null) {
mInteractionListener.onValueTextChanged(mInputControls.get(position));
}
}
}
private class DateIcInteractionListener implements DateTimeView.DateTimeClickListener {
@Override
public void onDateClick(int position) {
if (mIsBinding) return;
if (mInteractionListener != null) {
mInteractionListener.onDateIcClicked(mInputControls.get(position));
}
}
@Override
public void onTimeClick(int position) {
if (mIsBinding) return;
if (mInteractionListener != null) {
mInteractionListener.onTimeIcClicked(mInputControls.get(position));
}
}
@Override
public void onClear(int position) {
if (mIsBinding) return;
if (mInteractionListener != null) {
mInteractionListener.onDateClear(mInputControls.get(position));
}
}
}
private class SingleSelectIcInteractionListener implements ValueInputControlViewHolder.ClickListener{
@Override
public void onClick(int position) {
if (mIsBinding) return;
if (mInteractionListener != null) {
mInteractionListener.onSingleSelectIcClicked(mInputControls.get(position));
}
}
}
private class MultiSelectIcInteractionListener implements ValueInputControlViewHolder.ClickListener{
@Override
public void onClick(int position) {
if (mIsBinding) return;
if (mInteractionListener != null) {
mInteractionListener.onMultiSelectIcClicked(mInputControls.get(position));
}
}
}
}