View Javadoc

1   /*
2    * This file is a part of CAST project.
3    * (c) Copyright 2007, AGH University of Science & Technology
4    * https://caribou.iisg.agh.edu.pl/trac/cast
5    *
6    * Licensed under the Eclipse Public License, Version 1.0 (the "License").
7    * You may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    * http://www.eclipse.org/legal/epl-v10.html
10   */
11  /*
12   * File: InitImportPageComposite.java
13   * Created: 2009-03-06
14   * Author: bmilos
15   * $Id$
16   */
17  
18  package pl.edu.agh.cast.importer.wizard.page;
19  
20  import java.io.File;
21  
22  import org.eclipse.swt.SWT;
23  import org.eclipse.swt.events.ModifyEvent;
24  import org.eclipse.swt.events.ModifyListener;
25  import org.eclipse.swt.events.SelectionAdapter;
26  import org.eclipse.swt.events.SelectionEvent;
27  import org.eclipse.swt.events.SelectionListener;
28  import org.eclipse.swt.layout.GridData;
29  import org.eclipse.swt.layout.GridLayout;
30  import org.eclipse.swt.widgets.Button;
31  import org.eclipse.swt.widgets.Composite;
32  import org.eclipse.swt.widgets.FileDialog;
33  import org.eclipse.swt.widgets.Group;
34  import org.eclipse.swt.widgets.Label;
35  import org.eclipse.swt.widgets.Text;
36  
37  import pl.edu.agh.cast.importer.base.data.DataRow;
38  import pl.edu.agh.cast.importer.base.data.ITabularData;
39  import pl.edu.agh.cast.importer.base.template.IImportTemplate;
40  import pl.edu.agh.cast.importer.wizard.template.ITemplateSelectionListener;
41  import pl.edu.agh.cast.importer.wizard.template.TemplateManagementPresenter;
42  import pl.edu.agh.cast.importer.wizard.template.TemplatesManagementComposite;
43  import pl.edu.agh.cast.importer.wizard.util.Messages;
44  
45  /**
46   * The main composite of the {@link InitImportPage}.
47   * 
48   * @author AGH CAST Team
49   */
50  public class InitImportPageComposite extends Composite {
51  
52  	private InitImportPage mediator;
53  
54  	private Label filePathLbl;
55  
56  	private Composite dataFileParamsComposite;
57  
58  	private Button browseBtn;
59  
60  	private Text filePathTxt;
61  
62  	private Button importCreateTemplate;
63  
64  	private TemplatesManagementComposite templateSelectionComposite;
65  
66  	private ConversionPreviewComposite previewComposite;
67  
68  	private Button importApplyTemplate;
69  
70  	private Button importUseTemplate;
71  
72  	private Button importWithoutTemplate;
73  
74  	private Composite radiosComposite;
75  
76  	private Group filePreviewGroup;
77  
78  	private TemplateManagementPresenter templatePresenter;
79  
80  	private ITemplateSelectionListener templateListener;
81  
82  	/**
83  	 * The default constructor.
84  	 * 
85  	 * @param parent
86  	 *            the parent composite
87  	 * @param style
88  	 *            the style of widget to construct
89  	 * @param mediator
90  	 *            the mediating wizard page
91  	 */
92  	public InitImportPageComposite(Composite parent, int style, InitImportPage mediator) {
93  		super(parent, style);
94  		this.mediator = mediator;
95  		initGUI();
96  	}
97  
98  	private void initGUI() {
99  		GridLayout thisLayout = new GridLayout();
100 		thisLayout.verticalSpacing = 10;
101 		this.setLayout(thisLayout);
102 		this.setSize(800, 600);
103 
104 		dataFileParamsComposite = new Composite(this, SWT.NONE);
105 		GridLayout dataFileParamsCompositeLayout = new GridLayout(4, false);
106 		dataFileParamsCompositeLayout.horizontalSpacing = 10;
107 		GridData dataFileParamsCompositeLData = new GridData(SWT.CENTER, SWT.BEGINNING, false, false);
108 		dataFileParamsComposite.setLayoutData(dataFileParamsCompositeLData);
109 		dataFileParamsComposite.setLayout(dataFileParamsCompositeLayout);
110 
111 		filePathLbl = new Label(dataFileParamsComposite, SWT.NONE);
112 		filePathLbl.setText(Messages.InitImportPageComposite_DataFilePath);
113 
114 		filePathTxt = new Text(dataFileParamsComposite, SWT.BORDER);
115 		GridData filePathTxtLData = new GridData(SWT.FILL, SWT.CENTER, true, true);
116 		filePathTxtLData.minimumWidth = 500;
117 		filePathTxtLData.minimumHeight = 20;
118 		filePathTxtLData.horizontalSpan = 2;
119 		filePathTxt.setLayoutData(filePathTxtLData);
120 		filePathTxt.addModifyListener(new ModifyListener() {
121 			public void modifyText(ModifyEvent arg0) {
122 				handleFilePathTxtModification();
123 			}
124 		});
125 
126 		browseBtn = new Button(dataFileParamsComposite, SWT.PUSH | SWT.CENTER);
127 		GridData browseBtnLData = new GridData(SWT.CENTER, SWT.BEGINNING, true, false);
128 		browseBtnLData.minimumWidth = 80;
129 		browseBtnLData.minimumHeight = 25;
130 		browseBtn.setLayoutData(browseBtnLData);
131 		browseBtn.setText(Messages.InitImportPageComposite_Browse);
132 		browseBtn.addSelectionListener(new SelectionAdapter() {
133 			@Override
134 			public void widgetSelected(SelectionEvent event) {
135 				handleBrowseButtonPressed();
136 			}
137 		});
138 
139 		radiosComposite = new Composite(dataFileParamsComposite, SWT.NONE);
140 		GridLayout radiosCompositeLayout = new GridLayout();
141 		GridData radiosCompositeLData = new GridData(SWT.BEGINNING, SWT.CENTER, true, true);
142 		radiosCompositeLData.horizontalSpan = 4;
143 		radiosComposite.setLayoutData(radiosCompositeLData);
144 		radiosComposite.setLayout(radiosCompositeLayout);
145 
146 		final SelectionListener strategySelectionListener = new SelectionAdapter() {
147 			@Override
148 			public void widgetSelected(SelectionEvent event) {
149 				handleStrategySelection();
150 			}
151 		};
152 
153 		importWithoutTemplate = new Button(radiosComposite, SWT.RADIO | SWT.LEFT);
154 		importWithoutTemplate.setText(Messages.InitImportPageComposite_ImportWithoutTemplate);
155 		importWithoutTemplate.setSelection(true);
156 		importWithoutTemplate.addSelectionListener(strategySelectionListener);
157 
158 		importUseTemplate = new Button(radiosComposite, SWT.RADIO | SWT.LEFT);
159 		importUseTemplate.setText(Messages.InitImportPageComposite_ImportUseTemplate);
160 		importUseTemplate.setEnabled(false);
161 		importUseTemplate.addSelectionListener(strategySelectionListener);
162 
163 		importApplyTemplate = new Button(radiosComposite, SWT.RADIO | SWT.LEFT);
164 		importApplyTemplate.setText(Messages.InitImportPageComposite_ImportApplyTemplate);
165 		importApplyTemplate.setEnabled(true);
166 		importApplyTemplate.addSelectionListener(strategySelectionListener);
167 
168 		importCreateTemplate = new Button(radiosComposite, SWT.RADIO | SWT.LEFT);
169 		importCreateTemplate.setText(Messages.InitImportPageComposite_CreateTemplateCombo);
170 		importCreateTemplate.addSelectionListener(strategySelectionListener);
171 
172 		templateSelectionComposite = new TemplatesManagementComposite(this, SWT.NONE);
173 		GridLayout templateSelectionCompositeLayout = new GridLayout(2, true);
174 		GridData templateSelectionCompositeLData = new GridData(SWT.FILL, SWT.FILL, true, true);
175 		templateSelectionComposite.setLayoutData(templateSelectionCompositeLData);
176 		templateSelectionComposite.setLayout(templateSelectionCompositeLayout);
177 
178 		templatePresenter = new TemplateManagementPresenter(templateSelectionComposite);
179 		templateListener = new ITemplateSelectionListener() {
180 			@Override
181 			public void selectionChanged(IImportTemplate selected) {
182 				handleTemplateSelection(selected);
183 			}
184 		};
185 		templatePresenter.getView().addTemplateSelecionListener(templateListener);
186 
187 		filePreviewGroup = new Group(this, SWT.NONE);
188 		GridLayout filePreviewGroupLayout = new GridLayout();
189 		filePreviewGroup.setLayout(filePreviewGroupLayout);
190 		GridData filePreviewGroupLData = new GridData(SWT.FILL, SWT.FILL, true, true);
191 		filePreviewGroupLData.minimumWidth = 550;
192 		filePreviewGroupLData.minimumHeight = 150;
193 		filePreviewGroup.setLayoutData(filePreviewGroupLData);
194 		filePreviewGroup.setText(Messages.InitImportPageComposite_FilePreview);
195 
196 		GridData previewCompositeLData = new GridData();
197 		previewCompositeLData.verticalAlignment = GridData.FILL;
198 		previewCompositeLData.grabExcessVerticalSpace = true;
199 		previewCompositeLData.grabExcessHorizontalSpace = true;
200 		previewCompositeLData.horizontalAlignment = GridData.FILL;
201 		previewComposite = new ConversionPreviewComposite(filePreviewGroup, SWT.NONE);
202 		previewComposite.setLayoutData(previewCompositeLData);
203 
204 		handleStrategySelection();
205 	}
206 
207 	// BEGIN Action Methods
208 
209 	private void handleBrowseButtonPressed() {
210 		FileDialog dialog = new FileDialog(filePathTxt.getShell(), SWT.OPEN);
211 		if (dialog.open() != null) {
212 			filePathTxt.setText(dialog.getFilterPath() + File.separator + dialog.getFileName());
213 		}
214 	}
215 
216 	private void handleFilePathTxtModification() {
217 		mediator.notifyFilePathChange(filePathTxt.getText());
218 		refreshFilePreview();
219 	}
220 
221 	private void handleStrategySelection() {
222 		final boolean templatesEnabled = importApplyTemplate.getSelection() || importUseTemplate.getSelection();
223 		setTemplateSelectionEnabled(templatesEnabled);
224 		refreshFilePreview();
225 		mediator.notifyWizardStrategySelection();
226 	}
227 
228 	private void handleTemplateSelection(IImportTemplate selected) {
229 		mediator.notifyTemplateSelection(selected);
230 		refreshFilePreview();
231 	}
232 
233 	// END Action Methods
234 
235 	// BEGIN Helper Methods
236 
237 	private void refreshFilePreview() {
238 		final String filePath = mediator.getImportProcess().getFilePath();
239 		final IImportTemplate template = mediator.getImportProcess().getTemplate();
240 
241 		if (importApplyTemplate.getSelection() || importUseTemplate.getSelection()) {
242 			previewComposite.showLoadingPreviewInfo();
243 			new Thread() {
244 				@Override
245 				public void run() {
246 					final ITabularData<DataRow> preview = mediator.getTemplateConversionPreview();
247 					if (mediator.getImportProcess().getFilePath() != filePath
248 					        || mediator.getImportProcess().getTemplate() != template) {
249 						return;
250 					}
251 
252 					getDisplay().asyncExec(new Runnable() {
253 						@Override
254 						public void run() {
255 							if (preview != null) {
256 								previewComposite.refreshConversionPreview(preview);
257 							} else {
258 								previewComposite.showPreviewNotAvailable();
259 							}
260 						}
261 					});
262 					return;
263 
264 				}
265 
266 			}.start();
267 		} else {
268 			previewComposite.clearPreview();
269 		}
270 	}
271 
272 	private void setTemplateSelectionEnabled(boolean enabled) {
273 		templateSelectionComposite.setEnabled(enabled);
274 	}
275 
276 	// END Helper Methods
277 
278 	// BEGIN Getters and Setters
279 
280 	public boolean isImportWithoutTemplateSelected() {
281 		return importWithoutTemplate.getSelection();
282 	}
283 
284 	public boolean isImportUseTemplateSelected() {
285 		return importUseTemplate.getSelection();
286 	}
287 
288 	public boolean isImportApplyTemplateSelected() {
289 		return importApplyTemplate.getSelection();
290 	}
291 
292 	public boolean isCreateTemplateSelected() {
293 		return importCreateTemplate.getSelection();
294 	}
295 
296 	// END Getters and Setters
297 
298 	/**
299 	 * {@inheritDoc}
300 	 */
301 	@Override
302 	public void dispose() {
303 		templateSelectionComposite.removeTemplateSelectionListener(templateListener);
304 		templatePresenter.dispose();
305 		super.dispose();
306 	}
307 }