Files
ReplayModCinematic/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiFileChooser.java

137 lines
4.5 KiB
Java

package eu.crushedpixel.replaymod.gui.elements;
import eu.crushedpixel.replaymod.gui.elements.listeners.FileChooseListener;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.client.Minecraft;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class GuiFileChooser extends GuiAdvancedButton implements GuiOutsideClickableElement {
private final Minecraft mc = Minecraft.getMinecraft();
private final JFrame jFrame = new JFrame();
@Getter
private File selectedFile;
public void setSelectedFile(File selectedFile) {
this.selectedFile = selectedFile;
updateDisplayString();
}
protected String baseString;
private boolean save = false;
@Setter
private String[] allowedExtensions = null;
private List<FileChooseListener> listeners = new ArrayList<FileChooseListener>();
public GuiFileChooser(int buttonId, int x, int y, String buttonText, File selectedFile, String[] allowedExtensions) {
this(buttonId, x, y, buttonText, selectedFile, allowedExtensions, false);
}
public GuiFileChooser(int buttonId, int x, int y, String buttonText, File selectedFile, String[] allowedExtensions, boolean save) {
super(buttonId, x, y, buttonText);
this.selectedFile = selectedFile;
this.save = save;
this.baseString = buttonText;
updateDisplayString();
this.allowedExtensions = allowedExtensions;
}
public void addFileChooseListener(FileChooseListener listener) {
this.listeners.add(listener);
}
protected void updateDisplayString() {
this.displayString = baseString + (selectedFile == null ? "-" : selectedFile.getName());
}
@Override
public void performAction() {
new Thread(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch(Exception e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFileChooser fileChooser = new JFileChooser();
StringBuilder sb = new StringBuilder();
int i = 0;
for(String extension : allowedExtensions) {
sb.append(".").append(extension);
if(i < allowedExtensions.length - 1) sb.append(",");
i++;
}
fileChooser.setFileFilter(new FileNameExtensionFilter(sb.toString(), allowedExtensions));
if(selectedFile != null) {
fileChooser.setCurrentDirectory(selectedFile.getParentFile());
fileChooser.setSelectedFile(selectedFile);
}
fileChooser.setVisible(true);
mc.addScheduledTask(new Runnable() {
@Override
public void run() {
if(mc.isFullScreen()) mc.toggleFullscreen();
mc.setIngameNotInFocus();
}
});
int result;
if(save) {
result = fileChooser.showSaveDialog(jFrame);
} else {
result = fileChooser.showOpenDialog(jFrame);
}
if(result == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
if(file != null) {
selectedFile = file;
updateDisplayString();
for(FileChooseListener listener : listeners) {
listener.onFileChosen(selectedFile);
}
}
}
fileChooser.invalidate();
}
});
}
}, "replaymod-file-chooser").start();
}
@Override
protected void finalize() throws Throwable {
jFrame.dispose();
super.finalize();
}
}