Projekt

Obecné

Profil

Stáhnout (15.3 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 SPOJ_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 linky*/
75
	private static final String LINKY = "linky.txt";
76
	
77
	/**konstanta pro nazev souboru pevnykod*/
78
	private static final String PEVNY_KOD = "pevnykod.txt";
79
	
80
	/**konstanta pro nazev souboru spoje*/
81
	private static final String SPOJE = "spoje.txt";
82
	
83
	/**pouzivany datovy format*/
84
	public static final DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
85
	
86
	/**atribut se souborem se spoji*/
87
	private File spojFile = null;
88
	
89
	/**atribut se slozkou JDF*/
90
	private File jdfDir = null;
91
	
92
	/**soubor, do ktereho se zapise vystup programu*/
93
	private File outputFile = null;;
94
	
95
	/**den zacatku obdobi*/
96
	private Calendar dateFrom = null;
97
	
98
	/**dden konce obdobi*/
99
	private Calendar dateTo = null;
100
	
101
	/**panel pro zadani vstupnich dat*/
102
	private JPanel inputP;
103
	
104
	/**tlacitko pro odeslani zadanych dat*/
105
	private JButton confirmBT;
106
	
107
	/**tlacitko pro vypnuti programu*/
108
	private JButton endBT;
109
	
110
	/**Dialog pro vybrani cesty k souborum*/
111
	private JFileChooser fileChooser;
112
	
113
	/**Dialog pro vybrani data zacatku*/
114
	private JDatePickerImpl datePickerFrom;
115
	
116
	/**Dialog pro vybrani data konce*/
117
	private JDatePickerImpl datePickerTo;
118
	
119
	/**TextField pro zobrazeni cesty k souboru se spojema*/
120
	private JTextField spojPathTF;
121
	
122
	/**TextField pro zobrazeni cesty k slozce JDF*/
123
	private JTextField jdfPathTF;
124
	
125
	/**TextField pro zobrazeni cesty ke slozce s vystupnim souborem*/
126
	private JTextField outputPathTF;
127
	
128
	/**TextField pro zadani nazvu vystupniho souboru*/
129
	private JTextField outputNameTF;
130
	
131
	/**TextArea pro výpis informací o běhu programu*/
132
	private JTextArea infoTA;
133

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

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

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

    
314
	        BitmapBuilder bitmapBuilder = createBitmapBuilder();
315
	        //loader pro načtení dat
316
	        DataLoader loader = new DataLoader(jdfDir);
317

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

    
322
	        loadedData.clear();
323
	        loadedData = loader.loadData(CASKODY);
324
	        bitmapBuilder.getCaskody(loadedData);
325

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

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

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

    
499
        @Override
500
        public Object stringToValue(String text) throws ParseException {
501
            return dateFormatter.parseObject(text);
502
        }
503

    
504
        @Override
505
        public String valueToString(Object value) throws ParseException {
506
            if (value != null) {
507
                Calendar cal = (Calendar) value;
508
                return dateFormatter.format(cal.getTime());
509
            }
510

    
511
            return "";
512
        }
513

    
514
    }
515
	
516
	/**
517
	 * 
518
	 * hlavni metoda pro ozkouseni funkcnosti {@code Window}
519
	 * 
520
	 * @param args parametry programu
521
	 */
522
	public static void main(String[] args){
523
		Window w = new Window();
524
		w.setVisible(true);
525
	}
526
}
    (1-1/1)