blob: bba8e743481c6ef938ec31626735583a403b8874 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* 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.codeInsight.intention.impl.config;
import com.intellij.ide.ui.search.SearchUtil;
import com.intellij.ide.ui.search.SearchableOptionsRegistrar;
import com.intellij.openapi.options.MasterDetails;
import com.intellij.openapi.ui.DetailsComponent;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.GuiUtils;
import com.intellij.util.Alarm;
import org.jetbrains.annotations.NonNls;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class IntentionSettingsPanel implements MasterDetails {
private JPanel myPanel;
private final IntentionSettingsTree myIntentionSettingsTree;
private final IntentionDescriptionPanel myIntentionDescriptionPanel = new IntentionDescriptionPanel();
private JPanel myTreePanel;
private JPanel myDescriptionPanel;
private DetailsComponent myDetailsComponent;
private final Alarm myResetAlarm = new Alarm();
public IntentionSettingsPanel() {
myIntentionSettingsTree = new IntentionSettingsTree() {
@Override
protected void selectionChanged(Object selected) {
if (selected instanceof IntentionActionMetaData) {
final IntentionActionMetaData actionMetaData = (IntentionActionMetaData)selected;
final Runnable runnable = new Runnable() {
@Override
public void run() {
intentionSelected(actionMetaData);
if (myDetailsComponent != null) {
String[] text = new String[actionMetaData.myCategory.length + 1];
System.arraycopy(actionMetaData.myCategory, 0, text,0,actionMetaData.myCategory.length);
text[text.length - 1] = actionMetaData.getFamily();
myDetailsComponent.setText(text);
}
}
};
myResetAlarm.cancelAllRequests();
myResetAlarm.addRequest(runnable, 100);
}
else {
categorySelected((String)selected);
if (myDetailsComponent != null) {
myDetailsComponent.setText((String)selected);
}
}
}
@Override
protected List<IntentionActionMetaData> filterModel(String filter, final boolean force) {
final List<IntentionActionMetaData> list = IntentionManagerSettings.getInstance().getMetaData();
if (filter == null || filter.length() == 0) return list;
final HashSet<String> quoted = new HashSet<String>();
List<Set<String>> keySetList = SearchUtil.findKeys(filter, quoted);
List<IntentionActionMetaData> result = new ArrayList<IntentionActionMetaData>();
for (IntentionActionMetaData metaData : list) {
if (isIntentionAccepted(metaData, filter, force, keySetList, quoted)){
result.add(metaData);
}
}
final Set<String> filters = SearchableOptionsRegistrar.getInstance().getProcessedWords(filter);
if (force && result.isEmpty()){
if (filters.size() > 1){
result = filterModel(filter, false);
}
}
return result;
}
};
myTreePanel.setLayout(new BorderLayout());
myTreePanel.add(myIntentionSettingsTree.getComponent(), BorderLayout.CENTER);
GuiUtils.replaceJSplitPaneWithIDEASplitter(myPanel);
myDescriptionPanel.setLayout(new BorderLayout());
myDescriptionPanel.add(myIntentionDescriptionPanel.getComponent(), BorderLayout.CENTER);
}
private void intentionSelected(IntentionActionMetaData actionMetaData) {
myIntentionDescriptionPanel.reset(actionMetaData, myIntentionSettingsTree.getFilter());
}
private void categorySelected(String intentionCategory) {
myIntentionDescriptionPanel.reset(intentionCategory);
}
public void reset() {
myIntentionSettingsTree.reset();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
myIntentionDescriptionPanel.init(myPanel.getWidth() / 2);
}
});
}
@Override
public void initUi() {
myDetailsComponent = new DetailsComponent();
myDetailsComponent.setContent(myDescriptionPanel);
}
@Override
public JComponent getToolbar() {
return myIntentionSettingsTree.getToolbarPanel();
}
@Override
public JComponent getMaster() {
return myTreePanel;
}
@Override
public DetailsComponent getDetails() {
return myDetailsComponent;
}
public void apply() {
myIntentionSettingsTree.apply();
}
public JPanel getComponent() {
return myPanel;
}
public JTree getIntentionTree(){
return myIntentionSettingsTree.getTree();
}
public boolean isModified() {
return myIntentionSettingsTree.isModified();
}
public void dispose() {
myIntentionSettingsTree.dispose();
myIntentionDescriptionPanel.dispose();
}
public void selectIntention(String familyName) {
myIntentionSettingsTree.selectIntention(familyName);
}
private static boolean isIntentionAccepted(IntentionActionMetaData metaData, @NonNls String filter, boolean forceInclude,
final List<Set<String>> keySetList, final HashSet<String> quoted) {
if (StringUtil.containsIgnoreCase(metaData.getFamily(), filter)) {
return true;
}
for (String category : metaData.myCategory) {
if (category != null && StringUtil.containsIgnoreCase(category, filter)) {
return true;
}
}
for (String stripped : quoted) {
if (StringUtil.containsIgnoreCase(metaData.getFamily(), stripped)) {
return true;
}
for (String category : metaData.myCategory) {
if (category != null && StringUtil.containsIgnoreCase(category, stripped)) {
return true;
}
}
try {
final TextDescriptor description = metaData.getDescription();
if (StringUtil.containsIgnoreCase(description.getText(), stripped)){
if (!forceInclude) return true;
} else if (forceInclude) return false;
}
catch (IOException e) {
//skip then
}
}
for (Set<String> keySet : keySetList) {
if (keySet.contains(metaData.getFamily())) {
if (!forceInclude) {
return true;
}
}
else {
if (forceInclude) {
return false;
}
}
}
return forceInclude;
}
public Runnable showOption(final String option) {
return new Runnable() {
@Override
public void run() {
myIntentionSettingsTree.filter(myIntentionSettingsTree.filterModel(option, true));
myIntentionSettingsTree.setFilter(option);
}
};
}
}