- package osm.surveyor.matchtime.gui;
- import java.awt.Window;
- import java.awt.event.ActionEvent;
- import java.io.File;
- import java.io.IOException;
- import java.text.DateFormat;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import javax.swing.ButtonGroup;
- import javax.swing.JButton;
- import javax.swing.JRadioButton;
- import org.apache.commons.imaging.ImageReadException;
- import org.apache.commons.imaging.Imaging;
- import org.apache.commons.imaging.common.ImageMetadata;
- import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
- import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
- import org.apache.commons.imaging.formats.tiff.constants.ExifTagConstants;
- import osm.surveyor.matchtime.Restamp;
- import static osm.surveyor.matchtime.gui.ReStamp.dfjp;
- import osm.surveyor.matchtime.gui.restamp.DialogCorectTime;
- /**
- * パラメータを設定する為のパネル。
- * この1インスタンスで、1パラメータをあらわす。
- */
- public class ParameterPanelTime extends ParameterPanel {
- private static final long serialVersionUID = 9118495619374256843L;
- SimpleDateFormat sdf = (SimpleDateFormat)DateFormat.getDateTimeInstance();
- ParameterPanelImageFile imageFile; // 基準時刻画像
- // 基準時刻の指定グループ (排他選択)
- public ButtonGroup baseTimeGroup = new ButtonGroup();
- public JRadioButton exifBase = null; // EXIF日時を基準にする/ !(ファイル更新日時を基準にする)
- public JRadioButton fupdateBase = null; // File更新日時を基準にする/ !(EXIF日時を基準にする)
- public JButton updateButton;
- public JButton resetButton;
- Window owner;
- public ParameterPanelTime(
- String label,
- String text,
- ParameterPanelImageFile imageFile
- ) {
- super(label, text);
- this.imageFile = imageFile;
- // "ボタン[変更...]"
- UpdateButtonAction buttonAction = new UpdateButtonAction(this);
- updateButton = new JButton(i18n.getString("button.update"));
- updateButton.addActionListener(buttonAction);
- this.add(updateButton);
- // "ボタン[再設定...]"
- ResetButtonAction resetAction = new ResetButtonAction(this);
- resetButton = new JButton(i18n.getString("button.reset"));
- resetButton.addActionListener(resetAction);
- resetButton.setVisible(false);
- this.add(resetButton);
- }
- public ParameterPanelTime setOwner(Window owner) {
- this.owner = owner;
- return this;
- }
- public ParameterPanelImageFile getImageFile() {
- return this.imageFile;
- }
- /**
- * [変更...]ボタンのアクション
- */
- class UpdateButtonAction implements java.awt.event.ActionListener
- {
- ParameterPanelTime param;
- public UpdateButtonAction(ParameterPanelTime param) {
- this.param = param;
- }
- public void actionPerformed(ActionEvent e) {
- fileSelect_Action(param);
- (new DialogCorectTime(param, owner)).setVisible(true);
- }
- }
- /**
- * [再設定...]ボタンのアクション
- */
- class ResetButtonAction implements java.awt.event.ActionListener
- {
- ParameterPanelTime paramPanelTime;
- public ResetButtonAction(ParameterPanelTime param) {
- this.paramPanelTime = param;
- }
- public void actionPerformed(ActionEvent e) {
- fileSelect_Action(paramPanelTime);
- }
- }
- /**
- * 画像ファイルが選択されたときのアクション
- * 1.ラジオボタンの選択を参照してTEXTフィールドにファイルの「日時」を設定する
- * @param param
- */
- void fileSelect_Action(ParameterPanelTime param) {
- if (imageFile.isEnable()) {
- File timeFile = imageFile.getImageFile();
- // Radio Selecter
- sdf.applyPattern(Restamp.TIME_PATTERN);
- if ((exifBase != null) && exifBase.isSelected()) {
- try {
- ImageMetadata meta = Imaging.getMetadata(timeFile);
- JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;
- if (jpegMetadata != null) {
- TiffImageMetadata exif = jpegMetadata.getExif();
- if (exif != null) {
- String dateTimeOriginal = exif.getFieldValue(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL)[0];
- long lastModifyTime = sdf.parse(dateTimeOriginal).getTime();
- param.argField.setText(dfjp.format(new Date(lastModifyTime)));
- }
- else {
- param.argField.setText("exif == null");
- }
- }
- }
- catch (IOException | ParseException | ImageReadException ex) {}
- }
- else {
- long lastModified = timeFile.lastModified();
- param.argField.setText(sdf.format(new Date(lastModified)));
- }
- }
- else {
- param.argField.setText("");
- }
- }
- @Override
- public boolean isEnable() {
- if (this.imageFile.isEnable()) {
- String text = this.argField.getText();
- if (text != null) {
- try {
- sdf.applyPattern(Restamp.TIME_PATTERN);
- sdf.parse(text);
- return true;
- }
- catch (ParseException e) {
- return false;
- }
- }
- }
- return false;
- }
- }