package com.hdweiss.morgand.gui.edit; import android.app.Activity; import android.app.DialogFragment; import android.app.FragmentTransaction; import android.os.Bundle; import android.view.KeyEvent; import android.view.inputmethod.EditorInfo; import android.widget.TextView; import com.hdweiss.morgand.Application; import com.hdweiss.morgand.data.dao.OrgNode; import com.hdweiss.morgand.data.dao.OrgNodeRepository; import com.hdweiss.morgand.events.DataUpdatedEvent; import com.hdweiss.morgand.gui.edit.controller.AddController; import com.hdweiss.morgand.gui.edit.controller.BaseEditController; import com.hdweiss.morgand.gui.edit.controller.EditController; public abstract class BaseEditFragment extends DialogFragment implements TextView.OnEditorActionListener { public static BaseEditFragment getEditFragment(OrgNode node) { BaseEditFragment fragment; switch (node.type) { case Headline: fragment = new EditHeadingFragment(); break; case Date: fragment = new EditDateFragment(); break; default: fragment = new EditTextFragment(); break; } setFragmentArguments(fragment, node.Id, BaseEditController.EditMode.Edit); return fragment; } public static BaseEditFragment getAddFragment(OrgNode node) { BaseEditFragment fragment = new EditHeadingFragment(); setFragmentArguments(fragment, node.Id, BaseEditController.EditMode.Add); return fragment; } private static void setFragmentArguments(BaseEditFragment fragment, int nodeId, BaseEditController.EditMode mode) { Bundle argumentBundle = new Bundle(); argumentBundle.putInt("nodeId", nodeId); argumentBundle.putString("mode", mode.name()); fragment.setArguments(argumentBundle); } protected BaseEditController controller; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int nodeId = getArguments().getInt("nodeId", -1); if (nodeId == -1) throw new IllegalArgumentException("No nodeId given"); OrgNode node = OrgNodeRepository.queryForId(nodeId); String editModeString = getArguments().getString("mode", "edit"); BaseEditController.EditMode mode = BaseEditController.EditMode.valueOf(editModeString); switch (mode) { case Add: this.controller = new AddController(node, OrgNode.Type.Headline); break; case Edit: default: this.controller = new EditController(node); break; } } public abstract OrgNode getEditedNode(); public void show(Activity activity) { FragmentTransaction fragmentTransaction = activity.getFragmentManager().beginTransaction(); fragmentTransaction.add(this, "dialog"); fragmentTransaction.commit(); } @Override public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) { if (EditorInfo.IME_ACTION_DONE == actionId) { if (controller != null) { OrgNode editedNode = getEditedNode(); controller.save(editedNode); Application.getBus().post(new DataUpdatedEvent()); } dismiss(); return true; } return false; } }