Projekt

Obecné

Profil

Stáhnout (15 KB) Statistiky
| Větev: | Revize:
1
package gui;
2

    
3
import java.awt.BorderLayout;
4
import java.awt.Dimension;
5
import java.awt.FlowLayout;
6
import java.awt.GridLayout;
7
import java.awt.event.ActionEvent;
8
import java.awt.event.ActionListener;
9

    
10
import java.io.File;
11
import java.text.DateFormat;
12
import java.text.ParseException;
13
import java.text.SimpleDateFormat;
14
import java.util.ArrayList;
15
import java.util.Calendar;
16
import java.util.Date;
17
import java.util.Properties;
18

    
19
import javax.swing.JButton;
20
import javax.swing.JFileChooser;
21
import javax.swing.JFormattedTextField.AbstractFormatter;
22
import javax.swing.JFrame;
23
import javax.swing.JLabel;
24
import javax.swing.JOptionPane;
25
import javax.swing.JPanel;
26
import javax.swing.JScrollPane;
27
import javax.swing.JTextArea;
28
import javax.swing.JTextField;
29

    
30
import org.jdatepicker.impl.JDatePanelImpl;
31
import org.jdatepicker.impl.JDatePickerImpl;
32
import org.jdatepicker.impl.UtilDateModel;
33

    
34
import data.BitmapBuilder;
35
import data.DataLoader;
36

    
37
/**
38
 * 
39
 * Zakladni okno aplikace, zprostredkovava vstupy od uzivatele
40
 * 
41
 * @author Marek Sobota, Daniel Stus, Lukas Scurko, Jan Jirman
42
 * @version 1.0
43
 *
44
 */
45
public class Window extends JFrame{
46
	
47
	/**zakladni verze serializace*/
48
	private static final long serialVersionUID = 1L;
49
	
50
	/**Minimalni rozmer vypisoveho okna*/
51
	private static final Dimension OUTPUT_WINDOW_MIN_DIM = new Dimension(320, 160);
52
	
53
	/**konstanta pro oznaceni souboru se spoji*/
54
	private static final int SEZNAM_LINEK_FILE = 0;
55
	
56
	/**konstanta pro oznaceni slozky JDF*/
57
	private static final int JDF_DIR = 1;
58
	
59
	/**konstanta pro oznaceni slozky pro vystup*/
60
	private static final int OUTPUT_DIR = 2;
61
	
62
	/**konstanta pro oznaceni dialogu pro vyber zacinajiciho data*/
63
	private static final int DATE_PICKER_FROM = 3;
64
	
65
	/**konstanta pro oznaceni dialogu pro vyber konciciho data*/
66
	private static final int DATE_PICKER_TO = 4;
67
	
68
	/**spolecna delka pro vsechny {@code JTextField}*/
69
	private static final int TEXT_FIELD_LENGTH = 15;
70
	
71
	/**konstanta pro nazev souboru caskody*/
72
	private static final String CASKODY = "caskody.txt";
73
	
74
	/**konstanta pro nazev souboru pevnykod*/
75
	private static final String PEVNY_KOD = "pevnykod.txt";
76
	
77
	/**konstanta pro nazev souboru spoje*/
78
	private static final String SPOJE = "spoje.txt";
79
	
80
	/**pouzivany datovy format*/
81
	public static final DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
82
	
83
	/**atribut se souborem se spoji*/
84
	private File linkyFile = null;
85
	
86
	/**atribut se slozkou JDF*/
87
	private File jdfDir = null;
88
	
89
	/**soubor, do ktereho se zapise vystup programu*/
90
	private File outputFile = null;;
91
	
92
	/**den zacatku obdobi*/
93
	private Calendar dateFrom = null;
94
	
95
	/**dden konce obdobi*/
96
	private Calendar dateTo = null;
97
	
98
	/**panel pro zadani vstupnich dat*/
99
	private JPanel inputP;
100
	
101
	/**tlacitko pro odeslani zadanych dat*/
102
	private JButton confirmBT;
103
	
104
	/**tlacitko pro vypnuti programu*/
105
	private JButton endBT;
106
	
107
	/**Dialog pro vybrani cesty k souborum*/
108
	private JFileChooser fileChooser;
109
	
110
	/**Dialog pro vybrani data zacatku*/
111
	private JDatePickerImpl datePickerFrom;
112
	
113
	/**Dialog pro vybrani data konce*/
114
	private JDatePickerImpl datePickerTo;
115
	
116
	/**TextField pro zobrazeni cesty k souboru se spojema*/
117
	private JTextField linkyPathTF;
118
	
119
	/**TextField pro zobrazeni cesty k slozce JDF*/
120
	private JTextField jdfPathTF;
121
	
122
	/**TextField pro zobrazeni cesty ke slozce s vystupnim souborem*/
123
	private JTextField outputPathTF;
124
	
125
	/**TextField pro zadani nazvu vystupniho souboru*/
126
	private JTextField outputNameTF;
127
	
128
	/**TextArea pro výpis informací o běhu programu*/
129
	private JTextArea infoTA;
130

    
131
	/**ScrollPane pro obaleni infoTA*/
132
	private JScrollPane scrollPane;
133
	
134
	
135
	/**
136
	 * inicializuje okno, jmenovite jeho panely, komponenty, priradi potrebne listenery a prida je do zobrazeni
137
	 */
138
	public Window(){
139
		super("POVED");
140
		this.setLayout(new BorderLayout());
141
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
142
				
143
		//nastaveni JPanelu
144
		inputP = new JPanel();
145
		JPanel dateFromP = new JPanel();
146
		JPanel dateToP = new JPanel();
147
		JPanel spojPathP = new JPanel();
148
		JPanel jdfPathP = new JPanel();
149
		JPanel outputP = new JPanel();
150
		inputP.setLayout(new GridLayout(5, 1));
151
		dateFromP.setLayout(new FlowLayout());
152
		dateToP.setLayout(new FlowLayout());
153
		spojPathP.setLayout(new FlowLayout());
154
		jdfPathP.setLayout(new FlowLayout());
155
		outputP.setLayout(new FlowLayout());
156
		
157
		//inicializace kompoment
158
		JLabel povedLB = new JLabel("POVED", JLabel.CENTER);
159
		JLabel dateFromLB = new JLabel("Obdobi od: ");
160
		JLabel dateToLB = new JLabel ("Obdobi do: ");
161
		JLabel spojPathLB = new JLabel("Spoje: ");
162
		JLabel jdfPathLB = new JLabel("JDF: ");
163
		JLabel outputLB = new JLabel("Vystup: ");
164
		confirmBT = new JButton("Potvrdit");
165
		endBT = new JButton("Ukoncit");
166
		JButton spojBT = new JButton("Vybrat spoj soubor");
167
		JButton jdfBT = new JButton("Vybrat JDF slozku");
168
		JButton outputBT = new JButton("Vybrat vystupni slozku");
169
		linkyPathTF = new JTextField(TEXT_FIELD_LENGTH);
170
		jdfPathTF = new JTextField(TEXT_FIELD_LENGTH);
171
		outputPathTF = new JTextField(TEXT_FIELD_LENGTH);
172
		outputNameTF = new JTextField(TEXT_FIELD_LENGTH);
173
		fileChooser = new JFileChooser();
174
		infoTA = new JTextArea();
175
		scrollPane = new JScrollPane(infoTA);
176
		initDatePicker();
177
		
178
		//nastaveni komponent
179
		linkyPathTF.setEditable(false);
180
		jdfPathTF.setEditable(false);
181
		outputPathTF.setEditable(false);
182
		outputNameTF.setText("Nazev souboru");
183
		infoTA.setEditable(false);
184
		fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
185
		
186
		
187
		//pridani listeneru k buttonum
188
		confirmBT.addActionListener(new ConfirmListener());
189
		endBT.addActionListener(new ActionListener(){
190
			//@Override
191
			/**
192
			 * ukonci program
193
			 * 
194
			 * @param arg0	kod udalosti
195
			 */
196
			public void actionPerformed(ActionEvent arg0) {
197
				printMessage("Exiting...");
198
				System.exit(0);
199
			}
200
		});
201
		spojBT.addActionListener(new FileChooserListener(SEZNAM_LINEK_FILE));
202
		jdfBT.addActionListener(new FileChooserListener(JDF_DIR));
203
		outputBT.addActionListener(new FileChooserListener(OUTPUT_DIR));
204
		
205
		//pridani komponent do panelu
206
		inputP.add(dateFromP);
207
		inputP.add(dateToP);
208
		inputP.add(spojPathP);
209
		inputP.add(jdfPathP);
210
		inputP.add(outputP);
211
		dateFromP.add(dateFromLB);
212
		dateFromP.add(datePickerFrom);
213
		dateToP.add(dateToLB);	
214
		dateToP.add(datePickerTo);
215
		spojPathP.add(spojPathLB);
216
		spojPathP.add(linkyPathTF);
217
		spojPathP.add(spojBT);
218
		jdfPathP.add(jdfPathLB);
219
		jdfPathP.add(jdfPathTF);
220
		jdfPathP.add(jdfBT);
221
		outputP.add(outputLB);
222
		outputP.add(outputNameTF);
223
		outputP.add(outputPathTF);
224
		outputP.add(outputBT);
225
		
226
		//pridani panelu do okna
227
		this.add(povedLB, BorderLayout.NORTH);
228
		this.add(inputP, BorderLayout.CENTER);
229
		this.add(confirmBT, BorderLayout.SOUTH);
230
			
231
		this.pack();
232
		this.setMinimumSize(this.getSize());
233
	}
234
	
235
	/**
236
	 * 
237
	 * inicializuje dve na sobe nezavisle instance {@code DatePickerImpl}
238
	 */
239
	private void initDatePicker(){
240
		UtilDateModel modelFrom = new UtilDateModel();
241
        Properties pFrom = new Properties();
242
        pFrom.put("text.today", "Today");
243
        pFrom.put("text.month", "Month");
244
        pFrom.put("text.year", "Year");
245
        UtilDateModel modelTo = new UtilDateModel();
246
        Properties pTo = new Properties();
247
        pTo.put("text.today", "Today");
248
        pTo.put("text.month", "Month");
249
        pTo.put("text.year", "Year");
250
        JDatePanelImpl datePanelFrom = new JDatePanelImpl(modelFrom, pFrom);
251
        JDatePanelImpl datePanelTo = new JDatePanelImpl(modelTo, pTo);
252
        datePickerFrom = new JDatePickerImpl(datePanelFrom, new DateLabelFormatter());
253
        datePickerTo = new JDatePickerImpl(datePanelTo, new DateLabelFormatter());
254
        datePickerFrom.addActionListener(new DatePickerListener(DATE_PICKER_FROM));
255
        datePickerTo.addActionListener(new DatePickerListener(DATE_PICKER_TO));
256
        
257
	}
258
	
259
	/**
260
	 * zmeni okno ze vstupoveho pohledu, aby od ted zobrazovalo prubezne informace
261
	 */
262
	private void changeToInfo(){
263
		this.remove(inputP);
264
		this.remove(confirmBT);
265
		
266
		this.setMinimumSize(OUTPUT_WINDOW_MIN_DIM);
267
		this.add(scrollPane, BorderLayout.CENTER);
268
		this.add(endBT, BorderLayout.SOUTH);
269
		
270
		this.revalidate();
271
	}
272
	
273
	
274
	/**
275
	 * metoda pro pridani zpravy do vypisu uzivateli
276
	 * 
277
	 * @param message zprava, kterou chceme uzivateli sdelit
278
	 */
279
	public void printMessage(String message){
280
		infoTA.append(message + "\n");
281
	}
282

    
283
	private BitmapBuilder createBitmapBuilder(){
284
		return new BitmapBuilder(this);
285
	}
286
	
287
	/**
288
	 * 
289
	 * Listener pro potvrzovaci tlacitko, kontroluje, jestli vsechna zadana data jsou platna
290
	 * 
291
	 * @author Marek Sobota, Daniel Stus, Lukas Scurko, Jan Jirman
292
	 * @version 1.0
293
	 *
294
	 */
295
	class ConfirmListener implements ActionListener{
296

    
297
		//@Override
298
		/**
299
		 * zkontroluje, zda-li zadana data jsou platna, pote zmeni panely aby okno vypisovalo informace o prubehu generace
300
		 * a odesle data na zpracovani
301
		 * 
302
		 * @param arg0 kod udalosti
303
		 */
304
		public void actionPerformed(ActionEvent arg0) {
305
			if(!inputCheck()){
306
				return;
307
			}
308
			changeToInfo();
309
			ArrayList<String[]> loadedData;
310

    
311
	        BitmapBuilder bitmapBuilder = createBitmapBuilder();
312
	        //loader pro načtení dat
313
	        DataLoader loader = new DataLoader(jdfDir);
314

    
315
	        //načítání konkrétních dat
316
	        loadedData = loader.loadData(PEVNY_KOD);
317
	        bitmapBuilder.getPevnyKod(loadedData);
318

    
319
	        loadedData.clear();
320
	        loadedData = loader.loadData(CASKODY);
321
	        bitmapBuilder.getCaskody(loadedData);
322

    
323
	        loadedData.clear();
324
	        loadedData = loader.loadData(SPOJE);
325
	        bitmapBuilder.getSpoje(loadedData);
326
	        printMessage("Ukončuji program..");
327
			
328
		}
329
		
330
		/**
331
		 * kontrola jestli jsou obdobi zadana a ve spravnem poradi a jestli jsou cesty vyplněny
332
		 */
333
		private boolean inputCheck(){
334
			if(linkyFile == null || jdfDir == null || outputFile == null){
335
				JOptionPane.showMessageDialog(null, "Nejsou vybrany potrebne soubory/slozky", 
336
						"Varovani", JOptionPane.WARNING_MESSAGE);
337
				return false;
338
			}
339
			if(dateTo == null || dateFrom == null){
340
				JOptionPane.showMessageDialog(null, "Neni zadano datum", 
341
						"Varovani", JOptionPane.WARNING_MESSAGE);
342
				return false;
343
			}
344
			if(dateTo.compareTo(dateFrom) < 0){
345
				JOptionPane.showMessageDialog(null, "Zacatek obdobi je po konci obdobi", 
346
						"Varovani", JOptionPane.WARNING_MESSAGE);
347
				return false;
348
			}
349
			String outputName = outputNameTF.getText().trim();
350
			if(outputName.length() < 1){
351
				JOptionPane.showMessageDialog(null, "Nezadano jmeno vystupniho souboru", 
352
						"Varovani", JOptionPane.WARNING_MESSAGE);
353
				return false;
354
			}
355
			
356
			if(!outputName.endsWith(".txt")){
357
				outputName += ".txt";
358
			}
359
			outputFile = new File(outputFile.getAbsolutePath() + File.separator + outputName);
360
			
361
			return true;
362
		}
363
		
364
	}
365
	
366
	/**
367
	 * Listener pro {@code JFileChooser}, zpracovava dialog pro vybrani souboru a kontrolu jeho platnosti
368
	 * 
369
	 * @author Marek Sobota, Daniel Stus, Lukas Scurko, Jan Jirman
370
	 * @version 1.0
371
	 *
372
	 */
373
	class FileChooserListener implements ActionListener{
374

    
375
		/**
376
		 * cislo oznacujici, jestli se jedna o soubor se spoji nebo o slozku JDF
377
		 */
378
		private int fileType;
379
		
380
		/**
381
		 * konstruktor ulozi do atributu typ souboru, ktery ma vybirat
382
		 * 
383
		 * @param fileType ktery soubor se vybral (0 = spoj, 1 = jdf slozka)
384
		 */
385
		public FileChooserListener(int fileType) {
386
			this.fileType = fileType;
387
		}
388
		
389
		//@Override
390
		/**
391
		 * otevre dialog pro vybrani souboru nebo slozky, overi, zda-li typ souboru vyhovuje
392
		 * pokud ano, ulozi ho do prislusne promene, jinak vypise varovani
393
		 * 
394
		 */
395
		public void actionPerformed(ActionEvent arg0) {
396
			int option = fileChooser.showOpenDialog(null);
397
			if(option == JFileChooser.APPROVE_OPTION){
398
				File selectedFile = fileChooser.getSelectedFile();
399
				
400
				if(selectedFile.isFile() && fileType == SEZNAM_LINEK_FILE && selectedFile.getName().endsWith(".txt")){
401
					linkyFile = selectedFile;
402
					linkyPathTF.setText(linkyFile.getAbsolutePath());
403
				}
404
				else if(selectedFile.isDirectory() && fileType == JDF_DIR){
405
					//overi existenci potrebnych souboru ve slozce
406
					File caskody = new File(selectedFile.getAbsolutePath() + File.separator + CASKODY);
407
					File pevnyKod = new File(selectedFile.getAbsolutePath() + File.separator + PEVNY_KOD);
408
					File spoje = new File(selectedFile.getAbsolutePath() + File.separator + SPOJE);
409
					if(!caskody.exists()){
410
						JOptionPane.showMessageDialog(null, "Ve slozce se nenachazi soubor " + CASKODY, 
411
								"Varovani", JOptionPane.WARNING_MESSAGE);
412
						return;
413
					}
414
					if(!pevnyKod.exists()){
415
						JOptionPane.showMessageDialog(null, "Ve slozce se nenachazi soubor " + PEVNY_KOD, 
416
								"Varovani", JOptionPane.WARNING_MESSAGE);
417
						return;
418
					}
419
					if(!spoje.exists()){
420
						JOptionPane.showMessageDialog(null, "Ve slozce se nenachazi soubor " + SPOJE, 
421
								"Varovani", JOptionPane.WARNING_MESSAGE);
422
						return;
423
					}
424
					
425
					jdfDir = selectedFile;
426
					jdfPathTF.setText(jdfDir.getAbsolutePath());
427
				}
428
				else if (selectedFile.isDirectory() && fileType == OUTPUT_DIR){
429
					outputFile = new File(selectedFile.getAbsolutePath());
430
					outputPathTF.setText(outputFile.getAbsolutePath());
431
				}
432
				else{
433
					JOptionPane.showMessageDialog(null, "Vybran nespravny typ souboru", 
434
												"Varovani", JOptionPane.WARNING_MESSAGE);
435
				}
436
			}
437
		}
438
		
439
	}
440
	
441
	/**
442
	 * 
443
	 * Listener pro {@code JDatePicker}, zpracovava dialog pro vybrani data
444
	 * 
445
	 * @author Marek Sobota, Daniel Stus, Lukas Scurko, Jan Jirman
446
	 * @version 1.0
447
	 *
448
	 */
449
	class DatePickerListener implements ActionListener{
450

    
451
		/**cislo oznacujici zda-li se jedna o zacatek nebo konec obdobi*/
452
		private int datePickerType;
453
		
454
		/**
455
		 * konstruktor ulozi do atributu typ souboru, ktery ma vybirat
456
		 * 
457
		 * @param datePickerType typ data, ktery se vybral (2 = od, 3 = do)
458
		 */
459
		public DatePickerListener(int datePickerType){
460
			this.datePickerType = datePickerType;
461
		}
462
		
463
		//@Override
464
		/**
465
		 * ulozi vybrane datum z dialogu do odpovidajiciho data
466
		 * 
467
		 * @param arg0 kod udalosti
468
		 */
469
		public void actionPerformed(ActionEvent arg0) {
470
			if(datePickerType == DATE_PICKER_FROM){
471
				dateFrom = Calendar.getInstance();
472
				dateFrom.setTime((Date) datePickerFrom.getModel().getValue());
473
							}
474
			else if (datePickerType == DATE_PICKER_TO){
475
				dateTo = Calendar.getInstance();
476
				dateTo.setTime((Date) datePickerTo.getModel().getValue());
477
			}
478
		}
479
		
480
		
481
	}
482
	
483
	class DateLabelFormatter extends AbstractFormatter {
484
		
485
		private static final long serialVersionUID = 1L;
486
		
487
		private String datePattern = "yyyy-MM-dd";
488
        private SimpleDateFormat dateFormatter = new SimpleDateFormat(datePattern);
489

    
490
        @Override
491
        public Object stringToValue(String text) throws ParseException {
492
            return dateFormatter.parseObject(text);
493
        }
494

    
495
        @Override
496
        public String valueToString(Object value) throws ParseException {
497
            if (value != null) {
498
                Calendar cal = (Calendar) value;
499
                return dateFormatter.format(cal.getTime());
500
            }
501

    
502
            return "";
503
        }
504

    
505
    }
506
	
507
	/**
508
	 * 
509
	 * hlavni metoda pro ozkouseni funkcnosti {@code Window}
510
	 * 
511
	 * @param args parametry programu
512
	 */
513
	public static void main(String[] args){
514
		Window w = new Window();
515
		w.setVisible(true);
516
	}
517
}
    (1-1/1)