179 lines
6.3 KiB
Java
179 lines
6.3 KiB
Java
package io.swtc;
|
|
|
|
import com.github.sarxos.webcam.Webcam;
|
|
import io.swtc.proccessing.ui.IconSetter;
|
|
import io.swtc.proccessing.ui.iframe.*; // Your custom frames
|
|
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;
|
|
|
|
public class SwingIFrame {
|
|
private final JFrame mainFrame;
|
|
private final DesktopPane desktopPane;
|
|
private final Map<JInternalFrame, EffectsPanelFrame> 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);
|
|
|
|
setupFullscreenToggle();
|
|
setupBlackBg();
|
|
initPopupMenu();
|
|
|
|
desktopPane.addMouseListener(popupListener());
|
|
}
|
|
|
|
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");
|
|
fullscreenItem.addActionListener(e -> toggleFullscreen());
|
|
|
|
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);
|
|
}
|
|
|
|
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();
|
|
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();
|
|
}
|
|
});
|
|
}
|
|
|
|
private void toggleBackground() {
|
|
desktopPane.setBackground(blackbg ? defDesktopBg : bgcolor);
|
|
blackbg = !blackbg;
|
|
desktopPane.repaint();
|
|
}
|
|
|
|
/** 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);
|
|
}
|
|
}
|