package io.swtc; import com.github.sarxos.webcam.Webcam; import io.swtc.proccessing.ui.IconSetter; import io.swtc.proccessing.ui.desktop.DIM; import io.swtc.proccessing.ui.desktop.evidence.EvidenceExportFrame; import io.swtc.proccessing.ui.iframe.*; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.HashMap; import java.util.Map; import java.util.Objects; public class SwingIFrame { private final JFrame mainFrame; private final DesktopPane desktopPane; private final DIM desktopIconManager; private final Map cameraToEffects = new HashMap<>(); private boolean fullscreen = false; private Rectangle windowedBounds; private boolean blackbg = false; private final Color bgcolor = Color.decode("#336B6A"); private final Color defDesktopBg = Color.WHITE; private final JPopupMenu popupMenu = new JPopupMenu(); public SwingIFrame() { mainFrame = new JFrame("Viewer"); mainFrame.setSize(1280, 720); mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); mainFrame.setIconImage(IconSetter.getIcon()); desktopPane = new DesktopPane(cameraToEffects); desktopPane.setBackground(defDesktopBg); mainFrame.add(desktopPane, BorderLayout.CENTER); desktopIconManager = new DIM(desktopPane); setupDesktopExportFrame(); setupFullscreenToggle(); setupBlackBg(); initPopupMenu(); desktopPane.addMouseListener(popupListener()); } private void setupDesktopExportFrame() { desktopIconManager.addIcon( "Export Evidence", IconSetter.getSaveIconAsImageIcon(), /* e1003c20ff00c637d963ce21fd685fed6460602a: Fix to icon, need to pass parent! Or Override method which is dumb */ () -> EvidenceExportFrame.showExport(mainFrame) ); } public void addCameraInternalFrame(Webcam webcam) { CameraInternalFrame cameraFrame = new CameraInternalFrame(webcam, this::handleEffectsRequest); EffectsPanelFrame effectsFrame = new EffectsPanelFrame( "Effects - " + webcam.getName(), cameraFrame.getCameraPanel() ); cameraToEffects.put(cameraFrame, effectsFrame); int offset = desktopPane.getAllFrames().length * 15; cameraFrame.setLocation(50 + offset, 50 + offset); effectsFrame.setLocation(700 + offset, 50 + offset); effectsFrame.setVisible(false); cameraFrame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter() { @Override public void internalFrameClosing(javax.swing.event.InternalFrameEvent e) { EffectsPanelFrame ef = cameraToEffects.remove(cameraFrame); if (ef != null) ef.dispose(); desktopPane.forgetFrame(cameraFrame); cameraFrame.dispose(); } }); desktopPane.add(cameraFrame); desktopPane.add(effectsFrame); // Attach popup menu to frames and content MouseAdapter popup = popupListener(); cameraFrame.addMouseListener(popup); cameraFrame.getContentPane().addMouseListener(popup); effectsFrame.addMouseListener(popup); effectsFrame.getContentPane().addMouseListener(popup); cameraFrame.setVisible(true); } private void handleEffectsRequest(CameraInternalFrame source) { EffectsPanelFrame effectsFrame = cameraToEffects.get(source); if (effectsFrame != null) { effectsFrame.setVisible(true); try { effectsFrame.setSelected(true); effectsFrame.toFront(); } catch (java.beans.PropertyVetoException ex) { JOptionPane.showMessageDialog(null, "Focus Error: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } } private MouseAdapter popupListener() { return new MouseAdapter() { private void showPopup(MouseEvent e) { if (e.isPopupTrigger()) { // cross-platform trigger popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } @Override public void mousePressed(MouseEvent e) { showPopup(e); } @Override public void mouseReleased(MouseEvent e) { showPopup(e); } }; } private void initPopupMenu() { popupMenu.removeAll(); // clean slate JCheckBoxMenuItem fullscreenItem = new JCheckBoxMenuItem("Fullscreen"); JCheckBoxMenuItem mmfullscreenItem = new JCheckBoxMenuItem("Multi Monitor Fullscreen"); JCheckBoxMenuItem backgroundcolor = new JCheckBoxMenuItem("Calmer Background"); JMenuItem colorpicker = new JMenuItem("Set background color"); fullscreenItem.addActionListener(e -> toggleFullscreen()); mmfullscreenItem.addActionListener(e -> toggleMMFullscreen()); backgroundcolor.addActionListener(e -> toggleBackground()); colorpicker.addActionListener(e -> chooseBgColor()); popupMenu.addPopupMenuListener(new javax.swing.event.PopupMenuListener() { @Override public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent e) { fullscreenItem.setState(fullscreen); } @Override public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent e) {} @Override public void popupMenuCanceled(javax.swing.event.PopupMenuEvent e) {} }); popupMenu.add(fullscreenItem); popupMenu.add(mmfullscreenItem); popupMenu.add(backgroundcolor); popupMenu.add(colorpicker); } private void chooseBgColor() { Color selected = JColorChooser.showDialog( mainFrame, "Select Background Color", desktopPane.getBackground() ); if (!Objects.isNull(selected)) { desktopPane.setBackground(selected); desktopPane.repaint(); } } private void setupBlackBg() { JRootPane root = mainFrame.getRootPane(); root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke("B"), "toggleBlackBg"); root.getActionMap().put("toggleBlackBg", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { toggleBackground(); } }); } private void setupFullscreenToggle() { JRootPane root = mainFrame.getRootPane(); // One Monitor FS root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke("F11"), "toggleFullscreen"); root.getActionMap().put("toggleFullscreen", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { toggleFullscreen(); } }); // Multi Monitor FS root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke("F12"), "toggleMMFullscreen"); root.getActionMap().put("toggleMMFullscreen", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { toggleMMFullscreen(); } }); } private void toggleBackground() { desktopPane.setBackground(blackbg ? defDesktopBg : bgcolor); blackbg = !blackbg; desktopPane.repaint(); } private void toggleMMFullscreen() { if (!fullscreen) { windowedBounds = mainFrame.getBounds(); Rectangle virtualBounds = new Rectangle(); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); for (GraphicsDevice gd : gs) { GraphicsConfiguration[] gc = gd.getConfigurations(); for (GraphicsConfiguration configuration : gc) { virtualBounds = virtualBounds.union(configuration.getBounds()); } } mainFrame.dispose(); mainFrame.setUndecorated(true); mainFrame.setBounds(virtualBounds); mainFrame.setVisible(true); fullscreen = true; } else { toggleFullscreen(); } } /** Toggle fullscreen mode */ private void toggleFullscreen() { if (!fullscreen) { windowedBounds = mainFrame.getBounds(); mainFrame.dispose(); mainFrame.setUndecorated(true); mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH); mainFrame.setVisible(true); } else { mainFrame.dispose(); mainFrame.setUndecorated(false); mainFrame.setExtendedState(JFrame.NORMAL); mainFrame.setBounds(windowedBounds); mainFrame.setVisible(true); } fullscreen = !fullscreen; } public void show() { mainFrame.setLocationRelativeTo(null); mainFrame.setVisible(true); } }