]> matita.cs.unibo.it Git - logicplayer.git/blob - mainActivity/src/com/example/furt/myapplication/touchnodeHandler.java
New version (to be tested).
[logicplayer.git] / mainActivity / src / com / example / furt / myapplication / touchnodeHandler.java
1 package com.example.furt.myapplication;
2
3 import android.graphics.Color;
4 import android.graphics.Paint;
5 import android.util.TypedValue;
6 import android.view.View;
7 import android.view.ViewGroup;
8 import android.widget.Button;
9 import android.widget.RelativeLayout;
10 import android.widget.TextView;
11
12 import java.util.ArrayList;
13 import java.util.List;
14
15 public class touchnodeHandler implements View.OnClickListener {
16     static RuleDialog ruleDialog; //il ruleDialog da far comparire nel caso in cui l'utente voglia visualizzare le regole di introduzione disponibili
17     Node n; //nodo a cui è legato questo handler
18     touchnodeHandler(Node node) {
19         n=node; ruleDialog=null;
20     }
21     @Override
22     public void onClick(View view) {
23         Paint p=new Paint();
24         n.hasFocus=true; //il nodo cliccato ha il focus
25         TextView v=(TextView)view;
26         v.setTextColor(Color.RED); //colorazione rossa per il nodo
27         if (DrawActivity.selectedNode!=null)
28             if (DrawActivity.selectedNode.view==view) { //doppio clic sul nodo: parte il Dialog per le regole di introduzione
29                 if (DrawActivity.selectedNode.Children.size()==0){
30                     List<IntroductionRule> L=new ArrayList<IntroductionRule>();
31                     for (IntroductionRule r: DrawActivity.selectedNode.F.introductionRules())
32                     {
33                         if (r.getPriority()!=0) //short click: aggiungo solo le regole a priorità alta
34                             L.add(r);
35                     }
36                     if (L.size()==1) //c'è una sola regola: la applico immediatamente.
37                     {
38                         Node selectedRule=L.get(0).createNodes(new askFormula());
39                         for (Node n : selectedRule.Children) {
40                             for (Hypothesis hp : n.NodeHP)
41                                 hp.fromNode = DrawActivity.selectedNode; //le ipotesi dei nuovi figli provengono dal nodo in cui stanno per essere inserite
42                             n.addHPList(DrawActivity.selectedNode.NodeHP);
43                             n.handler = null;
44                             DrawActivity.selectedNode.addChild(n);
45                         }
46                         DrawActivity.selectedNode.hasFocus = false;
47                         DrawActivity.selectedNode.ruleName = selectedRule.Children.get(0).ruleName;
48                         DrawActivity.selectedNode.Children.get(0).hasFocus = true;
49                         DrawActivity.nmoves++;
50                         DrawActivity.rootNode.Clean();
51                         DrawActivity.startDraw();
52                         return;
53                     }
54                     else {
55                         //parte il ruleDialog
56                         ruleDialog = new RuleDialog(DrawActivity.selectedNode.F.introductionRules());
57                         ruleDialog.show(DrawActivity.fragmentManager, "CIAO");
58                     }
59                 }
60                 else //nodo intermedio: parte il Dialog per le operazioni di copia/cancella
61                 {
62                     CopyPasteDialog copyPasteDialog=new CopyPasteDialog(DrawActivity.selectedNode);
63                     copyPasteDialog.show(DrawActivity.fragmentManager,"");
64                 }
65                 return;
66             }
67         int i,size;
68         if (DrawActivity.selectedNode!=null) { //c'era già un selectedNode: lo ricoloro adeguatamente.
69             if(DrawActivity.selectedNode.status==Node.OPEN || DrawActivity.selectedNode.status==Node.FAKE)
70                 DrawActivity.selectedNode.view.setTextColor(Color.BLACK);
71             else
72                 DrawActivity.selectedNode.view.setTextColor(Color.GRAY);
73         }
74         DrawActivity.selectedNode = n;
75         DrawActivity.globalHP.removeAllViews(); //rimuovo le eventuali vecchie ipotesi per mostrare quelle del nuovo selectedNode
76         size = n.NodeHP.size(); //numero di ipotesi
77         int leftID=0; //ID dell'eventuale ipotesi a destra della quale dev'essere posizionata l'ipotesi (0=assente)
78         int headID=0; //ID dell'eventuale ipotesi sotto la quale deve comparire l'ipotesi (0=assente)
79         float sum=0; //lunghezza raggiunta finora: se supera la larghezza dello schermo devo andare a capo
80         for (i = 0; i<size; i++) //fa apparire le ipotesi cancellate
81         {
82             final TextView newT=new TextView(view.getContext());
83             RelativeLayout.LayoutParams myP=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
84             newT.setText(n.NodeHP.get(i).HP.toString());
85             newT.setTextSize(TypedValue.COMPLEX_UNIT_SP,30);
86             newT.setId(DrawActivity.globalId++);
87             if (i==0) //prima ipotesi: sarà il leftID per le successive
88                 leftID=newT.getId();
89             myP.setMargins(50,0,0,0);
90             float thisSize;
91             p.setTextSize(30);
92             thisSize=p.measureText(newT.getText().toString()); //misuro la larghezza dell'ipotesi inserita
93             thisSize+=thisSize*0.2; //con un'approssimazione per eccesso del 20%
94             sum+=thisSize; //aggiungo alla somma totale la larghezza di questa ipotesi e della spaziatura
95             sum+=50;
96             if (sum>(DrawActivity.v.widthPixels+20)) //ho superato la larghezza dello schermo: devo andare a capo
97             {
98                 sum=thisSize; //il nuovo nodo è il primo della nuova riga
99                 headID=leftID; //tutti gli altri devono stare sotto un nodo della riga precedente
100             }
101             else
102                 myP.addRule(RelativeLayout.RIGHT_OF,leftID); //non vado a capo: mi limito a posizionarmi a destra del leftID
103             if (headID!=0)
104                 myP.addRule(RelativeLayout.BELOW,headID); //mi posiziono sotto l'headID se esiste
105             newT.setLayoutParams(myP);
106             List<EliminationRule> R=n.NodeHP.get(i).HP.EliminationRules();
107             if (R.size()!=0) { //ci sono regole di eliminazione per questa formula
108                 Node L= R.get(0).createNodes(null,new askFormula());
109                 newT.setOnClickListener(new touchHPHandler(L,n.NodeHP.get(i)));
110             }
111             else //setto comunuqe il listener nel caso in cui la formula venga scaricata
112                 newT.setOnClickListener(new touchHPHandler(null,n.NodeHP.get(i)));
113             newT.setOnLongClickListener(new LongHPClick(n.NodeHP.get(i).fromNode)); //setto un longclick listener che mostra il nodo da cui viene l'ipotesi
114             leftID=newT.getId(); //aggiorno il leftID
115             DrawActivity.globalHP.addView(newT);
116         }
117         //disegno il bottone utilizzando lo stesso algoritmo utilizzato per le ipotesi
118
119         final Button elim=new Button(view.getContext());
120         RelativeLayout.LayoutParams myP=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
121         elim.setText("Nuova...");
122         elim.setTextSize(TypedValue.COMPLEX_UNIT_SP,16);
123         elim.setId(DrawActivity.globalId++);
124         myP.setMargins(50,0,0,0);
125         p.setTextSize(16);
126         float buttonSize=p.measureText("Nuova...");
127         sum+=buttonSize;
128         if (sum>(DrawActivity.v.widthPixels/1.5)) //ho superato la larghezza dello schermo: devo andare a capo
129         {
130             headID=leftID;
131         }
132         else
133             myP.addRule(RelativeLayout.RIGHT_OF,leftID);
134         if (headID!=0)
135             myP.addRule(RelativeLayout.BELOW, headID);
136         elim.setLayoutParams(myP);
137         elim.setOnClickListener(new View.OnClickListener() {
138             @Override
139             public void onClick(View v) {
140                 parserDialog p=new parserDialog();
141                 p.show(DrawActivity.fragmentManager, ""); //parte l'editor per inserire nuove formule
142             }
143         });
144         DrawActivity.globalHP.addView(elim);
145     }
146 }
147
148