com.cfsoft.ofbiz.facet.ui.ComponentFileSetConfigurationTab.java Source code

Java tutorial

Introduction

Here is the source code for com.cfsoft.ofbiz.facet.ui.ComponentFileSetConfigurationTab.java

Source

/*
 * Copyright 2011 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.cfsoft.ofbiz.facet.ui;

import com.cfsoft.ofbiz.OfbizIcons;
import com.cfsoft.ofbiz.facet.OfbizFacetConfiguration;
import com.intellij.facet.ui.FacetEditorContext;
import com.intellij.facet.ui.FacetEditorTab;
import com.intellij.ide.projectView.PresentationData;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.pointers.VirtualFilePointer;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.ui.treeStructure.*;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultTreeModel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

/**
 * Struts2 facet tab "File Sets".
 *
 * @author Yann Cébron
 */
public class ComponentFileSetConfigurationTab extends FacetEditorTab implements Disposable {

    // GUI components -----------------------
    private JPanel myPanel;
    private SimpleTree myTree;
    private JButton myAddSetButton;
    private JButton myRemoveButton;
    private JButton myEditButton;

    // GUI helpers
    private final SimpleTreeBuilder myBuilder;
    private final SimpleNode myRootNode = new SimpleNode() {
        public SimpleNode[] getChildren() {
            final List<SimpleNode> nodes = new ArrayList<SimpleNode>(myBuffer.size());
            for (final OfbizFileSet entry : myBuffer) {
                if (!entry.isRemoved()) {
                    final FileSetNode setNode = new FileSetNode(entry);
                    nodes.add(setNode);
                }
            }
            return ArrayUtil.toObjectArray(nodes, SimpleNode.class);
        }

        public boolean isAutoExpandNode() {
            return true;
        }

    };

    private final OfbizConfigsSercher myConfigsSercher;

    // original config
    private final OfbizFacetConfiguration originalConfiguration;
    private final Module module;

    // local config
    private final Set<OfbizFileSet> myBuffer = new LinkedHashSet<OfbizFileSet>();
    private boolean myModified;

    public ComponentFileSetConfigurationTab(@NotNull final OfbizFacetConfiguration strutsFacetConfiguration,
            @NotNull final FacetEditorContext facetEditorContext) {
        originalConfiguration = strutsFacetConfiguration;
        module = facetEditorContext.getModule();
        myConfigsSercher = new OfbizComponentConfigsSearcher(module);

        // init tree
        final SimpleTreeStructure structure = new SimpleTreeStructure() {
            public Object getRootElement() {
                return myRootNode;
            }
        };
        myTree.setRootVisible(false);
        myTree.setShowsRootHandles(true); // show expand/collapse handles
        myBuilder = new SimpleTreeBuilder(myTree, (DefaultTreeModel) myTree.getModel(), structure, null);
        myBuilder.initRoot();

        final DumbService dumbService = DumbService.getInstance(facetEditorContext.getProject());
        myTree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
            public void valueChanged(final TreeSelectionEvent e) {
                final OfbizFileSet fileSet = getCurrentFileSet();
                myEditButton.setEnabled(fileSet != null && !dumbService.isDumb());
                myRemoveButton.setEnabled(fileSet != null);
            }
        });

        myAddSetButton.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                final OfbizFileSet fileSet = new OfbizFileSet(OfbizFileSet.getUniqueId(myBuffer),
                        OfbizFileSet.getUniqueName("My Component Fileset", myBuffer), originalConfiguration) {
                    public boolean isNew() {
                        return true;
                    }
                };

                final FileSetEditor editor = new FileSetEditor(myPanel, fileSet, facetEditorContext,
                        myConfigsSercher);
                editor.show();
                if (editor.getExitCode() == DialogWrapper.OK_EXIT_CODE) {
                    final OfbizFileSet editedFileSet = editor.getEditedFileSet();
                    Disposer.register(strutsFacetConfiguration, editedFileSet);
                    myBuffer.add(editedFileSet);
                    myModified = true;
                    myBuilder.updateFromRoot();
                    selectFileSet(fileSet);
                }
                myTree.requestFocus();
            }
        });

        myEditButton.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                final OfbizFileSet fileSet = getCurrentFileSet();
                if (fileSet != null) {
                    final FileSetEditor editor = new FileSetEditor(myPanel, fileSet, facetEditorContext,
                            myConfigsSercher);
                    editor.show();
                    if (editor.getExitCode() == DialogWrapper.OK_EXIT_CODE) {
                        myModified = true;
                        myBuffer.remove(fileSet);
                        final OfbizFileSet edited = editor.getEditedFileSet();
                        Disposer.register(strutsFacetConfiguration, edited);
                        myBuffer.add(edited);
                        edited.setAutodetected(false);
                        myBuilder.updateFromRoot();
                        selectFileSet(edited);
                    }
                    myTree.requestFocus();
                }
            }
        });

        myRemoveButton.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                remove();
                myModified = true;
                myBuilder.updateFromRoot();
                myTree.requestFocus();
            }
        });

        dumbService.makeDumbAware(myAddSetButton, this);
        dumbService.makeDumbAware(myEditButton, this);
    }

    @Nullable
    private OfbizFileSet getCurrentFileSet() {
        final FileSetNode currentFileSetNode = getCurrentFileSetNode();
        return currentFileSetNode == null ? null : currentFileSetNode.mySet;
    }

    @Nullable
    private FileSetNode getCurrentFileSetNode() {
        final SimpleNode selectedNode = myTree.getSelectedNode();
        if (selectedNode == null) {
            return null;
        }
        if (selectedNode instanceof FileSetNode) {
            return (FileSetNode) selectedNode;
        } else if (selectedNode.getParent() instanceof FileSetNode) {
            return (FileSetNode) selectedNode.getParent();
        } else {
            final SimpleNode parent = selectedNode.getParent();
            if (parent != null && parent.getParent() instanceof FileSetNode) {
                return (FileSetNode) selectedNode.getParent().getParent();
            }
        }
        return null;
    }

    private void selectFileSet(final OfbizFileSet fileSet) {
        myTree.select(myBuilder, new SimpleNodeVisitor() {
            public boolean accept(final SimpleNode simpleNode) {
                if (simpleNode instanceof FileSetNode) {
                    if (((FileSetNode) simpleNode).mySet.equals(fileSet)) {
                        return true;
                    }
                }
                return false;
            }
        }, false);
    }

    private void remove() {
        final SimpleNode[] nodes = myTree.getSelectedNodesIfUniform();
        for (final SimpleNode node : nodes) {

            if (node instanceof FileSetNode) {
                final OfbizFileSet fileSet = ((FileSetNode) node).mySet;
                if (fileSet.getFiles().isEmpty()) {
                    myBuffer.remove(fileSet);
                    return;
                }

                final int result = Messages.showYesNoDialog(myPanel,
                        String.format("Remove File Set '%s' ?", fileSet.getName()), "Confirm removal",
                        Messages.getQuestionIcon());
                if (result == DialogWrapper.OK_EXIT_CODE) {
                    if (fileSet.isAutodetected()) {
                        fileSet.setRemoved(true);
                        myBuffer.add(fileSet);
                    } else {
                        myBuffer.remove(fileSet);
                    }
                }
            } else if (node instanceof ConfigFileNode) {
                final VirtualFilePointer filePointer = ((ConfigFileNode) node).myFilePointer;
                final OfbizFileSet fileSet = ((FileSetNode) node.getParent()).mySet;
                fileSet.removeFile(filePointer);
            }
        }

    }

    @Nullable
    public Icon getIcon() {
        return OfbizIcons.COMPONENT_CONFIG_FILE;
    }

    @Nls
    public String getDisplayName() {
        return "My Component Fileset";
    }

    public JComponent createComponent() {
        return myPanel;
    }

    public boolean isModified() {
        return myModified;
    }

    public void apply() {
        /*    final Set<OfbizFileSet> fileSets = originalConfiguration.getComponentFileSets();
            fileSets.clear();
            for (final OfbizFileSet fileSet : myBuffer) {
              if (!fileSet.isAutodetected() || fileSet.isRemoved()) {
                fileSets.add(fileSet);
              }
            }
            originalConfiguration.setModified();*/
    }

    public void reset() {
        /*    myBuffer.clear();
            final Set<OfbizFileSet> sets = originalConfiguration.getComponentFileSets();
            for (final OfbizFileSet fileSet : sets) {
              myBuffer.add(*//*new OfbizFileSet(fileSet)*//*fileSet);
                                                           }
                                                               
                                                           myBuilder.updateFromRoot();
                                                           myTree.setSelectionRow(0);*/
    }

    public void disposeUIResources() {
        Disposer.dispose(myBuilder);
        Disposer.dispose(this);
    }

    public void dispose() {
    }

    private static class FileSetNode extends SimpleNode {

        protected final OfbizFileSet mySet;

        FileSetNode(final OfbizFileSet fileSet) {
            mySet = fileSet;

            final PresentationData presentationData = getPresentation();
            final String name = mySet.getName();

            if (fileSet.getFiles().isEmpty()) {
                presentationData.addText(name, getErrorAttributes());
                presentationData.setTooltip("No files attached");
            } else {
                presentationData.addText(name, getPlainAttributes());
                presentationData.setLocationString("" + fileSet.getFiles().size());
            }
        }

        public SimpleNode[] getChildren() {
            final List<SimpleNode> nodes = new ArrayList<SimpleNode>();

            for (final VirtualFilePointer file : mySet.getFiles()) {
                nodes.add(new ConfigFileNode(file, this));
            }
            return ArrayUtil.toObjectArray(nodes, SimpleNode.class);
        }

        public boolean isAutoExpandNode() {
            return true;
        }

        public Object[] getEqualityObjects() {
            return new Object[] { mySet, mySet.getName(), mySet.getFiles() };
        }
    }

    private static final class ConfigFileNode extends SimpleNode {

        private final VirtualFilePointer myFilePointer;

        ConfigFileNode(final VirtualFilePointer name, final SimpleNode parent) {
            super(parent);
            myFilePointer = name;
            setIcon(OfbizIcons.COMPONENT_CONFIG_FILE);

        }

        public boolean isAlwaysLeaf() {
            return true;
        }

        protected void doUpdate() {
            final VirtualFile file = myFilePointer.getFile();
            if (file != null) {
                renderFile(file, getPlainAttributes(), null);
            } else {
                renderFile(file, getErrorAttributes(), "File not found");
            }
        }

        private void renderFile(final VirtualFile file, final SimpleTextAttributes textAttributes,
                @Nullable final String toolTip) {
            final PresentationData presentation = getPresentation();
            presentation.setTooltip(toolTip);
            presentation.addText(myFilePointer.getFileName(), textAttributes);

            if (file != null) {
                presentation.setLocationString(file.getPath());
            }
        }

        public SimpleNode[] getChildren() {
            return NO_CHILDREN;
        }

    }

    @Override
    public String getHelpTopic() {
        return "reference.settings.project.structure.facets.struts2.facet";
    }

}