Uses 0K of libraries. Click here for Pure Java version (5261L/34K).
1 | !7 |
2 | |
3 | lib 1400072 // vlcj player (hacked) |
4 | lib 1400069 // vlcj player libs |
5 | |
6 | import static uk.co.caprica.vlcjplayer.Application.application; |
7 | import static uk.co.caprica.vlcjplayer.Application.resources; |
8 | import static uk.co.caprica.vlcjplayer.view.action.Resource.resource; |
9 | |
10 | import java.util.prefs.Preferences; |
11 | import java.text.*; |
12 | |
13 | import net.miginfocom.swing.*; |
14 | |
15 | import uk.co.caprica.vlcj.player.*; |
16 | import uk.co.caprica.vlcjplayer.view.snapshot.*; |
17 | import uk.co.caprica.vlcjplayer.view.action.mediaplayer.*; |
18 | import uk.co.caprica.vlcjplayer.view.*; |
19 | import uk.co.caprica.vlcj.player.embedded.*; |
20 | import uk.co.caprica.vlcjplayer.event.*; |
21 | import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; |
22 | import uk.co.caprica.vlcj.discovery.NativeDiscovery; |
23 | import uk.co.caprica.vlcj.log.NativeLog; |
24 | import uk.co.caprica.vlcj.runtime.RuntimeUtil; |
25 | import uk.co.caprica.vlcj.runtime.streams.NativeStreams; |
26 | import uk.co.caprica.vlcjplayer.view.debug.DebugFrame; |
27 | import uk.co.caprica.vlcjplayer.view.effects.EffectsFrame; |
28 | import uk.co.caprica.vlcjplayer.view.main.MainFrame; |
29 | import uk.co.caprica.vlcjplayer.view.messages.NativeLogFrame; |
30 | import uk.co.caprica.vlcjplayer.view.action.*; |
31 | import uk.co.caprica.vlcjplayer.view.main.*; |
32 | |
33 | import com.google.common.eventbus.Subscribe; |
34 | |
35 | sclass VLCJPlayer extends DynModule { |
36 | transient EmbeddedMediaPlayerComponent mediaPlayerComponent; |
37 | transient NativeStreams nativeStreams; |
38 | transient JInternalFrame mainFrame; |
39 | transient JFrame messagesFrame, effectsFrame, debugFrame; |
40 | transient NativeLog nativeLog; |
41 | |
42 | void start { |
43 | // This will locate LibVLC for the vast majority of cases |
44 | new NativeDiscovery().discover(); |
45 | startPlayer(); |
46 | } |
47 | |
48 | void unvisualize() { |
49 | mediaPlayerComponent.getMediaPlayer().stop(); |
50 | mediaPlayerComponent.release(); |
51 | if (nativeStreams != null) nativeStreams.release(); |
52 | application().post(ShutdownEvent.INSTANCE); |
53 | } |
54 | |
55 | void startPlayer() swing { |
56 | mediaPlayerComponent = application().mediaPlayerComponent(); |
57 | |
58 | mainFrame = new MainFrame(); |
59 | |
60 | EmbeddedMediaPlayer embeddedMediaPlayer = mediaPlayerComponent.getMediaPlayer(); |
61 | //embeddedMediaPlayer.setFullScreenStrategy(new VlcjPlayerFullScreenStrategy(mainFrame)); |
62 | |
63 | nativeLog = mediaPlayerComponent.getMediaPlayerFactory().newLog(); |
64 | |
65 | messagesFrame = new NativeLogFrame(nativeLog); |
66 | effectsFrame = new EffectsFrame(); |
67 | debugFrame = new DebugFrame(); |
68 | |
69 | mainFrame.setVisible(true); |
70 | } |
71 | } |
72 | |
73 | sclass VlcjPlayerFullScreenStrategy extends DefaultAdaptiveRuntimeFullScreenStrategy { |
74 | *(Window window) { super(window); } |
75 | |
76 | @Override |
77 | protected void beforeEnterFullScreen() { |
78 | application().post(BeforeEnterFullScreenEvent.INSTANCE); |
79 | } |
80 | |
81 | @Override |
82 | protected void afterExitFullScreen() { |
83 | application().post(AfterExitFullScreenEvent.INSTANCE); |
84 | } |
85 | } |
86 | |
87 | // TODO: BaseFrame subscribes |
88 | |
89 | sclass MainFrame extends JInternalFrame { |
90 | |
91 | private static final String ACTION_EXIT_FULLSCREEN = "exit-fullscreen"; |
92 | |
93 | private static final KeyStroke KEYSTROKE_ESCAPE = KeyStroke.getKeyStroke("ESCAPE"); |
94 | |
95 | private static final KeyStroke KEYSTROKE_TOGGLE_FULLSCREEN = KeyStroke.getKeyStroke("F11"); |
96 | |
97 | private final EmbeddedMediaPlayerComponent mediaPlayerComponent; |
98 | |
99 | private final Action mediaOpenAction; |
100 | private final Action mediaQuitAction; |
101 | |
102 | private final StandardAction videoFullscreenAction; |
103 | |
104 | private final Action subtitleAddSubtitleFileAction; |
105 | |
106 | private final Action toolsEffectsAction; |
107 | private final Action toolsMessagesAction; |
108 | private final Action toolsDebugAction; |
109 | |
110 | private final StandardAction viewStatusBarAction; |
111 | |
112 | private final Action helpAboutAction; |
113 | |
114 | private final JMenuBar menuBar; |
115 | |
116 | private final JMenu mediaMenu; |
117 | private final JMenu mediaRecentMenu; |
118 | |
119 | private final JMenu playbackMenu; |
120 | private final JMenu playbackTitleMenu; |
121 | private final JMenu playbackChapterMenu; |
122 | private final JMenu playbackSpeedMenu; |
123 | |
124 | private final JMenu audioMenu; |
125 | private final JMenu audioTrackMenu; |
126 | private final JMenu audioDeviceMenu; |
127 | private final JMenu audioStereoMenu; |
128 | |
129 | private final JMenu videoMenu; |
130 | private final JMenu videoTrackMenu; |
131 | private final JMenu videoZoomMenu; |
132 | private final JMenu videoAspectRatioMenu; |
133 | private final JMenu videoCropMenu; |
134 | |
135 | private final JMenu subtitleMenu; |
136 | private final JMenu subtitleTrackMenu; |
137 | |
138 | private final JMenu toolsMenu; |
139 | |
140 | private final JMenu viewMenu; |
141 | |
142 | private final JMenu helpMenu; |
143 | |
144 | private final JFileChooser fileChooser; |
145 | |
146 | private final PositionPane positionPane; |
147 | |
148 | private final ControlsPane controlsPane; |
149 | |
150 | private final StatusBar statusBar; |
151 | |
152 | private final VideoContentPane videoContentPane; |
153 | |
154 | private final JPanel bottomPane; |
155 | |
156 | private final MouseMovementDetector mouseMovementDetector; |
157 | |
158 | public MainFrame() { |
159 | super("vlcj player"); |
160 | |
161 | this.mediaPlayerComponent = application().mediaPlayerComponent(); |
162 | |
163 | MediaPlayerActions mediaPlayerActions = application().mediaPlayerActions(); |
164 | |
165 | mediaOpenAction = new StandardAction(resource("menu.media.item.openFile")) { |
166 | @Override |
167 | public void actionPerformed(ActionEvent e) { |
168 | if (JFileChooser.APPROVE_OPTION == fileChooser.showOpenDialog(MainFrame.this)) { |
169 | File file = fileChooser.getSelectedFile(); |
170 | String mrl = file.getAbsolutePath(); |
171 | application().addRecentMedia(mrl); |
172 | mediaPlayerComponent.getMediaPlayer().playMedia(mrl); |
173 | } |
174 | } |
175 | }; |
176 | |
177 | mediaQuitAction = new StandardAction(resource("menu.media.item.quit")) { |
178 | @Override |
179 | public void actionPerformed(ActionEvent e) { |
180 | /*dispose(); |
181 | System.exit(0);*/ |
182 | // TODO |
183 | } |
184 | }; |
185 | |
186 | videoFullscreenAction = new StandardAction(resource("menu.video.item.fullscreen")) { |
187 | @Override |
188 | public void actionPerformed(ActionEvent e) { |
189 | mediaPlayerComponent.getMediaPlayer().toggleFullScreen(); |
190 | } |
191 | }; |
192 | |
193 | subtitleAddSubtitleFileAction = new StandardAction(resource("menu.subtitle.item.addSubtitleFile")) { |
194 | @Override |
195 | public void actionPerformed(ActionEvent e) { |
196 | if (JFileChooser.APPROVE_OPTION == fileChooser.showOpenDialog(MainFrame.this)) { |
197 | File file = fileChooser.getSelectedFile(); |
198 | mediaPlayerComponent.getMediaPlayer().setSubTitleFile(file); |
199 | } |
200 | } |
201 | }; |
202 | |
203 | toolsEffectsAction = new StandardAction(resource("menu.tools.item.effects")) { |
204 | @Override |
205 | public void actionPerformed(ActionEvent e) { |
206 | application().post(ShowEffectsEvent.INSTANCE); |
207 | } |
208 | }; |
209 | |
210 | toolsMessagesAction = new StandardAction(resource("menu.tools.item.messages")) { |
211 | @Override |
212 | public void actionPerformed(ActionEvent e) { |
213 | application().post(ShowMessagesEvent.INSTANCE); |
214 | } |
215 | }; |
216 | |
217 | toolsDebugAction = new StandardAction(resource("menu.tools.item.debug")) { |
218 | @Override |
219 | public void actionPerformed(ActionEvent e) { |
220 | application().post(ShowDebugEvent.INSTANCE); |
221 | } |
222 | }; |
223 | |
224 | viewStatusBarAction = new StandardAction(resource("menu.view.item.statusBar")) { |
225 | @Override |
226 | public void actionPerformed(ActionEvent e) { |
227 | boolean visible; |
228 | Object source = e.getSource(); |
229 | if (source instanceof JCheckBoxMenuItem) { |
230 | JCheckBoxMenuItem menuItem = (JCheckBoxMenuItem)source; |
231 | visible = menuItem.isSelected(); |
232 | } |
233 | else { |
234 | throw new IllegalStateException("Don't know about source " + source); |
235 | } |
236 | statusBar.setVisible(visible); |
237 | bottomPane.invalidate(); |
238 | bottomPane.revalidate(); |
239 | bottomPane.getParent().invalidate(); |
240 | bottomPane.getParent().revalidate(); |
241 | MainFrame.this.invalidate(); |
242 | MainFrame.this.revalidate(); |
243 | } |
244 | }; |
245 | |
246 | helpAboutAction = new StandardAction(resource("menu.help.item.about")) { |
247 | @Override |
248 | public void actionPerformed(ActionEvent e) { |
249 | AboutDialog dialog = new AboutDialog(null); |
250 | dialog.setVisible(true); |
251 | } |
252 | }; |
253 | |
254 | menuBar = new JMenuBar(); |
255 | |
256 | mediaMenu = new JMenu(resource("menu.media").name()); |
257 | mediaMenu.setMnemonic(resource("menu.media").mnemonic()); |
258 | mediaMenu.add(new JMenuItem(mediaOpenAction)); |
259 | mediaRecentMenu = new RecentMediaMenu(resource("menu.media.item.recent")).menu(); |
260 | mediaMenu.add(mediaRecentMenu); |
261 | mediaMenu.add(new JSeparator()); |
262 | mediaMenu.add(new JMenuItem(mediaQuitAction)); |
263 | menuBar.add(mediaMenu); |
264 | |
265 | playbackMenu = new JMenu(resource("menu.playback").name()); |
266 | playbackMenu.setMnemonic(resource("menu.playback").mnemonic()); |
267 | |
268 | playbackTitleMenu = new TitleTrackMenu().menu(); |
269 | |
270 | // Chapter could be an "on-demand" menu too, and it could be with radio buttons... |
271 | |
272 | playbackMenu.add(playbackTitleMenu); |
273 | |
274 | playbackChapterMenu = new ChapterMenu().menu(); |
275 | |
276 | playbackMenu.add(playbackChapterMenu); |
277 | playbackMenu.add(new JSeparator()); |
278 | playbackSpeedMenu = new JMenu(resource("menu.playback.item.speed").name()); |
279 | playbackSpeedMenu.setMnemonic(resource("menu.playback.item.speed").mnemonic()); |
280 | for (Action action : mediaPlayerActions.playbackSpeedActions()) { |
281 | playbackSpeedMenu.add(new JMenuItem(action)); |
282 | } |
283 | playbackMenu.add(playbackSpeedMenu); |
284 | playbackMenu.add(new JSeparator()); |
285 | for (Action action : mediaPlayerActions.playbackSkipActions()) { |
286 | playbackMenu.add(new JMenuItem(action)); |
287 | } |
288 | playbackMenu.add(new JSeparator()); |
289 | for (Action action : mediaPlayerActions.playbackChapterActions()) { |
290 | playbackMenu.add(new JMenuItem(action)); |
291 | } |
292 | playbackMenu.add(new JSeparator()); |
293 | for (Action action : mediaPlayerActions.playbackControlActions()) { |
294 | playbackMenu.add(new JMenuItem(action) { // FIXME need a standardmenuitem that disables the tooltip like this, very poor show... |
295 | @Override |
296 | public String getToolTipText() { |
297 | return null; |
298 | } |
299 | }); |
300 | } |
301 | menuBar.add(playbackMenu); |
302 | |
303 | audioMenu = new JMenu(resource("menu.audio").name()); |
304 | audioMenu.setMnemonic(resource("menu.audio").mnemonic()); |
305 | |
306 | audioTrackMenu = new AudioTrackMenu().menu(); |
307 | |
308 | audioMenu.add(audioTrackMenu); |
309 | audioDeviceMenu = new AudioDeviceMenu().menu(); |
310 | audioMenu.add(audioDeviceMenu); |
311 | audioStereoMenu = new JMenu(resource("menu.audio.item.stereoMode").name()); |
312 | audioStereoMenu.setMnemonic(resource("menu.audio.item.stereoMode").mnemonic()); |
313 | for (Action action : mediaPlayerActions.audioStereoModeActions()) { |
314 | audioStereoMenu.add(new JRadioButtonMenuItem(action)); |
315 | } |
316 | audioMenu.add(audioStereoMenu); |
317 | audioMenu.add(new JSeparator()); |
318 | for (Action action : mediaPlayerActions.audioControlActions()) { |
319 | audioMenu.add(new JMenuItem(action)); |
320 | } |
321 | menuBar.add(audioMenu); |
322 | |
323 | videoMenu = new JMenu(resource("menu.video").name()); |
324 | videoMenu.setMnemonic(resource("menu.video").mnemonic()); |
325 | |
326 | videoTrackMenu = new VideoTrackMenu().menu(); |
327 | |
328 | videoMenu.add(videoTrackMenu); |
329 | videoMenu.add(new JSeparator()); |
330 | videoMenu.add(new JCheckBoxMenuItem(videoFullscreenAction)); |
331 | videoMenu.add(new JSeparator()); |
332 | videoZoomMenu = new JMenu(resource("menu.video.item.zoom").name()); |
333 | videoZoomMenu.setMnemonic(resource("menu.video.item.zoom").mnemonic()); |
334 | addActions(mediaPlayerActions.videoZoomActions(), videoZoomMenu/*, true*/); // FIXME how to handle zoom 1:1 and fit to window - also, probably should not use addActions to select |
335 | videoMenu.add(videoZoomMenu); |
336 | videoAspectRatioMenu = new JMenu(resource("menu.video.item.aspectRatio").name()); |
337 | videoAspectRatioMenu.setMnemonic(resource("menu.video.item.aspectRatio").mnemonic()); |
338 | addActions(mediaPlayerActions.videoAspectRatioActions(), videoAspectRatioMenu, true); |
339 | videoMenu.add(videoAspectRatioMenu); |
340 | videoCropMenu = new JMenu(resource("menu.video.item.crop").name()); |
341 | videoCropMenu.setMnemonic(resource("menu.video.item.crop").mnemonic()); |
342 | addActions(mediaPlayerActions.videoCropActions(), videoCropMenu, true); |
343 | videoMenu.add(videoCropMenu); |
344 | videoMenu.add(new JSeparator()); |
345 | videoMenu.add(new JMenuItem(mediaPlayerActions.videoSnapshotAction())); |
346 | menuBar.add(videoMenu); |
347 | |
348 | subtitleMenu = new JMenu(resource("menu.subtitle").name()); |
349 | subtitleMenu.setMnemonic(resource("menu.subtitle").mnemonic()); |
350 | subtitleMenu.add(new JMenuItem(subtitleAddSubtitleFileAction)); |
351 | |
352 | subtitleTrackMenu = new SubtitleTrackMenu().menu(); |
353 | |
354 | subtitleMenu.add(subtitleTrackMenu); |
355 | menuBar.add(subtitleMenu); |
356 | |
357 | toolsMenu = new JMenu(resource("menu.tools").name()); |
358 | toolsMenu.setMnemonic(resource("menu.tools").mnemonic()); |
359 | toolsMenu.add(new JMenuItem(toolsEffectsAction)); |
360 | toolsMenu.add(new JMenuItem(toolsMessagesAction)); |
361 | toolsMenu.add(new JSeparator()); |
362 | toolsMenu.add(new JMenuItem(toolsDebugAction)); |
363 | menuBar.add(toolsMenu); |
364 | |
365 | viewMenu = new JMenu(resource("menu.view").name()); |
366 | viewMenu.setMnemonic(resource("menu.view").mnemonic()); |
367 | viewMenu.add(new JCheckBoxMenuItem(viewStatusBarAction)); |
368 | menuBar.add(viewMenu); |
369 | |
370 | helpMenu = new JMenu(resource("menu.help").name()); |
371 | helpMenu.setMnemonic(resource("menu.help").mnemonic()); |
372 | helpMenu.add(new JMenuItem(helpAboutAction)); |
373 | menuBar.add(helpMenu); |
374 | |
375 | setJMenuBar(menuBar); |
376 | |
377 | videoContentPane = new VideoContentPane(); |
378 | |
379 | JPanel contentPane = new JPanel(); |
380 | contentPane.setLayout(new BorderLayout()); |
381 | contentPane.add(videoContentPane, BorderLayout.CENTER); |
382 | contentPane.setTransferHandler(new MediaTransferHandler() { |
383 | @Override |
384 | protected void onMediaDropped(String[] uris) { |
385 | mediaPlayerComponent.getMediaPlayer().playMedia(uris[0]); |
386 | } |
387 | }); |
388 | |
389 | setContentPane(contentPane); |
390 | |
391 | fileChooser = new JFileChooser(); |
392 | |
393 | bottomPane = new JPanel(); |
394 | bottomPane.setLayout(new BorderLayout()); |
395 | |
396 | JPanel bottomControlsPane = new JPanel(); |
397 | bottomControlsPane.setLayout(new MigLayout("fill, insets 0 n n n", "[grow]", "[]0[]")); |
398 | |
399 | positionPane = new PositionPane(mediaPlayerComponent.getMediaPlayer()); |
400 | bottomControlsPane.add(positionPane, "grow, wrap"); |
401 | |
402 | controlsPane = new ControlsPane(mediaPlayerActions); |
403 | bottomPane.add(bottomControlsPane, BorderLayout.CENTER); |
404 | bottomControlsPane.add(controlsPane, "grow"); |
405 | |
406 | statusBar = new StatusBar(); |
407 | bottomPane.add(statusBar, BorderLayout.SOUTH); |
408 | |
409 | contentPane.add(bottomPane, BorderLayout.SOUTH); |
410 | |
411 | mediaPlayerComponent.getMediaPlayer().addMediaPlayerEventListener(new MediaPlayerEventAdapter() { |
412 | |
413 | @Override |
414 | public void playing(MediaPlayer mediaPlayer) { |
415 | videoContentPane.showVideo(); |
416 | mouseMovementDetector.start(); |
417 | application().post(PlayingEvent.INSTANCE); |
418 | } |
419 | |
420 | @Override |
421 | public void paused(MediaPlayer mediaPlayer) { |
422 | mouseMovementDetector.stop(); |
423 | application().post(PausedEvent.INSTANCE); |
424 | } |
425 | |
426 | @Override |
427 | public void stopped(MediaPlayer mediaPlayer) { |
428 | mouseMovementDetector.stop(); |
429 | videoContentPane.showDefault(); |
430 | application().post(StoppedEvent.INSTANCE); |
431 | } |
432 | |
433 | @Override |
434 | public void finished(MediaPlayer mediaPlayer) { |
435 | videoContentPane.showDefault(); |
436 | mouseMovementDetector.stop(); |
437 | application().post(StoppedEvent.INSTANCE); |
438 | } |
439 | |
440 | @Override |
441 | public void error(MediaPlayer mediaPlayer) { |
442 | videoContentPane.showDefault(); |
443 | mouseMovementDetector.stop(); |
444 | application().post(StoppedEvent.INSTANCE); |
445 | JOptionPane.showMessageDialog(MainFrame.this, MessageFormat.format(resources().getString("error.errorEncountered"), fileChooser.getSelectedFile().toString()), resources().getString("dialog.errorEncountered"), JOptionPane.ERROR_MESSAGE); |
446 | } |
447 | |
448 | @Override |
449 | public void mediaParsedChanged(final MediaPlayer mediaPlayer, int newStatus) { |
450 | SwingUtilities.invokeLater(new Runnable() { |
451 | @Override |
452 | public void run() { |
453 | statusBar.setTitle(mediaPlayer.getMediaMeta().getTitle()); |
454 | } |
455 | }); |
456 | } |
457 | |
458 | @Override |
459 | public void mediaDurationChanged(final MediaPlayer mediaPlayer, final long newDuration) { |
460 | swing { |
461 | positionPane.setDuration(newDuration); |
462 | statusBar.setDuration(newDuration); |
463 | } |
464 | } |
465 | |
466 | @Override |
467 | public void timeChanged(final MediaPlayer mediaPlayer, final long newTime) { |
468 | SwingUtilities.invokeLater(new Runnable() { |
469 | @Override |
470 | public void run() { |
471 | positionPane.setTime(newTime); |
472 | statusBar.setTime(newTime); |
473 | } |
474 | }); |
475 | } |
476 | }); |
477 | |
478 | getActionMap().put(ACTION_EXIT_FULLSCREEN, new AbstractAction() { |
479 | @Override |
480 | public void actionPerformed(ActionEvent e) { |
481 | mediaPlayerComponent.getMediaPlayer().toggleFullScreen(); |
482 | videoFullscreenAction.select(false); |
483 | } |
484 | }); |
485 | |
486 | applyPreferences(); |
487 | |
488 | mouseMovementDetector = new VideoMouseMovementDetector(mediaPlayerComponent.getVideoSurface(), 500, mediaPlayerComponent); |
489 | |
490 | setMinimumSize(new Dimension(370, 240)); |
491 | } |
492 | |
493 | private ButtonGroup addActions(List<Action> actions, JMenu menu, boolean selectFirst) { |
494 | ButtonGroup buttonGroup = addActions(actions, menu); |
495 | if (selectFirst) { |
496 | Enumeration<AbstractButton> en = buttonGroup.getElements(); |
497 | if (en.hasMoreElements()) { |
498 | StandardAction action = (StandardAction) en.nextElement().getAction(); |
499 | action.select(true); |
500 | } |
501 | } |
502 | return buttonGroup; |
503 | } |
504 | |
505 | private ButtonGroup addActions(List<Action> actions, JMenu menu) { |
506 | ButtonGroup buttonGroup = new ButtonGroup(); |
507 | for (Action action : actions) { |
508 | JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem(action); |
509 | buttonGroup.add(menuItem); |
510 | menu.add(menuItem); |
511 | } |
512 | return buttonGroup; |
513 | } |
514 | |
515 | private void applyPreferences() { |
516 | Preferences prefs = Preferences.userNodeForPackage(MainFrame.class); |
517 | setBounds( |
518 | prefs.getInt("frameX" , 100), |
519 | prefs.getInt("frameY" , 100), |
520 | prefs.getInt("frameWidth" , 800), |
521 | prefs.getInt("frameHeight", 600) |
522 | ); |
523 | /*boolean alwaysOnTop = prefs.getBoolean("alwaysOnTop", false); |
524 | setAlwaysOnTop(alwaysOnTop); |
525 | videoAlwaysOnTopAction.select(alwaysOnTop);*/ |
526 | boolean statusBarVisible = prefs.getBoolean("statusBar", false); |
527 | statusBar.setVisible(statusBarVisible); |
528 | viewStatusBarAction.select(statusBarVisible); |
529 | fileChooser.setCurrentDirectory(new File(prefs.get("chooserDirectory", "."))); |
530 | String recentMedia = prefs.get("recentMedia", ""); |
531 | if (recentMedia.length() > 0) { |
532 | List<String> mrls = Arrays.asList(prefs.get("recentMedia", "").split("\\|")); |
533 | Collections.reverse(mrls); |
534 | for (String mrl : mrls) { |
535 | application().addRecentMedia(mrl); |
536 | } |
537 | } |
538 | } |
539 | |
540 | /*@Override |
541 | protected void onShutdown() { |
542 | if (wasShown()) { |
543 | Preferences prefs = Preferences.userNodeForPackage(MainFrame.class); |
544 | prefs.putInt ("frameX" , getX ()); |
545 | prefs.putInt ("frameY" , getY ()); |
546 | prefs.putInt ("frameWidth" , getWidth ()); |
547 | prefs.putInt ("frameHeight" , getHeight()); |
548 | //prefs.putBoolean("alwaysOnTop" , isAlwaysOnTop()); |
549 | prefs.putBoolean("statusBar" , statusBar.isVisible()); |
550 | prefs.put ("chooserDirectory", fileChooser.getCurrentDirectory().toString()); |
551 | |
552 | String recentMedia; |
553 | List<String> mrls = application().recentMedia(); |
554 | if (!mrls.isEmpty()) { |
555 | StringBuilder sb = new StringBuilder(); |
556 | for (String mrl : mrls) { |
557 | if (sb.length() > 0) { |
558 | sb.append('|'); |
559 | } |
560 | sb.append(mrl); |
561 | } |
562 | recentMedia = sb.toString(); |
563 | } |
564 | else { |
565 | recentMedia = ""; |
566 | } |
567 | prefs.put("recentMedia", recentMedia); |
568 | } |
569 | }*/ |
570 | |
571 | /*@Subscribe |
572 | public void onBeforeEnterFullScreen(BeforeEnterFullScreenEvent event) { |
573 | menuBar.setVisible(false); |
574 | bottomPane.setVisible(false); |
575 | // As the menu is now hidden, the shortcut will not work, so register a temporary key-binding |
576 | registerEscapeBinding(); |
577 | }*/ |
578 | |
579 | /*@Subscribe |
580 | public void onAfterExitFullScreen(AfterExitFullScreenEvent event) { |
581 | deregisterEscapeBinding(); |
582 | menuBar.setVisible(true); |
583 | bottomPane.setVisible(true); |
584 | }*/ |
585 | |
586 | @Subscribe |
587 | public void onSnapshotImage(SnapshotImageEvent event) { |
588 | new SnapshotView(event.image()); |
589 | } |
590 | |
591 | private void registerEscapeBinding() { |
592 | getInputMap().put(KEYSTROKE_ESCAPE, ACTION_EXIT_FULLSCREEN); |
593 | getInputMap().put(KEYSTROKE_TOGGLE_FULLSCREEN, ACTION_EXIT_FULLSCREEN); |
594 | } |
595 | |
596 | private void deregisterEscapeBinding() { |
597 | getInputMap().remove(KEYSTROKE_ESCAPE); |
598 | getInputMap().remove(KEYSTROKE_TOGGLE_FULLSCREEN); |
599 | } |
600 | |
601 | /*private InputMap getInputMap() { |
602 | JComponent c = (JComponent) getContentPane(); |
603 | return c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); |
604 | } |
605 | |
606 | private ActionMap getActionMap() { |
607 | JComponent c = (JComponent) getContentPane(); |
608 | return c.getActionMap(); |
609 | }*/ |
610 | } |
Began life as a copy of #1016320
download show line numbers debug dex old transpilations
Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1016326 |
Snippet name: | VLCJ Player (external frame, Dyn Module, dev.) |
Eternal ID of this version: | #1016326/34 |
Text MD5: | d8dcd877c6278633179823b803075346 |
Transpilation MD5: | f8ba7ade9f8fa350fd37c22d5b8bdc11 |
Author: | stefan |
Category: | javax |
Type: | JavaX source code (Dynamic Module) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2018-10-31 13:38:42 |
Source code size: | 23806 bytes / 610 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 553 / 730 |
Version history: | 33 change(s) |
Referenced in: | [show references] |