simplify GTDUCollector a bit more
[idea/community.git] / java / idea-ui / src / com / intellij / facet / impl / ui / FacetEditorImpl.java
1 /*
2  * Copyright 2000-2017 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.Facet;
19 import com.intellij.facet.FacetConfiguration;
20 import com.intellij.facet.ui.*;
21 import com.intellij.ide.JavaUiBundle;
22 import com.intellij.openapi.Disposable;
23 import com.intellij.openapi.application.ApplicationManager;
24 import com.intellij.openapi.options.Configurable;
25 import com.intellij.openapi.options.UnnamedConfigurable;
26 import com.intellij.openapi.options.UnnamedConfigurableGroup;
27 import com.intellij.openapi.roots.ProjectModelExternalSource;
28 import com.intellij.openapi.roots.ui.configuration.ModificationOfImportedModelWarningComponent;
29 import com.intellij.openapi.util.Disposer;
30 import com.intellij.openapi.wm.IdeFocusManager;
31 import com.intellij.ui.TabbedPaneWrapper;
32 import com.intellij.util.ui.JBUI;
33 import com.intellij.util.ui.UIUtil;
34 import org.jetbrains.annotations.NotNull;
35 import org.jetbrains.annotations.Nullable;
36
37 import javax.swing.*;
38 import javax.swing.event.ChangeEvent;
39 import javax.swing.event.ChangeListener;
40 import java.awt.*;
41 import java.util.HashSet;
42 import java.util.Set;
43
44 public class FacetEditorImpl extends UnnamedConfigurableGroup implements UnnamedConfigurable, FacetEditor {
45   private final FacetEditorTab[] myEditorTabs;
46   private final FacetErrorPanel myErrorPanel;
47   private JComponent myComponent;
48   private @Nullable TabbedPaneWrapper myTabbedPane;
49   private final FacetEditorContext myContext;
50   private final Set<FacetEditorTab> myVisitedTabs = new HashSet<>();
51   private int mySelectedTabIndex = 0;
52   private final Disposable myDisposable = Disposer.newDisposable();
53
54   public FacetEditorImpl(final FacetEditorContext context, final FacetConfiguration configuration) {
55     myContext = context;
56     myErrorPanel = new FacetErrorPanel();
57     myEditorTabs = configuration.createEditorTabs(context, myErrorPanel.getValidatorsManager());
58     for (Configurable configurable : myEditorTabs) {
59       add(configurable);
60     }
61   }
62
63   @Override
64   public void reset() {
65     super.reset();
66     myErrorPanel.getValidatorsManager().validate();
67   }
68
69   public JComponent getComponent() {
70     if (myComponent == null) {
71       myComponent = createComponent();
72     }
73     return myComponent;
74   }
75
76   @Override
77   public JComponent createComponent() {
78     final JComponent editorComponent;
79     if (myEditorTabs.length > 1) {
80       final TabbedPaneWrapper tabbedPane = new TabbedPaneWrapper(myDisposable);
81       for (FacetEditorTab editorTab : myEditorTabs) {
82         JComponent c = editorTab.createComponent();
83         UIUtil.addInsets(c, UIUtil.PANEL_SMALL_INSETS);
84         tabbedPane.addTab(editorTab.getDisplayName(), c);
85       }
86       tabbedPane.addChangeListener(new ChangeListener() {
87         @Override
88         public void stateChanged(@NotNull ChangeEvent e) {
89           myEditorTabs[mySelectedTabIndex].onTabLeaving();
90           mySelectedTabIndex = tabbedPane.getSelectedIndex();
91           onTabSelected(myEditorTabs[mySelectedTabIndex]);
92         }
93       });
94       editorComponent = tabbedPane.getComponent();
95       myTabbedPane = tabbedPane;
96     }
97     else if (myEditorTabs.length == 1) {
98       editorComponent = myEditorTabs[0].createComponent();
99       UIUtil.addInsets(editorComponent, JBUI.insets(0, 5, 0, 0));
100     }
101     else {
102       editorComponent = new JPanel();
103     }
104     ProjectModelExternalSource externalSource = myContext.getFacet().getExternalSource();
105     if (externalSource != null) {
106       myErrorPanel.getValidatorsManager().registerValidator(new FacetEditorValidator() {
107         @NotNull
108         @Override
109         public ValidationResult check() {
110           if (isModified()) {
111             String text = ModificationOfImportedModelWarningComponent.getWarningText(
112               JavaUiBundle.message("facet.banner.text", myContext.getFacetName()), externalSource);
113             return new ValidationResult(text);
114           }
115           return ValidationResult.OK;
116         }
117       }, editorComponent);
118     }
119
120
121     final JComponent errorComponent = myErrorPanel.getComponent();
122     UIUtil.addInsets(errorComponent, JBUI.insets(0, 5, 5, 0));
123
124     final JPanel panel = new JPanel(new BorderLayout());
125     panel.add(BorderLayout.CENTER, editorComponent);
126     panel.add(BorderLayout.SOUTH, errorComponent);
127     return panel;
128   }
129
130   private void onTabSelected(final FacetEditorTab selectedTab) {
131     selectedTab.onTabEntering();
132     if (myVisitedTabs.add(selectedTab)) {
133       final JComponent preferredFocusedComponent = selectedTab.getPreferredFocusedComponent();
134       if (preferredFocusedComponent != null) {
135         ApplicationManager.getApplication().invokeLater(() -> {
136           if (preferredFocusedComponent.isShowing()) {
137             IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> IdeFocusManager.getGlobalInstance().requestFocus(preferredFocusedComponent, true));
138           }
139         });
140       }
141     }
142   }
143
144   @Override
145   public void disposeUIResources() {
146     Disposer.dispose(myDisposable);
147     myErrorPanel.disposeUIResources();
148     super.disposeUIResources();
149   }
150
151   @Nullable
152   public String getHelpTopic() {
153     return 0 <= mySelectedTabIndex && mySelectedTabIndex < myEditorTabs.length ? myEditorTabs[mySelectedTabIndex].getHelpTopic() : null;
154   }
155
156   public void onFacetAdded(@NotNull Facet facet) {
157     for (FacetEditorTab editorTab : myEditorTabs) {
158       editorTab.onFacetInitialized(facet);
159     }
160   }
161
162   public void setSelectedTabName(final String tabName) {
163     getComponent();
164     final TabbedPaneWrapper tabbedPane = myTabbedPane;
165     if (tabbedPane == null) return;
166     for (int i = 0; i < tabbedPane.getTabCount(); i++) {
167       if (tabName.equals(tabbedPane.getTitleAt(i))) {
168         tabbedPane.setSelectedIndex(i);
169         return;
170       }
171     }
172   }
173
174   public FacetEditorContext getContext() {
175     return myContext;
176   }
177
178   public void onFacetSelected() {
179     if (mySelectedTabIndex < myEditorTabs.length) {
180       onTabSelected(myEditorTabs[mySelectedTabIndex]);
181     }
182   }
183
184   @Override
185   public FacetEditorTab[] getEditorTabs() {
186     return myEditorTabs;
187   }
188
189   @Override
190   public <T extends FacetEditorTab> T getEditorTab(@NotNull final Class<T> aClass) {
191     for (FacetEditorTab editorTab : myEditorTabs) {
192       if (aClass.isInstance(editorTab)) {
193         return aClass.cast(editorTab);
194       }
195     }
196     return null;
197   }
198 }