commit 7cafefe1d43999d3eda0cf5ba4ef7109d719a8e4
Author: Daniel Stuš <stusd@students.zcu.cz>
Date:   Fri May 10 02:05:01 2019 +0200

    Propojení tříd, Vytváření a naplnění výstup. souborů, funkcionalita svátků, uživ. seznam linek, úpravy existujících metod a testů, QoL improvements (Re #7419)

diff --git a/src/data/Bitmap.java b/src/data/Bitmap.java
index 985edff..1cabdc8 100644
--- a/src/data/Bitmap.java
+++ b/src/data/Bitmap.java
@@ -15,7 +15,7 @@ import java.util.Date;
  * Trida uchovavajici informace a umoznujici praci s bitmapou
  *
  * @author  Daniel Stus, Marek Sobota, Lukas Scurko, Jan Jirman
- * @version 0.5
+ * @version 0.8
  *
  */
 public class Bitmap {
@@ -31,14 +31,11 @@ public class Bitmap {
     /** Atribut s cislem linky pro kterou je generovana bitmapa */
     private String lineNumber;
 
-    /** Atribut s cislem spoje linky pro kterou je generovana bitmapa */
-    private String connectionNumber;
-
     /** Pole uchovavajici bitmapu */
     private int[] bitmap;
 
-    /** Atribut uchovavajici hodnotu dne (ktery den v tydnu odpovida) pocatku obdobi */
-    private int firstDayOfWeek;
+    private Calendar goodFriday, easterMonday;
+
 
 
     //-------------- Konstruktor -------------/
@@ -49,22 +46,20 @@ public class Bitmap {
      * @param dateFrom Datum zacatku obdobi
      * @param dateTo Datum konce obdobi
      * @param lineNumber Cislo linky
-     * @param connectionNumber Cislo spoje dane linky
      */
-    public Bitmap(Calendar dateFrom, Calendar dateTo, String lineNumber, String connectionNumber) {
+    public Bitmap(Calendar dateFrom, Calendar dateTo, String lineNumber) {
         this.dateFrom = dateFrom;
         this.dateTo = dateTo;
         this.lineNumber = lineNumber;
-        this.connectionNumber = connectionNumber;
         this.bitmap = new int[(int) getDateRange()];
-        this.firstDayOfWeek = dateFrom.get(Calendar.DAY_OF_WEEK);
+        getEasterHolidays(dateFrom.get(Calendar.YEAR));
     }
 
 
     //----------------- Metody ----------------/
 
     /**
-     * Metda vrací počet dní uživatelem zvoleného období
+     * Metoda vrací počet dní uživatelem zvoleného období
      *
      * @return Počet dní v uživatelem zvoleném období (rozmezí)
      */
@@ -88,29 +83,27 @@ public class Bitmap {
 
     public void setWorkdays(int value) {
         value = validateValue(value);
-        int dayOfWeek = this.dateFrom.get(Calendar.DAY_OF_WEEK);
+        Calendar currentDay = (Calendar) this.dateFrom.clone();
 
         for (int i = 0; i < this.bitmap.length; i++) {
-            if (dayOfWeek != 7 && dayOfWeek != 1) {
+            if (currentDay.get(Calendar.DAY_OF_WEEK) != 7 && currentDay.get(Calendar.DAY_OF_WEEK) != 1 && !isBankHoliday(currentDay)) {
                 this.bitmap[i] = value;
             }
 
-            dayOfWeek++;
-            if (dayOfWeek == 8) dayOfWeek = 1;
+            currentDay.add(Calendar.DATE, 1);
         }
     }
 
     public void setSundaysAndHolidays(int value) {
         value = validateValue(value);
-        int dayOfWeek = firstDayOfWeek;
+        Calendar currentDay = (Calendar) this.dateFrom.clone();
 
         for (int i = 0; i < this.bitmap.length; i++) {
-            if (dayOfWeek != 7) {
+            if (currentDay.get(Calendar.DAY_OF_WEEK) != 7) {
                 this.bitmap[i] = value;
             }
 
-            dayOfWeek++;
-            if (dayOfWeek == 8) dayOfWeek = 1;
+            currentDay.add(Calendar.DATE, 1);
         }
     }
 
@@ -131,69 +124,79 @@ public class Bitmap {
 
     public void setDaysInRange(Calendar from, Calendar to, int value) {
         value = validateValue(value);
-        int dayPositionFrom = (int) getDatePosition(from);
-        int dayPositionTo = (int) getDatePosition(to);
+        Calendar currentDay = (Calendar) this.dateFrom.clone();
+        to.add(Calendar.DATE, 1);
+        from.add(Calendar.DATE, -1);
+
+        for (int i = 0; i < this.bitmap.length; i++) {
+            if (currentDay.after(from) && currentDay.before(to) && !isBankHoliday(currentDay)) {
+                this.bitmap[i] = value;
+            }
 
-        for (int i = dayPositionFrom; i < dayPositionTo; i++) {
-            bitmap[i] = value;
+            currentDay.add(Calendar.DATE, 1);
         }
 
     }
 
     public void setDaysInWeek(int dayNumber, int value) {
         value = validateValue(value);
-        int dayOfWeek = firstDayOfWeek;
+        Calendar currentDay = (Calendar) this.dateFrom.clone();
 
         for (int i = 0; i < this.bitmap.length; i++) {
-            if (dayOfWeek == dayNumber) {
+            if (currentDay.get(Calendar.DAY_OF_WEEK) == dayNumber) {
                 this.bitmap[i] = value;
             }
 
-            dayOfWeek++;
-            if (dayOfWeek == 8) dayOfWeek = 1;
+            currentDay.add(Calendar.DATE, 1);
         }
     }
 
-
-    // TODO: 04.05.2019 ?? Sude/Liche -- Platí pro víkendy ?? 
     public void setWeeks(int value, int remainder) {
         value = validateValue(value);
-        int dayOfWeek =  this.dateFrom.get(Calendar.DAY_OF_WEEK);
-        int weekNumber = this.dateFrom.get(Calendar.WEEK_OF_MONTH);
+        Calendar currentDay = (Calendar) this.dateFrom.clone();
 
         for (int i = 0; i < this.bitmap.length; i++) {
-            if ((weekNumber % 2)==remainder) {
+            if ((currentDay.get(Calendar.WEEK_OF_YEAR)%2)==remainder) {
                 this.bitmap[i] = value;
             }
 
-            dayOfWeek++;
-            if (dayOfWeek == 8) dayOfWeek = 1;
-            if (dayOfWeek == 2) weekNumber++;
+            currentDay.add(Calendar.DATE, 1);
 
         }
     }
 
 
     public void setWeeksRange(Calendar from, Calendar to, int value, int remainder) {
+
         value = validateValue(value);
-        int dayOfWeek =  from.get(Calendar.DAY_OF_WEEK);
-        int weekNumber = from.get(Calendar.WEEK_OF_MONTH);
-        int dayPositionFrom = (int) getDatePosition(from);
-        int dayPositionTo = (int) getDatePosition(to);
+        Calendar currentDay = (Calendar) this.dateFrom.clone();
+        to.add(Calendar.DATE, 1);
+        from.add(Calendar.DATE, -1);
 
-        for (int i = dayPositionFrom; i < dayPositionTo; i++) {
-            if ((weekNumber % 2)==remainder) {
-                this.bitmap[i] = value;
+        for (int i = 0; i < this.bitmap.length; i++) {
+            if (currentDay.after(from) && currentDay.before(to)) {
+                if ((currentDay.get(Calendar.WEEK_OF_YEAR)%2)==remainder) {
+                    this.bitmap[i] = value;
+                }
             }
 
-            dayOfWeek++;
-            if (dayOfWeek == 8) dayOfWeek = 1;
-            if (dayOfWeek == 2) weekNumber++;
+            currentDay.add(Calendar.DATE, 1);
         }
 
     }
 
-    // TODO: 04.05.2019 Kombinace (Sudé/Liché týdny + Časové kódy) 
+    public void unsetHolidays() {
+        Calendar currentDay = (Calendar) this.dateFrom.clone();
+
+        for (int i = 0; i < this.bitmap.length; i++) {
+            if (isBankHoliday(currentDay)) {
+                this.bitmap[i] = 0;
+            }
+
+            currentDay.add(Calendar.DATE, 1);
+        }
+    }
+
 
     /**
      * Metoda naplní (přemaže) bitmapu nulami
@@ -218,6 +221,119 @@ public class Bitmap {
         return value;
     }
 
+    public boolean isBankHoliday(Calendar cal) {
+
+        int month = cal.get(Calendar.MONTH);
+        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
+
+        // 1. ledna - Den obnovy samostatného českého státu | Nový rok
+        if(month == Calendar.JANUARY && dayOfMonth == 1) {
+            return true;
+        }
+
+        // 1. ledna - Den obnovy samostatného českého státu | Nový rok
+        if(month == Calendar.JANUARY && dayOfMonth == 1) {
+            return true;
+        }
+
+        // Velikonoční pondělí
+        if(month == easterMonday.get(Calendar.MONTH) && dayOfMonth == easterMonday.get(Calendar.DAY_OF_MONTH)){
+            return true;
+        }
+
+        // Velký pátek
+        if(month == goodFriday.get(Calendar.MONTH) && dayOfMonth == goodFriday.get(Calendar.DAY_OF_MONTH)){
+            return true;
+        }
+
+        // 1. května - Svátek práce
+        if(month == Calendar.MAY && dayOfMonth == 1) {
+            return true;
+        }
+
+        // 8. května - Den vítězství
+        if(month == Calendar.MAY && dayOfMonth == 8) {
+            return true;
+        }
+
+        // 5. července - Den slovanských věrozvěstů Cyrila a Metoděje
+        if(month == Calendar.JULY && dayOfMonth == 5) {
+            return true;
+        }
+
+        // 6. července - Den upálení mistra Jana Husa
+        if(month == Calendar.JULY && dayOfMonth == 6) {
+            return true;
+        }
+
+        // 28. září – Den české státnosti
+        if(month == Calendar.SEPTEMBER && dayOfMonth == 28) {
+            return true;
+        }
+
+        // 28. října – Den vzniku samostatného československého státu
+        if(month == Calendar.OCTOBER && dayOfMonth == 28) {
+            return true;
+        }
+
+        // 17. listopadu – Den boje za svobodu a demokracii
+        if(month == Calendar.NOVEMBER && dayOfMonth == 17) {
+            return true;
+        }
+
+        // 24. prosince – Štědrý den
+        if(month == Calendar.DECEMBER && dayOfMonth == 24) {
+            return true;
+        }
+
+        // 25. prosince – 1. svátek vánoční
+        if(month == Calendar.DECEMBER && dayOfMonth == 25) {
+            return true;
+        }
+
+        // 26. prosince – 2. svátek vánoční
+        if(month == Calendar.DECEMBER && dayOfMonth == 26) {
+            return true;
+        }
+
+        // Není svátek
+        return false;
+
+    }
+
+    public void getEasterHolidays(int year) {
+        int Y = year;
+        int a = Y % 19;
+        int b = Y / 100;
+        int c = Y % 100;
+        int d = b / 4;
+        int e = b % 4;
+        int f = (b + 8) / 25;
+        int g = (b - f + 1) / 3;
+        int h = (19 * a + b - d - g + 15) % 30;
+        int i = c / 4;
+        int k = c % 4;
+        int L = (32 + 2 * e + 2 * i - h - k) % 7;
+        int m = (a + 11 * h + 22 * L) / 451;
+        int n = h + L - 7 * m + 114;
+        int month = n / 31;
+        int day = (n % 31) + 1;
+
+        Calendar easterMonday = Calendar.getInstance();
+        //Velikonoční pondělí --> Velikonoční neděle + 1
+        easterMonday.setTime(new Date(year-1900, month-1, day+1));
+        //Velký pátek --> Velikonoční neděle - 2
+        Calendar goodFriday = Calendar.getInstance();
+        goodFriday.setTime(new Date(year-1900, month-1, day-2));
+
+        this.easterMonday = easterMonday;
+        this.goodFriday = goodFriday;
+    }
+
+    public String getBitmapString() {
+        return Arrays.toString(this.bitmap).replaceAll("\\[|\\]|,|\\s", "");
+    }
+
     public Calendar getDateFrom() {
         return dateFrom;
     }
@@ -242,14 +358,6 @@ public class Bitmap {
         this.lineNumber = lineNumber;
     }
 
-    public String getConnectionNumber() {
-        return connectionNumber;
-    }
-
-    public void setConnectionNumber(String connectionNumber) {
-        this.connectionNumber = connectionNumber;
-    }
-
     public int[] getBitmap() {
         return bitmap;
     }
@@ -258,14 +366,6 @@ public class Bitmap {
         this.bitmap = bitmap;
     }
 
-    public int getFirstDayOfWeek() {
-        return firstDayOfWeek;
-    }
-
-    public void setFirstDayOfWeek(int firstDayOfWeek) {
-        this.firstDayOfWeek = firstDayOfWeek;
-    }
-
     @Override
     public String toString() {
         return Arrays.toString(this.bitmap);
@@ -287,14 +387,14 @@ public class Bitmap {
         dateTo.setTime(new Date(2019-1900, 4, 31)); // rok udáván od 1900, měsíc se počítá od 0
 
 
-        Bitmap bitmap = new Bitmap(dateFrom, dateTo, "143440", "1");
+        Bitmap bitmap = new Bitmap(dateFrom, dateTo, "143440");
 
 
         // ------------- KONTROLNÍ VÝPISY -----------------
         System.out.println("------------- KONTROLNÍ VÝPISY -----------------");
-        System.out.println("Linka: "+ bitmap.getLineNumber()+" - Spoj:"+bitmap.getConnectionNumber());
+        System.out.println("Linka: "+ bitmap.getLineNumber());
         System.out.println("Datum: od: " + bitmap.getDateFrom().getTime() + " | do: " + bitmap.getDateTo().getTime());
-        System.out.println("První den je: "+bitmap.getFirstDayOfWeek() + " (1 - Neděle; 2 - Pondělí; 3 - Úterý; 4 - Středa; 5 - Čtvrtek; 6 - Pátek; 7 - Sobota)");
+        System.out.println("První den je: "+bitmap.getDateFrom().get(Calendar.DAY_OF_WEEK) + " (1 - Neděle; 2 - Pondělí; 3 - Úterý; 4 - Středa; 5 - Čtvrtek; 6 - Pátek; 7 - Sobota)");
         System.out.println("Počet dní v rozmezí: " + bitmap.getDateRange());
         System.out.println(bitmap.toString());
 
@@ -331,7 +431,9 @@ public class Bitmap {
         bitmap.setWeeks(1, 1);
         System.out.println(bitmap.toString());
 
-
+        //Velikonoce pro svátky
+        System.out.println("Velikonoční pondělí: " + bitmap.easterMonday.getTime());
+        System.out.println("Velký pátek: " + bitmap.goodFriday.getTime());
 
 
     }
diff --git a/src/data/BitmapBuilder.java b/src/data/BitmapBuilder.java
index 1b1c1fd..2fbb99a 100644
--- a/src/data/BitmapBuilder.java
+++ b/src/data/BitmapBuilder.java
@@ -1,24 +1,53 @@
 package data;
 
+import gui.Window;
+
+import java.io.BufferedWriter;
 import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-
-import gui.Window;
+import java.util.Arrays;
+import java.util.Calendar;
 
 public class BitmapBuilder {
 
     ArrayList<JDFPevnykodRecord> pevnykod = new ArrayList<>();
     ArrayList<JDFCaskodyRecord> caskody = new ArrayList<>();
     ArrayList<JDFSpojeRecord> spoje = new ArrayList<>();
+    String[] lineList;
+    Path outputFile;
     
     private Window window;
     
-    public BitmapBuilder(Window window){
+    public BitmapBuilder(Window window, File outputPath){
     	this.window = window;
     	window.printMessage("Vytvořen BitmapBuilder");
+
+
+    	// Vytvoření výstupního souboru
+    	this.outputFile = outputPath.toPath();
+        try {
+            if (Files.notExists(outputFile)) {
+                Files.createFile(outputFile);
+                window.printMessage("Vytvořen soubor: "+outputFile.toString());
+            }
+            else {
+                window.printMessage("Výstupní soubor již existuje, přepisuji...");
+                Files.deleteIfExists(outputFile);
+                Files.createFile(outputFile);
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
     }
 
-    /**
+    /*
      *
      * hlavni metoda pro ozkouseni funkcnosti {@code BitmapBuilder}
      *-issue #7314
@@ -52,6 +81,7 @@ public class BitmapBuilder {
             pevnykodRecord = new JDFPevnykodRecord(record);
             pevnykod.add(pevnykodRecord);
         }
+        window.printMessage("Načten soubor Pevnykod.txt");
     }
 
     public void getCaskody(ArrayList<String[]> loadedData){
@@ -60,6 +90,7 @@ public class BitmapBuilder {
             caskodyRecord = new JDFCaskodyRecord(record);
             caskody.add(caskodyRecord);
         }
+        window.printMessage("Načten soubor Caskody.txt");
     }
 
     public void getSpoje(ArrayList<String[]> loadedData){
@@ -68,6 +99,43 @@ public class BitmapBuilder {
             spojeRecord = new JDFSpojeRecord(record);
             spoje.add(spojeRecord);
         }
+        window.printMessage("Načten soubor Spoje.txt");
+    }
+
+    public void getLineList(String[] lines){
+        this.lineList = lines;
+        window.printMessage("Načten uživatelský seznam linek");
+        window.printMessage("Nalezené linky: "+ Arrays.toString(lineList));
+    }
+
+    public void writeBitmaps(Calendar dateFrom, Calendar dateTo) {
+        try(BufferedWriter writer = Files.newBufferedWriter(outputFile, Charset.defaultCharset(), StandardOpenOption.APPEND)) {
+            SimpleDateFormat format = new SimpleDateFormat("d.M.yyyy");
+            String formatedDateFrom = format.format(dateFrom.getTime());
+            String formatedDateTo = format.format(dateTo.getTime());
+            writer.write("Období;" + formatedDateFrom + ";" + formatedDateTo + "\n\n");
+
+            for (int i = 0; i < lineList.length ; i++) {
+
+
+                Bitmap generatedBitmap = new Bitmap(dateFrom, dateTo, lineList[i]);
+
+                // TODO: 10.05.2019 Logika procházení seznamu CASKODY | SPOJE | PEVNYKOD -> generování správných bitmap
+
+
+               for (JDFCaskodyRecord caskod : caskody) {
+                    if(caskod.getNumberLine().equals(lineList[i])) {
+                        writer.write(generatedBitmap.getLineNumber()+caskod.getNumberLineVersion()+"-"+caskod.getTimeCode());
+                        writer.write("-X;;"+generatedBitmap.getBitmapString()+"\n");
+                    }
+                }
+
+
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
     }
 
 }
diff --git a/src/data/DataLoader.java b/src/data/DataLoader.java
index 85834a1..923961d 100644
--- a/src/data/DataLoader.java
+++ b/src/data/DataLoader.java
@@ -1,7 +1,10 @@
 package data;
 
 import java.io.*;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  *
@@ -115,6 +118,36 @@ public class DataLoader {
         return loadedData;
     }
 
+    /**
+     * Načte seznam linek z uživatelského soubor a vrátí jej jako pole řetězců
+     *
+     * @param lineFile cesta k uživatelskému souboru se seznamem linek
+     */
+    public String[] loadLines(File lineFile) {
+
+        List<String> linkList = null;
+        Charset charset = Charset.defaultCharset();
+
+        //soubor
+        File file = lineFile;
+        if(!file.isFile()){
+            System.out.println("Soubor neexistuje..");
+            return null;
+        }
+
+        //nastavení atributů
+        setAttributes(file, fileName);
+
+
+        try {
+            linkList = Files.readAllLines(file.toPath(), charset);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+      return linkList.toArray(new String[]{});
+    }
+
     /**,
      * Nastavení zbývajících atributů pro DataLoader
      * @param file instance souboru
diff --git a/src/data/JDFCaskodyRecord.java b/src/data/JDFCaskodyRecord.java
index ca34fc5..22d10f5 100644
--- a/src/data/JDFCaskodyRecord.java
+++ b/src/data/JDFCaskodyRecord.java
@@ -25,6 +25,8 @@ public class JDFCaskodyRecord implements IProcessable {
     private final int startDateIndex = 5;
     /** konstanta indexu: endDate */
     private final int endDateIndex = 6;
+    /** konstanta indexu: numberLineVersion */
+    private final int numberLineVersionIndex = 8;
 
     //-------------- Atributy --------------/
     private String numberLine;
@@ -34,6 +36,7 @@ public class JDFCaskodyRecord implements IProcessable {
     private String typeTimeCode;
     private String startDate;
     private String endDate;
+    private String numberLineVersion;
 
     //-------------- Konstruktor -------------/
 
@@ -103,6 +106,14 @@ public class JDFCaskodyRecord implements IProcessable {
         return endDate;
     }
 
+    /**
+     * Metoda vrátí cislo verze linky
+     * @return cislo verze linky
+     */
+    public String getNumberLineVersion() {
+        return numberLineVersion;
+    }
+
     /**
      * V metodě se přečte jeden záznam dat a rozřadí do určitých atributů - atributy bude možné dále využívat
      * -issue #7319
@@ -133,6 +144,9 @@ public class JDFCaskodyRecord implements IProcessable {
                 case endDateIndex:
                     this.endDate = dataRecord[index];
                     break;
+                case numberLineVersionIndex:
+                    this.numberLineVersion = dataRecord[index];
+                    break;
             }
         }
     }
diff --git a/src/gui/Window.java b/src/gui/Window.java
index 5221094..61d4e27 100644
--- a/src/gui/Window.java
+++ b/src/gui/Window.java
@@ -4,28 +4,16 @@ import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.GridLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
+import java.awt.event.*;
 
 import java.io.File;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Properties;
+import java.util.*;
 
-import javax.swing.JButton;
-import javax.swing.JFileChooser;
+import javax.swing.*;
 import javax.swing.JFormattedTextField.AbstractFormatter;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTextArea;
-import javax.swing.JTextField;
 
 import org.jdatepicker.impl.JDatePanelImpl;
 import org.jdatepicker.impl.JDatePickerImpl;
@@ -113,7 +101,7 @@ public class Window extends JFrame{
 	/**Dialog pro vybrani data konce*/
 	private JDatePickerImpl datePickerTo;
 	
-	/**TextField pro zobrazeni cesty k souboru se spojema*/
+	/**TextField pro zobrazeni cesty k souboru s linkami*/
 	private JTextField linkyPathTF;
 	
 	/**TextField pro zobrazeni cesty k slozce JDF*/
@@ -136,7 +124,7 @@ public class Window extends JFrame{
 	 * inicializuje okno, jmenovite jeho panely, komponenty, priradi potrebne listenery a prida je do zobrazeni
 	 */
 	public Window(){
-		super("POVED");
+		super("POVED - Generování Bitových map");
 		this.setLayout(new BorderLayout());
 		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
 				
@@ -148,6 +136,9 @@ public class Window extends JFrame{
 		JPanel jdfPathP = new JPanel();
 		JPanel outputP = new JPanel();
 		inputP.setLayout(new GridLayout(5, 1));
+		ImageIcon icon = new ImageIcon(Window.class.getResource("/resources/poved.png"));
+        ImageIcon logo = new ImageIcon(Window.class.getResource("/resources/logo.png"));
+		this.setIconImage(icon.getImage());
 		dateFromP.setLayout(new FlowLayout());
 		dateToP.setLayout(new FlowLayout());
 		spojPathP.setLayout(new FlowLayout());
@@ -155,15 +146,15 @@ public class Window extends JFrame{
 		outputP.setLayout(new FlowLayout());
 		
 		//inicializace kompoment
-		JLabel povedLB = new JLabel("POVED", JLabel.CENTER);
+		JLabel povedLB = new JLabel(logo, JLabel.CENTER);
 		JLabel dateFromLB = new JLabel("Obdobi od: ");
 		JLabel dateToLB = new JLabel ("Obdobi do: ");
-		JLabel spojPathLB = new JLabel("Spoje: ");
+		JLabel seznamLinekPathLB = new JLabel("Seznam linek: ");
 		JLabel jdfPathLB = new JLabel("JDF: ");
 		JLabel outputLB = new JLabel("Vystup: ");
 		confirmBT = new JButton("Potvrdit");
 		endBT = new JButton("Ukoncit");
-		JButton spojBT = new JButton("Vybrat spoj soubor");
+		JButton seznamLinekBT = new JButton("Vybrat seznam linek");
 		JButton jdfBT = new JButton("Vybrat JDF slozku");
 		JButton outputBT = new JButton("Vybrat vystupni slozku");
 		linkyPathTF = new JTextField(TEXT_FIELD_LENGTH);
@@ -180,6 +171,12 @@ public class Window extends JFrame{
 		jdfPathTF.setEditable(false);
 		outputPathTF.setEditable(false);
 		outputNameTF.setText("Nazev souboru");
+		outputNameTF.addMouseListener(new MouseAdapter() {
+            @Override
+            public void mouseClicked(MouseEvent e) {
+                if (outputNameTF.getText().trim().equals("Nazev souboru") ) outputNameTF.setText("");
+            }
+        });
 		infoTA.setEditable(false);
 		fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
 		
@@ -198,7 +195,7 @@ public class Window extends JFrame{
 				System.exit(0);
 			}
 		});
-		spojBT.addActionListener(new FileChooserListener(SEZNAM_LINEK_FILE));
+		seznamLinekBT.addActionListener(new FileChooserListener(SEZNAM_LINEK_FILE));
 		jdfBT.addActionListener(new FileChooserListener(JDF_DIR));
 		outputBT.addActionListener(new FileChooserListener(OUTPUT_DIR));
 		
@@ -212,9 +209,9 @@ public class Window extends JFrame{
 		dateFromP.add(datePickerFrom);
 		dateToP.add(dateToLB);	
 		dateToP.add(datePickerTo);
-		spojPathP.add(spojPathLB);
+		spojPathP.add(seznamLinekPathLB);
 		spojPathP.add(linkyPathTF);
-		spojPathP.add(spojBT);
+		spojPathP.add(seznamLinekBT);
 		jdfPathP.add(jdfPathLB);
 		jdfPathP.add(jdfPathTF);
 		jdfPathP.add(jdfBT);
@@ -239,14 +236,14 @@ public class Window extends JFrame{
 	private void initDatePicker(){
 		UtilDateModel modelFrom = new UtilDateModel();
         Properties pFrom = new Properties();
-        pFrom.put("text.today", "Today");
-        pFrom.put("text.month", "Month");
-        pFrom.put("text.year", "Year");
+        pFrom.put("text.today", "Dnes");
+        pFrom.put("text.month", "Měsíc");
+        pFrom.put("text.year", "Rok");
         UtilDateModel modelTo = new UtilDateModel();
         Properties pTo = new Properties();
-        pTo.put("text.today", "Today");
-        pTo.put("text.month", "Month");
-        pTo.put("text.year", "Year");
+        pTo.put("text.today", "Dnes");
+        pTo.put("text.month", "Měsíc");
+        pTo.put("text.year", "Rok");
         JDatePanelImpl datePanelFrom = new JDatePanelImpl(modelFrom, pFrom);
         JDatePanelImpl datePanelTo = new JDatePanelImpl(modelTo, pTo);
         datePickerFrom = new JDatePickerImpl(datePanelFrom, new DateLabelFormatter());
@@ -281,7 +278,7 @@ public class Window extends JFrame{
 	}
 
 	private BitmapBuilder createBitmapBuilder(){
-		return new BitmapBuilder(this);
+		return new BitmapBuilder(this, outputFile);
 	}
 	
 	/**
@@ -306,6 +303,15 @@ public class Window extends JFrame{
 				return;
 			}
 			changeToInfo();
+
+
+			printMessage("Nastaveno období od: " + dateFrom.getTime());
+			printMessage("Nastaveno období do: " + dateTo.getTime());
+			printMessage("Vybrán soubor s linkami: " + linkyFile.toString());
+			printMessage("Vybrán adresář s JDF soubory: " + jdfDir.toString());
+			printMessage("Výstupní soubor nastaven na: " + outputFile.toString());
+
+
 			ArrayList<String[]> loadedData;
 
 	        BitmapBuilder bitmapBuilder = createBitmapBuilder();
@@ -313,6 +319,10 @@ public class Window extends JFrame{
 	        DataLoader loader = new DataLoader(jdfDir);
 
 	        //načítání konkrétních dat
+
+			String[] lineList = loader.loadLines(linkyFile);
+			bitmapBuilder.getLineList(lineList);
+
 	        loadedData = loader.loadData(PEVNY_KOD);
 	        bitmapBuilder.getPevnyKod(loadedData);
 
@@ -323,6 +333,10 @@ public class Window extends JFrame{
 	        loadedData.clear();
 	        loadedData = loader.loadData(SPOJE);
 	        bitmapBuilder.getSpoje(loadedData);
+
+	        printMessage("Zapisuji bitmapy..");
+	        bitmapBuilder.writeBitmaps(dateFrom, dateTo);
+
 	        printMessage("Ukončuji program..");
 			
 		}
diff --git a/src/resources/logo.png b/src/resources/logo.png
new file mode 100644
index 0000000..9854c7f
Binary files /dev/null and b/src/resources/logo.png differ
diff --git a/src/resources/poved.png b/src/resources/poved.png
new file mode 100644
index 0000000..9c06b0e
Binary files /dev/null and b/src/resources/poved.png differ
diff --git a/src/test/testBitmap.java b/src/test/testBitmap.java
index 245b6f1..da57b0d 100644
--- a/src/test/testBitmap.java
+++ b/src/test/testBitmap.java
@@ -38,7 +38,7 @@ public class testBitmap {
         dateTo.setTime(new Date(2019-1900, 4, 31)); // rok udáván od 1900, měsíc se počítá od 0
 
 
-        bitmap = new Bitmap(dateFrom, dateTo, "143440", "1");
+        bitmap = new Bitmap(dateFrom, dateTo, "143440");
     
     }
 
@@ -70,7 +70,8 @@ public class testBitmap {
     @Test
     public void testsetWorkdays() {
     	bitmap.setWorkdays(1);
-    	assertEquals(0,bitmap.toString().compareToIgnoreCase("[1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1]"));
+    	// Přidáný svátky
+    	assertEquals(0,bitmap.toString().compareToIgnoreCase("[0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1]"));
     }
     
     @Test
@@ -96,8 +97,8 @@ public class testBitmap {
     	Calendar date2 = Calendar.getInstance();
     	date2.setTime(new Date(2019-1900, 4, 5));
     	bitmap.setDaysInRange(date1,date2, 1);
-    	//Kromě 5.4. - má být dobře?
-    	assertEquals(0,bitmap.toString().compareToIgnoreCase("[0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]"));
+    	// Opravdu chyba (poslední den včetně) - Opraveno
+    	assertEquals(0,bitmap.toString().compareToIgnoreCase("[0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]"));
     }
     
     @Test
@@ -110,7 +111,7 @@ public class testBitmap {
     @Test
     public void testsetWeeks(){
     	bitmap.setWeeks(1, 1);
-    	assertEquals(0,bitmap.toString().compareToIgnoreCase("[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]"));
+    	assertEquals(0,bitmap.toString().compareToIgnoreCase("[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]"));
     	
     }
     
@@ -121,7 +122,7 @@ public class testBitmap {
     	Calendar date2 = Calendar.getInstance();
     	date2.setTime(new Date(2019-1900, 4, 13));
     	bitmap.setWeeksRange(date1,date2, 1, 1);
-    	assertEquals(0,bitmap.toString().compareToIgnoreCase("[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]"));
+    	assertEquals(0,bitmap.toString().compareToIgnoreCase("[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]"));
     
     }
     
@@ -181,17 +182,6 @@ public class testBitmap {
     	assertEquals(0,bitmap.getLineNumber().compareToIgnoreCase("143441"));  
     }
 
-    @Test
-    public void testgetConnectionNumber() {
-    	assertEquals(0,bitmap.getConnectionNumber().compareToIgnoreCase("1")); 
-    }
-
-    @Test
-    public void testsetConnectionNumber() {
-    	bitmap.setConnectionNumber("2");
-    	assertEquals(0,bitmap.getConnectionNumber().compareToIgnoreCase("2")); 
-    }
-
     @Test
     public void testgetBitmap() {
     	int[] array = new int[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
@@ -206,17 +196,6 @@ public class testBitmap {
     	assertArrayEquals(array, bitmap.getBitmap());
         this.bitmap = bitmap;
     }
-
-    @Test
-    public void testgetFirstDayOfWeek() {
-    	assertEquals(4,bitmap.getFirstDayOfWeek());
-    }
-
-    @Test
-    public void testsetFirstDayOfWeek() {
-    	bitmap.setFirstDayOfWeek(5);
-    	assertEquals(5,bitmap.getFirstDayOfWeek());
-    }
    
     @Test
     public void testtoString() {
