/*
 * ActivityDependenceInterface.java
 *
 * Created on 17. prosinec 2000, 12:00
 * Documented 8.7.2001
 */

package timetable.data;

/** Třída poskytující základní rozhraní, které musí každá závislost mezi aktivitami splňovat.
 * <br>
 * Abychom mohli vyjádřit například, že jedna aktivita musí být před druhou, je nutné určit pořadí aktivit.
 * Proto má rozhraní dvěmetody pro nastavení aktivity, tj. nastavení první a druhé z nich.
 *
 * @author Tomáš Müller
 * @version 1.0
 */
public interface ActivityDependenceInterface {
    /** Nastavení první aktivity závislosti. 
     * @param a aktivita
     */
    public void setFirstActivity(Activity a);
    
    /** Nastavení druhé aktivity závislosti
     * @param b aktivita
     */
    public void setSecondActivity(Activity b);
    
    /** Zjištění první aktivity závislosti
     * @return první aktivita závislosti
     */
    public Activity getFirstActivity();
    
    /** Zjištění druhé aktivity závislosti
     * @return druhá aktivia závislosti
     */
    public Activity getSecondActivity();

    /** Zjištění splění závislosti
     * @return true, pokud je závislost splněna
     */
    public boolean isOK();
    
    /** Zjištění splění závislosti, pokud bude mít jedna z aktivit změněn počáteční čas.
     * @param a aktivita (první nebo druhá)
     * @param start začátek aktivity a
     * @return true, pokud bude podmínka splěna
     */
    public boolean isOK(Activity a, int start);
    
    /** Zjištění splnění podmínky
     * @param activityStart1 začátek první aktivity
     * @param activityStart2 začátek druhé aktivity
     * @return true, pokud bude podmínka splěna
     */
    public abstract boolean isOK(int activityStart1,int activityStart2);
    
    /** nastavení typu podmínky. Tímto lze umožnit implementaci více podmínek jednou třídou. 
     * @param i typ podmínky     
     */
    public void setType(int i);
    
    /** Zjištění typu podmínky
     * @return typ podmínky
     */
    public int getType();

    /** Metoda vracející druhou z aktivit.
     * @param a jedna z aktivit
     * @return druhá z aktivit
     */
    public Activity getAnotherActivity(Activity a);
    
    /** Vrátí pole jmen jednotlivých typů podmínky - pro vizualizaci ! 
     * @return pole jmen typů
     */
    public String [] getTypes();
    
    /** Vrátí jméno závislosti - pro vizualizaci. Např: časová závislots
     * @return jméno závislosti
     */
    public String getDependenceName();
    
    /** Zjistí, zda-li se nějaká aktivita účastní podmínky.
     * @param a aktivita
     * @return true, pokud se aktivita a účastní podmínky
     */
   public boolean participate(Activity a);

   /** Zapíše objekt do streamu
    * @param out stream
    * @param allActivities množina všech aktivit
    */
   public abstract void write(java.io.ObjectOutputStream out,ActivityGroup allActivites) throws java.io.IOException ;
   
   /** Načte objekt ze streamu
    * @param in stream
    * @param allActivities množina všech aktivit
    * @return načtený objekt
    */  
   public abstract ActivityDependenceInterface read(java.io.ObjectInputStream in, ActivityGroup allActivities) throws java.io.IOException, java.lang.ClassNotFoundException ;
}

