package org.solovyev.android.calculator.functions;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.text.TextUtils;
import jscl.math.function.Function;
import org.solovyev.android.Check;
import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.Engine;
import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.RemovalConfirmationDialog;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class EditFunctionFragment extends BaseFunctionFragment {
public EditFunctionFragment() {
super(R.layout.fragment_function_edit);
}
public static void show(@Nonnull FragmentActivity activity) {
show(null, activity.getSupportFragmentManager());
}
public static void show(@Nullable CppFunction function, @Nonnull Context context) {
if (!(context instanceof FunctionsActivity)) {
final Intent intent = new Intent(context, FunctionsActivity.getClass(context));
App.addIntentFlags(intent, false, context);
intent.putExtra(FunctionsActivity.EXTRA_FUNCTION, function);
context.startActivity(intent);
} else {
show(function, ((FunctionsActivity) context).getSupportFragmentManager());
}
}
public static void show(@Nullable CppFunction function, @Nonnull FragmentManager fm) {
App.showDialog(create(function), "function-editor", fm);
}
@Nonnull
private static BaseFunctionFragment create(@Nullable CppFunction function) {
final BaseFunctionFragment fragment = new EditFunctionFragment();
if (function != null) {
final Bundle args = new Bundle();
args.putParcelable(ARG_FUNCTION, function);
fragment.setArguments(args);
}
return fragment;
}
@Override
protected boolean applyData(@Nonnull @NonNull CppFunction function) {
try {
final Function oldFunction = isNewFunction() ? null : functionsRegistry.getById(function.id);
functionsRegistry.addOrUpdate(function.toJsclBuilder().create(), oldFunction);
return true;
} catch (RuntimeException e) {
setError(bodyLabel, e.getLocalizedMessage());
}
return false;
}
@Override
protected boolean validateName() {
final String name = nameView.getText().toString();
if (TextUtils.isEmpty(name)) {
setError(nameLabel, getString(R.string.cpp_field_cannot_be_empty));
return false;
}
if (!Engine.isValidName(name)) {
setError(nameLabel, getString(R.string.cpp_name_contains_invalid_characters));
return false;
}
final Function existingFunction = functionsRegistry.get(name);
if (existingFunction != null) {
if (!existingFunction.isIdDefined()) {
Check.shouldNotHappen();
setError(nameLabel, getString(R.string.function_already_exists));
return false;
}
if (isNewFunction()) {
// trying to create a new function with existing name
setError(nameLabel, getString(R.string.function_already_exists));
return false;
}
Check.isNotNull(function);
if (!existingFunction.getId().equals(function.getId())) {
// trying ti change the name of existing function to some other function's name
setError(nameLabel, getString(R.string.function_already_exists));
return false;
}
}
clearError(nameLabel);
return true;
}
protected void showRemovalDialog(@NonNull final CppFunction function) {
RemovalConfirmationDialog.showForFunction(getActivity(), function.name,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Check.isTrue(which == DialogInterface.BUTTON_POSITIVE);
functionsRegistry.remove(function.toJsclBuilder().create());
dismiss();
}
});
}
}