ui: insets around facet validator component
[idea/community.git] / platform / lang-impl / src / com / intellij / facet / impl / ui / FacetErrorPanel.java
1 /*
2  * Copyright 2000-2014 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.facet.impl.ui;
17
18 import com.intellij.facet.ui.FacetConfigurationQuickFix;
19 import com.intellij.facet.ui.FacetEditorValidator;
20 import com.intellij.facet.ui.FacetValidatorsManager;
21 import com.intellij.facet.ui.ValidationResult;
22 import com.intellij.icons.AllIcons;
23 import com.intellij.ide.IdeBundle;
24 import com.intellij.ui.UserActivityListener;
25 import com.intellij.ui.UserActivityWatcher;
26 import com.intellij.util.containers.ContainerUtil;
27 import com.intellij.xml.util.XmlStringUtil;
28 import org.jetbrains.annotations.NotNull;
29
30 import javax.swing.*;
31 import java.awt.*;
32 import java.awt.event.ActionEvent;
33 import java.awt.event.ActionListener;
34 import java.util.ArrayList;
35 import java.util.List;
36
37 /**
38  * @author nik
39  */
40 public class FacetErrorPanel {
41   private final JPanel myMainPanel;
42   private JPanel myButtonPanel;
43   private JButton myQuickFixButton;
44   private FacetConfigurationQuickFix myCurrentQuickFix;
45   private final JLabel myWarningLabel;
46   private final FacetValidatorsManagerImpl myValidatorsManager;
47   private boolean myNoErrors = true;
48   private final List<Runnable> myListeners = ContainerUtil.createLockFreeCopyOnWriteList();
49
50   public FacetErrorPanel() {
51     myValidatorsManager = new FacetValidatorsManagerImpl();
52     myWarningLabel = new JLabel();
53     myWarningLabel.setIcon(AllIcons.General.WarningDialog);
54     myWarningLabel.setIconTextGap(5);
55     myQuickFixButton.addActionListener(new ActionListener() {
56       @Override
57       public void actionPerformed(@NotNull ActionEvent e) {
58         if (myCurrentQuickFix != null) {
59           myCurrentQuickFix.run(myQuickFixButton);
60           myValidatorsManager.validate();
61         }
62       }
63     });
64     myMainPanel = new JPanel(new BorderLayout());
65     myMainPanel.add(BorderLayout.EAST, myButtonPanel);
66     myMainPanel.add(BorderLayout.CENTER, myWarningLabel);
67     setNoErrors();
68   }
69
70   public void addListener(Runnable listener) {
71     myListeners.add(listener);
72   }
73
74   private void changeValidity(final boolean noErrors) {
75     myNoErrors = noErrors;
76     for (Runnable listener : myListeners) {
77       listener.run();
78     }
79   }
80
81   private void setNoErrors() {
82     myMainPanel.setVisible(false);
83     myWarningLabel.setVisible(false);
84     myQuickFixButton.setVisible(false);
85     changeValidity(true);
86   }
87
88   public void disposeUIResources() {
89     myCurrentQuickFix = null;
90   }
91
92   public JComponent getComponent() {
93     return myMainPanel;
94   }
95
96   public boolean isOk() {
97     return myNoErrors;
98   }
99
100   @NotNull
101   public FacetValidatorsManager getValidatorsManager() {
102     return myValidatorsManager;
103   }
104
105   private class FacetValidatorsManagerImpl implements FacetValidatorsManager {
106     private final List<FacetEditorValidator> myValidators = new ArrayList<FacetEditorValidator>();
107
108     @Override
109     public void registerValidator(final FacetEditorValidator validator, JComponent... componentsToWatch) {
110       myValidators.add(validator);
111       final UserActivityWatcher watcher = new UserActivityWatcher();
112       for (JComponent component : componentsToWatch) {
113         watcher.register(component);
114       }
115       watcher.addUserActivityListener(new UserActivityListener() {
116         @Override
117         public void stateChanged() {
118           validate();
119         }
120       });
121     }
122
123     @Override
124     public void validate() {
125       for (FacetEditorValidator validator : myValidators) {
126         ValidationResult validationResult = validator.check();
127         if (!validationResult.isOk()) {
128           myMainPanel.setVisible(true);
129           myWarningLabel.setText(XmlStringUtil.wrapInHtml(validationResult.getErrorMessage()));
130           myWarningLabel.setVisible(true);
131           myCurrentQuickFix = validationResult.getQuickFix();
132           myQuickFixButton.setVisible(myCurrentQuickFix != null);
133           if (myCurrentQuickFix != null) {
134             String buttonText = myCurrentQuickFix.getFixButtonText();
135             myQuickFixButton.setText(buttonText != null ? buttonText : IdeBundle.message("button.facet.quickfix.text"));
136           }
137           changeValidity(false);
138           return;
139         }
140       }
141       myCurrentQuickFix = null;
142       setNoErrors();
143     }
144   }
145 }