package open.dolphin.client;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.EventHandler;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import open.dolphin.helper.ComponentMemory;
/**
* ImageBox
*
* @author Minagawa,Kazushi
*/
public class ImageBox extends AbstractMainTool {
private static final int DEFAULT_COLUMN_COUNT = 3;
private static final int DEFAULT_IMAGE_WIDTH = 120;
private static final int DEFAULT_IMAGE_HEIGHT = 120;
private static final String[] DEFAULT_IMAGE_SUFFIX = {".jpg"};
private String imageLocation;
private JTabbedPane tabbedPane;
private JButton refreshBtn;
private int columnCount = DEFAULT_COLUMN_COUNT;
private int imageWidth = DEFAULT_IMAGE_WIDTH;
private int imageHeight = DEFAULT_IMAGE_HEIGHT;
private String[] suffix = DEFAULT_IMAGE_SUFFIX;
private final int defaultWidth = 406;
private final int defaultHeight = 587;
private final int defaultLocX = 537;
private final int defaultLocY = 22;
private JDialog frame;
private int systemSchemaIndex;
@Override
public void start() {
initComponent();
connect();
if (! frame.isVisible()) {
frame.setVisible(true);
}
setImageLocation(ClientContext.getSchemaDirectory());
}
@Override
public void stop() {
if (tabbedPane != null) {
int cnt = tabbedPane.getTabCount();
for (int i = 0; i < cnt; i++) {
ImagePalette ip = (ImagePalette) tabbedPane.getComponentAt(i);
if (ip != null) {
ip.dispose();
}
}
}
frame.setVisible(false);
frame.dispose();
}
public JFrame getFrame() {
//return frame;
return null;
}
public void toFront() {
if (frame != null) {
if (!frame.isVisible()) {
frame.setVisible(true);
}
frame.toFront();
}
}
public String getImageLocation() {
return imageLocation;
}
public void setImageLocation(String loc) {
this.imageLocation = loc;
SwingWorker worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
createImagePalettes();
return null;
}
@Override
protected void done() {
try {
get();
tabbedPane.addChangeListener((ChangeEvent ce) -> {
Component cmp = tabbedPane.getSelectedComponent();
if (cmp==null) {
ImagePalette sysTable = new ImagePalette(null, columnCount, imageWidth, imageHeight);
sysTable.setupDefaultSchema();
tabbedPane.setComponentAt(systemSchemaIndex, sysTable);
}
});
} catch (InterruptedException | ExecutionException ex) {
ex.printStackTrace(System.err);
}
}
};
worker.execute();
}
public void refresh() {
final ImagePalette imageTable = (ImagePalette) tabbedPane.getSelectedComponent();
SwingWorker worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
imageTable.refresh();
return null;
}
@Override
protected void done() {
try {
get();
if (! frame.isVisible()) {
frame.setVisible(true);
}
} catch (InterruptedException | ExecutionException ex) {
ex.printStackTrace(System.err);
}
}
};
worker.execute();
}
private void initComponent() {
// TabbedPane を生成する
tabbedPane = new JTabbedPane();
java.util.ResourceBundle bundle = ClientContext.getMyBundle(ImageBox.class);
// 更新ボタンを生成する
refreshBtn = new JButton(ClientContext.getImageIconArias("icon_refresh"));
refreshBtn.addActionListener((ActionListener) EventHandler.create(ActionListener.class, this, "refresh"));
String toolTipText = bundle.getString("toolTipText.refresh");
refreshBtn.setToolTipText(toolTipText);
JPanel btnPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
btnPanel.add(refreshBtn);
// 全体を配置する
JPanel p = new JPanel(new BorderLayout());
p.add(btnPanel, BorderLayout.NORTH);
p.add(tabbedPane, BorderLayout.CENTER);
p.setBorder(BorderFactory.createEmptyBorder(12,12,11,11));
String title = bundle.getString("title.window");
frame = new JDialog((JFrame) null, title, false);
ComponentMemory cm = new ComponentMemory(frame,
new Point(defaultLocX,defaultLocY),
new Dimension(defaultWidth, defaultHeight),
this);
cm.setToPreferenceBounds();
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
processWindowClosing();
}
});
frame.getContentPane().add(p);
}
private void connect() {
}
public void createImagePalettes() {
Path imageDir = Paths.get(imageLocation);
if ( (!Files.exists(imageDir)) || (!Files.isDirectory(imageDir)) ) {
return;
}
final java.util.List<Path> paths = new ArrayList<>();
try {
DirectoryStream<Path> ds = Files.newDirectoryStream(imageDir);
for (Path p : ds) {
if (Files.isDirectory(p)) {
paths.add(p);
}
}
} catch (Exception e) {
}
String defaultTab = ClientContext.getMyBundle(ImageBox.class).getString("title.basicSetTab");
if (!paths.isEmpty()) {
paths.stream().forEach((path) -> {
String tabName = path.getFileName().toString();
ImagePalette imageTable = new ImagePalette(null, columnCount, imageWidth, imageHeight);
imageTable.setImageSuffix(suffix);
imageTable.setImageDirectory(path); // refresh
tabbedPane.addTab(tabName, imageTable);
});
systemSchemaIndex = paths.size();
tabbedPane.addTab(defaultTab, null);
}
if (systemSchemaIndex==0) {
ImagePalette sysTable = new ImagePalette(null, columnCount, imageWidth, imageHeight);
sysTable.setupDefaultSchema();
tabbedPane.addTab(defaultTab, sysTable);
}
}
public void processWindowClosing() {
stop();
}
/**
* @param columnCount The columnCount to set.
*/
public void setColumnCount(int columnCount) {
this.columnCount = columnCount;
}
/**
* @return Returns the columnCount.
*/
public int getColumnCount() {
return columnCount;
}
/**
* @param imageWidth The imageWidth to set.
*/
public void setImageWidth(int imageWidth) {
this.imageWidth = imageWidth;
}
/**
* @return Returns the imageWidth.
*/
public int getImageWidth() {
return imageWidth;
}
/**
* @param imageHeight The imageHeight to set.
*/
public void setImageHeight(int imageHeight) {
this.imageHeight = imageHeight;
}
/**
* @return Returns the imageHeight.
*/
public int getImageHeight() {
return imageHeight;
}
/**
* @param suffix The suffix to set.
*/
public void setSuffix(String[] suffix) {
this.suffix = suffix;
}
/**
* @return Returns the suffix.
*/
public String[] getSuffix() {
return suffix;
}
}