Add 'src/be/nikiroo/utils/' from commit '46add0670fdee4bd936a13fe2448c5e20a7ffd0a'
[fanfix.git] / src / be / nikiroo / utils / ui / ConfigItemPassword.java
diff --git a/src/be/nikiroo/utils/ui/ConfigItemPassword.java b/src/be/nikiroo/utils/ui/ConfigItemPassword.java
new file mode 100644 (file)
index 0000000..348b78f
--- /dev/null
@@ -0,0 +1,109 @@
+package be.nikiroo.utils.ui;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JPasswordField;
+
+import be.nikiroo.utils.resources.MetaInfo;
+
+class ConfigItemPassword<E extends Enum<E>> extends ConfigItem<E> {
+       private static final long serialVersionUID = 1L;
+       /** A small 16x16 pass-protecet icon in PNG, base64 encoded. */
+       private static String img64passProtected = //
+       ""
+                       + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAnNCSVQICFXsRgQAAAD5SURBVCjP"
+                       + "ndG9LoNxGIbxHxJTG9U0IsJAdCSNqZEa9BR87BaHYfW5ESYkmjQh4giwIU00MWFwAPWRSmpgaf6G"
+                       + "6ts36eZ+xuu+lvuhlTGjOFHAsXldWVDRa82WhE9pZFxrtmBeUY87+yqCH3UzMh4E1VYhp2ZVVfi7"
+                       + "C0PuBc9G2v6KoOlIQUoyhovyLb+uZla/TbsRHnOgJkfSi4YpbDiXjuwJDS+SlASLYC9mw5KgxJlg"
+                       + "CWJ4OyqckvKkIWswwmXrmPbl0QBkHcbsHRv6Fbz6MNnesWMnpMw51vRmphuXo7FujHf+cCt4NGza"
+                       + "lbp3l5b1xR/1rWrYf/MLWpplWwswQpMAAAAASUVORK5CYII=";
+
+       /** A small 16x16 pass-unprotecet icon in PNG, base64 encoded. */
+       private static String img64passUnprotected = //
+       ""
+                       + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAA"
+                       + "CxMAAAsTAQCanBgAAAAHdElNRQfjBR8MIilwhCwdAAABK0lEQVQoz5XQv0uUAQCH8c/7qod4nect"
+                       + "gop3BIKDFBIiRyiKtATmcEiBDW7+Ae5ODt5gW0SLigouKTg6SJvkjw4Co8mcNeWgc+o839dBBXPz"
+                       + "+Y7PM33r3NCpWcWKM1lfHapJq0B4G/TbEDoyZlyHQxuGtdw6eSMC33yyJxa79MW+wIj8TdDrxJSS"
+                       + "+N5KppQNEchrkrMosmzRT0/0eGdSaFrob6DXloSqgu9mNWlUNqPPpmYNJkg5UvEMResystYVpbwW"
+                       + "qWpjVWwcfNQqLS1rAXwQOw4N4SWoqZeUVFMGuzgg65/IqIw5a3LarZnDcxd+ScMrkcikhB8+m1eU"
+                       + "MODUua67q967EttR0KHFoCVX/nhxp1N4o/rfUTueekC332KRM9veqnuoAwQyHs81DiddylUvrecA"
+                       + "AAAASUVORK5CYII=";
+
+       private Map<JComponent, JPasswordField> fields = new HashMap<JComponent, JPasswordField>();
+
+       /**
+        * Create a new {@link ConfigItemPassword} for the given {@link MetaInfo}.
+        * 
+        * @param info
+        *            the {@link MetaInfo}
+        */
+       public ConfigItemPassword(MetaInfo<E> info) {
+               super(info, true);
+       }
+
+       @Override
+       protected Object getFromField(int item) {
+               JPasswordField field = fields.get(getField(item));
+               if (field != null) {
+                       return new String(field.getPassword());
+               }
+
+               return null;
+       }
+
+       @Override
+       protected Object getFromInfo(int item) {
+               return info.getString(item, false);
+       }
+
+       @Override
+       protected void setToField(Object value, int item) {
+               JPasswordField field = fields.get(getField(item));
+               if (field != null) {
+                       field.setText(value == null ? "" : value.toString());
+               }
+       }
+
+       @Override
+       protected void setToInfo(Object value, int item) {
+               info.setString((String) value, item);
+       }
+
+       @Override
+       protected JComponent createEmptyField(int item) {
+               JPanel pane = new JPanel(new BorderLayout());
+               final JPasswordField field = new JPasswordField();
+               field.setEchoChar('*');
+
+               final JButton show = new JButton();
+               final Boolean[] visible = new Boolean[] { false };
+               setImage(show, img64passProtected, "/");
+               show.addActionListener(new ActionListener() {
+                       @Override
+                       public void actionPerformed(ActionEvent e) {
+                               visible[0] = !visible[0];
+                               if (visible[0]) {
+                                       field.setEchoChar((char) 0);
+                                       setImage(show, img64passUnprotected, "o");
+                               } else {
+                                       field.setEchoChar('*');
+                                       setImage(show, img64passProtected, "/");
+                               }
+                       }
+               });
+
+               pane.add(field, BorderLayout.CENTER);
+               pane.add(show, BorderLayout.EAST);
+
+               fields.put(pane, field);
+               return pane;
+       }
+}