summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com
diff options
context:
space:
mode:
Diffstat (limited to 'platform/lang-impl/src/com')
-rw-r--r--platform/lang-impl/src/com/intellij/analysis/BaseAnalysisAction.java2
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/CodeStyleSchemesConfigurable.java5
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/ModuleListCellRenderer.java13
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/ModulesComboBox.java10
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/codeStyle/ManageCodeStyleSchemesDialog.java2
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/codeStyle/WrappingAndBracesPanel.java1
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AbstractArrangementRuleAction.java43
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AbstractMoveArrangementRuleAction.java12
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/AddArrangementRuleAction.java4
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/EditArrangementRuleAction.java7
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/RemoveArrangementRuleAction.java2
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/group/ArrangementGroupingRulesControl.java19
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java47
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsConfigurable.form2
-rw-r--r--platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsConfigurable.java25
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/actions/FormatChangedTextUtil.java30
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/actions/ReformatCodeProcessor.java18
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java43
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java7
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java6
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java15
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java5
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java2
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/documentation/QuickDocUtil.java64
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/hint/actions/ShowImplementationsAction.java25
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java19
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/template/impl/EditVariableDialog.java9
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateListPanel.java12
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSettings.java13
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java9
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/ElseExpressionPostfixTemplateBase.java3
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/IfPostfixTemplateBase.java3
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/PostfixLiveTemplate.java7
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/StatementWrapPostfixTemplate.java3
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/template/postfix/templates/SurroundPostfixTemplateBase.java3
-rw-r--r--platform/lang-impl/src/com/intellij/codeInspection/actions/GotoInspectionModel.java55
-rw-r--r--platform/lang-impl/src/com/intellij/codeInspection/actions/InspectionListCellRenderer.java80
-rw-r--r--platform/lang-impl/src/com/intellij/codeInspection/actions/ViewOfflineResultsAction.java2
-rw-r--r--platform/lang-impl/src/com/intellij/diagnostic/logging/DebuggerLogConsoleManager.java1
-rw-r--r--platform/lang-impl/src/com/intellij/diagnostic/logging/LogConfigurationPanel.java37
-rw-r--r--platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleBase.java1
-rw-r--r--platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleImpl.java34
-rw-r--r--platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManager.java16
-rw-r--r--platform/lang-impl/src/com/intellij/diagnostic/logging/LogConsoleManagerBase.java96
-rw-r--r--platform/lang-impl/src/com/intellij/diagnostic/logging/LogFilesManager.java133
-rw-r--r--platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationsComboBoxAction.java2
-rw-r--r--platform/lang-impl/src/com/intellij/execution/actions/StopAction.java7
-rw-r--r--platform/lang-impl/src/com/intellij/execution/console/ConsoleExecuteAction.java29
-rw-r--r--platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleBuilder.java23
-rw-r--r--platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java5
-rw-r--r--platform/lang-impl/src/com/intellij/execution/console/UseConsoleInputAction.java56
-rw-r--r--platform/lang-impl/src/com/intellij/execution/impl/BeforeRunStepsPanel.java6
-rw-r--r--platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java13
-rw-r--r--platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java12
-rw-r--r--platform/lang-impl/src/com/intellij/execution/runners/RunContentBuilder.java53
-rw-r--r--platform/lang-impl/src/com/intellij/execution/runners/RunTab.java74
-rw-r--r--platform/lang-impl/src/com/intellij/execution/ui/CommonProgramParametersPanel.java7
-rw-r--r--platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java8
-rw-r--r--platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToFind.java6
-rw-r--r--platform/lang-impl/src/com/intellij/find/editorHeaderActions/SwitchToReplace.java4
-rw-r--r--platform/lang-impl/src/com/intellij/find/editorHeaderActions/ToggleRegex.java6
-rw-r--r--platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java15
-rw-r--r--platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java12
-rw-r--r--platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreview.java34
-rw-r--r--platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewController.java7
-rw-r--r--platform/lang-impl/src/com/intellij/ide/RecentDirectoryProjectsManagerEx.java6
-rw-r--r--platform/lang-impl/src/com/intellij/ide/actions/ExternalJavaDocAction.java2
-rw-r--r--platform/lang-impl/src/com/intellij/ide/actions/GotoActionAction.java2
-rw-r--r--platform/lang-impl/src/com/intellij/ide/actions/GotoActionBase.java10
-rw-r--r--platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseCallHierarchyAction.java2
-rw-r--r--platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseMethodHierarchyAction.java2
-rw-r--r--platform/lang-impl/src/com/intellij/ide/hierarchy/actions/BrowseTypeHierarchyAction.java2
-rw-r--r--platform/lang-impl/src/com/intellij/ide/impl/convert/JDomConvertingUtil.java4
-rw-r--r--platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarListener.java24
-rw-r--r--platform/lang-impl/src/com/intellij/ide/navigationToolbar/ui/AbstractNavBarUI.java4
-rw-r--r--platform/lang-impl/src/com/intellij/ide/scratch/CreateScratchFileAction.java3
-rw-r--r--platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java3
-rw-r--r--platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java28
-rw-r--r--platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserConfigurable.java2
-rw-r--r--platform/lang-impl/src/com/intellij/lang/customFolding/CustomFoldingRegionsPopup.java133
-rw-r--r--platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionAction.java96
-rw-r--r--platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.form25
-rw-r--r--platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.java169
-rw-r--r--platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ModuleStoreImpl.java36
-rw-r--r--platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ProjectWithModulesStoreImpl.java13
-rw-r--r--platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/PsiAwareFileEditorManagerImpl.java7
-rw-r--r--platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/TestEditorManagerImpl.java14
-rw-r--r--platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/ProjectJdkTableImpl.java8
-rw-r--r--platform/lang-impl/src/com/intellij/openapi/roots/impl/libraries/ExportableApplicationLibraryTable.java5
-rw-r--r--platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java25
-rw-r--r--platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/RootDetectionUtil.java8
-rw-r--r--platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ModulesAlphaComparator.java7
-rw-r--r--platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ProjectSdksModel.java16
-rw-r--r--platform/lang-impl/src/com/intellij/openapi/util/registry/RegistryUi.java3
-rw-r--r--platform/lang-impl/src/com/intellij/openapi/wm/impl/status/TogglePopupHintsPanel.java10
-rw-r--r--platform/lang-impl/src/com/intellij/platform/templates/github/DownloadUtil.java3
-rw-r--r--platform/lang-impl/src/com/intellij/profile/codeInspection/InspectionProfileManagerImpl.java8
-rw-r--r--platform/lang-impl/src/com/intellij/profile/codeInspection/ui/LevelChooser.java102
-rw-r--r--platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java3
-rw-r--r--platform/lang-impl/src/com/intellij/profile/codeInspection/ui/inspectionsTree/InspectionsConfigTreeTable.java2
-rw-r--r--platform/lang-impl/src/com/intellij/profile/codeInspection/ui/table/ScopesAndSeveritiesTable.java5
-rw-r--r--platform/lang-impl/src/com/intellij/psi/impl/cache/impl/id/IdIndexImpl.java29
-rw-r--r--platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemeImpl.java5
-rw-r--r--platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleSchemesImpl.java3
-rw-r--r--platform/lang-impl/src/com/intellij/psi/search/scope/packageSet/PackageSetFactoryImpl.java3
-rw-r--r--platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java8
-rw-r--r--platform/lang-impl/src/com/intellij/refactoring/actions/RefactoringQuickListPopupAction.java3
-rw-r--r--platform/lang-impl/src/com/intellij/refactoring/rename/RenameUtil.java13
-rw-r--r--platform/lang-impl/src/com/intellij/tools/BaseExternalToolsGroup.java2
-rw-r--r--platform/lang-impl/src/com/intellij/tools/ToolsProcessor.java5
-rw-r--r--platform/lang-impl/src/com/intellij/ui/ReplacePromptDialog.java1
-rw-r--r--platform/lang-impl/src/com/intellij/ui/tabs/EditorTabColorProviderImpl.java5
-rw-r--r--platform/lang-impl/src/com/intellij/util/download/impl/FileDownloaderImpl.java12
-rw-r--r--platform/lang-impl/src/com/intellij/util/indexing/ValueContainerImpl.java4
-rw-r--r--platform/lang-impl/src/com/intellij/util/indexing/containers/ChangeBufferingList.java78
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();
}