package com.github.xsavikx.androidscreencast.ui;
import com.github.xsavikx.androidscreencast.api.command.KeyCommand;
import com.github.xsavikx.androidscreencast.api.command.executor.CommandExecutor;
import com.github.xsavikx.androidscreencast.api.command.factory.InputCommandFactory;
import com.github.xsavikx.androidscreencast.api.injector.InputKeyEvent;
import com.github.xsavikx.androidscreencast.ui.model.InputKeyEventTable;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
@Singleton
public class JDialogExecuteKeyEvent extends JDialog {
private static final long serialVersionUID = -4152020879675916776L;
private static final int HEIGHT = 600;
private static final int WIDTH = 800;
private static final int BUTTON_HEIGHT = 20;
private static final int BUTTON_WIDTH = WIDTH >> 1 - 5;
private static final int TITLE_COLUMN_INDEX = 1;
private static final String TITLE = "Execute key event";
private static final String EXECUTE_BUTTON_TEXT = "Execute";
private static final String USE_LONG_PRESS_BUTTON_TEXT = "Long press";
private static final String CANCEL_BUTTON_TEXT = "Cancel";
private static final String COMMAND_LIST_TITLE_TEXT = "Commands to execute";
private static final String NO_COMMAND_CHOSEN_WARNING_MESSAGE = "Please, select command from the list";
private static final String NO_COMMAND_CHOSEN_WARNING_DIALOG_TITLE = "Warning";
private final CommandExecutor commandExecutor;
private final InputKeyEventTable commandListTable;
private final InputCommandFactory inputCommandFactory;
@Inject
public JDialogExecuteKeyEvent(CommandExecutor commandExecutor, InputKeyEventTable commandListTable, InputCommandFactory inputCommandFactory) {
this.commandExecutor = commandExecutor;
this.commandListTable = commandListTable;
this.inputCommandFactory = inputCommandFactory;
init();
}
public void open() {
setVisible(true);
}
private void init() {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setResizable(false);
setTitle(TITLE);
setAlwaysOnTop(true);
final JCheckBoxMenuItem useLongPress = new JCheckBoxMenuItem(USE_LONG_PRESS_BUTTON_TEXT, false);
JButton executeCommandButton = new JButton(EXECUTE_BUTTON_TEXT);
executeCommandButton.setSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT));
executeCommandButton.addActionListener(actionEvent -> {
int rowIndex = commandListTable.getSelectedRow();
if (rowIndex > 0) {
final String title = (String) commandListTable.getModel().getValueAt(rowIndex, TITLE_COLUMN_INDEX);
SwingUtilities.invokeLater(() -> {
final InputKeyEvent inputKeyEvent = InputKeyEvent.valueOf(title);
final boolean longPress = useLongPress.getState();
final KeyCommand keyCommand = inputCommandFactory.getKeyCommand(inputKeyEvent, longPress);
commandExecutor.execute(keyCommand);
});
closeDialog();
} else {
JOptionPane.showMessageDialog(null, NO_COMMAND_CHOSEN_WARNING_MESSAGE, NO_COMMAND_CHOSEN_WARNING_DIALOG_TITLE,
JOptionPane.WARNING_MESSAGE);
}
});
JButton cancelButton = new JButton(CANCEL_BUTTON_TEXT);
cancelButton.addActionListener(actionEvent -> closeDialog());
JScrollPane listScrollPane = new JScrollPane(commandListTable, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
listScrollPane.setPreferredSize(new Dimension(WIDTH, HEIGHT));
listScrollPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
COMMAND_LIST_TITLE_TEXT, TitledBorder.CENTER, TitledBorder.TOP));
JPanel buttonPane = new JPanel();
buttonPane.add(executeCommandButton);
buttonPane.add(useLongPress);
buttonPane.add(cancelButton);
buttonPane.setLayout(new GridLayout(1, 2));
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, listScrollPane, buttonPane);
splitPane.setEnabled(false);
getContentPane().add(splitPane);
pack();
setLocationRelativeTo(null);
}
private void closeDialog() {
setVisible(false);
}
}