adjusted solution to memory leaks in RubyProjectStructureConfigurable according to...
[idea/community.git] / java / debugger / impl / src / com / intellij / debugger / actions / CustomizeContextViewAction.java
1 /*
2  * Copyright 2000-2016 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.debugger.actions;
17
18 import com.intellij.debugger.DebuggerBundle;
19 import com.intellij.debugger.engine.JavaDebugProcess;
20 import com.intellij.debugger.settings.JavaDebuggerSettings;
21 import com.intellij.debugger.settings.NodeRendererSettings;
22 import com.intellij.idea.ActionsBundle;
23 import com.intellij.openapi.actionSystem.AnActionEvent;
24 import com.intellij.openapi.options.Configurable;
25 import com.intellij.openapi.options.ConfigurationException;
26 import com.intellij.openapi.options.TabbedConfigurable;
27 import com.intellij.openapi.options.ex.SingleConfigurableEditor;
28 import com.intellij.openapi.project.Project;
29 import com.intellij.util.ui.JBUI;
30 import com.intellij.xdebugger.XDebugSession;
31 import com.intellij.xdebugger.XDebuggerManager;
32 import com.intellij.xdebugger.impl.ui.tree.actions.XDebuggerTreeActionBase;
33 import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
34 import org.jetbrains.annotations.NotNull;
35
36 import javax.swing.*;
37 import java.util.List;
38
39 public class CustomizeContextViewAction extends XDebuggerTreeActionBase {
40   private static int ourLastSelectedTabIndex = 0;
41
42   @Override
43   public void actionPerformed(AnActionEvent e) {
44     perform(null, "", e);
45   }
46
47   @Override
48   protected void perform(XValueNodeImpl node, @NotNull String nodeName, AnActionEvent e) {
49     final Project project = e.getProject();
50     final MyTabbedConfigurable configurable = new MyTabbedConfigurable();
51     SingleConfigurableEditor editor = new SingleConfigurableEditor(project, configurable) {
52       @Override
53       protected void doOKAction() {
54         //noinspection AssignmentToStaticFieldFromInstanceMethod
55         ourLastSelectedTabIndex = configurable.getSelectedIndex();
56         super.doOKAction();
57       }
58
59       @Override
60       public void doCancelAction() {
61         //noinspection AssignmentToStaticFieldFromInstanceMethod
62         ourLastSelectedTabIndex = configurable.getSelectedIndex();
63         super.doCancelAction();
64       }
65     };
66     editor.show();
67   }
68
69   private static class MyTabbedConfigurable extends TabbedConfigurable {
70     @Override
71     protected List<Configurable> createConfigurables() {
72       return JavaDebuggerSettings.createDataViewsConfigurable();
73     }
74
75     @Override
76     public void apply() throws ConfigurationException {
77       super.apply();
78       NodeRendererSettings.getInstance().fireRenderersChanged();
79     }
80
81     @Override
82     public String getDisplayName() {
83       return DebuggerBundle.message("title.customize.data.views");
84     }
85
86     @Override
87     public String getHelpTopic() {
88       return "reference.debug.customize.data.view";
89     }
90
91     @Override
92     protected void createConfigurableTabs() {
93       for (Configurable configurable : getConfigurables()) {
94         JComponent component = configurable.createComponent();
95         assert component != null;
96         component.setBorder(JBUI.Borders.empty(8, 8));
97         myTabbedPane.addTab(configurable.getDisplayName(), component);
98       }
99       myTabbedPane.setSelectedIndex(ourLastSelectedTabIndex);
100     }
101
102     int getSelectedIndex() {
103       return myTabbedPane.getSelectedIndex();
104     }
105   }
106
107   @Override
108   public void update(AnActionEvent e) {
109     e.getPresentation().setText(ActionsBundle.actionText(DebuggerActions.CUSTOMIZE_VIEWS));
110     Project project = getEventProject(e);
111     if (project != null) {
112       final XDebugSession currentSession = XDebuggerManager.getInstance(project).getCurrentSession();
113       if (currentSession != null) {
114         e.getPresentation().setEnabledAndVisible(currentSession.getDebugProcess() instanceof JavaDebugProcess);
115         return;
116       }
117     }
118     e.getPresentation().setEnabledAndVisible(false);
119   }
120 }