7bd17500ab7e56f3493c47d85519b5cf721b05b1
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / fileChooser / ex / FileSaverDialogImpl.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.fileChooser.ex;
17
18 import com.intellij.openapi.fileChooser.FileSystemTree;
19 import com.intellij.openapi.fileChooser.FileSaverDescriptor;
20 import com.intellij.openapi.fileChooser.FileSaverDialog;
21 import com.intellij.openapi.project.Project;
22 import com.intellij.openapi.vfs.VirtualFile;
23 import com.intellij.openapi.vfs.VirtualFileWrapper;
24 import com.intellij.ui.DocumentAdapter;
25 import com.intellij.ui.UIBundle;
26 import org.jetbrains.annotations.Nullable;
27
28 import javax.swing.*;
29 import javax.swing.event.DocumentEvent;
30 import java.awt.*;
31 import java.io.File;
32 import java.util.List;
33
34 /**
35  * @author Konstantin Bulenkov
36  */
37 public class FileSaverDialogImpl extends FileChooserDialogImpl implements FileSaverDialog {
38   protected final JTextField myFileName = new JTextField(20);
39   protected final JComboBox myExtentions = new JComboBox();
40   protected final FileSaverDescriptor myDescriptor;
41
42   public FileSaverDialogImpl(FileSaverDescriptor chooserDescriptor, Project project) {
43     super(chooserDescriptor, project);
44     myDescriptor = chooserDescriptor;
45     setTitle(UIBundle.message("file.chooser.save.dialog.default.title"));
46     for (String ext : chooserDescriptor.getFileExtensions()) {
47       myExtentions.addItem(ext);
48     }
49   }
50
51   @Nullable
52   public VirtualFileWrapper save(@Nullable VirtualFile baseDir, @Nullable String filename) {
53     init();
54     myFileSystemTree.addListener(new FileSystemTree.Listener() {
55       public void selectionChanged(final List<VirtualFile> selection) {
56         updateFileName(selection);
57         updateOkButton();
58       }
59     }, myDisposable);
60
61     if (filename != null) {
62       myFileName.setText(filename);
63     }
64
65     if (baseDir != null && baseDir.isValid() && baseDir.isDirectory()) {
66       myFileSystemTree.select(baseDir, null);
67     }
68
69     show();
70
71     if (getExitCode() == OK_EXIT_CODE) {
72       final File file = getFile();
73       return file == null ? null : new VirtualFileWrapper(file);
74     }
75     return null;
76   }
77
78   @Nullable
79   protected File getFile() {
80     final VirtualFile selected = myFileSystemTree.getSelectedFile();
81     if (selected != null && !selected.isDirectory()) {
82       return new File(selected.getPath());
83     }
84
85     String path = (selected == null) ? myPathTextField.getTextFieldText() : selected.getPath();
86     final File dir = new File(path);
87     if (! dir.exists() || path == null) return null;
88     if (dir.isDirectory()) {
89       path += File.separator + myFileName.getText();
90     }
91
92     boolean correctExt = true;
93     for (String ext : myDescriptor.getFileExtensions()) {
94       correctExt = path.endsWith("." + ext);
95       if (correctExt) break;
96     }
97
98     if (!correctExt) {
99       path += "." + myExtentions.getSelectedItem();
100     }
101
102     return new File(path);
103   }
104
105   private void updateFileName(List<VirtualFile> selection) {
106     for (VirtualFile file : selection) {
107       if (file.isDirectory()) {
108         myPathTextField.getField().setText(file.getPath());
109       } else {
110         myFileName.setText(file.getName());
111         final VirtualFile parent = file.getParent();
112         if (parent != null) {
113           myPathTextField.getField().setText(parent.getPath());
114         }
115       }
116     }
117     updateOkButton();
118   }
119
120   @Override
121   protected JComponent createCenterPanel() {
122     JComponent component =  super.createCenterPanel();
123     MyPanel panel = new MyPanel();
124     panel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
125     panel.add(component, BorderLayout.CENTER);
126     panel.add(createFileNamePanel(), BorderLayout.SOUTH);
127     return panel;
128   }
129
130   protected JComponent createFileNamePanel() {
131     final JPanel panel = new JPanel(new BorderLayout());
132     panel.add(new JLabel(UIBundle.message("file.chooser.save.dialog.file.name")), BorderLayout.WEST);
133     myFileName.setText("");
134     myFileName.getDocument().addDocumentListener(new DocumentAdapter() {
135       protected void textChanged(DocumentEvent e) {
136         updateOkButton();
137       }
138     });
139
140     panel.add(myFileName, BorderLayout.CENTER);
141     if (myExtentions.getModel().getSize() > 0) {
142       myExtentions.setSelectedIndex(0);
143       panel.add(myExtentions, BorderLayout.EAST);
144     }
145     return panel;
146   }
147
148   private boolean isFileNameExist() {
149     if (myPathTextField == null) return false;
150     final String path = myPathTextField.getTextFieldText();
151     return path != null && new File(path.trim()).exists() && myFileName.getText().trim().length() > 0;
152   }
153
154   protected void updateOkButton() {
155     setOKActionEnabled(true);
156   }
157
158   @Override
159   protected void setOKActionEnabled(boolean isEnabled) {
160     //double check. FileChooserFactoryImpl sets enable ok button 
161     super.setOKActionEnabled(isFileNameExist());
162   }
163 }