com.intellij.struts2.facet.ui.FileSetEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.intellij.struts2.facet.ui.FileSetEditor.java

Source

/*
 * 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;
    }
}