src/horaris/HoraroTransporta.java
author viric@mandarina
Sun, 14 Jan 2007 18:27:47 +0100
changeset 9 9f8e342f193e
parent 8 88f4defbb1db
child 10 757b42639637
permissions -rw-r--r--
Moving from MIDP2/CLDC1.1 to MIDP1/CLDC1.0. Added About windows.

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");

		try {
			show();
		} catch (Exception e)
		{
			System.err.println("Cannot create form: " + e);
			e.printStackTrace();
		}
	}

	public void show()
	{
		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);
		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();
		}
	}
}