/****************************************************************************** * Copyright: GPL v3 * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see <http://www.gnu.org/licenses/>. * ******************************************************************************/ package dba.gui; import dba.gui.auxClasses.ExtensionFilter; import dba.init.Initialize; import dba.options.Options; import dba.utils.GetIcons; import dba.utils.Localization; import net.miginfocom.swing.MigLayout; import javax.swing.*; import javax.swing.filechooser.FileFilter; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; /** * Class to print the options menu frame * * @author Andreas Freitag */ public class optionsMenu extends JDialog { /** * */ private static final long serialVersionUID = 7322481083260268322L; private JDialog frame; private Options options; private JComboBox<String> comboBobxLocale; private JCheckBox checkBoxTipOfTheDay; private String currentLocale; private String currentBgColor; private String currentAttrColor; private String currentRelColor; private String currentFontColor; private String currentArrowFkColor; private String currentArrowFdColor; private String currentBorderColor; private Localization locale; private String colorBG; private String colorAttr; private String colorRel; private String colorFont; private String colorArrowFk; private String colorArrowFd; private String colorBorder; private JPanel pnlBG; private JPanel pnlAttr; private JPanel pnlRel; private JPanel pnlFont; private JPanel pnlArrowFk; private JPanel pnlArrowFd; private JPanel pnlBorder; private JComboBox<String> cbLaf; private JFrame mainFrame; /** * Create the dialog. */ public optionsMenu(JFrame mFrame) { super(); mainFrame = mFrame; locale = Localization.getInstance(); options = Options.getInstance(); currentLocale = options.getLanguage(); currentAttrColor = options.getAttributeColor(); currentBgColor = options.getBackgroundColor(); currentFontColor = options.getFontColor(); currentRelColor = options.getRelationColor(); currentArrowFkColor = options.getArrowFKColor(); currentArrowFdColor = options.getArrowFDColor(); currentBorderColor = options.getBorderColor(); frame = this; setResizable(false); this.setModal(true); frame.setTitle(locale.getString("OPT_FrameTitle")); GetIcons getIcons = GetIcons.getInstance(); frame.setIconImage(getIcons.getIconOptionsFrame().getImage()); setMinimumSize(new Dimension(450, 150)); getContentPane().setLayout(new BorderLayout()); JPanel contentPanel = new JPanel(); contentPanel.setLayout(new BorderLayout()); getContentPane().add(contentPanel, BorderLayout.CENTER); JPanel buttonPane = new JPanel(); buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); getContentPane().add(buttonPane, BorderLayout.SOUTH); JButton okButton = new JButton(locale.getString("Ok")); okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String selectedLang = options.getKeyByValue(options.getAvailableLocale(), (String) comboBobxLocale.getSelectedItem()); String selectedLAF = options.getKeyByValue(options.getAvailLAF(), (String) cbLaf.getSelectedItem()); options.setLanguage(selectedLang); options.setShowTippsOnStartup(checkBoxTipOfTheDay.isSelected()); options.setAttributeColor(colorAttr); options.setBackgroundColor(colorBG); options.setFontColor(colorFont); options.setRelationColor(colorRel); options.setArrowFKColor(colorArrowFk); options.setArrowFDColor(colorArrowFd); options.setBorderColor(colorBorder); options.setLookAndFeel(selectedLAF); if (options.isNeedToRestart()) { JOptionPane.showMessageDialog(null, locale.getString("OPT_Restart")); options.setNeedToRestart(false); } options.writeOptions(); Initialize.getInstance().setLookAndFeel(); SwingUtilities.updateComponentTreeUI(mainFrame); options.notifyObservers(); frame.dispose(); } }); buttonPane.add(okButton); getRootPane().setDefaultButton(okButton); JButton cancelButton = new JButton(locale.getString("Cancel")); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { frame.dispose(); } }); buttonPane.add(cancelButton); JTabbedPane tabbedPane = new JTabbedPane(); contentPanel.add(tabbedPane, BorderLayout.CENTER); tabbedPane.addTab(locale.getString("OPT_GeneralTab"), createGeneralPanel()); tabbedPane.addTab(locale.getString("OPT_ThemeTab"), createThemePanel()); pack(); setLocationRelativeTo(null); } private JPanel createGeneralPanel() { JPanel panel = new JPanel(new MigLayout("fillx")); checkBoxTipOfTheDay = new JCheckBox(); checkBoxTipOfTheDay.setSelected(options.getShowTippsOnStartup()); cbLaf = new JComboBox<>(); for (String laf : options.getAvailLAF().values()) { cbLaf.addItem(laf); } cbLaf.setSelectedItem(options.getAvailLAF().get(options.getLookAndFeel())); comboBobxLocale = new JComboBox<>(); for (String locale : options.getAvailableLocale().values()) { comboBobxLocale.addItem(locale); } comboBobxLocale.setSelectedItem(options.getAvailableLocale().get(options.getLanguage())); panel.add(new JLabel(locale.getString("OPT_Language")), "growx"); panel.add(comboBobxLocale, "alignx right, wrap"); panel.add(new JLabel(locale.getString("OPT_ShowTOD")), "alignx left, growx"); panel.add(checkBoxTipOfTheDay, "alignx right, wrap"); panel.add(new JLabel("LookAndFeel"), "growx"); panel.add(cbLaf, "alignx right, wrap"); return panel; } private JPanel createThemePanel() { colorBG = options.getBackgroundColor(); colorAttr = options.getAttributeColor(); colorFont = options.getFontColor(); colorRel = options.getRelationColor(); colorArrowFk = options.getArrowFKColor(); colorArrowFd = options.getArrowFDColor(); colorBorder = options.getBorderColor(); JPanel panel = new JPanel(new BorderLayout()); JPanel panelLeft = new JPanel(new GridLayout(0, 2)); panel.add(panelLeft, BorderLayout.CENTER); pnlBG = new JPanel(); pnlBG.setBackground(Color.decode(options.getBackgroundColor())); JButton btnBG = new JButton(locale.getString("OPT_Background")); btnBG.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { Color tmpColor = JColorChooser.showDialog(null, locale.getString("OPT_BackgroundColor"), Color.decode(options.getBackgroundColor())); if (tmpColor != null) { colorBG = "#" + (Integer.toHexString(tmpColor.getRGB())).substring(2); pnlBG.setBackground(Color.decode(colorBG)); pnlBG.revalidate(); } } }); panelLeft.add(btnBG); panelLeft.add(pnlBG); pnlAttr = new JPanel(); pnlAttr.setBackground(Color.decode(options.getAttributeColor())); JButton btnAttr = new JButton(locale.getString("Attribute")); btnAttr.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { Color tmpColor = JColorChooser.showDialog(null, locale.getString("OPT_AttributeColor"), Color.decode(options.getAttributeColor())); if (tmpColor != null) { colorAttr = "#" + (Integer.toHexString(tmpColor.getRGB())).substring(2); pnlAttr.setBackground(Color.decode(colorAttr)); pnlAttr.revalidate(); } } }); panelLeft.add(btnAttr); panelLeft.add(pnlAttr); pnlRel = new JPanel(); pnlRel.setBackground(Color.decode(options.getRelationColor())); JButton btnRel = new JButton(locale.getString("Relation")); btnRel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { Color tmpColor = JColorChooser.showDialog(null, locale.getString("OPT_RelationColor"), Color.decode(options.getRelationColor())); if (tmpColor != null) { colorRel = "#" + (Integer.toHexString(tmpColor.getRGB())).substring(2); pnlRel.setBackground(Color.decode(colorRel)); pnlRel.revalidate(); } } }); panelLeft.add(btnRel); panelLeft.add(pnlRel); pnlFont = new JPanel(); pnlFont.setBackground(Color.decode(options.getFontColor())); JButton btnFont = new JButton(locale.getString("OPT_Font")); btnFont.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { Color tmpColor = JColorChooser.showDialog(null, locale.getString("OPT_FontColor"), Color.decode(options.getFontColor())); if (tmpColor != null) { colorFont = "#" + (Integer.toHexString(tmpColor.getRGB())).substring(2); pnlFont.setBackground(Color.decode(colorFont)); pnlFont.revalidate(); } } }); panelLeft.add(btnFont); panelLeft.add(pnlFont); pnlArrowFk = new JPanel(); pnlArrowFk.setBackground(Color.decode(options.getArrowFKColor())); JButton btnArrowFk = new JButton(locale.getString("OPT_ArrowFk")); btnArrowFk.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { Color tmpColor = JColorChooser.showDialog(null, locale.getString("OPT_ArrowFkColor"), Color.decode(options.getArrowFKColor())); if (tmpColor != null) { colorArrowFk = "#" + (Integer.toHexString(tmpColor.getRGB())).substring(2); pnlArrowFk.setBackground(Color.decode(colorArrowFk)); pnlArrowFk.revalidate(); } } }); panelLeft.add(btnArrowFk); panelLeft.add(pnlArrowFk); pnlArrowFd = new JPanel(); pnlArrowFd.setBackground(Color.decode(options.getArrowFDColor())); JButton btnArrowFd = new JButton(locale.getString("OPT_ArrowFd")); btnArrowFd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { Color tmpColor = JColorChooser.showDialog(null, locale.getString("OPT_ArrowFdColor"), Color.decode(options.getArrowFDColor())); if (tmpColor != null) { colorArrowFd = "#" + (Integer.toHexString(tmpColor.getRGB())).substring(2); pnlArrowFd.setBackground(Color.decode(colorArrowFd)); pnlArrowFd.revalidate(); } } }); panelLeft.add(btnArrowFd); panelLeft.add(pnlArrowFd); pnlBorder = new JPanel(); pnlBorder.setBackground(Color.decode(options.getBorderColor())); JButton btnBorder = new JButton(locale.getString("OPT_Border")); btnBorder.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { Color tmpColor = JColorChooser.showDialog(null, locale.getString("OPT_BorderColor"), Color.decode(options.getBorderColor())); if (tmpColor != null) { colorBorder = "#" + (Integer.toHexString(tmpColor.getRGB())).substring(2); pnlBorder.setBackground(Color.decode(colorBorder)); pnlBorder.revalidate(); } } }); panelLeft.add(btnBorder); panelLeft.add(pnlBorder); JButton btnDefault = new JButton(locale.getString("OPT_ResetTheme")); btnDefault.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { int n = JOptionPane.showConfirmDialog(null, locale.getString("OPT_Confirm"), locale.getString("OPT_ConfirmTitle"), JOptionPane.YES_NO_OPTION); if (n == JOptionPane.YES_OPTION) { colorBG = "#A7E2FF"; pnlBG.setBackground(Color.decode(colorBG)); pnlBG.revalidate(); colorAttr = "#00FF00"; pnlAttr.setBackground(Color.decode(colorAttr)); pnlAttr.revalidate(); colorRel = "#00CD00"; pnlRel.setBackground(Color.decode(colorRel)); pnlRel.revalidate(); colorFont = "#000000"; pnlFont.setBackground(Color.decode(colorFont)); pnlFont.revalidate(); colorArrowFk = "#0095C7"; pnlArrowFk.setBackground(Color.decode(colorArrowFk)); pnlArrowFk.revalidate(); colorArrowFd = "#000000"; pnlArrowFd.setBackground(Color.decode(colorArrowFd)); pnlArrowFd.revalidate(); colorBorder = "#0095C7"; pnlBorder.setBackground(Color.decode(colorBorder)); pnlBorder.revalidate(); } } }); panelLeft.add(btnDefault); JButton btnLoad = new JButton("Load Theme"); btnLoad.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { exportImportColorTheme(IOType.IMPORT); } }); panelLeft.add(new JLabel()); panelLeft.add(btnLoad); JButton btnSave = new JButton("Save Theme"); btnSave.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { exportImportColorTheme(IOType.EXPORT); } }); panelLeft.add(new JLabel()); panelLeft.add(btnSave); return panel; } private void exportImportColorTheme(IOType type) { String path; JFileChooser fc = new JFileChooser(options.getSchemeFolder()); String title = type == IOType.EXPORT ? "DCT Export" : "DCT Import"; fc.setDialogTitle(title); FileFilter typeDCT = new ExtensionFilter(".dtc", ".dtc"); //DTC: DBA Color Theme fc.addChoosableFileFilter(typeDCT); fc.setFileFilter(typeDCT); fc.setAcceptAllFileFilterUsed(false); int returnVal = type == IOType.EXPORT ? fc.showSaveDialog(fc) : fc.showOpenDialog(fc); if (returnVal == JFileChooser.APPROVE_OPTION) { try { path = fc.getSelectedFile().getCanonicalPath(); if (!path.endsWith(".dtc")) { path = path + ".dtc"; } exportImportDTC(path, type); } catch (IOException e1) { } } } private void exportImportDTC(String path, IOType type) { File file = new File(path); if (!path.endsWith(".dtc")) { file = new File(path + ".dtc"); } if (type == IOType.IMPORT) { readDTC(path); } else { if (file.exists()) { Object[] options = {locale.getString("Yes"), locale.getString("No")}; int result = JOptionPane.showOptionDialog(null, locale.getString("GUI_TheFile") + " " + file.getName() + " " + locale.getString("GUI_AlreadyExisting"), "Export", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]); switch (result) { case JOptionPane.YES_OPTION: writeDTC(path); break; case JOptionPane.NO_OPTION: exportImportColorTheme(type); break; } } else { writeDTC(path); } } } private void writeDTC(String path) { try { Properties prop = new Properties(); prop.setProperty("currentAttrColor", colorAttr); prop.setProperty("currentRelColor", colorRel); prop.setProperty("currentFontColor", colorFont); prop.setProperty("currentArrowFkColor", colorArrowFk); prop.setProperty("currentArrowFdColor", colorArrowFd); prop.setProperty("currentBgColor", colorBG); prop.setProperty("currentBorderColor", colorBorder); prop.store(new FileOutputStream(path), "DBA Color Theme"); } catch (IOException e) { } } private void readDTC(String path) { try { Properties prop = new Properties(); prop.load(new FileInputStream(path)); colorAttr = prop.getProperty("currentAttrColor"); colorRel = prop.getProperty("currentRelColor"); colorFont = prop.getProperty("currentFontColor"); colorArrowFk = prop.getProperty("currentArrowFkColor"); colorArrowFd = prop.getProperty("currentArrowFdColor"); colorBG = prop.getProperty("currentBgColor"); colorBorder = prop.getProperty("currentBorderColor"); } catch (IOException e) { } pnlBG.setBackground(Color.decode(colorBG)); pnlBG.revalidate(); pnlAttr.setBackground(Color.decode(colorAttr)); pnlAttr.revalidate(); pnlRel.setBackground(Color.decode(colorRel)); pnlRel.revalidate(); pnlFont.setBackground(Color.decode(colorFont)); pnlFont.revalidate(); pnlArrowFk.setBackground(Color.decode(colorArrowFk)); pnlArrowFk.revalidate(); pnlArrowFd.setBackground(Color.decode(colorArrowFd)); pnlArrowFd.revalidate(); pnlBorder.setBackground(Color.decode(colorBorder)); pnlBorder.revalidate(); } private enum IOType { EXPORT, IMPORT; } }