Commit | Line | Data |
---|---|---|
d7d40e67 | 1 | /********************************************************************** |
abf7b9b0 | 2 | * Copyright (c) 2013, 2015 Ericsson |
d7d40e67 BH |
3 | * |
4 | * All rights reserved. This program and the accompanying materials are | |
5 | * made available under the terms of the Eclipse Public License v1.0 which | |
6 | * accompanies this distribution, and is available at | |
7 | * http://www.eclipse.org/legal/epl-v10.html | |
8 | * | |
9 | * Contributors: | |
10 | * Bernd Hufmann - Initial API and implementation | |
11 | **********************************************************************/ | |
2bdf0193 | 12 | package org.eclipse.tracecompass.tmf.ui.views; |
d7d40e67 | 13 | |
4c5e027b MAL |
14 | import org.eclipse.swt.SWT; |
15 | import org.eclipse.swt.custom.SashForm; | |
16 | import org.eclipse.swt.events.PaintEvent; | |
17 | import org.eclipse.swt.events.PaintListener; | |
18 | import org.eclipse.swt.layout.GridData; | |
19 | import org.eclipse.swt.layout.GridLayout; | |
d7d40e67 | 20 | import org.eclipse.swt.widgets.Composite; |
4c5e027b MAL |
21 | import org.eclipse.swt.widgets.Control; |
22 | import org.eclipse.swt.widgets.Event; | |
23 | import org.eclipse.swt.widgets.Listener; | |
24 | import org.eclipse.swt.widgets.Sash; | |
25 | import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager; | |
2bdf0193 | 26 | import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; |
21852dfa | 27 | import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; |
4c5e027b MAL |
28 | import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentInfo; |
29 | import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentSignal; | |
2bdf0193 | 30 | import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer; |
d7d40e67 BH |
31 | |
32 | /** | |
33 | * Base class to be used with a chart viewer {@link TmfXYChartViewer}. | |
34 | * It is responsible to instantiate the viewer class and load the trace | |
35 | * into the viewer when the view is created. | |
36 | * | |
37 | * @author Bernd Hufmann | |
d7d40e67 | 38 | */ |
4c5e027b | 39 | public abstract class TmfChartView extends TmfView implements ITmfTimeAligned { |
d7d40e67 | 40 | |
59387be3 BH |
41 | private static final int[] DEFAULT_WEIGHTS = {1, 3}; |
42 | ||
d7d40e67 BH |
43 | // ------------------------------------------------------------------------ |
44 | // Attributes | |
45 | // ------------------------------------------------------------------------ | |
46 | /** The TMF XY Chart reference */ | |
47 | private TmfXYChartViewer fChartViewer; | |
48 | /** The Trace reference */ | |
49 | private ITmfTrace fTrace; | |
4c5e027b MAL |
50 | /** A composite that allows us to add margins */ |
51 | private Composite fXYViewerContainer; | |
52 | private SashForm fSashForm; | |
53 | private Listener fSashDragListener; | |
d7d40e67 BH |
54 | |
55 | // ------------------------------------------------------------------------ | |
56 | // Constructors | |
57 | // ------------------------------------------------------------------------ | |
58 | /** | |
59 | * Standard Constructor | |
60 | * | |
61 | * @param viewName | |
62 | * The view name | |
63 | */ | |
64 | public TmfChartView(String viewName) { | |
65 | super(viewName); | |
66 | } | |
67 | ||
68 | // ------------------------------------------------------------------------ | |
69 | // Accessors | |
70 | // ------------------------------------------------------------------------ | |
71 | /** | |
72 | * Returns the TMF XY chart viewer implementation. | |
73 | * | |
74 | * @return the TMF XY chart viewer {@link TmfXYChartViewer} | |
75 | */ | |
76 | protected TmfXYChartViewer getChartViewer() { | |
77 | return fChartViewer; | |
78 | } | |
79 | ||
80 | /** | |
4c5e027b | 81 | * Create the TMF XY chart viewer implementation |
d7d40e67 | 82 | * |
4c5e027b MAL |
83 | * @param parent |
84 | * the parent control | |
85 | * | |
86 | * @return The TMF XY chart viewer {@link TmfXYChartViewer} | |
87 | * @since 1.0 | |
d7d40e67 | 88 | */ |
4c5e027b | 89 | abstract protected TmfXYChartViewer createChartViewer(Composite parent); |
d7d40e67 BH |
90 | |
91 | /** | |
92 | * Returns the ITmfTrace implementation | |
93 | * | |
94 | * @return the ITmfTrace implementation {@link ITmfTrace} | |
95 | */ | |
96 | protected ITmfTrace getTrace() { | |
97 | return fTrace; | |
98 | } | |
99 | ||
100 | /** | |
101 | * Sets the ITmfTrace implementation | |
102 | * | |
103 | * @param trace | |
104 | * The ITmfTrace implementation {@link ITmfTrace} | |
105 | */ | |
106 | protected void setTrace(ITmfTrace trace) { | |
107 | fTrace = trace; | |
108 | } | |
109 | ||
110 | // ------------------------------------------------------------------------ | |
111 | // Operations | |
112 | // ------------------------------------------------------------------------ | |
113 | @Override | |
114 | public void createPartControl(Composite parent) { | |
4c5e027b MAL |
115 | super.createPartControl(parent); |
116 | fSashForm = new SashForm(parent, SWT.NONE); | |
117 | new Composite(fSashForm, SWT.NONE); | |
118 | fXYViewerContainer = new Composite(fSashForm, SWT.NONE); | |
119 | GridLayout layout = new GridLayout(); | |
120 | layout.marginHeight = 0; | |
121 | layout.marginWidth = 0; | |
122 | fXYViewerContainer.setLayout(layout); | |
123 | ||
124 | fChartViewer = createChartViewer(fXYViewerContainer); | |
125 | fChartViewer.setSendTimeAlignSignals(true); | |
126 | fChartViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); | |
127 | ||
4c5e027b MAL |
128 | fChartViewer.getControl().addPaintListener(new PaintListener() { |
129 | @Override | |
130 | public void paintControl(PaintEvent e) { | |
131 | // Sashes in a SashForm are being created on layout so add the | |
132 | // drag listener here | |
133 | if (fSashDragListener == null) { | |
134 | for (Control control : fSashForm.getChildren()) { | |
135 | if (control instanceof Sash) { | |
136 | fSashDragListener = new Listener() { | |
137 | ||
138 | @Override | |
139 | public void handleEvent(Event event) { | |
140 | TmfSignalManager.dispatchSignal(new TmfTimeViewAlignmentSignal(fSashForm, getTimeViewAlignmentInfo())); | |
141 | } | |
142 | }; | |
143 | control.removePaintListener(this); | |
144 | control.addListener(SWT.Selection, fSashDragListener); | |
145 | // There should be only one sash | |
146 | break; | |
147 | } | |
148 | } | |
149 | } | |
150 | } | |
151 | }); | |
59387be3 | 152 | fSashForm.setWeights(DEFAULT_WEIGHTS); |
21852dfa | 153 | ITmfTrace trace = TmfTraceManager.getInstance().getActiveTrace(); |
d7d40e67 BH |
154 | if (trace != null) { |
155 | setTrace(trace); | |
156 | loadTrace(); | |
157 | } | |
158 | } | |
159 | ||
160 | @Override | |
161 | public void dispose() { | |
162 | if (fChartViewer != null) { | |
163 | fChartViewer.dispose(); | |
164 | } | |
165 | } | |
166 | ||
abf7b9b0 PT |
167 | @Override |
168 | public void setFocus() { | |
169 | fChartViewer.getControl().setFocus(); | |
170 | } | |
171 | ||
d7d40e67 BH |
172 | /** |
173 | * Load the trace into view. | |
174 | */ | |
175 | protected void loadTrace() { | |
176 | if (fChartViewer != null) { | |
177 | fChartViewer.loadTrace(fTrace); | |
178 | } | |
179 | } | |
180 | ||
4c5e027b MAL |
181 | /** |
182 | * @since 1.0 | |
183 | */ | |
184 | @Override | |
185 | public TmfTimeViewAlignmentInfo getTimeViewAlignmentInfo() { | |
186 | if (fChartViewer == null) { | |
187 | return null; | |
188 | } | |
189 | ||
190 | return new TmfTimeViewAlignmentInfo(fChartViewer.getControl().getShell(), fSashForm.toDisplay(0, 0), getTimeAxisOffset()); | |
191 | } | |
192 | ||
193 | private int getTimeAxisOffset() { | |
2e23a015 | 194 | return fSashForm.getChildren()[0].getSize().x + fSashForm.getSashWidth() + fChartViewer.getPointAreaOffset(); |
4c5e027b MAL |
195 | } |
196 | ||
197 | /** | |
198 | * @since 1.0 | |
199 | */ | |
200 | @Override | |
201 | public int getAvailableWidth(int requestedOffset) { | |
202 | if (fChartViewer == null) { | |
203 | return 0; | |
204 | } | |
205 | ||
206 | int pointAreaWidth = fChartViewer.getPointAreaWidth(); | |
207 | int curTimeAxisOffset = getTimeAxisOffset(); | |
208 | if (pointAreaWidth <= 0) { | |
209 | pointAreaWidth = fSashForm.getBounds().width - curTimeAxisOffset; | |
210 | } | |
4c5e027b MAL |
211 | int endOffset = curTimeAxisOffset + pointAreaWidth; |
212 | GridLayout layout = (GridLayout) fXYViewerContainer.getLayout(); | |
213 | int endOffsetWithoutMargin = endOffset + layout.marginRight; | |
214 | int availableWidth = endOffsetWithoutMargin - requestedOffset; | |
215 | availableWidth = Math.min(fSashForm.getBounds().width, Math.max(0, availableWidth)); | |
216 | return availableWidth; | |
217 | } | |
218 | ||
219 | /** | |
220 | * @since 1.0 | |
221 | */ | |
222 | @Override | |
223 | public void performAlign(int offset, int width) { | |
4c5e027b | 224 | int total = fSashForm.getBounds().width; |
c34ab48a PT |
225 | int plotAreaOffset = fChartViewer.getPointAreaOffset(); |
226 | int width1 = Math.max(0, offset - plotAreaOffset - fSashForm.getSashWidth()); | |
227 | int width2 = Math.max(0, total - width1 - fSashForm.getSashWidth()); | |
4c5e027b MAL |
228 | fSashForm.setWeights(new int[] { width1, width2 }); |
229 | fSashForm.layout(); | |
230 | ||
231 | Composite composite = fXYViewerContainer; | |
232 | GridLayout layout = (GridLayout) composite.getLayout(); | |
233 | int timeAxisWidth = getAvailableWidth(offset); | |
234 | int marginSize = timeAxisWidth - width; | |
235 | layout.marginRight = Math.max(0, marginSize); | |
236 | composite.layout(); | |
237 | } | |
d7d40e67 | 238 | } |