// ------------------------------------------
package com.xarxaire.griba.fregedemo;
import com.xarxaire.griba.fregedemo.R; // resources
import com.xarxaire.griba.fregedemo.Model ;
import com.xarxaire.griba.fregedemo.Model.TSample ;
import com.xarxaire.griba.fregedemo.JFregeIterator ;
import frege.rt.Box ;
// ... other android and Java imports
public class Android_FregeDemoActivity extends Activity {
public final static String CITY = "city" ;
public final static String CTDATA = "ctdata" ;
final String [] FROM = {CITY, CTDATA,} ;
final int [] TO = {R.id.city, R.id.ctdata, } ;
ListView myListView ;
LinkedList<TreeMap<String, ?>> rowList ;
EditText etCity, etCityData ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myListView = (ListView) findViewById(R.id.mylist) ;
myListView.setOnItemClickListener(new MyListHandler( this)) ;
etCity = (EditText) findViewById(R.id.etCity) ;;
etCityData = (EditText) findViewById(R.id.etCityData) ;
Model.modelInit( unit) ;
}
@Override
public void onStart() {
showModelData() ;
super.onStart() ;
}
public void addToList(View v) {
String city = etCity.getText().toString() ;
String ctData = etCityData.getText().toString() ;
int intCityData = Integer.valueOf( ctData) ;
myModelAdd( city, intCityData) ;
}
private void myModelAdd(String city, int ctdata) {
Model.modelAdd( Box.<String>mk(city),
Box.Int.mk(ctdata)) ;
showModelData() ;
Toast.makeText(this, "Added in the Frege model", Toast.LENGTH_LONG).show() ;
}
private void myModelRemove( String city) {
Model.modelRemove( Box.<String>mk(city)) ;
showModelData() ;
Toast.makeText(this, "Removed in the Frege model", Toast.LENGTH_LONG).show() ;
}
@SuppressWarnings("rawtypes")
private void showModelData() {
@SuppressWarnings("unchecked")
JFregeIterator<TSample> iter = (JFregeIterator<TSample>) ((Box<JFregeIterator>) Model.modelGetListIterator( unit)).j ;
rowList = new LinkedList<TreeMap<String, ?>>() ;
TreeMap<String, Object> row ;
while (iter.hasNext()) {
row = new TreeMap<String, Object>(String.CASE_INSENSITIVE_ORDER) ;
try {
TSample obj = (TSample) iter.next() ;
String city = TSample.city( obj) ;
int ctdata = TSample.amount( obj) ;
row.put( CITY, city) ;
row.put( CTDATA, ctdata) ;
rowList.addLast( row) ;
}
catch (NoSuchElementException e) {
// no envisaged
System.out.println( e.getMessage()) ;
}
}
// Set up data binding
SimpleAdapter adapter = new SimpleAdapter (this, rowList, R.layout.item, FROM, TO) ;
myListView.setAdapter(adapter);
}
class MyListHandler implements OnItemClickListener {
Context ctx ;
MyListHandler( Context ctx) {
this.ctx = ctx ;
}
public void onItemClick(AdapterView<?> parent, View v, int pos,
long id) {
final String myCity = (String) rowList.get((int) id).get(CITY) ;
// Delete confirmation
new AlertDialog.Builder(ctx)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Confirm delete")
.setMessage("Delete entry \""+myCity+"\" ?")
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
myModelRemove( myCity) ;
}
})
.show();
}
}
}
// ------------------------------------------
// ------------------------------------------
--------------------------------------------
-- Model.fr
--------------------------------------------
module com.xarxaire.griba.fregedemo.Model where
data MyJFregeIterator s = native JFregeIterator where
pure native new JFregeIterator.getInstance :: [t] -> (MyJFregeIterator s)
data Sample = Sample {city::String, amount::Int}
derive Eq Sample
sampleList = [Sample "Paris" 2, Sample "Berlin" 3, Sample "Barcelona" 1]
data JModelRoot myStructure s = native ModelRoot where
-- instance methods
native getModelStructure :: JModelRoot myStructure RealWorld -> IO myStructure
native setModelStructure :: JModelRoot myStructure RealWorld -> myStructure -> IO ()
type MyStructure = [Sample]
type MyModelRoot = JModelRoot MyStructure RealWorld
-- static methods
native jmrInitSingleton ModelRoot.initSingleton :: MyStructure -> IO MyModelRoot
native jmrGetInstance ModelRoot.getInstance :: () -> IO (Maybe MyModelRoot)
modelInit () = IO.performUnsafe (jmrInitSingleton( sampleList))
modelAdd :: String -> Int -> ()
modelAdd mycity amt = IO.performUnsafe (modelDoAdd mycity amt)
modelDoAdd :: String -> Int -> IO ()
modelDoAdd mycity amt
= do
maybeInstance <- jmrGetInstance ()
case maybeInstance of
Nothing -> error "you should initialise modelRoot first"
Just modelRoot -> do {
myList <- modelRoot.getModelStructure ;
modelRoot.setModelStructure ((Sample mycity amt) : myList) ;
}
modelRemove myCity = IO.performUnsafe (modelDoRemove myCity)
modelDoRemove :: String -> IO ()
modelDoRemove myCity = do
maybeInstance <- jmrGetInstance ()
case maybeInstance of
Nothing -> error "you should initialise modelRoot first"
Just modelRoot -> do {
myList <- modelRoot.getModelStructure ;
let newList = filter (\(obj :: Sample) -> obj.city != myCity) myList
in modelRoot.setModelStructure (newList) ;
}
modelGetListIterator () = IO.performUnsafe (modelReturnListIterator ())
modelReturnListIterator :: () -> IO (MyJFregeIterator RealWorld)
modelReturnListIterator ()
= do
myInstance <- jmrGetInstance ()
case myInstance of
Nothing -> error "you should initialise modelRoot first"
Just modelRoot -> do {
myList <- modelRoot.getModelStructure ;
return (MyJFregeIterator.new (myList :: MyStructure)) ;
}
--------------------------------------------
--------------------------------------------
Thanks to you for the Frege compiler!!
I have problems with ''do'' subblocs parsing, so I used the semicolon separated syntax { ; ; }
Cheers!
Gabriel Riba.