Projekt

Obecné

Profil

Stáhnout (14.4 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.Calendar;
15
import java.util.Date;
16
import java.util.Properties;
17

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

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

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

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

    
282
	/**
283
	 * 
284
	 * Listener pro potvrzovaci tlacitko, kontroluje, jestli vsechna zadana data jsou platna
285
	 * 
286
	 * @author Marek Sobota, Daniel Stus, Lukas Scurko, Jan Jirman
287
	 * @version 1.0
288
	 *
289
	 */
290
	class ConfirmListener implements ActionListener{
291

    
292
		//@Override
293
		/**
294
		 * zkontroluje, zda-li zadana data jsou platna, pote zmeni panely aby okno vypisovalo informace o prubehu generace
295
		 * a odesle data na zpracovani
296
		 * 
297
		 * @param arg0 kod udalosti
298
		 */
299
		public void actionPerformed(ActionEvent arg0) {
300
			//kontrola jestli jsou obdobi zadana a ve spravnem poradi a jestli jsou cesty vyplněny
301
			if(spojFile == null || jdfDir == null || outputFile == null){
302
				JOptionPane.showMessageDialog(null, "Nejsou vybrany potrebne soubory/slozky", 
303
						"Varovani", JOptionPane.WARNING_MESSAGE);
304
				return;
305
			}
306
			if(dateTo == null || dateFrom == null){
307
				JOptionPane.showMessageDialog(null, "Neni zadano datum", 
308
						"Varovani", JOptionPane.WARNING_MESSAGE);
309
				return;
310
			}
311
			if(dateTo.compareTo(dateFrom) < 0){
312
				JOptionPane.showMessageDialog(null, "Zacatek obdobi je po konci obdobi", 
313
						"Varovani", JOptionPane.WARNING_MESSAGE);
314
				return;
315
			}
316
			String outputName = outputNameTF.getText();
317
			if(outputName.length() < 1){
318
				JOptionPane.showMessageDialog(null, "Nezadano jmeno vystupniho souboru", 
319
						"Varovani", JOptionPane.WARNING_MESSAGE);
320
				return;
321
			}
322
			
323
			if(!outputName.endsWith(".txt")){
324
				outputName += ".txt";
325
			}
326
			//outputFile = new File(outputFile.getAbsolutePath() + File.separator + outputName);
327
			changeToInfo();
328
		}
329
		
330
	}
331
	
332
	/**
333
	 * Listener pro {@code JFileChooser}, zpracovava dialog pro vybrani souboru a kontrolu jeho platnosti
334
	 * 
335
	 * @author Marek Sobota, Daniel Stus, Lukas Scurko, Jan Jirman
336
	 * @version 1.0
337
	 *
338
	 */
339
	class FileChooserListener implements ActionListener{
340

    
341
		/**
342
		 * cislo oznacujici, jestli se jedna o soubor se spoji nebo o slozku JDF
343
		 */
344
		private int fileType;
345
		
346
		/**
347
		 * konstruktor ulozi do atributu typ souboru, ktery ma vybirat
348
		 * 
349
		 * @param fileType ktery soubor se vybral (0 = spoj, 1 = jdf slozka)
350
		 */
351
		public FileChooserListener(int fileType) {
352
			this.fileType = fileType;
353
		}
354
		
355
		//@Override
356
		/**
357
		 * otevre dialog pro vybrani souboru nebo slozky, overi, zda-li typ souboru vyhovuje
358
		 * pokud ano, ulozi ho do prislusne promene, jinak vypise varovani
359
		 * 
360
		 */
361
		public void actionPerformed(ActionEvent arg0) {
362
			int option = fileChooser.showOpenDialog(null);
363
			if(option == JFileChooser.APPROVE_OPTION){
364
				File selectedFile = fileChooser.getSelectedFile();
365
				
366
				if(selectedFile.isFile() && fileType == SPOJ_FILE && selectedFile.getName().endsWith(".txt")){
367
					spojFile = selectedFile;
368
					spojPathTF.setText(spojFile.getAbsolutePath());
369
				}
370
				else if(selectedFile.isDirectory() && fileType == JDF_DIR){
371
					//overi existenci potrebnych souboru ve slozce
372
					File caskody = new File(selectedFile.getAbsolutePath() + File.separator + CASKODY);
373
					File linky = new File(selectedFile.getAbsolutePath() + File.separator + LINKY);
374
					File pevnyKod = new File(selectedFile.getAbsolutePath() + File.separator + PEVNY_KOD);
375
					File spoje = new File(selectedFile.getAbsolutePath() + File.separator + SPOJE);
376
					if(!caskody.exists()){
377
						JOptionPane.showMessageDialog(null, "Ve slozce se nenachazi soubor " + CASKODY, 
378
								"Varovani", JOptionPane.WARNING_MESSAGE);
379
						return;
380
					}
381
					if(!linky.exists()){
382
						JOptionPane.showMessageDialog(null, "Ve slozce se nenachazi soubor " + LINKY, 
383
								"Varovani", JOptionPane.WARNING_MESSAGE);
384
						return;
385
					}
386
					if(!pevnyKod.exists()){
387
						JOptionPane.showMessageDialog(null, "Ve slozce se nenachazi soubor " + PEVNY_KOD, 
388
								"Varovani", JOptionPane.WARNING_MESSAGE);
389
						return;
390
					}
391
					if(!spoje.exists()){
392
						JOptionPane.showMessageDialog(null, "Ve slozce se nenachazi soubor " + SPOJE, 
393
								"Varovani", JOptionPane.WARNING_MESSAGE);
394
						return;
395
					}
396
					
397
					jdfDir = selectedFile;
398
					jdfPathTF.setText(jdfDir.getAbsolutePath());
399
				}
400
				else if (selectedFile.isDirectory() && fileType == OUTPUT_DIR){
401
					outputFile = new File(selectedFile.getAbsolutePath());
402
					outputPathTF.setText(outputFile.getAbsolutePath());
403
				}
404
				else{
405
					JOptionPane.showMessageDialog(null, "Vybran nespravny typ souboru", 
406
												"Varovani", JOptionPane.WARNING_MESSAGE);
407
				}
408
			}
409
		}
410
		
411
	}
412
	
413
	/**
414
	 * 
415
	 * Listener pro {@code JDatePicker}, zpracovava dialog pro vybrani data
416
	 * 
417
	 * @author Marek Sobota, Daniel Stus, Lukas Scurko, Jan Jirman
418
	 * @version 1.0
419
	 *
420
	 */
421
	class DatePickerListener implements ActionListener{
422

    
423
		/**cislo oznacujici zda-li se jedna o zacatek nebo konec obdobi*/
424
		private int datePickerType;
425
		
426
		/**
427
		 * konstruktor ulozi do atributu typ souboru, ktery ma vybirat
428
		 * 
429
		 * @param datePickerType typ data, ktery se vybral (2 = od, 3 = do)
430
		 */
431
		public DatePickerListener(int datePickerType){
432
			this.datePickerType = datePickerType;
433
		}
434
		
435
		//@Override
436
		/**
437
		 * ulozi vybrane datum z dialogu do odpovidajiciho data
438
		 * 
439
		 * @param arg0 kod udalosti
440
		 */
441
		public void actionPerformed(ActionEvent arg0) {
442
			if(datePickerType == DATE_PICKER_FROM){
443
				dateFrom = Calendar.getInstance();
444
				dateFrom.setTime((Date) datePickerFrom.getModel().getValue());
445
							}
446
			else if (datePickerType == DATE_PICKER_TO){
447
				dateTo = Calendar.getInstance();
448
				dateTo.setTime((Date) datePickerTo.getModel().getValue());
449
			}
450
		}
451
		
452
		
453
	}
454
	
455
	class DateLabelFormatter extends AbstractFormatter {
456
		
457
		private static final long serialVersionUID = 1L;
458
		
459
		private String datePattern = "yyyy-MM-dd";
460
        private SimpleDateFormat dateFormatter = new SimpleDateFormat(datePattern);
461

    
462
        @Override
463
        public Object stringToValue(String text) throws ParseException {
464
            return dateFormatter.parseObject(text);
465
        }
466

    
467
        @Override
468
        public String valueToString(Object value) throws ParseException {
469
            if (value != null) {
470
                Calendar cal = (Calendar) value;
471
                return dateFormatter.format(cal.getTime());
472
            }
473

    
474
            return "";
475
        }
476

    
477
    }
478
	
479
	/**
480
	 * 
481
	 * hlavni metoda pro ozkouseni funkcnosti {@code Window}
482
	 * 
483
	 * @param args parametry programu
484
	 */
485
	public static void main(String[] args){
486
		Window w = new Window();
487
		w.setVisible(true);
488
	}
489
}
    (1-1/1)