Commit | Line | Data |
---|---|---|
c3c5c786 FC |
1 | package org.eclipse.linuxtools.tmf.ui.wizards;\r |
2 | \r | |
3 | import java.io.File;\r | |
4 | import java.io.FileNotFoundException;\r | |
5 | import java.io.FileWriter;\r | |
6 | import java.io.IOException;\r | |
7 | import java.util.ArrayList;\r | |
8 | import java.util.Iterator;\r | |
9 | import java.util.List;\r | |
10 | \r | |
11 | import org.eclipse.jface.wizard.WizardPage;\r | |
12 | import org.eclipse.linuxtools.tmf.trace.ITmfTrace;\r | |
13 | import org.eclipse.linuxtools.tmf.ui.TmfUiPlugin;\r | |
14 | import org.eclipse.linuxtools.tmf.ui.parsers.custom.CustomEventsTable;\r | |
9ccc6d01 | 15 | import org.eclipse.linuxtools.tmf.ui.parsers.custom.CustomTraceDefinition.OutputColumn;\r |
c3c5c786 FC |
16 | import org.eclipse.linuxtools.tmf.ui.parsers.custom.CustomTxtTrace;\r |
17 | import org.eclipse.linuxtools.tmf.ui.parsers.custom.CustomTxtTraceDefinition;\r | |
c3c5c786 FC |
18 | import org.eclipse.swt.SWT;\r |
19 | import org.eclipse.swt.custom.SashForm;\r | |
20 | import org.eclipse.swt.custom.ScrolledComposite;\r | |
21 | import org.eclipse.swt.events.SelectionAdapter;\r | |
22 | import org.eclipse.swt.events.SelectionEvent;\r | |
23 | import org.eclipse.swt.graphics.Image;\r | |
24 | import org.eclipse.swt.layout.GridData;\r | |
25 | import org.eclipse.swt.layout.GridLayout;\r | |
26 | import org.eclipse.swt.widgets.Button;\r | |
27 | import org.eclipse.swt.widgets.Composite;\r | |
28 | import org.eclipse.swt.widgets.Text;\r | |
29 | \r | |
30 | public class CustomTxtParserOutputWizardPage extends WizardPage {\r | |
31 | \r | |
3b38ea61 FC |
32 | private static final Image upImage = TmfUiPlugin.getDefault().getImageFromPath("/icons/up_button.gif"); //$NON-NLS-1$\r |
33 | private static final Image downImage = TmfUiPlugin.getDefault().getImageFromPath("/icons/down_button.gif"); //$NON-NLS-1$\r | |
c3c5c786 FC |
34 | private CustomTxtParserWizard wizard;\r |
35 | private CustomTxtTraceDefinition definition;\r | |
36 | ArrayList<Output> outputs = new ArrayList<Output>();\r | |
37 | Output messageOutput;\r | |
38 | Composite container;\r | |
39 | SashForm sash;\r | |
40 | Text timestampFormatText;\r | |
41 | Text timestampPreviewText;\r | |
42 | ScrolledComposite outputsScrolledComposite;\r | |
43 | Composite outputsContainer;\r | |
44 | ScrolledComposite inputScrolledComposite;\r | |
45 | Composite tableContainer;\r | |
46 | CustomEventsTable previewTable;\r | |
47 | File tmpFile;\r | |
48 | \r | |
49 | protected CustomTxtParserOutputWizardPage(CustomTxtParserWizard wizard) {\r | |
3b38ea61 | 50 | super("CustomParserOutputWizardPage"); //$NON-NLS-1$\r |
c3c5c786 | 51 | setTitle(wizard.inputPage.getTitle());\r |
3b38ea61 | 52 | setDescription(Messages.CustomTxtParserOutputWizardPage_description);\r |
c3c5c786 FC |
53 | this.wizard = wizard;\r |
54 | setPageComplete(false);\r | |
55 | }\r | |
56 | \r | |
d4011df2 | 57 | @Override\r |
c3c5c786 FC |
58 | public void createControl(Composite parent) {\r |
59 | container = new Composite(parent, SWT.NULL);\r | |
60 | container.setLayout(new GridLayout());\r | |
61 | \r | |
62 | sash = new SashForm(container, SWT.VERTICAL);\r | |
63 | sash.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r | |
64 | sash.setBackground(sash.getDisplay().getSystemColor(SWT.COLOR_GRAY));\r | |
65 | \r | |
66 | outputsScrolledComposite = new ScrolledComposite(sash, SWT.V_SCROLL);\r | |
67 | outputsScrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r | |
68 | outputsContainer = new Composite(outputsScrolledComposite, SWT.NONE);\r | |
69 | GridLayout outputsLayout = new GridLayout(4, false);\r | |
70 | outputsLayout.marginHeight = 10;\r | |
71 | outputsLayout.marginWidth = 0;\r | |
72 | outputsContainer.setLayout(outputsLayout);\r | |
73 | outputsScrolledComposite.setContent(outputsContainer);\r | |
74 | outputsScrolledComposite.setExpandHorizontal(true);\r | |
75 | outputsScrolledComposite.setExpandVertical(true);\r | |
76 | \r | |
77 | outputsContainer.layout();\r | |
78 | \r | |
79 | outputsScrolledComposite.setMinSize(outputsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT).x, outputsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT).y-5);\r | |
80 | \r | |
81 | tableContainer = new Composite(sash, SWT.NONE);\r | |
82 | GridLayout tableLayout = new GridLayout();\r | |
83 | tableLayout.marginHeight = 0;\r | |
84 | tableLayout.marginWidth = 0;\r | |
85 | tableContainer.setLayout(tableLayout);\r | |
86 | previewTable = new CustomEventsTable(new CustomTxtTraceDefinition(), tableContainer, 0);\r | |
87 | \r | |
88 | if (wizard.definition != null) {\r | |
89 | loadDefinition(wizard.definition);\r | |
90 | }\r | |
91 | setControl(container);\r | |
92 | \r | |
93 | }\r | |
94 | \r | |
95 | @Override\r | |
96 | public void dispose() {\r | |
97 | previewTable.dispose();\r | |
98 | super.dispose();\r | |
99 | }\r | |
100 | \r | |
101 | private void loadDefinition(CustomTxtTraceDefinition definition) {\r | |
102 | for (OutputColumn outputColumn : definition.outputs) {\r | |
103 | Output output = new Output(outputsContainer, outputColumn.name);\r | |
104 | outputs.add(output);\r | |
105 | }\r | |
106 | }\r | |
107 | \r | |
108 | /* (non-Javadoc)\r | |
109 | * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)\r | |
110 | */\r | |
111 | @Override\r | |
112 | public void setVisible(boolean visible) {\r | |
113 | if (visible) {\r | |
114 | this.definition = wizard.inputPage.getDefinition();\r | |
115 | List<String> outputNames = wizard.inputPage.getInputNames();\r | |
116 | \r | |
117 | // dispose outputs that have been removed in the input page\r | |
118 | Iterator<Output> iter = outputs.iterator();\r | |
119 | while (iter.hasNext()) {\r | |
120 | Output output = iter.next();\r | |
121 | boolean found = false;\r | |
122 | for (String name : outputNames) {\r | |
123 | if (output.name.equals(name)) {\r | |
124 | found = true;\r | |
125 | break;\r | |
126 | }\r | |
127 | }\r | |
128 | if (!found) {\r | |
129 | output.dispose();\r | |
130 | iter.remove();\r | |
131 | }\r | |
132 | }\r | |
133 | \r | |
134 | // create outputs that have been added in the input page\r | |
135 | for (String name : outputNames) {\r | |
136 | boolean found = false;\r | |
137 | for (Output output : outputs) {\r | |
138 | if (output.name.equals(name)) {\r | |
139 | found = true;\r | |
140 | break;\r | |
141 | }\r | |
142 | }\r | |
143 | if (!found) {\r | |
144 | outputs.add(new Output(outputsContainer, name));\r | |
145 | }\r | |
146 | }\r | |
147 | \r | |
148 | outputsContainer.layout();\r | |
149 | outputsScrolledComposite.setMinSize(outputsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT).x, outputsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT).y-5);\r | |
150 | updatePreviewTable();\r | |
151 | if (sash.getSize().y > outputsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT).y + previewTable.getTable().getItemHeight()) {\r | |
152 | sash.setWeights(new int[] {outputsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT).y, sash.getSize().y - outputsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT).y});\r | |
153 | } else {\r | |
154 | sash.setWeights(new int[] {outputsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT).y, previewTable.getTable().getItemHeight()});\r | |
155 | }\r | |
156 | setPageComplete(true);\r | |
157 | } else {\r | |
158 | setPageComplete(false);\r | |
159 | }\r | |
160 | super.setVisible(visible);\r | |
161 | }\r | |
162 | \r | |
163 | private void moveBefore(Output moved) {\r | |
164 | int i = outputs.indexOf(moved);\r | |
165 | if (i > 0) {\r | |
166 | Output previous = outputs.get(i-1);\r | |
167 | moved.enabledButton.moveAbove(previous.enabledButton);\r | |
168 | moved.nameLabel.moveBelow(moved.enabledButton);\r | |
169 | moved.upButton.moveBelow(moved.nameLabel);\r | |
170 | moved.downButton.moveBelow(moved.upButton);\r | |
171 | outputs.add(i-1, outputs.remove(i));\r | |
172 | outputsContainer.layout();\r | |
173 | outputsScrolledComposite.setMinSize(outputsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT).x, outputsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT).y-5);\r | |
174 | container.layout();\r | |
175 | updatePreviewTable();\r | |
176 | }\r | |
177 | }\r | |
178 | \r | |
179 | private void moveAfter(Output moved) {\r | |
180 | int i = outputs.indexOf(moved);\r | |
181 | if (i+1 < outputs.size()) {\r | |
182 | Output next = outputs.get(i+1);\r | |
183 | moved.enabledButton.moveBelow(next.downButton);\r | |
184 | moved.nameLabel.moveBelow(moved.enabledButton);\r | |
185 | moved.upButton.moveBelow(moved.nameLabel);\r | |
186 | moved.downButton.moveBelow(moved.upButton);\r | |
187 | outputs.add(i+1, outputs.remove(i));\r | |
188 | outputsContainer.layout();\r | |
189 | outputsScrolledComposite.setMinSize(outputsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT).x, outputsContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT).y-5);\r | |
190 | container.layout();\r | |
191 | updatePreviewTable();\r | |
192 | }\r | |
193 | }\r | |
194 | \r | |
195 | private void updatePreviewTable() {\r | |
196 | final int MAX_NUM_ENTRIES = 50;\r | |
197 | definition.outputs = extractOutputs();\r | |
198 | \r | |
199 | try {\r | |
3b38ea61 | 200 | tmpFile = TmfUiPlugin.getDefault().getStateLocation().addTrailingSeparator().append("customwizard.tmp").toFile(); //$NON-NLS-1$\r |
c3c5c786 FC |
201 | FileWriter writer = new FileWriter(tmpFile);\r |
202 | writer.write(wizard.inputPage.getInputText());\r | |
203 | writer.close();\r | |
204 | \r | |
205 | ITmfTrace trace = new CustomTxtTrace(tmpFile.getName(), definition, tmpFile.getAbsolutePath(), MAX_NUM_ENTRIES);\r | |
206 | previewTable.dispose();\r | |
207 | previewTable = new CustomEventsTable(definition, tableContainer, MAX_NUM_ENTRIES);\r | |
529ee6a9 | 208 | previewTable.setTrace(trace, true);\r |
c3c5c786 FC |
209 | previewTable.getTable().setItemCount(MAX_NUM_ENTRIES); // Trigger parsing\r |
210 | } catch (FileNotFoundException e) {\r | |
211 | e.printStackTrace();\r | |
212 | } catch (IOException e) {\r | |
213 | e.printStackTrace();\r | |
214 | }\r | |
215 | \r | |
216 | tableContainer.layout();\r | |
217 | container.layout();\r | |
218 | }\r | |
219 | \r | |
220 | public List<OutputColumn> extractOutputs() {\r | |
221 | int numColumns = 0;\r | |
222 | for (int i = 0; i < outputs.size(); i++) {\r | |
223 | if (outputs.get(i).enabledButton.getSelection()) {\r | |
224 | numColumns++;\r | |
225 | }\r | |
226 | }\r | |
227 | List<OutputColumn> outputColumns = new ArrayList<OutputColumn>(numColumns);\r | |
228 | numColumns = 0;\r | |
229 | for (int i = 0; i < outputs.size(); i++) {\r | |
230 | Output output = outputs.get(i);\r | |
231 | if (output.enabledButton.getSelection()) {\r | |
232 | OutputColumn column = new OutputColumn();\r | |
233 | column.name = output.nameLabel.getText();\r | |
234 | outputColumns.add(column); \r | |
235 | }\r | |
236 | }\r | |
237 | return outputColumns;\r | |
238 | }\r | |
239 | \r | |
240 | private class Output {\r | |
241 | String name;\r | |
242 | Button enabledButton;\r | |
243 | Text nameLabel;\r | |
244 | Button upButton;\r | |
245 | Button downButton;\r | |
246 | \r | |
247 | public Output(Composite parent, String name) {\r | |
248 | this.name = name;\r | |
249 | \r | |
250 | enabledButton = new Button(parent, SWT.CHECK);\r | |
3b38ea61 | 251 | enabledButton.setToolTipText(Messages.CustomTxtParserOutputWizardPage_visible);\r |
c3c5c786 FC |
252 | enabledButton.setSelection(true);\r |
253 | enabledButton.addSelectionListener(new SelectionAdapter() {\r | |
9ccc6d01 | 254 | @Override\r |
c3c5c786 FC |
255 | public void widgetSelected(SelectionEvent e) {\r |
256 | updatePreviewTable();\r | |
257 | }\r | |
258 | });\r | |
259 | if (messageOutput != null) {\r | |
260 | enabledButton.moveAbove(messageOutput.enabledButton);\r | |
261 | }\r | |
262 | \r | |
263 | nameLabel = new Text(parent, SWT.BORDER | SWT.READ_ONLY | SWT.SINGLE);\r | |
264 | nameLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));\r | |
265 | nameLabel.setText(name);\r | |
266 | nameLabel.moveBelow(enabledButton);\r | |
267 | \r | |
268 | upButton = new Button(parent, SWT.PUSH);\r | |
269 | upButton.setImage(upImage);\r | |
3b38ea61 | 270 | upButton.setToolTipText(Messages.CustomTxtParserOutputWizardPage_moveBefore);\r |
c3c5c786 | 271 | upButton.addSelectionListener(new SelectionAdapter() {\r |
9ccc6d01 | 272 | @Override\r |
c3c5c786 FC |
273 | public void widgetSelected(SelectionEvent e) {\r |
274 | moveBefore(Output.this);\r | |
275 | }\r | |
276 | });\r | |
277 | upButton.moveBelow(nameLabel);\r | |
278 | \r | |
279 | downButton = new Button(parent, SWT.PUSH);\r | |
280 | downButton.setImage(downImage);\r | |
3b38ea61 | 281 | downButton.setToolTipText(Messages.CustomTxtParserOutputWizardPage_moveAfter);\r |
c3c5c786 | 282 | downButton.addSelectionListener(new SelectionAdapter() {\r |
9ccc6d01 | 283 | @Override\r |
c3c5c786 FC |
284 | public void widgetSelected(SelectionEvent e) {\r |
285 | moveAfter(Output.this);\r | |
286 | }\r | |
287 | });\r | |
288 | downButton.moveBelow(upButton);\r | |
289 | }\r | |
290 | \r | |
291 | private void dispose() {\r | |
292 | enabledButton.dispose();\r | |
293 | nameLabel.dispose();\r | |
294 | upButton.dispose();\r | |
295 | downButton.dispose();\r | |
296 | }\r | |
297 | }\r | |
298 | \r | |
299 | public CustomTxtTraceDefinition getDefinition() {\r | |
300 | return definition;\r | |
301 | }\r | |
302 | \r | |
303 | }\r |