From e3fb89fafd3b190d6674fe7a09764f8a7e05de82 Mon Sep 17 00:00:00 2001
From: Maxime Graulich <maxime.graulich@gmail.com>
Date: Thu, 5 Sep 2013 08:15:45 +0000
Subject: [PATCH] Android: add listeners on options changed

---
 .../src/org/geuz/onelab/MainActivity.java     | 31 ++++----------
 .../src/org/geuz/onelab/ModelFragment.java    | 18 +++++---
 .../geuz/onelab/OptionsDisplayFragment.java   | 30 ++++----------
 .../src/org/geuz/onelab/OptionsFragment.java  | 12 ++++++
 .../org/geuz/onelab/OptionsModelFragment.java | 29 ++++++++++---
 .../onelab/OptionsPostProcessingFragment.java |  2 +-
 .../src/org/geuz/onelab/Parameter.java        | 14 ++-----
 .../src/org/geuz/onelab/ParameterNumber.java  | 40 +++++++-----------
 .../src/org/geuz/onelab/ParameterString.java  | 41 ++++++++++---------
 9 files changed, 105 insertions(+), 112 deletions(-)

diff --git a/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java b/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java
index 9c891dfab2..ee2d90cb05 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java
@@ -20,7 +20,7 @@ import android.view.Window;
 import android.view.WindowManager;
 
 
-public class MainActivity extends Activity implements OptionsDisplayFragment.OnOptionRequestRender{
+public class MainActivity extends Activity{
 
 	private Gmsh _gmsh;
 	private boolean _compute, _twoPane;
@@ -68,6 +68,12 @@ public class MainActivity extends Activity implements OptionsDisplayFragment.OnO
     		_modelFragment = ModelFragment.newInstance(_gmsh);
     		getFragmentManager().beginTransaction().add(R.id.model_fragment, _modelFragment).commit();
     	}
+    	_optionsFragment.setOnOptionsChangedListener(new OptionsFragment.OnOptionsChangedListener() {
+			
+			public void OnOptionsChanged() {
+				_modelFragment.requestRender();
+			}
+		});
 	}
 	
 	@Override
@@ -136,22 +142,6 @@ public class MainActivity extends Activity implements OptionsDisplayFragment.OnO
     	protected void onPreExecute() {
     		_compute = true;
     		_runStopMenuItem.setTitle(R.string.menu_stop);
-    		/*loading.setTitle("Please wait");
-        	loading.setButton(DialogInterface.BUTTON_NEUTRAL, "Hide", new DialogInterface.OnClickListener() {
-    			
-    			public void onClick(DialogInterface dialog, int which) {
-    				loading.dismiss();
-    			}
-    		});
-        	loading.setButton(DialogInterface.BUTTON_NEGATIVE, "Stop", new DialogInterface.OnClickListener() {
-    			
-    			public void onClick(DialogInterface dialog, int which) {
-    				gmsh.onelabCB("stop");
-    			}
-    		});
-    		loading.setMessage("...");
-    		loading.show();
-    		reset.setEnabled(false);*/
     		super.onPreExecute();
     	}
     	
@@ -171,22 +161,19 @@ public class MainActivity extends Activity implements OptionsDisplayFragment.OnO
 		}
     	
     }
-	public void onRequestRender() {
-		_modelFragment.requestRender();
-	}
 	private void showError(){
     	if(_errors.size()>0){
     		if(_errorDialog != null && _errorDialog.isShowing()) _errorDialog.dismiss();
     		AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
     		_errorDialog = dialogBuilder.setTitle("Gmsh/GetDP Error(s)")
 		    .setMessage(_errors.get(_errors.size()-1))
-		    .setNegativeButton("Stop", new DialogInterface.OnClickListener() {
+		    .setNegativeButton("Hide", new DialogInterface.OnClickListener() {
 		        public void onClick(DialogInterface dialog, int which) {
 		        	_errors.clear();
 		        	_errorDialog.dismiss();
 		        }
 		     })
-		    .setPositiveButton("Continue", new DialogInterface.OnClickListener() {
+		    .setPositiveButton("Show more", new DialogInterface.OnClickListener() {
 		        public void onClick(DialogInterface dialog, int which) {
 		        	_errors.remove(_errors.size()-1);
 		        	_errorDialog.dismiss();
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/ModelFragment.java b/contrib/mobile/Android/src/org/geuz/onelab/ModelFragment.java
index 686984fbf0..d304722146 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/ModelFragment.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/ModelFragment.java
@@ -3,10 +3,12 @@ package org.geuz.onelab;
 import android.app.Fragment;
 import android.opengl.GLSurfaceView;
 import android.os.Bundle;
+import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.LinearLayout;
+import android.widget.ProgressBar;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
@@ -15,6 +17,7 @@ public class ModelFragment extends Fragment{
 	Gmsh _gmsh;
 	mGLSurfaceView _glView;
 	TextView _progress;
+	LinearLayout _progressLayout;
 	
 	public static ModelFragment newInstance(Gmsh g) {
 		ModelFragment fragment = new ModelFragment();
@@ -45,23 +48,26 @@ public class ModelFragment extends Fragment{
 		_glView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
 		_glView.requestRender();
 		glViewLayout.addView(_glView);
+		_progressLayout = new LinearLayout(container.getContext());
+		ProgressBar bar = new ProgressBar(container.getContext());
+		_progressLayout.addView(bar);
 		_progress = new TextView(container.getContext());
-		_progress.setAlpha(0);
+		_progressLayout.setAlpha(0);
+		_progressLayout.setGravity(Gravity.CENTER);
+		_progressLayout.addView(_progress);
 		RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
 			    RelativeLayout.LayoutParams.WRAP_CONTENT, 
 			    RelativeLayout.LayoutParams.WRAP_CONTENT);
 		layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
-		_progress.setPadding(10, 0, 10, 10);
-		_progress.setLayoutParams(layoutParams);
-		glViewLayout.addView(_progress);
+		glViewLayout.addView(_progressLayout, layoutParams);
 		return rootView;
 	}
 	public void showProgress(String progress) {
-		_progress.setAlpha(1);
+		_progressLayout.setAlpha(1);
 		_progress.setText(progress);
 	}
 	public void hideProgress() {
-		_progress.setAlpha(0);
+		_progressLayout.setAlpha(0);
 		_progress.setText("");
 	}
 	public void requestRender() {
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/OptionsDisplayFragment.java b/contrib/mobile/Android/src/org/geuz/onelab/OptionsDisplayFragment.java
index 5f5696b9a6..cab1edbac3 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/OptionsDisplayFragment.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/OptionsDisplayFragment.java
@@ -2,7 +2,6 @@ package org.geuz.onelab;
 
 import android.os.Bundle;
 import android.os.Parcelable;
-import android.app.Activity;
 import android.app.Fragment;
 import android.content.Intent;
 import android.graphics.Color;
@@ -51,7 +50,7 @@ public class OptionsDisplayFragment extends Fragment{
 			
 			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 				_gmsh.setDoubleOption("Geometry", "Points", (isChecked)?1. : 0.);
-				mCallback.onRequestRender();
+				if(mListener != null) mListener.OnModelOptionsChanged();
 			}
 		});
 		_listView.addItem("Display", showGeomPoints);
@@ -62,7 +61,7 @@ public class OptionsDisplayFragment extends Fragment{
 			
 			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 				_gmsh.setDoubleOption("Geometry", "Lines", (isChecked)?1. : 0.);
-				mCallback.onRequestRender();
+				if(mListener != null) mListener.OnModelOptionsChanged();
 			}
 		});
 		_listView.addItem("Display", showGeomLines);
@@ -73,7 +72,7 @@ public class OptionsDisplayFragment extends Fragment{
 			
 			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 				_gmsh.setDoubleOption("Mesh", "SurfaceEdges", (isChecked)?1. : 0.);
-				mCallback.onRequestRender();
+				if(mListener != null) mListener.OnModelOptionsChanged();
 			}
 		});
     	_listView.addItem("Display", showMeshSurfaceEdges);
@@ -84,7 +83,7 @@ public class OptionsDisplayFragment extends Fragment{
 			
 			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 				_gmsh.setDoubleOption("Mesh", "VolumeEdges", (isChecked)?1. : 0.);
-				mCallback.onRequestRender();
+				if(mListener != null) mListener.OnModelOptionsChanged();
 			}
 		});
     	_listView.addItem("Display", showMeshVolumesEdges);
@@ -107,7 +106,7 @@ public class OptionsDisplayFragment extends Fragment{
 				
 				public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 					_gmsh.setPView(myID, -1, (isChecked)? 1 : 0, -1);
-					mCallback.onRequestRender();
+					if(mListener != null) mListener.OnModelOptionsChanged();
 				}
 			});
         	Button button = new Button(_listView.getContext());
@@ -128,21 +127,10 @@ public class OptionsDisplayFragment extends Fragment{
 			_listView.addItem("Result", layout);
 		}
 	}
-	
-	@Override
-	public void onAttach(Activity activity) {
-		super.onAttach(activity);
-		try {
-            mCallback = (OnOptionRequestRender) activity;
-        } catch (ClassCastException e) {
-            throw new ClassCastException(activity.toString()
-                    + " must implement OnHeadlineSelectedListener");
-        }
 
-	}
-	
-	private OnOptionRequestRender mCallback;
-	public interface OnOptionRequestRender {
-		public void onRequestRender();
+	private OnModelOptionsChangedListener mListener;
+	public void setOnModelOptionsChangedListener(OnModelOptionsChangedListener listener) { mListener = listener;}
+	public interface OnModelOptionsChangedListener {
+		void OnModelOptionsChanged();
 	}
 }
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/OptionsFragment.java b/contrib/mobile/Android/src/org/geuz/onelab/OptionsFragment.java
index 496f3dbb9e..000742775b 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/OptionsFragment.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/OptionsFragment.java
@@ -41,6 +41,12 @@ public class OptionsFragment extends Fragment{
 			Bundle savedInstanceState) {
 		LinearLayout rootView = (LinearLayout)inflater.inflate(R.layout.fragment_options, container, false);
 		_optionModelFragment = OptionsModelFragment.newInstance(_gmsh);
+		_optionModelFragment.setOnModelOptionsChangedListener(new OptionsModelFragment.OnModelOptionsChangedListener() {
+			
+			public void OnModelOptionsChanged() {
+				if(mListener != null) mListener.OnOptionsChanged();
+			}
+		});
 		_optionDisplayFragment = OptionsDisplayFragment.newInstance(_gmsh);
 		final Button optionModel = (Button) rootView.findViewById(R.id.goto_options_model);
 		final Button optionDisplay = (Button) rootView.findViewById(R.id.goto_options_display);
@@ -91,4 +97,10 @@ public class OptionsFragment extends Fragment{
 		if(_optionDisplayFragment != null)_optionDisplayFragment.refresh();
 		if(_optionModelFragment != null)_optionModelFragment.refresh();
 	}
+	
+	private OnOptionsChangedListener mListener;
+	public void setOnOptionsChangedListener(OnOptionsChangedListener listener) { mListener = listener;}
+	public interface OnOptionsChangedListener {
+		void OnOptionsChanged();
+	}
 }
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/OptionsModelFragment.java b/contrib/mobile/Android/src/org/geuz/onelab/OptionsModelFragment.java
index 2eeb99ddf4..1c06970f08 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/OptionsModelFragment.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/OptionsModelFragment.java
@@ -3,6 +3,8 @@ package org.geuz.onelab;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.geuz.onelab.OptionsFragment.OnOptionsChangedListener;
+
 import android.app.Fragment;
 import android.os.Bundle;
 import android.view.LayoutInflater;
@@ -25,7 +27,6 @@ public class OptionsModelFragment extends Fragment{
 	public OptionsModelFragment() {
 		super();
 	}
-	
 	@Override
 	public void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
@@ -45,6 +46,7 @@ public class OptionsModelFragment extends Fragment{
 	public void refresh() {
 		if(_gmsh == null) return;
 		this.getAvailableParam();
+		if(_listView != null) _listView.refresh();
 	}
 	
 	private void getAvailableParam(){
@@ -64,15 +66,29 @@ public class OptionsModelFragment extends Fragment{
 			if(found) continue;
 			// add new parameter
 			if(s.split(Character.toString((char)0x03))[1].equals("number")){
-				final ParameterNumber mParam = new ParameterNumber(_listView.getContext(), _gmsh, mCallback, "");
+				final ParameterNumber mParam = new ParameterNumber(_listView.getContext(), _gmsh, "");
 				if(mParam.fromString(s) == -1) continue;
+				mParam.setOnParameterChangedListener(new ParameterNumber.OnParameterChangedListener() {
+					
+					public void OnParameterChanged() {
+						if(_gmsh.onelabCB("check") > 0 && mListener != null) mListener.OnModelOptionsChanged();;
+						refresh();
+					}
+				});
 				params.add(mParam);
 				if(_listView != null)
 					_listView.addItem(mParam.getName().split("/")[0].equals("Parameters")? mParam.getName().split("/")[0] + " > " + mParam.getName().split("/")[1]: mParam.getName().split("/")[0], mParam.getView());
 			}
 			else if(s.split("|")[1].equals("string")){
-				ParameterString mParam = new ParameterString(_listView.getContext(), _gmsh, mCallback, "");
+				ParameterString mParam = new ParameterString(_listView.getContext(), _gmsh, "");
 				if(mParam.fromString(s) != -1){
+					mParam.setOnParameterChangedListener(new ParameterString.OnParameterChangedListener() {
+						
+						public void OnParameterChanged() {
+							if(_gmsh.onelabCB("check") > 0 && mListener != null) mListener.OnModelOptionsChanged();
+							refresh();
+						}
+					});
 					params.add(mParam);
 					if(_listView != null)
 						_listView.addItem(mParam.getName().split("/")[0], mParam.getView());
@@ -80,8 +96,9 @@ public class OptionsModelFragment extends Fragment{
 			}
 		}
     }
-	private OnOptionRequestRender mCallback;
-	public interface OnOptionRequestRender {
-		public void onRequestRender();
+	private OnModelOptionsChangedListener mListener;
+	public void setOnModelOptionsChangedListener(OnModelOptionsChangedListener listener) { mListener = listener;}
+	public interface OnModelOptionsChangedListener {
+		void OnModelOptionsChanged();
 	}
 }
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/OptionsPostProcessingFragment.java b/contrib/mobile/Android/src/org/geuz/onelab/OptionsPostProcessingFragment.java
index 8ed043d9d3..14f4107c09 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/OptionsPostProcessingFragment.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/OptionsPostProcessingFragment.java
@@ -52,7 +52,7 @@ public class OptionsPostProcessingFragment extends Fragment{
 		LinearLayout layout =  (LinearLayout)inflater.inflate(R.layout.fragment_postprocessing, container, false);
 		final Spinner intervalsType = (Spinner)layout.findViewById(R.id.intervals_type);
 		final EditText intervals = (EditText)layout.findViewById(R.id.intervals);
-		final SeekBar raiseZ = (SeekBar)layout.findViewById(R.id.raisez);
+		final SeekBar raiseZ = (SeekBar)layout.findViewById(R.id.raisez); // TODO
 		intervalsType.setEnabled(infos[2].equals("1"));
 		ArrayList<String> choices;
 		ArrayAdapter<String> adapter;
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/Parameter.java b/contrib/mobile/Android/src/org/geuz/onelab/Parameter.java
index 75a4db6fd8..3542e046a2 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/Parameter.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/Parameter.java
@@ -1,8 +1,5 @@
 package org.geuz.onelab;
 
-
-import org.geuz.onelab.OptionsModelFragment.OnOptionRequestRender;
-
 import android.content.Context;
 import android.graphics.Color;
 import android.widget.LinearLayout;
@@ -12,18 +9,15 @@ import android.widget.TextView;
 public class Parameter {
 	protected Context _context;
 	protected Gmsh _gmsh;
-	protected SeparatedListView _listView;
-	protected OnOptionRequestRender _callback;
 	protected String _name;
 	protected String _label;
 	protected boolean _readOnly;
 	protected boolean _changed;
 	protected TextView _title;
 
-	public Parameter(Context context, Gmsh gmsh, OnOptionRequestRender callback, String name){
+	public Parameter(Context context, Gmsh gmsh, String name){
 		_context = context;
 		_gmsh = gmsh;
-		_callback = callback;
 		_readOnly = false;
 		_name = name;
 		_title = new TextView(context);
@@ -31,8 +25,8 @@ public class Parameter {
 		_title.setTextAppearance(context, android.R.style.TextAppearance_DeviceDefault_Medium);
 		_title.setTextColor(Color.DKGRAY);
 	}
-	public Parameter(Context context, Gmsh gmsh, OnOptionRequestRender callback, String name, boolean readOnly){
-		this(context, gmsh, callback, name);
+	public Parameter(Context context, Gmsh gmsh, String name, boolean readOnly){
+		this(context, gmsh, name);
 		_readOnly = readOnly;
 		_changed = false;
 	}
@@ -75,8 +69,6 @@ public class Parameter {
 	public boolean changed() { if(_changed){_changed=false; return true;}return _changed;}
 	public String getType(){return "Parameter";}
 	
-	public void setList(SeparatedListView list){ _listView = list;}
-	
 	public LinearLayout getView() {
 		LinearLayout paramLayout = new LinearLayout(_context);
 		paramLayout.setOrientation(LinearLayout.VERTICAL);
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/ParameterNumber.java b/contrib/mobile/Android/src/org/geuz/onelab/ParameterNumber.java
index d21964b926..ede4549b33 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/ParameterNumber.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/ParameterNumber.java
@@ -2,8 +2,6 @@ package org.geuz.onelab;
 
 import java.util.ArrayList;
 
-import org.geuz.onelab.OptionsModelFragment.OnOptionRequestRender;
-
 import android.content.Context;
 import android.text.Editable;
 import android.text.TextWatcher;
@@ -30,20 +28,20 @@ public class ParameterNumber extends Parameter{
 	private CheckBox _checkbox;
 	private EditText _edittext;
 	
-	public ParameterNumber(Context context, Gmsh gmsh, OnOptionRequestRender callback, String name){
-		super(context, gmsh, callback, name);
+	public ParameterNumber(Context context, Gmsh gmsh, String name){
+		super(context, gmsh, name);
 	}
-	public ParameterNumber(Context context, Gmsh gmsh, OnOptionRequestRender callback, String name,  double value, double min, double max, double step)
+	public ParameterNumber(Context context, Gmsh gmsh, String name,  double value, double min, double max, double step)
 	{
-		this(context, gmsh, callback, name);
+		this(context, gmsh, name);
 		_value = value;
 		_min = min;
 		_max = max;
 		_step = step;
 	}
-	public ParameterNumber(Context context, Gmsh gmsh, OnOptionRequestRender callback, String name, boolean readOnly, double value, double min, double max, double step)
+	public ParameterNumber(Context context, Gmsh gmsh, String name, boolean readOnly, double value, double min, double max, double step)
 	{
-		this(context, gmsh, callback, name, value, min, max, step);
+		this(context, gmsh, name, value, min, max, step);
 		_readOnly = readOnly;
 	}
 	
@@ -84,8 +82,9 @@ public class ParameterNumber extends Parameter{
 			Log.w("ParameterNumber", "Incorect value "+value+" (max="+_max+" min="+_min+")");
 			return;
 		}
-		if(value != _value)
-			_changed = true;
+		if(value == _value) return;
+		if(mListener != null) mListener.OnParameterChanged();
+		_changed = true;
 		_value = value;
 		this.update();
 	}
@@ -142,9 +141,7 @@ public class ParameterNumber extends Parameter{
 		int nChoix = Integer.parseInt(infos[pos++]); // choices' size
 		double choices[] = new double[nChoix];
 		for(int i=0; i<nChoix; i++)
-			if(nChoix == 2)
 				choices[i] = Double.parseDouble(infos[pos++]); // choice
-			else pos++;
 		int nLabels = Integer.parseInt(infos[pos++]); // labels' size
 		if(nChoix == 2 && choices[0] == 0 && choices[1] == 1 && nLabels == 0) {
 			_checkbox = new CheckBox(_context);
@@ -172,23 +169,14 @@ public class ParameterNumber extends Parameter{
 		if(_spinner != null) {
 			paramLayout.addView(_spinner);
 			_spinner.setEnabled(!_readOnly);
-			_spinner.setOnFocusChangeListener(new View.OnFocusChangeListener() {
-				
-				public void onFocusChange(View v, boolean hasFocus) {
-					if(_listView != null) _listView.refresh();
-				}
-			});
 			_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
 
 				public void onNothingSelected(AdapterView<?> arg0) {}
 
 				public void onItemSelected(AdapterView<?> parent, View view,
 						int pos, long id) {
-					if(_listView != null) _listView.refresh();
 					setValue(_values.get(pos));
 					_gmsh.setParam(getType(), getName(), String.valueOf(_values.get(pos)));
-					if(_gmsh.onelabCB("check") == 1 && _callback != null)
-						_callback.onRequestRender();
 				}
 
 			});
@@ -200,14 +188,11 @@ public class ParameterNumber extends Parameter{
 				
 				public void onStopTrackingTouch(SeekBar seekBar) {
 					_gmsh.setParam(getType(), getName(), String.valueOf(getValue())); // update parameter and the perform a check
-					if(_gmsh.onelabCB("check") == 1  && _callback != null)
-						_callback.onRequestRender();
 				}
 				
 				public void onStartTrackingTouch(SeekBar seekBar) {}
 				
 				public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-					if(_listView != null) _listView.refresh();
 					setValue(getMin() + getStep()*(double)progress);
 				}
 			});
@@ -219,7 +204,6 @@ public class ParameterNumber extends Parameter{
 			_checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
 				
 				public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-					if(_listView != null) _listView.refresh();
 					setValue((isChecked)? 1 : 0);
 					_gmsh.setParam(getType(), getName(), String.valueOf(_value));
 				}
@@ -247,7 +231,6 @@ public class ParameterNumber extends Parameter{
 			_edittext.addTextChangedListener(new TextWatcher() {
 				
 				public void onTextChanged(CharSequence s, int start, int before, int count) {
-					if(_listView != null) _listView.refresh();
 					double value = 1;
 					try {
 						if(s.length() < 1) value = 1;
@@ -269,4 +252,9 @@ public class ParameterNumber extends Parameter{
 		}
 		return paramLayout;
 	}
+	private OnParameterChangedListener mListener;
+	public void setOnParameterChangedListener(OnParameterChangedListener listener) { mListener = listener;}
+	public interface OnParameterChangedListener {
+		void OnParameterChanged();
+	}
 }
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/ParameterString.java b/contrib/mobile/Android/src/org/geuz/onelab/ParameterString.java
index ae6c5f8c38..8b4801b90b 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/ParameterString.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/ParameterString.java
@@ -2,8 +2,6 @@ package org.geuz.onelab;
 
 import java.util.ArrayList;
 
-import org.geuz.onelab.OptionsModelFragment.OnOptionRequestRender;
-
 import android.content.Context;
 import android.text.Editable;
 import android.text.TextWatcher;
@@ -25,8 +23,8 @@ public class ParameterString extends Parameter{
 	private Spinner _spinner;
 	private EditText _edittext;
 	
-	public ParameterString(Context context, Gmsh gmsh, OnOptionRequestRender callback, String name) {
-		super(context, gmsh, callback, name);
+	public ParameterString(Context context, Gmsh gmsh, String name) {
+		super(context, gmsh, name);
 		_choices = new ArrayList<String>();
 		_choices.add("-"); // Default choice
 	}
@@ -48,15 +46,24 @@ public class ParameterString extends Parameter{
 			_edittext.setText(_choices.get(0));
 	}
 	
-	public void setValue(int index) {if(index != _index)_changed = true;_index = index;this.update();}
+	public void setValue(int index) {
+		if(index == _index) return;
+		if(mListener != null) mListener.OnParameterChanged();
+		_changed = true;
+		_index = index;
+		this.update();
+	}
 	public void setValue(String value) {
 		int index = _choices.indexOf(value);
 		if(index < 0) { // the value is not in the list, add it
 			this.addChoices(value);
 			index = _choices.indexOf(value);
 		}
-		if(index != _index)_changed = true;
-		_index = index;this.update();
+		if(index == _index) return;
+		if(mListener != null) mListener.OnParameterChanged();
+		_changed = true;
+		_index = index;
+		this.update();
 	}
 	public void setKind(String kind) {_kind = kind;}
 	public void addChoices(String choice) {
@@ -73,6 +80,7 @@ public class ParameterString extends Parameter{
 	public int getIndex() {return _index;}
 	public ArrayList<String> getChoices() {return _choices;}
 	public int fromString(String s){
+		_choices.clear();
 		int pos = super.fromString(s);
 		if(pos <= 0) return -1; // error
 		String[] infos = s.split(Character.toString((char)0x03));
@@ -97,23 +105,15 @@ public class ParameterString extends Parameter{
 		if(_spinner != null){
 			paramLayout.addView(_spinner);
 			_spinner.setEnabled(!_readOnly);
-			_spinner.setOnFocusChangeListener(new View.OnFocusChangeListener() {
-				
-				public void onFocusChange(View v, boolean hasFocus) {
-					if(_listView != null) _listView.refresh();
-				}
-			});
 			_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
 
 				public void onNothingSelected(AdapterView<?> arg0) {}
 
 				public void onItemSelected(AdapterView<?> parent, View view,
 						int pos, long id) {
+					if(getValue() == getChoices().get(pos)) return;
 					setValue(pos);
 					_gmsh.setParam(getType(), getName(), String.valueOf(getValue()));
-					if(_gmsh.onelabCB("check") == 1 && _callback != null)
-						_callback.onRequestRender();
-					if(_listView != null) _listView.refresh();
 				}
 
 			});
@@ -136,9 +136,7 @@ public class ParameterString extends Parameter{
 			});
 			_edittext.addTextChangedListener(new TextWatcher() {
 				
-				public void onTextChanged(CharSequence s, int start, int before, int count) {
-					if(_listView != null) _listView.refresh();
-				}
+				public void onTextChanged(CharSequence s, int start, int before, int count) { } // UNUSED Auto-generated method stub
 				
 				public void beforeTextChanged(CharSequence s, int start, int count,
 						int after) {} // UNUSED Auto-generated method stub
@@ -150,5 +148,10 @@ public class ParameterString extends Parameter{
 		}
 		return paramLayout;
 	}
+	private OnParameterChangedListener mListener;
+	public void setOnParameterChangedListener(OnParameterChangedListener listener) { mListener = listener;}
+	public interface OnParameterChangedListener {
+		void OnParameterChanged();
+	}
 	
 }
-- 
GitLab