001 package nl.cwi.sen1.gui.plugin;
002
003 import java.io.File;
004
005 import javax.swing.JFileChooser;
006 import javax.swing.JOptionPane;
007 import javax.swing.SwingUtilities;
008 import javax.swing.filechooser.FileFilter;
009
010 import nl.cwi.sen1.configapi.Factory;
011 import nl.cwi.sen1.gui.Studio;
012 import nl.cwi.sen1.gui.StudioImpl;
013 import aterm.ATerm;
014 import aterm.ATermList;
015
016 public class Dialog extends DefaultStudioPlugin implements DialogTif {
017 private static final String WORKING_DIRECTORY = "user.dir";
018
019 private static final String TOOL_NAME = "dialog";
020
021 private Studio studio;
022
023 private Factory factory;
024
025 private ProgressList progressList;
026
027 private JFileChooser sharedChooser;
028 private FileFilter sharedFilter;
029
030 public Dialog() {
031 sharedChooser = new JFileChooser(System.getProperty(WORKING_DIRECTORY));
032 }
033
034 public String getName() {
035 return TOOL_NAME;
036 }
037
038 public void initStudioPlugin(Studio studio) {
039 this.studio = studio;
040 DialogBridge bridge = new DialogBridge(studio.getATermFactory(), this);
041 factory = Factory.getInstance((aterm.pure.PureFactory) studio
042 .getATermFactory());
043 studio.connect(getName(), bridge);
044 }
045
046 public ATerm showDirectoryDialog(String title, ATerm paths) {
047 JFileChooser chooser = sharedChooser;
048
049 if (!((ATermList) paths).isEmpty()) {
050 DialogFileSystemView fsv = new DialogFileSystemView(factory
051 .PropertyListFromTerm(paths));
052 chooser = new JFileChooser(fsv);
053 chooser.setFileView(new DialogFileView(fsv));
054 }
055 chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
056
057 chooser.setSelectedFile(new File(""));
058 if (chooser.showDialog(StudioImpl.getFrame(), title) == JFileChooser.APPROVE_OPTION) {
059 String path = chooser.getSelectedFile().getAbsolutePath();
060 return studio.getATermFactory().make(
061 "snd-value(directory-dialog-approve(<str>))", path);
062 }
063 return studio.getATermFactory().make(
064 "snd-value(directory-dialog-cancel)");
065 }
066
067 public ATerm showFileDialog(String title, ATerm paths,
068 final String extension) {
069 JFileChooser chooser = sharedChooser;
070
071 if (!((ATermList) paths).isEmpty()) {
072 DialogFileSystemView fsv = new DialogFileSystemView(factory
073 .PropertyListFromTerm(paths));
074 chooser = new JFileChooser(fsv);
075 chooser.setFileView(new DialogFileView(fsv));
076 }
077
078 chooser.removeChoosableFileFilter(sharedFilter);
079 sharedFilter = new FileFilter() {
080 public boolean accept(File file) {
081 if (file.isDirectory()) {
082 return true;
083 }
084
085 String filename = file.getName();
086 return filename.endsWith(extension);
087 }
088
089 public String getDescription() {
090 return "*" + extension;
091 }
092 };
093
094 chooser.setSelectedFile(new File(""));
095 chooser.addChoosableFileFilter(sharedFilter);
096
097 if (chooser.showDialog(StudioImpl.getFrame(), title) == JFileChooser.APPROVE_OPTION) {
098 File file = chooser.getSelectedFile();
099
100 String path = buildSelectedFile(file, extension);
101 return studio.getATermFactory().make(
102 "snd-value(file-dialog-approve(<str>))", path);
103 }
104 return studio.getATermFactory().make("snd-value(file-dialog-cancel)");
105 }
106
107 private String buildSelectedFile(File file, String extension) {
108 String path = file.getAbsolutePath();
109 String last = file.getName();
110
111 if (last.lastIndexOf('.') == -1) {
112 /* no extension */
113 path = path.concat(extension.startsWith(".") ? extension : ("." + extension));
114 }
115 else if (last.endsWith(".")) {
116 /* file ends in . */
117 path = path.concat(extension.startsWith(".") ? extension.substring(1) : extension);
118 }
119
120 return path;
121 }
122
123 public void recTerminate(ATerm t0) {
124 fireStudioPluginClosed();
125 }
126
127 public void showProgressMessage(String message) {
128 if (progressList != null) {
129 progressList.addMessage(message);
130 }
131 }
132
133 public void showProgressList(final String title) {
134 progressList = new ProgressList(StudioImpl.getFrame(), title, true);
135 SwingUtilities.invokeLater(new Runnable() {
136 public void run() {
137 progressList.setVisible(true);
138 }
139 });
140 }
141
142 public void closeProgressList() {
143 if (progressList != null) {
144 progressList.dispose();
145 }
146 }
147
148 public void showProgressMessageWithArguments(String format, ATerm args) {
149 String message = StringFormatter.format(format, (ATermList) args);
150 if (progressList != null) {
151 progressList.addMessage(message);
152 }
153 }
154
155 public ATerm showQuestionDialog(String question) {
156 int choice = JOptionPane.showConfirmDialog(StudioImpl.getFrame(), question);
157
158 if (choice == JOptionPane.YES_OPTION) {
159 return studio.getATermFactory().make("snd-value(answer(yes))");
160 }
161 if (choice == JOptionPane.NO_OPTION) {
162 return studio.getATermFactory().make("snd-value(answer(no))");
163 }
164
165 return studio.getATermFactory().make("snd-value(answer(cancel))");
166 }
167
168 public void showMessageDialog(String message) {
169 JOptionPane.showMessageDialog(StudioImpl.getFrame(), message, "Info",
170 JOptionPane.INFORMATION_MESSAGE);
171 }
172
173 public void showErrorDialog(String errorMessage) {
174 if (progressList != null) {
175 progressList.dispose();
176 }
177 JOptionPane.showMessageDialog(StudioImpl.getFrame(), errorMessage, "Error",
178 JOptionPane.ERROR_MESSAGE);
179 }
180
181 public void showErrorDialogWithArguments(String errorMessage, ATerm args) {
182 String message = StringFormatter.format(errorMessage, (ATermList) args);
183 if (progressList != null) {
184 progressList.dispose();
185 }
186 JOptionPane.showMessageDialog(StudioImpl.getFrame(), message, "Error",
187 JOptionPane.ERROR_MESSAGE);
188 }
189 }