package gui.dialog;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Vector;
import gui.ShortcutB;
import gui.TabPanel;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import ctex.Main;
public class PreferencesDialog extends javax.swing.JDialog implements ListSelectionListener {
private static final long serialVersionUID = 1L;
private PreferencesDialog myDialog = null;
private ShortcutB shortcuts = null;
private JComboBox langbox = null;
/*
* Panel mit AuswahlListe von Optionen
*/
private Vector<String> List = new Vector<String> ();
private JList myList = new JList(List);
/* Componente fuer jeden List Eintrag */
private JComponent generalComponent = null;
private JComponent shortcutComponent = null;
private JComponent viewComponent = null;
private JTextField workspaceLink = new JTextField();
// For adjusting the view on the table
private int columntype = Integer.parseInt(Main.getIniData("columntype"));
private int filecolumn = Integer.parseInt(Main.getIniData("filecolumn"));
private TabPanel tableTabPanel;
private Vector<String> culumtypes = new Vector<String>();
private JComboBox typeComboBox = new JComboBox();
private DefaultListModel typeListModel = new DefaultListModel();
private JList myTableTypeList = new JList(typeListModel);
private JButton removeType = new JButton(new ImageIcon(getClass().getClassLoader().getResource("images/delete.png")));
public PreferencesDialog(final ShortcutB shortcuts, TabPanel tableTabPanel){
this.myDialog = this;
this.shortcuts = shortcuts;
this.tableTabPanel = tableTabPanel;
setTitle(Main.myLang.getString("preferences.title"));
// Close dialog when pressing ESC
getRootPane().registerKeyboardAction(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
}, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//Add content to the window.
setLayout (new BorderLayout());
getOptList();
generalComponent = getGeneralPanel();
shortcutComponent = getHotKeyPanel();
viewComponent = getViewPanel();
/* add all Components */
add(myList, BorderLayout.WEST);
add(getButtonPanel(), BorderLayout.PAGE_END);
add(generalComponent, BorderLayout.CENTER);
setSize(750, 600);
this.setResizable(false);
setModal(true);
setVisible(true);
}
/*
* TODO:Comment
*/
private void getOptList(){
Border blackline = BorderFactory.createLineBorder(Color.black);
List.add(" " + Main.myLang.getString("preferences.gerneral.preferences") + " ");
List.add(" " + Main.myLang.getString("preferences.tab.hotkey") + " ");
List.add(" " + Main.myLang.getString("preferences.tab.view") + " ");
myList.addListSelectionListener(this);
myList.setBorder(blackline);
}
/*
* TODO:Comment
*/
private void getTableTypeList(){
Border blackline = BorderFactory.createLineBorder(Color.black);
String type = Main.getIniData("defaultcolumns");
while (type.length() != 0){
typeListModel.addElement(type.substring(0, type.indexOf(",")));
type = type.substring(type.indexOf(",") + 1);
}
myTableTypeList.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
removeType.setEnabled(true);
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
});
//myTableTypeList.addListSelectionListener(this);
myTableTypeList.setBorder(blackline);
}
/*
* TODO:Comment
*/
private JComponent getHotKeyPanel (){
TitledBorder title;
title = BorderFactory.createTitledBorder(
BorderFactory.createLineBorder(Color.black), Main.myLang.getString("preferences.tab.hotkey"));
title.setTitleJustification(TitledBorder.CENTER);
JPanel myPanel = new JPanel(new GridLayout(0, 2, 5, 5));
for (int i = 0; i < shortcuts.keys.size(); i++){
myPanel.add(new JLabel(shortcuts.keys.get(i).getText()), null);
JPanel ComboPanel = new JPanel(new GridLayout(0, 2, 5, 5));
ComboPanel.add(shortcuts.keys.get(i).myStrgBox, null);
ComboPanel.add(shortcuts.keys.get(i).myBuchBox, null);
// anhangen an jeder comboBox das message ueber das doppelte belegung von Optionen
shortcuts.keys.get(i).myStrgBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (shortcuts.exeption() == true) {
JOptionPane.showMessageDialog(null,
Main.myLang.getString("dialog.shortcut.message"),
Main.myLang.getString("dialog.shortcut.error"),
JOptionPane.ERROR_MESSAGE);
}
}
});
shortcuts.keys.get(i).myBuchBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (shortcuts.exeption() == true) {
JOptionPane.showMessageDialog(null,
Main.myLang.getString("dialog.shortcut.message"),
Main.myLang.getString("dialog.shortcut.error"),
JOptionPane.ERROR_MESSAGE);
}
}
});
myPanel.add(ComboPanel, null);
}
JScrollPane returnPane = new JScrollPane(myPanel);
returnPane.setBorder(title);
return returnPane;
}
/*
* TODO:Comment
*/
private JComponent getGeneralPanel(){
TitledBorder title;
title = BorderFactory.createTitledBorder(
BorderFactory.createLineBorder(Color.black), Main.myLang.getString("preferences.gerneral.preferences"));
title.setTitleJustification(TitledBorder.CENTER);
JPanel dummy = new JPanel();
Vector<String> theLang = new Vector<String> ();
// Ordnet die Componenete von oben nach unten
JPanel myPanel = new JPanel(new GridLayout(20, 1, 5, 5));
workspaceLink.setEditable(false);
workspaceLink.setText(Main.getIniData("Workspace"));
JLabel langLable = new JLabel(Main.myLang.getString("preferences.gerneral.lang"), JLabel.CENTER);
JLabel wokLable = new JLabel(Main.myLang.getString("preferences.gerneral.workspace"), JLabel.CENTER);
langLable.setPreferredSize(new Dimension(150, 0));
wokLable.setPreferredSize(new Dimension(150, 0));
JButton browse = new JButton(Main.myLang.getString("button.browse"));
browse.addActionListener(new Browselistener(this.myDialog, workspaceLink));
langbox = new JComboBox(theLang);
String soppLang = Main.getIniData("SupportedLanguage");
String akLang = Main.getIniData("Language");
while (soppLang.length() != 0){
theLang.add(soppLang.substring(0, soppLang.indexOf(",")));
soppLang = soppLang.substring(soppLang.indexOf(",") + 1);
}
langbox.setSelectedItem(akLang);
//Lay out the buttons from left to right.
dummy.setLayout(new BoxLayout(dummy, BoxLayout.LINE_AXIS));
dummy.add(langLable);
dummy.add(langbox);
dummy.add(Box.createRigidArea(new Dimension(400, 0)));
myPanel.add(dummy);
dummy = new JPanel();
dummy.setLayout(new BoxLayout(dummy, BoxLayout.LINE_AXIS));
dummy.add(wokLable);
dummy.add(workspaceLink);
dummy.add(Box.createRigidArea(new Dimension(20, 0)));
dummy.add(browse);
dummy.add(Box.createRigidArea(new Dimension(100, 0)));
myPanel.add(dummy);
for (int i = 0; i < 18; i++){
myPanel.add(new JPanel());
}
myPanel.setBorder(title);
return myPanel;
}
// Panel for changing what is shown in the table
private JComponent getViewPanel() {
JPanel viewPanel = new JPanel();
viewPanel.setLayout(new GridBagLayout());
TitledBorder title = BorderFactory.createTitledBorder(
BorderFactory.createLineBorder(Color.black), Main.myLang.getString("preferences.tab.view"));
title.setTitleJustification(TitledBorder.CENTER);
viewPanel.setBorder(title);
loadComboBoxFields();
GridBagConstraints cons = new GridBagConstraints();
cons.gridx = 0;
cons.gridy = 0;
cons.anchor = GridBagConstraints.LINE_START;
cons.insets = new Insets(2, 2, 2, 2);
ButtonGroup buttonGroup = new ButtonGroup();
JRadioButton showDefaultCols = new JRadioButton(Main.myLang.getString("preferences.view.showdefaultcolumns"));
JRadioButton showAllCols = new JRadioButton(Main.myLang.getString("preferences.view.showallcolumns"));
JRadioButton showUsedCols = new JRadioButton(Main.myLang.getString("preferences.view.showonlyusedcolumns"));
final JCheckBox showFileCol = new JCheckBox(Main.myLang.getString("preferences.view.showfilecolumn"));
JButton addType = new JButton(new ImageIcon(getClass().getClassLoader().getResource("images/add.png")));
addType.setPreferredSize(new Dimension(23, 23));
removeType.setPreferredSize(new Dimension(23, 23));
removeType.setEnabled(false);
buttonGroup.add(showDefaultCols);
buttonGroup.add(showAllCols);
buttonGroup.add(showUsedCols);
viewPanel.add(showDefaultCols, cons);
final JLabel columnInfo = new JLabel(Main.myLang.getString("preferences.view.columninfolabel"));
cons.gridy = 1;
viewPanel.add(columnInfo, cons);
cons.gridy = 2;
viewPanel.add(showFileCol, cons);
getTableTypeList();
JScrollPane columnInputScroll = new JScrollPane(myTableTypeList);
columnInputScroll.setPreferredSize(new Dimension(300, 350));
cons.gridy = 3;
viewPanel.add(columnInputScroll, cons);
// Type Box
cons.gridx = 1;
cons.anchor = GridBagConstraints.PAGE_START;
viewPanel.add(typeComboBox, cons);
// Add Button
cons.gridx = 2;
viewPanel.add(addType, cons);
// remove Button
cons.gridx = 3;
viewPanel.add(removeType, cons);
cons.anchor = GridBagConstraints.LINE_START;
cons.gridx = 0;
cons.gridy = 4;
viewPanel.add(showAllCols, cons);
cons.gridy = 5;
viewPanel.add(showUsedCols, cons);
columnInfo.setEnabled(false);
myTableTypeList.setEnabled(false);
switch (columntype) {
case 1: showDefaultCols.setSelected(true);
columnInfo.setEnabled(true);
showFileCol.setEnabled(true);
myTableTypeList.setEnabled(true);
break;
case 2: showAllCols.setSelected(true);
break;
case 3: showUsedCols.setSelected(true);
break;
}
if (filecolumn == 1){
showFileCol.setSelected(true);
} else {
showFileCol.setSelected(false);
}
showFileCol.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (filecolumn == 0){
filecolumn = 1;
} else {
filecolumn = 0;
}
}
});
addType.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(!listIncludeType(typeComboBox.getSelectedItem().toString())){
typeListModel.addElement(typeComboBox.getSelectedItem().toString());
}
}
});
removeType.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
typeListModel.remove(myTableTypeList.getSelectedIndex());
removeType.setEnabled(false);
}
});
showDefaultCols.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
columntype = 1;
columnInfo.setEnabled(true);
showFileCol.setEnabled(true);
myTableTypeList.setEnabled(true);
}
});
showAllCols.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
columntype = 2;
columnInfo.setEnabled(false);
showFileCol.setEnabled(false);
myTableTypeList.setEnabled(false);
}
});
showUsedCols.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
columntype = 3;
columnInfo.setEnabled(false);
showFileCol.setEnabled(false);
myTableTypeList.setEnabled(false);
}
});
return viewPanel;
}
private JComponent getButtonPanel(){
JPanel myPanel = new JPanel(new FlowLayout());
JButton cancelButton = new JButton(Main.myLang.getString("button.cancel"));
JButton okButton = new JButton(Main.myLang.getString("button.ok"));
myPanel.add(okButton);
myPanel.add(cancelButton);
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Die aenderungen werden nur dann uebernommen, wenn die
// Optionen nicht doppelt vorkommen
if (Main.getIniData("Language").equals((String)langbox.getSelectedItem()) == false){
Main.setIniData("Language", (String)langbox.getSelectedItem());
Object[] options = {
Main.myLang.getString("button.yes"),
Main.myLang.getString("button.no")
};
int n = JOptionPane.showOptionDialog(null,
Main.myLang.getString("dialog.lang.message"),
Main.myLang.getString("dialog.lang.error"),
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[1]);
if (n == 0){
//TODO: RESTART
System.exit(0);
}
}
if (shortcuts.exeption() == true) {
JOptionPane.showMessageDialog(null,
Main.myLang.getString("dialog.shortcut.message"),
Main.myLang.getString("dialog.shortcut.error"),
JOptionPane.ERROR_MESSAGE);
} else {
try {
shortcuts.storeKeys();
dispose();
} catch (IOException e1) {
e1.printStackTrace();
}
}
Main.setIniData("Workspace", (String)workspaceLink.getText());
// Saves the info which columns should be shown
Main.setIniData("columntype", Integer.toString(columntype));
Main.setIniData("filecolumn", Integer.toString(filecolumn));
String columntypes = "";
for(int i = 0; i < typeListModel.size(); i++){
columntypes = columntypes + typeListModel.get(i) + ",";
}
Main.setIniData("defaultcolumns", columntypes);
// Refreshes all existing models
tableTabPanel.refreshAllModels();
//
//More Options to Save on OK place here
//
}
});
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
return myPanel;
}
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
String dummy = List.get(myList.getSelectedIndex()).substring(2, List.get(myList.getSelectedIndex()).length() - 2);
if (dummy.equals(Main.myLang.getString("preferences.gerneral.preferences"))){
myDialog.getContentPane().remove(2);
myDialog.getContentPane().add(generalComponent, BorderLayout.CENTER);
} else if (dummy.equals(Main.myLang.getString("preferences.tab.hotkey"))){
myDialog.getContentPane().remove(2);
myDialog.getContentPane().add(shortcutComponent, BorderLayout.CENTER);
} else if (dummy.equals(Main.myLang.getString("preferences.tab.view"))){
myDialog.getContentPane().remove(2);
myDialog.getContentPane().add(viewComponent);
}
myDialog.pack();
myDialog.setSize(750, 600);
}
}
/*
* TODO: Comment
*/
private void loadComboBoxFields() {
try {
FileInputStream fileStream = new FileInputStream("types/fields.dat");
DataInputStream in = new DataInputStream(fileStream);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String field;
while ((field = reader.readLine()) != null) {
culumtypes.add(field);
typeComboBox.addItem(field);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* TODO: Comment
*/
private boolean listIncludeType(String type){
int count = 0;
while (count != typeListModel.size() - 1 && !typeListModel.get(count).toString().equals(type)){
count++;
}
if(typeListModel.get(count).toString().equals(type)){
return true;
} else {
return false;
}
}
}
/*
* TODO: Comment
*/
class Browselistener implements ActionListener{
PreferencesDialog dialog;
JTextField area;
Browselistener(PreferencesDialog dialog, JTextField area){
this.dialog = dialog;
this.area = area;
}
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setAcceptAllFileFilterUsed(false);
if(chooser.showOpenDialog(dialog) == JFileChooser.APPROVE_OPTION) {
area.setText(chooser.getSelectedFile().getPath());
}
}
}