]> matita.cs.unibo.it Git - logicplayer.git/blobdiff - mainActivity/src/com/example/furt/myapplication/DrawActivity.java
New version (to be tested).
[logicplayer.git] / mainActivity / src / com / example / furt / myapplication / DrawActivity.java
index fea3a50c84a2b1bf50434e05d84480600f3c0d1c..f9a9c849807ecf29b34fa1047f92a65f42449457 100644 (file)
@@ -20,7 +20,8 @@ import android.widget.ScrollView;
 import android.widget.Toast;
 
 import java.sql.Timestamp;
-import java.util.ArrayList;
+
+import static java.lang.Thread.sleep;
 
 public class DrawActivity extends FragmentActivity {
 
@@ -34,7 +35,7 @@ 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
@@ -42,6 +43,7 @@ public class DrawActivity extends FragmentActivity {
     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;
@@ -54,17 +56,18 @@ public class DrawActivity extends FragmentActivity {
         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");
@@ -72,7 +75,7 @@ public class DrawActivity extends FragmentActivity {
         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
@@ -81,8 +84,10 @@ public class DrawActivity extends FragmentActivity {
         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
@@ -120,17 +125,27 @@ public class DrawActivity extends FragmentActivity {
                         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);
@@ -154,23 +169,7 @@ public class DrawActivity extends FragmentActivity {
     @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);
@@ -183,35 +182,6 @@ public class DrawActivity extends FragmentActivity {
     }
 
 
-    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 {
@@ -247,8 +217,23 @@ public class DrawActivity extends FragmentActivity {
             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);