package hueimmersive;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JCheckBox;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.factories.FormFactory;
import com.jgoodies.forms.layout.RowSpec;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JPanel;
import java.awt.GraphicsEnvironment;
import java.awt.GridLayout;
import java.awt.FlowLayout;
import javax.swing.JScrollPane;
import javax.swing.JList;
import javax.swing.AbstractListModel;
import javax.swing.JSlider;
import javax.swing.ListSelectionModel;
import java.awt.Dimension;
import java.util.ArrayList;
import javax.swing.JSeparator;
import javax.swing.ScrollPaneConstants;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseEvent;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.Font;
public class OptionInterface
{
private JFrame frame;
private JCheckBox checkbox_AutoTurnOff;
private JCheckBox checkbox_UseGammaCorrection;
private JPanel panel_Lights;
private JComboBox checkbox_Screen;
private JCheckBox checkbox_ForceOn;
private JCheckBox checkbox_ForceStart;
private JCheckBox checkbox_ForceOff;
private JCheckBox checkbox_Log;
public OptionInterface()
{
Main.ui.setEnabled(false);
initialize();
getOptions();
}
private void initialize()
{
frame = new JFrame();
frame.setMinimumSize(new Dimension(460, 500));
frame.setResizable(false);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent arg0)
{
Settings.set("oi_x", frame.getX());
Settings.set("oi_y", frame.getY());
Main.ui.setEnabled(true);
}
});
frame.setTitle("options");
frame.setBounds(100, 100, 460, 500);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLocation(Settings.getInteger("oi_x"), Settings.getInteger("oi_y"));
frame.getContentPane().setLayout(new FormLayout(new ColumnSpec[] {
FormFactory.RELATED_GAP_COLSPEC,
ColumnSpec.decode("left:20dlu:grow"),
ColumnSpec.decode("left:20dlu:grow"),
ColumnSpec.decode("left:20dlu:grow"),
FormFactory.RELATED_GAP_COLSPEC,},
new RowSpec[] {
FormFactory.RELATED_GAP_ROWSPEC,
RowSpec.decode("16dlu"),
FormFactory.LINE_GAP_ROWSPEC,
RowSpec.decode("16dlu"),
RowSpec.decode("10dlu"),
RowSpec.decode("16dlu"),
RowSpec.decode("10dlu"),
RowSpec.decode("162dlu"),
RowSpec.decode("10dlu"),
RowSpec.decode("16dlu"),
FormFactory.LINE_GAP_ROWSPEC,
RowSpec.decode("16dlu"),
RowSpec.decode("10dlu"),
RowSpec.decode("bottom:16dlu"),
FormFactory.RELATED_GAP_ROWSPEC,}));
JLabel label_LightOptions = new JLabel("light options:");
label_LightOptions.setEnabled(false);
label_LightOptions.setFont(new Font("Tahoma", Font.PLAIN, 14));
frame.getContentPane().add(label_LightOptions, "2, 2, 1, 3, center, default");
checkbox_AutoTurnOff = new JCheckBox(" auto. turn off lights (experimental v2)");
checkbox_AutoTurnOff.setToolTipText("turns the lights automatically off when the screen is near black");
frame.getContentPane().add(checkbox_AutoTurnOff, "3, 2, 2, 1, left, center");
checkbox_UseGammaCorrection = new JCheckBox(" use gamma correction");
checkbox_UseGammaCorrection.setToolTipText("makes the color more like the color on your screen");
frame.getContentPane().add(checkbox_UseGammaCorrection, "3, 4, 2, 1, left, center");
JSeparator separator_1 = new JSeparator();
frame.getContentPane().add(separator_1, "2, 5, 3, 1, fill, center");
JButton button_Ok = new JButton("ok");
button_Ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
saveOptions();
frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
frame.dispose();
}
});
JLabel label_ScreenOptions = new JLabel("capture options:");
label_ScreenOptions.setFont(new Font("Tahoma", Font.PLAIN, 14));
label_ScreenOptions.setEnabled(false);
frame.getContentPane().add(label_ScreenOptions, "2, 6, center, default");
JLabel label_CaptureScreen = new JLabel(" capture screen");
label_CaptureScreen.setToolTipText("select the screen to capture");
frame.getContentPane().add(label_CaptureScreen, "4, 6, left, center");
JSeparator separator_3 = new JSeparator();
frame.getContentPane().add(separator_3, "2, 9, 3, 1, fill, center");
JLabel label_StartupOptions = new JLabel("startup options:");
label_StartupOptions.setEnabled(false);
label_StartupOptions.setFont(new Font("Tahoma", Font.PLAIN, 14));
frame.getContentPane().add(label_StartupOptions, "2, 10, 1, 3, center, center");
checkbox_ForceOn = new JCheckBox(" force on");
checkbox_ForceOn.setToolTipText("turn lights on at startup");
frame.getContentPane().add(checkbox_ForceOn, "3, 10, left, center");
checkbox_ForceStart = new JCheckBox(" force start");
checkbox_ForceStart.setToolTipText("start the immersive lighting at startup");
frame.getContentPane().add(checkbox_ForceStart, "4, 10, left, center");
checkbox_ForceOff = new JCheckBox(" force off");
checkbox_ForceOff.setToolTipText("turn lights off at startup");
frame.getContentPane().add(checkbox_ForceOff, "3, 12, left, center");
checkbox_Log = new JCheckBox(" log");
checkbox_Log.setToolTipText("create a log");
frame.getContentPane().add(checkbox_Log, "4, 12, left, center");
JSeparator separator = new JSeparator();
frame.getContentPane().add(separator, "2, 13, 3, 1, fill, center");
frame.getContentPane().add(button_Ok, "2, 14, fill, fill");
ArrayList<String> screens = new ArrayList<String>();
for (int i = 0; i < GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices().length; i++)
{
screens.add("Display " + (i + 1));
}
checkbox_Screen = new JComboBox();
checkbox_Screen.setToolTipText("select the screen to capture");
checkbox_Screen.setModel(new DefaultComboBoxModel(screens.toArray()));
((JLabel)checkbox_Screen.getRenderer()).setHorizontalAlignment(JLabel.CENTER);
if (screens.size() <= 1)
{
checkbox_Screen.setEnabled(false);
}
frame.getContentPane().add(checkbox_Screen, "3, 6, fill, center");
JButton button_Cancel = new JButton("cancel");
button_Cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
frame.dispose();
}
});
frame.getContentPane().add(button_Cancel, "3, 14, fill, fill");
JButton button_Apply = new JButton("apply");
button_Apply.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0)
{
saveOptions();
}
});
frame.getContentPane().add(button_Apply, "4, 14, fill, fill");
JSeparator separator_2 = new JSeparator();
frame.getContentPane().add(separator_2, "2, 7, 3, 1, fill, center");
JScrollPane scrollpane = new JScrollPane();
scrollpane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
frame.getContentPane().add(scrollpane, "2, 8, 3, 1, fill, fill");
// setup list with options for all lights
panel_Lights = new JPanel();
scrollpane.setViewportView(panel_Lights);
int rows = HBridge.countLights();
if (rows < 6)
{
rows = 6;
}
panel_Lights.setLayout(new GridLayout(rows, 1, 5, 7));
JLabel lblActiveNameColor = new JLabel(" active name color algorithm brightness\r\n");
scrollpane.setColumnHeaderView(lblActiveNameColor);
// create the list
for (final HLight light : HBridge.lights)
{
final JPanel panel_options = new JPanel();
panel_Lights.add(panel_options, HBridge.lights.indexOf(light));
JLabel label_Name = new JLabel(light.name);
label_Name.setPreferredSize(new Dimension(110, 15));
final JList list_Algorithms = new JList();
list_Algorithms.setLayoutOrientation(JList.HORIZONTAL_WRAP);
list_Algorithms.setVisibleRowCount(1);
list_Algorithms.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list_Algorithms.setModel(new AbstractListModel()
{
String[] values = new String[] {" A ", " B ", " C ", " D "};
public int getSize() {
return values.length;
}
public Object getElementAt(int index) {
return values[index];
}
});
list_Algorithms.setSelectedIndex(Settings.Light.getAlgorithm(light));
list_Algorithms.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent arg0)
{
int algorithm = list_Algorithms.locationToIndex(arg0.getPoint());
if (algorithm == 0)
{
list_Algorithms.setToolTipText("average color");
}
else if (algorithm == 1)
{
list_Algorithms.setToolTipText("saturated color");
}
else if (algorithm == 2)
{
list_Algorithms.setToolTipText("bright color");
}
else if (algorithm == 3)
{
list_Algorithms.setToolTipText("dark color");
}
}
});
JPanel panel_Brightness = new JPanel();
panel_Brightness.setLayout(new FormLayout(new ColumnSpec[] {
ColumnSpec.decode("fill:93px"),
ColumnSpec.decode("right:29px:grow"),},
new RowSpec[] {
RowSpec.decode("24px"),}));
final JSlider slider_Brightness = new JSlider();
slider_Brightness.setSnapToTicks(true);
slider_Brightness.setMinorTickSpacing(5);
slider_Brightness.setMinimum(10);
slider_Brightness.setMaximum(100);
slider_Brightness.setValue(Settings.Light.getBrightness(light));
panel_Brightness.add(slider_Brightness, "1, 1, center, center");
final JLabel label_Brightness = new JLabel("100%");
label_Brightness.setText(slider_Brightness.getValue() + "%");
label_Brightness.setFont(new Font("Tahoma", Font.PLAIN, 10));
panel_Brightness.add(label_Brightness, "2, 1, right, center");
slider_Brightness.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent arg0)
{
label_Brightness.setText(slider_Brightness.getValue() + "%");
}
});
final JCheckBox checkbox_Active = new JCheckBox();
checkbox_Active.setSelected(Settings.Light.getActive(light));
checkbox_Active.setToolTipText("allow the program to change this lights color and brightness");
if (checkbox_Active.isSelected() == false)
{
label_Name.setEnabled(false);
list_Algorithms.setEnabled(false);
slider_Brightness.setEnabled(false);
label_Brightness.setEnabled(false);
}
checkbox_Active.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0)
{
try
{
if (checkbox_Active.isSelected())
{
panel_options.getComponent(1).setEnabled(true);
panel_options.getComponent(2).setEnabled(true);
JPanel panel = (JPanel) panel_options.getComponent(3);
panel.getComponent(0).setEnabled(true);
panel.getComponent(1).setEnabled(true);
}
else
{
panel_options.getComponent(1).setEnabled(false);
panel_options.getComponent(2).setEnabled(false);
panel_options.getComponent(3).setEnabled(false);
JPanel panel = (JPanel) panel_options.getComponent(3);
panel.getComponent(0).setEnabled(false);
panel.getComponent(1).setEnabled(false);
}
} catch (Exception e)
{
Debug.exception(e);
}
}
});
FlowLayout flowlayout_options = new FlowLayout(FlowLayout.LEFT, 12, 4);
panel_options.setLayout(flowlayout_options);
panel_options.add(checkbox_Active,0);
panel_options.add(label_Name,1);
panel_options.add(list_Algorithms,2);
panel_options.add(panel_Brightness,3);
}
frame.pack();
frame.setVisible(true);
}
private void getOptions() // get saved options and setup window elements
{
checkbox_AutoTurnOff.setSelected(Settings.getBoolean("autoswitch"));
checkbox_UseGammaCorrection.setSelected(Settings.getBoolean("gammacorrection"));
checkbox_Screen.setSelectedIndex(Settings.getInteger("screen"));
for (String arg : Settings.getArguments())
{
switch (arg)
{
case "force-on":
checkbox_ForceOn.setSelected(true);
break;
case "force-off":
checkbox_ForceOff.setSelected(true);
break;
case "force-start":
checkbox_ForceStart.setSelected(true);
break;
case "log":
checkbox_Log.setSelected(true);
break;
}
}
}
private void saveOptions() // save all settings
{
Settings.set("autoswitch", checkbox_AutoTurnOff.isSelected());
Settings.set("gammacorrection", checkbox_UseGammaCorrection.isSelected());
Settings.set("screen", checkbox_Screen.getSelectedIndex());
for (HLight light : HBridge.lights)
{
JPanel panel_Light = (JPanel) panel_Lights.getComponent(HBridge.lights.indexOf(light));
JCheckBox checkbox_Active = (JCheckBox) panel_Light.getComponent(0);
Settings.Light.setActive(light, checkbox_Active.isSelected());
JList list_Algorithms = (JList) panel_Light.getComponent(2);
Settings.Light.setAlgorithm(light, list_Algorithms.getSelectedIndex());
JPanel panel_Brightness = (JPanel) panel_Light.getComponent(3);
JSlider slider_Brightness = (JSlider) panel_Brightness.getComponent(0);
Settings.Light.setBrightness(light, slider_Brightness.getValue());
}
ArrayList<String> args = new ArrayList<String>();
if(checkbox_ForceOn.isSelected())
{
args.add("force-on");
}
if(checkbox_ForceOff.isSelected())
{
args.add("force-off");
}
if(checkbox_ForceStart.isSelected())
{
args.add("force-start");
}
if(checkbox_Log.isSelected())
{
args.add("log");
}
Settings.setArguments(args);
try
{
Main.ui.setupOnOffButton();
}
catch (Exception e)
{
Debug.exception(e);
}
}
}