package org.geogebra.desktop.gui.dialog; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import java.util.Locale; import java.util.Map.Entry; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import org.geogebra.common.main.Localization; import org.geogebra.common.util.lang.Language; import org.geogebra.common.util.lang.Unicode; import org.geogebra.desktop.gui.menubar.LanguageActionListener; import org.geogebra.desktop.gui.util.LayoutUtil; import org.geogebra.desktop.main.AppD; /** * Dialog to select language * * @author G. Sturr * */ public class LanguageDialog extends JDialog { /** * */ private static final long serialVersionUID = 1L; private AppD app; private static AbstractAction setFlagIconAction; private HashMap<Language, JLabel> lblList; private Locale oldLocale; private JButton btnOK; private JButton btnCancel; /******************************************* * Construct the dialog * * @param app */ public LanguageDialog(AppD app) { super(app.getFrame(), true); this.app = app; oldLocale = app.getLocale(); lblList = new HashMap<Language, JLabel>(); initActions(); getContentPane().add(createLanguageSelectionPanel(), BorderLayout.CENTER); createButtonPanel(); // getContentPane().add(createButtonPanel(), BorderLayout.SOUTH); setLabels(); pack(); this.setLocationRelativeTo(app.getFrame()); } private JPanel createButtonPanel() { btnOK = new JButton(); btnOK.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { setVisible(false); } }); btnCancel = new JButton(); btnCancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { if (app.getLocale() != oldLocale) { app.setLocale(oldLocale); } setVisible(false); } }); JPanel p = new JPanel(new FlowLayout(FlowLayout.RIGHT)); p.add(btnCancel); p.add(btnOK); p.add(Box.createHorizontalStrut(10)); return p; } /** * Create a list with all languages which can be selected. * * @param menu * @param al */ private JPanel createLanguageSelectionPanel() { JPanel list = new JPanel(); list.setLayout(new BoxLayout(list, BoxLayout.Y_AXIS)); JCheckBox mi; JLabel lbl; ActionListener al = new LanguageActionListener(app); ButtonGroup bg = new ButtonGroup(); String currentLocale = app.getLocale().toString(); // change en_GB into enGB currentLocale = currentLocale.replaceAll("_", ""); StringBuilder sb = new StringBuilder(20); lblList.clear(); for (Language loc : Language.values()) { // enforce to show specialLanguageNames first // because here getDisplayLanguage doesn't return a good result String text = loc.name; char ch = text.charAt(0); if (ch == Unicode.LeftToRightMark || ch == Unicode.RightToLeftMark) { ch = text.charAt(1); } else { // make sure brackets are correct in Arabic, ie not )US) sb.setLength(0); sb.append(Unicode.LeftToRightMark); sb.append(text); sb.append(Unicode.LeftToRightMark); text = sb.toString(); } mi = new JCheckBox(text); mi.setFocusable(false); lbl = new JLabel(); lbl.setBackground(Color.white); lbl.setOpaque(true); lblList.put(loc, lbl); // make sure eg Malayalam, Georgian drawn OK (not in standard Java // font) lbl.setFont(app.getFontCanDisplayAwt(text, false, Font.PLAIN, app.getGUIFontSize())); if (loc.locale.equals(currentLocale)) { mi.setSelected(true); lbl.setIcon(app.getScaledFlagIcon(app.getFlagName())); } else { lbl.setIcon(app.getEmptyIcon()); } mi.setActionCommand(loc.locale); mi.addActionListener(al); mi.addActionListener(setFlagIconAction); bg.add(mi); JPanel item = LayoutUtil.flowPanel(2, 0, 10, lbl, mi); item.setBackground(Color.white); item.setOpaque(true); // item.setBorder(BorderFactory.createEmptyBorder(2, 20, 2, 2)); list.add(item); } JScrollPane scroller = new JScrollPane(list); Dimension d = list.getPreferredSize(); d.height = 300; d.width += 30; // hack to include scroller insets scroller.setPreferredSize(d); scroller.getVerticalScrollBar().setUnitIncrement(30); scroller.setBorder(BorderFactory.createEmptyBorder()); JPanel p = new JPanel(new BorderLayout()); p.add(scroller, BorderLayout.CENTER); // p.setBorder(BorderFactory.createEmptyBorder(0, 0, 20, 0)); return p; } private void initActions() { setFlagIconAction = new AbstractAction() { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { EventQueue.invokeLater(new Runnable() { @Override public void run() { setFlag(); setLabels(); } }); } }; } /** * Sets list icons to show the flag for the current (selected) locale or * show an empty icon otherwise. */ protected void setFlag() { String currentLocale = app.getLocale().toString(); // change en_GB into enGB currentLocale = currentLocale.replaceAll("_", ""); ImageIcon ic = app.getScaledFlagIcon(app.getFlagName()); for (Entry<Language, JLabel> entry : lblList.entrySet()) { Language loc = entry.getKey(); if (ic != null && loc.locale.equals(currentLocale)) { lblList.get(loc) .setIcon(app.getScaledFlagIcon(app.getFlagName())); } else { entry.getValue().setIcon(app.getEmptyIcon()); } } } /** * */ public void setLabels() { Localization loc = app.getLocalization(); setTitle(loc.getMenu("Language")); btnCancel.setText(loc.getMenu("Cancel")); btnOK.setText(loc.getMenu("OK")); } }