diff --git a/res/values-es/arrays.xml b/res/values-es/arrays.xml
index f8a0d1c85af4a2de87df0f928e5a8389e14e50cf..47cf7031181fef1f5050ee52cd33416b6980ebfc 100644
--- a/res/values-es/arrays.xml
+++ b/res/values-es/arrays.xml
@@ -14,4 +14,9 @@
- 3
- 4
+
+ - Eliminar
+ - Copiar
+ - Editar
+
\ No newline at end of file
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 2d77e995da6aa0627900ee2c635fa4cab62a0ac1..caebd6b41d50a3ff510d49249e14dcd421f9214a 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -115,6 +115,11 @@
Eliminar
Cancelar
+ Copiar Misión
+ Desea copiar la misión
+ Copiar
+ Cancelar
+
Resetear Config.
Se dispone a resetear toda configuración y datos a los valores por defecto (Las misiones se guardarán)
Resetear
diff --git a/res/values-fr/arrays.xml b/res/values-fr/arrays.xml
index 944e0c6e0b3f4199f29de51e5310ef39ff462c5f..f2634f2393cc9adf4e47bd018ff07fafa1d2d87d 100644
--- a/res/values-fr/arrays.xml
+++ b/res/values-fr/arrays.xml
@@ -14,4 +14,9 @@
- 3
- 4
+
+ - Enlever
+ - Copier
+ - Modifier
+
\ No newline at end of file
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index a69ea98534f159fd9f5d0e8a33f37836edec460b..13a98f6175b15aab4187b7b7f27c62d37d0f9818 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -116,6 +116,11 @@
Supprimer
Annuler
+ Copier Mission
+ Voulez-vous copier la mission
+ Copier
+ Annuler
+
Réinitialiser Config.
Vous êtes en train de réinitialiser toute configuration et données avec les valeurs par défaut (Les missions sont sauvegardés)
Réinitialiser
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 7a9e0f68aa121083efdaaabc76fceef227bcc0ef..bad396788f3702c8c639c033562ff6a1af6e3af7 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -14,4 +14,9 @@
- 3
- 4
+
+ - Remove
+ - Copy
+ - Edit
+
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1735f4a1c221c08270e39cfef4c56de02b901262..2d358f2cc5bdd01a0ddac0990abec6314e844588 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -115,6 +115,11 @@
Delete
Cancel
+ Copy Mission
+ Do you want to copy the mission
+ Copy
+ Cancel
+
Reset Config.
You are going to reset all configurations and data to default values (Missions will be kept)
Reset
diff --git a/src/cs/si/stavor/dialogs/CopyMissionDialogFragment.java b/src/cs/si/stavor/dialogs/CopyMissionDialogFragment.java
new file mode 100644
index 0000000000000000000000000000000000000000..8531c55bf98132afdc4774d3b309396617ac25a3
--- /dev/null
+++ b/src/cs/si/stavor/dialogs/CopyMissionDialogFragment.java
@@ -0,0 +1,94 @@
+package cs.si.stavor.dialogs;
+
+import java.io.IOException;
+
+import cs.si.stavor.R;
+import cs.si.stavor.MainActivity;
+import cs.si.stavor.StavorApplication;
+import cs.si.stavor.database.SerializationUtil;
+import cs.si.stavor.database.MissionReaderContract.MissionEntry;
+import cs.si.stavor.mission.Mission;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.ContentValues;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+/**
+ * Dialog to prevent unwilling mission removals
+ * @author Xavier Gibert
+ *
+ */
+public class CopyMissionDialogFragment extends DialogFragment {
+ private static final String ARG_NAME = "mission_name";
+ private static final String ARG_ID = "mission_id";
+ private static final String ARG_CLASS = "mission_class";
+
+ public static CopyMissionDialogFragment newInstance(int id, String name, Mission mis_class) {
+ CopyMissionDialogFragment fragment = new CopyMissionDialogFragment();
+ Bundle args = new Bundle();
+ args.putString(ARG_NAME, name);
+ args.putInt(ARG_ID, id);
+ args.putSerializable(ARG_CLASS, mis_class);
+ fragment.setArguments(args);
+ return fragment;
+ }
+ int mission_id;
+ Mission mission;
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ // Use the Builder class for convenient dialog construction
+ String mis_name = getArguments().getString(ARG_NAME);
+ int mis_id = getArguments().getInt(ARG_ID);
+ mission_id = mis_id;
+ mission = (Mission) getArguments().getSerializable(ARG_CLASS);
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setTitle(getString(R.string.dialog_copy_title))
+ .setMessage(getString(R.string.dialog_copy_message)+" "+mis_name+"?")
+ .setCancelable(true)
+ .setPositiveButton(getString(R.string.dialog_copy_confirm), new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ // Dummy
+ copyMission();
+ }
+
+ });
+ builder.setNegativeButton(getString(R.string.dialog_copy_cancel), new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ // User cancelled the dialog
+ }
+ });
+ // Create the AlertDialog object and return it
+ return builder.create();
+ }
+
+ /**
+ * Delete Mission from database
+ * @param mission_id
+ */
+ private void copyMission() {
+ MainActivity act = ((MainActivity)getActivity());
+
+ ContentValues values = new ContentValues();
+ mission.name = mission.name+"_copy";
+ values.put(MissionEntry.COLUMN_NAME_NAME, mission.name);
+ values.put(MissionEntry.COLUMN_NAME_DESCRIPTION, mission.description);
+
+ try {
+ values.put(MissionEntry.COLUMN_NAME_CLASS, SerializationUtil.serialize(mission));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ // Insert the new row
+ ((StavorApplication)act.getApplication()).loader.insert(
+ MissionEntry.TABLE_NAME,
+ null,
+ values);
+
+ }
+
+}
diff --git a/src/cs/si/stavor/fragments/SimulatorFragment.java b/src/cs/si/stavor/fragments/SimulatorFragment.java
index 49b016d5898272ad5b30f4fd9586ede2072eac4d..7bf982fdab69bcfa18e60ecc40e270eba7cbd2fa 100644
--- a/src/cs/si/stavor/fragments/SimulatorFragment.java
+++ b/src/cs/si/stavor/fragments/SimulatorFragment.java
@@ -7,6 +7,7 @@ import cs.si.stavor.app.Parameters;
import cs.si.stavor.database.MissionReaderDbHelper;
import cs.si.stavor.database.SerializationUtil;
import cs.si.stavor.database.MissionReaderContract.MissionEntry;
+import cs.si.stavor.dialogs.CopyMissionDialogFragment;
import cs.si.stavor.dialogs.DeleteMissionDialogFragment;
import cs.si.stavor.mission.Mission;
import cs.si.stavor.mission.MissionAndId;
@@ -23,7 +24,11 @@ import android.content.Loader;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.graphics.Paint;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
@@ -166,7 +171,7 @@ public final class SimulatorFragment extends Fragment implements LoaderCallbacks
simulator.connect();
}else{
//Set mission
- MissionAndId mis = getSelectedMission();
+ MissionAndId mis = getMission(activeMissionId);
if(mis!=null){
simulator.setSelectedMission(mis.mission, mis.id);
simulator.connect();
@@ -225,7 +230,7 @@ public final class SimulatorFragment extends Fragment implements LoaderCallbacks
}else if (activeMissionId==0 ||activeMissionId==1 ||activeMissionId==2 ||activeMissionId==3){
Toast.makeText(getActivity().getApplicationContext(), getString(R.string.sim_local_mission_not_editable), Toast.LENGTH_LONG).show();
}else{
- MissionAndId mis = getSelectedMission();
+ MissionAndId mis = getMission(activeMissionId);
if(mis!=null){
((MainActivity)getActivity()).showMissionEditor(mis);
}else{
@@ -244,7 +249,7 @@ public final class SimulatorFragment extends Fragment implements LoaderCallbacks
* Returns the selected Mission from the database
* @return
*/
- private MissionAndId getSelectedMission(){
+ private MissionAndId getMission(int id){
String[] projection = {
MissionEntry._ID,
MissionEntry.COLUMN_NAME_CLASS
@@ -254,7 +259,7 @@ public final class SimulatorFragment extends Fragment implements LoaderCallbacks
MissionEntry.TABLE_NAME, // The table to query
projection, // The columns to return
MissionEntry._ID+" = ?", // The columns for the WHERE clause
- new String[]{Integer.toString(activeMissionId)}, // The values for the WHERE clause
+ new String[]{Integer.toString(id)}, // The values for the WHERE clause
"", // don't group the rows
"", // don't filter by row groups
null // The sort order
@@ -284,6 +289,17 @@ public final class SimulatorFragment extends Fragment implements LoaderCallbacks
newFragment.setCancelable(true);
newFragment.show(getFragmentManager(), "delete");
}
+
+ /**
+ * Shows the copy mission confirmation dialog
+ * @param id Mission id
+ * @param name Mission name
+ */
+ public void showCopyMissionDialog(int id, String name, Mission mis) {
+ DialogFragment newFragment = CopyMissionDialogFragment.newInstance(id, name, mis);
+ newFragment.setCancelable(true);
+ newFragment.show(getFragmentManager(), "copy");
+ }
/**
* Change the text color of the missions in list that is selected
@@ -400,4 +416,60 @@ public final class SimulatorFragment extends Fragment implements LoaderCallbacks
adapter.changeCursor(null);
}
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v,
+ ContextMenuInfo menuInfo) {
+ if (v.getId()==R.id.listView1) {
+ AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
+ String header = ((TextView)((ListView)v).getChildAt(info.position).findViewById(R.id.textViewMission)).getText().toString();
+ menu.setHeaderTitle(header);
+ String[] menuItems = getResources().getStringArray(R.array.missions_menu);
+ for (int i = 0; i