Logiciel de gestion de plan de feu pour les troupes de théâtre amateur.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

965 lines
34 KiB

// ================================================================================
// François MERCIOL 2012
// Name : Util.java
// Language : Java
// Author : François Merciol
// CopyLeft : Cecil B
// Creation : 2012
// Version : 0.1 (xx/xx/xx)
// ================================================================================
package misc;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
import java.util.List;
import java.util.Set;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import javax.swing.plaf.basic.BasicButtonUI;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import static misc.Config.FS;
public class Util implements SwingConstants {
// ========================================
// Change Plugins.version too !
static public final Long version = 20171101L;
static public final int bufSize = 1024*1024;
static public final String NL = System.getProperty ("line.separator");
static public final String ON = "On";
static public final String OFF = "Off";
static public BasicButtonUI buttonNoUI = new BasicButtonUI ();
static public Border buttonNoBorder = BorderFactory.createEmptyBorder (2, 2, 2, 2);
// ========================================
static public final String toNumIn2Units (long bytes) {
if (bytes == 0)
return "0 ";
int u = 0;
for (; bytes > 1024*1024; bytes >>= 10)
u++;
if (bytes < 1024)
return String.format ("%d %c", bytes, " kMGTPEZY".charAt (u)).replace (" ", "");
u++;
return String.format ("%.1f %c", bytes/1024f, " kMGTPEZY".charAt (u)).replace (",0 ", " ").replace (" ", "");
}
static public final String toNumIn10Units (long bytes) {
if (bytes == 0)
return "0 ";
int u = 0;
for (; bytes > 1000*1000; bytes >>= 10)
u++;
if (bytes < 1000)
return String.format ("%d %c", bytes, " kMGTPEZY".charAt (u)).replace (" ", "");
u++;
return String.format ("%.1f %c", bytes/1000f, " kMGTPEZY".charAt (u)).replace (",0 ", " ").replace (" ", "");
}
@SuppressWarnings ({"unchecked", "rawtypes"})
static public final<T> T toEnum (String value, T defaultValue) {
try {
return (T) Enum.valueOf ((Class<? extends Enum>)defaultValue.getClass (), value);
} catch (Exception e) {
}
return defaultValue;
}
// ========================================
static public final String toColumn (String [] lines, int nbColumn) {
int size = lines.length;
if (size < 1)
return "";
if (size < 2)
return lines [0]+"\n";
String result = "";
int nbLignes = size/nbColumn;
int nbLongColumn = size % nbColumn;
for (int i = 0, k = 0; k < size; i++) {
int idx = i;
String sep = "";
for (int j = 0; j < nbColumn && k < size; j++, k++) {
result += sep + lines [idx];
sep = "\t";
idx += nbLignes;
if (j < nbLongColumn)
idx++;
}
result += "\n";
}
return result;
}
// ========================================
static public final String[] set2string (Set<String> set) {
String [] result = new String [set.size ()];
int idx = 0;
for (String key : set)
result [idx++] = key;
return result;
}
// ======================================================================
static public JScrollPane getJScrollPane (Component view) {
return getJScrollPane (view, true, true);
}
static public JScrollPane getJScrollPane (Component view, boolean vNeed, boolean hNeed) {
return new JScrollPane (view,
vNeed ? JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED : JScrollPane.VERTICAL_SCROLLBAR_NEVER,
hNeed ? JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED : JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
}
// ========================================
static public JSplitPane getJSplitPane (int newOrientation, Component newLeftComponent, Component newRightComponent) {
JSplitPane result = new JSplitPane (newOrientation, newLeftComponent, newRightComponent);
result.setResizeWeight (0);
result.setOneTouchExpandable (true);
result.setContinuousLayout (true);
return result;
}
// ========================================
static public final void setEnabled (Component component, boolean enabled) {
component.setEnabled (enabled);
try {
for (Component component2 : ((Container) component).getComponents ())
setEnabled (component2, enabled);
} catch (Exception e) {
}
}
// ========================================
static public final GridBagConstraints
GBC, GBCNL, GBCLNL, GBCBNL;
static {
GBC = new GridBagConstraints ();
GBC.insets = new Insets (1, 2, 1, 2);
GBC.weightx = GBC.weighty = 1.;
GBC.fill = GridBagConstraints.HORIZONTAL;
GBCLNL = (GridBagConstraints) GBC.clone ();
GBCLNL.anchor = GridBagConstraints.WEST;
GBCLNL.fill = GridBagConstraints.NONE;
GBCLNL.gridwidth = GridBagConstraints.REMAINDER;
GBCNL = (GridBagConstraints) GBC.clone ();
GBCNL.gridwidth = GridBagConstraints.REMAINDER;
GBCBNL = (GridBagConstraints) GBCNL.clone ();
GBCBNL.fill = GridBagConstraints.BOTH;
}
static public JPanel getGridBagPanel () {
return new JPanel (new GridBagLayout ());
}
static public void addLabelFields (Container container, String label, Component... components) {
addLabel (label, RIGHT, container, GBC);
for (int i = 0; i < components.length; i++)
addComponent (components[i], container, i == components.length -1 ? GBCNL : GBC);
}
// ========================================
static public AbstractButton activeButton (AbstractButton button, String action, ActionListener actionListener) {
button.setActionCommand (action);
Bundle.addLocalizedActioner (button);
button.setToolTipText (Bundle.getAction (action));
Bundle.addLocalizedToolTip (button);
if (actionListener != null)
button.addActionListener (actionListener);
return button;
}
// ========================================
static public final JCheckBox newCheckIcon (String action, ActionListener actionListener) {
JCheckBox button = new JCheckBox (loadActionIcon (action+OFF));
button.setSelectedIcon (loadActionIcon (action+ON));
activeButton (button, action, actionListener);
return button;
}
static public final JCheckBox newCheckIcon (String action, ActionListener actionListener, boolean defaultValue) {
JCheckBox button = newCheckIcon (action, actionListener);
button.setSelected (defaultValue);
return button;
}
static public final JCheckBox addCheckIcon (String action, ActionListener actionListener, Container container) {
JCheckBox button = newCheckIcon (action, actionListener);
container.add (button);
return button;
}
static public final JCheckBox addCheckIcon (String action, ActionListener actionListener, boolean defaultValue, Container container) {
JCheckBox button = newCheckIcon (action, actionListener);
container.add (button);
button.setSelected (defaultValue);
return button;
}
static public final void addCheckIcon (List<String> actions, ActionListener actionListener, Container container) {
for (String action : actions)
addCheckIcon (action, actionListener, container);
}
static public final JCheckBox addCheckIcon (String action, ActionListener actionListener, boolean defaultValue,
Container container, GridBagConstraints constraint) {
JCheckBox button = newCheckIcon (action, actionListener, defaultValue);
addComponent (button, container, constraint);
return button;
}
static public void setCheckIconTableCellEditorRenderer (String action, TableColumn tableColumn) {
tableColumn.setCellRenderer (new CheckIconTableCellEditorRenderer (action));
tableColumn.setCellEditor (new DefaultCellEditor (newCheckIcon (action, null)));
}
static public class CheckIconTableCellEditorRenderer implements TableCellRenderer {
JCheckBox jCheckBox;
public CheckIconTableCellEditorRenderer (String action) {
jCheckBox = Util.newCheckIcon (action, null);
}
public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
jCheckBox.setBackground (isSelected ? table.getSelectionBackground () : table.getBackground ());
jCheckBox.setForeground (isSelected ? table.getSelectionForeground () : table.getForeground ());
if (value instanceof Boolean)
jCheckBox.setSelected (((Boolean) value).booleanValue ());
return jCheckBox;
}
}
// ========================================
static public final JCheckBox newCheckButton (String action, ActionListener actionListener) {
JCheckBox button = new JCheckBox (Bundle.getAction (action), loadActionIcon (action+OFF));
button.setSelectedIcon (loadActionIcon (action+ON));
activeButton (button, action, actionListener);
return button;
}
static public final JCheckBox addCheckButton (String action, ActionListener actionListener, Container container) {
JCheckBox button = newCheckButton (action, actionListener);
container.add (button);
return button;
}
static public final void addCheckButton (List<String> actions, ActionListener actionListener, Container container) {
for (String action : actions)
addCheckButton (action, actionListener, container);
}
static public final JCheckBox addCheckButton (String action, ActionListener actionListener,
Container container, GridBagConstraints constraint) {
JCheckBox button = newCheckButton (action, actionListener);
addComponent (button, container, constraint);
return button;
}
// ========================================
static public final JCheckBox newCheckButtonConfig (String action, ActionListener actionListener, boolean defaultValue) {
boolean startValue = Config.getBoolean (action+Config.checkedPostfix, defaultValue);
JCheckBox button = newCheckButton (action, actionListener);
button.setSelected (startValue);
return button;
}
static public final JCheckBox addCheckButtonConfig (String action, ActionListener actionListener, boolean defaultValue,
Container container) {
JCheckBox button = newCheckButtonConfig (action, actionListener, defaultValue);
container.add (button);
return button;
}
static public final JCheckBox addCheckButtonConfig (String action, ActionListener actionListener, boolean defaultValue,
Container container, GridBagConstraints constraint) {
JCheckBox button = newCheckButtonConfig (action, actionListener, defaultValue);
// XXX le test suivant a été supprimer, il faut vérifier que cela tourne toujours
//if (container != null)
addComponent (button, container, constraint);
return button;
}
// ========================================
static public final JRadioButton newRadioButton (String action, ActionListener actionListener, ButtonGroup group, String selected) {
JRadioButton button = new JRadioButton (Bundle.getAction (action), loadActionIcon (action+OFF),
action.equals (selected));
button.setSelectedIcon(loadActionIcon (action+ON));
activeButton (button, action, actionListener);
group.add (button);
return button;
}
static public final void addRadioButton (List<String> actions, ActionListener actionListener, ButtonGroup group, String selected,
Container container) {
for (String action : actions) {
JRadioButton button = newRadioButton (action, actionListener, group, selected);
container.add (button);
}
}
static public final JRadioButton addRadioButton (String action, ActionListener actionListener, ButtonGroup group, String selected,
Container container, GridBagConstraints constraint) {
JRadioButton button = newRadioButton (action, actionListener, group, selected);
addComponent (button, container, constraint);
return button;
}
// ========================================
static public final JButton newButton (String action, ActionListener actionListener) {
JButton button = new JButton (Bundle.getAction (action), loadActionIcon (action));
activeButton (button, action, actionListener);
return button;
}
static public final void newButton (List<String> actions, ActionListener actionListener) {
for (String action : actions)
newButton (action, actionListener);
}
static public final JButton addButton (String action, ActionListener actionListener, Container container) {
JButton button = newButton (action, actionListener);
container.add (button);
return button;
}
static public final void addButton (List<String> actions, ActionListener actionListener, Container container) {
for (String action : actions)
addButton (action, actionListener, container);
}
static public final JButton addButton (String action, ActionListener actionListener, Container container, GridBagConstraints constraint) {
JButton button = newButton (action, actionListener);
addComponent (button, container, constraint);
return button;
}
// ========================================
static public final JButton newIconButton (String action, ActionListener actionListener) {
JButton button = new JButton (loadActionIcon (action));
button.setAlignmentX (Component.CENTER_ALIGNMENT);
activeButton (button, action, actionListener);
return button;
}
static public final void newIconButton (List<String> actions, ActionListener actionListener) {
for (String action : actions)
newIconButton (action, actionListener);
}
static public final JButton addIconButton (String action, ActionListener actionListener, Container container) {
JButton button = newIconButton (action, actionListener);
container.add (button);
return button;
}
static public final void addIconButton (List<String> actions, ActionListener actionListener, Container container) {
for (String action : actions)
addIconButton (action, actionListener, container);
}
static public final JButton addIconButton (String action, ActionListener actionListener, Container container, GridBagConstraints constraint) {
JButton button = new JButton (loadActionIcon (action));
activeButton (button, action, actionListener);
addComponent (button, container, constraint);
return button;
}
static public final void unBoxButton (Container container) {
for (AbstractButton button : collectButtons (null, container).values ())
unBoxButton (button);
}
static public final void unBoxButton (AbstractButton button) {
button.setUI (buttonNoUI);
button.setBorder (buttonNoBorder);
}
// ========================================
static public final void addMenuItem (String action, ActionListener actionListener, Container container) {
JMenuItem item = new JMenuItem (Bundle.getAction (action), loadActionIcon (action));
activeButton (item, action, actionListener);
container.add (item);
}
static public final void addMenuItem (List<String> actions, ActionListener actionListener, Container container) {
for (String action : actions)
addMenuItem (action, actionListener, container);
}
// ========================================
static public Hashtable<String, ArrayList<AbstractButton>> allCheckBox = new Hashtable<String, ArrayList<AbstractButton>> ();
static public void updateCheckBox (String action, boolean value) {
ArrayList<AbstractButton> buttons = allCheckBox.get (action);
if (buttons == null)
return;
Config.setBoolean (action+Config.checkedPostfix, value);
for (AbstractButton button : buttons)
if (button.isSelected () != value)
button.setSelected (value);
}
static public final void addCheckMenuItem (List<String> actions, ActionListener actionListener, Container container) {
for (String action : actions)
addCheckMenuItem (action, actionListener, container);
}
static public final JCheckBoxMenuItem addCheckMenuItem (String action, ActionListener actionListener, Container container) {
return addCheckMenuItem (action, actionListener, Config.getBoolean (action+Config.checkedPostfix, false), container);
}
static public final JCheckBoxMenuItem addCheckMenuItem (String action, ActionListener actionListener,
boolean defaultValue, Container container) {
boolean startValue = Config.getBoolean (action+Config.checkedPostfix, defaultValue);
JCheckBoxMenuItem item = new JCheckBoxMenuItem (Bundle.getAction (action), loadActionIcon (action+OFF), startValue);
item.setSelectedIcon (loadActionIcon (action+ON));
activeButton (item, action, actionListener);
container.add (item);
ArrayList<AbstractButton> checkList = allCheckBox.get (action);
if (checkList == null)
allCheckBox.put (action, checkList = new ArrayList<AbstractButton> ());
checkList.add (item);
return item;
}
// ========================================
static public final JMenu addJMenu (JMenuBar jMenuBar, String menuId) {
JMenu menu = new JMenu (Bundle.getTitle (menuId));
menu.setActionCommand (menuId);
Bundle.addLocalizedMenu (menu);
jMenuBar.add (menu);
return menu;
}
// ========================================
static public void addComponent (Component component, Container container, GridBagConstraints constraint) {
GridBagLayout gridbag = (GridBagLayout) container.getLayout ();
gridbag.setConstraints (component, constraint);
container.add (component);
}
// ========================================
static public final Dimension space = new Dimension (10, 10);
static public void addTextFieldSlider (JTextField textField, JLabel label, JSlider slider, Container container, GridBagConstraints constraint) {
JPanel panel = getGridBagPanel ();
addComponent (textField, panel, GBC);
addComponent (label, panel, GBC);
addComponent (slider, panel, GBCBNL);
addComponent (panel, container, constraint);
}
// ========================================
static public JLabel newLabel (String messageId, int position) {
JLabel jLabel = new JLabel (Bundle.getLabel (messageId), position);
Bundle.addLocalizedLabel (jLabel, messageId);
return jLabel;
}
// ========================================
static public JLabel addLabel (String messageId, int position, Container container) {
JLabel jLabel = newLabel (messageId, position);
container.add (jLabel);
return jLabel;
}
// ========================================
static public JLabel addLabel (String messageId, int position, Container container, GridBagConstraints constraint) {
JLabel jLabel = newLabel (messageId, position);
addComponent (jLabel, container, constraint);
return jLabel;
}
// ========================================
static public JComboBox<String> newEnum (Class<? extends Enum<?>> enumClass, Enum<?> defaultValue) {
JComboBox<String> jComboBox = Bundle.getEnum (enumClass, defaultValue);
Bundle.addLocalizedEnum (jComboBox, enumClass);
return jComboBox;
}
// ========================================
static public JComboBox<String> addEnum (Class<? extends Enum<?>> enumClass, Enum<?> defaultValue, Container container) {
JComboBox<String> jComboBox = newEnum (enumClass, defaultValue);
container.add (jComboBox);
return jComboBox;
}
// ========================================
static public JComboBox<String> addEnum (Class<? extends Enum<?>> enumClass, Enum<?> defaultValue, Container container, GridBagConstraints constraint) {
JComboBox<String> jComboBox = newEnum (enumClass, defaultValue);
addComponent (jComboBox, container, constraint);
return jComboBox;
}
// ========================================
static public final void setColumnLabels (JTable jTable, String [] columnLabels) {
for (int i = 0; i < columnLabels.length; i++)
jTable.getColumnModel ().getColumn (i).setHeaderValue (Bundle.getLabel (columnLabels [i]));
try {
Container parent = jTable.getParent ();
parent.repaint ();
} catch (Exception e) {
}
}
static public int viewToModel (JTable table, int vColIndex) {
if (vColIndex >= table.getColumnCount()) {
return -1;
}
return table.getColumnModel ().getColumn (vColIndex).getModelIndex ();
}
public int modelToView (JTable table, int mColIndex) {
for (int c = 0; c < table.getColumnCount (); c++) {
TableColumn col = table.getColumnModel ().getColumn (c);
if (col.getModelIndex () == mColIndex) {
return c;
}
}
return -1;
}
// ========================================
static public boolean packBug = false;
static public final void packWindow (final Component startComponent) {
if (packBug)
return;
SwingUtilities.invokeLater (new Runnable() {
public void run () {
for (Component component = startComponent;
component != null;
component = component.getParent ()) {
try {
((Window) component).pack ();
return;
} catch (Exception e) {
}
}
}
});
}
// ========================================
static public final JFrame newJFrame (String title, Component component, boolean exit) {
JFrame jFrame = new JFrame (title);
jFrame.addWindowListener (new WindowAdapter () {
public void windowClosing (WindowEvent e) {
if (exit)
System.exit (0);
jFrame.setVisible (false);
}
});
jFrame.getContentPane ().add (component, BorderLayout.CENTER);
jFrame.pack ();
jFrame.setLocationRelativeTo (null);
jFrame.setVisible (true);
return jFrame;
}
// ========================================
static public ImageIcon loadActionIcon (String action) {
return loadImageIcon (Config.dataDirname, Config.iconsDirname, Config.buttonDirname, action+Config.iconsExt);
}
// ========================================
static public ImageIcon loadImageIcon (String... names) {
URL url = Config.getDataUrl (names);
return (url != null) ? new ImageIcon (url) : null;
}
// ========================================
static public Image loadImage (String... names) {
try {
return loadImageIcon (names).getImage ();
} catch (Exception e) {
return null;
}
}
// ========================================
static public final AudioInputStream loadAudio (String... names) {
URL url = Config.getDataUrl (names);
try {
return AudioSystem.getAudioInputStream (url);
} catch (Exception e) {
return null;
}
}
static public final void play (AudioInputStream stream) {
if (stream == null)
return;
try {
AudioFormat format = stream.getFormat ();
DataLine.Info info = new DataLine.Info (Clip.class, format);
Clip clip = (Clip) AudioSystem.getLine (info);
clip.open (stream);
clip.addLineListener (new LineListener () {
public void update (LineEvent event) {
LineEvent.Type type = event.getType();
if (type == LineEvent.Type.START) {
// System.err.println ("Playback started.");
} else if (type == LineEvent.Type.STOP) {
// System.er.println ("Playback completed.");
clip.close ();
}
}
});
clip.start ();
} catch (LineUnavailableException e) {
Log.keepLastException ("Audio line for playing back is unavailable", e);
} catch (IOException e) {
Log.keepLastException ("Error playing the audio file", e);
}
}
// ========================================
@SuppressWarnings({"rawtypes", "unchecked"})
static public final Hashtable<String, Method> collectMethod (Class javaClass, List<String>... actions) {
Hashtable<String, Method> actionsMethod = new Hashtable<String, Method> ();
for (List<String> arg : actions)
for (String action : arg) {
try {
actionsMethod.put (action, javaClass.getMethod ("action"+action));
} catch (NoSuchMethodException e) {
try {
actionsMethod.put (action, javaClass.getMethod ("action"+action, new Class<?>[] { boolean.class }));
} catch (NoSuchMethodException e1) {
Log.keepLastException ("Util::collectMethod can't find methode "+"action"+action, e1);
e.printStackTrace ();
}
}
}
return actionsMethod;
}
// ========================================
static public final Hashtable<String, AbstractButton> collectButtons (Hashtable<String, AbstractButton> buttons, JMenu jMenu) {
if (buttons == null)
buttons = new Hashtable<String, AbstractButton> ();
for (int i = 0; i < jMenu.getItemCount (); i++) {
try {
AbstractButton button = jMenu.getItem (i);
buttons.put (button.getActionCommand (), button);
} catch (Exception e) {
}
}
return buttons;
}
static public class ActionControl {
String action;
int key;
boolean control;
public ActionControl (String action, int key) {
this (action, key, true);
}
public ActionControl (String action, int key, boolean control) {
this.action = action;
this.key = key;
this.control = control;
}
}
static public void setAccelerator (Hashtable<String, AbstractButton> buttons, ActionControl... actionsControl) {
for (ActionControl actionControl : actionsControl)
((JMenuItem) buttons.get (actionControl.action)).setAccelerator (KeyStroke.getKeyStroke (actionControl.key, actionControl.control ? InputEvent.CTRL_DOWN_MASK : 0));
}
// ========================================
static public final Hashtable<String, AbstractButton> collectButtons (Hashtable<String, AbstractButton> buttons, Container container) {
if (buttons == null)
buttons = new Hashtable<String, AbstractButton> ();
for (Component component : container.getComponents ()) {
try {
AbstractButton button = (AbstractButton) component;
buttons.put (button.getActionCommand (), button);
} catch (Exception e) {
}
}
return buttons;
}
// ========================================
static public final void actionPerformed (final Hashtable<String, Method> actionsMethod, ActionEvent e, final Object object) {
String cmd = null;
try {
final Object source = e.getSource ();
if (source instanceof AbstractButton)
cmd = ((AbstractButton) source).getActionCommand ();
else if (source instanceof JComboBox)
cmd = ((JComboBox) source).getActionCommand ();
final String cmd2 = cmd;
if (cmd2 != null)
SwingUtilities.invokeLater (new Runnable() {
public void run () {
if (source instanceof JCheckBoxMenuItem) {
try {
boolean value = ((JCheckBoxMenuItem) source).isSelected ();
actionsMethod.get (cmd2).invoke (object, value);
updateCheckBox (cmd2, value);
return;
} catch (IllegalArgumentException e2) {
} catch (Exception e1) {
Log.keepLastException ("Util::actionPerformed (action "+cmd2+" on "+object+")", e1);
return;
}
}
try {
actionsMethod.get (cmd2).invoke (object);
} catch (Exception e1) {
Log.keepLastException ("Util::actionPerformed (action "+cmd2+" on "+object+")", e1);
}
}
});
} catch (Exception e2) {
e2.printStackTrace ();
Log.keepLastException ("Util::actionPerformed (action "+cmd+" on "+object+")", e2);
}
}
// ========================================
@SuppressWarnings("unchecked")
static public List<String> merge (List<String>... args) {
List<String> result = new ArrayList<String> ();
for (List<String> arg : args)
result.addAll (arg);
return result;
}
// ========================================
// static public File checkExt (File file, String ext) {
// try {
// String fileExt = file.getName ();
// fileExt = fileExt.substring (fileExt.lastIndexOf (".")).toLowerCase ();
// if (ext.toLowerCase ().equals (fileExt))
// return file;
// } catch (Exception e) {
// }
// return new File (file.getParent (), file.getName ()+ext);
// }
static public String getExtention (File file) {
return getExtention (file.getName ());
}
static public String getExtention (String filename) {
try {
filename = filename.substring (filename.lastIndexOf (".")).toLowerCase ();
return filename.substring (1);
} catch (Exception e) {
return null;
}
}
static public String getBase (File file) {
return getBase (file.getName ());
}
static public String getBase (String filename) {
try {
return filename.substring (0, filename.lastIndexOf ("."));
} catch (Exception e) {
return filename;
}
}
static public String changeExtention (String filename, String extention) {
try {
return filename.substring (0, filename.lastIndexOf ("."))+"."+extention;
} catch (Exception e) {
return filename+"."+extention;
}
}
// ========================================
static public void backup (File file, String extention, String backExtention) {
if (!file.exists ())
return;
String newFileName = file.getName ();
if (newFileName.endsWith ("."+extention))
newFileName = newFileName.substring (0, newFileName.length () - ("."+extention).length ());
File backFile = new File (file.getParent (), newFileName+"."+backExtention);
backFile.delete ();
try {
Files.move (file.toPath (), backFile.toPath (), StandardCopyOption.REPLACE_EXISTING);
} catch (Exception e) {
}
}
// ========================================
static public void copy (InputStream src, OutputStream dst, byte[] tmp, ProgressState progressState)
throws IOException {
copy (src, dst, tmp, progressState, true, true);
}
static public void copy (InputStream src, OutputStream dst, byte[] tmp, ProgressState progressState, boolean srcClose, boolean dstClose)
throws IOException {
try {
if (tmp == null)
tmp = new byte[bufSize];
for (;;) {
if (progressState != null && progressState.isInterrupted ())
return;
int nbRead = src.read (tmp, 0, tmp.length);
if (nbRead < 0)
break;
dst.write (tmp, 0, nbRead);
if (progressState != null && !progressState.addValue (nbRead))
return;
}
} finally {
dst.flush ();
try {
if (dstClose)
dst.close ();
if (srcClose)
src.close ();
} catch (Exception e) {
}
}
}
// ========================================
static public final String ctrlName (String s) {
return s.replaceAll ("[^0-9a-zA-Z_\\-.]", "");
}
// ========================================
static public final String toCapital (final String s) {
return s.substring (0, 1).toUpperCase ()+s.substring (1).toLowerCase ();
}
static public final<T> boolean containsOne (Collection<T> set1, Collection<T> set2) {
try {
if (set1.size () > set2.size ()) {
Collection<T> tmp = set1;
set1 = set2;
set2 = tmp;
}
for (T e : set1)
if (set2.contains (e))
return true;
} catch (Exception e) {
}
return false;
}
static public final boolean containsPart (String subString, Collection<String> set) {
if (set == null)
return false;
for (String s : set)
if (s.indexOf (subString) >= 0)
return true;
return false;
}
// ========================================
@SuppressWarnings("rawtypes")
static public final String getClassName (final Class aClass) {
String[] path = aClass.getName ().split ("\\.");
return path [path.length-1];
}
// ========================================
/**
retourne vrai si s1 existe et est égale à s2
*/
static public boolean cmp (String s1, String s2) {
return (s1 == s2) || ((s1 != null) && (s1.equals (s2)));
}
// ========================================
static int max (int... values) {
int result = 0;
for (int val : values)
result = Math.max (result, val);
return result;
}
// ========================================
static public void sleep (int s) {
try {
Thread.sleep (s*1000);
} catch (InterruptedException e) {
}
}
// ========================================
static public void deciSleep (int s) {
try {
Thread.sleep (s*100);
} catch (InterruptedException e) {
}
}
// ========================================
static private String convertToHex (byte[] data) {
StringBuffer buf = new StringBuffer ();
for (int i = 0; i < data.length; i++) {
int halfbyte = (data[i] >>> 4) & 0x0F;
int two_halfs = 0;
do {
if ((0 <= halfbyte) && (halfbyte <= 9))
buf.append ((char) ('0' + halfbyte));
else
buf.append ((char) ('a' + (halfbyte - 10)));
halfbyte = data[i] & 0x0F;
} while (two_halfs++ < 1);
}
return buf.toString ();
}
public static String removeAccent (String source) {
return Normalizer.normalize (source, Normalizer.Form.NFD).replaceAll ("[\u0300-\u036F]", "");
}
static public String sha1 (String text)
throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest md;
md = MessageDigest.getInstance ("SHA-1");
byte[] sha1hash = new byte[40];
md.update (text.getBytes ("iso-8859-1"), 0, text.length ());
sha1hash = md.digest ();
return convertToHex (sha1hash);
}
// ========================================
}