blob: 897266ee9e0befb29ad6e6bd05ca397921d66a2e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License") + you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openmeetings.screen.webstart.gui;
import static org.slf4j.LoggerFactory.getLogger;
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Component;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.SystemColor;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.apache.openmeetings.screen.webstart.CoreScreenShare;
import org.apache.openmeetings.screen.webstart.gui.ScreenDimensions.ScreenQuality;
import org.slf4j.Logger;
public class ScreenSharerFrame extends JFrame {
private static final long serialVersionUID = 6892639796386017437L;
private static final Logger logger = getLogger(ScreenSharerFrame.class);
private JPanel contentPane;
private JPanel panelScreen = new DisabledPanel();
private JPanel panelRecording = new DisabledPanel();
private JPanel panelPublish = new DisabledPanel();
private JLabel lblStatus = new JLabel();
private int vScreenX = 20;
private int vScreenY = 20;
private VerticalSlider upSlider = new VerticalSlider();
private VerticalSlider downSlider = new VerticalSlider();
private HorizontalSlider leftSlider = new HorizontalSlider();
private HorizontalSlider rightSlider = new HorizontalSlider();
private BlankArea virtualScreen = new BlankArea(new Color(255, 255, 255, 100));
private JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
private boolean doUpdateBounds = true;
private boolean showWarning = true;
private JButton btnStartStopSharing;
private JButton btnStartStopRecording;
private JButton btnStartStopPublish;
private NumberSpinner spinnerX;
private NumberSpinner spinnerY;
private NumberSpinner spinnerWidth;
private NumberSpinner spinnerHeight;
private JComboBox comboQuality;
private JTextField textPublishHost;
private JTextField textPublishApp;
private JTextField textPublishId;
private JLabel lblPublishURL;
private boolean sharingStarted = false;
private boolean recordingStarted = false;
private boolean publishStarted = false;
private boolean recordingActionRequested = false;
private boolean publishingActionRequested = false;
private boolean sharingActionRequested = false;
private ImageIcon startIcon;
private ImageIcon stopIcon;
private String startSharingLabel;
private String stopSharingLabel;
private String startRecordingLabel;
private String stopRecordingLabel;
private String startPublishLabel;
private String stopPublishLabel;
private String reduceWidthLabel;
private String reduceHeightLabel;
private String reduceXLabel;
private String reduceYLabel;
private String recordingTipLabel;
private String publishingTipLabel;
private class PublishTextField extends JTextField {
private static final long serialVersionUID = -2104245360975135871L;
PublishTextField() {
getDocument().addDocumentListener(
new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
updatePublishURL();
}
public void removeUpdate(DocumentEvent e) {
updatePublishURL();
}
public void insertUpdate(DocumentEvent e) {
updatePublishURL();
}
});
setColumns(10);
}
}
private class KeyValue<T> {
private String key;
private T value;
public KeyValue(String key, T value) {
this.key = key;
this.value = value;
}
@SuppressWarnings("unused")
public String getKey() { return key; }
public T getValue() { return value; }
@Override
public String toString() { return key; }
@Override
public boolean equals(Object obj) {
if (obj instanceof KeyValue) {
@SuppressWarnings("unchecked")
KeyValue<T> kv = (KeyValue<T>) obj;
return (kv.value.equals(this.value));
}
return false;
}
@Override
public int hashCode() {
int hash = 7;
hash = 97 * hash + (this.value != null ? this.value.hashCode() : 0);
return hash;
}
}
//this implementation will not allow to Enable Panel in runtime
private class DisabledPanel extends JPanel {
private static final long serialVersionUID = -2679640611165728979L;
@Override
public void setEnabled(boolean enabled) {
for (Component c : getComponents()) {
c.setEnabled(enabled);
}
super.setEnabled(enabled);
}
}
private class VerticalSlider extends MouseListenerable {
private static final long serialVersionUID = 6388951979741767971L;
public VerticalSlider() {
ImageIcon iUp = new ImageIcon(ScreenSharerFrame.class.getResource("/org/apache/openmeetings/screen/up.png"));
ImageIcon iDown = new ImageIcon(ScreenSharerFrame.class.getResource("/org/apache/openmeetings/screen/down.png"));
setSize(16, 32);
JLabel jUp = new JLabel(iUp);
jUp.setBounds(0, 0, 16, 16);
add(jUp);
JLabel jDown = new JLabel(iDown);
jDown.setBounds(0, 16, 16, 16);
add(jDown);
}
}
private class HorizontalSlider extends MouseListenerable {
private static final long serialVersionUID = 4630712955901760443L;
public HorizontalSlider() {
ImageIcon iLeft = new ImageIcon(ScreenSharerFrame.class.getResource("/org/apache/openmeetings/screen/previous.png"));
ImageIcon iRight = new ImageIcon(ScreenSharerFrame.class.getResource("/org/apache/openmeetings/screen/next.png"));
setSize(32, 16);
JLabel jLeft = new JLabel(iLeft);
jLeft.setBounds(0, 0, 16, 16);
add(jLeft);
JLabel jRight = new JLabel(iRight);
jRight.setBounds(16, 0, 16, 16);
add(jRight);
}
}
private String getTextLabel(String[] textLabels, int idx) {
return textLabels != null && idx < textLabels.length ? textLabels[idx] : "#STAB#";
}
/**
* Create the frame.
* @throws AWTException
* @throws IOException
*/
public ScreenSharerFrame(final CoreScreenShare core, String[] textLabels) throws AWTException {
setTitle(getTextLabel(textLabels, 0)); //#id 730
setBackground(Color.WHITE);
setResizable(false);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
core.stopStream();
ScreenSharerFrame.this.setVisible(false);
System.exit(0);
}
});
setBounds(30, 30, 500, 505);
contentPane = new JPanel();
contentPane.setBackground(Color.WHITE);
contentPane.setBorder(new EmptyBorder(5, 0, 5, 5));
setContentPane(contentPane);
JLabel lblStartSharing = new JLabel(getTextLabel(textLabels, 1)); //#id 731
startSharingLabel = getTextLabel(textLabels, 2); //#id 732
stopSharingLabel = getTextLabel(textLabels, 3); //#id 733
startRecordingLabel = getTextLabel(textLabels, 15); //#id 871
stopRecordingLabel = getTextLabel(textLabels, 16); //#id 872
startPublishLabel = getTextLabel(textLabels, 24); //#id 1466
stopPublishLabel = getTextLabel(textLabels, 25); //#id 1467
reduceWidthLabel = getTextLabel(textLabels, 29); //#id 1471
reduceHeightLabel = getTextLabel(textLabels, 30); //#id 1472
reduceXLabel = getTextLabel(textLabels, 31); //#id 1473
reduceYLabel = getTextLabel(textLabels, 32); //#id 1474
recordingTipLabel = getTextLabel(textLabels, 35); //#id 1477
publishingTipLabel = getTextLabel(textLabels, 34); //#id 1476
startIcon = new ImageIcon(ScreenSharerFrame.class.getResource("/org/apache/openmeetings/screen/play.png"));
stopIcon = new ImageIcon(ScreenSharerFrame.class.getResource("/org/apache/openmeetings/screen/stop.png"));
btnStartStopSharing = new JButton(startSharingLabel);
btnStartStopSharing.setToolTipText(startSharingLabel);
btnStartStopSharing.setIcon(startIcon);
btnStartStopSharing.setSize(200, 32);
btnStartStopSharing.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (sharingStarted) {
if (!sharingActionRequested) {
sharingActionRequested = true;
core.sendCaptureScreenStop(true, false);
} else {
logger.warn("Sharing action is already requested");
}
} else {
if (!sharingActionRequested) {
sharingActionRequested = true;
core.captureScreenStart(true, false);
} else {
logger.warn("Sharing action is already requested");
}
}
}
});
JLabel lblSelectArea = new JLabel(getTextLabel(textLabels, 4)); //#id 734
JPanel panelStatus = new JPanel();
GroupLayout gl_contentPane = new GroupLayout(contentPane);
gl_contentPane.setHorizontalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(7)
.addComponent(lblStartSharing))
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(21)
.addComponent(btnStartStopSharing, 200, 200, 200)
.addGap(52)
)
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(7)
.addComponent(lblSelectArea, GroupLayout.PREFERRED_SIZE, 470, GroupLayout.PREFERRED_SIZE))
.addGroup(gl_contentPane.createSequentialGroup()
.addContainerGap()
.addComponent(panelScreen, GroupLayout.PREFERRED_SIZE, 472, GroupLayout.PREFERRED_SIZE))
.addGroup(gl_contentPane.createSequentialGroup()
.addContainerGap()
.addComponent(tabbedPane, GroupLayout.PREFERRED_SIZE, 472, GroupLayout.PREFERRED_SIZE))
.addGroup(gl_contentPane.createSequentialGroup()
.addComponent(panelStatus, 494, 494, 494)))
.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
gl_contentPane.setVerticalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(7)
.addComponent(lblStartSharing)
.addGap(4)
.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
.addComponent(btnStartStopSharing, 32, 32, 32)
)
.addGap(4)
.addComponent(lblSelectArea)
.addGap(4)
.addComponent(panelScreen, 210, 210, 210)
.addGap(4)
.addComponent(tabbedPane, 150, 150, 150)
.addGap(5)
.addComponent(panelStatus, 20, 20, 20)
)
);
panelScreen.setLayout(null);
int width = ScreenDimensions.width;
int height = ScreenDimensions.height;
//Sliders
upSlider.addListener(new ScreenYMouseListener(this));
upSlider.setToolTipText(getTextLabel(textLabels, 6)); //#id 737
panelScreen.add(upSlider);
downSlider.addListener(new ScreenHeightMouseListener(this));
downSlider.setToolTipText(getTextLabel(textLabels, 6)); //#id 737
panelScreen.add(downSlider);
leftSlider.addListener(new ScreenXMouseListener(this));
leftSlider.setToolTipText(getTextLabel(textLabels, 5)); //#id 735
panelScreen.add(leftSlider);
rightSlider.addListener(new ScreenWidthMouseListener(this));
rightSlider.setToolTipText(getTextLabel(textLabels, 5)); //#id 735
panelScreen.add(rightSlider);
//Virtual Screen
virtualScreen.addListener(new ScreenMouseListener(this));
virtualScreen.setBounds(vScreenX, vScreenY, width, height);
panelScreen.add(virtualScreen);
ImageIcon imgBgScreen = new ImageIcon(
new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()))
.getScaledInstance(width, height, Image.SCALE_SMOOTH));
JLabel bgScreen = new JLabel(imgBgScreen);
bgScreen.setBounds(vScreenX, vScreenY, width, height);
panelScreen.add(bgScreen);
//Spinner X
JLabel labelX = new JLabel();
labelX.setText(getTextLabel(textLabels, 7)); //#id 738
labelX.setBounds(250, 20, 150, 24);
panelScreen.add(labelX);
spinnerX = new NumberSpinner(ScreenDimensions.spinnerX, 0, ScreenDimensions.widthMax, 1);
spinnerX.setBounds(400, 20, 60, 24);
spinnerX.addChangeListener( new ChangeListener(){
public void stateChanged(ChangeEvent arg0) {
calcNewValueXSpin();
}
});
panelScreen.add(spinnerX);
//Spinner Y
JLabel labelY = new JLabel();
labelY.setText(getTextLabel(textLabels, 8)); //#id 739
labelY.setBounds(250, 50, 150, 24);
panelScreen.add(labelY);
spinnerY = new NumberSpinner(ScreenDimensions.spinnerY, 0, ScreenDimensions.heightMax, 1);
spinnerY.setBounds(400, 50, 60, 24);
spinnerY.addChangeListener( new ChangeListener(){
public void stateChanged(ChangeEvent arg0) {
calcNewValueYSpin();
}
});
panelScreen.add(spinnerY);
JLabel vscreenWidthLabel = new JLabel();
vscreenWidthLabel.setText(getTextLabel(textLabels, 9)); //#id 740
vscreenWidthLabel.setBounds(250, 80, 150, 24);
panelScreen.add(vscreenWidthLabel);
spinnerWidth = new NumberSpinner(ScreenDimensions.spinnerWidth, 0, ScreenDimensions.widthMax, 1);
spinnerWidth.setBounds(400, 80, 60, 24);
spinnerWidth.addChangeListener( new ChangeListener(){
public void stateChanged(ChangeEvent arg0) {
calcNewValueWidthSpin();
}
});
panelScreen.add(spinnerWidth);
//Spinner Height
JLabel labelHeight = new JLabel();
labelHeight.setText(getTextLabel(textLabels, 10)); //#id 741
labelHeight.setBounds(250, 110, 150, 24);
panelScreen.add(labelHeight);
spinnerHeight = new NumberSpinner(ScreenDimensions.spinnerHeight, 0, ScreenDimensions.heightMax, 1);
spinnerHeight.setBounds(400, 110, 60, 24);
spinnerHeight.addChangeListener( new ChangeListener(){
public void stateChanged(ChangeEvent arg0) {
calcNewValueHeightSpin();
}
});
panelScreen.add(spinnerHeight);
//Quality
JLabel labelQuality = new JLabel();
labelQuality.setText(getTextLabel(textLabels, 18)); //#id 1089
labelQuality.setBounds(250, 140, 200, 24);
panelScreen.add(labelQuality);
comboQuality = new JComboBox();
comboQuality.addItem(new KeyValue<ScreenQuality>(getTextLabel(textLabels, 19), ScreenQuality.VeryHigh)); //#id 1090
comboQuality.addItem(new KeyValue<ScreenQuality>(getTextLabel(textLabels, 20), ScreenQuality.High)); //#id 1091
comboQuality.addItem(new KeyValue<ScreenQuality>(getTextLabel(textLabels, 21), ScreenQuality.Medium)); //#id 1092
comboQuality.addItem(new KeyValue<ScreenQuality>(getTextLabel(textLabels, 22), ScreenQuality.Low)); //#id 1093
comboQuality.setBounds(250, 170, 200, 24);
comboQuality.addActionListener(new ActionListener() {
@SuppressWarnings("unchecked")
public void actionPerformed(ActionEvent e) {
ScreenDimensions.quality = ((KeyValue<ScreenQuality>)comboQuality.getSelectedItem()).getValue();
calcRescaleFactors();
}
});
comboQuality.setSelectedIndex(core.defaultQuality);
panelScreen.add(comboQuality);
panelRecording.setBackground(Color.WHITE);
tabbedPane.addTab(getTextLabel(textLabels, 13), null, panelRecording, null); //#id 869
tabbedPane.setEnabledAt(0, true);
panelRecording.setLayout(null);
panelRecording.setEnabled(false);
JLabel lblRecordingDesc = new JLabel("<html>" + getTextLabel(textLabels, 14) + "</html>"); //#id 870
lblRecordingDesc.setVerticalAlignment(SwingConstants.TOP);
lblRecordingDesc.setBounds(10, 10, 447, 60);
panelRecording.add(lblRecordingDesc);
btnStartStopRecording = new JButton(getTextLabel(textLabels, 15)); //#id 871
btnStartStopRecording.setToolTipText(getTextLabel(textLabels, 15)); //#id 871
btnStartStopRecording.setIcon(startIcon);
btnStartStopRecording.setBounds(10, 82, 200, 32);
btnStartStopRecording.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (recordingStarted) {
if (!recordingActionRequested) {
recordingActionRequested = true;
core.sendCaptureScreenStop(false, true);
} else {
logger.warn("Recording action is already requested");
}
} else {
if (!recordingActionRequested) {
recordingActionRequested = true;
core.captureScreenStart(false, true);
} else {
logger.warn("Recording action is already requested");
}
}
}
});
panelRecording.add(btnStartStopRecording);
panelPublish.setBackground(Color.WHITE);
tabbedPane.addTab(getTextLabel(textLabels, 23), null, panelPublish, null); //#id 1465
tabbedPane.setEnabledAt(1, true);
panelPublish.setEnabled(false);
panelPublish.setLayout(null);
JLabel lblPublishDesc = new JLabel(getTextLabel(textLabels, 33)); //#id 1475
lblPublishDesc.setVerticalAlignment(SwingConstants.TOP);
lblPublishDesc.setBounds(10, 5, 450, 20);
panelPublish.add(lblPublishDesc);
JLabel lblPublishHost = new JLabel(getTextLabel(textLabels, 26)); //#id 1468
lblPublishHost.setVerticalAlignment(SwingConstants.TOP);
lblPublishHost.setBounds(10, 27, 140, 20);
panelPublish.add(lblPublishHost);
JLabel lblPublishApp = new JLabel(getTextLabel(textLabels, 27)); //#id 1469
lblPublishApp.setVerticalAlignment(SwingConstants.TOP);
lblPublishApp.setBounds(160, 27, 140, 20);
panelPublish.add(lblPublishApp);
JLabel lblPublishId = new JLabel(getTextLabel(textLabels, 28)); //#id 1470
lblPublishId.setVerticalAlignment(SwingConstants.TOP);
lblPublishId.setBounds(310, 27, 140, 20);
panelPublish.add(lblPublishId);
textPublishHost = new PublishTextField();
textPublishHost.setBounds(10, 45, 140, 20);
panelPublish.add(textPublishHost);
textPublishApp = new PublishTextField();
textPublishApp.setBounds(160, 45, 140, 20);
panelPublish.add(textPublishApp);
textPublishId = new PublishTextField();
textPublishId.setBounds(310, 45, 140, 20);
panelPublish.add(textPublishId);
lblPublishURL = new JLabel("");
lblPublishURL.setBounds(10, 69, 447, 14);
panelPublish.add(lblPublishURL);
btnStartStopPublish = new JButton(getTextLabel(textLabels, 24)); //#id 1466
btnStartStopPublish.setToolTipText(getTextLabel(textLabels, 24)); //#id 1466
btnStartStopPublish.setIcon(startIcon);
btnStartStopPublish.setBounds(10, 86, 200, 32);
btnStartStopPublish.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (publishStarted) {
if (!publishingActionRequested) {
publishingActionRequested = true;
core.sendStopPublishing();
} else {
logger.warn("Publishing action is already requested");
}
} else {
if (!publishingActionRequested) {
publishingActionRequested = true;
core.captureScreenStart(false, false, true);
} else {
logger.warn("Publishing action is already requested");
}
}
}
});
panelPublish.add(btnStartStopPublish);
panelScreen.setBackground(Color.WHITE);
panelStatus.setBackground(SystemColor.control);
panelStatus.setLayout(null);
lblStatus.setHorizontalAlignment(SwingConstants.LEFT);
lblStatus.setBounds(0, 0, 494, 20);
lblStatus.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(Color.LIGHT_GRAY),
BorderFactory.createEmptyBorder(0, 5, 0, 0)));
panelStatus.add(lblStatus);
contentPane.setLayout(gl_contentPane);
// Background Image
//We have no logo, that is why we need no background, sebawagner 29.04.2012
}
public void setSharingStatus(boolean status, boolean unlockScreen) {
panelScreen.setEnabled(unlockScreen);
if (status != sharingStarted) {
sharingActionRequested = false;
}
sharingStarted = status;
btnStartStopSharing.setIcon(status ? stopIcon : startIcon);
btnStartStopSharing.setText(status ? stopSharingLabel : startSharingLabel);
btnStartStopSharing.setToolTipText(status ? stopSharingLabel : startSharingLabel);
}
public void setRecordingStatus(boolean status, boolean unlockScreen) {
panelScreen.setEnabled(unlockScreen);
if (status != recordingStarted) {
recordingActionRequested = false;
}
logger.debug("recordingActionRequested=" + recordingActionRequested);
recordingStarted = status;
btnStartStopRecording.setIcon(status ? stopIcon : startIcon);
btnStartStopRecording.setText(status ? stopRecordingLabel : startRecordingLabel);
btnStartStopRecording.setToolTipText(status ? stopRecordingLabel : startRecordingLabel);
}
public void setPublishingStatus(boolean status, boolean unlockScreen) {
panelScreen.setEnabled(unlockScreen);
if (status != publishStarted) {
publishingActionRequested = false;
}
publishStarted = status;
btnStartStopPublish.setIcon(status ? stopIcon : startIcon);
btnStartStopPublish.setText(status ? stopPublishLabel : startPublishLabel);
btnStartStopPublish.setToolTipText(status ? stopPublishLabel : startPublishLabel);
}
public void setRecordingTabEnabled(boolean enabled) {
panelRecording.setEnabled(enabled);
tabbedPane.setEnabledAt(0, enabled);
tabbedPane.setToolTipTextAt(0, enabled ? null : recordingTipLabel);
}
public void setPublishingTabEnabled(boolean enabled) {
panelPublish.setEnabled(enabled);
tabbedPane.setEnabledAt(1, enabled);
tabbedPane.setToolTipTextAt(1, enabled ? null : publishingTipLabel);
}
public String getPublishHost() {
return textPublishHost.getText();
}
public String getPublishApp() {
return textPublishApp.getText();
}
public String getPublishId() {
return textPublishId.getText();
}
private void updatePublishURL() {
lblPublishURL.setText("rtmp://" + textPublishHost.getText() + ":1935/"
+ textPublishApp.getText() + "/" + textPublishId.getText());
}
public void setShowWarning(boolean showWarning) {
this.showWarning = showWarning;
}
public void setDoUpdateBounds(boolean doUpdateBounds) {
this.doUpdateBounds = doUpdateBounds;
}
public void setStatus(String status) {
lblStatus.setText(status);
}
public void setSpinnerX(int val) {
spinnerX.setValue(val);
}
public void setSpinnerY(int val) {
spinnerY.setValue(val);
}
public void setSpinnerWidth(int val) {
spinnerWidth.setValue(val);
}
public void setSpinnerHeight(int val) {
spinnerHeight.setValue(val);
}
void calcNewValueXSpin() {
if (doUpdateBounds) {
int newX = spinnerX.getValue();
if (ScreenDimensions.spinnerWidth + newX > ScreenDimensions.widthMax) {
newX = ScreenDimensions.widthMax - ScreenDimensions.spinnerWidth;
spinnerX.setValue(newX);
if (showWarning) {
setStatus(reduceWidthLabel);
}
} else {
ScreenDimensions.spinnerX = newX;
updateVScreenBounds();
}
} else {
ScreenDimensions.spinnerX = spinnerX.getValue();
}
calcRescaleFactors();
}
void calcNewValueYSpin() {
if (doUpdateBounds) {
int newY = spinnerY.getValue();
if (ScreenDimensions.spinnerHeight + newY > ScreenDimensions.heightMax) {
newY = ScreenDimensions.heightMax - ScreenDimensions.spinnerHeight;
spinnerY.setValue(newY);
if (showWarning) {
setStatus(reduceHeightLabel);
}
} else {
ScreenDimensions.spinnerY = newY;
updateVScreenBounds();
}
} else {
ScreenDimensions.spinnerY = spinnerY.getValue();
}
calcRescaleFactors();
}
void calcNewValueWidthSpin() {
if (doUpdateBounds) {
int newWidth = spinnerWidth.getValue();
if (ScreenDimensions.spinnerX + newWidth > ScreenDimensions.widthMax) {
newWidth = ScreenDimensions.widthMax - ScreenDimensions.spinnerX;
spinnerWidth.setValue(newWidth);
if (showWarning) {
setStatus(reduceXLabel);
}
} else {
ScreenDimensions.spinnerWidth = newWidth;
updateVScreenBounds();
}
} else {
ScreenDimensions.spinnerWidth = spinnerWidth.getValue();
}
calcRescaleFactors();
}
void calcNewValueHeightSpin() {
if (doUpdateBounds) {
int newHeight = spinnerHeight.getValue();
if (ScreenDimensions.spinnerY + newHeight > ScreenDimensions.heightMax) {
newHeight = ScreenDimensions.heightMax - ScreenDimensions.spinnerY;
spinnerHeight.setValue(newHeight);
if (showWarning) {
setStatus(reduceYLabel);
}
} else {
ScreenDimensions.spinnerHeight = newHeight;
updateVScreenBounds();
}
} else {
ScreenDimensions.spinnerHeight = spinnerHeight.getValue();
}
calcRescaleFactors();
}
/**
* Needs to be always invoked after every re-scaling
*/
void calcRescaleFactors() {
logger.trace("calcRescaleFactors -- ");
ScreenDimensions.resizeX = spinnerWidth.getValue();
ScreenDimensions.resizeY = spinnerHeight.getValue();
switch (ScreenDimensions.quality) {
case Medium:
ScreenDimensions.resizeX = (int)(1.0 * ScreenDimensions.resizeX / 2);
ScreenDimensions.resizeY = (int)(1.0 * ScreenDimensions.resizeY / 2);
break;
case Low:
ScreenDimensions.resizeX = (int)(3.0 * ScreenDimensions.resizeX / 8);
ScreenDimensions.resizeY = (int)(3.0 * ScreenDimensions.resizeY / 8);
break;
case VeryHigh:
case High:
default:
break;
}
logger.trace("resize: X:" + ScreenDimensions.resizeX + " Y: " + ScreenDimensions.resizeY);
updateVScreenBounds();
}
private void setVScreenBounds(int x, int y, int width, int height) {
leftSlider.setBounds(x + vScreenX - 16, y + vScreenY - 8 + (height / 2), 32, 16);
rightSlider.setBounds(x + vScreenX + width - 16, y + vScreenY - 8 + (height / 2), 32, 16);
upSlider.setBounds(x + vScreenX + (width / 2) - 8, y + vScreenY - 16, 16, 32);
downSlider.setBounds(x + vScreenX + (width / 2) - 8, y + vScreenY - 16 + height, 16, 32);
virtualScreen.setText(ScreenDimensions.spinnerWidth + ":" + ScreenDimensions.spinnerHeight);
virtualScreen.setBounds(x + vScreenX, y + vScreenY, width, height);
}
/**
* update the bounds of the vScreen
* by using the vars from the Spinners
*
*/
void updateVScreenBounds() {
double ratio = ((double)ScreenDimensions.width) / ScreenDimensions.widthMax;
int newWidth = (int)(ScreenDimensions.spinnerWidth * ratio);
int newX = (int)(ScreenDimensions.spinnerX * ratio);
int newHeight = (int)(ScreenDimensions.spinnerHeight * ratio);
int newY = (int)(ScreenDimensions.spinnerY * ratio);
setVScreenBounds(newX, newY, newWidth, newHeight);
}
}