/*
* Copyright 2013 The authors
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.struts2.facet.ui;
import com.intellij.facet.ui.FacetEditorContext;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.pointers.VirtualFilePointer;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.struts2.StrutsBundle;
import com.intellij.ui.CheckedTreeNode;
import com.intellij.ui.DocumentAdapter;
import com.intellij.util.ui.tree.TreeModelAdapter;
import com.intellij.util.ui.tree.TreeUtil;
import com.intellij.xml.config.ConfigFilesTreeBuilder;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.TreeModelEvent;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import java.awt.*;
import java.util.List;
import java.util.Set;
public class FileSetEditor extends DialogWrapper {
private JPanel myMainPanel;
private JTextField mySetName;
private StrutsFilesTree myFilesTree;
private final StrutsFileSet myFileSet;
private final StrutsFileSet myOriginalSet;
protected FileSetEditor(final Component parent,
final StrutsFileSet fileSet,
final FacetEditorContext context,
final StrutsConfigsSearcher searcher) {
super(parent, true);
setTitle(StrutsBundle.message("facet.fileset.editor.title"));
myOriginalSet = fileSet;
myFileSet = new StrutsFileSet(fileSet);
ConfigFilesTreeBuilder builder = new ConfigFilesTreeBuilder(myFilesTree) {
@Override
protected DefaultMutableTreeNode createFileNode(Object file) {
CheckedTreeNode node = new CheckedTreeNode(file);
if (file instanceof PsiFile && myFileSet.hasFile(((PsiFile)file).getVirtualFile()) ||
file instanceof VirtualFile && myFileSet.hasFile((VirtualFile)file)) {
node.setChecked(true);
}
else {
node.setChecked(false);
}
return node;
}
};
final CheckedTreeNode myRoot = new CheckedTreeNode(null);
myFilesTree.setModel(new DefaultTreeModel(myRoot));
searcher.search();
Set<PsiFile> psiFiles = builder.buildTree(myRoot, searcher);
final PsiManager psiManager = PsiManager.getInstance(context.getProject());
final List<VirtualFilePointer> list = fileSet.getFiles();
for (VirtualFilePointer pointer : list) {
final VirtualFile file = pointer.getFile();
if (file != null) {
final PsiFile psiFile = psiManager.findFile(file);
if (psiFile != null && psiFiles.contains(psiFile)) {
continue;
}
builder.addFile(file);
}
}
TreeUtil.expandAll(myFilesTree);
myFilesTree.getModel().addTreeModelListener(new TreeModelAdapter() {
public void treeNodesChanged(final TreeModelEvent e) {
updateFileSet();
}
});
mySetName.setText(fileSet.getName());
mySetName.getDocument().addDocumentListener(new DocumentAdapter() {
@Override
protected void textChanged(DocumentEvent e) {
updateFileSet();
}
});
init();
getOKAction().setEnabled(fileSet.isNew());
}
@Nullable
protected JComponent createCenterPanel() {
return myMainPanel;
}
@NonNls
protected String getDimensionServiceKey() {
return "struts2 file set editor";
}
public boolean isOKActionEnabled() {
if (myOriginalSet.isNew()) {
return true;
}
if (StringUtil.isEmptyOrSpaces(mySetName.getText())) {
return false;
}
final int selectedFilesCount = myFileSet.getFiles().size();
if (selectedFilesCount == 0) {
return false;
}
if (selectedFilesCount != myOriginalSet.getFiles().size()) {
return true;
}
final List<VirtualFilePointer> pointers = myFileSet.getFiles();
for (int i = 0; i < pointers.size(); i++) {
if (!Comparing.equal(pointers.get(i).getUrl(), myOriginalSet.getFiles().get(i).getUrl())) {
return true;
}
}
return !Comparing.equal(myFileSet.getName(), myOriginalSet.getName());
}
protected void doOKAction() {
updateFileSet();
super.doOKAction();
}
private void updateFileSet() {
myFileSet.setName(mySetName.getText());
myFilesTree.updateFileSet(myFileSet);
getOKAction().setEnabled(isOKActionEnabled());
}
public StrutsFileSet getEditedFileSet() {
return myFileSet;
}
}