import android.widget.Toast;
import java.sql.Timestamp;
-import java.util.ArrayList;
+
+import static java.lang.Thread.sleep;
public class DrawActivity extends FragmentActivity {
static Border[] b; //bordi per le borderedTextView
static FragmentManager fragmentManager;//per i dialog
static Node rootNode; //radice dell'albero corrente
- static ScrollView scroll;
+ static ScrollView scroll; //Vertical ScrollView contenente l'albero
static int nmoves=0;//numero di mosse
static int nerrors=0;//nomero di errori
static long startTime;//tempo di inizio dell'esercizio
static int globalId =10; //variabile incrementale per l'assegnazione di ID univoci
static DisplayMetrics v = new DisplayMetrics();//altezza lunghezza e densità dello schermo
+ //Informazioni per la comunicazione client-server: username, password, nome dell'esercizio e chiave di sessione.
static String user=null;
static String pass=null;
static String sessionKey=null;
setContentView(R.layout.activity_my);
//recupero e setto le variabili globali
- getWindowManager().getDefaultDisplay().getMetrics(v);
+ getWindowManager().getDefaultDisplay().getMetrics(v); //getMetrics() inserisce nella variabile V i dati metrici (altezza,larghezza,densità...) dello schermo del dispositivo
globalHP = (RelativeLayout) findViewById(R.id.hpscroll);
globalR = (RelativeLayout) findViewById(R.id.global);
- spaceSize = 2*(textSize/v.density);
+ spaceSize = 2*(textSize/v.density); //lo spazio tra due sottoalberi è di due caratteri vuoti
fragmentManager=getFragmentManager();
- copiedNode=null;
+ copiedNode=null; //inizialmente non ci sono ovviamente sottoalberi copiati
scroll=(ScrollView)findViewById(R.id.vscroll);
startTime=time();
b=new Border[1];
b[0]=new Border(BorderedTextView.BORDER_TOP);
b[0].setWidth(2);
+ //Recupero i dati passati dall'Intent: username, password, nome dell'esercizio da visualizzare e chiave di sessione
Bundle dati=getIntent().getExtras();
nomeEs=dati.getString("nomeEs");
user=dati.getString("user");
sessionKey=dati.getString("sessionKey");
//Creazione dell'albero: setto il rootNode e creo la Formula di partenza (F)
- if(!populateTree())
+ if(!populateTree()) //populateTree() ha fallito: file dell'esercizio corrotto.
return;
//Creazione dell'albero: setto i campi della view
globalId++;
selectedNode=null;
addFakes=false; //di default non vengono aggiunte regole false
- rootNode.setView(rootView,globalR);
+ rootNode.setView(rootView,globalR); //il rootNode viene legato al globalLayout attuale e alla TextView creata
rootNode.handler=new touchnodeHandler(rootNode);
+ rootNode.longHandler=new longnodeHandler(rootNode);
+ rootNode.hasFocus=true; //di default, la radice ha inizialmente il focus.
startDraw();
//imposto il listener per il pinch zoom
globalR.setPadding(0,0,(int)Math.max(rootNode.getRightOffset(),halfScreen),0);
globalR.getLayoutParams().height=(int)Math.max((v.heightPixels),(rootNode.getMaxHeight()+rootNode.getMaxHeight()*0.10)); //altezza della view=max(h_screen,h_tree). Aggiungo un 10% all'altezza dell'albero per approssimazione dei calcoli.
globalR.requestLayout(); //aggiorna i parametri e le dimensioni del RelativeLayout
- if (rootNode.treeHeight()< 3)
+ if (rootNode.getMaxHeight()<v.heightPixels/2) //se l'albero non ha raggiunto almeno la metà dello schermo scrollo la view fino in fondo per visualizzarlo interamente
scroll.fullScroll(ScrollView.FOCUS_DOWN);
rootNode.view.setOnClickListener(rootNode.handler);
- rootNode.hasFocus=true; //di default, la radice ha inizialmente il focus.
+ rootNode.view.setOnLongClickListener(rootNode.longHandler);
rootNode.view.getViewTreeObserver().removeOnGlobalLayoutListener(this); //rimuove il listener per evitare che la funzione parta nuovamente
rootNode.Draw();
-
}
});
}
@Override
+ public void onBackPressed() {
+ //abbandona esercizio e torna alla view con la lista degli esercizi
+ Intent i = new Intent(globalHP.getContext(), aggiornamento.class);
+ i.putExtra("user", user);
+ i.putExtra("pass", pass);
+ i.putExtra("sessionKey", sessionKey);
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ globalHP.getContext().startActivity(i);
+
+ }
+ @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.my, menu);
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
- if(id==R.id.action_paste) //incolla sottoalbero
- {
- if (DrawActivity.copiedNode == null) //non ci sono nodi da copiare
- return true;
- else if (!checkHP(DrawActivity.copiedNode, DrawActivity.selectedNode)) //ipotesi incompatibili: impossibile incollare in questo punto
- return true;
- else {
- Node tmp = duplicateNode(DrawActivity.copiedNode); //duplica il nodo copiato
- DrawActivity.selectedNode.ruleName=tmp.ruleName;
- DrawActivity.selectedNode.Children = new ArrayList<Node>();
- for (Node c:tmp.Children)
- DrawActivity.selectedNode.addChild(c); //incolla il sottoalbero del nodo copiato nella posizione richiesta
- DrawActivity.rootNode.Clean();
- DrawActivity.startDraw();
- }
- }
- else if(id==R.id.abandon)
+ if(id==R.id.abandon)
{ //abbandona esercizio e torna alla view con la lista degli esercizi
Intent i = new Intent(globalHP.getContext(), aggiornamento.class);
i.putExtra("user", user);
}
- public boolean checkHP(Node source,Node target) //controlla se le ipotesi di source sono compatibili per una copia in target
- {
- boolean found=false;
- if (!source.F.toString().equals(target.F.toString())) //se i nodi non hanno la stessa formula la copia è automaticamente impossibile
- return false;
- for (Hypothesis sourceHp:source.NodeHP) {
- for (Hypothesis destHp : target.NodeHP) {
- if (destHp.HP.toString().equals(sourceHp.HP.toString())) { //per ogni ipotesi nel nodo sorgente cerco se è disponibile nel nodo destinazione: in caso affermativo, proseguo il ciclo (found=true).
- found = true;
- break;
- }
- }
- if (!found)
- return false;
- else found=false;
- }
- return true;
- }
-
- public Node duplicateNode(Node src) //metodo di supporto che duplica un nodo
- {
- Node tmp=new Node(src.F);
- tmp.addHPList(src.NodeHP);
- tmp.ruleName=src.ruleName;
- for (Node n:src.Children) {
- tmp.addChild(duplicateNode(n));
- }
- return tmp;
- }
public class simpleOnScaleGestureListener extends
ScaleGestureDetector.SimpleOnScaleGestureListener {
int second= (int) ((endTime-startTime)/1000);
int minute=second/60;
Toast.makeText(context, "Esercizio completato in " + Integer.toString(nmoves) + " mosse!", Toast.LENGTH_LONG).show();
+ try {
+ sleep(2);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
Toast.makeText(context, "Hai commesso " + Integer.toString(nerrors) + " errori!", Toast.LENGTH_LONG).show();
+ try {
+ sleep(2);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
Toast.makeText(context, "Numero nodi dell'albero: " + Integer.toString(rootNode.count()), Toast.LENGTH_LONG).show();
+ try {
+ sleep(2);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
Toast.makeText(context, "Tempo impiegato: " + Integer.toString(minute) + " minuti e " + Integer.toString(second-(minute*60)) + " secondi", Toast.LENGTH_LONG).show();
//aggiungo l'esercizio al database
int voto=valutazione.voto(nomeEs,nmoves,second,rootNode.count(),nerrors);