### Eclipse Workspace Patch 1.0
#P sophie
|
|
|
4 | 4 | import java.awt.Dimension; |
5 | 5 | import java.awt.Insets; |
6 | 6 | import java.io.File; |
| 7 | import java.io.IOException; |
7 | 8 | |
8 | 9 | import javax.swing.Icon; |
9 | 10 | import javax.swing.JButton; |
… |
… |
|
13 | 14 | import javax.swing.filechooser.FileFilter; |
14 | 15 | import javax.swing.filechooser.FileView; |
15 | 16 | |
| 17 | import org.sophie2.base.commons.util.OSUtil; |
16 | 18 | import org.sophie2.base.dialogs.Dialog; |
17 | 19 | import org.sophie2.base.dialogs.DialogManager; |
| 20 | import org.sophie2.core.logging.SophieLog; |
18 | 21 | import org.sophie2.main.dialogs.input.ConfirmDialogInput; |
19 | 22 | import org.sophie2.main.dialogs.input.DialogUtils; |
20 | 23 | import org.sophie2.main.dialogs.input.file.AccessoryData; |
… |
… |
|
33 | 36 | public class FileDialog extends Dialog<FileDialogInput, FileContainer> { |
34 | 37 | |
35 | 38 | private final JFileChooser fileChooser = new JFileChooser(); |
36 | | |
| 39 | |
37 | 40 | /** |
38 | 41 | * Constructs {@link FileDialog} with a specific {@link FileView}. |
39 | 42 | */ |
… |
… |
|
50 | 53 | |
51 | 54 | int selectionMode = (input.isMultiSelectEnabled()) ? |
52 | 55 | JFileChooser.FILES_AND_DIRECTORIES : JFileChooser.FILES_ONLY; |
53 | | |
| 56 | |
54 | 57 | this.fileChooser.setFileSelectionMode(selectionMode); |
55 | 58 | this.fileChooser.resetChoosableFileFilters(); |
56 | | |
| 59 | |
57 | 60 | if (input.getFileAccessory() != null) { |
58 | 61 | FileAccessory<?> accessory = input.getFileAccessory(); |
59 | 62 | accessory.setFileChooser(this.fileChooser); |
60 | | |
| 63 | |
61 | 64 | this.fileChooser.setAccessory(accessory.swingComponent().get()); |
62 | 65 | } else { |
63 | 66 | this.fileChooser.setAccessory(null); |
64 | 67 | } |
65 | | |
| 68 | |
66 | 69 | FileFilterInfo filterInfo = input.getFilterInfo(); |
67 | 70 | for (FileFilter filter : filterInfo.getFilters()) { |
68 | 71 | this.fileChooser.addChoosableFileFilter(filter); |
69 | 72 | } |
70 | | |
| 73 | |
71 | 74 | this.fileChooser.setAcceptAllFileFilterUsed(filterInfo.getUseAcceptAllFilter()); |
72 | | |
| 75 | |
73 | 76 | if (filterInfo.getFilters().size() > 0) { |
74 | 77 | this.fileChooser.setFileFilter(filterInfo.getFilters().get(0)); |
75 | 78 | } |
76 | | |
| 79 | |
77 | 80 | this.fileChooser.setSelectedFile(new File(input.getFileName())); |
78 | 81 | this.fileChooser.setMultiSelectionEnabled(input.isMultiSelectEnabled()); |
79 | 82 | |
… |
… |
|
91 | 94 | case JFileChooser.APPROVE_OPTION: |
92 | 95 | File files[] = input.isMultiSelectEnabled() ? this.fileChooser.getSelectedFiles() |
93 | 96 | : new File[] { this.fileChooser.getSelectedFile() }; |
| 97 | |
94 | 98 | if (files.length == 1 && files[0].isDirectory()) { |
95 | 99 | this.fileChooser.setCurrentDirectory(files[0]); |
96 | 100 | break; |
97 | 101 | } |
98 | | FileContainer fileContainer = peformFileCheck(input, files); |
| 102 | FileContainer fileContainer = performFileCheck(input, files); |
99 | 103 | |
100 | 104 | if (fileContainer != null) { |
101 | 105 | return fileContainer; |
… |
… |
|
111 | 115 | if (input.getFileAccessory() == null) { |
112 | 116 | return null; |
113 | 117 | } |
114 | | |
| 118 | |
115 | 119 | return input.getFileAccessory().getData(); |
116 | 120 | } |
117 | | |
118 | | private final FileContainer peformFileCheck(FileDialogInput input, File[] files) { |
| 121 | |
| 122 | private final FileContainer performFileCheck(FileDialogInput input, File[] files) { |
119 | 123 | FileDialogInput.Kind inputKind = input.getKind(); |
120 | 124 | |
121 | 125 | if (inputKind.equals(FileDialogInput.Kind.SAVE)) { |
122 | 126 | assert input.isMultiSelectEnabled() == false : "Cannot save in multiple resouces!"; |
| 127 | |
| 128 | boolean writable = true; |
| 129 | if (OSUtil.isWindows() || OSUtil.isMacOS()) { |
| 130 | try { |
| 131 | boolean created = files[0].createNewFile(); |
| 132 | if (created) { |
| 133 | files[0].delete(); |
| 134 | } |
| 135 | } catch (IOException e) { |
| 136 | SophieLog.info("File doesn't seem writable", e); |
| 137 | writable = false; |
| 138 | } |
| 139 | } else { |
| 140 | writable = files[0].getParentFile().canWrite(); |
| 141 | writable = writable || files[0].exists() && files[0].canWrite(); |
| 142 | } |
| 143 | if (!writable) { |
| 144 | DialogUtils.showErrorDialog(this.fileChooser.getParent(), |
| 145 | "You don't have permissions to write in this directory.", |
| 146 | "Permission denied"); |
| 147 | return null; |
| 148 | } |
| 149 | |
123 | 150 | if (files[0].exists()) { |
124 | 151 | ConfirmDialogInput confirmInput = new ConfirmDialogInput(this.fileChooser |
125 | 152 | .getParent(), |
… |
… |
|
145 | 172 | // things. The buttons are the ones that display |
146 | 173 | // folder, home, details list and other icons. |
147 | 174 | JComponent buttonsComboBox = (JComponent) upperPanel.getComponent(0); |
148 | | // buttonsComboBox.setPreferredSize(new Dimention(30)) |
| 175 | // buttonsComboBox.setPreferredSize(new Dimention(30)) |
149 | 176 | for (Component c : buttonsComboBox.getComponents()) { |
150 | 177 | if (c instanceof JButton) { |
151 | 178 | JButton button = (JButton) c; |
… |
… |
|
185 | 212 | Icon icon = null; |
186 | 213 | |
187 | 214 | FileIconProvider provider = FileFunctionalityModule.get() |
188 | | .getFileIconProviderPoint().getProvider(file); |
| 215 | .getFileIconProviderPoint().getProvider(file); |
189 | 216 | |
190 | 217 | if (provider != null) { |
191 | 218 | icon = provider.getIcon(file); |