1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package pl.edu.agh.cast.importer.wizard.page;
19
20 import java.nio.charset.Charset;
21 import java.util.LinkedList;
22 import java.util.List;
23 import java.util.Map;
24
25 import org.eclipse.jface.viewers.TableViewer;
26 import org.eclipse.swt.SWT;
27 import org.eclipse.swt.events.SelectionAdapter;
28 import org.eclipse.swt.events.SelectionEvent;
29 import org.eclipse.swt.layout.GridData;
30 import org.eclipse.swt.layout.GridLayout;
31 import org.eclipse.swt.widgets.Button;
32 import org.eclipse.swt.widgets.Combo;
33 import org.eclipse.swt.widgets.Composite;
34 import org.eclipse.swt.widgets.Group;
35 import org.eclipse.swt.widgets.Label;
36 import org.eclipse.swt.widgets.Table;
37 import org.eclipse.swt.widgets.TableColumn;
38
39 import pl.edu.agh.cast.importer.base.data.RawTabularData;
40 import pl.edu.agh.cast.importer.base.tokenizer.ITokenizerOption;
41 import pl.edu.agh.cast.importer.wizard.dialog.AdvancedEncodingDialog;
42 import pl.edu.agh.cast.importer.wizard.util.ConversionRulesPageInfo;
43 import pl.edu.agh.cast.importer.wizard.util.Messages;
44 import pl.edu.agh.cast.importer.wizard.utils.AbstractWizardPageHelper;
45 import pl.edu.agh.cast.importer.wizard.utils.SimpleCharset;
46 import pl.edu.agh.cast.importer.wizard.utils.TableViewerHelper;
47
48
49
50
51
52
53 public class FileParamsSelectionPageComposite extends Composite {
54
55 private FileParamsSelectionPage mediator;
56
57 private Combo domainModelCombo;
58
59 private Combo fileFormatCombo;
60
61 private Group domainModelGroup;
62
63 private Label conversionPageLabel;
64
65
66
67 private Composite dataFileParams2;
68
69 private Group fileFormatGroup;
70
71 private Label fileFormatDescriptionLbl;
72
73 private TableViewer previewTableViewer;
74
75 private Button detectEncodingBtn;
76
77 private Group fileEncodingGroup;
78
79 private Button advancedEncodingBtn;
80
81 private Label fileEncodingDescriptionLbl;
82
83 private Group filePreviewGroup;
84
85 private Combo fileEncodingCombo;
86
87 private RawTabularData previewData;
88
89 private ConversionRulesPageInfo currConversionPageInfo;
90
91
92
93
94
95
96
97
98
99
100
101 public FileParamsSelectionPageComposite(Composite parent, int style, FileParamsSelectionPage mediator) {
102 super(parent, style);
103 this.mediator = mediator;
104 initGUI();
105 }
106
107 private void initGUI() {
108 GridLayout thisLayout = new GridLayout();
109 thisLayout.verticalSpacing = 10;
110 this.setLayout(thisLayout);
111 this.setSize(800, 600);
112
113 dataFileParams2 = new Composite(this, SWT.NONE);
114 GridLayout dataFileParams2Layout = new GridLayout();
115 dataFileParams2Layout.makeColumnsEqualWidth = true;
116 dataFileParams2Layout.numColumns = 2;
117 GridData dataFileParams2LData = new GridData(SWT.FILL, SWT.FILL, true, true);
118 dataFileParams2.setLayoutData(dataFileParams2LData);
119 dataFileParams2.setLayout(dataFileParams2Layout);
120
121 fileFormatGroup = new Group(dataFileParams2, SWT.NONE);
122 fileFormatGroup.setText(Messages.InitImportPageComposite_FileFormat);
123 GridLayout fileFormatGroupLayout = new GridLayout();
124 GridData fileFormatGroupLData = new GridData(SWT.FILL, SWT.FILL, true, true);
125 fileFormatGroup.setLayoutData(fileFormatGroupLData);
126 fileFormatGroup.setLayout(fileFormatGroupLayout);
127
128 domainModelGroup = new Group(dataFileParams2, SWT.NONE);
129 GridLayout domainModelGroupLayout = new GridLayout();
130 domainModelGroupLayout.makeColumnsEqualWidth = true;
131 GridData domainModelGroupLData = new GridData(SWT.FILL, SWT.FILL, true, true);
132 domainModelGroupLData.verticalSpan = 3;
133 domainModelGroup.setText(Messages.InitImportPageComposite_DomainModel);
134 domainModelGroup.setLayoutData(domainModelGroupLData);
135 domainModelGroup.setLayout(domainModelGroupLayout);
136
137 domainModelCombo = new Combo(domainModelGroup, SWT.READ_ONLY);
138 GridData domainModelComboLData = new GridData();
139 domainModelComboLData.grabExcessHorizontalSpace = true;
140 domainModelComboLData.horizontalAlignment = GridData.FILL;
141 domainModelCombo.setLayoutData(domainModelComboLData);
142
143 conversionPageLabel = new Label(domainModelGroup, SWT.WRAP);
144 GridData conversionPageLabelLData = new GridData();
145 conversionPageLabelLData.grabExcessHorizontalSpace = true;
146 conversionPageLabelLData.grabExcessVerticalSpace = true;
147 conversionPageLabelLData.horizontalAlignment = GridData.FILL;
148 conversionPageLabelLData.verticalAlignment = GridData.FILL;
149 conversionPageLabel.setLayoutData(conversionPageLabelLData);
150
151 domainModelCombo.addSelectionListener(new SelectionAdapter() {
152 @Override
153 public void widgetSelected(SelectionEvent event) {
154 handleDomainModelComboSelection();
155 }
156 });
157 if (mediator != null) {
158 mediator.setDomainModelComboData(domainModelCombo);
159 }
160
161
162
163
164
165
166 fileEncodingGroup = new Group(dataFileParams2, SWT.NONE);
167 GridLayout fileEncodingGroupLayout = new GridLayout();
168 fileEncodingGroupLayout.numColumns = 3;
169 fileEncodingGroup.setLayout(fileEncodingGroupLayout);
170 GridData fileEncodingGroupLData = new GridData(SWT.FILL, SWT.FILL, true, true);
171 fileEncodingGroup.setLayoutData(fileEncodingGroupLData);
172 fileEncodingGroup.setText(Messages.FileTypeSelectionPageComposite_FileEncoding);
173
174 fileEncodingCombo = new Combo(fileEncodingGroup, SWT.READ_ONLY);
175 GridData fileEncodingComboLData = new GridData();
176 fileEncodingComboLData.horizontalAlignment = GridData.FILL;
177 fileEncodingComboLData.grabExcessHorizontalSpace = true;
178 fileEncodingComboLData.verticalAlignment = GridData.BEGINNING;
179 fileEncodingCombo.setLayoutData(fileEncodingComboLData);
180
181 fileEncodingCombo.setItems(getAvailableCharsets());
182 fileEncodingCombo.addSelectionListener(new SelectionAdapter() {
183 @Override
184 public void widgetSelected(SelectionEvent event) {
185 handleFileEncodingComboSelection();
186 }
187 });
188
189 detectEncodingBtn = new Button(fileEncodingGroup, SWT.PUSH | SWT.CENTER);
190 GridData detectEncodingLData = new GridData();
191 detectEncodingLData.minimumWidth = 80;
192 detectEncodingLData.minimumHeight = 25;
193 detectEncodingLData.horizontalAlignment = GridData.END;
194 detectEncodingLData.verticalAlignment = GridData.BEGINNING;
195 detectEncodingBtn.setLayoutData(detectEncodingLData);
196 detectEncodingBtn.setText(Messages.FileParamsSelectionComposite_DetectAutomatically);
197
198 detectEncodingBtn.setEnabled(false);
199 detectEncodingBtn.addSelectionListener(new SelectionAdapter() {
200 @Override
201 public void widgetSelected(SelectionEvent event) {
202 handleDetectFileEncoding();
203 }
204 });
205
206 advancedEncodingBtn = new Button(fileEncodingGroup, SWT.PUSH | SWT.CENTER);
207 GridData advancedEncodingBtnLData = new GridData();
208 advancedEncodingBtnLData.minimumWidth = 80;
209 advancedEncodingBtnLData.minimumHeight = 25;
210 advancedEncodingBtnLData.horizontalAlignment = GridData.END;
211 advancedEncodingBtnLData.verticalAlignment = GridData.BEGINNING;
212 advancedEncodingBtn.setLayoutData(advancedEncodingBtnLData);
213 advancedEncodingBtn.setText(Messages.FileParamsSelectionComposite_Advanced);
214
215 advancedEncodingBtn.setEnabled(false);
216 advancedEncodingBtn.addSelectionListener(new SelectionAdapter() {
217 @Override
218 public void widgetSelected(SelectionEvent event) {
219 handleAdvancedFileEncoding();
220 }
221 });
222
223 fileEncodingDescriptionLbl = new Label(fileEncodingGroup, SWT.WRAP);
224 GridData fileEncodingDescriptionLblLData = new GridData(SWT.FILL, SWT.FILL, true, true);
225 fileEncodingDescriptionLblLData.horizontalSpan = 3;
226 fileEncodingDescriptionLbl.setLayoutData(fileEncodingDescriptionLblLData);
227 fileEncodingDescriptionLbl.setText(Messages.FileParamsSelectionPageComposite_NoFileEncodingDescription);
228
229 fileFormatCombo = new Combo(fileFormatGroup, SWT.READ_ONLY);
230 GridData fileFormatComboLData = new GridData();
231 fileFormatComboLData.grabExcessHorizontalSpace = true;
232 fileFormatComboLData.horizontalAlignment = GridData.FILL;
233 fileFormatCombo.setLayoutData(fileFormatComboLData);
234 fileFormatCombo.addSelectionListener(new SelectionAdapter() {
235 @Override
236 public void widgetSelected(SelectionEvent event) {
237 handleFileFormatComboSelection();
238 }
239 });
240 if (mediator != null) {
241 mediator.setFormatComboData(fileFormatCombo);
242 }
243
244 fileFormatDescriptionLbl = new Label(fileFormatGroup, SWT.WRAP);
245 GridData fileFormatDescriptionLblLData = new GridData(SWT.FILL, SWT.FILL, true, true);
246 fileFormatDescriptionLbl.setLayoutData(fileFormatDescriptionLblLData);
247
248 filePreviewGroup = new Group(this, SWT.NONE);
249 GridLayout filePreviewGroupLayout = new GridLayout();
250 filePreviewGroup.setLayout(filePreviewGroupLayout);
251 GridData filePreviewGroupLData = new GridData(SWT.FILL, SWT.FILL, true, true);
252 filePreviewGroupLData.minimumWidth = 550;
253 filePreviewGroupLData.minimumHeight = 150;
254 filePreviewGroup.setLayoutData(filePreviewGroupLData);
255 filePreviewGroup.setText(Messages.InitImportPageComposite_FilePreview);
256
257 previewTableViewer = new TableViewer(filePreviewGroup, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL
258 | SWT.H_SCROLL);
259 GridData previewTableViewerLData = new GridData(SWT.FILL, SWT.FILL, true, true);
260 previewTableViewerLData.minimumWidth = 500;
261 previewTableViewerLData.heightHint = 100;
262 previewTableViewer.getControl().setLayoutData(previewTableViewerLData);
263 }
264
265
266
267
268
269
270
271 private void handleFileFormatComboSelection() {
272 detectEncodingBtn.setEnabled(true);
273 advancedEncodingBtn.setEnabled(true);
274
275 if (mediator == null) {
276 return;
277 }
278
279 String formatId = getSelectedFormatId();
280
281 String formatDescription = mediator.getTokenizerDescription(formatId);
282 if (formatDescription != null && formatDescription.length() > 0) {
283 fileFormatDescriptionLbl.setText(formatDescription);
284 } else {
285 fileFormatDescriptionLbl.setText(Messages.InitImportPageComposite_NoFileFormatDescription);
286 }
287
288
289 if (!isEncodingSelected()) {
290 handleDetectFileEncoding();
291 } else {
292
293
294 refreshFilePreview(null);
295 }
296 mediator.widgetModified();
297 }
298
299 private void handleDomainModelComboSelection() {
300 ConversionRulesPageInfo conversionPageInfo = getSelectedConversionRulesSelectionPageInfo();
301 if (conversionPageInfo.equals(currConversionPageInfo)) {
302 return;
303 }
304 currConversionPageInfo = conversionPageInfo;
305
306
307
308
309
310 if (conversionPageInfo == null) {
311 conversionPageLabel.setText("");
312 } else {
313 conversionPageLabel.setText(conversionPageInfo.getDescription());
314 }
315
316
317
318
319 if (mediator != null) {
320 mediator.widgetModified();
321 }
322 }
323
324 private void handleFileEncodingComboSelection() {
325 if (isFormatSelected()) {
326 detectEncodingBtn.setEnabled(true);
327 advancedEncodingBtn.setEnabled(true);
328 }
329
330 Charset charset = getSelectedEncoding();
331 SimpleCharset[] simpleCharsets = SimpleCharset.values();
332 boolean simpleEncodingSelected = false;
333
334 for (SimpleCharset simpleCharset : simpleCharsets) {
335 if (simpleCharset.getCharset().equals(charset)) {
336 fileEncodingDescriptionLbl.setText(simpleCharset.getDescription());
337 simpleEncodingSelected = true;
338 break;
339 }
340 }
341
342 if (!simpleEncodingSelected) {
343 fileEncodingDescriptionLbl.setText(Messages.FileParamsSelectionPageComposite_NoFileEncodingDescription);
344 }
345
346 refreshFilePreview(null);
347 }
348
349 private void handleDetectFileEncoding() {
350 Charset charset = mediator.getFileCharset();
351 setSelectedEncoding(charset);
352
353 if (mediator != null) {
354 mediator.widgetModified();
355 }
356 }
357
358 private void handleAdvancedFileEncoding() {
359 AdvancedEncodingDialog dialog = new AdvancedEncodingDialog(this.getShell(), mediator, getSelectedEncoding(),
360 previewData);
361 dialog.open();
362 }
363
364
365
366
367
368
369
370
371
372 private String[] getAvailableCharsets() {
373 List<String> availableCharsets = new LinkedList<String>();
374 SimpleCharset[] simpleCharsets = SimpleCharset.values();
375
376 for (SimpleCharset simpleCharset : simpleCharsets) {
377 availableCharsets.add(simpleCharset.getCharset().displayName());
378 }
379
380 String[] simpleCharsetsArray = new String[availableCharsets.size()];
381 return availableCharsets.toArray(simpleCharsetsArray);
382 }
383
384
385
386
387
388
389
390 public void refreshPage(String selectedFilePath) {
391 refreshFilePreviewGroupLabel(selectedFilePath);
392 setFileFormatSelection(selectedFilePath);
393 }
394
395
396
397
398
399
400
401 private void refreshFilePreviewGroupLabel(String filePath) {
402 if (filePath != null && filePath.length() > 0) {
403 StringBuilder sb = new StringBuilder();
404 sb.append(Messages.InitImportPageComposite_FilePreview);
405 sb.append(": ");
406 sb.append(filePath);
407 filePreviewGroup.setText(sb.toString());
408 }
409 }
410
411
412
413
414
415
416
417 private void setFileFormatSelection(String filePath) {
418 if (filePath != null && filePath.length() > 0) {
419 Map<String, String> supportedExtensions = mediator.getAllSupportedFileExtensions();
420
421 int extensionStart = filePath.lastIndexOf('.');
422 String extension = filePath.substring(extensionStart + 1);
423
424 if (extension != null) {
425 for (String fileExt : supportedExtensions.keySet()) {
426 if (extension.equalsIgnoreCase(fileExt)) {
427 String tokenizerId = supportedExtensions.get(fileExt);
428 String[] tokenizerIds = (String[])fileFormatCombo.getData();
429
430 for (int i = 0; i < tokenizerIds.length; i++) {
431 if (tokenizerIds[i].equals(tokenizerId)) {
432 fileFormatCombo.select(i);
433 handleFileFormatComboSelection();
434 return;
435 }
436 }
437 }
438 }
439 }
440
441 fileFormatCombo.clearSelection();
442 fileFormatCombo.deselectAll();
443 fileEncodingCombo.clearSelection();
444 fileEncodingCombo.deselectAll();
445 refreshFilePreview(null);
446 }
447 }
448
449
450
451
452
453
454
455 private void refreshFilePreview(List<ITokenizerOption> options) {
456 if (mediator == null) {
457 return;
458 }
459
460 previewData = mediator.loadPreview(getSelectedEncoding(), options,
461 AbstractWizardPageHelper.PREVIEW_ROWS_LIMIT_PARTIAL);
462
463 if (previewData != null) {
464
465 previewTableViewer.getTable().setEnabled(true);
466
467 TableViewerHelper.initTable(previewTableViewer, previewData);
468
469 previewTableViewer.getTable().setLinesVisible(true);
470 TableViewerHelper.adjustColumnWidth(previewTableViewer);
471
472 } else {
473
474 previewTableViewer.getTable().setEnabled(false);
475 previewTableViewer.getTable().setLinesVisible(false);
476 previewTableViewer.getTable().clearAll();
477 }
478 }
479
480
481
482
483
484
485
486
487
488 @SuppressWarnings("unused")
489 private void fillModelInfoGroup(String modelId) {
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513 }
514
515
516
517
518
519 @SuppressWarnings("unused")
520 private void fillModelColumnsTable(Table table, String modelId) {
521 TableColumn[] tableColumns = table.getColumns();
522 for (TableColumn column : tableColumns) {
523 column.dispose();
524 }
525
526 TableColumn tableColumn = new TableColumn(table, SWT.NONE);
527 tableColumn.setText(Messages.ModelInfo_Name);
528 tableColumn = new TableColumn(table, SWT.NONE);
529 tableColumn.setText(Messages.ModelInfo_Type);
530 tableColumn = new TableColumn(table, SWT.NONE);
531 tableColumn.setText(Messages.ModelInfo_Use);
532
533
534
535
536
537
538
539 }
540
541
542
543
544
545 @SuppressWarnings("unused")
546 private String translateUseValue(boolean required) {
547 if (required) {
548 return Messages.ModelInfo_Required;
549 } else {
550 return Messages.ModelInfo_Optional;
551 }
552 }
553
554
555
556
557
558
559
560
561 private String translateDataType(String type) {
562 if (type == null || type.length() == 0) {
563 return "";
564 }
565
566 String result = type;
567
568
569
570
571
572
573
574 return result;
575 }
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591 public void setSelectedEncoding(Charset charset) {
592 if (charset != null) {
593 String[] availableEncodings = fileEncodingCombo.getItems();
594
595 boolean charsetPresent = false;
596 for (int encodingIndex = 0; encodingIndex < availableEncodings.length; encodingIndex++) {
597 if (charset.displayName().equals(availableEncodings[encodingIndex])) {
598 fileEncodingCombo.select(encodingIndex);
599 charsetPresent = true;
600 break;
601 }
602 }
603
604 if (!charsetPresent) {
605 fileEncodingCombo.add(charset.displayName());
606 fileEncodingCombo.select(fileEncodingCombo.getItems().length - 1);
607 }
608 }
609
610 handleFileEncodingComboSelection();
611 }
612
613
614
615
616
617
618 public ConversionRulesPageInfo getSelectedConversionRulesSelectionPageInfo() {
619 ConversionRulesPageInfo[] conversionPages = (ConversionRulesPageInfo[])domainModelCombo.getData();
620 int selectedIndex = domainModelCombo.getSelectionIndex();
621 if (selectedIndex == -1) {
622 return null;
623 }
624 return conversionPages[domainModelCombo.getSelectionIndex()];
625 }
626
627
628
629
630
631
632 public String getSelectedModelName() {
633 return domainModelCombo.getItem(domainModelCombo.getSelectionIndex());
634 }
635
636
637
638
639
640
641 public String getSelectedFormatId() {
642 String[] tokenizerIds = (String[])fileFormatCombo.getData();
643 int selectedIndex = fileFormatCombo.getSelectionIndex();
644 if (selectedIndex == -1) {
645 return null;
646 }
647 return tokenizerIds[fileFormatCombo.getSelectionIndex()];
648 }
649
650
651
652
653
654
655 public Charset getSelectedEncoding() {
656 String[] availableEncodings = fileEncodingCombo.getItems();
657 int selectedIndex = fileEncodingCombo.getSelectionIndex();
658 if (selectedIndex == -1) {
659 return null;
660 }
661 String selectedCharsetName = fileEncodingCombo.getItem(selectedIndex);
662
663 for (String encoding : availableEncodings) {
664 if (selectedCharsetName.equals(encoding)) {
665 return Charset.availableCharsets().get(selectedCharsetName);
666 }
667 }
668 return null;
669 }
670
671 public boolean isFormatSelected() {
672 return (fileFormatCombo.getSelectionIndex() == -1) ? false : true;
673 }
674
675 public boolean isDomainModelSelected() {
676 return (domainModelCombo.getSelectionIndex() == -1) ? false : true;
677 }
678
679 private boolean isEncodingSelected() {
680 return (fileEncodingCombo.getSelectionIndex() == -1) ? false : true;
681 }
682
683
684
685 }