diff options
Diffstat (limited to 'platform/lang-impl/src/com')
115 files changed, 1225 insertions, 1062 deletions
diff --git a/platform/lang-impl/src/com/intellij/analysis/BaseAnalysisAction.java b/platform/lang-impl/src/com/intellij/analysis/BaseAnalysisAction.java index c63f8cdc2fd7..af46c5178f9f 100644 --- a/platform/lang-impl/src/com/intellij/analysis/BaseAnalysisAction.java +++ b/platform/lang-impl/src/com/intellij/analysis/BaseAnalysisAction.java @@ -70,7 +70,7 @@ public abstract class BaseAnalysisAction extends AnAction { } AnalysisScope scope = getInspectionScope(dataContext); LOG.assertTrue(scope != null); - final boolean rememberScope = e.getPlace().equals(ActionPlaces.MAIN_MENU); + final boolean rememberScope = ActionPlaces.isMainMenuOrActionSearch(e.getPlace()); final AnalysisUIOptions uiOptions = AnalysisUIOptions.getInstance(project); PsiElement element = CommonDataKeys.PSI_ELEMENT.getData(dataContext); BaseAnalysisActionDialog dlg = new BaseAnalysisActionDialog(AnalysisScopeBundle.message("specify.analysis.scope", myTitle), diff --git a/platform/lang-impl/src/com/intellij/application/options/CodeStyleSchemesConfigurable.java b/platform/lang-impl/src/com/intellij/application/options/CodeStyleSchemesConfigurable.java index 760d17e67d24..758aef6a9065 100644 --- a/platform/lang-impl/src/com/intellij/application/options/CodeStyleSchemesConfigurable.java +++ b/platform/lang-impl/src/com/intellij/application/options/CodeStyleSchemesConfigurable.java @@ -302,6 +302,11 @@ public class CodeStyleSchemesConfigurable extends SearchableConfigurable.Parent. @Override public boolean isModified() { if (myModel != null) { + if (Registry.is("ide.new.settings.dialog")) { + if (myPanels != null && myPanels.size() > 0 && myPanels.get(0).isModified()) { + return true; + } + } boolean schemeListModified = myModel.isSchemeListModified(); if (schemeListModified) { myApplyCompleted = false; diff --git a/platform/lang-impl/src/com/intellij/application/options/ModuleListCellRenderer.java b/platform/lang-impl/src/com/intellij/application/options/ModuleListCellRenderer.java index f544517bb5d4..6bc5f6505c92 100644 --- a/platform/lang-impl/src/com/intellij/application/options/ModuleListCellRenderer.java +++ b/platform/lang-impl/src/com/intellij/application/options/ModuleListCellRenderer.java @@ -3,6 +3,7 @@ package com.intellij.application.options; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleType; import com.intellij.ui.ListCellRendererWrapper; +import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -10,10 +11,20 @@ import javax.swing.*; * @author yole */ public class ModuleListCellRenderer extends ListCellRendererWrapper<Module> { + private final String myEmptySelectionText; + + public ModuleListCellRenderer() { + this("[none]"); + } + + public ModuleListCellRenderer(@NotNull String emptySelectionText) { + myEmptySelectionText = emptySelectionText; + } + @Override public void customize(JList list, Module module, int index, boolean selected, boolean hasFocus) { if (module == null) { - setText("[none]"); + setText(myEmptySelectionText); } else { setIcon(ModuleType.get(module).getIcon()); diff --git a/platform/lang-impl/src/com/intellij/application/options/ModulesComboBox.java b/platform/lang-impl/src/com/intellij/application/options/ModulesComboBox.java index 17434cb0c7ba..4c2ef3a3d16c 100644 --- a/platform/lang-impl/src/com/intellij/application/options/ModulesComboBox.java +++ b/platform/lang-impl/src/com/intellij/application/options/ModulesComboBox.java @@ -36,6 +36,7 @@ import java.util.List; */ public class ModulesComboBox extends ComboBox { private final SortedComboBoxModel<Module> myModel; + private boolean myAllowEmptySelection; public ModulesComboBox() { this(new SortedComboBoxModel<Module>(ModulesAlphaComparator.INSTANCE)); @@ -58,8 +59,17 @@ public class ModulesComboBox extends ComboBox { setRenderer(new ModuleListCellRenderer()); } + public void allowEmptySelection(@NotNull String emptySelectionText) { + myAllowEmptySelection = true; + myModel.add(null); + setRenderer(new ModuleListCellRenderer(emptySelectionText)); + } + public void setModules(@NotNull Collection<Module> modules) { myModel.setAll(modules); + if (myAllowEmptySelection) { + myModel.add(null); + } } public void fillModules(@NotNull Project project) { diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/ManageCodeStyleSchemesDialog.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/ManageCodeStyleSchemesDialog.java index 653f6b51e8bd..282f44d04a60 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/ManageCodeStyleSchemesDialog.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/ManageCodeStyleSchemesDialog.java @@ -214,7 +214,7 @@ public class ManageCodeStyleSchemesDialog extends DialogWrapper { return !file.isDirectory() && importer.getSourceExtension().equals(file.getExtension()); } }, null, myContentPane); - VirtualFile[] selection = fileChooser.choose(CodeStyleSchemesUIConfiguration.Util.getRecentImportFile(), null); + VirtualFile[] selection = fileChooser.choose(null, CodeStyleSchemesUIConfiguration.Util.getRecentImportFile()); if (selection.length == 1) { VirtualFile selectedFile = selection[0]; selectedFile.refresh(false, false); diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/WrappingAndBracesPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/WrappingAndBracesPanel.java index c192d0e2893a..2972dacf2ceb 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/WrappingAndBracesPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/WrappingAndBracesPanel.java @@ -43,6 +43,7 @@ public class WrappingAndBracesPanel extends OptionTableWithPreviewPanel { addOption("KEEP_SIMPLE_CLASSES_IN_ONE_LINE", ApplicationBundle.message("wrapping.keep.simple.classes.in.one.line"), WRAPPING_KEEP); addOption("WRAP_LONG_LINES", ApplicationBundle.message("wrapping.long.lines"), null); + addOption("WRAP_COMMENTS", ApplicationBundle.message("wrapping.comments.wrap.at.right.margin"), WRAPPING_COMMENTS); addOption("CLASS_BRACE_STYLE", ApplicationBundle.message("wrapping.brace.placement.class.declaration"), WRAPPING_BRACES, BRACE_PLACEMENT_OPTIONS, BRACE_PLACEMENT_VALUES); addOption("METHOD_BRACE_STYLE", ApplicationBundle.message("wrapping.brace.placement.method.declaration"), WRAPPING_BRACES, BRACE_PLACEMENT_OPTIONS, BRACE_PLACEMENT_VALUES); diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AbstractArrangementRuleAction.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AbstractArrangementRuleAction.java new file mode 100644 index 000000000000..3036ca9ed43e --- /dev/null +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AbstractArrangementRuleAction.java @@ -0,0 +1,43 @@ +/* + * Copyright 2000-2014 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.application.options.codeStyle.arrangement.action; + +import com.intellij.application.options.codeStyle.arrangement.match.ArrangementMatchingRulesControl; +import com.intellij.openapi.actionSystem.AnAction; +import org.jetbrains.annotations.NotNull; + +import java.awt.*; + +/** + * @author Svetlana.Zemlyanskaya + */ +public abstract class AbstractArrangementRuleAction extends AnAction { + + protected void scrollRowToVisible(@NotNull ArrangementMatchingRulesControl control, int row) { + final Rectangle rect = control.getCellRect(row, 0, false); + if (row != control.getEditingRow() - 1) { + control.scrollRectToVisible(rect); + } + else { + final Rectangle editorRect = control.getCellRect(row + 1, 0, false); + if(!rect.isEmpty() && !editorRect.isEmpty()) { + final int height = (int)(rect.getHeight() + editorRect.getHeight()); + final Rectangle visibleRect = new Rectangle((int)rect.getX(), (int)rect.getY(), (int)rect.getWidth(), height); + control.scrollRectToVisible(visibleRect); + } + } + } +} diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AbstractMoveArrangementRuleAction.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AbstractMoveArrangementRuleAction.java index 0cbfa2265dc8..b790c17a659d 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AbstractMoveArrangementRuleAction.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AbstractMoveArrangementRuleAction.java @@ -17,7 +17,6 @@ package com.intellij.application.options.codeStyle.arrangement.action; import com.intellij.application.options.codeStyle.arrangement.match.ArrangementMatchingRulesControl; import com.intellij.application.options.codeStyle.arrangement.match.ArrangementMatchingRulesModel; -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.project.DumbAware; import org.jetbrains.annotations.NotNull; @@ -30,7 +29,7 @@ import java.util.List; * @author Denis Zhdanov * @since 11/13/12 7:17 PM */ -public abstract class AbstractMoveArrangementRuleAction extends AnAction implements DumbAware { +public abstract class AbstractMoveArrangementRuleAction extends AbstractArrangementRuleAction implements DumbAware { @Override public void update(AnActionEvent e) { @@ -95,8 +94,17 @@ public abstract class AbstractMoveArrangementRuleAction extends AnAction impleme } + int visibleRow = -1; if (newRowToEdit >= 0) { control.showEditor(newRowToEdit); + visibleRow = newRowToEdit; + } + else if (!mappings.isEmpty()) { + visibleRow = mappings.get(0)[1]; + } + + if (visibleRow != -1) { + scrollRowToVisible(control, visibleRow); } } }); diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AddArrangementRuleAction.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AddArrangementRuleAction.java index f19b4513a628..fdde6eab9cbc 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AddArrangementRuleAction.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AddArrangementRuleAction.java @@ -19,7 +19,6 @@ import com.intellij.application.options.codeStyle.arrangement.match.ArrangementM import com.intellij.application.options.codeStyle.arrangement.match.ArrangementMatchingRulesModel; import com.intellij.application.options.codeStyle.arrangement.match.EmptyArrangementRuleComponent; import com.intellij.icons.AllIcons; -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.project.DumbAware; @@ -31,7 +30,7 @@ import org.jetbrains.annotations.NotNull; * @author Denis Zhdanov * @since 8/24/12 1:54 PM */ -public class AddArrangementRuleAction extends AnAction implements DumbAware { +public class AddArrangementRuleAction extends AbstractArrangementRuleAction implements DumbAware { public AddArrangementRuleAction() { getTemplatePresentation().setText(ApplicationBundle.message("arrangement.action.rule.add.text")); @@ -64,6 +63,7 @@ public class AddArrangementRuleAction extends AnAction implements DumbAware { } showEditor(control, rowToEdit); control.getSelectionModel().setSelectionInterval(rowToEdit, rowToEdit); + scrollRowToVisible(control, rowToEdit); } @NotNull diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/EditArrangementRuleAction.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/EditArrangementRuleAction.java index ffccce252176..14beaa21a1d9 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/EditArrangementRuleAction.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/EditArrangementRuleAction.java @@ -16,7 +16,6 @@ package com.intellij.application.options.codeStyle.arrangement.action; import com.intellij.application.options.codeStyle.arrangement.match.ArrangementMatchingRulesControl; -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Toggleable; import com.intellij.openapi.application.ApplicationBundle; @@ -27,7 +26,7 @@ import gnu.trove.TIntArrayList; * @author Denis Zhdanov * @since 10/29/12 11:01 AM */ -public class EditArrangementRuleAction extends AnAction implements DumbAware, Toggleable { +public class EditArrangementRuleAction extends AbstractArrangementRuleAction implements DumbAware, Toggleable { public EditArrangementRuleAction() { getTemplatePresentation().setText(ApplicationBundle.message("arrangement.action.rule.edit.text")); @@ -50,6 +49,8 @@ public class EditArrangementRuleAction extends AnAction implements DumbAware, To if (rows.size() != 1) { return; } - control.showEditor(rows.get(0)); + final int row = rows.get(0); + control.showEditor(row); + scrollRowToVisible(control, row); } } diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/RemoveArrangementRuleAction.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/RemoveArrangementRuleAction.java index e1abf16f7eb1..5fbcdccd38e9 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/RemoveArrangementRuleAction.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/RemoveArrangementRuleAction.java @@ -39,7 +39,7 @@ public class RemoveArrangementRuleAction extends AnAction implements DumbAware { @Override public void update(AnActionEvent e) { ArrangementMatchingRulesControl control = ArrangementMatchingRulesControl.KEY.getData(e.getDataContext()); - e.getPresentation().setEnabled(control != null && !control.getSelectedModelRows().isEmpty()); + e.getPresentation().setEnabled(control != null && !control.getSelectedModelRows().isEmpty() && control.getEditingRow() == -1); e.getPresentation().setIcon(SystemInfoRt.isMac ? AllIcons.ToolbarDecorator.Mac.Remove : AllIcons.ToolbarDecorator.Remove); } diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/group/ArrangementGroupingRulesControl.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/group/ArrangementGroupingRulesControl.java index 581eb0aa96a2..a847aecd289f 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/group/ArrangementGroupingRulesControl.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/group/ArrangementGroupingRulesControl.java @@ -38,6 +38,7 @@ import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; /** * @author Denis Zhdanov @@ -95,17 +96,21 @@ public class ArrangementGroupingRulesControl extends JBTable { model.removeRow(model.getRowCount() - 1); } - List<ArrangementSettingsToken> types = ContainerUtilRt.newArrayList(myComponents.keySet()); + final Set<ArrangementSettingsToken> groupingTokens = ContainerUtilRt.newHashSet(myComponents.keySet()); + for (ArrangementGroupingRule rule : rules) { + final ArrangementSettingsToken groupingType = rule.getGroupingType(); + ArrangementGroupingComponent component = myComponents.get(groupingType); + component.setSelected(true); + component.setOrderType(rule.getOrderType()); + model.addRow(new Object[]{component}); + groupingTokens.remove(groupingType); + } + + List<ArrangementSettingsToken> types = ContainerUtilRt.newArrayList(groupingTokens); types = mySettingsManager.sort(types); for (ArrangementSettingsToken type : types) { model.addRow(new Object[]{myComponents.get(type)}); } - for (ArrangementGroupingRule rule : rules) { - ArrangementGroupingComponent component = myComponents.get(rule.getGroupingType()); - component.setSelected(true); - ArrangementSettingsToken orderType = rule.getOrderType(); - component.setOrderType(orderType); - } } @NotNull diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java index 145ae1094e0b..a77e5cce28f0 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java @@ -527,35 +527,52 @@ public class ArrangementMatchingRulesControl extends JBTable { private class MyValidator { @Nullable private String validate(int index) { - if (mySectionRuleManager == null || getModel().getSize() < index) { + if (getModel().getSize() < index) { return null; } + if (mySectionRuleManager != null) { + final ArrangementSectionRuleData data = extractSectionText(index); + if (data != null) { + return validateSectionRule(data, index); + } + } + + final Object target = getModel().getElementAt(index); + if (target instanceof StdArrangementMatchRule) { + for (int i = 0; i < index; i++) { + final Object element = getModel().getElementAt(i); + if (element instanceof StdArrangementMatchRule && target.equals(element)) { + return ApplicationBundle.message("arrangement.settings.validation.duplicate.matching.rule"); + } + } + } + return null; + } + + @Nullable + private String validateSectionRule(@NotNull ArrangementSectionRuleData data, int index) { int startSectionIndex = -1; - final Set<String> rules = ContainerUtil.newHashSet(); + final Set<String> sectionRules = ContainerUtil.newHashSet(); for (int i = 0; i < index; i++) { final ArrangementSectionRuleData section = extractSectionText(i); if (section != null) { startSectionIndex = section.isSectionStart() ? i : -1; if (StringUtil.isNotEmpty(section.getText())) { - rules.add(section.getText()); + sectionRules.add(section.getText()); } } } + if (StringUtil.isNotEmpty(data.getText()) && sectionRules.contains(data.getText())) { + return ApplicationBundle.message("arrangement.settings.validation.duplicate.section.text"); + } - final ArrangementSectionRuleData data = extractSectionText(index); - if (data != null) { - if (StringUtil.isNotEmpty(data.getText()) && rules.contains(data.getText())) { - return ApplicationBundle.message("arrangement.settings.validation.duplicate.section.text"); + if (!data.isSectionStart()) { + if (startSectionIndex == -1) { + return ApplicationBundle.message("arrangement.settings.validation.end.section.rule.without.start"); } - - if (!data.isSectionStart()) { - if (startSectionIndex == -1) { - return ApplicationBundle.message("arrangement.settings.validation.end.section.rule.without.start"); - } - else if (startSectionIndex == index - 1) { - return ApplicationBundle.message("arrangement.settings.validation.empty.section.rule"); - } + else if (startSectionIndex == index - 1) { + return ApplicationBundle.message("arrangement.settings.validation.empty.section.rule"); } } return null; diff --git a/platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsConfigurable.form b/platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsConfigurable.form index edb9fcdb9e18..4bc9490d0090 100644 --- a/platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsConfigurable.form +++ b/platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsConfigurable.form @@ -109,7 +109,7 @@ <properties/> <border type="none"/> <children> - <component id="2479d" class="javax.swing.JLabel"> + <component id="2479d" class="javax.swing.JLabel" binding="myTabTitleLimitLabel"> <constraints> <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="4" fill="0" indent="0" use-parent-layout="false"/> </constraints> diff --git a/platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsConfigurable.java b/platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsConfigurable.java index 35a34085d035..93cde6a72f6d 100644 --- a/platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsConfigurable.java +++ b/platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsConfigurable.java @@ -46,6 +46,7 @@ public class EditorTabsConfigurable implements EditorOptionsProvider { private JCheckBox myShowDirectoryInTabCheckBox; private JRadioButton myActivateRightNeighbouringTabRadioButton; private JTextField myTabTitleLimitField; + private JLabel myTabTitleLimitLabel; public EditorTabsConfigurable() { myEditorTabPlacement.setModel(new DefaultComboBoxModel(new Object[]{ @@ -69,21 +70,15 @@ public class EditorTabsConfigurable implements EditorOptionsProvider { private void revalidateSingleRowCheckbox() { final int i = ((Integer)myEditorTabPlacement.getSelectedItem()).intValue(); - if (i == UISettings.TABS_NONE) { - myHideKnownExtensions.setEnabled(false); - myScrollTabLayoutInEditorCheckBox.setEnabled(false); - myCbModifiedTabsMarkedWithAsterisk.setEnabled(false); - myShowTabsTooltipsCheckBox.setEnabled(false); - myShowCloseButtonOnCheckBox.setEnabled(false); - myShowDirectoryInTabCheckBox.setEnabled(false); - } else { - myHideKnownExtensions.setEnabled(true); - myScrollTabLayoutInEditorCheckBox.setEnabled(true); - myCbModifiedTabsMarkedWithAsterisk.setEnabled(true); - myShowTabsTooltipsCheckBox.setEnabled(true); - myShowCloseButtonOnCheckBox.setEnabled(true); - myShowDirectoryInTabCheckBox.setEnabled(true); - } + boolean none = i == UISettings.TABS_NONE; + myHideKnownExtensions.setEnabled(!none); + myScrollTabLayoutInEditorCheckBox.setEnabled(!none); + myCbModifiedTabsMarkedWithAsterisk.setEnabled(!none); + myShowTabsTooltipsCheckBox.setEnabled(!none); + myShowCloseButtonOnCheckBox.setEnabled(!none); + myShowDirectoryInTabCheckBox.setEnabled(!none); + myTabTitleLimitField.setEnabled(!none); + myTabTitleLimitLabel.setEnabled(!none); if (SwingConstants.TOP == i) { myScrollTabLayoutInEditorCheckBox.setEnabled(true); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/actions/FormatChangedTextUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/actions/FormatChangedTextUtil.java index 3b51cc9ad976..dadafc7a7d84 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/actions/FormatChangedTextUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/actions/FormatChangedTextUtil.java @@ -250,7 +250,7 @@ public class FormatChangedTextUtil { } @NotNull - public static List<TextRange> getChangedTextRanges(@NotNull Project project, @NotNull PsiFile file) { + public static List<TextRange> getChangedTextRanges(@NotNull Project project, @NotNull PsiFile file) throws FilesTooBigForDiffException { Change change = ChangeListManager.getInstance(project).getChange(file.getVirtualFile()); if (change == null) { return ContainerUtilRt.emptyList(); @@ -281,7 +281,10 @@ public class FormatChangedTextUtil { } @NotNull - private static List<TextRange> calculateChangedTextRanges(@NotNull Project project, @NotNull PsiFile file, @NotNull String contentFromVcs) { + private static List<TextRange> calculateChangedTextRanges(@NotNull Project project, + @NotNull PsiFile file, + @NotNull String contentFromVcs) throws FilesTooBigForDiffException + { Document documentFromVcs = ((EditorFactoryImpl)EditorFactory.getInstance()).createDocument(contentFromVcs, true, false); Document document = PsiDocumentManager.getInstance(project).getDocument(file); @@ -289,23 +292,16 @@ public class FormatChangedTextUtil { return ContainerUtil.emptyList(); } - try { - List<Range> changedRanges; - - LineStatusTracker tracker = LineStatusTrackerManager.getInstance(project).getLineStatusTracker(document); - if (tracker != null) { - changedRanges = tracker.getRanges(); - } - else { - changedRanges = new RangesBuilder(document, documentFromVcs).getRanges(); - } - - return getChangedTextRanges(document, changedRanges); + List<Range> changedRanges; + LineStatusTracker tracker = LineStatusTrackerManager.getInstance(project).getLineStatusTracker(document); + if (tracker != null) { + changedRanges = tracker.getRanges(); } - catch (FilesTooBigForDiffException e) { - LOG.error("Error while calculating changed ranges for: " + file.getVirtualFile(), e); - return ContainerUtil.emptyList(); + else { + changedRanges = new RangesBuilder(document, documentFromVcs).getRanges(); } + + return getChangedTextRanges(document, changedRanges); } @NotNull diff --git a/platform/lang-impl/src/com/intellij/codeInsight/actions/ReformatCodeProcessor.java b/platform/lang-impl/src/com/intellij/codeInsight/actions/ReformatCodeProcessor.java index ff032c22747b..270f2f92f3cf 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/actions/ReformatCodeProcessor.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/actions/ReformatCodeProcessor.java @@ -18,6 +18,10 @@ package com.intellij.codeInsight.actions; import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.formatting.FormattingProgressTask; +import com.intellij.notification.Notification; +import com.intellij.notification.NotificationType; +import com.intellij.openapi.application.ApplicationBundle; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; @@ -27,6 +31,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.diff.FilesTooBigForDiffException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -90,6 +95,17 @@ public class ReformatCodeProcessor extends AbstractLayoutCodeProcessor { CodeStyleManager.getInstance(myProject).reformatText(file, ranges); return !FormattingProgressTask.FORMATTING_CANCELLED_FLAG.get(); } + catch (FilesTooBigForDiffException e) { + LOG.info("Error while calculating changed ranges for: " + file.getVirtualFile(), e); + if (!ApplicationManager.getApplication().isUnitTestMode()) { + Notification notification = new Notification(ApplicationBundle.message("reformat.changed.text.file.too.big.notification.groupId"), + ApplicationBundle.message("reformat.changed.text.file.too.big.notification.title"), + ApplicationBundle.message("reformat.changed.text.file.too.big.notification.text", file.getName()), + NotificationType.INFORMATION); + notification.notify(file.getProject()); + } + return false; + } catch (IncorrectOperationException e) { LOG.error(e); return false; @@ -102,7 +118,7 @@ public class ReformatCodeProcessor extends AbstractLayoutCodeProcessor { } @NotNull - private Collection<TextRange> getRangesToFormat(boolean processChangedTextOnly, PsiFile file) { + private Collection<TextRange> getRangesToFormat(boolean processChangedTextOnly, PsiFile file) throws FilesTooBigForDiffException { if (processChangedTextOnly) { return FormatChangedTextUtil.getChangedTextRanges(myProject, file); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index 3bdd05f58a40..dd506593d942 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -65,9 +65,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.concurrent.atomic.AtomicReference; public class CodeCompletionHandlerBase { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.completion.CodeCompletionHandlerBase"); @@ -306,16 +304,24 @@ public class CodeCompletionHandlerBase { CompletionServiceImpl.setCompletionPhase(synchronous ? new CompletionPhase.Synchronous(indicator) : new CompletionPhase.BgCalculation(indicator)); - final AtomicReference<LookupElement[]> data = indicator.startCompletion(initContext); + indicator.startCompletion(initContext); if (!synchronous) { return; } if (freezeSemaphore.waitFor(2000)) { - final LookupElement[] allItems = data.get(); - if (allItems != null && !indicator.isRunning() && !indicator.isCanceled()) { // the completion is really finished, now we may auto-insert or show lookup - completionFinished(initContext.getStartOffset(), initContext.getSelectionEndOffset(), indicator, allItems, hasModifiers); + if (!indicator.isRunning() && !indicator.isCanceled()) { // the completion is really finished, now we may auto-insert or show lookup + try { + indicator.getLookup().refreshUi(true, false); + } + catch (Exception e) { + CompletionServiceImpl.setCompletionPhase(CompletionPhase.NoCompletion); + LOG.error(e); + return; + } + + completionFinished(indicator, hasModifiers); return; } } @@ -324,9 +330,9 @@ public class CodeCompletionHandlerBase { indicator.showLookup(); } - private static void checkNotSync(CompletionProgressIndicator indicator, LookupElement[] allItems) { + private static void checkNotSync(CompletionProgressIndicator indicator, List<LookupElement> allItems) { if (CompletionServiceImpl.isPhase(CompletionPhase.Synchronous.class)) { - LOG.error("sync phase survived: " + Arrays.toString(allItems) + "; indicator=" + CompletionServiceImpl.getCompletionPhase().indicator + "; myIndicator=" + indicator); + LOG.error("sync phase survived: " + allItems + "; indicator=" + CompletionServiceImpl.getCompletionPhase().indicator + "; myIndicator=" + indicator); CompletionServiceImpl.setCompletionPhase(CompletionPhase.NoCompletion); } } @@ -345,17 +351,16 @@ public class CodeCompletionHandlerBase { private static PsiElement findCompletionPositionLeaf(CompletionContext newContext, int offset, PsiFile fileCopy, PsiFile originalFile) { final PsiElement insertedElement = newContext.file.findElementAt(offset); CompletionAssertions.assertCompletionPositionPsiConsistent(newContext, offset, fileCopy, originalFile, insertedElement); - assert insertedElement != null; return insertedElement; } - private AutoCompletionDecision shouldAutoComplete(final CompletionProgressIndicator indicator, final LookupElement[] items) { + private AutoCompletionDecision shouldAutoComplete(final CompletionProgressIndicator indicator, List<LookupElement> items) { if (!invokedExplicitly) { return AutoCompletionDecision.SHOW_LOOKUP; } final CompletionParameters parameters = indicator.getParameters(); - final LookupElement item = items[0]; - if (items.length == 1) { + final LookupElement item = items.get(0); + if (items.size() == 1) { final AutoCompletionPolicy policy = getAutocompletionPolicy(item); if (policy == AutoCompletionPolicy.NEVER_AUTOCOMPLETE) return AutoCompletionDecision.SHOW_LOOKUP; if (policy == AutoCompletionPolicy.ALWAYS_AUTOCOMPLETE) return AutoCompletionDecision.insertItem(item); @@ -367,11 +372,11 @@ public class CodeCompletionHandlerBase { if (isInsideIdentifier(indicator.getOffsetMap())) { return AutoCompletionDecision.SHOW_LOOKUP; } - if (items.length == 1 && getAutocompletionPolicy(item) == AutoCompletionPolicy.GIVE_CHANCE_TO_OVERWRITE) { + if (items.size() == 1 && getAutocompletionPolicy(item) == AutoCompletionPolicy.GIVE_CHANCE_TO_OVERWRITE) { return AutoCompletionDecision.insertItem(item); } - AutoCompletionContext context = new AutoCompletionContext(parameters, items, indicator.getOffsetMap(), indicator.getLookup()); + AutoCompletionContext context = new AutoCompletionContext(parameters, items.toArray(new LookupElement[items.size()]), indicator.getOffsetMap(), indicator.getLookup()); for (final CompletionContributor contributor : CompletionContributor.forParameters(parameters)) { final AutoCompletionDecision decision = contributor.handleAutoCompletionPossibility(context); if (decision != null) { @@ -401,12 +406,9 @@ public class CodeCompletionHandlerBase { return offsetMap.getOffset(CompletionInitializationContext.IDENTIFIER_END_OFFSET) != offsetMap.getOffset(CompletionInitializationContext.SELECTION_END_OFFSET); } - - protected void completionFinished(final int offset1, - final int offset2, - final CompletionProgressIndicator indicator, - final LookupElement[] items, boolean hasModifiers) { - if (items.length == 0) { + protected void completionFinished(final CompletionProgressIndicator indicator, boolean hasModifiers) { + final List<LookupElement> items = indicator.getLookup().getItems(); + if (items.isEmpty()) { LookupManager.getInstance(indicator.getProject()).hideActiveLookup(); Caret nextCaret = getNextCaretToProcess(indicator.getEditor()); @@ -424,7 +426,6 @@ public class CodeCompletionHandlerBase { LOG.assertTrue(!indicator.isCanceled(), "canceled"); try { - indicator.getLookup().refreshUi(true, false); final AutoCompletionDecision decision = shouldAutoComplete(indicator, items); if (decision == AutoCompletionDecision.SHOW_LOOKUP) { CompletionServiceImpl.setCompletionPhase(new CompletionPhase.ItemsCalculated(indicator)); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java index 8ca94d80463c..4f02d6bc5e54 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java @@ -81,7 +81,6 @@ import java.beans.PropertyChangeListener; import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicReference; /** * @author peter @@ -742,7 +741,7 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement return false; } - AtomicReference<LookupElement[]> startCompletion(final CompletionInitializationContext initContext) { + void startCompletion(final CompletionInitializationContext initContext) { boolean sync = ApplicationManager.getApplication().isUnitTestMode() && !CompletionAutoPopupHandler.ourTestingAutopopup; final CompletionThreading strategy = sync ? new SyncCompletion() : new AsyncCompletion(); @@ -754,12 +753,11 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement }); final WeighingDelegate weigher = strategy.delegateWeighing(this); - final AtomicReference<LookupElement[]> data = new AtomicReference<LookupElement[]>(null); class CalculateItems implements Runnable { @Override public void run() { try { - data.set(calculateItems(initContext, weigher)); + calculateItems(initContext, weigher); } catch (ProcessCanceledException ignore) { cancel(); // some contributor may just throw PCE; if indicator is not canceled everything will hang @@ -771,7 +769,6 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement } } strategy.startThread(this, new CalculateItems()); - return data; } private LookupElement[] calculateItems(CompletionInitializationContext initContext, WeighingDelegate weigher) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java index 4ac5e686c5bc..0d02b32baed4 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java @@ -58,6 +58,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.newvfs.RefreshQueueImpl; import com.intellij.packageDependencies.DependencyValidationManager; +import com.intellij.psi.FileViewProvider; import com.intellij.psi.PsiCompiledElement; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; @@ -184,8 +185,9 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzerEx implements JDOM @Override public void cleanFileLevelHighlights(@NotNull Project project, final int group, PsiFile psiFile) { - if (psiFile == null || !psiFile.getViewProvider().isPhysical()) return; - VirtualFile vFile = psiFile.getViewProvider().getVirtualFile(); + if (psiFile == null) return; + FileViewProvider provider = psiFile.getViewProvider(); + VirtualFile vFile = provider.getVirtualFile(); final FileEditorManager manager = FileEditorManager.getInstance(project); for (FileEditor fileEditor : manager.getEditors(vFile)) { final List<HighlightInfo> infos = fileEditor.getUserData(FILE_LEVEL_HIGHLIGHTS); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java index 44df90322011..24c3d8b4a6fb 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java @@ -34,6 +34,7 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.TextEditor; +import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; @@ -95,6 +96,12 @@ public class PassExecutorService implements Disposable { catch (ProcessCanceledException ignored) { } + catch (Error e) { + throw e; + } + catch (RuntimeException e) { + throw e; + } catch (Throwable throwable) { LOG.error(throwable); } @@ -118,6 +125,10 @@ public class PassExecutorService implements Disposable { LOG.assertTrue(!(editor instanceof EditorWindow)); document = editor.getDocument(); } + else { + VirtualFile virtualFile = ((FileEditorManagerEx)FileEditorManager.getInstance(myProject)).getFile(fileEditor); + document = virtualFile == null ? null : FileDocumentManager.getInstance().getDocument(virtualFile); + } int prevId = 0; for (final HighlightingPass pass : passes) { @@ -534,7 +545,7 @@ public class PassExecutorService implements Disposable { return result; } - private void sortById(@NotNull List<TextEditorHighlightingPass> result) { + private static void sortById(@NotNull List<TextEditorHighlightingPass> result) { ContainerUtil.quickSort(result, new Comparator<TextEditorHighlightingPass>() { @Override public int compare(TextEditorHighlightingPass o1, TextEditorHighlightingPass o2) { @@ -548,7 +559,7 @@ public class PassExecutorService implements Disposable { return ConcurrencyUtil.cacheOrGet(threads, Thread.currentThread(), threads.size()); } - public static void log(ProgressIndicator progressIndicator, TextEditorHighlightingPass pass, @NonNls Object... info) { + public static void log(ProgressIndicator progressIndicator, TextEditorHighlightingPass pass, @NonNls @NotNull Object... info) { if (LOG.isDebugEnabled()) { CharSequence docText = pass == null ? "" : StringUtil.first(pass.getDocument().getCharsSequence(), 10, true); synchronized (PassExecutorService.class) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java index 50f69088033b..10515ba07bef 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java @@ -106,7 +106,10 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr @Override public Image get(Object key) { PsiElement element = getElement(); - return element == null ? null : myManager.getElementImage(element, ((URL)key).toExternalForm()); + if (element == null) return null; + URL url = (URL)key; + Image inMemory = myManager.getElementImage(element, url.toExternalForm()); + return inMemory != null ? inMemory : Toolkit.getDefaultToolkit().createImage(url); } }; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java index 63484f890225..319ce54196da 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java @@ -378,6 +378,8 @@ public class DocumentationManager extends DockablePopupManager<DocumentationComp final PsiElement originalElement, @Nullable final Runnable closeCallback) { Project project = getProject(element); + if (!project.isOpen()) return; + storeOriginalElement(project, originalElement, element); myPreviouslyFocused = WindowManagerEx.getInstanceEx().getFocusedComponent(project); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/QuickDocUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/QuickDocUtil.java index 064bd020183b..18b28e3409f3 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/QuickDocUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/QuickDocUtil.java @@ -26,9 +26,9 @@ import com.intellij.psi.PsiElement; import com.intellij.ui.content.Content; import com.intellij.ui.popup.AbstractPopup; import com.intellij.util.Producer; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; - -import javax.swing.*; +import org.jetbrains.annotations.Nullable; /** * @author gregsh @@ -40,33 +40,41 @@ public class QuickDocUtil { ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { @Override public void run() { - final String documentation = docProducer.produce(); - if (StringUtil.isEmpty(documentation)) return; - // modal dialogs with fragment editors fix: can't guess proper modality state here - //noinspection SSBasedInspection - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - DocumentationManager documentationManager = DocumentationManager.getInstance(project); - DocumentationComponent component; - JBPopup hint = documentationManager.getDocInfoHint(); - if (hint != null) { - component = (DocumentationComponent)((AbstractPopup)hint).getComponent(); - } - else if (documentationManager.hasActiveDockedDocWindow()) { - ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(ToolWindowId.DOCUMENTATION); - Content selectedContent = toolWindow == null ? null : toolWindow.getContentManager().getSelectedContent(); - component = selectedContent == null ? null : (DocumentationComponent)selectedContent.getComponent(); - } - else { - component = null; - } - if (component != null) { - component.replaceText(documentation, element); - } - } - }); + updateQuickDoc(project, element, docProducer.produce()); } }); } + + public static void updateQuickDoc(@NotNull final Project project, @NotNull final PsiElement element, @Nullable final String documentation) { + if (StringUtil.isEmpty(documentation)) return; + // modal dialogs with fragment editors fix: can't guess proper modality state here + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + DocumentationComponent component = getActiveDocComponent(project); + if (component != null) { + component.replaceText(documentation, element); + } + } + }); + } + + @Nullable + public static DocumentationComponent getActiveDocComponent(@NotNull Project project) { + DocumentationManager documentationManager = DocumentationManager.getInstance(project); + DocumentationComponent component; + JBPopup hint = documentationManager.getDocInfoHint(); + if (hint != null) { + component = (DocumentationComponent)((AbstractPopup)hint).getComponent(); + } + else if (documentationManager.hasActiveDockedDocWindow()) { + ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(ToolWindowId.DOCUMENTATION); + Content selectedContent = toolWindow == null ? null : toolWindow.getContentManager().getSelectedContent(); + component = selectedContent == null ? null : (DocumentationComponent)selectedContent.getComponent(); + } + else { + component = null; + } + return component; + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hint/actions/ShowImplementationsAction.java b/platform/lang-impl/src/com/intellij/codeInsight/hint/actions/ShowImplementationsAction.java index afd7b230621c..376c24289617 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hint/actions/ShowImplementationsAction.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/hint/actions/ShowImplementationsAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -367,12 +367,17 @@ public class ShowImplementationsAction extends AnAction implements PopupAction { } private static PsiElement[] filterElements(final PsiElement[] targetElements) { - Set<PsiElement> unique = new LinkedHashSet<PsiElement>(Arrays.asList(targetElements)); - for (PsiElement elt : targetElements) { - final PsiFile containingFile = elt.getContainingFile(); - LOG.assertTrue(containingFile != null, elt); - PsiFile psiFile = containingFile.getOriginalFile(); - if (psiFile.getVirtualFile() == null) unique.remove(elt); + final Set<PsiElement> unique = new LinkedHashSet<PsiElement>(Arrays.asList(targetElements)); + for (final PsiElement elt : targetElements) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + final PsiFile containingFile = elt.getContainingFile(); + LOG.assertTrue(containingFile != null, elt); + PsiFile psiFile = containingFile.getOriginalFile(); + if (psiFile.getVirtualFile() == null) unique.remove(elt); + } + }); } // special case for Python (PY-237) // if the definition is the tree parent of the target element, filter out the target element @@ -392,9 +397,9 @@ public class ShowImplementationsAction extends AnAction implements PopupAction { } private static class ImplementationsUpdaterTask extends BackgroundUpdaterTask<ImplementationViewComponent> { - private String myCaption; - private Editor myEditor; - private PsiElement myElement; + private final String myCaption; + private final Editor myEditor; + private final PsiElement myElement; private final boolean myIncludeSelf; private PsiElement[] myElements; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java index 517f23c5a198..b236e1061315 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java @@ -72,7 +72,6 @@ import org.jetbrains.annotations.TestOnly; import javax.swing.*; import java.awt.*; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -97,8 +96,7 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { @Nullable private final PsiFile myInjectedFile; - private final List<Trinity<RangeMarker, RangeMarker, SmartPsiElementPointer>> myMarkers = - new LinkedList<Trinity<RangeMarker, RangeMarker, SmartPsiElementPointer>>(); + private final List<Trinity<RangeMarker, RangeMarker, SmartPsiElementPointer>> myMarkers = ContainerUtil.newLinkedList(); @Nullable private final RangeMarker myAltFullRange; @@ -199,7 +197,16 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { } public boolean isValid() { - return myNewVirtualFile.isValid() && (myAltFullRange == null && myInjectedFile.isValid() || myAltFullRange.isValid()); + boolean valid = myNewVirtualFile.isValid() && (myAltFullRange == null && myInjectedFile.isValid() || myAltFullRange.isValid()); + if (valid) { + for (Trinity<RangeMarker, RangeMarker, SmartPsiElementPointer> t : myMarkers) { + if (!t.first.isValid() || !t.second.isValid() || t.third.getElement() == null) { + valid = false; + break; + } + } + } + return valid; } public void navigate(int injectedOffset) { @@ -285,6 +292,7 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { } else if (e.getDocument() == myNewDocument) { commitToOriginal(); + if (!isValid()) closeEditor(); } else if (e.getDocument() == myOrigDocument) { if (myCommittingToOriginal || myAltFullRange != null && myAltFullRange.isValid()) return; @@ -359,7 +367,6 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { private void commitToOriginal() { - if (!isValid()) return; VirtualFile origVirtualFile = PsiUtilCore.getVirtualFile(myNewFile.getContext()); myCommittingToOriginal = true; try { @@ -401,7 +408,7 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { ProperTextRange insideHost = null; StringBuilder sb = new StringBuilder(); for (Trinity<RangeMarker, RangeMarker, SmartPsiElementPointer> entry : map.get(host)) { - RangeMarker origMarker = entry.first; + RangeMarker origMarker = entry.first; // check for validity? int hostOffset = host.getTextRange().getStartOffset(); ProperTextRange localInsideHost = new ProperTextRange(origMarker.getStartOffset() - hostOffset, origMarker.getEndOffset() - hostOffset); RangeMarker rangeMarker = entry.second; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/EditVariableDialog.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/EditVariableDialog.java index e32fab35508b..bab6ade7b935 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/EditVariableDialog.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/EditVariableDialog.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -26,6 +26,7 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.help.HelpManager; +import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.ui.ToolbarDecorator; import com.intellij.ui.table.JBTable; @@ -107,11 +108,11 @@ class EditVariableDialog extends DialogWrapper { myTable.getSelectionModel().setSelectionInterval(0, 0); } - JComboBox comboField = new JComboBox(); + ComboBox comboField = new ComboBox(); Macro[] macros = MacroFactory.getMacros(); Arrays.sort(macros, new Comparator<Macro> () { @Override - public int compare(Macro m1, Macro m2) { + public int compare(@NotNull Macro m1, @NotNull Macro m2) { return m1.getPresentableName().compareTo(m2.getPresentableName()); } }); @@ -231,11 +232,13 @@ class EditVariableDialog extends DialogWrapper { } } + @NotNull @Override public String getColumnName(int column) { return myNames[column]; } + @NotNull @Override public Class getColumnClass(int c) { if (c <= 2) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateListPanel.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateListPanel.java index 9a7a724e2d5d..1c0b72a5a454 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateListPanel.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateListPanel.java @@ -19,6 +19,7 @@ package com.intellij.codeInsight.template.impl; import com.intellij.application.options.ExportSchemeAction; import com.intellij.application.options.SchemesToImportPopup; import com.intellij.codeInsight.CodeInsightBundle; +import com.intellij.icons.AllIcons; import com.intellij.ide.DataManager; import com.intellij.ide.dnd.*; import com.intellij.ide.dnd.aware.DnDAwareTree; @@ -690,6 +691,17 @@ public class TemplateListPanel extends JPanel implements Disposable { public void updateButton(AnActionEvent e) { e.getPresentation().setEnabled(getTemplate(getSingleSelectedIndex()) != null); } + }).addExtraAction(new AnActionButton("Restore deleted defaults", AllIcons.General.TodoDefault) { + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + TemplateSettings.getInstance().reset(); + reset(); + } + + @Override + public boolean isEnabled() { + return super.isEnabled() && !TemplateSettings.getInstance().getDeletedTemplates().isEmpty(); + } }); if (getSchemesManager().isExportAvailable()) { decorator.addExtraAction(new AnActionButton("Share...", PlatformIcons.EXPORT_ICON) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSettings.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSettings.java index abf28256aaef..cdefbe83a252 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSettings.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSettings.java @@ -158,6 +158,10 @@ public class TemplateSettings implements PersistentStateComponent<Element>, Expo this.key = key; } + @Override + public String toString() { + return getKey()+"@" + getGroupName(); + } } private TemplateKey myLastSelectedTemplate; @@ -185,7 +189,7 @@ public class TemplateSettings implements PersistentStateComponent<Element>, Expo } @Override - public Document writeScheme(@NotNull final TemplateGroup template) throws WriteExternalException { + public Element writeScheme(@NotNull final TemplateGroup template) throws WriteExternalException { Element templateSetElement = new Element(TEMPLATE_SET); templateSetElement.setAttribute(GROUP, template.getName()); @@ -195,7 +199,7 @@ public class TemplateSettings implements PersistentStateComponent<Element>, Expo } } - return new Document(templateSetElement); + return templateSetElement; } @Override @@ -750,4 +754,9 @@ public class TemplateSettings implements PersistentStateComponent<Element>, Expo public List<TemplateKey> getDeletedTemplates() { return myDeletedTemplates; } + + public void reset() { + myDeletedTemplates.clear(); + loadDefaultLiveTemplates(); + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java index 0c838cd05ec5..2e620c2379c9 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java @@ -723,7 +723,10 @@ public class TemplateState implements Disposable { ExpressionContext context = createExpressionContext(start); Result result = isQuick ? expressionNode.calculateQuickResult(context) : expressionNode.calculateResult(context); - if ((result == null || result.equalsToText("", element)) && defaultValue != null) { + if (isQuick && isEmptyResult(result, element) && !oldValue.isEmpty()) { + return; + } + if (isEmptyResult(result, element) && defaultValue != null) { result = defaultValue.calculateResult(context); } if (element != null) { @@ -743,6 +746,10 @@ public class TemplateState implements Disposable { } } + private static boolean isEmptyResult(Result result, PsiElement context) { + return result == null || result.equalsToText("", context); + } + private void replaceString(String newValue, int start, int end, int segmentNumber) { String oldText = myDocument.getCharsSequence().subSequence(start, end).toString(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/ElseExpressionPostfixTemplateBase.java b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/ElseExpressionPostfixTemplateBase.java index 1e9c58488f33..4c810dcf4ff3 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/ElseExpressionPostfixTemplateBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/ElseExpressionPostfixTemplateBase.java @@ -16,6 +16,7 @@ package com.intellij.codeInsight.template.postfix.templates; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Conditions; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; @@ -28,7 +29,7 @@ public abstract class ElseExpressionPostfixTemplateBase extends SurroundPostfixT @SuppressWarnings("unchecked") protected ElseExpressionPostfixTemplateBase(@NotNull PostfixTemplatePsiInfo psiInfo) { - super("else", "if (!expr)", psiInfo, Condition.TRUE); + super("else", "if (!expr)", psiInfo, Conditions.<PsiElement>alwaysTrue()); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/IfPostfixTemplateBase.java b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/IfPostfixTemplateBase.java index 90a21a269fed..b7e402f31f66 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/IfPostfixTemplateBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/IfPostfixTemplateBase.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.template.postfix.templates; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Conditions; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; @@ -29,6 +30,6 @@ public abstract class IfPostfixTemplateBase extends SurroundPostfixTemplateBase @SuppressWarnings("unchecked") protected IfPostfixTemplateBase(@NotNull PostfixTemplatePsiInfo psiInfo) { - super("if", "if (expr)", psiInfo, Condition.TRUE); + super("if", "if (expr)", psiInfo, Conditions.<PsiElement>alwaysTrue()); } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/PostfixLiveTemplate.java b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/PostfixLiveTemplate.java index 0190fadbcf02..61544faf2c81 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/PostfixLiveTemplate.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/PostfixLiveTemplate.java @@ -32,6 +32,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Conditions; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDocumentManager; @@ -266,15 +267,13 @@ public class PostfixLiveTemplate extends CustomLiveTemplateBase { PsiFile copyFile = copyFile(file, fileContentWithoutKey); Document copyDocument = copyFile.getViewProvider().getDocument(); if (copyDocument == null) { - //noinspection unchecked - return Condition.FALSE; + return Conditions.alwaysFalse(); } copyFile = provider.preCheck(copyFile, editor, newOffset); copyDocument = copyFile.getViewProvider().getDocument(); if (copyDocument == null) { - //noinspection unchecked - return Condition.FALSE; + return Conditions.alwaysFalse(); } final PsiElement context = CustomTemplateCallback.getContext(copyFile, positiveOffset(newOffset)); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/StatementWrapPostfixTemplate.java b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/StatementWrapPostfixTemplate.java index 5b5c3624f33b..33b8ba541f66 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/StatementWrapPostfixTemplate.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/StatementWrapPostfixTemplate.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.template.postfix.templates; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Conditions; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; @@ -28,7 +29,7 @@ public abstract class StatementWrapPostfixTemplate extends PostfixTemplateWithEx protected StatementWrapPostfixTemplate(@NotNull String name, @NotNull String descr, @NotNull PostfixTemplatePsiInfo psiInfo) { - super(name, descr, psiInfo, Condition.TRUE); + super(name, descr, psiInfo, Conditions.<PsiElement>alwaysTrue()); } protected StatementWrapPostfixTemplate(@NotNull String name, diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/SurroundPostfixTemplateBase.java b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/SurroundPostfixTemplateBase.java index 29ea4d39ac64..09ca27a3f948 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/SurroundPostfixTemplateBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/SurroundPostfixTemplateBase.java @@ -18,6 +18,7 @@ package com.intellij.codeInsight.template.postfix.templates; import com.intellij.lang.surroundWith.Surrounder; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Conditions; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; @@ -35,7 +36,7 @@ public abstract class SurroundPostfixTemplateBase extends StatementWrapPostfixTe protected SurroundPostfixTemplateBase(@NotNull String name, @NotNull String descr, @NotNull PostfixTemplatePsiInfo psiInfo) { - super(name, descr, psiInfo, Condition.TRUE); + super(name, descr, psiInfo, Conditions.<PsiElement>alwaysTrue()); } diff --git a/platform/lang-impl/src/com/intellij/codeInspection/actions/GotoInspectionModel.java b/platform/lang-impl/src/com/intellij/codeInspection/actions/GotoInspectionModel.java index 4c6efc2b7897..ddcce12a9236 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/actions/GotoInspectionModel.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/actions/GotoInspectionModel.java @@ -22,13 +22,11 @@ import com.intellij.codeInspection.ex.ScopeToolState; import com.intellij.ide.IdeBundle; import com.intellij.ide.util.gotoByName.SimpleChooseByNameModel; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.profile.codeInspection.InspectionProfileManager; -import com.intellij.util.ArrayUtil; -import com.intellij.util.containers.MultiMap; import javax.swing.*; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -36,11 +34,10 @@ import java.util.Set; * @author Konstantin Bulenkov */ public class GotoInspectionModel extends SimpleChooseByNameModel { - private final MultiMap<String, InspectionToolWrapper> myToolNames = MultiMap.createSmartList(); - private final Map<String, Set<InspectionToolWrapper>> myGroupNames = new HashMap<String, Set<InspectionToolWrapper>>(); - private final Map<String, InspectionToolWrapper> myToolShortNames = new HashMap<String, InspectionToolWrapper>(); + private static final InspectionToolWrapper[] EMPTY_WRAPPERS_ARRAY = new InspectionToolWrapper[0]; + private final Map<String, InspectionToolWrapper> myToolNames = new HashMap<String, InspectionToolWrapper>(); private final String[] myNames; - private final ListCellRenderer myListCellRenderer = new InspectionListCellRenderer(); + private final InspectionListCellRenderer myListCellRenderer = new InspectionListCellRenderer(); public GotoInspectionModel(Project project) { @@ -48,28 +45,14 @@ public class GotoInspectionModel extends SimpleChooseByNameModel { final InspectionProfileImpl rootProfile = (InspectionProfileImpl)InspectionProfileManager.getInstance().getRootProfile(); for (ScopeToolState state : rootProfile.getAllTools(project)) { InspectionToolWrapper tool = state.getTool(); - InspectionToolWrapper workingTool = tool; - if (tool instanceof LocalInspectionToolWrapper) { - workingTool = LocalInspectionToolWrapper.findTool2RunInBatch(project, null, tool.getShortName()); - if (workingTool == null) { - continue; - } + if (tool instanceof LocalInspectionToolWrapper && ((LocalInspectionToolWrapper)tool).isUnfair()) { + continue; } - myToolNames.putValue(tool.getDisplayName(), workingTool); - final String groupName = tool.getGroupDisplayName(); - Set<InspectionToolWrapper> toolsInGroup = myGroupNames.get(groupName); - if (toolsInGroup == null) { - toolsInGroup = new HashSet<InspectionToolWrapper>(); - myGroupNames.put(groupName, toolsInGroup); - } - toolsInGroup.add(workingTool); - myToolShortNames.put(tool.getShortName(), workingTool); + final String name = tool.getDisplayName() + " " + StringUtil.join(tool.getGroupPath(), " "); + myToolNames.put(name, tool); } - - final Set<String> nameIds = new HashSet<String>(); - nameIds.addAll(myToolNames.keySet()); - nameIds.addAll(myGroupNames.keySet()); - myNames = ArrayUtil.toStringArray(nameIds); + final Set<String> strings = myToolNames.keySet(); + myNames = strings.toArray(new String[strings.size()]); } @Override @@ -83,25 +66,19 @@ public class GotoInspectionModel extends SimpleChooseByNameModel { } @Override - public Object[] getElementsByName(final String id, final String pattern) { - final Set<InspectionToolWrapper> result = new HashSet<InspectionToolWrapper>(); - result.addAll(myToolNames.get(id)); - InspectionToolWrapper e = myToolShortNames.get(id); - if (e != null) { - result.add(e); - } - final Set<InspectionToolWrapper> entries = myGroupNames.get(id); - if (entries != null) { - result.addAll(entries); + public Object[] getElementsByName(final String name, final String pattern) { + final InspectionToolWrapper tool = myToolNames.get(name); + if (tool == null) { + return EMPTY_WRAPPERS_ARRAY; } - return result.toArray(new InspectionToolWrapper[result.size()]); + return new InspectionToolWrapper[] {tool}; } @Override public String getElementName(final Object element) { if (element instanceof InspectionToolWrapper) { InspectionToolWrapper entry = (InspectionToolWrapper)element; - return entry.getDisplayName() + " " + entry.getGroupDisplayName(); + return entry.getDisplayName() + " " + StringUtil.join(entry.getGroupPath(), " "); } return null; } diff --git a/platform/lang-impl/src/com/intellij/codeInspection/actions/InspectionListCellRenderer.java b/platform/lang-impl/src/com/intellij/codeInspection/actions/InspectionListCellRenderer.java index 8608a2d13142..c7386b2ffcb5 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/actions/InspectionListCellRenderer.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/actions/InspectionListCellRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -20,6 +20,10 @@ import com.intellij.ide.util.gotoByName.ChooseByNameBase; import com.intellij.lang.Language; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.UnknownFileType; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.codeStyle.MinusculeMatcher; import com.intellij.ui.JBColor; import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.SimpleTextAttributes; @@ -31,6 +35,8 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; +import java.util.ArrayList; +import java.util.List; /** * @author Konstantin Bulenkov @@ -38,24 +44,31 @@ import java.awt.*; @SuppressWarnings({"GtkPreferredJComboBoxRenderer"}) public class InspectionListCellRenderer extends DefaultListCellRenderer implements MatcherHolder { private Matcher myMatcher; - private final SimpleTextAttributes SELECTED; - private final SimpleTextAttributes PLAIN; + private final SimpleTextAttributes mySelected; + private final SimpleTextAttributes myPlain; + private final SimpleTextAttributes myHighlighted; public InspectionListCellRenderer() { - SELECTED = new SimpleTextAttributes(UIUtil.getListSelectionBackground(), - UIUtil.getListSelectionForeground(), - JBColor.RED, - SimpleTextAttributes.STYLE_PLAIN); - PLAIN = new SimpleTextAttributes(UIUtil.getListBackground(), - UIUtil.getListForeground(), - JBColor.RED, - SimpleTextAttributes.STYLE_PLAIN); + mySelected = new SimpleTextAttributes(UIUtil.getListSelectionBackground(), + UIUtil.getListSelectionForeground(), + JBColor.RED, + SimpleTextAttributes.STYLE_PLAIN); + myPlain = new SimpleTextAttributes(UIUtil.getListBackground(), + UIUtil.getListForeground(), + JBColor.RED, + SimpleTextAttributes.STYLE_PLAIN); + myHighlighted = new SimpleTextAttributes(UIUtil.getListBackground(), + UIUtil.getListForeground(), + null, + SimpleTextAttributes.STYLE_SEARCH_MATCH); } @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean sel, boolean focus) { - final JPanel panel = new JPanel(new BorderLayout()); + final BorderLayout layout = new BorderLayout(); + layout.setHgap(5); + final JPanel panel = new JPanel(layout); panel.setOpaque(true); final Color bg = sel ? UIUtil.getListSelectionBackground() : UIUtil.getListBackground(); @@ -63,15 +76,37 @@ public class InspectionListCellRenderer extends DefaultListCellRenderer implemen panel.setBackground(bg); panel.setForeground(fg); - SimpleTextAttributes attr = sel ? SELECTED : PLAIN; if (value instanceof InspectionToolWrapper) { final InspectionToolWrapper toolWrapper = (InspectionToolWrapper)value; + final String inspectionName = " " + toolWrapper.getDisplayName(); + final String groupName = StringUtil.join(toolWrapper.getGroupPath(), " | "); + final String matchingText = inspectionName + "|" + groupName; + List<TextRange> fragments = ((MinusculeMatcher)myMatcher).matchingFragments(matchingText); + List<TextRange> adjustedFragments = new ArrayList<TextRange>(); + if (fragments != null) { + adjustedFragments.addAll(fragments); + } + final int splitPoint = adjustRanges(adjustedFragments, inspectionName.length() + 1); final SimpleColoredComponent c = new SimpleColoredComponent(); - SpeedSearchUtil.appendColoredFragmentForMatcher(" " + toolWrapper.getDisplayName(), c, attr, myMatcher, bg, sel); + final boolean matchHighlighting = Registry.is("ide.highlight.match.in.selected.only") && !sel; + if (matchHighlighting) { + c.append(inspectionName, myPlain); + } + else { + final List<TextRange> ranges = adjustedFragments.subList(0, splitPoint); + SpeedSearchUtil.appendColoredFragments(c, inspectionName, ranges, sel ? mySelected : myPlain, myHighlighted); + } panel.add(c, BorderLayout.WEST); final SimpleColoredComponent group = new SimpleColoredComponent(); - SpeedSearchUtil.appendColoredFragmentForMatcher(toolWrapper.getGroupDisplayName() + " ", group, attr, myMatcher, bg, sel); + if (matchHighlighting) { + group.append(groupName, SimpleTextAttributes.GRAYED_ATTRIBUTES); + } + else { + final SimpleTextAttributes attributes = sel ? mySelected : SimpleTextAttributes.GRAYED_ATTRIBUTES; + final List<TextRange> ranges = adjustedFragments.subList(splitPoint, adjustedFragments.size()); + SpeedSearchUtil.appendColoredFragments(group, groupName, ranges, attributes, myHighlighted); + } final JPanel right = new JPanel(new BorderLayout()); right.setBackground(bg); right.setForeground(fg); @@ -91,6 +126,21 @@ public class InspectionListCellRenderer extends DefaultListCellRenderer implemen return panel; } + private static int adjustRanges(List<TextRange> ranges, int offset) { + int result = 0; + for (int i = 0; i < ranges.size(); i++) { + final TextRange range = ranges.get(i); + final int startOffset = range.getStartOffset(); + if (startOffset < offset) { + result = i + 1; + } + else { + ranges.set(i, new TextRange(startOffset - offset, range.getEndOffset() - offset)); + } + } + return result; + } + @NotNull private static Icon getIcon(@NotNull InspectionToolWrapper tool) { Icon icon = null; diff --git a/platform/lang-impl/src/com/intellij/codeInspection/actions/ViewOfflineResultsAction.java b/platform/lang-impl/src/com/intellij/codeInspection/actions/ViewOfflineResultsAction.java index 0a7c8b24a275..b1ee98ac92fe 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/actions/ViewOfflineResultsAction.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/actions/ViewOfflineResultsAction.java @@ -77,7 +77,7 @@ public class ViewOfflineResultsAction extends AnAction implements DumbAware { final Presentation presentation = event.getPresentation(); final Project project = event.getData(CommonDataKeys.PROJECT); presentation.setEnabled(project != null); - presentation.setVisible(ActionPlaces.MAIN_MENU.equals(event.getPlace()) && !PlatformUtils.isCidr()); + presentation.setVisible(ActionPlaces.isMainMenuOrActionSearch(event.getPlace()) && !PlatformUtils.isCidr()); } @Override diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/DebuggerLogConsoleManager.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/DebuggerLogConsoleManager.java index 6f619641acc0..c24c0e869b97 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/DebuggerLogConsoleManager.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/DebuggerLogConsoleManager.java @@ -16,6 +16,7 @@ package com.intellij.diagnostic.logging; +@Deprecated /** * User: anna * Date: 01-Feb-2006 diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.java index b043b3e294a2..305af75de669 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.diagnostic.logging; import com.intellij.diagnostic.DiagnosticBundle; @@ -32,10 +31,12 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.*; import com.intellij.ui.components.JBCheckBox; import com.intellij.ui.table.TableView; +import com.intellij.util.SmartList; import com.intellij.util.ui.AbstractTableCellEditor; import com.intellij.util.ui.CellEditorComponentWithBrowseButton; import com.intellij.util.ui.ColumnInfo; import com.intellij.util.ui.ListTableModel; +import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -44,7 +45,6 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -61,19 +61,20 @@ public class LogConfigurationPanel<T extends RunConfigurationBase> extends Setti private TextFieldWithBrowseButton myOutputFile; private JCheckBox myShowConsoleOnStdOutCb; private JCheckBox myShowConsoleOnStdErrCb; - private final Map<LogFileOptions, PredefinedLogFile> myLog2Predefined = new HashMap<LogFileOptions, PredefinedLogFile>(); - private final List<PredefinedLogFile> myUnresolvedPredefined = new ArrayList<PredefinedLogFile>(); - - private final ColumnInfo<LogFileOptions, Boolean> IS_SHOW = new MyIsActiveColumnInfo(); - private final ColumnInfo<LogFileOptions, LogFileOptions> FILE = new MyLogFileColumnInfo(); - private final ColumnInfo<LogFileOptions, Boolean> IS_SKIP_CONTENT = new MyIsSkipColumnInfo(); + private final Map<LogFileOptions, PredefinedLogFile> myLog2Predefined = new THashMap<LogFileOptions, PredefinedLogFile>(); + private final List<PredefinedLogFile> myUnresolvedPredefined = new SmartList<PredefinedLogFile>(); public LogConfigurationPanel() { + ColumnInfo<LogFileOptions, Boolean> IS_SHOW = new MyIsActiveColumnInfo(); + ColumnInfo<LogFileOptions, LogFileOptions> FILE = new MyLogFileColumnInfo(); + ColumnInfo<LogFileOptions, Boolean> IS_SKIP_CONTENT = new MyIsSkipColumnInfo(); + myModel = new ListTableModel<LogFileOptions>(IS_SHOW, FILE, IS_SKIP_CONTENT); myFilesTable = new TableView<LogFileOptions>(myModel); myFilesTable.getEmptyText().setText(DiagnosticBundle.message("log.monitor.no.files")); final JTableHeader tableHeader = myFilesTable.getTableHeader(); + @SuppressWarnings("ConstantConditions") final FontMetrics fontMetrics = tableHeader.getFontMetrics(tableHeader.getFont()); int preferredWidth = fontMetrics.stringWidth(IS_SHOW.getName()) + 20; @@ -109,7 +110,7 @@ public class LogConfigurationPanel<T extends RunConfigurationBase> extends Setti public void run(AnActionButton button) { TableUtil.stopEditing(myFilesTable); final int[] selected = myFilesTable.getSelectedRows(); - if (selected == null || selected.length == 0) return; + if (selected.length == 0) return; for (int i = selected.length - 1; i >= 0; i--) { myModel.removeRow(selected[i]); } @@ -130,8 +131,8 @@ public class LogConfigurationPanel<T extends RunConfigurationBase> extends Setti @Override public void run(AnActionButton button) { final int selectedRow = myFilesTable.getSelectedRow(); - final LogFileOptions selectedOptions = myFilesTable.getSelectedObject(); - showEditorDialog(selectedOptions); + //noinspection ConstantConditions + showEditorDialog(myFilesTable.getSelectedObject()); myModel.fireTableDataChanged(); myFilesTable.setRowSelectionInterval(selectedRow, selectedRow); } @@ -156,7 +157,7 @@ public class LogConfigurationPanel<T extends RunConfigurationBase> extends Setti TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT); myRedirectOutputCb.addActionListener(new ActionListener() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(@NotNull ActionEvent e) { myOutputFile.setEnabled(myRedirectOutputCb.isSelected()); } }); @@ -218,14 +219,14 @@ public class LogConfigurationPanel<T extends RunConfigurationBase> extends Setti @Override protected void resetEditorFrom(final RunConfigurationBase configuration) { ArrayList<LogFileOptions> list = new ArrayList<LogFileOptions>(); - final ArrayList<LogFileOptions> logFiles = configuration.getLogFiles(); + final List<LogFileOptions> logFiles = configuration.getLogFiles(); for (LogFileOptions setting : logFiles) { list.add( new LogFileOptions(setting.getName(), setting.getPathPattern(), setting.isEnabled(), setting.isSkipContent(), setting.isShowAll())); } myLog2Predefined.clear(); myUnresolvedPredefined.clear(); - final ArrayList<PredefinedLogFile> predefinedLogFiles = configuration.getPredefinedLogFiles(); + final List<PredefinedLogFile> predefinedLogFiles = configuration.getPredefinedLogFiles(); for (PredefinedLogFile predefinedLogFile : predefinedLogFiles) { PredefinedLogFile logFile = new PredefinedLogFile(predefinedLogFile); final LogFileOptions options = configuration.getOptionsForPredefinedLogFile(logFile); @@ -306,8 +307,9 @@ public class LogConfigurationPanel<T extends RunConfigurationBase> extends Setti @Override public TableCellRenderer getRenderer(final LogFileOptions p0) { return new DefaultTableCellRenderer() { + @NotNull @Override - public Component getTableCellRendererComponent(JTable table, + public Component getTableCellRendererComponent(@NotNull JTable table, Object value, boolean isSelected, boolean hasFocus, @@ -315,6 +317,7 @@ public class LogConfigurationPanel<T extends RunConfigurationBase> extends Setti int column) { final Component renderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); setText(((LogFileOptions)value).getName()); + //noinspection ConstantConditions setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); setBorder(null); return renderer; @@ -418,7 +421,7 @@ public class LogConfigurationPanel<T extends RunConfigurationBase> extends Setti getChildComponent().setBorder(null); myComponent.getComponentWithButton().getButton().addActionListener(new ActionListener() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(@NotNull ActionEvent e) { showEditorDialog(myLogFileOptions); JTextField textField = getChildComponent(); textField.setText(myLogFileOptions.getName()); diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleBase.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleBase.java index c6226b65035e..f5882d92bcb4 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleBase.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleBase.java @@ -249,6 +249,7 @@ public abstract class LogConsoleBase extends AdditionalTabComponent implements L activate(); } + @NotNull @Override public String getTabTitle() { return myTitle; diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleImpl.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleImpl.java index 5933634dfcbc..1f8a48d7c605 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleImpl.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleImpl.java @@ -17,7 +17,7 @@ package com.intellij.diagnostic.logging; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -44,7 +44,7 @@ public abstract class LogConsoleImpl extends LogConsoleBase { @NotNull File file, @NotNull Charset charset, long skippedContents, - String title, + @NotNull String title, final boolean buildInActions) { this(project, file, charset, skippedContents, title, buildInActions, GlobalSearchScope.allScope(project)); } @@ -53,7 +53,7 @@ public abstract class LogConsoleImpl extends LogConsoleBase { @NotNull File file, @NotNull Charset charset, long skippedContents, - String title, + @NotNull String title, final boolean buildInActions, final GlobalSearchScope searchScope) { super(project, getReader(file, charset, skippedContents), title, buildInActions, new DefaultLogFilterModel(project), @@ -64,27 +64,30 @@ public abstract class LogConsoleImpl extends LogConsoleBase { } @Nullable - private static Reader getReader(@NotNull final File file, @NotNull final Charset charset, final long skippedContents) { - Reader reader = null; + private static Reader getReader(@NotNull File file, @NotNull Charset charset, long skippedContents) { try { try { - final FileInputStream inputStream = new FileInputStream(file); - reader = new BufferedReader(new InputStreamReader(inputStream, charset)); - if (file.length() >= skippedContents) { //do not skip forward - //noinspection ResultOfMethodCallIgnored - inputStream.skip(skippedContents); + @SuppressWarnings("IOResourceOpenedButNotSafelyClosed") + FileInputStream inputStream = new FileInputStream(file); + //do not skip forward + if (file.length() >= skippedContents) { + long skipped = 0; + while (skipped < skippedContents) { + skipped += inputStream.skip(skippedContents - skipped); + } } + return new BufferedReader(new InputStreamReader(inputStream, charset)); } catch (FileNotFoundException ignored) { - if (FileUtil.createIfDoesntExist(file)) { - reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset)); + if (FileUtilRt.createIfNotExists(file)) { + return new BufferedReader(new InputStreamReader(new FileInputStream(file), charset)); } + return null; } } catch (Throwable ignored) { - reader = null; + return null; } - return reader; } @Override @@ -104,9 +107,10 @@ public abstract class LogConsoleImpl extends LogConsoleBase { return null; } - final long length = myFile.length(); + long length = myFile.length(); if (length < myOldLength) { reader.close(); + //noinspection IOResourceOpenedButNotSafelyClosed reader = new BufferedReader(new InputStreamReader(new FileInputStream(myFile), myCharset)); } myOldLength = length; diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManager.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManager.java index 08407236006d..e5807c674b97 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManager.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -13,22 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.diagnostic.logging; import com.intellij.execution.configurations.AdditionalTabComponentManager; +import com.intellij.execution.configurations.RunConfigurationBase; import org.jetbrains.annotations.NotNull; import java.nio.charset.Charset; -import java.io.Reader; - -/** - * User: anna - * Date: 01-Feb-2006 - */ public interface LogConsoleManager extends AdditionalTabComponentManager { - void addLogConsole(final String name, final String path, @NotNull Charset charset, final long skippedContent); - void addLogConsole(final String name, Reader reader, final String id); - void removeLogConsole(final String pathOrId); + void addLogConsole(@NotNull String name, @NotNull String path, @NotNull Charset charset, long skippedContent, @NotNull RunConfigurationBase runConfiguration); + + void removeLogConsole(@NotNull String pathOrId); } diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManagerBase.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManagerBase.java index cb034daeaf5a..6e65ede4e04e 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManagerBase.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManagerBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -16,8 +16,8 @@ package com.intellij.diagnostic.logging; import com.intellij.execution.configurations.RunConfigurationBase; +import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.process.ProcessHandler; -import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.ui.RunnerLayoutUi; import com.intellij.openapi.Disposable; import com.intellij.openapi.project.Project; @@ -28,93 +28,42 @@ import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManagerAdapter; import com.intellij.ui.content.ContentManagerEvent; import com.intellij.util.ArrayUtil; +import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.io.File; -import java.io.Reader; import java.nio.charset.Charset; -import java.util.HashMap; import java.util.Map; -/** - * Created by IntelliJ IDEA. - * User: michael.golubev - */ public abstract class LogConsoleManagerBase implements LogConsoleManager, Disposable { - private final Project myProject; - - private final Map<AdditionalTabComponent, Content> myAdditionalContent = new HashMap<AdditionalTabComponent, Content>(); - - private ExecutionEnvironment myEnvironment; + private final Map<AdditionalTabComponent, Content> myAdditionalContent = new THashMap<AdditionalTabComponent, Content>(); private final GlobalSearchScope mySearchScope; - /** - * @deprecated use {@link #LogConsoleManagerBase(com.intellij.openapi.project.Project, com.intellij.psi.search.GlobalSearchScope)} - * to remove in IDEA 15 - */ - @SuppressWarnings("UnusedDeclaration") - protected LogConsoleManagerBase(@NotNull Project project) { - this(project, GlobalSearchScope.allScope(project)); - } - protected LogConsoleManagerBase(@NotNull Project project, @NotNull GlobalSearchScope searchScope) { myProject = project; mySearchScope = searchScope; } - protected final Project getProject() { - return myProject; - } - - public void setEnvironment(@NotNull ExecutionEnvironment environment) { - myEnvironment = environment; - } - - protected final ExecutionEnvironment getEnvironment() { - return myEnvironment; - } - @Override - public void addLogConsole(final String name, final String path, @NotNull Charset charset, final long skippedContent) { - addLogConsole(name, path, charset, skippedContent, getDefaultIcon()); + public void addLogConsole(@NotNull String name, @NotNull String path, @NotNull Charset charset, long skippedContent, @NotNull RunConfigurationBase runConfiguration) { + addLogConsole(name, path, charset, skippedContent, getDefaultIcon(), runConfiguration); } - public void addLogConsole(final String name, final String path, @NotNull Charset charset, final long skippedContent, Icon icon) { + public void addLogConsole(final String name, final String path, @NotNull Charset charset, final long skippedContent, Icon icon, @Nullable RunProfile runProfile) { doAddLogConsole(new LogConsoleImpl(myProject, new File(path), charset, skippedContent, name, false, mySearchScope) { - @Override public boolean isActive() { return isConsoleActive(path); } - }, path, icon); - } - - @Override - public void addLogConsole(String name, Reader reader, final String id) { - addLogConsole(name, reader, id, getDefaultIcon()); - } - - public void addLogConsole(String name, Reader reader, final String id, Icon icon) { - doAddLogConsole(new LogConsoleBase(myProject, - reader, - name, - false, - new DefaultLogFilterModel(myProject), mySearchScope) { - - @Override - public boolean isActive() { - return isConsoleActive(id); - } - }, id, icon); + }, path, icon, runProfile); } - private void doAddLogConsole(final LogConsoleBase log, - final String id, - Icon icon) { - if (myEnvironment != null && myEnvironment.getRunProfile() instanceof RunConfigurationBase) { - ((RunConfigurationBase)myEnvironment.getRunProfile()).customizeLogConsole(log); + private void doAddLogConsole(@NotNull final LogConsoleBase log, String id, Icon icon, @Nullable RunProfile runProfile) { + if (runProfile instanceof RunConfigurationBase) { + ((RunConfigurationBase)runProfile).customizeLogConsole(log); } log.attachStopLogConsoleTrackingListener(getProcessHandler()); addAdditionalTabComponent(log, id, icon); @@ -133,33 +82,28 @@ public abstract class LogConsoleManagerBase implements LogConsoleManager, Dispos } @Override - public void removeLogConsole(final String path) { - final Content content = getUi().findContent(path); + public void removeLogConsole(@NotNull String path) { + Content content = getUi().findContent(path); if (content != null) { - final LogConsoleBase log = (LogConsoleBase)content.getComponent(); - removeAdditionalTabComponent(log); + removeAdditionalTabComponent((LogConsoleBase)content.getComponent()); } } @Override - public void addAdditionalTabComponent(final AdditionalTabComponent tabComponent, final String id) { + public void addAdditionalTabComponent(@NotNull AdditionalTabComponent tabComponent, @NotNull String id) { addAdditionalTabComponent(tabComponent, id, getDefaultIcon()); } - public Content addAdditionalTabComponent(final AdditionalTabComponent tabComponent, String id, Icon icon) { - final Content logContent = createLogContent(tabComponent, id, icon); + public Content addAdditionalTabComponent(@NotNull AdditionalTabComponent tabComponent, @NotNull String id, @Nullable Icon icon) { + Content logContent = getUi().createContent(id, (ComponentWithActions)tabComponent, tabComponent.getTabTitle(), icon, + tabComponent.getPreferredFocusableComponent()); myAdditionalContent.put(tabComponent, logContent); getUi().addContent(logContent); return logContent; } - protected Content createLogContent(AdditionalTabComponent tabComponent, String id, Icon icon) { - return getUi().createContent(id, (ComponentWithActions)tabComponent, tabComponent.getTabTitle(), icon, - tabComponent.getPreferredFocusableComponent()); - } - @Override - public void removeAdditionalTabComponent(AdditionalTabComponent component) { + public void removeAdditionalTabComponent(@NotNull AdditionalTabComponent component) { Disposer.dispose(component); final Content content = myAdditionalContent.remove(component); if (!getUi().isDisposed()) { diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogFilesManager.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogFilesManager.java index a581a15ed6b8..0f95b541ce8a 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogFilesManager.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogFilesManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -13,135 +13,64 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.diagnostic.logging; import com.intellij.execution.configurations.LogFileOptions; import com.intellij.execution.configurations.RunConfigurationBase; import com.intellij.execution.process.ProcessHandler; -import com.intellij.openapi.Disposable; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Conditions; -import com.intellij.openapi.util.Disposer; -import com.intellij.util.Alarm; -import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import javax.swing.*; import java.io.File; -import java.util.*; - -/** - * User: anna - * Date: 01-Feb-2006 - */ -public class LogFilesManager implements Disposable { - public static final Logger LOG = Logger.getInstance(LogFilesManager.class); +import java.util.Set; +import java.util.TreeMap; - private static final int UPDATE_INTERVAL = 500; - - private final Map<LogFileOptions, Set<String>> myLogFileManagerMap = new LinkedHashMap<LogFileOptions, Set<String>>(); - private final Runnable myUpdateRequest; +public class LogFilesManager { private final LogConsoleManager myManager; - private final Alarm myUpdateAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, this); - private boolean myDisposed; - public LogFilesManager(@NotNull final Project project, LogConsoleManager manager, Disposable parentDisposable) { + public LogFilesManager(@NotNull LogConsoleManager manager) { myManager = manager; - Disposer.register(parentDisposable, this); - - myUpdateRequest = new Runnable() { - @Override - public void run() { - if (project.isDisposed() || myDisposed) return; - myUpdateAlarm.cancelAllRequests(); - for (final LogFileOptions logFile : myLogFileManagerMap.keySet()) { - final Set<String> oldFiles = myLogFileManagerMap.get(logFile); - final Set<String> newFiles = logFile.getPaths(); // should not be called in UI thread - myLogFileManagerMap.put(logFile, newFiles); - - final Set<String> obsoleteFiles = new THashSet<String>(oldFiles); - obsoleteFiles.removeAll(newFiles); - - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - if (project.isDisposed() || myDisposed) return; - - addConfigurationConsoles(logFile, new Condition<String>() { - @Override - public boolean value(final String file) { - return !oldFiles.contains(file); - } - }, newFiles); - for (String each : obsoleteFiles) { - myManager.removeLogConsole(each); - } - myUpdateAlarm.addRequest(myUpdateRequest, UPDATE_INTERVAL); - } - }); - } - } - }; } - public void registerFileMatcher(@NotNull RunConfigurationBase runConfiguration) { - final ArrayList<LogFileOptions> logFiles = runConfiguration.getAllLogFiles(); - for (LogFileOptions logFile : logFiles) { - if (logFile.isEnabled()) { - myLogFileManagerMap.put(logFile, logFile.getPaths()); + public void addLogConsoles(@NotNull RunConfigurationBase runConfiguration, @Nullable ProcessHandler startedProcess) { + for (LogFileOptions logFileOptions : runConfiguration.getAllLogFiles()) { + if (logFileOptions.isEnabled()) { + addConfigurationConsoles(logFileOptions, Conditions.<String>alwaysTrue(), logFileOptions.getPaths(), runConfiguration); } } - Alarm updateAlarm = myUpdateAlarm; - if (updateAlarm != null) { - updateAlarm.addRequest(myUpdateRequest, UPDATE_INTERVAL); - } + runConfiguration.createAdditionalTabComponents(myManager, startedProcess); } - @Override - public void dispose() { - myDisposed = true; - if (myUpdateAlarm != null) { - myUpdateAlarm.cancelAllRequests(); + private void addConfigurationConsoles(@NotNull LogFileOptions logFile, @NotNull Condition<String> shouldInclude, @NotNull Set<String> paths, @NotNull RunConfigurationBase runConfiguration) { + if (paths.isEmpty()) { + return; } - } - public void initLogConsoles(@NotNull RunConfigurationBase base, ProcessHandler startedProcess) { - List<LogFileOptions> logFiles = base.getAllLogFiles(); - for (LogFileOptions logFile : logFiles) { - if (logFile.isEnabled()) { - addConfigurationConsoles(logFile, Conditions.<String>alwaysTrue(), logFile.getPaths()); + TreeMap<String, String> titleToPath = new TreeMap<String, String>(); + if (paths.size() == 1) { + String path = paths.iterator().next(); + if (shouldInclude.value(path)) { + titleToPath.put(logFile.getName(), path); } } - base.createAdditionalTabComponents(myManager, startedProcess); - } - - private void addConfigurationConsoles(final LogFileOptions logFile, Condition<String> shouldInclude, final Set<String> paths) { - if (!paths.isEmpty()) { - final TreeMap<String, String> title2Path = new TreeMap<String, String>(); - if (paths.size() == 1) { - final String path = paths.iterator().next(); + else { + for (String path : paths) { if (shouldInclude.value(path)) { - title2Path.put(logFile.getName(), path); - } - } - else { - for (String path : paths) { - if (shouldInclude.value(path)) { - String title = new File(path).getName(); - if (title2Path.containsKey(title)) { - title = path; - } - title2Path.put(title, path); + String title = new File(path).getName(); + if (titleToPath.containsKey(title)) { + title = path; } + titleToPath.put(title, path); } } - for (final String title : title2Path.keySet()) { - final String path = title2Path.get(title); - myManager.addLogConsole(title, path, logFile.getCharset(), logFile.isSkipContent() ? new File(path).length() : 0); - } + } + + for (String title : titleToPath.keySet()) { + String path = titleToPath.get(title); + assert path != null; + myManager.addLogConsole(title, path, logFile.getCharset(), logFile.isSkipContent() ? new File(path).length() : 0, runConfiguration); } } } diff --git a/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationsComboBoxAction.java b/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationsComboBoxAction.java index 2a124dfcca4a..e0895646e2e3 100644 --- a/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationsComboBoxAction.java +++ b/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationsComboBoxAction.java @@ -65,7 +65,7 @@ public class RunConfigurationsComboBoxAction extends ComboBoxAction implements D public void update(final AnActionEvent e) { final Presentation presentation = e.getPresentation(); final Project project = e.getData(CommonDataKeys.PROJECT); - if (ActionPlaces.MAIN_MENU.equals(e.getPlace())) { + if (ActionPlaces.isMainMenuOrActionSearch(e.getPlace())) { presentation.setDescription(ExecutionBundle.message("choose.run.configuration.action.description")); presentation.setEnabled(findFrame(e.getData(PlatformDataKeys.CONTEXT_COMPONENT)) != null); return; diff --git a/platform/lang-impl/src/com/intellij/execution/actions/StopAction.java b/platform/lang-impl/src/com/intellij/execution/actions/StopAction.java index 75466528ae2f..596b3900ba5b 100644 --- a/platform/lang-impl/src/com/intellij/execution/actions/StopAction.java +++ b/platform/lang-impl/src/com/intellij/execution/actions/StopAction.java @@ -56,7 +56,7 @@ class StopAction extends DumbAwareAction implements AnAction.TransparentUpdate { Icon icon = getTemplatePresentation().getIcon(); String description = getTemplatePresentation().getDescription(); Presentation presentation = e.getPresentation(); - if (ActionPlaces.MAIN_MENU.equals(e.getPlace())) { + if (ActionPlaces.isMainMenuOrActionSearch(e.getPlace())) { enable = !getCancellableProcesses(e.getProject()).isEmpty() || !getActiveDescriptors(e.getDataContext()).isEmpty(); presentation.setText(getTemplatePresentation().getText()); } @@ -79,7 +79,8 @@ class StopAction extends DumbAwareAction implements AnAction.TransparentUpdate { presentation.setText(getTemplatePresentation().getText()); } else { - presentation.setText(ExecutionBundle.message("stop.configuration.action.name", runProfile == null ? contentDescriptor.getDisplayName() : runProfile.getName())); + presentation.setText(ExecutionBundle.message("stop.configuration.action.name", + runProfile == null ? contentDescriptor.getDisplayName() : runProfile.getName())); } } @@ -95,7 +96,7 @@ class StopAction extends DumbAwareAction implements AnAction.TransparentUpdate { Project project = e.getProject(); List<Pair<TaskInfo, ProgressIndicator>> backgroundTasks = getCancellableProcesses(project); - if (ActionPlaces.MAIN_MENU.equals(e.getPlace())) { + if (ActionPlaces.isMainMenuOrActionSearch(e.getPlace())) { if (activeProcessHandler != null && !activeProcessHandler.isProcessTerminating() && !activeProcessHandler.isProcessTerminated() && backgroundTasks.isEmpty()) { stopProcess(activeProcessHandler); diff --git a/platform/lang-impl/src/com/intellij/execution/console/ConsoleExecuteAction.java b/platform/lang-impl/src/com/intellij/execution/console/ConsoleExecuteAction.java index fcec06644765..f5bec9ac6be4 100644 --- a/platform/lang-impl/src/com/intellij/execution/console/ConsoleExecuteAction.java +++ b/platform/lang-impl/src/com/intellij/execution/console/ConsoleExecuteAction.java @@ -18,6 +18,7 @@ package com.intellij.execution.console; import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.execution.process.ConsoleHistoryModel; +import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.EmptyAction; @@ -39,7 +40,7 @@ public class ConsoleExecuteAction extends DumbAwareAction { private final LanguageConsoleView myConsoleView; private final LanguageConsoleImpl myConsole; - private final ConsoleExecuteActionHandler myExecuteActionHandler; + final ConsoleExecuteActionHandler myExecuteActionHandler; private final Condition<LanguageConsoleImpl> myEnabledCondition; @SuppressWarnings("UnusedDeclaration") @@ -95,7 +96,7 @@ public class ConsoleExecuteAction extends DumbAwareAction { } @Override - public final void update(AnActionEvent e) { + public final void update(@NotNull AnActionEvent e) { EditorEx editor = myConsole.getConsoleEditor(); boolean enabled = !editor.isRendererMode() && isEnabled() && (myExecuteActionHandler.isEmptyCommandExecutionAllowed() || !StringUtil.isEmptyOrSpaces(editor.getDocument().getCharsSequence())); @@ -109,7 +110,7 @@ public class ConsoleExecuteAction extends DumbAwareAction { } @Override - public final void actionPerformed(AnActionEvent e) { + public final void actionPerformed(@NotNull AnActionEvent e) { myExecuteActionHandler.runExecuteAction(myConsole, myConsoleView); } @@ -139,6 +140,8 @@ public class ConsoleExecuteAction extends DumbAwareAction { private boolean myAddToHistory = true; final boolean myPreserveMarkup; + boolean useProcessStdIn; + public ConsoleExecuteActionHandler(boolean preserveMarkup) { myCommandHistoryModel = new ConsoleHistoryModel(); myPreserveMarkup = preserveMarkup; @@ -156,19 +159,25 @@ public class ConsoleExecuteAction extends DumbAwareAction { myAddToHistory = addCurrentToHistory; } - /** - * @deprecated - */ protected void beforeExecution(@NotNull LanguageConsoleImpl console) { } protected void runExecuteAction(@NotNull LanguageConsoleImpl console, @Nullable LanguageConsoleView consoleView) { - //noinspection deprecation - beforeExecution(console); + if (!useProcessStdIn) { + beforeExecution(console); + } - String text = console.prepareExecuteAction(myAddToHistory, myPreserveMarkup, true); + String text = console.prepareExecuteAction(myAddToHistory && !useProcessStdIn, myPreserveMarkup, true); ((UndoManagerImpl)UndoManager.getInstance(console.getProject())).invalidateActionsFor(DocumentReferenceManager.getInstance().create(console.getCurrentEditor().getDocument())); - addToCommandHistoryAndExecute(console, consoleView, text); + + if (useProcessStdIn) { + assert consoleView != null; + consoleView.print(text, ConsoleViewContentType.USER_INPUT); + consoleView.print("\n", ConsoleViewContentType.USER_INPUT); + } + else { + addToCommandHistoryAndExecute(console, consoleView, text); + } } private void addToCommandHistoryAndExecute(@NotNull LanguageConsoleImpl console, @Nullable LanguageConsoleView consoleView, @NotNull String text) { diff --git a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleBuilder.java b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleBuilder.java index 329b9f0e3f13..a20b8c706ff2 100644 --- a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleBuilder.java +++ b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleBuilder.java @@ -1,6 +1,8 @@ package com.intellij.execution.console; +import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.execution.process.ProcessHandler; +import com.intellij.ide.util.PropertiesComponent; import com.intellij.lang.Language; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.editor.Document; @@ -60,6 +62,8 @@ public final class LanguageConsoleBuilder { private boolean oneLineInput; + private String processInputStateKey; + // todo to be removed public LanguageConsoleBuilder(@SuppressWarnings("NullableProblems") @NotNull LanguageConsoleView consoleView) { this.consoleView = consoleView; @@ -87,6 +91,7 @@ public final class LanguageConsoleBuilder { return this; } + @NotNull public LanguageConsoleBuilder initActions(@NotNull BaseConsoleExecuteActionHandler executeActionHandler, @NotNull String historyType) { if (consoleView == null) { this.executeActionHandler = executeActionHandler; @@ -150,6 +155,13 @@ public final class LanguageConsoleBuilder { return this; } + @NotNull + public LanguageConsoleBuilder processInputStateKey(@Nullable String value) { + processInputStateKey = value; + return this; + } + + @NotNull public LanguageConsoleView build(@NotNull Project project, @NotNull Language language) { GutteredLanguageConsole console = new GutteredLanguageConsole(language.getDisplayName() + " Console", project, language, gutterContentProvider, psiFileFactory); if (oneLineInput) { @@ -160,6 +172,17 @@ public final class LanguageConsoleBuilder { assert historyType != null; doInitAction(consoleView, executeActionHandler, historyType); } + + if (processInputStateKey != null) { + assert executeActionHandler != null; + if (PropertiesComponent.getInstance().getBoolean(processInputStateKey, false)) { + executeActionHandler.useProcessStdIn = true; + DaemonCodeAnalyzer daemonCodeAnalyzer = DaemonCodeAnalyzer.getInstance(consoleView.getProject()); + daemonCodeAnalyzer.setHighlightingEnabled(consoleView.getConsole().getFile(), false); + } + consoleView.addCustomConsoleAction(new UseConsoleInputAction(processInputStateKey)); + } + console.initComponents(); return consoleView; } diff --git a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java index d7f40f35a219..711184d9b705 100644 --- a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java @@ -659,6 +659,7 @@ public class LanguageConsoleImpl implements Disposable, TypeSafeDataProvider { if (myCurrentEditor != null && myCurrentEditor.isDisposed()) { myCurrentEditor = null; } + if (!isValid()) return; ApplicationManager.getApplication().runReadAction(myUiUpdateRunnable); } } @@ -680,6 +681,10 @@ public class LanguageConsoleImpl implements Disposable, TypeSafeDataProvider { return ObjectUtils.assertNotNull(myVirtualFile.getLanguage()); } + public boolean isValid() { + return myVirtualFile.isValid() && myProject.isOpen(); + } + public void setLanguage(@NotNull Language language) { myVirtualFile.setLanguage(language); myVirtualFile.setContent(myEditorDocument, myEditorDocument.getText(), false); diff --git a/platform/lang-impl/src/com/intellij/execution/console/UseConsoleInputAction.java b/platform/lang-impl/src/com/intellij/execution/console/UseConsoleInputAction.java new file mode 100644 index 000000000000..5b450e3bd154 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/execution/console/UseConsoleInputAction.java @@ -0,0 +1,56 @@ +package com.intellij.execution.console; + +import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; +import com.intellij.icons.AllIcons; +import com.intellij.ide.util.PropertiesComponent; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.actionSystem.ToggleAction; +import com.intellij.openapi.actionSystem.ex.ActionUtil; +import com.intellij.openapi.project.DumbAware; +import com.intellij.psi.PsiFile; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +final class UseConsoleInputAction extends ToggleAction implements DumbAware { + private final String processInputStateKey; + private boolean useProcessStdIn; + + public UseConsoleInputAction(@NotNull String processInputStateKey) { + super("Use Console Input", null, AllIcons.Debugger.CommandLine); + + this.processInputStateKey = processInputStateKey; + useProcessStdIn = PropertiesComponent.getInstance().getBoolean(processInputStateKey, false); + } + + @Override + public boolean isSelected(@Nullable AnActionEvent event) { + return !useProcessStdIn; + } + + @Override + public void setSelected(AnActionEvent event, boolean state) { + useProcessStdIn = !state; + + LanguageConsoleView consoleView = (LanguageConsoleView)event.getData(LangDataKeys.CONSOLE_VIEW); + assert consoleView != null; + DaemonCodeAnalyzer daemonCodeAnalyzer = DaemonCodeAnalyzer.getInstance(consoleView.getProject()); + PsiFile file = consoleView.getConsole().getFile(); + daemonCodeAnalyzer.setHighlightingEnabled(file, state); + daemonCodeAnalyzer.restart(file); + if (state) { + PropertiesComponent.getInstance().unsetValue(processInputStateKey); + } + else { + PropertiesComponent.getInstance().setValue(processInputStateKey, "true"); + } + + List<AnAction> actions = ActionUtil.getActions(consoleView.getConsole().getConsoleEditor().getComponent()); + ConsoleExecuteAction action = ContainerUtil.findInstance(actions, ConsoleExecuteAction.class); + action.myExecuteActionHandler.useProcessStdIn = !state; + } +}
\ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/execution/impl/BeforeRunStepsPanel.java b/platform/lang-impl/src/com/intellij/execution/impl/BeforeRunStepsPanel.java index de5405b87a89..191c0f79b25c 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/BeforeRunStepsPanel.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/BeforeRunStepsPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -28,7 +28,7 @@ import com.intellij.openapi.actionSystem.impl.SimpleDataContext; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.ListPopup; -import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Conditions; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.SystemInfo; @@ -300,7 +300,7 @@ class BeforeRunStepsPanel extends JPanel { final ListPopup popup = popupFactory.createActionGroupPopup(ExecutionBundle.message("add.new.run.configuration.acrtion.name"), actionGroup, SimpleDataContext.getProjectContext(myRunConfiguration.getProject()), false, false, false, null, - -1, Condition.TRUE); + -1, Conditions.<AnAction>alwaysTrue()); popup.show(button.getPreferredPopupPoint()); } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index 3fce510e725e..ae5cfe829f6c 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -290,9 +290,16 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo myFilters = new CompositeFilter(project); if (usePredefinedMessageFilter) { for (ConsoleFilterProvider eachProvider : Extensions.getExtensions(ConsoleFilterProvider.FILTER_PROVIDERS)) { - Filter[] filters = eachProvider instanceof ConsoleFilterProviderEx - ? ((ConsoleFilterProviderEx)eachProvider).getDefaultFilters(project, searchScope) - : eachProvider.getDefaultFilters(project); + Filter[] filters; + if (eachProvider instanceof ConsoleDependentFilterProvider) { + filters = ((ConsoleDependentFilterProvider)eachProvider).getDefaultFilters(this, project, searchScope); + } + else if (eachProvider instanceof ConsoleFilterProviderEx) { + filters = ((ConsoleFilterProviderEx)eachProvider).getDefaultFilters(project, searchScope); + } + else { + filters = eachProvider.getDefaultFilters(project); + } for (Filter filter : filters) { myFilters.addFilter(filter); } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java index 95d4db09c297..1a006c294275 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java @@ -588,15 +588,9 @@ class RunConfigurable extends BaseConfigurable { @Override public JComponent createComponent() { - for (RunConfigurationsSettings each : Extensions.getExtensions(RunConfigurationsSettings.EXTENSION_POINT)) { - try { - UnnamedConfigurable configurable = each.createConfigurable(myProject); - myAdditionalSettings.add(Pair.create(configurable, configurable.createComponent())); - } - catch (NoSuchMethodError e) { - // in case someone has already implemented old RunConfigurationsSettings.createConfigurable() - LOG.error(e); - } + for (RunConfigurationsSettings each : Extensions.getExtensions(RunConfigurationsSettings.EXTENSION_POINT, myProject)) { + UnnamedConfigurable configurable = each.createConfigurable(); + myAdditionalSettings.add(Pair.create(configurable, configurable.createComponent())); } myWholePanel = new JPanel(new BorderLayout()); diff --git a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java index f16f8dadfb45..14877309db74 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java @@ -23,7 +23,6 @@ import com.intellij.execution.configurations.RunConfigurationBase; import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.configurations.SearchScopeProvider; import com.intellij.execution.impl.ConsoleViewImpl; -import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.ui.*; import com.intellij.execution.ui.actions.CloseAction; import com.intellij.execution.ui.layout.PlaceInGrid; @@ -41,7 +40,6 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.*; import java.util.Collection; import java.util.List; @@ -113,14 +111,13 @@ public class RunContentBuilder extends RunTab { @NotNull private RunContentDescriptor createDescriptor() { - final RunProfile profile = getEnvironment().getRunProfile(); + final RunProfile profile = myEnvironment.getRunProfile(); if (ApplicationManager.getApplication().isUnitTestMode()) { - RunContentDescriptor contentDescriptor = new RunContentDescriptor(profile, myExecutionResult, myUi); - Disposer.register(contentDescriptor, this); - return contentDescriptor; + return new RunContentDescriptor(profile, myExecutionResult, myUi); } final ExecutionConsole console = myExecutionResult.getExecutionConsole(); + RunContentDescriptor contentDescriptor = new RunContentDescriptor(profile, myExecutionResult, myUi); if (console != null) { if (console instanceof ExecutionConsoleEx) { ((ExecutionConsoleEx)console).buildUi(myUi); @@ -128,17 +125,15 @@ public class RunContentBuilder extends RunTab { else { buildConsoleUiDefault(myUi, console); } - initLogConsoles(profile, myExecutionResult.getProcessHandler(), console); + initLogConsoles(profile, contentDescriptor, console); } - RunContentDescriptor contentDescriptor = new RunContentDescriptor(profile, myExecutionResult, myUi); - Disposer.register(contentDescriptor, this); myUi.getOptions().setLeftToolbar(createActionToolbar(contentDescriptor), ActionPlaces.UNKNOWN); if (profile instanceof RunConfigurationBase) { if (console instanceof ObservableConsoleView && !ApplicationManager.getApplication().isUnitTestMode()) { ((ObservableConsoleView)console).addChangeListener(new ConsoleToFrontListener((RunConfigurationBase)profile, - getProject(), - getEnvironment().getExecutor(), + myProject, + myEnvironment.getExecutor(), contentDescriptor, myUi), this); @@ -182,19 +177,16 @@ public class RunContentBuilder extends RunTab { } @NotNull - private ActionGroup createActionToolbar(@NotNull RunContentDescriptor contentDescriptor) { + private ActionGroup createActionToolbar(@NotNull final RunContentDescriptor contentDescriptor) { final DefaultActionGroup actionGroup = new DefaultActionGroup(); actionGroup.add(ActionManager.getInstance().getAction(IdeActions.ACTION_RERUN)); - if (myExecutionResult instanceof DefaultExecutionResult) { - final AnAction[] actions = ((DefaultExecutionResult)myExecutionResult).getRestartActions(); - if (actions != null) { - actionGroup.addAll(actions); - if (actions.length > 0) { - actionGroup.addSeparator(); - } - } + final AnAction[] actions = contentDescriptor.getRestartActions(); + actionGroup.addAll(actions); + if (actions.length > 0) { + actionGroup.addSeparator(); } + actionGroup.add(ActionManager.getInstance().getAction(IdeActions.ACTION_STOP_PROGRAM)); if (myExecutionResult instanceof DefaultExecutionResult) { actionGroup.addAll(((DefaultExecutionResult)myExecutionResult).getAdditionalStopActions()); @@ -215,37 +207,24 @@ public class RunContentBuilder extends RunTab { actionGroup.add(myUi.getOptions().getLayoutActions()); actionGroup.addSeparator(); actionGroup.add(PinToolwindowTabAction.getPinAction()); - actionGroup.add(new CloseAction(getEnvironment().getExecutor(), contentDescriptor, getProject())); + actionGroup.add(new CloseAction(myEnvironment.getExecutor(), contentDescriptor, myProject)); final String helpId = contentDescriptor.getHelpId(); - actionGroup.add(new ContextHelpAction(helpId != null ? helpId : getEnvironment().getExecutor().getHelpId())); + actionGroup.add(new ContextHelpAction(helpId != null ? helpId : myEnvironment.getExecutor().getHelpId())); return actionGroup; } - @Override - public ProcessHandler getProcessHandler() { - return myExecutionResult.getProcessHandler(); - } - /** * @param reuseContent see {@link RunContentDescriptor#myContent} */ public RunContentDescriptor showRunContent(@Nullable RunContentDescriptor reuseContent) { RunContentDescriptor descriptor = createDescriptor(); + Disposer.register(descriptor, this); + Disposer.register(myProject, descriptor); RunContentManagerImpl.copyContentAndBehavior(descriptor, reuseContent); myRunContentDescriptor = descriptor; return descriptor; } - @Override - protected RunnerLayoutUi getUi() { - return myUi; - } - - @Override - protected Icon getDefaultIcon() { - return AllIcons.Debugger.Console; - } - public static class ConsoleToFrontListener implements ConsoleViewImpl.ChangeListener { @NotNull private final RunConfigurationBase myRunConfigurationBase; @NotNull private final Project myProject; diff --git a/platform/lang-impl/src/com/intellij/execution/runners/RunTab.java b/platform/lang-impl/src/com/intellij/execution/runners/RunTab.java index 2edc2098ce15..6628c78f1851 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/RunTab.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/RunTab.java @@ -25,6 +25,8 @@ import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.ui.ExecutionConsole; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.execution.ui.RunnerLayoutUi; +import com.intellij.icons.AllIcons; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.project.Project; @@ -33,12 +35,20 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public abstract class RunTab extends LogConsoleManagerBase implements DataProvider { +import javax.swing.*; + +public abstract class RunTab implements DataProvider, Disposable { @NotNull protected final RunnerLayoutUi myUi; - protected final LogFilesManager myManager; + private LogFilesManager myManager; protected RunContentDescriptor myRunContentDescriptor; + protected ExecutionEnvironment myEnvironment; + protected final Project myProject; + private final GlobalSearchScope mySearchScope; + + private LogConsoleManagerBase logConsoleManager; + protected RunTab(@NotNull ExecutionEnvironment environment, @NotNull String runnerType) { this(environment.getProject(), SearchScopeProvider.createSearchScope(environment.getProject(), environment.getRunProfile()), @@ -46,15 +56,21 @@ public abstract class RunTab extends LogConsoleManagerBase implements DataProvid environment.getExecutor().getId(), environment.getRunProfile().getName()); - setEnvironment(environment); + myEnvironment = environment; } - protected RunTab(@NotNull Project project, @NotNull GlobalSearchScope searchScope, @NotNull String runnerType, @NotNull String runnerTitle, @NotNull String sessionName) { - super(project, searchScope); + @Override + public void dispose() { + myRunContentDescriptor = null; + myEnvironment = null; + logConsoleManager = null; + } - myManager = new LogFilesManager(project, this, this); + protected RunTab(@NotNull Project project, @NotNull GlobalSearchScope searchScope, @NotNull String runnerType, @NotNull String runnerTitle, @NotNull String sessionName) { + myProject = project; + mySearchScope = searchScope; - myUi = RunnerLayoutUi.Factory.getInstance(getProject()).create(runnerType, runnerTitle, sessionName, this); + myUi = RunnerLayoutUi.Factory.getInstance(project).create(runnerType, runnerTitle, sessionName, this); myUi.getContentManager().addDataProvider(this); } @@ -62,11 +78,10 @@ public abstract class RunTab extends LogConsoleManagerBase implements DataProvid @Override public Object getData(@NonNls String dataId) { if (LangDataKeys.RUN_PROFILE.is(dataId)) { - ExecutionEnvironment environment = getEnvironment(); - return environment == null ? null : environment.getRunProfile(); + return myEnvironment == null ? null : myEnvironment.getRunProfile(); } else if (LangDataKeys.EXECUTION_ENVIRONMENT.is(dataId)) { - return getEnvironment(); + return myEnvironment; } else if (LangDataKeys.RUN_CONTENT_DESCRIPTOR.is(dataId)) { return myRunContentDescriptor; @@ -74,21 +89,40 @@ public abstract class RunTab extends LogConsoleManagerBase implements DataProvid return null; } - @Override - public final void setEnvironment(@NotNull ExecutionEnvironment environment) { - super.setEnvironment(environment); + @NotNull + public LogConsoleManagerBase getLogConsoleManager() { + if (logConsoleManager == null) { + logConsoleManager = new LogConsoleManagerBase(myProject, mySearchScope) { + @Override + protected Icon getDefaultIcon() { + return AllIcons.Debugger.Console; + } + + @Override + protected RunnerLayoutUi getUi() { + return myUi; + } - RunProfile profile = environment.getRunProfile(); - if (profile instanceof RunConfigurationBase) { - myManager.registerFileMatcher((RunConfigurationBase)profile); + @Override + public ProcessHandler getProcessHandler() { + return myRunContentDescriptor == null ? null : myRunContentDescriptor.getProcessHandler(); + } + }; } + return logConsoleManager; } - protected final void initLogConsoles(@NotNull RunProfile runConfiguration, @Nullable ProcessHandler processHandler, @Nullable ExecutionConsole console) { - if (runConfiguration instanceof RunConfigurationBase && processHandler != null) { + protected final void initLogConsoles(@NotNull RunProfile runConfiguration, @NotNull RunContentDescriptor contentDescriptor, @Nullable ExecutionConsole console) { + ProcessHandler processHandler = contentDescriptor.getProcessHandler(); + if (runConfiguration instanceof RunConfigurationBase) { RunConfigurationBase configuration = (RunConfigurationBase)runConfiguration; - myManager.initLogConsoles(configuration, processHandler); - OutputFileUtil.attachDumpListener(configuration, processHandler, console); + if (myManager == null) { + myManager = new LogFilesManager(getLogConsoleManager()); + } + myManager.addLogConsoles(configuration, processHandler); + if (processHandler != null) { + OutputFileUtil.attachDumpListener(configuration, processHandler, console); + } } } } diff --git a/platform/lang-impl/src/com/intellij/execution/ui/CommonProgramParametersPanel.java b/platform/lang-impl/src/com/intellij/execution/ui/CommonProgramParametersPanel.java index 0f31d6223027..79284abf8356 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/CommonProgramParametersPanel.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/CommonProgramParametersPanel.java @@ -56,6 +56,7 @@ public class CommonProgramParametersPanel extends JPanel implements PanelWithAnc protected JComponent myAnchor; private Module myModuleContext = null; + private boolean myHasModuleMacro = false; public CommonProgramParametersPanel() { this(true); @@ -120,7 +121,7 @@ public class CommonProgramParametersPanel extends JPanel implements PanelWithAnc @Override public void actionPerformed(ActionEvent e) { List<String> macros = new SmartList<String>(PathMacros.getInstance().getUserMacroNames()); - if (myModuleContext != null) { + if (myModuleContext != null || myHasModuleMacro) { macros.add(PathMacroUtil.MODULE_DIR_MACRO_NAME); } @@ -172,6 +173,10 @@ public class CommonProgramParametersPanel extends JPanel implements PanelWithAnc myModuleContext = moduleContext; } + public void setHasModuleMacro() { + myHasModuleMacro = true; + } + public LabeledComponent<RawCommandLineEditor> getProgramParametersComponent() { return myProgramParametersComponent; } diff --git a/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java b/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java index 9613ac0dd33f..4d7eee35a462 100644 --- a/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java +++ b/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java @@ -425,6 +425,10 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data myToolbarComponent.setOpaque(false); } + public void selectAllText() { + mySearchField.selectAll(); + } + private boolean secondaryActionsAvailable() { return FindManagerImpl.ourHasSearchInCommentsAndLiterals; } @@ -483,10 +487,11 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data } private void updateUIWithFindModel() { - + boolean needToResetFocus = false; myActionsToolbar.updateActionsImmediately(); if ((myFindModel.isMultiline() && mySearchField instanceof JTextField) || (!myFindModel.isMultiline() && mySearchField instanceof JTextArea)) { + needToResetFocus = mySearchField.hasFocus(); myLeftComponent.removeAll(); myRightComponent.removeAll(); myReplaceRootComponent = null; @@ -529,6 +534,7 @@ public class EditorSearchComponent extends EditorHeaderComponent implements Data updateReplaceButton(); Utils.setSmallerFontForChildren(myToolbarComponent); revalidate(); + if (needToResetFocus) mySearchField.requestFocusInWindow(); } private static boolean wholeWordsApplicable(String stringToFind) { diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToFind.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToFind.java index 440a76c87608..7e4b555d264c 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToFind.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToFind.java @@ -36,8 +36,10 @@ public class SwitchToFind extends EditorHeaderAction implements DumbAware { action.actionPerformed(e); return; } - - final FindModel findModel = getEditorSearchComponent().getFindModel(); + + EditorSearchComponent component = getEditorSearchComponent(); + final FindModel findModel = component.getFindModel(); FindUtil.configureFindModel(false, null, findModel, false); + component.selectAllText(); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToReplace.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToReplace.java index f667f019db17..2d8b48aad855 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToReplace.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToReplace.java @@ -33,7 +33,9 @@ public class SwitchToReplace extends EditorHeaderAction { @Override public void actionPerformed(AnActionEvent e) { - final FindModel findModel = getEditorSearchComponent().getFindModel(); + EditorSearchComponent component = getEditorSearchComponent(); + final FindModel findModel = component.getFindModel(); FindUtil.configureFindModel(true, null, findModel, false); + component.selectAllText(); } } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleRegex.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleRegex.java index 1a4ea149df7d..472517ab336d 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleRegex.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleRegex.java @@ -30,12 +30,6 @@ public class ToggleRegex extends EditorHeaderToggleAction { } @Override - public void update(AnActionEvent e) { - super.update(e); - e.getPresentation().setVisible(!getEditorSearchComponent().getFindModel().isMultiline()); - } - - @Override public void setSelected(AnActionEvent e, boolean state) { final FindModel findModel = getEditorSearchComponent().getFindModel(); findModel.setRegularExpressions(state); diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java index 7dfdbbce16d7..822ffbb64037 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java @@ -38,6 +38,7 @@ import com.intellij.openapi.project.ProjectCoreUtil; import com.intellij.openapi.roots.*; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Conditions; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.util.text.TrigramBuilder; @@ -105,7 +106,7 @@ class FindInProjectTask { final Pattern pattern = FindInProjectUtil.createFileMaskRegExp(filter); //noinspection unchecked - myFileMask = pattern == null ? Condition.TRUE : new Condition<VirtualFile>() { + myFileMask = pattern == null ? Conditions.<VirtualFile>alwaysTrue() : new Condition<VirtualFile>() { @Override public boolean value(VirtualFile file) { return file != null && pattern.matcher(file.getName()).matches(); @@ -127,6 +128,9 @@ class FindInProjectTask { } }); myProgress.setIndeterminate(false); + if (LOG.isDebugEnabled()) { + LOG.debug("Searching for " + myFindModel.getStringToFind() + " in " + filesForFastWordSearch.size() + " indexed files"); + } searchInFiles(filesForFastWordSearch, processPresentation, consumer); @@ -136,6 +140,10 @@ class FindInProjectTask { final Collection<PsiFile> otherFiles = collectFilesInScope(filesForFastWordSearch, skipIndexed); myProgress.setIndeterminate(false); + if (LOG.isDebugEnabled()) { + LOG.debug("Searching for " + myFindModel.getStringToFind() + " in " + otherFiles.size() + " non-indexed files"); + } + long start = System.currentTimeMillis(); searchInFiles(otherFiles, processPresentation, consumer); if (skipIndexed && otherFiles.size() > 1000) { @@ -143,7 +151,10 @@ class FindInProjectTask { } } catch (ProcessCanceledException e) { - // fine + processPresentation.setCanceled(true); + if (LOG.isDebugEnabled()) { + LOG.debug("Usage search canceled", e); + } } if (!myLargeFiles.isEmpty()) { diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java b/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java index b7d58e926e30..f077008068ad 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java @@ -446,8 +446,16 @@ public class FindManagerImpl extends FindManager implements PersistentStateCompo final FindModel model = new FindModel(); model.copyFrom(findmodel); final String s = model.getStringToFind(); - model.setStringToFind(StringUtil.escapeToRegexp(s)); - model.setRegularExpressions(true); + String newStringToFind; + + if (findmodel.isRegularExpressions()) { + newStringToFind = StringUtil.replace(s, "\n", "\\n\\s*"); // add \\s* for convenience + } else { + newStringToFind = StringUtil.escapeToRegexp(s); + model.setRegularExpressions(true); + } + model.setStringToFind(newStringToFind); + return model; } return findmodel; diff --git a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreview.java b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreview.java index 995a67ecafa1..e104c1664857 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreview.java +++ b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreview.java @@ -24,7 +24,6 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.SelectionModel; -import com.intellij.openapi.editor.colors.CodeInsightColors; import com.intellij.openapi.editor.colors.EditorColors; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.event.*; @@ -53,9 +52,7 @@ import java.io.PrintStream; import java.util.*; import java.util.List; -public class LivePreview extends DocumentAdapter implements SearchResults.SearchResultsListener, - SelectionListener { - +public class LivePreview extends DocumentAdapter implements SearchResults.SearchResultsListener, SelectionListener { private static final Key<Object> IN_SELECTION_KEY = Key.create("LivePreview.IN_SELECTION_KEY"); private static final Object IN_SELECTION1 = new Object(); private static final Object IN_SELECTION2 = new Object(); @@ -73,6 +70,13 @@ public class LivePreview extends DocumentAdapter implements SearchResults.Search private String myReplacementPreviewText; private static boolean NotFound; + private final Set<RangeHighlighter> myHighlighters = new HashSet<RangeHighlighter>(); + private RangeHighlighter myCursorHighlighter; + private final List<VisibleAreaListener> myVisibleAreaListenersToRemove = new ArrayList<VisibleAreaListener>(); + private Delegate myDelegate; + private final SearchResults mySearchResults; + private Balloon myReplacementBalloon; + @Override public void selectionChanged(SelectionEvent e) { updateInSelectionHighlighters(); @@ -87,27 +91,15 @@ public class LivePreview extends DocumentAdapter implements SearchResults.Search } public interface Delegate { - @Nullable - String getStringToReplace(Editor editor, FindResult findResult); - + String getStringToReplace(@NotNull Editor editor, @Nullable FindResult findResult); } - private final Set<RangeHighlighter> myHighlighters = new HashSet<RangeHighlighter>(); - - private RangeHighlighter myCursorHighlighter; - private final List<VisibleAreaListener> myVisibleAreaListenersToRemove = new ArrayList<VisibleAreaListener>(); - - private static TextAttributes strikout() { - return EditorColorsManager.getInstance().getGlobalScheme().getAttributes(CodeInsightColors.DEPRECATED_ATTRIBUTES).clone(); + private static TextAttributes strikeout() { + Color color = EditorColorsManager.getInstance().getGlobalScheme().getDefaultForeground(); + return new TextAttributes(null, null, color, EffectType.STRIKEOUT, 0); } - private Delegate myDelegate; - - private final SearchResults mySearchResults; - - private Balloon myReplacementBalloon; - @Override public void searchResultsUpdated(SearchResults sr) { final Project project = mySearchResults.getProject(); @@ -323,7 +315,7 @@ public class LivePreview extends DocumentAdapter implements SearchResults.Search attributes.setEffectColor(attributes.getBackgroundColor()); } if (mySearchResults.isExcluded(range)) { - highlightRange(range, strikout(), myHighlighters); + highlightRange(range, strikeout(), myHighlighters); } else { highlightRange(range, attributes, myHighlighters); } diff --git a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewController.java b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewController.java index 94a6c3f9c1bc..a894781d5cb1 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewController.java +++ b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewController.java @@ -19,7 +19,9 @@ import com.intellij.find.*; import com.intellij.find.impl.FindResultImpl; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.*; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.RangeMarker; +import com.intellij.openapi.editor.SelectionModel; import com.intellij.openapi.editor.event.DocumentAdapter; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.event.SelectionEvent; @@ -29,6 +31,7 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.ReadonlyStatusHandler; import com.intellij.util.Alarm; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -147,7 +150,7 @@ public class LivePreviewController implements LivePreview.Delegate, FindUtil.Rep } @Override - public String getStringToReplace(Editor editor, FindResult findResult) { + public String getStringToReplace(@NotNull Editor editor, @Nullable FindResult findResult) { if (findResult == null) { return null; } diff --git a/platform/lang-impl/src/com/intellij/ide/RecentDirectoryProjectsManagerEx.java b/platform/lang-impl/src/com/intellij/ide/RecentDirectoryProjectsManagerEx.java index 21207519fb6b..b9086439906b 100644 --- a/platform/lang-impl/src/com/intellij/ide/RecentDirectoryProjectsManagerEx.java +++ b/platform/lang-impl/src/com/intellij/ide/RecentDirectoryProjectsManagerEx.java @@ -29,11 +29,7 @@ import org.jetbrains.annotations.NotNull; */ @State( name = "RecentDirectoryProjectsManager", - roamingType = RoamingType.DISABLED, - storages = { - @Storage( - file = StoragePathMacros.APP_CONFIG + "/other.xml" - )} + storages = {@Storage(file = StoragePathMacros.APP_CONFIG + "/other.xml", roamingType = RoamingType.DISABLED)} ) public class RecentDirectoryProjectsManagerEx extends RecentDirectoryProjectsManager { public RecentDirectoryProjectsManagerEx(MessageBus messageBus) { diff --git a/platform/lang-impl/src/com/intellij/ide/actions/ExternalJavaDocAction.java b/platform/lang-impl/src/com/intellij/ide/actions/ExternalJavaDocAction.java index 71b02f867d8a..50525bc0e288 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/ExternalJavaDocAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/ExternalJavaDocAction.java @@ -131,7 +131,7 @@ public class ExternalJavaDocAction extends AnAction { } if (editor != null) { presentation.setEnabled(enabled); - if (event.getPlace().equals(ActionPlaces.MAIN_MENU)) { + if (ActionPlaces.isMainMenuOrActionSearch(event.getPlace())) { presentation.setVisible(true); } else { diff --git a/platform/lang-impl/src/com/intellij/ide/actions/GotoActionAction.java b/platform/lang-impl/src/com/intellij/ide/actions/GotoActionAction.java index e57d1eba05ef..b54a1989e692 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/GotoActionAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/GotoActionAction.java @@ -96,7 +96,7 @@ public class GotoActionAction extends GotoActionBase implements DumbAware { final DataContext context = DataManager.getInstance().getDataContext(component); final AnActionEvent event = new AnActionEvent(e == null ? null : e.getInputEvent(), context, - e == null ? ActionPlaces.UNKNOWN : e.getPlace(), + ActionPlaces.ACTION_SEARCH, presentation, ActionManager.getInstance(), e == null ? 0 : e.getModifiers()); diff --git a/platform/lang-impl/src/com/intellij/ide/actions/GotoActionBase.java b/platform/lang-impl/src/com/intellij/ide/actions/GotoActionBase.java index c109de7a00a9..5da112b375b9 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/GotoActionBase.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/GotoActionBase.java @@ -62,7 +62,7 @@ public abstract class GotoActionBase extends AnAction { private int myHistoryIndex = 0; @Override - public void actionPerformed(AnActionEvent e) { + public void actionPerformed(@NotNull AnActionEvent e) { LOG.assertTrue(!getClass().equals(myInAction)); try { myInAction = getClass(); @@ -79,7 +79,7 @@ public abstract class GotoActionBase extends AnAction { protected abstract void gotoActionPerformed(AnActionEvent e); @Override - public void update(final AnActionEvent event) { + public void update(@NotNull final AnActionEvent event) { final Presentation presentation = event.getPresentation(); final DataContext dataContext = event.getDataContext(); final Project project = CommonDataKeys.PROJECT.getData(dataContext); @@ -260,7 +260,7 @@ public abstract class GotoActionBase extends AnAction { abstract class HistoryAction extends DumbAwareAction { @Override - public void update(AnActionEvent e) { + public void update(@NotNull AnActionEvent e) { e.getPresentation().setEnabled(historyEnabled()); } @@ -277,7 +277,7 @@ public abstract class GotoActionBase extends AnAction { new HistoryAction() { @Override - public void actionPerformed(AnActionEvent e) { + public void actionPerformed(@NotNull AnActionEvent e) { List<String> strings = ourHistory.get(myInAction); setText(strings); myHistoryIndex = myHistoryIndex >= strings.size() - 1 ? 0 : myHistoryIndex + 1; @@ -287,7 +287,7 @@ public abstract class GotoActionBase extends AnAction { new HistoryAction() { @Override - public void actionPerformed(AnActionEvent e) { + public void actionPerformed(@NotNull AnActionEvent e) { List<String> strings = ourHistory.get(myInAction); setText(strings); myHistoryIndex = myHistoryIndex <= 0 ? strings.size() - 1 : myHistoryIndex - 1; diff --git a/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseCallHierarchyAction.java b/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseCallHierarchyAction.java index 853d859f9f82..9350b4b1d73c 100644 --- a/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseCallHierarchyAction.java +++ b/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseCallHierarchyAction.java @@ -30,7 +30,7 @@ public final class BrowseCallHierarchyAction extends BrowseHierarchyActionBase { @Override public final void update(final AnActionEvent event){ final Presentation presentation = event.getPresentation(); - if (!ActionPlaces.MAIN_MENU.equals(event.getPlace())) { + if (!ActionPlaces.isMainMenuOrActionSearch(event.getPlace())) { presentation.setText(IdeBundle.message("action.browse.call.hierarchy")); } diff --git a/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseMethodHierarchyAction.java b/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseMethodHierarchyAction.java index 7cd056f7bb16..5a23c6b3925c 100644 --- a/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseMethodHierarchyAction.java +++ b/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseMethodHierarchyAction.java @@ -30,7 +30,7 @@ public final class BrowseMethodHierarchyAction extends BrowseHierarchyActionBase @Override public final void update(final AnActionEvent event){ final Presentation presentation = event.getPresentation(); - if (!ActionPlaces.MAIN_MENU.equals(event.getPlace())) { + if (!ActionPlaces.isMainMenuOrActionSearch(event.getPlace())) { presentation.setText(IdeBundle.message("action.browse.method.hierarchy")); } super.update(event); diff --git a/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseTypeHierarchyAction.java b/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseTypeHierarchyAction.java index 41234ef79679..6ac33fc1047a 100644 --- a/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseTypeHierarchyAction.java +++ b/platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseTypeHierarchyAction.java @@ -30,7 +30,7 @@ public final class BrowseTypeHierarchyAction extends BrowseHierarchyActionBase { @Override public final void update(final AnActionEvent event){ final Presentation presentation = event.getPresentation(); - if (!ActionPlaces.MAIN_MENU.equals(event.getPlace())) { + if (!ActionPlaces.isMainMenuOrActionSearch(event.getPlace())) { presentation.setText(IdeBundle.message("action.browse.type.hierarchy")); } super.update(event); diff --git a/platform/lang-impl/src/com/intellij/ide/impl/convert/JDomConvertingUtil.java b/platform/lang-impl/src/com/intellij/ide/impl/convert/JDomConvertingUtil.java index b2f040064fe4..21e55f9ab089 100644 --- a/platform/lang-impl/src/com/intellij/ide/impl/convert/JDomConvertingUtil.java +++ b/platform/lang-impl/src/com/intellij/ide/impl/convert/JDomConvertingUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -103,7 +103,7 @@ public class JDomConvertingUtil extends JDomSerializationUtil { } public static void copyChildren(Element from, Element to) { - copyChildren(from, to, Condition.TRUE); + copyChildren(from, to, Conditions.<Element>alwaysTrue()); } public static void copyChildren(Element from, Element to, Condition<Element> filter) { diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarListener.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarListener.java index 3fe38cea2ed3..e0a0d946c9c5 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarListener.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -18,6 +18,8 @@ package com.intellij.ide.navigationToolbar; import com.intellij.ProjectTopics; import com.intellij.ide.actions.CopyAction; import com.intellij.ide.actions.CutAction; +import com.intellij.ide.ui.LafManager; +import com.intellij.ide.ui.LafManagerListener; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.AnActionListener; @@ -57,7 +59,8 @@ import java.util.List; */ public class NavBarListener extends WolfTheProblemSolver.ProblemListener implements ActionListener, FocusListener, FileStatusListener, AnActionListener, FileEditorManagerListener, - PsiTreeChangeListener, ModuleRootListener, NavBarModelListener, PropertyChangeListener, KeyListener, WindowFocusListener { + PsiTreeChangeListener, ModuleRootListener, NavBarModelListener, PropertyChangeListener, KeyListener, WindowFocusListener, + LafManagerListener { private static final String LISTENER = "NavBarListener"; private static final String BUS = "NavBarMessageBus"; private final NavBarPanel myPanel; @@ -89,6 +92,8 @@ public class NavBarListener extends WolfTheProblemSolver.ProblemListener if (window != null) { window.addWindowFocusListener(listener); } + } else { + LafManager.getInstance().addLafManagerListener(listener); } } @@ -107,6 +112,7 @@ public class NavBarListener extends WolfTheProblemSolver.ProblemListener if (connection != null) { connection.disconnect(); } + LafManager.getInstance().removeLafManagerListener(listener); } } @@ -356,15 +362,19 @@ public class NavBarListener extends WolfTheProblemSolver.ProblemListener } @Override - public void windowLostFocus(WindowEvent e) { - final Window window = e.getWindow(); - final Window oppositeWindow = e.getOppositeWindow(); + public void lookAndFeelChanged(LafManager source) { + myPanel.getNavBarUI().clearItems(); + myPanel.revalidate(); + myPanel.repaint(); } + //---- Ignored @Override - public void windowGainedFocus(WindowEvent e) { - } + public void windowLostFocus(WindowEvent e) {} + + @Override + public void windowGainedFocus(WindowEvent e) {} @Override public void keyTyped(KeyEvent e) {} diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/ui/AbstractNavBarUI.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/ui/AbstractNavBarUI.java index 1201e146869d..5e0f6e58d106 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/ui/AbstractNavBarUI.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/ui/AbstractNavBarUI.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -40,7 +40,7 @@ import java.util.Map; */ public abstract class AbstractNavBarUI implements NavBarUI { - private final Map<NavBarItem, Map<ImageType, BufferedImage>> myCache = new THashMap<NavBarItem, Map<ImageType, BufferedImage>>(); + private final static Map<NavBarItem, Map<ImageType, BufferedImage>> myCache = new THashMap<NavBarItem, Map<ImageType, BufferedImage>>(); private enum ImageType { INACTIVE, NEXT_ACTIVE, ACTIVE, INACTIVE_FLOATING, NEXT_ACTIVE_FLOATING, ACTIVE_FLOATING, diff --git a/platform/lang-impl/src/com/intellij/ide/scratch/CreateScratchFileAction.java b/platform/lang-impl/src/com/intellij/ide/scratch/CreateScratchFileAction.java index 024c3feabe5e..7a190f6be71c 100644 --- a/platform/lang-impl/src/com/intellij/ide/scratch/CreateScratchFileAction.java +++ b/platform/lang-impl/src/com/intellij/ide/scratch/CreateScratchFileAction.java @@ -34,6 +34,7 @@ import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.ui.EmptyIcon; import org.jetbrains.annotations.NotNull; @@ -136,7 +137,7 @@ public class CreateScratchFileAction extends AnAction implements DumbAware { @NotNull public static List<Language> getLanguages() { - Set<Language> result = ContainerUtil.newTreeSet(new Comparator<Language>() { + Set<Language> result = ContainerUtilRt.newTreeSet(new Comparator<Language>() { @Override public int compare(@NotNull Language l1, @NotNull Language l2) { return l1.getDisplayName().compareTo(l2.getDisplayName()); diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java index 348283dc3885..05d9bb771978 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java @@ -40,6 +40,7 @@ import com.intellij.ui.components.JBLabel; import com.intellij.ui.speedSearch.SpeedSearchUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.ui.EmptyIcon; import com.intellij.util.ui.UIUtil; import org.apache.oro.text.regex.*; @@ -492,7 +493,7 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C @NotNull @Override public SortedSet<Object> sort(@NotNull Set<Object> elements) { - TreeSet<Object> objects = ContainerUtil.newTreeSet(this); + TreeSet<Object> objects = ContainerUtilRt.newTreeSet(this); objects.addAll(elements); return objects; } diff --git a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java index 8297a3db8e1f..98190010159b 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java +++ b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java @@ -29,6 +29,7 @@ import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.module.*; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; @@ -411,21 +412,32 @@ public class ScopeChooserCombo extends ComboboxWithBrowseButton implements Dispo } } - if (dataContext != null) { - final VirtualFile[] files = CommonDataKeys.VIRTUAL_FILE_ARRAY.getData(dataContext); - if (files != null) { - final List<VirtualFile> openFiles = Arrays.asList(files); - result.add(new DelegatingGlobalSearchScope(GlobalSearchScope.filesScope(project, openFiles)){ + ContainerUtil.addIfNotNull(result, getSelectedFilesScope(project, dataContext)); + + return ContainerUtil.newArrayList(result); + } + + @Nullable + private static SearchScope getSelectedFilesScope(final Project project, @Nullable DataContext dataContext) { + final VirtualFile[] filesOrDirs = dataContext == null ? null : CommonDataKeys.VIRTUAL_FILE_ARRAY.getData(dataContext); + if (filesOrDirs != null) { + final List<VirtualFile> selectedFiles = ContainerUtil.filter(filesOrDirs, new Condition<VirtualFile>() { + @Override + public boolean value(VirtualFile file) { + return !file.isDirectory(); + } + }); + if (!selectedFiles.isEmpty()) { + return new DelegatingGlobalSearchScope(GlobalSearchScope.filesScope(project, selectedFiles)){ @NotNull @Override public String getDisplayName() { return "Selected Files"; } - }); + }; } } - - return ContainerUtil.newArrayList(result); + return null; } protected static Set<VirtualFile> collectFiles(Set<Usage> usages, boolean findFirst) { diff --git a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserConfigurable.java b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserConfigurable.java index 96de48a0db13..a2bf7a47af28 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserConfigurable.java +++ b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserConfigurable.java @@ -81,7 +81,7 @@ public class ScopeChooserConfigurable extends MasterDetailsComponent implements @Override protected Dimension getPanelPreferredSize() { - return new Dimension(-1, -1); + return new Dimension(400, 200); } @Override diff --git a/platform/lang-impl/src/com/intellij/lang/customFolding/CustomFoldingRegionsPopup.java b/platform/lang-impl/src/com/intellij/lang/customFolding/CustomFoldingRegionsPopup.java new file mode 100644 index 000000000000..203179709dae --- /dev/null +++ b/platform/lang-impl/src/com/intellij/lang/customFolding/CustomFoldingRegionsPopup.java @@ -0,0 +1,133 @@ +/* + * Copyright 2000-2014 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.lang.customFolding; + +import com.intellij.ide.IdeBundle; +import com.intellij.lang.folding.FoldingDescriptor; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.ScrollType; +import com.intellij.openapi.fileEditor.ex.IdeDocumentHistory; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.popup.JBPopup; +import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.ui.popup.PopupChooserBuilder; +import com.intellij.psi.PsiElement; +import com.intellij.ui.components.JBList; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.*; + +/** + * @author Rustam Vishnyakov + */ +public class CustomFoldingRegionsPopup { + private final @NotNull JBList myRegionsList; + private final @NotNull JBPopup myPopup; + private final @NotNull Editor myEditor; + + CustomFoldingRegionsPopup(@NotNull Collection<FoldingDescriptor> descriptors, + @NotNull final Editor editor, + @NotNull final Project project) { + myEditor = editor; + myRegionsList = new JBList(); + //noinspection unchecked + myRegionsList.setModel(new MyListModel(orderByPosition(descriptors))); + myRegionsList.setSelectedIndex(0); + + final PopupChooserBuilder popupBuilder = JBPopupFactory.getInstance().createListPopupBuilder(myRegionsList); + myPopup = popupBuilder + .setTitle(IdeBundle.message("goto.custom.region.command")) + .setResizable(false) + .setMovable(false) + .setItemChoosenCallback(new Runnable() { + @Override + public void run() { + PsiElement navigationElement = getNavigationElement(); + if (navigationElement != null) { + navigateTo(editor, navigationElement); + IdeDocumentHistory.getInstance(project).includeCurrentCommandAsNavigation(); + } + } + }).createPopup(); + } + + void show() { + myPopup.showInBestPositionFor(myEditor); + } + + private static class MyListModel extends DefaultListModel { + private MyListModel(Collection<FoldingDescriptor> descriptors) { + for (FoldingDescriptor descriptor : descriptors) { + //noinspection unchecked + super.addElement(new MyFoldingDescriptorWrapper(descriptor)); + } + } + } + + private static class MyFoldingDescriptorWrapper { + private final @NotNull FoldingDescriptor myDescriptor; + + private MyFoldingDescriptorWrapper(@NotNull FoldingDescriptor descriptor) { + myDescriptor = descriptor; + } + + @NotNull + public FoldingDescriptor getDescriptor() { + return myDescriptor; + } + + @Nullable + @Override + public String toString() { + return myDescriptor.getPlaceholderText(); + } + } + + @Nullable + public PsiElement getNavigationElement() { + Object selection = myRegionsList.getSelectedValue(); + if (selection instanceof MyFoldingDescriptorWrapper) { + return ((MyFoldingDescriptorWrapper)selection).getDescriptor().getElement().getPsi(); + } + return null; + } + + private static Collection<FoldingDescriptor> orderByPosition(Collection<FoldingDescriptor> descriptors) { + List<FoldingDescriptor> sorted = new ArrayList<FoldingDescriptor>(descriptors.size()); + sorted.addAll(descriptors); + Collections.sort(sorted, new Comparator<FoldingDescriptor>() { + @Override + public int compare(FoldingDescriptor descriptor1, FoldingDescriptor descriptor2) { + int pos1 = descriptor1.getElement().getTextRange().getStartOffset(); + int pos2 = descriptor2.getElement().getTextRange().getStartOffset(); + return pos1 - pos2; + } + }); + return sorted; + } + + private static void navigateTo(@NotNull Editor editor, @NotNull PsiElement element) { + int offset = element.getTextRange().getStartOffset(); + if (offset >= 0 && offset < editor.getDocument().getTextLength()) { + editor.getCaretModel().removeSecondaryCarets(); + editor.getCaretModel().moveToOffset(offset); + editor.getScrollingModel().scrollToCaret(ScrollType.CENTER); + editor.getSelectionModel().removeSelection(); + } + } +} diff --git a/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionAction.java b/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionAction.java index 016f7f14cc4d..e0117affbcad 100644 --- a/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionAction.java +++ b/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionAction.java @@ -16,26 +16,35 @@ package com.intellij.lang.customFolding; import com.intellij.ide.IdeBundle; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.actionSystem.PlatformDataKeys; -import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.lang.Language; +import com.intellij.lang.folding.*; +import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.command.CommandProcessor; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.ScrollType; -import com.intellij.openapi.fileEditor.ex.IdeDocumentHistory; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiElement; +import com.intellij.openapi.ui.MessageType; +import com.intellij.openapi.ui.popup.Balloon; +import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.util.Disposer; +import com.intellij.psi.FileViewProvider; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiFile; +import com.intellij.util.containers.HashSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Set; /** * @author Rustam Vishnyakov */ -public class GotoCustomRegionAction extends AnAction implements DumbAware { +public class GotoCustomRegionAction extends AnAction implements DumbAware, PopupAction { @Override - public void actionPerformed(AnActionEvent e) { + public void actionPerformed(final AnActionEvent e) { final Project project = e.getProject(); final Editor editor = e.getData(CommonDataKeys.EDITOR); if (Boolean.TRUE.equals(e.getData(PlatformDataKeys.IS_MODAL_CONTEXT))) { @@ -52,14 +61,13 @@ public class GotoCustomRegionAction extends AnAction implements DumbAware { new Runnable() { @Override public void run() { - GotoCustomRegionDialog dialog = new GotoCustomRegionDialog(project, editor); - dialog.show(); - if (dialog.isOK()) { - PsiElement navigationElement = dialog.getNavigationElement(); - if (navigationElement != null) { - navigateTo(editor, navigationElement); - IdeDocumentHistory.getInstance(project).includeCurrentCommandAsNavigation(); - } + Collection<FoldingDescriptor> foldingDescriptors = getCustomFoldingDescriptors(editor, project); + if (foldingDescriptors.size() > 0) { + CustomFoldingRegionsPopup regionsPopup = new CustomFoldingRegionsPopup(foldingDescriptors, editor, project); + regionsPopup.show(); + } + else { + notifyCustomRegionsUnavailable(editor, project); } } }, @@ -71,7 +79,7 @@ public class GotoCustomRegionAction extends AnAction implements DumbAware { @Override public void update(AnActionEvent e) { Presentation presentation = e.getPresentation(); - presentation.setText("Custom Region..."); + presentation.setText(IdeBundle.message("goto.custom.region.menu.item")); final Editor editor = e.getData(CommonDataKeys.EDITOR); final Project project = e.getProject(); boolean isAvailable = editor != null && project != null; @@ -79,13 +87,49 @@ public class GotoCustomRegionAction extends AnAction implements DumbAware { presentation.setVisible(isAvailable); } - private static void navigateTo(Editor editor, PsiElement element) { - int offset = element.getTextRange().getStartOffset(); - if (offset >= 0 && offset < editor.getDocument().getTextLength()) { - editor.getCaretModel().removeSecondaryCarets(); - editor.getCaretModel().moveToOffset(offset); - editor.getScrollingModel().scrollToCaret(ScrollType.CENTER); - editor.getSelectionModel().removeSelection(); + @NotNull + private static Collection<FoldingDescriptor> getCustomFoldingDescriptors(@NotNull Editor editor, @NotNull Project project) { + Set<FoldingDescriptor> foldingDescriptors = new HashSet<FoldingDescriptor>(); + final Document document = editor.getDocument(); + PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); + PsiFile file = documentManager != null ? documentManager.getPsiFile(document) : null; + if (file != null) { + final FileViewProvider viewProvider = file.getViewProvider(); + for (final Language language : viewProvider.getLanguages()) { + final PsiFile psi = viewProvider.getPsi(language); + final FoldingBuilder foldingBuilder = LanguageFolding.INSTANCE.forLanguage(language); + if (psi != null) { + for (FoldingDescriptor descriptor : LanguageFolding.buildFoldingDescriptors(foldingBuilder, psi, document, false)) { + CustomFoldingBuilder customFoldingBuilder = getCustomFoldingBuilder(foldingBuilder, descriptor); + if (customFoldingBuilder != null) { + if (customFoldingBuilder.isCustomRegionStart(descriptor.getElement())) { + foldingDescriptors.add(descriptor); + } + } + } + } + } } + return foldingDescriptors; + } + + @Nullable + private static CustomFoldingBuilder getCustomFoldingBuilder(FoldingBuilder builder, FoldingDescriptor descriptor) { + if (builder instanceof CustomFoldingBuilder) return (CustomFoldingBuilder)builder; + FoldingBuilder originalBuilder = descriptor.getElement().getUserData(CompositeFoldingBuilder.FOLDING_BUILDER); + if (originalBuilder instanceof CustomFoldingBuilder) return (CustomFoldingBuilder)originalBuilder; + return null; + } + + private static void notifyCustomRegionsUnavailable(@NotNull Editor editor, @NotNull Project project) { + final JBPopupFactory popupFactory = JBPopupFactory.getInstance(); + Balloon balloon = popupFactory + .createHtmlTextBalloonBuilder(IdeBundle.message("goto.custom.region.message.unavailable"), MessageType.INFO, null) + .setFadeoutTime(2000) + .setHideOnClickOutside(true) + .setHideOnKeyOutside(true) + .createBalloon(); + Disposer.register(project, balloon); + balloon.show(popupFactory.guessBestPopupLocation(editor), Balloon.Position.above); } } diff --git a/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.form b/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.form deleted file mode 100644 index c155616c8186..000000000000 --- a/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.form +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.lang.customFolding.GotoCustomRegionDialog"> - <grid id="27dc6" binding="myContentPane" layout-manager="BorderLayout" hgap="0" vgap="0"> - <constraints> - <xy x="20" y="20" width="500" height="400"/> - </constraints> - <properties/> - <border type="none"/> - <children> - <scrollpane id="7557d" class="com.intellij.ui.components.JBScrollPane" binding="myScrollPane" custom-create="true"> - <constraints border-constraint="Center"/> - <properties/> - <border type="none"/> - <children> - <component id="2f5d5" class="com.intellij.ui.components.JBList" binding="myRegionsList" custom-create="true"> - <constraints/> - <properties> - <selectionMode value="0"/> - </properties> - </component> - </children> - </scrollpane> - </children> - </grid> -</form> diff --git a/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.java b/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.java deleted file mode 100644 index 49d63dfe24b9..000000000000 --- a/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright 2000-2012 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.lang.customFolding; - -import com.intellij.ide.IdeBundle; -import com.intellij.lang.Language; -import com.intellij.lang.folding.*; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.psi.FileViewProvider; -import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.ui.components.JBList; -import com.intellij.ui.components.JBScrollPane; -import com.intellij.util.containers.HashSet; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; -import java.awt.*; -import java.util.*; -import java.util.List; - -/** - * @author Rustam Vishnyakov - */ -public class GotoCustomRegionDialog extends DialogWrapper { - private JBList myRegionsList; - private JPanel myContentPane; - private JBScrollPane myScrollPane; - private final Editor myEditor; - private final Project myProject; - - protected GotoCustomRegionDialog(@Nullable Project project, @NotNull Editor editor) { - super(project); - myEditor = editor; - myProject = project; - Collection<FoldingDescriptor> descriptors = getCustomFoldingDescriptors(); - init(); - if (descriptors.size() == 0) { - myScrollPane.setVisible(false); - myContentPane.add(new JLabel(IdeBundle.message("goto.custom.region.message.unavailable")), BorderLayout.NORTH); - setOKActionEnabled(false); - } - else { - myRegionsList.setModel(new MyListModel(orderByPosition(descriptors))); - myRegionsList.setSelectedIndex(0); - } - setTitle(IdeBundle.message("goto.custom.region.command")); - } - - @Override - public JComponent getPreferredFocusedComponent() { - if (!myRegionsList.isEmpty()) { - return myRegionsList; - } - return super.getPreferredFocusedComponent(); - } - - @Override - protected JComponent createCenterPanel() { - return myContentPane; - } - - private Collection<FoldingDescriptor> getCustomFoldingDescriptors() { - Set<FoldingDescriptor> foldingDescriptors = new HashSet<FoldingDescriptor>(); - final Document document = myEditor.getDocument(); - PsiDocumentManager documentManager = PsiDocumentManager.getInstance(myProject); - PsiFile file = documentManager != null ? documentManager.getPsiFile(document) : null; - if (file != null) { - final FileViewProvider viewProvider = file.getViewProvider(); - for (final Language language : viewProvider.getLanguages()) { - final PsiFile psi = viewProvider.getPsi(language); - final FoldingBuilder foldingBuilder = LanguageFolding.INSTANCE.forLanguage(language); - if (psi != null) { - for (FoldingDescriptor descriptor : LanguageFolding.buildFoldingDescriptors(foldingBuilder, psi, document, false)) { - CustomFoldingBuilder customFoldingBuilder = getCustomFoldingBuilder(foldingBuilder, descriptor); - if (customFoldingBuilder != null) { - if (customFoldingBuilder.isCustomRegionStart(descriptor.getElement())) { - foldingDescriptors.add(descriptor); - } - } - } - } - } - } - return foldingDescriptors; - } - - private static Collection<FoldingDescriptor> orderByPosition(Collection<FoldingDescriptor> descriptors) { - List<FoldingDescriptor> sorted = new ArrayList<FoldingDescriptor>(descriptors.size()); - sorted.addAll(descriptors); - Collections.sort(sorted, new Comparator<FoldingDescriptor>() { - @Override - public int compare(FoldingDescriptor descriptor1, FoldingDescriptor descriptor2) { - int pos1 = descriptor1.getElement().getTextRange().getStartOffset(); - int pos2 = descriptor2.getElement().getTextRange().getStartOffset(); - return pos1 - pos2; - } - }); - return sorted; - } - - private void createUIComponents() { - myRegionsList = new JBList(); - myScrollPane = new JBScrollPane(myRegionsList); - } - - @Nullable - private static CustomFoldingBuilder getCustomFoldingBuilder(FoldingBuilder builder, FoldingDescriptor descriptor) { - if (builder instanceof CustomFoldingBuilder) return (CustomFoldingBuilder)builder; - FoldingBuilder originalBuilder = descriptor.getElement().getUserData(CompositeFoldingBuilder.FOLDING_BUILDER); - if (originalBuilder instanceof CustomFoldingBuilder) return (CustomFoldingBuilder)originalBuilder; - return null; - } - - - private static class MyListModel extends DefaultListModel { - private MyListModel(Collection<FoldingDescriptor> descriptors) { - for (FoldingDescriptor descriptor : descriptors) { - super.addElement(new MyFoldingDescriptorWrapper(descriptor)); - } - } - } - - private static class MyFoldingDescriptorWrapper { - private final @NotNull FoldingDescriptor myDescriptor; - - private MyFoldingDescriptorWrapper(@NotNull FoldingDescriptor descriptor) { - myDescriptor = descriptor; - } - - @NotNull - public FoldingDescriptor getDescriptor() { - return myDescriptor; - } - - @Nullable - @Override - public String toString() { - return myDescriptor.getPlaceholderText(); - } - } - - @Nullable - public PsiElement getNavigationElement() { - Object selection = myRegionsList.getSelectedValue(); - if (selection instanceof MyFoldingDescriptorWrapper) { - return ((MyFoldingDescriptorWrapper)selection).getDescriptor().getElement().getPsi(); - } - return null; - } -} diff --git a/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ModuleStoreImpl.java b/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ModuleStoreImpl.java index e35319819e32..216f368d4a1d 100644 --- a/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ModuleStoreImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ModuleStoreImpl.java @@ -29,25 +29,26 @@ import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; +import com.intellij.util.PathUtilRt; import gnu.trove.THashMap; import org.jdom.Attribute; import org.jdom.Element; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.Set; public class ModuleStoreImpl extends BaseFileConfigurableStoreImpl implements IModuleStore { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.components.impl.stores.ModuleStoreImpl"); - @NonNls private static final String MODULE_FILE_MACRO = "MODULE_FILE"; private final ModuleImpl myModule; - public static final String DEFAULT_STATE_STORAGE = "$" + MODULE_FILE_MACRO + "$"; - + public static final String DEFAULT_STATE_STORAGE = "$MODULE_FILE$"; @SuppressWarnings({"UnusedDeclaration"}) public ModuleStoreImpl(final ComponentManagerImpl componentManager, final ModuleImpl module) { @@ -56,8 +57,8 @@ public class ModuleStoreImpl extends BaseFileConfigurableStoreImpl implements IM } @Override - protected XmlElementStorage getMainStorage() { - final XmlElementStorage storage = (XmlElementStorage)getStateStorageManager().getFileStateStorage(DEFAULT_STATE_STORAGE); + protected FileBasedStorage getMainStorage() { + FileBasedStorage storage = (FileBasedStorage)getStateStorageManager().getStateStorage(DEFAULT_STATE_STORAGE, RoamingType.PER_USER); assert storage != null; return storage; } @@ -116,8 +117,8 @@ public class ModuleStoreImpl extends BaseFileConfigurableStoreImpl implements IM } @Override - public void load(@NotNull final Element rootElement) throws IOException { - super.load(rootElement); + public void load(@NotNull Element rootElement, @Nullable PathMacroSubstitutor pathMacroSubstitutor, boolean intern) { + super.load(rootElement, pathMacroSubstitutor, intern); for (Attribute attribute : rootElement.getAttributes()) { myOptions.put(attribute.getName(), attribute.getValue()); @@ -132,8 +133,7 @@ public class ModuleStoreImpl extends BaseFileConfigurableStoreImpl implements IM @Override @NotNull protected Element save() { - final Element root = super.save(); - + Element root = super.save(); myOptions.put(VERSION_OPTION, Integer.toString(myVersion)); String[] options = ArrayUtil.toStringArray(myOptions.keySet()); Arrays.sort(options); @@ -187,31 +187,25 @@ public class ModuleStoreImpl extends BaseFileConfigurableStoreImpl implements IM LocalFileSystem.getInstance().refreshAndFindFileByPath(path); final StateStorageManager storageManager = getStateStorageManager(); storageManager.clearStateStorage(DEFAULT_STATE_STORAGE); - storageManager.addMacro(MODULE_FILE_MACRO, path); + storageManager.addMacro(DEFAULT_STATE_STORAGE, path); } @Override @Nullable public VirtualFile getModuleFile() { - final FileBasedStorage storage = (FileBasedStorage)getStateStorageManager().getFileStateStorage(DEFAULT_STATE_STORAGE); - assert storage != null; - return storage.getVirtualFile(); + return getMainStorage().getVirtualFile(); } @Override @NotNull public String getModuleFilePath() { - final FileBasedStorage storage = (FileBasedStorage)getStateStorageManager().getFileStateStorage(DEFAULT_STATE_STORAGE); - assert storage != null; - return storage.getFilePath(); + return getMainStorage().getFilePath(); } @Override @NotNull public String getModuleFileName() { - final FileBasedStorage storage = (FileBasedStorage)getStateStorageManager().getFileStateStorage(DEFAULT_STATE_STORAGE); - assert storage != null; - return storage.getFileName(); + return PathUtilRt.getFileName(getMainStorage().getFilePath()); } @Override diff --git a/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ProjectWithModulesStoreImpl.java b/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ProjectWithModulesStoreImpl.java index eb03fa86fdab..c109c8c0e14d 100644 --- a/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ProjectWithModulesStoreImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ProjectWithModulesStoreImpl.java @@ -25,10 +25,10 @@ import com.intellij.openapi.module.impl.ModuleImpl; import com.intellij.openapi.project.impl.ProjectImpl; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.io.fs.IFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -102,15 +102,13 @@ public class ProjectWithModulesStoreImpl extends ProjectStoreImpl { @NotNull @Override - public List<IFile> getAllStorageFiles(final boolean includingSubStructures) { - final List<IFile> result = super.getAllStorageFiles(includingSubStructures); - + public List<File> getAllStorageFiles(final boolean includingSubStructures) { + List<File> result = super.getAllStorageFiles(includingSubStructures); if (includingSubStructures) { for (SaveSession moduleSaveSession : myModuleSaveSessions) { result.addAll(moduleSaveSession.getAllStorageFiles(true)); } } - return result; } @@ -172,10 +170,9 @@ public class ProjectWithModulesStoreImpl extends ProjectStoreImpl { } @Override - protected void collectSubfilesToSave(final List<IFile> result) throws IOException { + protected void collectSubFilesToSave(final List<File> result) throws IOException { for (SaveSession moduleSaveSession : myModuleSaveSessions) { - final List<IFile> moduleFiles = moduleSaveSession.getAllStorageFilesToSave(true); - result.addAll(moduleFiles); + result.addAll(moduleSaveSession.getAllStorageFilesToSave(true)); } } } diff --git a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/PsiAwareFileEditorManagerImpl.java b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/PsiAwareFileEditorManagerImpl.java index 7713734d07de..eaed20f2960d 100644 --- a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/PsiAwareFileEditorManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/PsiAwareFileEditorManagerImpl.java @@ -102,8 +102,9 @@ public class PsiAwareFileEditorManagerImpl extends FileEditorManagerImpl { return myProblemSolver.isProblemFile(file); } + @NotNull @Override - public String getFileTooltipText(final VirtualFile file) { + public String getFileTooltipText(@NotNull final VirtualFile file) { final StringBuilder tooltipText = new StringBuilder(); final Module module = ModuleUtilCore.findModuleForFile(file, getProject()); if (module != null) { @@ -116,7 +117,7 @@ public class PsiAwareFileEditorManagerImpl extends FileEditorManagerImpl { } @Override - protected Editor getOpenedEditor(final Editor editor, final boolean focusEditor) { + protected Editor getOpenedEditor(@NotNull final Editor editor, final boolean focusEditor) { PsiDocumentManager documentManager = PsiDocumentManager.getInstance(getProject()); Document document = editor.getDocument(); PsiFile psiFile = documentManager.getPsiFile(document); @@ -200,7 +201,7 @@ public class PsiAwareFileEditorManagerImpl extends FileEditorManagerImpl { updateFile(file); } - private void updateFile(final VirtualFile file) { + private void updateFile(@NotNull VirtualFile file) { queueUpdateFile(file); } } diff --git a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/TestEditorManagerImpl.java b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/TestEditorManagerImpl.java index 79ac777a6fd8..958daee0098a 100644 --- a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/TestEditorManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/TestEditorManagerImpl.java @@ -38,6 +38,7 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.testFramework.LightVirtualFile; +import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashMap; import org.jdom.Element; import org.jetbrains.annotations.NonNls; @@ -195,7 +196,7 @@ public class TestEditorManagerImpl extends FileEditorManagerEx implements Applic return openTextEditor(descriptor, false); } - private FileEditorProvider getProvider(FileEditor editor) { + private static FileEditorProvider getProvider(FileEditor editor) { return new FileEditorProvider() { @Override public boolean accept(@NotNull Project project, @NotNull VirtualFile file) { @@ -205,18 +206,17 @@ public class TestEditorManagerImpl extends FileEditorManagerEx implements Applic @Override @NotNull public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) { - return null; + throw new IncorrectOperationException(); } @Override public void disposeEditor(@NotNull FileEditor editor) { - //Disposer.dispose(editor); } @Override @NotNull public FileEditorState readState(@NotNull Element sourceElement, @NotNull Project project, @NotNull VirtualFile file) { - return null; + throw new IncorrectOperationException(); } @Override @@ -233,7 +233,7 @@ public class TestEditorManagerImpl extends FileEditorManagerEx implements Applic @Override @NotNull public FileEditorPolicy getPolicy() { - return null; + throw new IncorrectOperationException(); } }; } @@ -482,7 +482,7 @@ public class TestEditorManagerImpl extends FileEditorManagerEx implements Applic @NotNull @Override public EditorsSplitters getSplitters() { - return null; + throw new IncorrectOperationException(); } @NotNull @@ -492,6 +492,6 @@ public class TestEditorManagerImpl extends FileEditorManagerEx implements Applic } @Override - public void setSelectedEditor(@NotNull VirtualFile file, String fileEditorProviderId) { + public void setSelectedEditor(@NotNull VirtualFile file, @NotNull String fileEditorProviderId) { } } diff --git a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/ProjectJdkTableImpl.java b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/ProjectJdkTableImpl.java index d5becac99ede..d36fe1b1e05d 100644 --- a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/ProjectJdkTableImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/ProjectJdkTableImpl.java @@ -41,12 +41,8 @@ import java.util.List; import java.util.Map; @State( - name="ProjectJdkTable", - roamingType = RoamingType.DISABLED, - storages= { - @Storage( - file = StoragePathMacros.APP_CONFIG + "/jdk.table.xml" - )} + name = "ProjectJdkTable", + storages = {@Storage(file = StoragePathMacros.APP_CONFIG + "/jdk.table.xml", roamingType = RoamingType.DISABLED)} ) public class ProjectJdkTableImpl extends ProjectJdkTable implements PersistentStateComponent<Element>, ExportableComponent { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.projectRoots.impl.ProjectJdkTableImpl"); diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/libraries/ExportableApplicationLibraryTable.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/libraries/ExportableApplicationLibraryTable.java index 4be66eedde76..c3bed20a5052 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/libraries/ExportableApplicationLibraryTable.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/libraries/ExportableApplicationLibraryTable.java @@ -27,10 +27,7 @@ import java.io.File; */ @State( name = "libraryTable", - roamingType = RoamingType.DISABLED, - storages = { - @Storage( file = StoragePathMacros.APP_CONFIG + "/applicationLibraries.xml") - } + storages = {@Storage(file = StoragePathMacros.APP_CONFIG + "/applicationLibraries.xml", roamingType = RoamingType.DISABLED)} ) public class ExportableApplicationLibraryTable extends ApplicationLibraryTable implements ExportableComponent { @Override diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java index b1f034d2dcb2..36e344ff0acc 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java @@ -39,8 +39,6 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.tracker.VirtualFileTracker; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.io.fs.FileSystem; -import com.intellij.util.io.fs.IFile; import com.intellij.util.messages.MessageBus; import org.jdom.Element; import org.jetbrains.annotations.Nls; @@ -104,7 +102,7 @@ public class ClasspathStorage implements StateStorage { @Override @Nullable - public <T> T getState(final Object component, final String componentName, Class<T> stateClass, @Nullable T mergeInto) + public <T> T getState(final Object component, @NotNull final String componentName, Class<T> stateClass, @Nullable T mergeInto) throws StateStorageException { assert component instanceof ModuleRootManager; assert componentName.equals("NewModuleRootManager"); @@ -144,7 +142,7 @@ public class ClasspathStorage implements StateStorage { } @Override - public boolean hasState(final Object component, final String componentName, final Class<?> aClass, final boolean reloadData) + public boolean hasState(final Object component, @NotNull final String componentName, final Class<?> aClass, final boolean reloadData) throws StateStorageException { return true; } @@ -192,10 +190,9 @@ public class ClasspathStorage implements StateStorage { return session; } - private static void convert2Io(List<IFile> list, ArrayList<VirtualFile> virtualFiles) { + private static void convert2Io(List<File> list, ArrayList<VirtualFile> virtualFiles) { for (VirtualFile virtualFile : virtualFiles) { - final File ioFile = VfsUtilCore.virtualToIoFile(virtualFile); - list.add(FileSystem.FILE_SYSTEM.createFile(ioFile.getAbsolutePath())); + list.add(VfsUtilCore.virtualToIoFile(virtualFile)); } } @@ -384,12 +381,12 @@ public class ClasspathStorage implements StateStorage { } @Override - public Set<String> getClasspath(final ModifiableRootModel model, final Element element) throws IOException, InvalidDataException { + public Set<String> getClasspath(final ModifiableRootModel model, final Element element) throws InvalidDataException { throw new InvalidDataException(getDescription()); } @Override - public void setClasspath(ModuleRootModel model) throws IOException, WriteExternalException { + public void setClasspath(ModuleRootModel model) throws WriteExternalException { throw new WriteExternalException(getDescription()); } }; @@ -426,9 +423,9 @@ public class ClasspathStorage implements StateStorage { @NotNull @Override - public Collection<IFile> getStorageFilesToSave() throws StateStorageException { + public Collection<File> getStorageFilesToSave() throws StateStorageException { if (needsSave()) { - final List<IFile> list = new ArrayList<IFile>(); + final List<File> list = new ArrayList<File>(); final ArrayList<VirtualFile> virtualFiles = new ArrayList<VirtualFile>(); getFileSet().listModifiedFiles(virtualFiles); convert2Io(list, virtualFiles); @@ -441,9 +438,9 @@ public class ClasspathStorage implements StateStorage { @NotNull @Override - public List<IFile> getAllStorageFiles() { - final List<IFile> list = new ArrayList<IFile>(); - final ArrayList<VirtualFile> virtualFiles = new ArrayList<VirtualFile>(); + public List<File> getAllStorageFiles() { + List<File> list = new ArrayList<File>(); + ArrayList<VirtualFile> virtualFiles = new ArrayList<VirtualFile>(); getFileSet().listFiles(virtualFiles); convert2Io(list, virtualFiles); return list; diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/RootDetectionUtil.java b/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/RootDetectionUtil.java index 5a3efe1a31b7..ca273ba2373d 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/RootDetectionUtil.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/RootDetectionUtil.java @@ -70,7 +70,7 @@ public class RootDetectionUtil { try { for (VirtualFile rootCandidate : rootCandidates) { final Collection<DetectedLibraryRoot> roots = detector.detectRoots(rootCandidate, indicator); - if (!roots.isEmpty() && allRootsHaveOneTypeAndEqualTo(roots, rootCandidate)) { + if (!roots.isEmpty() && allRootsHaveOneTypeAndEqualToOrAreDirectParentOf(roots, rootCandidate)) { for (DetectedLibraryRoot root : roots) { final LibraryRootType libraryRootType = root.getTypes().get(0); result.add(new OrderRoot(root.getFile(), libraryRootType.getType(), libraryRootType.isJarDirectory())); @@ -81,7 +81,7 @@ public class RootDetectionUtil { final HashMap<LibraryRootType, String> names = new HashMap<LibraryRootType, String>(); for (LibraryRootType type : root.getTypes()) { final String typeName = detector.getRootTypeName(type); - LOG.assertTrue(typeName != null, "Unexpected root type " + type.getType().name() + (type.isJarDirectory() ? " (jar directory)" : "") + ", detectors: " + detector); + LOG.assertTrue(typeName != null, "Unexpected root type " + type.getType().name() + (type.isJarDirectory() ? " (JAR directory)" : "") + ", detectors: " + detector); names.put(type, typeName); } suggestedRoots.add(new SuggestedChildRootInfo(rootCandidate, root, names)); @@ -141,9 +141,9 @@ public class RootDetectionUtil { return result; } - private static boolean allRootsHaveOneTypeAndEqualTo(Collection<DetectedLibraryRoot> roots, VirtualFile candidate) { + private static boolean allRootsHaveOneTypeAndEqualToOrAreDirectParentOf(Collection<DetectedLibraryRoot> roots, VirtualFile candidate) { for (DetectedLibraryRoot root : roots) { - if (root.getTypes().size() > 1 || !root.getFile().equals(candidate)) { + if (root.getTypes().size() > 1 || !root.getFile().equals(candidate) && !root.getFile().equals(candidate.getParent())) { return false; } } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ModulesAlphaComparator.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ModulesAlphaComparator.java index 8a561e4003b4..61a5c71861c3 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ModulesAlphaComparator.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ModulesAlphaComparator.java @@ -29,8 +29,9 @@ public class ModulesAlphaComparator implements Comparator<Module>{ @Override public int compare(Module module1, Module module2) { - final String name1 = module1.getName(); - final String name2 = module2.getName(); - return name1.compareToIgnoreCase(name2); + if (module1 == null && module2 == null) return 0; + if (module1 == null && module2 != null) return -1; + if (module1 != null && module2 == null) return 1; + return module1.getName().compareToIgnoreCase(module2.getName()); } } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectSdksModel.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectSdksModel.java index e4c690ec05ed..87df147a745f 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectSdksModel.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectSdksModel.java @@ -86,6 +86,15 @@ public class ProjectSdksModel implements SdkModel { } public void reset(@Nullable Project project) { + resetSdkModel(); + if (project != null) { + myProjectSdk = findSdk(ProjectRootManager.getInstance(project).getProjectSdkName()); + } + myModified = false; + myInitialized = true; + } + + private void resetSdkModel() { myProjectSdks.clear(); final Sdk[] projectSdks = ProjectJdkTable.getInstance().getAllJdks(); for (Sdk sdk : projectSdks) { @@ -96,11 +105,6 @@ public class ProjectSdksModel implements SdkModel { LOG.error(e); } } - if (project != null) { - myProjectSdk = findSdk(ProjectRootManager.getInstance(project).getProjectSdkName()); - } - myModified = false; - myInitialized = true; } public void disposeUIResources() { @@ -154,6 +158,7 @@ public class ProjectSdksModel implements SdkModel { for (Sdk originalJdk : itemsInTable) { final Sdk modifiedJdk = myProjectSdks.get(originalJdk); LOG.assertTrue(modifiedJdk != null); + LOG.assertTrue(originalJdk != modifiedJdk); jdkTable.updateJdk(originalJdk, modifiedJdk); } // Add new items to table @@ -166,6 +171,7 @@ public class ProjectSdksModel implements SdkModel { } } }); + resetSdkModel(); myModified = false; } diff --git a/platform/lang-impl/src/com/intellij/openapi/util/registry/RegistryUi.java b/platform/lang-impl/src/com/intellij/openapi/util/registry/RegistryUi.java index 65f2d758fcfd..a30ccd677682 100644 --- a/platform/lang-impl/src/com/intellij/openapi/util/registry/RegistryUi.java +++ b/platform/lang-impl/src/com/intellij/openapi/util/registry/RegistryUi.java @@ -471,9 +471,10 @@ public class RegistryUi implements Disposable { public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { myValue = ((MyTableModel)table.getModel()).getRegistryValue(row); if (myValue.asColor(null) != null) { - final Color color = ColorChooser.chooseColor(table, "Choose color", ((RegistryValue)value).asColor(Color.WHITE)); + final Color color = ColorChooser.chooseColor(table, "Choose color", myValue.asColor(Color.WHITE)); if (color != null) { myValue.setValue(color.getRed() + "," + color.getGreen() + "," + color.getBlue()); + keyChanged(myValue.getKey()); } return null; } else if (myValue.isBoolean()) { diff --git a/platform/lang-impl/src/com/intellij/openapi/wm/impl/status/TogglePopupHintsPanel.java b/platform/lang-impl/src/com/intellij/openapi/wm/impl/status/TogglePopupHintsPanel.java index b30661e6e840..a83f0b5703da 100644 --- a/platform/lang-impl/src/com/intellij/openapi/wm/impl/status/TogglePopupHintsPanel.java +++ b/platform/lang-impl/src/com/intellij/openapi/wm/impl/status/TogglePopupHintsPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -125,21 +125,21 @@ public class TogglePopupHintsPanel extends EditorBasedWidget implements StatusBa if (isStateChangeable(file)) { if (PowerSaveMode.isEnabled()) { myCurrentIcon = AllIcons.Ide.HectorNo; - myToolTipText = "Code analysis is disabled in power save mode. "; + myToolTipText = "Code analysis is disabled in power save mode.\n"; } else if (HighlightingLevelManager.getInstance(myProject).shouldInspect(file)) { myCurrentIcon = AllIcons.Ide.HectorOn; myToolTipText = "Current inspection profile: " + InspectionProjectProfileManager.getInstance(file.getProject()).getInspectionProfile().getName() + - ". "; + ".\n"; } else if (HighlightingLevelManager.getInstance(myProject).shouldHighlight(file)) { myCurrentIcon = AllIcons.Ide.HectorSyntax; - myToolTipText = "Highlighting level is: Syntax. "; + myToolTipText = "Highlighting level is: Syntax.\n"; } else { myCurrentIcon = AllIcons.Ide.HectorOff; - myToolTipText = "Inspections are off. "; + myToolTipText = "Inspections are off.\n"; } myToolTipText += UIBundle.message("popup.hints.panel.click.to.configure.highlighting.tooltip.text"); } diff --git a/platform/lang-impl/src/com/intellij/platform/templates/github/DownloadUtil.java b/platform/lang-impl/src/com/intellij/platform/templates/github/DownloadUtil.java index bbffc7c98ba4..02ddd0b64608 100644 --- a/platform/lang-impl/src/com/intellij/platform/templates/github/DownloadUtil.java +++ b/platform/lang-impl/src/com/intellij/platform/templates/github/DownloadUtil.java @@ -1,5 +1,6 @@ package com.intellij.platform.templates.github; +import com.intellij.openapi.application.ex.ApplicationInfoEx; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; @@ -19,7 +20,6 @@ import java.net.HttpURLConnection; import java.net.URLConnection; import java.util.Locale; import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; /** * @author Sergey Simonchik @@ -176,6 +176,7 @@ public class DownloadUtil { URLConnection urlConnection = HttpConfigurable.getInstance().openConnection(location); HttpURLConnection httpURLConnection = ObjectUtils.tryCast(urlConnection, HttpURLConnection.class); try { + urlConnection.setRequestProperty("User-Agent", ApplicationInfoEx.getInstanceEx().getFullApplicationName()); urlConnection.connect(); InputStream in = urlConnection.getInputStream(); int contentLength = urlConnection.getContentLength(); diff --git a/platform/lang-impl/src/com/intellij/profile/codeInspection/InspectionProfileManagerImpl.java b/platform/lang-impl/src/com/intellij/profile/codeInspection/InspectionProfileManagerImpl.java index de8ee09198c1..08c9e9f0d518 100644 --- a/platform/lang-impl/src/com/intellij/profile/codeInspection/InspectionProfileManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/profile/codeInspection/InspectionProfileManagerImpl.java @@ -42,13 +42,17 @@ import com.intellij.openapi.options.*; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.util.*; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.util.JDOMExternalizable; +import com.intellij.openapi.util.WriteExternalException; import com.intellij.profile.Profile; import com.intellij.util.ArrayUtil; import com.intellij.util.ui.UIUtil; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; +import org.jdom.Parent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.TestOnly; @@ -94,7 +98,7 @@ public class InspectionProfileManagerImpl extends InspectionProfileManager imple @Override - public Document writeScheme(@NotNull final InspectionProfileImpl scheme) throws WriteExternalException { + public Element writeScheme(@NotNull final InspectionProfileImpl scheme) throws WriteExternalException { return scheme.saveToDocument(); } diff --git a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/LevelChooser.java b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/LevelChooser.java deleted file mode 100644 index 5bc792545c96..000000000000 --- a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/LevelChooser.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2000-2012 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. - */ - -/* - * User: anna - * Date: 19-Apr-2009 - */ -package com.intellij.profile.codeInspection.ui; - -import com.intellij.codeHighlighting.HighlightDisplayLevel; -import com.intellij.codeInsight.daemon.impl.HighlightInfoType; -import com.intellij.codeInsight.daemon.impl.SeverityRegistrar; -import com.intellij.codeInsight.daemon.impl.SeverityUtil; -import com.intellij.codeInspection.ex.SeverityEditorDialog; -import com.intellij.ui.ListCellRendererWrapper; -import com.intellij.lang.annotation.HighlightSeverity; -import com.intellij.ui.ComboboxWithBrowseButton; -import org.jetbrains.annotations.NotNull; - -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.TreeSet; - -public class LevelChooser extends ComboboxWithBrowseButton { - public LevelChooser(final SeverityRegistrar severityRegistrar) { - final JComboBox comboBox = getComboBox(); - final DefaultComboBoxModel model = new DefaultComboBoxModel(); - comboBox.setModel(model); - fillModel(model, severityRegistrar); - getButton().setToolTipText("Edit severities (" + getButton().getToolTipText(null) + ")"); - - comboBox.setRenderer(new ListCellRendererWrapper<HighlightSeverity>() { - @Override - public void customize(final JList list, final HighlightSeverity value, final int index, final boolean selected, final boolean hasFocus) { - if (value != null) { - setText(SingleInspectionProfilePanel.renderSeverity(value)); - setIcon(HighlightDisplayLevel.find(value).getIcon()); - } - } - }); - - addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - final SeverityEditorDialog dlg = - new SeverityEditorDialog(LevelChooser.this, (HighlightSeverity)getComboBox().getSelectedItem(), severityRegistrar); - dlg.show(); - if (dlg.isOK()) { - final Object item = getComboBox().getSelectedItem(); - fillModel(model, severityRegistrar); - final HighlightInfoType type = dlg.getSelectedType(); - if (type != null) { - getComboBox().setSelectedItem(type.getSeverity(null)); - } - else { - getComboBox().setSelectedItem(item); - } - } - } - }); - } - - private static void fillModel(DefaultComboBoxModel model, final SeverityRegistrar severityRegistrar) { - model.removeAllElements(); - final TreeSet<HighlightSeverity> severities = new TreeSet<HighlightSeverity>(severityRegistrar); - for (SeverityRegistrar.SeverityBasedTextAttributes type : SeverityUtil.getRegisteredHighlightingInfoTypes(severityRegistrar)) { - severities.add(type.getSeverity()); - } - severities.add(HighlightSeverity.ERROR); - severities.add(HighlightSeverity.WARNING); - severities.add(HighlightSeverity.WEAK_WARNING); - severities.add(HighlightSeverity.GENERIC_SERVER_ERROR_OR_WARNING); - for (HighlightSeverity severity : severities) { - model.addElement(severity); - } - } - - @NotNull - public HighlightDisplayLevel getLevel() { - HighlightSeverity severity = (HighlightSeverity)getComboBox().getSelectedItem(); - if (severity == null) return HighlightDisplayLevel.WARNING; - return HighlightDisplayLevel.find(severity); - } - - public void setLevel(HighlightDisplayLevel level) { - getComboBox().setSelectedItem(level.getSeverity()); - } -}
\ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java index 81d0bf651688..2320d059c146 100644 --- a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java +++ b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java @@ -1005,11 +1005,10 @@ public class SingleInspectionProfilePanel extends JPanel { northPanel.add(createTreeToolbarPanel().getComponent(), new GridBagConstraints(1, 0, 1, 1, 0.5, 1, GridBagConstraints.BASELINE_LEADING, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); treePanel.add(northPanel, BorderLayout.NORTH); - myMainSplitter = new Splitter(false); + myMainSplitter = new Splitter(false, myProperties.getFloat(VERTICAL_DIVIDER_PROPORTION, 0.5f), 0.01f, 0.99f); myMainSplitter.setFirstComponent(treePanel); myMainSplitter.setSecondComponent(myRightSplitter); myMainSplitter.setHonorComponentsMinimumSize(false); - myMainSplitter.setProportion(myProperties.getFloat(VERTICAL_DIVIDER_PROPORTION, 0.5f)); final JPanel panel = new JPanel(new BorderLayout()); panel.add(myMainSplitter, BorderLayout.CENTER); diff --git a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/InspectionsConfigTreeTable.java b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/InspectionsConfigTreeTable.java index 5607816ad13c..fe36408cf61a 100644 --- a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/InspectionsConfigTreeTable.java +++ b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/InspectionsConfigTreeTable.java @@ -220,7 +220,7 @@ public class InspectionsConfigTreeTable extends TreeTable { @Override public void setValueAt(final Object aValue, final Object node, final int column) { LOG.assertTrue(column == IS_ENABLED_COLUMN); - LOG.assertTrue(aValue != null); + LOG.assertTrue(aValue != null, "node = " + node); final boolean doEnable = (Boolean) aValue; for (final InspectionConfigTreeNode aNode : InspectionsAggregationUtil.getInspectionsNodes((InspectionConfigTreeNode) node)) { final String toolId = aNode.getKey().toString(); diff --git a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/table/ScopesAndSeveritiesTable.java b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/table/ScopesAndSeveritiesTable.java index 385b764af027..58e35083a247 100644 --- a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/table/ScopesAndSeveritiesTable.java +++ b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/table/ScopesAndSeveritiesTable.java @@ -357,6 +357,9 @@ public class ScopesAndSeveritiesTable extends JBTable { } else if (columnIndex == SCOPE_ENABLED_COLUMN) { final NamedScope scope = getScope(rowIndex); + if (scope == null) { + return; + } if ((Boolean)value) { if (rowIndex == lastRowIndex()) { myInspectionProfile.enableToolsByDefault(myKeyNames, myProject); @@ -381,7 +384,7 @@ public class ScopesAndSeveritiesTable extends JBTable { @Override public void removeRow(final int idx) { if (idx != lastRowIndex()) { - myInspectionProfile.removeScopes(myKeyNames, getScope(idx), myProject); + myInspectionProfile.removeScopes(myKeyNames, getScopeName(idx), myProject); refreshAggregatedScopes(); myTableSettings.onScopeRemoved(getRowCount()); } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/id/IdIndexImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/id/IdIndexImpl.java index 537d997e5a50..1773a260a706 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/id/IdIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/id/IdIndexImpl.java @@ -15,6 +15,9 @@ */ package com.intellij.psi.impl.cache.impl.id; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.FileTypeRegistry; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.ThreadLocalCachedIntArray; import com.intellij.util.indexing.CustomInputsIndexFileBasedIndexExtension; import com.intellij.util.io.DataExternalizer; @@ -27,9 +30,35 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Comparator; public class IdIndexImpl extends IdIndex implements CustomInputsIndexFileBasedIndexExtension<IdIndexEntry> { private static final ThreadLocalCachedIntArray spareBufferLocal = new ThreadLocalCachedIntArray(); + private final FileTypeRegistry myFileTypeManager; + + public IdIndexImpl(FileTypeRegistry manager) { + myFileTypeManager = manager; + } + + @Override + public int getVersion() { + FileType[] types = myFileTypeManager.getRegisteredFileTypes(); + Arrays.sort(types, new Comparator<FileType>() { + @Override + public int compare(FileType o1, FileType o2) { + return Comparing.compare(o1.getName(), o2.getName()); + } + }); + + int version = super.getVersion(); + for(FileType fileType:types) { + if (!isIndexable(fileType)) continue; + FileTypeIdIndexer indexer = IdIndexers.INSTANCE.forFileType(fileType); + if (indexer == null) continue; + version = version * 31 + (indexer.getVersion() ^ indexer.getClass().getName().hashCode()); + } + return version; + } @NotNull @Override diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemeImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemeImpl.java index 99320b44c5e6..59f3767c3a3b 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemeImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemeImpl.java @@ -161,12 +161,11 @@ public class CodeStyleSchemeImpl implements JDOMExternalizable, CodeStyleScheme, } } - public Document saveToDocument() throws WriteExternalException { + public Element saveToDocument() throws WriteExternalException { Element newElement = new Element(CODE_SCHEME); newElement.setAttribute(NAME, getName()); writeExternal(newElement); - - return new Document(newElement); + return newElement; } @Override diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemesImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemesImpl.java index b12dee17e9fd..87914f151df3 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemesImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemesImpl.java @@ -29,6 +29,7 @@ import com.intellij.psi.codeStyle.CodeStyleScheme; import com.intellij.psi.codeStyle.CodeStyleSchemes; import org.jdom.Document; import org.jdom.JDOMException; +import org.jdom.Parent; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -57,7 +58,7 @@ public abstract class CodeStyleSchemesImpl extends CodeStyleSchemes implements E } @Override - public Document writeScheme(@NotNull final CodeStyleSchemeImpl scheme) throws WriteExternalException { + public Parent writeScheme(@NotNull final CodeStyleSchemeImpl scheme) throws WriteExternalException { return scheme.saveToDocument(); } diff --git a/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/PackageSetFactoryImpl.java b/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/PackageSetFactoryImpl.java index 1a3e45d72df7..10f1ec94555e 100644 --- a/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/PackageSetFactoryImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/PackageSetFactoryImpl.java @@ -137,8 +137,7 @@ public class PackageSetFactoryImpl extends PackageSetFactory { else if (myLexer.getTokenType() == ScopeTokenTypes.COLON) { pattern.append(":"); } else { - error(AnalysisScopeBundle.message("error.packageset.token.expectations", getTokenText())); - break; + pattern.append(getTokenText()); } myLexer.advance(); } diff --git a/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java b/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java index 493d1d6cd519..ffc7de7c9b12 100644 --- a/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java @@ -63,11 +63,7 @@ import java.util.concurrent.locks.Lock; @State( name = "FileBasedIndex", - roamingType = RoamingType.DISABLED, - storages = { - @Storage( - file = StoragePathMacros.APP_CONFIG + "/stubIndex.xml") - } + storages = {@Storage(file = StoragePathMacros.APP_CONFIG + "/stubIndex.xml", roamingType = RoamingType.DISABLED)} ) public class StubIndexImpl extends StubIndex implements ApplicationComponent, PersistentStateComponent<StubIndexState> { private static final AtomicReference<Boolean> ourForcedClean = new AtomicReference<Boolean>(null); @@ -109,7 +105,7 @@ public class StubIndexImpl extends StubIndex implements ApplicationComponent, Pe myStubProcessingHelper = new StubProcessingHelper(fileBasedIndex); } - + @Nullable public static StubIndexImpl getInstanceOrInvalidate() { if (ourForcedClean.compareAndSet(null, Boolean.TRUE)) { diff --git a/platform/lang-impl/src/com/intellij/refactoring/actions/RefactoringQuickListPopupAction.java b/platform/lang-impl/src/com/intellij/refactoring/actions/RefactoringQuickListPopupAction.java index 159279570cf2..f166c5d08981 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/actions/RefactoringQuickListPopupAction.java +++ b/platform/lang-impl/src/com/intellij/refactoring/actions/RefactoringQuickListPopupAction.java @@ -98,7 +98,8 @@ public class RefactoringQuickListPopupAction extends QuickSwitchSchemeAction { @Override public void update(AnActionEvent e) { super.update(e); - e.getPresentation().setVisible(e.getPlace() == ActionPlaces.MAIN_MENU || e.getPlace() == ActionPlaces.ACTION_PLACE_QUICK_LIST_POPUP_ACTION); + e.getPresentation().setVisible( + ActionPlaces.isMainMenuOrActionSearch(e.getPlace()) || ActionPlaces.ACTION_PLACE_QUICK_LIST_POPUP_ACTION.equals(e.getPlace())); } @Override diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameUtil.java b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameUtil.java index 59595bcc81d0..490efeea1734 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameUtil.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameUtil.java @@ -240,10 +240,17 @@ public class RenameUtil { for (UsageInfo usage : usages) { final PsiReference ref = usage.getReference(); if (ref instanceof BindablePsiReference) { - try { - ref.bindToElement(namedElement); + boolean fallback = true; + if (!(ref instanceof FragmentaryPsiReference + && ((FragmentaryPsiReference)ref).isFragmentOnlyRename())) { + try { + ref.bindToElement(namedElement); + fallback = false; + } + catch (IncorrectOperationException ignored) { + } } - catch (IncorrectOperationException e) {//fall back to old scheme + if (fallback) {//fall back to old scheme ref.handleElementRename(newName); } } diff --git a/platform/lang-impl/src/com/intellij/tools/BaseExternalToolsGroup.java b/platform/lang-impl/src/com/intellij/tools/BaseExternalToolsGroup.java index 4d0d2867e387..7dd25a6ec7dd 100644 --- a/platform/lang-impl/src/com/intellij/tools/BaseExternalToolsGroup.java +++ b/platform/lang-impl/src/com/intellij/tools/BaseExternalToolsGroup.java @@ -102,7 +102,7 @@ public abstract class BaseExternalToolsGroup<T extends Tool> extends SimpleActio ) { return tool.isShownInProjectViews(); } - else if (ActionPlaces.MAIN_MENU.equals(context)) { + else if (ActionPlaces.isMainMenuOrActionSearch(context)) { return tool.isShownInMainMenu(); } else if (ActionPlaces.USAGE_VIEW_POPUP.equals(context)) { diff --git a/platform/lang-impl/src/com/intellij/tools/ToolsProcessor.java b/platform/lang-impl/src/com/intellij/tools/ToolsProcessor.java index 1efa7b05d19b..3846d9c87416 100644 --- a/platform/lang-impl/src/com/intellij/tools/ToolsProcessor.java +++ b/platform/lang-impl/src/com/intellij/tools/ToolsProcessor.java @@ -25,6 +25,7 @@ import com.intellij.openapi.util.text.StringUtil; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; +import org.jdom.Parent; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -134,7 +135,7 @@ abstract public class ToolsProcessor<T extends Tool> extends BaseSchemeProcessor protected abstract T createTool(); @Override - public Document writeScheme(@NotNull final ToolsGroup<T> scheme) throws WriteExternalException { + public Element writeScheme(@NotNull final ToolsGroup<T> scheme) throws WriteExternalException { Element groupElement = new Element(TOOL_SET); if (scheme.getName() != null) { groupElement.setAttribute(ATTRIBUTE_NAME, scheme.getName()); @@ -144,7 +145,7 @@ abstract public class ToolsProcessor<T extends Tool> extends BaseSchemeProcessor saveTool(tool, groupElement); } - return new Document(groupElement); + return groupElement; } @Override diff --git a/platform/lang-impl/src/com/intellij/ui/ReplacePromptDialog.java b/platform/lang-impl/src/com/intellij/ui/ReplacePromptDialog.java index 27622cad5a93..3cf239f46632 100644 --- a/platform/lang-impl/src/com/intellij/ui/ReplacePromptDialog.java +++ b/platform/lang-impl/src/com/intellij/ui/ReplacePromptDialog.java @@ -51,6 +51,7 @@ public class ReplacePromptDialog extends DialogWrapper { replaceAction.putValue(DEFAULT_ACTION,Boolean.TRUE); if (myException == null) { if (myIsMultiple){ + setCancelButtonText(UIBundle.message("replace.prompt.review.action")); return new Action[]{ replaceAction, createSkipAction(), diff --git a/platform/lang-impl/src/com/intellij/ui/tabs/EditorTabColorProviderImpl.java b/platform/lang-impl/src/com/intellij/ui/tabs/EditorTabColorProviderImpl.java index 93ebe1f0573a..5c2083710f2a 100644 --- a/platform/lang-impl/src/com/intellij/ui/tabs/EditorTabColorProviderImpl.java +++ b/platform/lang-impl/src/com/intellij/ui/tabs/EditorTabColorProviderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -20,6 +20,7 @@ import com.intellij.openapi.fileEditor.impl.EditorTabColorProvider; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.FileColorManager; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.*; @@ -31,7 +32,7 @@ public class EditorTabColorProviderImpl implements EditorTabColorProvider { @Override @Nullable - public Color getEditorTabColor(Project project, VirtualFile file) { + public Color getEditorTabColor(@NotNull Project project, @NotNull VirtualFile file) { FileColorManager colorManager = FileColorManager.getInstance(project); return colorManager.isEnabledForTabs() ? colorManager.getFileColor(file) : null; } diff --git a/platform/lang-impl/src/com/intellij/util/download/impl/FileDownloaderImpl.java b/platform/lang-impl/src/com/intellij/util/download/impl/FileDownloaderImpl.java index e9be287a24d3..20d889d1edfa 100644 --- a/platform/lang-impl/src/com/intellij/util/download/impl/FileDownloaderImpl.java +++ b/platform/lang-impl/src/com/intellij/util/download/impl/FileDownloaderImpl.java @@ -379,6 +379,7 @@ public class FileDownloaderImpl implements FileDownloader { private final ProgressIndicator myParent; private final int myTasksCount; private final AtomicDouble myTotalFraction; + private final Object myLock = new Object(); private LinkedHashMap<SubTaskProgressIndicator, String> myText2Stack = new LinkedHashMap<SubTaskProgressIndicator, String>(); private ConcurrentTasksProgressManager(ProgressIndicator parent, int tasksCount) { @@ -398,12 +399,17 @@ public class FileDownloaderImpl implements FileDownloader { public void setText2(@NotNull SubTaskProgressIndicator subTask, @Nullable String text) { if (text != null) { - myText2Stack.put(subTask, text); + synchronized (myLock) { + myText2Stack.put(subTask, text); + } myParent.setText2(text); } else { - myText2Stack.remove(subTask); - String prev = myText2Stack.getLastValue(); + String prev; + synchronized (myLock) { + myText2Stack.remove(subTask); + prev = myText2Stack.getLastValue(); + } if (prev != null) { myParent.setText2(prev); } diff --git a/platform/lang-impl/src/com/intellij/util/indexing/ValueContainerImpl.java b/platform/lang-impl/src/com/intellij/util/indexing/ValueContainerImpl.java index 3e7f3bd03739..90f29dccb4d1 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/ValueContainerImpl.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/ValueContainerImpl.java @@ -458,7 +458,7 @@ class ValueContainerImpl<Value> extends UpdatableValueContainer<Value> implement } else { // serialize positive file ids with delta encoding ChangeBufferingList originalInput = (ChangeBufferingList)fileSetObject; - IntIterator intIterator = originalInput.intIterator(); + IntIterator intIterator = originalInput.rawIntIterator(); DataInputOutputUtil.writeINT(out, -intIterator.size()); if (intIterator.hasAscendingOrder()) { @@ -493,7 +493,7 @@ class ValueContainerImpl<Value> extends UpdatableValueContainer<Value> implement final int[] bits = ourSpareBuffer.getBuffer(bitsLength); for(int i = 0; i < bitsLength; ++i) bits[i] = 0; - intIterator = originalInput.intIterator(); + intIterator = originalInput.rawIntIterator(); while(intIterator.hasNext()) { final int id = intIterator.next() - offset; bits[id >> INT_BITS_SHIFT] |= (1 << (id)); diff --git a/platform/lang-impl/src/com/intellij/util/indexing/containers/ChangeBufferingList.java b/platform/lang-impl/src/com/intellij/util/indexing/containers/ChangeBufferingList.java index 103f7d5fb587..a1373c06a23f 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/containers/ChangeBufferingList.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/containers/ChangeBufferingList.java @@ -19,8 +19,6 @@ import com.intellij.util.indexing.DebugAssertions; import com.intellij.util.indexing.ValueContainer; import gnu.trove.TIntProcedure; -import java.util.Arrays; - import static com.intellij.util.indexing.DebugAssertions.DEBUG; /** @@ -37,7 +35,8 @@ public class ChangeBufferingList implements Cloneable { //static final int MAX_FILES = 100; private volatile int[] changes; private short length; - private short removals; + private boolean hasRemovals; + private volatile boolean mayHaveDupes; private volatile RandomAccessIntContainer randomAccessContainer; private IdSet checkSet; @@ -75,7 +74,8 @@ public class ChangeBufferingList implements Cloneable { private void addChange(int value) { changes[length++] = value; - if (value < 0) ++removals; + if (value < 0 && !hasRemovals) hasRemovals = true; + if(!mayHaveDupes) mayHaveDupes = true; } public void remove(int value) { @@ -118,37 +118,26 @@ public class ChangeBufferingList implements Cloneable { RandomAccessIntContainer idSet; if (randomAccessContainer == null) { - int someElementsNumberEstimation = length - removals; + int someElementsNumberEstimation = length; int[] minMax = calcMinMax(changes, length); // todo we can check these lengths instead of only relying upon reaching MAX_FILES - int lengthOfBitSet = IdBitSet.sizeInBytes(minMax[1], minMax[0]); - int lengthOfIntSet = 4 * length; + //int lengthOfBitSet = IdBitSet.sizeInBytes(minMax[1], minMax[0]); + //int lengthOfIntSet = 4 * length; if (someElementsNumberEstimation < MAX_FILES) { - if (removals == 0) { - if (DEBUG) { - ValueContainer.IntIterator sorted = SortedFileIdSetIterator.getTransientIterator(new ChangesIterator(changes, length)); - int lastIndex = 0; - while(sorted.hasNext()) { - currentChanges[lastIndex++] = sorted.next(); - } - - DebugAssertions.assertTrue(lastIndex == length); - idSet = new SortedIdSet(currentChanges, lastIndex); - } else { - Arrays.sort(currentChanges, 0, length); - idSet = new SortedIdSet(currentChanges, length); + if (!hasRemovals) { + if (mayHaveDupes) { + mergeChangesRemovingDupes(); } + idSet = new SortedIdSet(currentChanges, length); + copyChanges = false; } else { idSet = new SortedIdSet(Math.max(someElementsNumberEstimation, 3)); } } - else if (removals == 0) { - if (lengthOfBitSet > lengthOfIntSet) { - int a = 1; - } + else if (!hasRemovals) { idSet = new IdBitSet(changes, length, 0); copyChanges = false; } else { @@ -186,13 +175,26 @@ public class ChangeBufferingList implements Cloneable { } length = 0; - removals = 0; + hasRemovals = false; + mayHaveDupes = false; randomAccessContainer = idSet; changes = null; return randomAccessContainer; } } + private void mergeChangesRemovingDupes() { // duplicated ids can be present for some index due to cancellation of indexing for next index + int[] currentChanges = changes; + ValueContainer.IntIterator sorted = SortedFileIdSetIterator.getTransientIterator(new ChangesIterator(currentChanges, length)); + int lastIndex = 0; + while(sorted.hasNext()) { + currentChanges[lastIndex++] = sorted.next(); + } + + length = (short)lastIndex; + mayHaveDupes = false; + } + public void ensureCapacity(int diff) { RandomAccessIntContainer intContainer = randomAccessContainer; if (length == MAX_FILES) { @@ -224,7 +226,7 @@ public class ChangeBufferingList implements Cloneable { if (DEBUG) DebugAssertions.assertTrue(checkSet.isEmpty()); return true; } - if (removals == 0) { + if (!hasRemovals) { boolean b = length == 0; if (DEBUG) DebugAssertions.assertTrue(b == checkSet.isEmpty()); return b; @@ -252,14 +254,24 @@ public class ChangeBufferingList implements Cloneable { public ValueContainer.IntIterator intIterator() { RandomAccessIntContainer intContainer = randomAccessContainer; - if (intContainer == null && removals == 0) { - ValueContainer.IntIterator iterator = new ChangesIterator(changes, length); - if (DEBUG) { - ValueContainer.IntIterator iteratorSurelyWithoutDupes = SortedFileIdSetIterator.getTransientIterator(iterator); - DebugAssertions.assertTrue(iteratorSurelyWithoutDupes.size() == length); - iterator = iterator.createCopyInInitialState(); + if (intContainer == null && !hasRemovals) { + int[] currentChanges = changes; + if (currentChanges != null) { + if (mayHaveDupes) { + synchronized (currentChanges) { + if (mayHaveDupes) mergeChangesRemovingDupes(); + } + } + return new ChangesIterator(currentChanges, length); } - return iterator; + } + return getRandomAccessContainer().intIterator(); + } + + public ValueContainer.IntIterator rawIntIterator() { + RandomAccessIntContainer intContainer = randomAccessContainer; + if (intContainer == null && !hasRemovals) { + return new ChangesIterator(changes, length); // dupes are possible } return getRandomAccessContainer().intIterator(); } |