Better memory use. Reuse of screens.
package horaris;
import ogdl.*;
import javax.microedition.lcdui.*;
import java.util.Vector;
import java.util.Hashtable;
import java.lang.Exception;
public class HoraroTransporta
implements CommandListener, ItemStateListener, Ekrano
{
private Graph radiko;
private Graph tagoj;
private Graph direktoj;
private Graph lokoj;
private Graph sencoj;
private Form myform;
private ChoiceGroup ftagoj;
private ChoiceGroup fsenco;
private ChoiceGroup fkomenco;
private ChoiceGroup ffino;
private Command cmd_sercxi;
private Command cmd_malantauxen;
private Ekrano last;
private TimeList mytimelist;
private Vector temporezulto;
private Vector tmpTempoj;
private Hashtable inforezulto;
public HoraroTransporta(Graph _radiko, Ekrano _last) throws Exception
{
radiko = _radiko;
last = _last;
tagoj = radiko.getNode("Dies");
lokoj = radiko.getNode("Llocs");
sencoj = radiko.getNode("Sentits");
myform = new Form("Cerca");
/* Items */
ftagoj = new ChoiceGroup("Dia", ChoiceGroup.MULTIPLE);
addTagoj(ftagoj);
myform.append(ftagoj);
defaultTagoj();
fsenco = new ChoiceGroup("Sentit", ChoiceGroup.EXCLUSIVE);
addSencoj(fsenco);
myform.append(fsenco);
fkomenco = new ChoiceGroup("Origen", ChoiceGroup.EXCLUSIVE);
addLokoj(fkomenco);
myform.append(fkomenco);
ffino = new ChoiceGroup("DestÃ", ChoiceGroup.EXCLUSIVE);
addLokoj(ffino);
myform.append(ffino);
defaultKomencoFino();
/* Commands */
cmd_sercxi = new Command("Buscar", Command.OK, 0);
cmd_malantauxen = new Command("Enrera", Command.BACK, 0);
myform.addCommand(cmd_sercxi);
myform.addCommand(cmd_malantauxen);
myform.setCommandListener(this);
myform.setItemStateListener(this);
show();
}
public void show()
{
mytimelist = null;
Main.display.setCurrent(myform);
}
private void addTagoj(ChoiceGroup g)
{
for (int i=0; i < tagoj.size(); i++)
g.append(tagoj.get(i).getName(), null);
}
private void addSencoj(ChoiceGroup g) {
for (int i=0; i < sencoj.size(); i++)
g.append(sencoj.get(i).getName(), null);
}
private void addLokoj(ChoiceGroup g) {
for (int i=0; i < lokoj.size(); i++)
g.append(lokoj.get(i).getName(), null);
}
private boolean inVector(Vector v, String s)
{
for (int i=0; i < v.size(); i++)
if(s.equals((String)v.elementAt(i)))
return true;
return false;
}
private void sercxiTempojn(Vector tagoj, String senco,
String komenco, String fino)
{
temporezulto = new Vector();
tmpTempoj = new Vector();
inforezulto = new Hashtable();
for (int i=0; i < radiko.size(); i++)
{
if (! radiko.get(i).getName().equals("Comboi"))
continue;
Graph veturo = radiko.get(i);
Graph gtmp;
boolean bona;
String elirtempo = null, alventempo = null;
/* Dies */
gtmp = veturo.getNode("Dies");
bona = false;
for(int j=0; j < gtmp.size(); j++)
{
if (inVector(tagoj, gtmp.get(j).getName()) )
bona = true;
}
if (bona != true)
continue;
/* Sentits */
gtmp = veturo.getNode("Sentit");
bona = false;
for(int j=0; j < gtmp.size(); j++)
{
if (senco.equals(gtmp.get(j).getName()))
bona = true;
}
if (bona != true)
continue;
/* Komenco kaj Fino */
gtmp = veturo.getNode("Hores");
for(int j=0; j < gtmp.size(); j++)
{
String stacio = gtmp.get(j).get(0).getName();
if (stacio.equals(komenco))
{
elirtempo = gtmp.get(j).getName();
}
else if (stacio.equals(fino))
{
alventempo = gtmp.get(j).getName();
}
}
if (elirtempo == null || alventempo == null)
continue;
/* Krei la informon aldonan */
gtmp = veturo.getNode("Comentari");
Vector comments = new Vector();
if (gtmp != null)
{
for (int j = 0; j < gtmp.size(); j++)
{
comments.addElement(gtmp.get(j).getName());
}
}
/* Trovita! */
addSortedTime(elirtempo, alventempo, comments);
}
/* Free memory */
tmpTempoj = null;
}
private Tempo str2Tempo(String s)
{
int i = s.indexOf('-');
return new Tempo(s.substring(0,i));
}
private void addSortedTime(String eliro, String alveno, Vector comments)
{
Tempo teliro = new Tempo(eliro);
boolean set = false;
String montro = eliro + "-" + alveno;
for(int i=0; i< tmpTempoj.size(); i++)
{
Tempo tmp;
tmp = (Tempo) tmpTempoj.elementAt(i);
if (tmp.compareTo(teliro) > 0)
{
set = true;
temporezulto.insertElementAt(montro, i);
tmpTempoj.insertElementAt(teliro, i);
break;
}
}
if (set == false)
{
temporezulto.addElement(montro);
tmpTempoj.addElement(teliro);
}
inforezulto.put(montro, comments);
}
public void commandAction(Command c, Displayable d)
{
if (c == cmd_sercxi)
{
Vector tagoj = new Vector();
for (int i = 0; i < ftagoj.size(); i++)
{
if (ftagoj.isSelected(i))
tagoj.addElement(ftagoj.getString(i));
}
String senco =
fsenco.getString(fsenco.getSelectedIndex());
String komenco =
fkomenco.getString(fkomenco.getSelectedIndex());
String fino =
ffino.getString(ffino.getSelectedIndex());
/* Donos rezulton en temporezulto kaj inforezulto */
sercxiTempojn(tagoj, senco, komenco, fino);
if (temporezulto.size() > 0)
{
mytimelist = new TimeList(temporezulto, inforezulto, this);
mytimelist.show();
}
} else if (c == cmd_malantauxen)
{
last.show();
}
}
private void defaultTagoj()
{
for (int i = 0; i < ftagoj.size(); i++)
{
if (tagoj.getNode(ftagoj.getString(i)).get(0) != null)
ftagoj.setSelectedIndex(i, true);
else
ftagoj.setSelectedIndex(i, false);
}
}
private void defaultKomencoFino()
{
String elektita;
elektita = fsenco.getString(fsenco.getSelectedIndex());
Graph komenco;
komenco = sencoj.getNode(elektita).get(0);
if (komenco == null)
return;
for (int i = 0; i < fkomenco.size(); i++)
if (fkomenco.getString(i).equals(komenco.getName()))
fkomenco.setSelectedIndex(i, true);
Graph fino;
fino = sencoj.getNode(elektita).get(1);
if (fino == null)
return;
for (int i = 0; i < ffino.size(); i++)
if (ffino.getString(i).equals(fino.getName()))
ffino.setSelectedIndex(i, true);
}
public void itemStateChanged(Item item)
{
if (item == fsenco)
{
defaultKomencoFino();
}
}
}