Statistiques
| Révision :

root / TXM / trunk / org.txm.backtomedia.rcp / JFXPlayer.java @ 3625

Historique | Voir | Annoter | Télécharger (20,24 ko)

1 3197 mdecorde
package org.txm.backtomedia.editors.player;
2 3197 mdecorde
3 3197 mdecorde
import java.io.File;
4 3197 mdecorde
import java.net.Authenticator;
5 3197 mdecorde
import java.net.PasswordAuthentication;
6 3197 mdecorde
import java.time.LocalTime;
7 3197 mdecorde
import java.time.format.DateTimeFormatter;
8 3197 mdecorde
import java.util.concurrent.Semaphore;
9 3197 mdecorde
10 3197 mdecorde
import org.eclipse.swt.SWT;
11 3197 mdecorde
import org.eclipse.swt.events.MouseEvent;
12 3197 mdecorde
import org.eclipse.swt.events.MouseListener;
13 3197 mdecorde
import org.eclipse.swt.events.SelectionEvent;
14 3197 mdecorde
import org.eclipse.swt.events.SelectionListener;
15 3197 mdecorde
import org.eclipse.swt.graphics.Point;
16 3197 mdecorde
import org.eclipse.swt.layout.GridData;
17 3197 mdecorde
import org.eclipse.swt.layout.GridLayout;
18 3197 mdecorde
import org.eclipse.swt.widgets.Button;
19 3197 mdecorde
import org.eclipse.swt.widgets.Composite;
20 3197 mdecorde
import org.eclipse.swt.widgets.Event;
21 3197 mdecorde
import org.eclipse.swt.widgets.FileDialog;
22 3197 mdecorde
import org.eclipse.swt.widgets.Label;
23 3197 mdecorde
import org.eclipse.swt.widgets.Listener;
24 3197 mdecorde
import org.eclipse.swt.widgets.Scale;
25 3197 mdecorde
import org.txm.backtomedia.commands.function.TripleRangeSlider;
26 3197 mdecorde
import org.txm.backtomedia.preferences.BackToMediaPreferences;
27 3197 mdecorde
import org.txm.utils.logger.Log;
28 3197 mdecorde
29 3197 mdecorde
import javafx.application.Platform;
30 3197 mdecorde
import javafx.beans.InvalidationListener;
31 3197 mdecorde
import javafx.beans.Observable;
32 3197 mdecorde
import javafx.embed.swt.FXCanvas;
33 3197 mdecorde
import javafx.geometry.Insets;
34 3197 mdecorde
import javafx.scene.Group;
35 3197 mdecorde
import javafx.scene.Scene;
36 3197 mdecorde
import javafx.scene.layout.HBox;
37 3197 mdecorde
import javafx.scene.media.Media;
38 3197 mdecorde
import javafx.scene.media.MediaPlayer;
39 3197 mdecorde
import javafx.scene.media.MediaPlayer.Status;
40 3197 mdecorde
import javafx.scene.media.MediaView;
41 3197 mdecorde
import javafx.scene.paint.Color;
42 3197 mdecorde
import javafx.util.Duration;
43 3197 mdecorde
import vlcplayerrcp.MessagesMP;
44 3197 mdecorde
45 3197 mdecorde
public class JFXPlayer extends Composite implements IPlayer {
46 3197 mdecorde
47 3197 mdecorde
        protected static final String NOMEDIA = ""; //$NON-NLS-1$
48 3197 mdecorde
49 3197 mdecorde
        private MediaPlayer jfxPlayer;
50 3197 mdecorde
51 3197 mdecorde
        //private GLComposite videoComposite;
52 3197 mdecorde
53 3197 mdecorde
        private Scale rateField;
54 3197 mdecorde
55 3197 mdecorde
        private Label rateValueLabel;
56 3197 mdecorde
57 3197 mdecorde
        private Scale volumeField;
58 3197 mdecorde
59 3197 mdecorde
        private Label volumeValueLabel;
60 3197 mdecorde
61 3197 mdecorde
        private Button playButton;
62 3197 mdecorde
63 3197 mdecorde
        private Button repeatButton;
64 3197 mdecorde
65 3197 mdecorde
        protected String currentlyPlayed = ""; //$NON-NLS-1$
66 3197 mdecorde
67 3197 mdecorde
        // private String startTime, endTime;
68 3197 mdecorde
        private int start, end;
69 3197 mdecorde
70 3197 mdecorde
        protected boolean hasEnded = false;
71 3197 mdecorde
72 3197 mdecorde
        private String previouslyPlayed = ""; //$NON-NLS-1$
73 3197 mdecorde
74 3197 mdecorde
        private boolean repeat = false;
75 3197 mdecorde
76 3197 mdecorde
        protected int volume = 100;
77 3197 mdecorde
78 3197 mdecorde
        private Button stopButton;
79 3197 mdecorde
80 3197 mdecorde
        Label timeLabel;
81 3197 mdecorde
82 3197 mdecorde
        TripleRangeSlider timeRange;
83 3197 mdecorde
84 3197 mdecorde
        boolean firstLengthEvent = true;
85 3197 mdecorde
86 3197 mdecorde
        long previous = 0;
87 3197 mdecorde
88 3197 mdecorde
        long time, mins, secs;
89 3197 mdecorde
90 3197 mdecorde
        public MediaPlayer getEmbeddedMediaPlayer() {
91 3197 mdecorde
                return jfxPlayer;
92 3197 mdecorde
        }
93 3197 mdecorde
94 3197 mdecorde
        Semaphore s = new Semaphore(1);
95 3197 mdecorde
96 3197 mdecorde
        private FXCanvas fxCanvas;
97 3197 mdecorde
98 3197 mdecorde
        Point previousP;
99 3197 mdecorde
100 3197 mdecorde
        protected boolean userStopped;
101 3197 mdecorde
102 3197 mdecorde
        public JFXPlayer(Composite parent, int style) {
103 3197 mdecorde
                super(parent, style);
104 3197 mdecorde
                this.setLayout(new GridLayout(11, false));
105 3197 mdecorde
106 3197 mdecorde
                // very important to avoid error when re-opening the player
107 3197 mdecorde
                javafx.application.Platform.setImplicitExit(false);
108 3197 mdecorde
109 3197 mdecorde
                // THE PLAYER
110 3197 mdecorde
                // if (RuntimeUtil.isMac()) {
111 3197 mdecorde
                // try {
112 3197 mdecorde
                // LibC.INSTANCE.setenv("VLC_PLUGIN_PATH", "/Applications/VLC.app/Contents/MacOS/plugins", 1);
113 3197 mdecorde
                // }
114 3197 mdecorde
                // catch (Exception ex) {
115 3197 mdecorde
                // ex.printStackTrace();
116 3197 mdecorde
                // }
117 3197 mdecorde
                // }
118 3197 mdecorde
//                videoComposite = new GLComposite(this, SWT.NONE, "Video");
119 3197 mdecorde
//                GridData gdata = new GridData(SWT.FILL, SWT.FILL, true, true);
120 3197 mdecorde
//                gdata.horizontalSpan = 11;
121 3197 mdecorde
//                videoComposite.setLayoutData(gdata);
122 3197 mdecorde
//                jfxPlayer = null;
123 3197 mdecorde
//
124 3197 mdecorde
//                fxCanvas.addDisposeListener(new DisposeListener() {
125 3197 mdecorde
//
126 3197 mdecorde
//                        @Override
127 3197 mdecorde
//                        public void widgetDisposed(DisposeEvent e) {
128 3197 mdecorde
//                                if (jfxPlayer != null) {
129 3197 mdecorde
//                                        jfxPlayer.dispose();
130 3197 mdecorde
//                                        jfxPlayer = null;
131 3197 mdecorde
//                                        fxCanvas.setScene(null);
132 3197 mdecorde
//                                }
133 3197 mdecorde
//                        }
134 3197 mdecorde
//                });
135 3197 mdecorde
136 3197 mdecorde
                fxCanvas = new FXCanvas(this, SWT.BORDER);
137 3197 mdecorde
                GridData gdata2 = new GridData(SWT.FILL, SWT.FILL, true, true);
138 3197 mdecorde
                gdata2.horizontalSpan = 11;
139 3197 mdecorde
140 3197 mdecorde
                fxCanvas.setLayoutData(gdata2);
141 3197 mdecorde
142 3197 mdecorde
                fxCanvas.addMouseListener(new MouseListener() {
143 3197 mdecorde
144 3197 mdecorde
                        @Override
145 3197 mdecorde
                        public void mouseUp(MouseEvent e) {
146 3197 mdecorde
                                if (jfxPlayer != null) {
147 3197 mdecorde
                                        if (jfxPlayer.getStatus().equals(Status.PAUSED)) {
148 3197 mdecorde
                                                resume();
149 3197 mdecorde
                                        }
150 3197 mdecorde
                                        else if (jfxPlayer.getStatus().equals(Status.PLAYING)) {
151 3197 mdecorde
                                                pause();
152 3197 mdecorde
                                        }
153 3197 mdecorde
                                }
154 3197 mdecorde
                        }
155 3197 mdecorde
156 3197 mdecorde
                        @Override
157 3197 mdecorde
                        public void mouseDown(MouseEvent e) {}
158 3197 mdecorde
159 3197 mdecorde
                        @Override
160 3197 mdecorde
                        public void mouseDoubleClick(MouseEvent e) {}
161 3197 mdecorde
                });
162 3197 mdecorde
163 3197 mdecorde
                fxCanvas.addListener(SWT.Resize, new Listener() {
164 3197 mdecorde
165 3197 mdecorde
                        @Override
166 3197 mdecorde
                        public void handleEvent(Event e) {
167 3197 mdecorde
                                resizeView();
168 3197 mdecorde
                        }
169 3197 mdecorde
                });
170 3197 mdecorde
171 3197 mdecorde
                // THE CONTROL BUTTONS
172 3197 mdecorde
                playButton = new Button(this, SWT.PUSH);
173 3197 mdecorde
                GridData playLayoutData = new GridData(SWT.FILL, SWT.CENTER, false, false);
174 3197 mdecorde
                playButton.setLayoutData(playLayoutData);
175 3197 mdecorde
                playButton.setText(MessagesMP.play);
176 3197 mdecorde
                playButton.addSelectionListener(new SelectionListener() {
177 3197 mdecorde
178 3197 mdecorde
                        @Override
179 3197 mdecorde
                        public void widgetSelected(SelectionEvent e) {
180 3197 mdecorde
                                userStopped = false;
181 3197 mdecorde
                                if (currentlyPlayed.length() == 0) {
182 3197 mdecorde
                                        selectMedia();
183 3197 mdecorde
                                        playButton.setText(MessagesMP.pause);
184 3197 mdecorde
                                        playButton.getParent().layout();
185 3197 mdecorde
                                }
186 3197 mdecorde
                                else if (jfxPlayer != null && jfxPlayer.getStatus().equals(Status.PLAYING)) {
187 3197 mdecorde
                                        pause();
188 3197 mdecorde
                                }
189 3197 mdecorde
                                else if (jfxPlayer != null && hasEnded) {
190 3197 mdecorde
                                        if (jfxPlayer == null) return;
191 3197 mdecorde
                                        replay();
192 3197 mdecorde
                                }
193 3197 mdecorde
                                else {
194 3197 mdecorde
                                        resume();
195 3197 mdecorde
                                }
196 3197 mdecorde
                        }
197 3197 mdecorde
198 3197 mdecorde
                        @Override
199 3197 mdecorde
                        public void widgetDefaultSelected(SelectionEvent e) {}
200 3197 mdecorde
                });
201 3197 mdecorde
202 3197 mdecorde
                // Button browseButton = new Button(this,SWT.PUSH);
203 3197 mdecorde
                // browseButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
204 3197 mdecorde
                // browseButton.setText("Open...");
205 3197 mdecorde
                // browseButton.addSelectionListener(new SelectionListener() {
206 3197 mdecorde
                // @Override
207 3197 mdecorde
                // public void widgetSelected(SelectionEvent e) {
208 3197 mdecorde
                // selectMedia();
209 3197 mdecorde
                // }
210 3197 mdecorde
                //
211 3197 mdecorde
                // @Override
212 3197 mdecorde
                // public void widgetDefaultSelected(SelectionEvent e) {}
213 3197 mdecorde
                // });
214 3197 mdecorde
215 3197 mdecorde
                stopButton = new Button(this, SWT.PUSH);
216 3197 mdecorde
                stopButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
217 3197 mdecorde
                stopButton.setText(MessagesMP.stop);
218 3197 mdecorde
                stopButton.addSelectionListener(new SelectionListener() {
219 3197 mdecorde
220 3197 mdecorde
                        @Override
221 3197 mdecorde
                        public void widgetSelected(SelectionEvent e) {
222 3197 mdecorde
                                if (jfxPlayer != null) {
223 3197 mdecorde
                                        userStopped = true;
224 3197 mdecorde
                                        jfxPlayer.stop();
225 3197 mdecorde
                                }
226 3197 mdecorde
                        }
227 3197 mdecorde
228 3197 mdecorde
                        @Override
229 3197 mdecorde
                        public void widgetDefaultSelected(SelectionEvent e) {}
230 3197 mdecorde
                });
231 3197 mdecorde
232 3197 mdecorde
                timeLabel = new Label(this, SWT.NONE);
233 3197 mdecorde
                timeLabel.setText("00:00"); //$NON-NLS-1$
234 3197 mdecorde
235 3197 mdecorde
                timeRange = new TripleRangeSlider(this, SWT.None);
236 3197 mdecorde
                timeRange.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
237 3197 mdecorde
                timeRange.setToolTipText(MessagesMP.time_range);
238 3197 mdecorde
                timeRange.addSelectionListener(new SelectionListener() {
239 3197 mdecorde
240 3197 mdecorde
                        @Override
241 3197 mdecorde
                        public void widgetSelected(SelectionEvent e) {
242 3197 mdecorde
                                TripleRangeSlider.SELECTED_KNOB sk = timeRange.getLastSelectedKnob();
243 3197 mdecorde
                                switch (sk) {
244 3197 mdecorde
                                        case UPPER:
245 3197 mdecorde
                                                end = timeRange.getUpperValue();
246 3197 mdecorde
247 3197 mdecorde
                                                jfxPlayer.setStopTime(Duration.seconds(end));
248 3197 mdecorde
                                                if (end < time) {
249 3197 mdecorde
                                                        // System.out.println("Upper changed: fix time");
250 3197 mdecorde
                                                        time = end;
251 3197 mdecorde
                                                        jfxPlayer.seek(Duration.seconds(time));
252 3197 mdecorde
                                                }
253 3197 mdecorde
                                                break;
254 3197 mdecorde
                                        case LOWER:
255 3197 mdecorde
                                                start = timeRange.getLowerValue();
256 3197 mdecorde
                                                jfxPlayer.setStartTime(Duration.seconds(start));
257 3197 mdecorde
                                                if (start > time) {
258 3197 mdecorde
                                                        // System.out.println("Lower changed: fix time");
259 3197 mdecorde
                                                        time = start;
260 3197 mdecorde
                                                        jfxPlayer.seek(Duration.seconds(time));
261 3197 mdecorde
                                                }
262 3197 mdecorde
                                                break;
263 3197 mdecorde
                                        case MIDDLE:
264 3197 mdecorde
265 3197 mdecorde
                                                time = timeRange.getMiddleValue();
266 3197 mdecorde
                                                // System.out.println("Middle changed: fix time: " + time);
267 3197 mdecorde
268 3197 mdecorde
                                                jfxPlayer.seek(Duration.seconds(time));
269 3197 mdecorde
270 3197 mdecorde
                                                break;
271 3197 mdecorde
                                        default:
272 3197 mdecorde
                                                // nothing
273 3197 mdecorde
                                }
274 3197 mdecorde
                                // System.out.println("time range: "+start+" -> "+end+" time="+time);
275 3197 mdecorde
                        }
276 3197 mdecorde
277 3197 mdecorde
                        @Override
278 3197 mdecorde
                        public void widgetDefaultSelected(SelectionEvent e) {}
279 3197 mdecorde
                });
280 3197 mdecorde
281 3197 mdecorde
                repeatButton = new Button(this, SWT.CHECK);
282 3197 mdecorde
                repeatButton.setText(MessagesMP.repeat);
283 3197 mdecorde
                repeat = BackToMediaPreferences.getInstance().getBoolean(BackToMediaPreferences.REPEAT);
284 3197 mdecorde
                repeatButton.setSelection(repeat);
285 3197 mdecorde
                repeatButton.addSelectionListener(new SelectionListener() {
286 3197 mdecorde
287 3197 mdecorde
                        @Override
288 3197 mdecorde
                        public void widgetSelected(SelectionEvent e) {
289 3197 mdecorde
                                repeat = repeatButton.getSelection();
290 3197 mdecorde
                        }
291 3197 mdecorde
292 3197 mdecorde
                        @Override
293 3197 mdecorde
                        public void widgetDefaultSelected(SelectionEvent e) {}
294 3197 mdecorde
                });
295 3197 mdecorde
296 3197 mdecorde
                Label l = new Label(this, SWT.NONE);
297 3197 mdecorde
                l.setText(MessagesMP.rate);
298 3197 mdecorde
299 3197 mdecorde
                rateField = new Scale(this, SWT.BORDER);
300 3197 mdecorde
                GridData gdata4 = new GridData(SWT.FILL, SWT.CENTER, false, false);
301 3197 mdecorde
                gdata4.widthHint = 100;
302 3197 mdecorde
                rateField.setLayoutData(gdata4);
303 3197 mdecorde
                rateField.setMaximum(140);
304 3197 mdecorde
                rateField.setMinimum(70);
305 3197 mdecorde
                rateField.setSelection(100);
306 3197 mdecorde
                rateField.setPageIncrement(5);
307 3197 mdecorde
308 3197 mdecorde
                rateField.addSelectionListener(new SelectionListener() {
309 3197 mdecorde
310 3197 mdecorde
                        @Override
311 3197 mdecorde
                        public void widgetSelected(SelectionEvent e) {
312 3197 mdecorde
                                float rate = rateField.getSelection() / 100.0f;
313 3197 mdecorde
                                jfxPlayer.setRate(rate);
314 3197 mdecorde
                                rateValueLabel.setText("" + rateField.getSelection() + "%");
315 3197 mdecorde
                        }
316 3197 mdecorde
317 3197 mdecorde
                        @Override
318 3197 mdecorde
                        public void widgetDefaultSelected(SelectionEvent e) {}
319 3197 mdecorde
                });
320 3197 mdecorde
321 3197 mdecorde
                rateValueLabel = new Label(this, SWT.NONE);
322 3197 mdecorde
                rateValueLabel.setText("100%");//$NON-NLS-1$
323 3197 mdecorde
324 3197 mdecorde
                l = new Label(this, SWT.NONE);
325 3197 mdecorde
                l.setText(MessagesMP.volume);
326 3197 mdecorde
327 3197 mdecorde
                volumeField = new Scale(this, SWT.BORDER);
328 3197 mdecorde
                gdata4 = new GridData(SWT.FILL, SWT.CENTER, false, false);
329 3197 mdecorde
                gdata4.widthHint = 100;
330 3197 mdecorde
                volumeField.setLayoutData(gdata4);
331 3197 mdecorde
                volumeField.setMinimum(0);
332 3197 mdecorde
                volumeField.setMaximum(100);
333 3197 mdecorde
                volumeField.setSelection(volume);
334 3197 mdecorde
                volumeField.setPageIncrement(5);
335 3197 mdecorde
                volumeField.addSelectionListener(new SelectionListener() {
336 3197 mdecorde
337 3197 mdecorde
                        @Override
338 3197 mdecorde
                        public void widgetSelected(SelectionEvent e) {
339 3197 mdecorde
                                jfxPlayer.setVolume(volumeField.getSelection());
340 3197 mdecorde
                                volume = volumeField.getSelection();
341 3197 mdecorde
                                volumeValueLabel.setText("" + volume + "%");
342 3197 mdecorde
                        }
343 3197 mdecorde
344 3197 mdecorde
                        @Override
345 3197 mdecorde
                        public void widgetDefaultSelected(SelectionEvent e) {}
346 3197 mdecorde
                });
347 3197 mdecorde
348 3197 mdecorde
                volumeValueLabel = new Label(this, SWT.NONE);
349 3197 mdecorde
                volumeValueLabel.setText("100%");
350 3197 mdecorde
351 3197 mdecorde
                // vlcPlayer.events().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
352 3197 mdecorde
                //
353 3197 mdecorde
                // @Override
354 3197 mdecorde
                // public void opening(MediaPlayer mediaPlayer) {
355 3197 mdecorde
                // if (videoComposite.isDisposed()) return;
356 3197 mdecorde
                // Log.finer("Opening media...");
357 3197 mdecorde
                // }
358 3197 mdecorde
                //
359 3197 mdecorde
                // @Override
360 3197 mdecorde
                // public void finished(MediaPlayer mediaPlayer) {
361 3197 mdecorde
                // if (videoComposite.isDisposed()) return;
362 3197 mdecorde
                // Log.finer("Finished playing media...");
363 3197 mdecorde
                // if (repeat) {
364 3197 mdecorde
                // replay();
365 3197 mdecorde
                // }
366 3197 mdecorde
                // else {
367 3197 mdecorde
                // hasEnded = true;
368 3197 mdecorde
                // }
369 3197 mdecorde
                // }
370 3197 mdecorde
                // });
371 3197 mdecorde
372 3197 mdecorde
373 3197 mdecorde
                //
374 3197 mdecorde
                // vlcPlayer.events().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
375 3197 mdecorde
                //
376 3197 mdecorde
                // @Override
377 3197 mdecorde
                // public void timeChanged(MediaPlayer mediaPlayer, final long arg1) {
378 3197 mdecorde
                //
379 3197 mdecorde
                // }
380 3197 mdecorde
                //
381 3197 mdecorde
                // @Override
382 3197 mdecorde
                // public void lengthChanged(MediaPlayer mediaPlayer, final long arg1) {
383 3197 mdecorde
                // if (videoComposite.isDisposed()) return;
384 3197 mdecorde
                //
385 3197 mdecorde
                // if (firstLengthEvent) {
386 3197 mdecorde
                // firstLengthEvent = false;
387 3197 mdecorde
                //
388 3197 mdecorde
                // // initialize time range widget limits
389 3197 mdecorde
                // timeRange.getDisplay().syncExec(new Runnable() {
390 3197 mdecorde
                //
391 3197 mdecorde
                // @Override
392 3197 mdecorde
                // public void run() {
393 3197 mdecorde
                // if (timeRange.isDisposed()) return;
394 3197 mdecorde
                // timeRange.setMaximum((int) arg1);
395 3197 mdecorde
                // // if (start == end) end = (int)arg1;
396 3197 mdecorde
                //
397 3197 mdecorde
                // if (end > 0 && start != end) {
398 3197 mdecorde
                // timeRange.setUpperValue(end);
399 3197 mdecorde
                // }
400 3197 mdecorde
                // else {
401 3197 mdecorde
                // timeRange.setUpperValue((int) arg1);
402 3197 mdecorde
                // }
403 3197 mdecorde
                //
404 3197 mdecorde
                // timeRange.setLowerValue(start);
405 3197 mdecorde
                // // System.out.println("Range: "+start+" -> "+end+" song length "+arg1);
406 3197 mdecorde
                // }
407 3197 mdecorde
                // });
408 3197 mdecorde
                // }
409 3197 mdecorde
                // }
410 3197 mdecorde
                // });
411 3197 mdecorde
        }
412 3197 mdecorde
413 3197 mdecorde
        protected void resizeView() {
414 3197 mdecorde
                if (view != null) {
415 3197 mdecorde
                        Point p = fxCanvas.getSize();
416 3197 mdecorde
                        // if (previousP == null || (p.x != previousP.x && p.y != previousP.y)) { // ensure size changed
417 3197 mdecorde
                        view.setFitHeight(p.y);
418 3197 mdecorde
                        view.setFitWidth(p.x);
419 3197 mdecorde
                        previousP = p;
420 3197 mdecorde
                        // }
421 3197 mdecorde
                }
422 3197 mdecorde
        }
423 3197 mdecorde
424 3197 mdecorde
        public void resume() {
425 3197 mdecorde
                if (jfxPlayer != null) {
426 3197 mdecorde
                        jfxPlayer.play();
427 3197 mdecorde
                        playButton.setText(MessagesMP.pause);
428 3197 mdecorde
                        playButton.getParent().layout();
429 3197 mdecorde
                }
430 3197 mdecorde
        }
431 3197 mdecorde
432 3197 mdecorde
        public void pause() {
433 3197 mdecorde
                if (jfxPlayer != null) {
434 3197 mdecorde
                        jfxPlayer.pause();
435 3197 mdecorde
                        playButton.setText(MessagesMP.resume);
436 3197 mdecorde
                        playButton.getParent().layout();
437 3197 mdecorde
                }
438 3197 mdecorde
        }
439 3197 mdecorde
440 3197 mdecorde
        private void updateTimeLabel() {
441 3197 mdecorde
                mins = time / 60;
442 3197 mdecorde
                secs = (time) % 60;
443 3197 mdecorde
                timeLabel.setText(String.format("%02d:%02d", mins, secs)); //$NON-NLS-1$
444 3197 mdecorde
                timeLabel.update();
445 3197 mdecorde
        }
446 3197 mdecorde
447 3197 mdecorde
        public void replay() {
448 3197 mdecorde
                if (currentlyPlayed.length() > 0) {
449 3197 mdecorde
                        jfxPlayer.seek(Duration.seconds(start));
450 3197 mdecorde
                        playButton.setText(MessagesMP.pause);
451 3197 mdecorde
                        playButton.getParent().layout();
452 3197 mdecorde
                }
453 3197 mdecorde
        }
454 3197 mdecorde
455 3197 mdecorde
        protected void selectMedia() {
456 3197 mdecorde
                Log.fine(MessagesMP.select_file);
457 3197 mdecorde
458 3197 mdecorde
                FileDialog fd = new FileDialog(JFXPlayer.this.getShell(), SWT.OPEN);
459 3197 mdecorde
                fd.setText(MessagesMP.select_file_title);
460 3197 mdecorde
                File f = new File(previouslyPlayed);
461 3197 mdecorde
                if (f.isDirectory()) fd.setFilterPath(f.getPath());
462 3197 mdecorde
                else fd.setFilterPath(f.getParent());
463 3197 mdecorde
464 3197 mdecorde
                String[] filterExt = { "*.*", "*.mp3", "*.mp4", "*.avi", "*.ogg", "*.ogv" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
465 3197 mdecorde
                fd.setFilterExtensions(filterExt);
466 3197 mdecorde
                String selected = fd.open();
467 3197 mdecorde
                if (selected == null) {
468 3197 mdecorde
                        System.out.println(MessagesMP.cancel);
469 3197 mdecorde
                        return;
470 3197 mdecorde
                }
471 3197 mdecorde
472 3197 mdecorde
                currentlyPlayed = selected;
473 3197 mdecorde
                previouslyPlayed = selected;
474 3197 mdecorde
                Log.fine(MessagesMP.opening + currentlyPlayed);
475 3197 mdecorde
                play(new File(currentlyPlayed).toURI().toString(), 0, 0);
476 3197 mdecorde
        }
477 3197 mdecorde
478 3197 mdecorde
        /**
479 3197 mdecorde
         *
480 3197 mdecorde
         * @param mrl
481 3197 mdecorde
         * @param time msec start time
482 3197 mdecorde
         * @param endtime msec end time
483 3197 mdecorde
         */
484 3197 mdecorde
        @Override
485 3197 mdecorde
        public boolean play(String mrl, int time, int endtime) {
486 3197 mdecorde
                Log.fine(MessagesMP.bind(MessagesMP.playing, new Object[] { mrl, time, endtime }));
487 3197 mdecorde
                return play(mrl, "" + time, "" + endtime); //$NON-NLS-1$ //$NON-NLS-2$
488 3197 mdecorde
        }
489 3197 mdecorde
490 3197 mdecorde
        @Override
491 3197 mdecorde
        public boolean play(String mrl, int time) {
492 3197 mdecorde
                return play(mrl, time, time);
493 3197 mdecorde
        }
494 3197 mdecorde
495 3197 mdecorde
        public void hideStopButton() {
496 3197 mdecorde
                if (this.stopButton != null && !this.stopButton.isDisposed()) {
497 3197 mdecorde
                        this.stopButton.dispose();
498 3197 mdecorde
                }
499 3197 mdecorde
        }
500 3197 mdecorde
501 3197 mdecorde
        DateTimeFormatter hhmmssFormatter = DateTimeFormatter.ISO_LOCAL_TIME;
502 3197 mdecorde
503 3197 mdecorde
        private MediaView view;
504 3197 mdecorde
505 3197 mdecorde
        private Group group;
506 3197 mdecorde
507 3197 mdecorde
        private Scene scene;
508 3197 mdecorde
509 3197 mdecorde
        private String mrl;
510 3197 mdecorde
511 3197 mdecorde
        private Media media;
512 3197 mdecorde
513 3197 mdecorde
        @Override
514 3197 mdecorde
        public final void setCredentials(String login, String mdp) {
515 3197 mdecorde
                Authenticator.setDefault(new Authenticator() {
516 3197 mdecorde
517 3197 mdecorde
                        @Override
518 3197 mdecorde
                        public PasswordAuthentication getPasswordAuthentication() {
519 3197 mdecorde
                                // System.out.println("PA: login=" + login + " mdp=" + mdp + " mrl=" + mrl + " req=" + getRequestingHost());
520 3197 mdecorde
                                if (login != null && mdp != null && mrl.contains("://" + getRequestingHost() + "/")) {
521 3197 mdecorde
                                        return new PasswordAuthentication(login, mdp.toCharArray());
522 3197 mdecorde
                                }
523 3197 mdecorde
                                return null;
524 3197 mdecorde
                        }
525 3197 mdecorde
                });
526 3197 mdecorde
        }
527 3197 mdecorde
528 3197 mdecorde
        /**
529 3197 mdecorde
         *
530 3197 mdecorde
         * @param mrl
531 3197 mdecorde
         * @param startTime "0.0" or ""hh:mm:ss" format
532 3197 mdecorde
         * @param endTime "0.0" or ""hh:mm:ss" format
533 3197 mdecorde
         */
534 3197 mdecorde
        @Override
535 3197 mdecorde
        public boolean play(String mrl, String startTime, String endTime) {
536 3197 mdecorde
537 3197 mdecorde
                if (mrl.contains("{0}:{1}@")) {
538 3197 mdecorde
                        mrl = mrl.replace("{0}:{1}@", "");
539 3197 mdecorde
                }
540 3197 mdecorde
541 3197 mdecorde
                this.mrl = mrl;
542 3197 mdecorde
                if (startTime.matches("[0-9]+.[0-9]+")) {
543 3197 mdecorde
                        start = (int) (Float.parseFloat(startTime));
544 3197 mdecorde
                }
545 3197 mdecorde
                else if (startTime.matches("[0-9]+:[0-9]+:[0-9]+")) {
546 3197 mdecorde
                        if (startTime.indexOf(":") == 1) {
547 3197 mdecorde
                                startTime = "0" + startTime;
548 3197 mdecorde
                        }
549 3197 mdecorde
                        LocalTime time1 = LocalTime.parse(startTime, hhmmssFormatter);
550 3197 mdecorde
                        start = ((time1.getHour() * 60 * 60) + (time1.getMinute() * 60) + time1.getSecond());
551 3197 mdecorde
                }
552 3197 mdecorde
553 3197 mdecorde
                if (endTime.matches("[0-9]+.[0-9]+")) {
554 3197 mdecorde
                        end = (int) (Float.parseFloat(endTime));
555 3197 mdecorde
                }
556 3197 mdecorde
                else if (endTime.matches("[0-9]+:[0-9]+:[0-9]+")) {
557 3197 mdecorde
                        if (endTime.indexOf(":") == 1) endTime = "0" + endTime;
558 3197 mdecorde
                        LocalTime time1 = LocalTime.parse(endTime, hhmmssFormatter);
559 3197 mdecorde
                        end = ((time1.getHour() * 60 * 60) + (time1.getMinute() * 60) + time1.getSecond());
560 3197 mdecorde
                }
561 3197 mdecorde
562 3197 mdecorde
                // if (start == end) end = -1;
563 3197 mdecorde
564 3197 mdecorde
                Log.finer(MessagesMP.bind(MessagesMP.playing, new Object[] { mrl, startTime, endTime }));
565 3197 mdecorde
                // vlcPlayer.submit(new Runnable() {
566 3197 mdecorde
                //
567 3197 mdecorde
                // @Override
568 3197 mdecorde
                // public void run() {
569 3197 mdecorde
                // String[] options = { " :live-caching=200" }; // reduce video stream cache duration to 200ms
570 3197 mdecorde
571 3197 mdecorde
                Log.finer("Preparing media...");
572 3197 mdecorde
                try {
573 3197 mdecorde
                        javafx.application.Platform.runLater(new Runnable() {
574 3197 mdecorde
575 3197 mdecorde
                                @Override
576 3197 mdecorde
                                public void run() {
577 3197 mdecorde
                                        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
578 3197 mdecorde
579 3197 mdecorde
                                                @Override
580 3197 mdecorde
                                                public void uncaughtException(Thread t, Throwable e) {
581 3197 mdecorde
                                                        System.out.println("JavaFX uncaught exception: " + e);
582 3197 mdecorde
                                                }
583 3197 mdecorde
                                        });
584 3197 mdecorde
                                }
585 3197 mdecorde
                        });
586 3197 mdecorde
                        media = new Media(mrl);
587 3197 mdecorde
                        if (jfxPlayer != null) {
588 3197 mdecorde
                                try {
589 3197 mdecorde
                                        jfxPlayer.stop();
590 3197 mdecorde
                                }
591 3197 mdecorde
                                catch (Exception e) {
592 3197 mdecorde
593 3197 mdecorde
                                }
594 3197 mdecorde
                        }
595 3197 mdecorde
596 3197 mdecorde
                        Platform.setImplicitExit(false); // This is important to avoid Thread exception when re-opening a player
597 3197 mdecorde
                        jfxPlayer = new MediaPlayer(media);
598 3197 mdecorde
599 3197 mdecorde
                        if (jfxPlayer.getError() == null) {
600 3197 mdecorde
                                jfxPlayer.setOnError(new Runnable() {
601 3197 mdecorde
602 3197 mdecorde
                                        @Override
603 3197 mdecorde
                                        public void run() {
604 3197 mdecorde
                                                System.out.println("JFX Player Error:");
605 3197 mdecorde
                                                jfxPlayer.getError().printStackTrace();
606 3197 mdecorde
                                        }
607 3197 mdecorde
                                });
608 3197 mdecorde
                        }
609 3197 mdecorde
                        else {
610 3197 mdecorde
                                System.out.println("Warning: could not retrieve media error logger");
611 3197 mdecorde
                        }
612 3197 mdecorde
613 3197 mdecorde
                        //initializePlayerListeners();
614 3197 mdecorde
                        jfxPlayer.setAutoPlay(false);
615 3197 mdecorde
616 3197 mdecorde
                        view = new MediaView(jfxPlayer);
617 3197 mdecorde
618 3197 mdecorde
                        HBox buttonSection = new HBox(view);
619 3197 mdecorde
                    buttonSection.setPadding(new Insets(2));
620 3197 mdecorde
                        group = new Group(buttonSection);
621 3197 mdecorde
                        //group.setAutoSizeChildren(true);
622 3197 mdecorde
                        // scene = new Scene(group, Color.rgb(fxCanvas.getBackground().getRed(), fxCanvas.getBackground().getGreen(), fxCanvas.getBackground().getBlue()));
623 3197 mdecorde
                        scene = new Scene(group, Color.rgb(0, 0, 0));
624 3197 mdecorde
625 3197 mdecorde
                        fxCanvas.setScene(scene);
626 3197 mdecorde
627 3197 mdecorde
                        //view.setPreserveRatio(true);
628 3197 mdecorde
                }
629 3197 mdecorde
                catch (Exception e) {
630 3197 mdecorde
                        e.printStackTrace();
631 3197 mdecorde
                        return false;
632 3197 mdecorde
                }
633 3197 mdecorde
634 3197 mdecorde
                jfxPlayer.setOnReady(new Runnable() {
635 3197 mdecorde
636 3197 mdecorde
                        @Override
637 3197 mdecorde
                        public void run() {
638 3197 mdecorde
639 3197 mdecorde
                                timeRange.setMinimum(0);
640 3197 mdecorde
                                Duration d = jfxPlayer.getMedia().getDuration();
641 3197 mdecorde
                                if (d.toSeconds() > 0) {
642 3197 mdecorde
                                        timeRange.setMaximum((int) d.toSeconds());
643 3197 mdecorde
                                }
644 3197 mdecorde
                                timeRange.setLowerValue(start);
645 3197 mdecorde
                                timeRange.setMiddleValue(start);
646 3197 mdecorde
647 3197 mdecorde
                                jfxPlayer.setVolume(volume);
648 3197 mdecorde
649 3197 mdecorde
                                jfxPlayer.setStartTime(Duration.seconds(start));
650 3197 mdecorde
                                //jfxPlayer.seek(Duration.seconds(start));
651 3197 mdecorde
                                if (end > start) {
652 3197 mdecorde
                                        timeRange.setUpperValue(end);
653 3197 mdecorde
                                        jfxPlayer.setStopTime(Duration.seconds(end));
654 3197 mdecorde
                                }
655 3197 mdecorde
                                else if (d.toSeconds() > 0) {
656 3197 mdecorde
                                        timeRange.setUpperValue((int) jfxPlayer.getMedia().getDuration().toSeconds());
657 3197 mdecorde
                                }
658 3197 mdecorde
                                Log.info("Playing media: "+media.getSource());
659 3197 mdecorde
660 3197 mdecorde
                                jfxPlayer.play();
661 3197 mdecorde
                                //resizeView();
662 3197 mdecorde
663 3197 mdecorde
                                // if (new File(mrl + ".srt").exists()) { //$NON-NLS-1$
664 3197 mdecorde
                                // vlcPlayer.sub.subpictures().setSubTitleFile(mrl + ".srt"); //$NON-NLS-1$
665 3197 mdecorde
                                // }
666 3197 mdecorde
                                currentlyPlayed = JFXPlayer.this.mrl;
667 3197 mdecorde
                                previouslyPlayed = JFXPlayer.this.mrl;
668 3197 mdecorde
669 3197 mdecorde
                                if (!playButton.isDisposed()) {
670 3197 mdecorde
                                        playButton.setText(MessagesMP.pause);
671 3197 mdecorde
                                        playButton.getParent().layout(true);
672 3197 mdecorde
                                }
673 3197 mdecorde
                                firstLengthEvent = true;
674 3197 mdecorde
                        }
675 3197 mdecorde
                });
676 3197 mdecorde
677 3197 mdecorde
                return true;
678 3197 mdecorde
        }
679 3197 mdecorde
680 3197 mdecorde
        private void initializePlayerListeners() {
681 3197 mdecorde
682 3197 mdecorde
                jfxPlayer.currentTimeProperty().addListener(new InvalidationListener() {
683 3197 mdecorde
684 3197 mdecorde
                        @Override
685 3197 mdecorde
                        public void invalidated(Observable ov) {
686 3197 mdecorde
                                if (fxCanvas.isDisposed()) return;
687 3197 mdecorde
                                if (jfxPlayer == null) return;
688 3197 mdecorde
689 3197 mdecorde
                                Duration currentTime = jfxPlayer.getCurrentTime();
690 3197 mdecorde
                                time = (int) currentTime.toSeconds();
691 3197 mdecorde
                                if (previous == time) {
692 3197 mdecorde
                                        return;
693 3197 mdecorde
                                }
694 3197 mdecorde
                                previous = time;
695 3197 mdecorde
696 3197 mdecorde
                                timeLabel.getDisplay().syncExec(new Runnable() {
697 3197 mdecorde
698 3197 mdecorde
                                        @Override
699 3197 mdecorde
                                        public void run() {
700 3197 mdecorde
                                                if (timeRange.isDisposed()) {
701 3197 mdecorde
                                                        return;
702 3197 mdecorde
                                                }
703 3197 mdecorde
                                                if (!timeRange.isDragMiddleKnob()) {
704 3197 mdecorde
                                                        timeRange.setMiddleValue((int) time);
705 3197 mdecorde
                                                }
706 3197 mdecorde
                                                updateTimeLabel();
707 3197 mdecorde
708 3197 mdecorde
                                                // if (time >= end && end != start) {
709 3197 mdecorde
                                                // if (repeat) {
710 3197 mdecorde
                                                // vlcPlayer.seek(Duration.seconds(start));
711 3197 mdecorde
                                                // }
712 3197 mdecorde
                                                // else {
713 3197 mdecorde
                                                // vlcPlayer.stop();
714 3197 mdecorde
                                                // }
715 3197 mdecorde
                                                // }
716 3197 mdecorde
                                        }
717 3197 mdecorde
                                });
718 3197 mdecorde
                        }
719 3197 mdecorde
                });
720 3197 mdecorde
        }
721 3197 mdecorde
722 3197 mdecorde
        @Override
723 3197 mdecorde
        public void setRepeat(boolean repeat) {
724 3197 mdecorde
                this.repeat = repeat;
725 3197 mdecorde
                if (this.repeat) {
726 3197 mdecorde
                        jfxPlayer.setCycleCount(Integer.MAX_VALUE);
727 3197 mdecorde
                }
728 3197 mdecorde
                else {
729 3197 mdecorde
                        jfxPlayer.setCycleCount(0);
730 3197 mdecorde
                }
731 3197 mdecorde
                if (!repeatButton.isDisposed()) {
732 3197 mdecorde
                        repeatButton.setSelection(repeat);
733 3197 mdecorde
                }
734 3197 mdecorde
        }
735 3197 mdecorde
736 3197 mdecorde
        @Override
737 3197 mdecorde
        public void stop() {
738 3197 mdecorde
                if (jfxPlayer == null) return; // nothing to do
739 3197 mdecorde
740 3197 mdecorde
741 3197 mdecorde
                userStopped = true;
742 3197 mdecorde
                jfxPlayer.stop();
743 3197 mdecorde
744 3197 mdecorde
                jfxPlayer.dispose();
745 3197 mdecorde
                jfxPlayer = null;
746 3197 mdecorde
                if (!fxCanvas.isDisposed()) {
747 3197 mdecorde
                        fxCanvas.setScene(null);
748 3197 mdecorde
                }
749 3197 mdecorde
                currentlyPlayed = NOMEDIA;
750 3197 mdecorde
                if (!playButton.isDisposed()) {
751 3197 mdecorde
                        playButton.setText(MessagesMP.play);
752 3197 mdecorde
                        playButton.getParent().layout();
753 3197 mdecorde
                }
754 3197 mdecorde
        }
755 3197 mdecorde
756 3197 mdecorde
        @Override
757 3197 mdecorde
        public boolean isMediaLoaded() {
758 3197 mdecorde
                return jfxPlayer != null && jfxPlayer.getStatus().equals(Status.READY);
759 3197 mdecorde
        }
760 3197 mdecorde
761 3197 mdecorde
        @Override
762 3197 mdecorde
        public void seek(float time) {
763 3197 mdecorde
764 3197 mdecorde
                this.jfxPlayer.seek(Duration.seconds(time));
765 3197 mdecorde
        }
766 3197 mdecorde
767 3197 mdecorde
        @Override
768 3197 mdecorde
        public void setVolume(double volume) {
769 3197 mdecorde
770 3197 mdecorde
                this.jfxPlayer.setVolume(volume);
771 3197 mdecorde
        }
772 3197 mdecorde
773 3197 mdecorde
        @Override
774 3197 mdecorde
        public void setRate(float rate) {
775 3197 mdecorde
776 3197 mdecorde
                this.jfxPlayer.setRate(rate);
777 3197 mdecorde
        }
778 3197 mdecorde
779 3197 mdecorde
        @Override
780 3197 mdecorde
        public boolean isPlaying() {
781 3197 mdecorde
782 3197 mdecorde
                return jfxPlayer.getStatus().equals(Status.PLAYING);
783 3197 mdecorde
        }
784 3197 mdecorde
785 3197 mdecorde
        @Override
786 3197 mdecorde
        public void setStartTime(float seconds) {
787 3197 mdecorde
788 3197 mdecorde
                this.jfxPlayer.setStartTime(Duration.seconds(seconds));
789 3197 mdecorde
790 3197 mdecorde
        }
791 3197 mdecorde
792 3197 mdecorde
        @Override
793 3197 mdecorde
        public void setStopTime(float seconds) {
794 3197 mdecorde
795 3197 mdecorde
                this.jfxPlayer.setStopTime(Duration.seconds(seconds));
796 3197 mdecorde
797 3197 mdecorde
        }
798 3197 mdecorde
799 3197 mdecorde
}