/*
* @copyright 2011 Philip Warner
* @license GNU General Public License
*
* This file is part of Book Catalogue.
*
* Book Catalogue is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Book Catalogue 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Book Catalogue. If not, see <http://www.gnu.org/licenses/>.
*/
package com.eleybourn.bookcatalogue;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.eleybourn.bookcatalogue.utils.Logger;
import com.eleybourn.bookcatalogue.utils.Utils;
public class EditSeriesList extends EditObjectList<Series> {
private ArrayAdapter<String> mSeriesAdapter;
public EditSeriesList() {
super(CatalogueDBAdapter.KEY_SERIES_ARRAY, R.layout.edit_series_list, R.layout.row_edit_series_list);
}
@Override
protected void onSetupView(View target, Series object) {
if (object != null) {
TextView dt = (TextView) target.findViewById(R.id.row_series);
if (dt != null)
dt.setText(object.getDisplayName());
TextView st = (TextView) target.findViewById(R.id.row_series_sort);
if (st != null) {
if (object.getDisplayName().equals(object.getSortName())) {
st.setVisibility(View.GONE);
} else {
st.setVisibility(View.VISIBLE);
st.setText(object.getSortName());
}
}
TextView et = (TextView) target.findViewById(R.id.row_series_num);
if (et != null)
et.setText(object.num);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
mSeriesAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, mDbHelper.fetchAllSeriesArray());
((AutoCompleteTextView)this.findViewById(R.id.series)).setAdapter(mSeriesAdapter);
} catch (Exception e) {
Logger.logError(e);
}
}
@Override
protected void onAdd(View v) {
AutoCompleteTextView t = ((AutoCompleteTextView)EditSeriesList.this.findViewById(R.id.series));
String s = t.getText().toString().trim();
if (s.length() > 0) {
EditText et = ((EditText)EditSeriesList.this.findViewById(R.id.series_num));
String n = et.getText().toString();
if (n == null)
n = "";
Series series = new Series(t.getText().toString(), n);
series.id = mDbHelper.lookupSeriesId(series);
boolean foundMatch = false;
try {
for(int i = 0; i < mList.size() && !foundMatch; i++) {
if (series.name.equals(mList.get(i).name) && series.num.equals(mList.get(i).num)) {
foundMatch = true;
}
}
} catch (NullPointerException e) {
Logger.logError(e, "while adding series");
}
if (foundMatch) {
Toast.makeText(EditSeriesList.this, getResources().getString(R.string.series_already_in_list), Toast.LENGTH_LONG).show();
return;
}
mList.add(series);
mAdapter.notifyDataSetChanged();
t.setText("");
et.setText("");
} else {
Toast.makeText(EditSeriesList.this, getResources().getString(R.string.series_is_blank), Toast.LENGTH_LONG).show();
}
}
@Override
protected void onRowClick(View target, int position, final Series object) {
editSeries(object);
}
private void editSeries(final Series series) {
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.edit_book_series);
dialog.setTitle(R.string.edit_book_series);
AutoCompleteTextView seriesView = (AutoCompleteTextView) dialog.findViewById(R.id.series);
seriesView.setText(series.name);
seriesView.setAdapter(mSeriesAdapter);
EditText numView = (EditText) dialog.findViewById(R.id.series_num);
numView.setText(series.num);
setTextOrHideView(dialog.findViewById(R.id.title_label), mBookTitleLabel);
setTextOrHideView(dialog.findViewById(R.id.title), mBookTitle);
Button saveButton = (Button) dialog.findViewById(R.id.confirm);
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AutoCompleteTextView seriesView = (AutoCompleteTextView) dialog.findViewById(R.id.series);
EditText numView = (EditText) dialog.findViewById(R.id.series_num);
String newName = seriesView.getText().toString().trim();
if (newName == null || newName.length() == 0) {
Toast.makeText(EditSeriesList.this, R.string.series_is_blank, Toast.LENGTH_LONG).show();
return;
}
Series newSeries = new Series(newName, numView.getText().toString());
confirmEditSeries(series, newSeries);
dialog.dismiss();
}
});
Button cancelButton = (Button) dialog.findViewById(R.id.cancel);
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
private void confirmEditSeries(final Series oldSeries, final Series newSeries) {
// First, deal with a some special cases...
boolean nameIsSame = (newSeries.name.compareTo(oldSeries.name) == 0);
// Case: Unchanged.
if (nameIsSame && newSeries.num.compareTo(oldSeries.num) == 0) {
// No change to anything; nothing to do
return;
}
if (nameIsSame) {
// Same name, different number... just update
oldSeries.copyFrom(newSeries);
Utils.pruneSeriesList(mList);
Utils.pruneList(mDbHelper, mList);
mAdapter.notifyDataSetChanged();
return;
}
// Get the new IDs
oldSeries.id = mDbHelper.lookupSeriesId(oldSeries);
newSeries.id = mDbHelper.lookupSeriesId(newSeries);
// See if the old series is used in any other books.
long nRefs = mDbHelper.getSeriesBookCount(oldSeries);
boolean oldHasOthers = nRefs > (mRowId == 0 ? 0 : 1);
// Case: series is the same (but different case), or is only used in this book
if (newSeries.id == oldSeries.id || !oldHasOthers) {
// Just update with the most recent spelling and format
oldSeries.copyFrom(newSeries);
Utils.pruneSeriesList(mList);
Utils.pruneList(mDbHelper, mList);
mDbHelper.sendSeries(oldSeries);
mAdapter.notifyDataSetChanged();
return;
}
// When we get here, we know the names are genuinely different and the old series is used in more than one place.
String format = getResources().getString(R.string.changed_series_how_apply);
String allBooks = getResources().getString(R.string.all_books);
String thisBook = getResources().getString(R.string.this_book);
String message = String.format(format, oldSeries.name, newSeries.name, allBooks);
final AlertDialog alertDialog = new AlertDialog.Builder(this).setMessage(message).create();
alertDialog.setTitle(getResources().getString(R.string.scope_of_change));
alertDialog.setIcon(android.R.drawable.ic_menu_info_details);
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, thisBook, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
oldSeries.copyFrom(newSeries);
Utils.pruneSeriesList(mList);
Utils.pruneList(mDbHelper, mList);
mAdapter.notifyDataSetChanged();
alertDialog.dismiss();
}
});
alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, allBooks, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mDbHelper.globalReplaceSeries(oldSeries, newSeries);
oldSeries.copyFrom(newSeries);
Utils.pruneSeriesList(mList);
Utils.pruneList(mDbHelper, mList);
mAdapter.notifyDataSetChanged();
alertDialog.dismiss();
}
});
alertDialog.show();
}
@Override
protected boolean onSave(Intent intent) {
final AutoCompleteTextView t = ((AutoCompleteTextView)EditSeriesList.this.findViewById(R.id.series));
Resources res = this.getResources();
String s = t.getText().toString().trim();
if (s.length() > 0) {
final AlertDialog alertDialog = new AlertDialog.Builder(this).setMessage(res.getText(R.string.unsaved_edits)).create();
alertDialog.setTitle(res.getText(R.string.unsaved_edits_title));
alertDialog.setIcon(android.R.drawable.ic_menu_info_details);
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, res.getText(R.string.yes), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
t.setText("");
findViewById(R.id.confirm).performClick();
}
});
alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, res.getText(R.string.no), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//do nothing
}
});
alertDialog.show();
return false;
} else {
return true;
}
};
}