Merge remote-tracking branch 'origin/master'

This commit is contained in:
Dennis Ushakov
2015-01-21 00:37:03 +03:00
179 changed files with 2286 additions and 1249 deletions
+1 -1
View File
@@ -168,7 +168,7 @@ libraryLicense(name: "Apache Commons Compress", libraryName: "commons-compress",
libraryLicense(name: "Apache Commons Discovery", libraryName: "commons-discovery-0.4.jar", version: "0.4", license: "Apache 2.0", url: "http://jakarta.apache.org/commons/discovery/", licenseUrl: "http://commons.apache.org/license.html")
libraryLicense(name: "Apache Commons HTTPClient", libraryName: "http-client-3.1", version: "3.1  (with patch by JetBrains)", license: "Apache 2.0", url: "http://hc.apache.org/httpclient-3.x")
libraryLicense(name: "HttpComponents HttpClient", libraryName: "http-client", version: "4.3.2", license: "Apache 2.0", url: "http://hc.apache.org/httpcomponents-client-ga/index.html")
libraryLicense(name: "Apache Commons Net", libraryName: "commons-net", version: "3.1", license: "Apache 2.0", url: "http://commons.apache.org/net/")
libraryLicense(name: "Apache Commons Net", libraryName: "commons-net", version: "3.3", license: "Apache 2.0", url: "http://commons.apache.org/net/")
libraryLicense(name: "Apache Commons Logging", libraryName: "commons-logging", version: "1.1.1", license: "Apache 2.0", url: "http://commons.apache.org/logging/")
libraryLicense(name: "Apache Commons IO", libraryName: "commons-io-1.4.jar", version: "1.4", license: "Apache 2.0", url: "http://commons.apache.org/io/", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0.txt")
libraryLicense(name: "Apache Lucene", libraryName: "lucene-core-2.4.1.jar", version: "2.4.1", license: "Apache 2.0", url: "http://lucene.apache.org/java")
+21
View File
@@ -362,6 +362,27 @@
<option name="Class">
<value />
</option>
<option name="DEBUGGER_INLINED_VALUES">
<value>
<option name="FOREGROUND" value="3d8065" />
<option name="FONT_TYPE" value="2" />
<option name="EFFECT_TYPE" value="0" />
</value>
</option>
<option name="DEBUGGER_INLINED_VALUES_EXECUTION_LINE">
<value>
<option name="FOREGROUND" value="ffeb09" />
<option name="FONT_TYPE" value="2" />
<option name="EFFECT_TYPE" value="0" />
</value>
</option>
<option name="DEBUGGER_INLINED_VALUES_MODIFIED">
<value>
<option name="FOREGROUND" value="ca7e03" />
<option name="FONT_TYPE" value="2" />
<option name="EFFECT_TYPE" value="0" />
</value>
</option>
<option name="DEFAULT_BRACES">
<value />
</option>
@@ -104,7 +104,8 @@ import org.jetbrains.jps.cmdline.ClasspathBootstrap;
import org.jetbrains.jps.incremental.Utils;
import org.jetbrains.jps.model.serialization.JpsGlobalLoader;
import javax.tools.*;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import java.awt.*;
import java.io.File;
import java.io.IOException;
@@ -130,7 +131,7 @@ public class BuildManager implements ApplicationComponent{
private static final String COMPILER_PROCESS_JDK_PROPERTY = "compiler.process.jdk";
public static final String SYSTEM_ROOT = "compile-server";
public static final String TEMP_DIR_NAME = "_temp_";
private final boolean IS_UNIT_TEST_MODE;
private static final boolean IS_UNIT_TEST_MODE = ApplicationManager.getApplication().isUnitTestMode();
private static final String IWS_EXTENSION = ".iws";
private static final String IPR_EXTENSION = ".ipr";
private static final String IDEA_PROJECT_DIR_PATTERN = "/.idea/";
@@ -215,7 +216,6 @@ public class BuildManager implements ApplicationComponent{
public BuildManager(final ProjectManager projectManager) {
final Application application = ApplicationManager.getApplication();
IS_UNIT_TEST_MODE = application.isUnitTestMode();
myProjectManager = projectManager;
final String systemPath = PathManager.getSystemPath();
File system = new File(systemPath);
@@ -764,8 +764,8 @@ public class BuildManager implements ApplicationComponent{
}
private static boolean isProcessPreloadingEnabled() {
// automatically disable process preloading when debugging
return Registry.is("compiler.process.preload") && Registry.intValue("compiler.process.debug.port") <= 0 ;
// automatically disable process preloading when debugging or testing
return !IS_UNIT_TEST_MODE && Registry.is("compiler.process.preload") && Registry.intValue("compiler.process.debug.port") <= 0;
}
private void notifySessionTerminationIfNeeded(UUID sessionId, @Nullable Throwable execFailure) {
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -17,7 +17,6 @@ package com.intellij.codeInspection.reference;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Key;
import com.intellij.psi.*;
import com.intellij.psi.util.ClassUtil;
import com.intellij.psi.util.PsiFormatUtil;
@@ -33,7 +32,7 @@ import org.jetbrains.annotations.Nullable;
public class RefFieldImpl extends RefJavaElementImpl implements RefField {
private static final int USED_FOR_READING_MASK = 0x10000;
private static final int USED_FOR_WRITING_MASK = 0x20000;
private static final int ASSIGNED_ONLY_IN_INITIALIZER = 0x40000;
private static final int ASSIGNED_ONLY_IN_INITIALIZER_MASK = 0x40000;
RefFieldImpl(@NotNull RefClass ownerClass, PsiField field, RefManager manager) {
super(field, manager);
@@ -94,13 +93,13 @@ public class RefFieldImpl extends RefJavaElementImpl implements RefField {
}
private void setUsedForWriting(boolean usedForWriting) {
setFlag(false, ASSIGNED_ONLY_IN_INITIALIZER);
setFlag(false, ASSIGNED_ONLY_IN_INITIALIZER_MASK);
setFlag(usedForWriting, USED_FOR_WRITING_MASK);
}
@Override
public boolean isOnlyAssignedInInitializer() {
return checkFlag(ASSIGNED_ONLY_IN_INITIALIZER);
return checkFlag(ASSIGNED_ONLY_IN_INITIALIZER_MASK);
}
@Override
@@ -130,7 +129,7 @@ public class RefFieldImpl extends RefJavaElementImpl implements RefField {
if (psiField.getInitializer() != null || psiField instanceof PsiEnumConstant) {
if (!checkFlag(USED_FOR_WRITING_MASK)) {
setFlag(true, ASSIGNED_ONLY_IN_INITIALIZER);
setFlag(true, ASSIGNED_ONLY_IN_INITIALIZER_MASK);
setFlag(true, USED_FOR_WRITING_MASK);
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -41,10 +41,11 @@ public abstract class RefJavaElementImpl extends RefElementImpl implements RefJa
private static final int ACCESS_PROTECTED = 0x01;
private static final int ACCESS_PACKAGE = 0x02;
private static final int ACCESS_PUBLIC = 0x03;
private static final int IS_STATIC_MASK = 0x04;
private static final int IS_FINAL_MASK = 0x08;
private static final int IS_USES_DEPRECATION_MASK = 0x200;
private static final int IS_SYNTHETIC_JSP_ELEMENT = 0x400;
private static final int IS_SYNTHETIC_JSP_ELEMENT_MASK = 0x400;
protected RefJavaElementImpl(String name, @NotNull RefJavaElement owner) {
super(name, owner);
@@ -148,11 +149,11 @@ public abstract class RefJavaElementImpl extends RefElementImpl implements RefJa
@Override
public boolean isSyntheticJSP() {
return checkFlag(IS_SYNTHETIC_JSP_ELEMENT);
return checkFlag(IS_SYNTHETIC_JSP_ELEMENT_MASK);
}
public void setSyntheticJSP(boolean b) {
setFlag(b, IS_SYNTHETIC_JSP_ELEMENT);
setFlag(b, IS_SYNTHETIC_JSP_ELEMENT_MASK);
}
@Override
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -46,7 +46,7 @@ public class RefMethodImpl extends RefJavaElementImpl implements RefMethod {
private static final int IS_RETURN_VALUE_USED_MASK = 0x400000;
private static final int IS_TEST_METHOD_MASK = 0x4000000;
private static final int IS_CALLED_ON_SUBCLASS = 0x8000000;
private static final int IS_CALLED_ON_SUBCLASS_MASK = 0x8000000;
private static final String RETURN_VALUE_UNDEFINED = "#";
@@ -701,11 +701,11 @@ public class RefMethodImpl extends RefJavaElementImpl implements RefMethod {
@Override
public boolean isCalledOnSubClass() {
return checkFlag(IS_CALLED_ON_SUBCLASS);
return checkFlag(IS_CALLED_ON_SUBCLASS_MASK);
}
public void setCalledOnSubClass(boolean isCalledOnSubClass){
setFlag(isCalledOnSubClass, IS_CALLED_ON_SUBCLASS);
setFlag(isCalledOnSubClass, IS_CALLED_ON_SUBCLASS_MASK);
}
}
@@ -29,14 +29,6 @@
<border type="none"/>
<children/>
</grid>
<grid id="90fcc" binding="myJSPPanel" layout-manager="BorderLayout" hgap="-1" vgap="-1">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children/>
</grid>
<grid id="27541" binding="myPackagesPanel" layout-manager="BorderLayout" hgap="-1" vgap="-1">
<constraints>
<grid row="1" column="0" row-span="1" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -39,11 +39,8 @@ public class CodeStyleImportsPanel extends JPanel {
private JBTable myPackageTable;
private final CodeStyleSettings mySettings;
private JRadioButton myJspImportCommaSeparated;
private JRadioButton myJspOneImportPerDirective;
private JPanel myGeneralPanel;
private JPanel myJSPPanel;
private JPanel myPackagesPanel;
private JPanel myImportsLayoutPanel;
private JPanel myWholePanel;
@@ -56,7 +53,6 @@ public class CodeStyleImportsPanel extends JPanel {
add(myWholePanel, BorderLayout.CENTER);
myGeneralPanel.add(createGeneralOptionsPanel(), BorderLayout.CENTER);
myJSPPanel.add(createJspImportLayoutPanel(), BorderLayout.CENTER);
createImportPanel();
createPackagePanel();
}
@@ -77,47 +73,6 @@ public class CodeStyleImportsPanel extends JPanel {
myPackagesPanel.add(PackagePanel.createPackagesPanel(myPackageTable, myPackageList), BorderLayout.CENTER);
}
private JPanel createJspImportLayoutPanel() {
ButtonGroup buttonGroup = new ButtonGroup();
myJspImportCommaSeparated = new JRadioButton(ApplicationBundle.message("radio.prefer.comma.separated.import.list"));
myJspOneImportPerDirective = new JRadioButton(ApplicationBundle.message("radio.prefer.one.import.statement.per.page.directive"));
buttonGroup.add(myJspImportCommaSeparated);
buttonGroup.add(myJspOneImportPerDirective);
JPanel btnPanel = new JPanel(new BorderLayout());
btnPanel.add(myJspImportCommaSeparated, BorderLayout.NORTH);
btnPanel.add(myJspOneImportPerDirective, BorderLayout.CENTER);
//noinspection HardCodedStringLiteral
final MultiLineLabel commaSeparatedLabel = new MultiLineLabel("<% page import=\"com.company.Boo, \n" +
" com.company.Far\"%>");
//noinspection HardCodedStringLiteral
final MultiLineLabel oneImportPerDirectiveLabel = new MultiLineLabel("<% page import=\"com.company.Boo\"%>\n" +
"<% page import=\"com.company.Far\"%>");
final JPanel labelPanel = new JPanel(new BorderLayout());
labelPanel.setBorder(
BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(20, 10, 0, 0), IdeBorderFactory.createTitledBorder(
ApplicationBundle.message("title.preview"), false)));
JPanel resultPanel = new JPanel(new BorderLayout());
resultPanel.add(btnPanel, BorderLayout.NORTH);
resultPanel.add(labelPanel, BorderLayout.CENTER);
resultPanel.setBorder(IdeBorderFactory.createTitledBorder(ApplicationBundle.message("title.jsp.imports.layout"), true));
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
boolean isComma = myJspImportCommaSeparated.isSelected();
labelPanel.removeAll();
labelPanel.add(isComma ? commaSeparatedLabel : oneImportPerDirectiveLabel, BorderLayout.NORTH);
labelPanel.repaint();
labelPanel.revalidate();
}
};
myJspImportCommaSeparated.addActionListener(actionListener);
myJspOneImportPerDirective.addActionListener(actionListener);
return resultPanel;
}
private JPanel createGeneralOptionsPanel() {
OptionGroup group = new OptionGroup(ApplicationBundle.message("title.general"));
myCbUseSingleClassImports = new JCheckBox(ApplicationBundle.message("checkbox.use.single.class.import"));
@@ -139,13 +94,13 @@ public class CodeStyleImportsPanel extends JPanel {
new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(0, 3, 0, 0), 0, 0));
panel.add(myClassCountField,
new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(0, 1, 0, 0), 0, 0));
panel.add(new JLabel(ApplicationBundle.message("editbox.names.count.to.use.static.import.with.star")),
new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(0, 3, 0, 0), 0, 0));
panel.add(myNamesCountField,
new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(0, 1, 0, 0), 0, 0));
group.add(panel);
@@ -185,13 +140,6 @@ public class CodeStyleImportsPanel extends JPanel {
if (myPackageTable.getRowCount() > 0) {
myPackageTable.getSelectionModel().setSelectionInterval(0, 0);
}
if (settings.JSP_PREFER_COMMA_SEPARATED_IMPORT_LIST) {
myJspImportCommaSeparated.doClick();
}
else {
myJspOneImportPerDirective.doClick();
}
}
public void reset() {
@@ -225,8 +173,6 @@ public class CodeStyleImportsPanel extends JPanel {
myPackageList.removeEmptyPackages();
settings.PACKAGES_TO_USE_IMPORT_ON_DEMAND.copyFrom(myPackageList);
settings.JSP_PREFER_COMMA_SEPARATED_IMPORT_LIST = myJspImportCommaSeparated.isSelected();
myFqnInJavadocOption.apply(settings);
}
@@ -250,7 +196,6 @@ public class CodeStyleImportsPanel extends JPanel {
isModified |= isModified(myImportLayoutPanel.getImportLayoutList(), settings.IMPORT_LAYOUT_TABLE);
isModified |= isModified(myPackageList, settings.PACKAGES_TO_USE_IMPORT_ON_DEMAND);
isModified |= settings.JSP_PREFER_COMMA_SEPARATED_IMPORT_LIST != myJspImportCommaSeparated.isSelected();
return isModified;
}
@@ -16,64 +16,49 @@
package com.intellij.application.options;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.JavaCodeStyleSettings;
import com.intellij.ui.ListCellRendererWrapper;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
import static com.intellij.psi.codeStyle.JavaCodeStyleSettings.FULLY_QUALIFY_NAMES_ALWAYS;
import static com.intellij.psi.codeStyle.JavaCodeStyleSettings.FULLY_QUALIFY_NAMES_IF_NOT_IMPORTED;
import static com.intellij.psi.codeStyle.JavaCodeStyleSettings.SHORTEN_NAMES_ALWAYS_AND_ADD_IMPORT;
public class FullyQualifiedNamesInJavadocOptionProvider {
private JRadioButton myFullyQualifyNamesAlways;
private JRadioButton myShortenNamesAlways;
private JRadioButton myFullyQualifyIfNotImported;
private JPanel myPanel;
private ComboBox myComboBox;
public FullyQualifiedNamesInJavadocOptionProvider(@NotNull CodeStyleSettings settings) {
composePanel();
reset(settings);
}
public void reset(@NotNull CodeStyleSettings settings) {
JavaCodeStyleSettings javaSettings = settings.getCustomSettings(JavaCodeStyleSettings.class);
int classNamesInJavadoc = javaSettings.CLASS_NAMES_IN_JAVADOC;
if (classNamesInJavadoc == FULLY_QUALIFY_NAMES_ALWAYS) {
myFullyQualifyNamesAlways.setSelected(true);
}
else if (classNamesInJavadoc == SHORTEN_NAMES_ALWAYS_AND_ADD_IMPORT) {
myShortenNamesAlways.setSelected(true);
}
else {
myFullyQualifyIfNotImported.setSelected(true);
}
QualifyJavadocOptions option = QualifyJavadocOptions.fromIntValue(javaSettings.CLASS_NAMES_IN_JAVADOC);
myComboBox.setSelectedItem(option);
}
public void apply(@NotNull CodeStyleSettings settings) {
JavaCodeStyleSettings javaSettings = settings.getCustomSettings(JavaCodeStyleSettings.class);
javaSettings.CLASS_NAMES_IN_JAVADOC = getIntValueFromSelectedRadioButton();
javaSettings.CLASS_NAMES_IN_JAVADOC = getSelectedIntOptionValue();
}
public boolean isModified(CodeStyleSettings settings) {
JavaCodeStyleSettings javaSettings = settings.getCustomSettings(JavaCodeStyleSettings.class);
return javaSettings.CLASS_NAMES_IN_JAVADOC != getIntValueFromSelectedRadioButton();
return javaSettings.CLASS_NAMES_IN_JAVADOC != getSelectedIntOptionValue();
}
private int getIntValueFromSelectedRadioButton() {
if (myFullyQualifyNamesAlways.isSelected()) {
return FULLY_QUALIFY_NAMES_ALWAYS;
}
else if (myShortenNamesAlways.isSelected()) {
return SHORTEN_NAMES_ALWAYS_AND_ADD_IMPORT;
}
else {
return FULLY_QUALIFY_NAMES_IF_NOT_IMPORTED;
}
private int getSelectedIntOptionValue() {
QualifyJavadocOptions item = (QualifyJavadocOptions)myComboBox.getSelectedItem();
return item.getIntOptionValue();
}
@NotNull
@@ -82,30 +67,63 @@ public class FullyQualifiedNamesInJavadocOptionProvider {
}
private void composePanel() {
myPanel = new JPanel();
BoxLayout boxLayout = new BoxLayout(myPanel, BoxLayout.Y_AXIS);
myPanel.setLayout(boxLayout);
myPanel = new JPanel(new GridBagLayout());
myComboBox = new ComboBox();
for (QualifyJavadocOptions options : QualifyJavadocOptions.values()) {
myComboBox.addItem(options);
}
myComboBox.setRenderer(new ListCellRendererWrapper() {
@Override
public void customize(final JList list, final Object value, final int index, final boolean selected, final boolean hasFocus) {
if (value instanceof QualifyJavadocOptions) {
setText(((QualifyJavadocOptions)value).getPresentableText());
}
}
});
JLabel title = new JLabel(ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc"));
title.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0));
myFullyQualifyNamesAlways = new JRadioButton(ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc.always"));
myFullyQualifyNamesAlways.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 0));
myPanel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0));
myShortenNamesAlways = new JRadioButton(ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc.never"));
myShortenNamesAlways.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 0));
GridBagConstraints left = new GridBagConstraints();
left.anchor = GridBagConstraints.WEST;
myFullyQualifyIfNotImported = new JRadioButton(ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc.if.not.imported"));
myFullyQualifyIfNotImported.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 0));
GridBagConstraints right = new GridBagConstraints();
right.anchor = GridBagConstraints.WEST;
right.weightx = 1.0;
right.insets = new Insets(0, 5, 0, 0);
ButtonGroup group = new ButtonGroup();
group.add(myFullyQualifyNamesAlways);
group.add(myShortenNamesAlways);
group.add(myFullyQualifyIfNotImported);
myPanel.add(title, left);
myPanel.add(myComboBox, right);
}
}
myPanel.add(title);
myPanel.add(myFullyQualifyNamesAlways);
myPanel.add(myFullyQualifyIfNotImported);
myPanel.add(myShortenNamesAlways);
enum QualifyJavadocOptions {
FQ_ALWAYS(FULLY_QUALIFY_NAMES_ALWAYS, ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc.always")),
SHORTEN_ALWAYS(SHORTEN_NAMES_ALWAYS_AND_ADD_IMPORT, ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc.never")),
FQ_WHEN_NOT_IMPORTED(FULLY_QUALIFY_NAMES_IF_NOT_IMPORTED, ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc.if.not.imported"));
private final String myText;
private final int myOption;
public String getPresentableText() {
return myText;
}
public int getIntOptionValue() {
return myOption;
}
public static QualifyJavadocOptions fromIntValue(int value) {
for (QualifyJavadocOptions option : values()) {
if (option.myOption == value) return option;
}
return FQ_WHEN_NOT_IMPORTED;
}
QualifyJavadocOptions(int option, String text) {
myOption = option;
myText = text;
}
}
@@ -78,11 +78,12 @@ public int hashCode() {
#end
##
#macro(adjustHashCodeToArrays $field)
#if ($field.array && $java_version > 4)
#if ($field.nestedArray)
// Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
#if ($field.array && $java_version > 4)
#if ($field.nestedArray)
java.util.Arrays.deepHashCode($field.accessor)##
#else
java.util.Arrays.hashCode($field.accessor)##
#end
java.util.Arrays.hashCode($field.accessor)##
#else
${field.accessor}.hashCode()##
#end
@@ -13,15 +13,7 @@ Object $paramName){
&&
#end
#set($i = $i + 1)
#if ($field.array)
#if ($field.nestedArray)
java.util.Arrays.deepEquals($field.accessor, ${classInstanceName}.$field.accessor)##
#else
java.util.Arrays.equals($field.accessor, ${classInstanceName}.$field.accessor)##
#end
#else
java.util.Objects.equals($field.accessor, ${classInstanceName}.$field.accessor)##
#end
#end
;
}
@@ -42,6 +42,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileSystem;
import com.intellij.psi.*;
import com.intellij.psi.impl.beanProperties.BeanPropertyElement;
import com.intellij.psi.impl.compiled.ClsElementImpl;
import com.intellij.psi.impl.source.javadoc.PsiDocParamRef;
import com.intellij.psi.infos.CandidateInfo;
import com.intellij.psi.javadoc.PsiDocComment;
@@ -479,6 +480,13 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
@Override
public String generateDoc(PsiElement element, PsiElement originalElement) {
PsiCompiledElement originalCompiledElement = element.getUserData(ClsElementImpl.COMPILED_ELEMENT);
if (originalCompiledElement != null) {
// take compiled element instead decompiled one for finding proper documentation (IDEA-96013)
// it will not be needed iff TargetElementUtilBase stops preferring decompiled source
// via ((PsiCompiledFile) file).getDecompiledPsiFile()
element = originalCompiledElement;
}
if (element instanceof PsiExpressionList) {
element = element.getParent(); // for new Class(<caret>) or methodCall(<caret>) proceed from method call or new expression
originalElement = null;
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2010 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -34,13 +34,13 @@ import org.jetbrains.annotations.Nullable;
* User: cdr
*/
class AnchorElementInfo extends SelfElementInfo {
private int stubId = -1;
private int stubId;
private IStubElementType myStubElementType;
AnchorElementInfo(@NotNull PsiElement anchor, @NotNull PsiFile containingFile) {
super(containingFile.getProject(), ProperTextRange.create(anchor.getTextRange()), anchor.getClass(), containingFile,
LanguageUtil.getRootLanguage(anchor));
super(containingFile.getProject(), ProperTextRange.create(anchor.getTextRange()), anchor.getClass(), containingFile, LanguageUtil.getRootLanguage(anchor));
assert !(anchor instanceof PsiFile) : "FileElementInfo must be used for file: "+anchor;
stubId = -1;
}
// will restore by stub index until file tree get loaded
AnchorElementInfo(@NotNull PsiElement anchor,
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -44,17 +44,17 @@ class PersistentIntList implements Disposable {
public PersistentIntList(@NotNull File dataFile, int initialSize) throws IOException {
data = new RandomAccessFile(dataFile, "rw").getChannel();
int pointersBase;
int initialCapacity = initialSize + 256;
if (initialSize != 0) {
int initialCapacity = Math.min((initialSize+1)*2, initialSize + 256);
if (initialSize == 0) {
pointersBase = readInt(data, 0);
}
else {
writeInt(data, 0, 4); // base of the pointers array
writeInt(data, 4, initialSize);
writeInt(data, 8, initialCapacity);
fillWithZeros(data, 4 + 8, initialCapacity *4);
pointersBase = 4;
}
else {
pointersBase = readInt(data, 0);
}
pointers = new IntArray(data, pointersBase);
if (initialSize != 0) {
assert pointers.size == initialSize;
@@ -134,11 +134,22 @@ public class RefactoringConflictsUtil {
}
}
public static void checkUsedElements(PsiMember member,
PsiElement scope,
@NotNull Set<PsiMember> membersToMove,
@Nullable Set<PsiMethod> abstractMethods,
@Nullable PsiClass targetClass,
@NotNull PsiElement context,
MultiMap<PsiElement, String> conflicts) {
checkUsedElements(member, scope, membersToMove, abstractMethods, targetClass, null, context, conflicts);
}
public static void checkUsedElements(PsiMember member,
PsiElement scope,
@NotNull Set<PsiMember> membersToMove,
@Nullable Set<PsiMethod> abstractMethods,
@Nullable PsiClass targetClass,
PsiClass accessClass,
@NotNull PsiElement context,
MultiMap<PsiElement, String> conflicts) {
final Set<PsiMember> moving = new HashSet<PsiMember>(membersToMove);
@@ -150,10 +161,10 @@ public class RefactoringConflictsUtil {
PsiElement refElement = refExpr.resolve();
if (refElement instanceof PsiMember) {
PsiExpression qualifier = refExpr.getQualifierExpression();
PsiClass accessClass = (PsiClass)(qualifier != null ? PsiUtil.getAccessObjectClass(qualifier).getElement() : null);
PsiClass qualifierAccessClass = (PsiClass)(qualifier != null && !(qualifier instanceof PsiSuperExpression) ? PsiUtil.getAccessObjectClass(qualifier).getElement() : accessClass);
if (!RefactoringHierarchyUtil.willBeInTargetClass(refElement, moving, targetClass, false) &&
(accessClass == null || !RefactoringHierarchyUtil.willBeInTargetClass(accessClass, moving, targetClass, false))) {
checkAccessibility((PsiMember)refElement, context, accessClass, member, conflicts);
(qualifierAccessClass == null || !RefactoringHierarchyUtil.willBeInTargetClass(qualifierAccessClass, moving, targetClass, false))) {
checkAccessibility((PsiMember)refElement, context, qualifierAccessClass, member, conflicts);
}
}
}
@@ -169,7 +180,7 @@ public class RefactoringConflictsUtil {
final PsiMethod refElement = newExpression.resolveConstructor();
if (refElement != null) {
if (!RefactoringHierarchyUtil.willBeInTargetClass(refElement, moving, targetClass, false)) {
checkAccessibility(refElement, context, null, member, conflicts);
checkAccessibility(refElement, context, accessClass, member, conflicts);
}
}
}
@@ -179,14 +190,14 @@ public class RefactoringConflictsUtil {
PsiElement refElement = refExpr.resolve();
if (refElement instanceof PsiMember) {
if (!RefactoringHierarchyUtil.willBeInTargetClass(refElement, moving, targetClass, false)) {
checkAccessibility((PsiMember)refElement, context, null, member, conflicts);
checkAccessibility((PsiMember)refElement, context, accessClass, member, conflicts);
}
}
}
for (PsiElement child : scope.getChildren()) {
if (child instanceof PsiWhiteSpace || child instanceof PsiComment) continue;
checkUsedElements(member, child, membersToMove, abstractMethods, targetClass, context, conflicts);
checkUsedElements(member, child, membersToMove, abstractMethods, targetClass, child instanceof PsiClass ? (PsiClass)child : accessClass, context, conflicts);
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -23,20 +23,40 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Represents a JavaDoc comment.
*/
public interface PsiDocComment extends PsiComment, PsiDocCommentBase {
/**
* Returns the class, method or field described by the comment.
*/
@Override
@Nullable
PsiDocCommentOwner getOwner();
/**
* Returns the PSI elements containing the description of the element being documented
* (all significant tokens up to the first doc comment tag).
*/
@NotNull
PsiElement[] getDescriptionElements();
/**
* Returns the list of JavaDoc tags in the comment.
*/
@NotNull
PsiDocTag[] getTags();
/**
* Finds the first JavaDoc tag with the specified name.
* @return the tag with the specified name, or null if not found.
*/
@Nullable
PsiDocTag findTagByName(@NonNls String name);
/**
* Finds all JavaDoc tags with the specified name.
*/
@NotNull
PsiDocTag[] findTagsByName(@NonNls String name);
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -22,13 +22,38 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public interface PsiDocTag extends PsiElement, PsiNamedElement{
/**
* Represents a JavaDoc tag (either an inline tag or a block tag).
*/
public interface PsiDocTag extends PsiElement, PsiNamedElement {
PsiDocTag[] EMPTY_ARRAY = new PsiDocTag[0];
/**
* Returns the doc comment in which the tag is conained.
*/
PsiDocComment getContainingComment();
/**
* Returns the token representing the name of this JavaDoc tag.
*/
PsiElement getNameElement();
/**
* Returns the name of this JavaDoc tag.
*/
@Override
@NonNls @NotNull String getName();
/**
* Returns the list of all elements representing the contents of a tag.
*/
PsiElement[] getDataElements();
/**
* Returns the element specifying what exactly is being documented by this tag
* (for example, the parameter name for a param tag or the exception name for a throws tag).
*
* @return the element, or null if the tag structure does not include such an element.
*/
@Nullable PsiDocTagValue getValueElement();
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -19,8 +19,13 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.tree.IElementType;
/**
* Represents a token inside a JavaDoc comment.
*
* @author Mike
*/
public interface PsiDocToken extends PsiElement {
/**
* Returns the element type of this token.
*/
IElementType getTokenType();
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -15,5 +15,8 @@
*/
package com.intellij.psi.javadoc;
/**
* Represents an inline JavaDoc tag.
*/
public interface PsiInlineDocTag extends PsiDocTag {
}
@@ -204,7 +204,14 @@ public class RedundantCastUtil {
if (rExpr instanceof PsiTypeCastExpression) {
PsiExpression castOperand = ((PsiTypeCastExpression)rExpr).getOperand();
if (castOperand != null) {
PsiType operandType = castOperand.getType();
PsiType operandType;
if (castOperand instanceof PsiTypeCastExpression) {
final PsiExpression nestedCastOperand = ((PsiTypeCastExpression)castOperand).getOperand();
operandType = nestedCastOperand != null ? nestedCastOperand.getType() : null;
}
else {
operandType = castOperand.getType();
}
if (operandType != null) {
if (lType != null && TypeConversionUtil.isAssignable(lType, operandType, false)) {
addToResults((PsiTypeCastExpression)rExpr);
@@ -21,8 +21,7 @@ class Test {
public int hashCode() {
int result = myOs != null ? Arrays.hashCode(myOs) : 0;
result = 31 * result + (myIIs != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(myIIs) : 0);
result = 31 * result + (myIIs != null ? Arrays.deepHashCode(myIIs) : 0);
result = 31 * result + (myIs != null ? Arrays.hashCode(myIs) : 0);
return result;
}
@@ -51,14 +51,11 @@ class A {
int result;
long temp;
result = a1 != null ? Arrays.hashCode(a1) : 0;
result = 31 * result + (a2 != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a2) : 0);
result = 31 * result + (a2 != null ? Arrays.deepHashCode(a2) : 0);
result = 31 * result + (a3 != null ? Arrays.hashCode(a3) : 0);
result = 31 * result + (a4 != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a4) : 0);
result = 31 * result + (a4 != null ? Arrays.deepHashCode(a4) : 0);
result = 31 * result + (a5 != null ? Arrays.hashCode(a5) : 0);
result = 31 * result + (a6 != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a6) : 0);
result = 31 * result + (a6 != null ? Arrays.deepHashCode(a6) : 0);
result = 31 * result + (int) a7;
result = 31 * result + (int) a8;
result = 31 * result + a9;
@@ -51,14 +51,11 @@ class A {
int result;
long temp;
result = Arrays.hashCode(a1);
result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a2);
result = 31 * result + Arrays.deepHashCode(a2);
result = 31 * result + Arrays.hashCode(a3);
result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a4);
result = 31 * result + Arrays.deepHashCode(a4);
result = 31 * result + Arrays.hashCode(a5);
result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a6);
result = 31 * result + Arrays.deepHashCode(a6);
result = 31 * result + (int) a7;
result = 31 * result + (int) a8;
result = 31 * result + a9;
@@ -99,14 +99,11 @@ class A {
int result;
long temp;
result = getA1() != null ? Arrays.hashCode(getA1()) : 0;
result = 31 * result + (getA2() != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(getA2()) : 0);
result = 31 * result + (getA2() != null ? Arrays.deepHashCode(getA2()) : 0);
result = 31 * result + (getA3() != null ? Arrays.hashCode(getA3()) : 0);
result = 31 * result + (getA4() != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(getA4()) : 0);
result = 31 * result + (getA4() != null ? Arrays.deepHashCode(getA4()) : 0);
result = 31 * result + (getA5() != null ? Arrays.hashCode(getA5()) : 0);
result = 31 * result + (getA6() != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(getA6()) : 0);
result = 31 * result + (getA6() != null ? Arrays.deepHashCode(getA6()) : 0);
result = 31 * result + (int) getA7();
result = 31 * result + (int) getA8();
result = 31 * result + getA9();
@@ -47,14 +47,11 @@ class A {
@Override
public int hashCode() {
int result = Arrays.hashCode(a1);
result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a2);
result = 31 * result + Arrays.deepHashCode(a2);
result = 31 * result + Arrays.hashCode(a3);
result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a4);
result = 31 * result + Arrays.deepHashCode(a4);
result = 31 * result + Arrays.hashCode(a5);
result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a6);
result = 31 * result + Arrays.deepHashCode(a6);
result = 31 * result + (int) a7;
result = 31 * result + (int) a8;
result = 31 * result + a9;
@@ -63,14 +63,11 @@ class A extends B {
int result = super.hashCode();
long temp;
result = 31 * result + Arrays.hashCode(a1);
result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a2);
result = 31 * result + Arrays.deepHashCode(a2);
result = 31 * result + Arrays.hashCode(a3);
result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a4);
result = 31 * result + Arrays.deepHashCode(a4);
result = 31 * result + Arrays.hashCode(a5);
result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a6);
result = 31 * result + Arrays.deepHashCode(a6);
result = 31 * result + (int) a7;
result = 31 * result + (int) a8;
result = 31 * result + a9;
@@ -51,14 +51,11 @@ class A {
int result1;
long temp1;
result1 = Arrays.hashCode(a1);
result1 = 31 * result1 + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a2);
result1 = 31 * result1 + Arrays.deepHashCode(a2);
result1 = 31 * result1 + Arrays.hashCode(a3);
result1 = 31 * result1 + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a4);
result1 = 31 * result1 + Arrays.deepHashCode(a4);
result1 = 31 * result1 + Arrays.hashCode(a5);
result1 = 31 * result1 + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
Arrays.hashCode(a6);
result1 = 31 * result1 + Arrays.deepHashCode(a6);
result1 = 31 * result1 + (int) a7;
result1 = 31 * result1 + (int) a8;
result1 = 31 * result1 + a9;
@@ -3,12 +3,17 @@
<problem>
<file>DoubleCast3.java</file>
<line>4</line>
<description>Casting '(String) o' to String is redundant</description>
<description>Casting 'o' to String is redundant</description>
</problem>
<problem>
<file>DoubleCast3.java</file>
<line>4</line>
<description>Casting 'o' to String is redundant</description>
<line>6</line>
<description>Casting '(String) s' to String is redundant</description>
</problem>
<problem>
<file>DoubleCast3.java</file>
<line>6</line>
<description>Casting 's' to String is redundant</description>
</problem>
</problems>
@@ -2,5 +2,7 @@ class Test{
static f(){
Object o;
String s = (String) (String) o;
String s2 = (String) (String) s;
}
}
@@ -0,0 +1,9 @@
package a;
import b.B;
public class A extends B {
protected static void bar(){}
public static class I {
protected void foo(){}
}
}
@@ -0,0 +1,15 @@
package b;
import a.A;
public class B {
void method2Move() {
new A.I() {
{
super.foo();
foo();
A.bar();
}
}
}
}
@@ -0,0 +1,18 @@
package a;
import b.B;
public class A extends B {
void method2Move() {
new I() {
{
super.foo();
foo();
bar();
}
}
}
protected static void bar(){}
public static class I {
protected void foo(){}
}
}
@@ -0,0 +1,3 @@
package b;
public class B {
}
@@ -139,10 +139,10 @@ public abstract class AbstractLayoutCodeProcessorTest extends PsiTestCase {
protected void performReformatActionOnSelectedFile(PsiFile file) {
final AnAction action = getReformatCodeAction();
action.actionPerformed(createEventFor(action, ContainerUtil.newArrayList(file), getProject(), new AdditionalEventInfo().setPsiElement(file)));
action.actionPerformed(createEventFor(action, ContainerUtil.newArrayList(file.getVirtualFile()), getProject(), new AdditionalEventInfo().setPsiElement(file)));
}
protected void performReformatActionOnModule(Module module, List<PsiFile> files) {
protected void performReformatActionOnModule(Module module, List<VirtualFile> files) {
final AnAction action = getReformatCodeAction();
action.actionPerformed(createEventFor(action, files, getProject(), new AdditionalEventInfo().setModule(module)));
}
@@ -156,7 +156,7 @@ public abstract class AbstractLayoutCodeProcessorTest extends PsiTestCase {
final AnAction action = getReformatCodeAction();
Document document = PsiDocumentManager.getInstance(getProject()).getDocument(file);
Editor editor = EditorFactory.getInstance().createEditor(document);
action.actionPerformed(createEventFor(action, ContainerUtil.newArrayList(file), getProject(), new AdditionalEventInfo().setEditor(editor)));
action.actionPerformed(createEventFor(action, ContainerUtil.newArrayList(file.getVirtualFile()), getProject(), new AdditionalEventInfo().setEditor(editor)));
EditorFactory.getInstance().releaseEditor(editor);
}
@@ -199,13 +199,12 @@ public abstract class AbstractLayoutCodeProcessorTest extends PsiTestCase {
}, "", action.getTemplatePresentation(), ActionManager.getInstance(), 0);
}
protected AnActionEvent createEventFor(AnAction action, List<PsiFile> files, final Project project, @NotNull final AdditionalEventInfo eventInfo) {
final VirtualFile[] vFilesArray = getVirtualFileArrayFrom(files);
protected AnActionEvent createEventFor(AnAction action, final List<VirtualFile> files, final Project project, @NotNull final AdditionalEventInfo eventInfo) {
return new AnActionEvent(null, new DataContext() {
@Nullable
@Override
public Object getData(@NonNls String dataId) {
if (CommonDataKeys.VIRTUAL_FILE_ARRAY.is(dataId)) return vFilesArray;
if (CommonDataKeys.VIRTUAL_FILE_ARRAY.is(dataId)) return files.toArray(new VirtualFile[files.size()]);
if (CommonDataKeys.PROJECT.is(dataId)) return project;
if (CommonDataKeys.EDITOR.is(dataId)) return eventInfo.getEditor();
if (LangDataKeys.MODULE_CONTEXT.is(dataId)) return eventInfo.getModule();
@@ -105,7 +105,7 @@ public class ReformatCodeActionTest extends AbstractLayoutCodeProcessorTest {
List<PsiFile> files = createTestFiles(srcDir, classNames);
injectMockDialogFlags(new MockReformatFileSettings().setOptimizeImports(true));
performReformatActionOnModule(module, files.subList(0, 1));
performReformatActionOnModule(module, ContainerUtil.newArrayList(srcDir));
checkFormationAndImportsOptimizationFor(files);
}
@@ -100,6 +100,10 @@ public class PullUpMultifileTest extends MultiFileTestCase {
"Method <b><code>method2Move()</code></b> uses method <b><code>A.foo()</code></b>, which is not moved to the superclass");
}
public void testAccessibleViaInheritanceInsideAnonymousClass() throws Exception {
doTest("Method <b><code>method2Move()</code></b> uses method <b><code>A.bar()</code></b>, which is not accessible from the superclass");
}
public void testReuseSuperMethod() throws Exception {
doTest();
}
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -8,7 +8,7 @@ cli-parser-1.1.jar
commons-codec-1.8.jar
commons-httpclient-3.1-patched.jar
commons-logging-1.1.3.jar
commons-net-3.1.jar
commons-net-3.3.jar
httpcore-4.3.3.jar
httpclient-4.3.6.jar
fluent-hc-4.3.6.jar
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -41,6 +41,7 @@ import com.intellij.profile.codeInspection.InspectionProjectProfileManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.util.ArrayUtilRt;
import com.intellij.util.BitUtil;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.xml.util.XmlStringUtil;
@@ -90,12 +91,12 @@ public class HighlightInfo implements Segment {
private final ProblemGroup myProblemGroup;
private volatile byte myFlags; // bit packed flags below:
private static final int BIJECTIVE_FLAG = 0;
private static final int HAS_HINT_FLAG = 1;
private static final int FROM_INJECTION_FLAG = 2;
private static final int AFTER_END_OF_LINE_FLAG = 3;
private static final int FILE_LEVEL_ANNOTATION_FLAG = 4;
private static final int NEEDS_UPDATE_ON_TYPING_FLAG = 5;
private static final byte BIJECTIVE_MASK = 1;
private static final byte HAS_HINT_MASK = 2;
private static final byte FROM_INJECTION_MASK = 4;
private static final byte AFTER_END_OF_LINE_MASK = 8;
private static final byte FILE_LEVEL_ANNOTATION_MASK = 16;
private static final byte NEEDS_UPDATE_ON_TYPING_MASK = 32;
PsiElement psiElement;
@NotNull
@@ -104,7 +105,7 @@ public class HighlightInfo implements Segment {
}
void setFromInjection(boolean fromInjection) {
setFlag(FROM_INJECTION_FLAG, fromInjection);
setFlag(FROM_INJECTION_MASK, fromInjection);
}
public String getToolTip() {
@@ -132,31 +133,28 @@ public class HighlightInfo implements Segment {
return description;
}
@MagicConstant(intValues = {BIJECTIVE_FLAG, HAS_HINT_FLAG, FROM_INJECTION_FLAG, AFTER_END_OF_LINE_FLAG, FILE_LEVEL_ANNOTATION_FLAG, NEEDS_UPDATE_ON_TYPING_FLAG})
@interface FlagConstant {}
@MagicConstant(intValues = {BIJECTIVE_MASK, HAS_HINT_MASK, FROM_INJECTION_MASK, AFTER_END_OF_LINE_MASK, FILE_LEVEL_ANNOTATION_MASK,
NEEDS_UPDATE_ON_TYPING_MASK})
private @interface FlagConstant {}
private boolean isFlagSet(@FlagConstant int flag) {
assert flag < 8;
int state = myFlags >> flag;
return (state & 1) != 0;
private boolean isFlagSet(@FlagConstant byte mask) {
return BitUtil.isSet(myFlags, mask);
}
private void setFlag(@FlagConstant int flag, boolean value) {
assert flag < 8;
int state = value ? 1 : 0;
myFlags = (byte)(myFlags & ~(1 << flag) | state << flag);
private void setFlag(@FlagConstant byte mask, boolean value) {
myFlags = BitUtil.set(myFlags, mask, value);
}
boolean isFileLevelAnnotation() {
return isFlagSet(FILE_LEVEL_ANNOTATION_FLAG);
return isFlagSet(FILE_LEVEL_ANNOTATION_MASK);
}
boolean isBijective() {
return isFlagSet(BIJECTIVE_FLAG);
return isFlagSet(BIJECTIVE_MASK);
}
void setBijective(boolean bijective) {
setFlag(BIJECTIVE_FLAG, bijective);
setFlag(BIJECTIVE_MASK, bijective);
}
@NotNull
@@ -165,7 +163,7 @@ public class HighlightInfo implements Segment {
}
public boolean isAfterEndOfLine() {
return isFlagSet(AFTER_END_OF_LINE_FLAG);
return isFlagSet(AFTER_END_OF_LINE_MASK);
}
@Nullable
@@ -253,7 +251,7 @@ public class HighlightInfo implements Segment {
private static final HighlightInfoFilter[] FILTERS = HighlightInfoFilter.EXTENSION_POINT_NAME.getExtensions();
public boolean needUpdateOnTyping() {
return isFlagSet(NEEDS_UPDATE_ON_TYPING_FLAG);
return isFlagSet(NEEDS_UPDATE_ON_TYPING_MASK);
}
HighlightInfo(@Nullable TextAttributes forcedTextAttributes,
@@ -284,9 +282,9 @@ public class HighlightInfo implements Segment {
// optimisation: do not retain extra memory if can recompute
toolTip = encodeTooltip(escapedToolTip, escapedDescription);
this.severity = severity;
setFlag(AFTER_END_OF_LINE_FLAG, afterEndOfLine);
setFlag(NEEDS_UPDATE_ON_TYPING_FLAG, calcNeedUpdateOnTyping(needsUpdateOnTyping, type));
setFlag(FILE_LEVEL_ANNOTATION_FLAG, isFileLevelAnnotation);
setFlag(AFTER_END_OF_LINE_MASK, afterEndOfLine);
setFlag(NEEDS_UPDATE_ON_TYPING_MASK, calcNeedUpdateOnTyping(needsUpdateOnTyping, type));
setFlag(FILE_LEVEL_ANNOTATION_MASK, isFileLevelAnnotation);
this.navigationShift = navigationShift;
myProblemGroup = problemGroup;
this.gutterIconRenderer = gutterIconRenderer;
@@ -701,11 +699,11 @@ public class HighlightInfo implements Segment {
public boolean hasHint() {
return isFlagSet(HAS_HINT_FLAG);
return isFlagSet(HAS_HINT_MASK);
}
void setHint(final boolean hasHint) {
setFlag(HAS_HINT_FLAG, hasHint);
setFlag(HAS_HINT_MASK, hasHint);
}
public int getActualStartOffset() {
@@ -879,7 +877,7 @@ public class HighlightInfo implements Segment {
}
boolean isFromInjection() {
return isFlagSet(FROM_INJECTION_FLAG);
return isFlagSet(FROM_INJECTION_MASK);
}
@NotNull
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -27,6 +27,7 @@ package com.intellij.codeInspection.reference;
import com.intellij.codeInspection.InspectionsBundle;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.util.Key;
import com.intellij.util.BitUtil;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -41,7 +42,7 @@ public abstract class RefEntityImpl implements RefEntity {
protected List<RefEntity> myChildren;
private final String myName;
private Map<Key, Object> myUserMap;
protected int myFlags = 0;
protected int myFlags;
protected final RefManagerImpl myManager;
protected RefEntityImpl(String name, @NotNull RefManager manager) {
@@ -138,16 +139,11 @@ public abstract class RefEntityImpl implements RefEntity {
}
public boolean checkFlag(int mask) {
return (myFlags & mask) != 0;
return BitUtil.isSet(myFlags, mask);
}
public void setFlag(boolean b, int mask) {
if (b) {
myFlags |= mask;
}
else {
myFlags &= ~mask;
}
public void setFlag(final boolean value, final int mask) {
myFlags = BitUtil.set(myFlags, mask, value);
}
@Override
@@ -61,7 +61,7 @@ public abstract class FileIndexFacade {
public abstract boolean isValidAncestor(@NotNull VirtualFile baseDir, @NotNull VirtualFile child);
public boolean shouldBeFound(GlobalSearchScope scope, VirtualFile virtualFile) {
return (scope.isSearchOutsideRootModel() || isInContent(virtualFile) || isInLibrarySource(virtualFile)) && !virtualFile.getFileType().isBinary();
return scope.isSearchOutsideRootModel() || isInContent(virtualFile) || isInLibrarySource(virtualFile);
}
@NotNull public abstract ModificationTracker getRootModificationTracker();
@@ -176,18 +176,17 @@ public abstract class ASTDelegatePsiElement extends PsiElementBase {
}
@Nullable
protected PsiElement findChildByType(IElementType type) {
protected <T extends PsiElement> T findChildByType(IElementType type) {
ASTNode node = getNode().findChildByType(type);
return node == null ? null : node.getPsi();
return node == null ? null : (T)node.getPsi();
}
@Nullable
protected PsiElement findLastChildByType(IElementType type) {
protected <T extends PsiElement> T findLastChildByType(IElementType type) {
PsiElement child = getLastChild();
while (child != null) {
final ASTNode node = child.getNode();
if (node != null && node.getElementType() == type) return child;
if (node != null && node.getElementType() == type) return (T)child;
child = child.getPrevSibling();
}
return null;
@@ -196,14 +195,14 @@ public abstract class ASTDelegatePsiElement extends PsiElementBase {
@NotNull
protected PsiElement findNotNullChildByType(IElementType type) {
return notNullChild(findChildByType(type));
protected <T extends PsiElement> T findNotNullChildByType(IElementType type) {
return notNullChild(this.<T>findChildByType(type));
}
@Nullable
protected PsiElement findChildByType(TokenSet type) {
protected <T extends PsiElement> T findChildByType(TokenSet type) {
ASTNode node = getNode().findChildByType(type);
return node == null ? null : node.getPsi();
return node == null ? null : (T)node.getPsi();
}
@NotNull
@@ -263,10 +262,10 @@ public abstract class ASTDelegatePsiElement extends PsiElementBase {
}
protected <T extends PsiElement> T[] findChildrenByType(TokenSet elementType, Class<T> arrayClass) {
return (T[])ContainerUtil.map2Array(getNode().getChildren(elementType), arrayClass, new Function<ASTNode, PsiElement>() {
return ContainerUtil.map2Array(getNode().getChildren(elementType), arrayClass, new Function<ASTNode, T>() {
@Override
public PsiElement fun(final ASTNode s) {
return s.getPsi();
public T fun(final ASTNode s) {
return (T)s.getPsi();
}
});
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -51,7 +51,7 @@ abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBlackTree<
static class IntervalNode<E extends MutableInterval> extends RedBlackTree.Node<E> implements MutableInterval {
private volatile int myStart;
private volatile int myEnd;
private static final int ATTACHED_TO_TREE_FLAG = COLOR_FLAG+1; // true if the node is inserted to the tree
private static final byte ATTACHED_TO_TREE_FLAG = COLOR_MASK <<1; // true if the node is inserted to the tree
protected final List<Getter<E>> intervals;
int maxEnd; // max of all intervalEnd()s among all children.
protected int delta; // delta of startOffset. getStartOffset() = myStartOffset + Sum of deltas up to root
@@ -268,7 +268,7 @@ abstract class IntervalTreeImpl<T extends MutableInterval> extends RedBlackTree<
return myEnd = end;
}
static final int VALID_FLAG = ATTACHED_TO_TREE_FLAG + 1;
static final byte VALID_FLAG = ATTACHED_TO_TREE_FLAG << 1;
@Override
public boolean isValid() {
return isFlagSet(VALID_FLAG);
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -152,8 +152,8 @@ public class RangeMarkerTree<T extends RangeMarkerEx> extends IntervalTreeImpl<T
}
static class RMNode<T extends RangeMarkerEx> extends IntervalTreeImpl.IntervalNode<T> {
private static final int EXPAND_TO_LEFT_FLAG = VALID_FLAG+1;
private static final int EXPAND_TO_RIGHT_FLAG = EXPAND_TO_LEFT_FLAG+1;
private static final byte EXPAND_TO_LEFT_FLAG = VALID_FLAG<<1;
private static final byte EXPAND_TO_RIGHT_FLAG = EXPAND_TO_LEFT_FLAG<<1;
public RMNode(@NotNull RangeMarkerTree<T> rangeMarkerTree,
@NotNull T key,
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2010 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -15,6 +15,7 @@
*/
package com.intellij.openapi.editor.impl;
import com.intellij.util.BitUtil;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -299,17 +300,14 @@ public abstract class RedBlackTree<K> {
protected Node<K> parent = null;
private volatile byte myFlags;
protected static final int COLOR_FLAG = 0;
protected static final byte COLOR_MASK = 1;
protected boolean isFlagSet(int flag) {
int state = myFlags >> flag;
return (state & 1) != 0;
protected boolean isFlagSet(byte mask) {
return BitUtil.isSet(myFlags, mask);
}
protected void setFlag(int flag, boolean value) {
assert flag < 8;
int state = value ? 1 : 0;
myFlags = (byte)(myFlags & ~(1 << flag) | state << flag);
protected void setFlag(byte mask, boolean value) {
myFlags = BitUtil.set(myFlags, mask, value);
}
@@ -325,7 +323,7 @@ public abstract class RedBlackTree<K> {
return this == parent.getLeft() ? parent.getRight() : parent.getLeft();
}
public Node<K> uncle() {
private Node<K> uncle() {
assert getParent() != null; // Root node has no uncle
assert getParent().getParent() != null; // Children of root have no uncle
return getParent().sibling();
@@ -360,16 +358,16 @@ public abstract class RedBlackTree<K> {
public abstract boolean hasAliveKey(boolean purgeDead);
public boolean isBlack() {
return isFlagSet(COLOR_FLAG);
return isFlagSet(COLOR_MASK);
}
public void setBlack() {
setFlag(COLOR_FLAG, true);
private void setBlack() {
setFlag(COLOR_MASK, true);
}
public void setRed() {
setFlag(COLOR_FLAG, false);
setFlag(COLOR_MASK, false);
}
public void setColor(boolean isBlack) {
setFlag(COLOR_FLAG, isBlack);
setFlag(COLOR_MASK, isBlack);
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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,7 +16,6 @@
package com.intellij.psi.impl.smartPointers;
import com.intellij.lang.Language;
import com.intellij.lang.LanguageUtil;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.RangeMarker;
@@ -47,15 +46,11 @@ public class SelfElementInfo implements SmartPointerElementInfo {
private volatile RangeMarker myRangeMarker; //maintains hard reference during modification
protected final Language myLanguage;
protected SelfElementInfo(@NotNull Project project, @NotNull PsiElement anchor) {
this(project, ProperTextRange.create(anchor.getTextRange()), anchor.getClass(), anchor.getContainingFile(),
LanguageUtil.getRootLanguage(anchor));
}
public SelfElementInfo(@NotNull Project project,
@NotNull ProperTextRange range,
@NotNull Class anchorClass,
@NotNull PsiFile containingFile,
@NotNull Language language) {
SelfElementInfo(@NotNull Project project,
@NotNull ProperTextRange range,
@NotNull Class anchorClass,
@NotNull PsiFile containingFile,
@NotNull Language language) {
myLanguage = language;
myVirtualFile = PsiUtilCore.getVirtualFile(containingFile);
myType = anchorClass;
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -126,7 +126,9 @@ class SmartPsiElementPointerImpl<E extends PsiElement> implements SmartPointerEx
}
@NotNull
static <E extends PsiElement> SmartPointerElementInfo createElementInfo(@NotNull Project project, @NotNull E element, PsiFile containingFile) {
private static <E extends PsiElement> SmartPointerElementInfo createElementInfo(@NotNull Project project,
@NotNull E element,
PsiFile containingFile) {
if (element instanceof PsiDirectory) {
return new DirElementInfo((PsiDirectory)element);
}
@@ -185,7 +187,7 @@ class SmartPsiElementPointerImpl<E extends PsiElement> implements SmartPointerEx
return myElementInfo;
}
protected static boolean pointsToTheSameElementAs(@NotNull SmartPsiElementPointer pointer1, @NotNull SmartPsiElementPointer pointer2) {
static boolean pointsToTheSameElementAs(@NotNull SmartPsiElementPointer pointer1, @NotNull SmartPsiElementPointer pointer2) {
if (pointer1 == pointer2) return true;
if (pointer1 instanceof SmartPsiElementPointerImpl && pointer2 instanceof SmartPsiElementPointerImpl) {
SmartPsiElementPointerImpl impl1 = (SmartPsiElementPointerImpl)pointer1;
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -239,8 +239,8 @@ public class BlockSupportImpl extends BlockSupport {
}
@NotNull
private static DiffLog replaceElementWithEvents(final CompositeElement oldRoot,
final CompositeElement newRoot) {
private static DiffLog replaceElementWithEvents(@NotNull CompositeElement oldRoot,
@NotNull CompositeElement newRoot) {
DiffLog diffLog = new DiffLog();
diffLog.appendReplaceElementWithEvents(oldRoot, newRoot);
return diffLog;
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -70,11 +70,11 @@ public class DiffLog implements DiffTreeChangeBuilder<ASTNode,ASTNode> {
}
}
public void appendReplaceElementWithEvents(CompositeElement oldRoot, CompositeElement newRoot) {
void appendReplaceElementWithEvents(@NotNull CompositeElement oldRoot, @NotNull CompositeElement newRoot) {
myEntries.add(new ReplaceElementWithEvents(oldRoot, newRoot));
}
public void appendReplaceFileElement(FileElement oldNode, FileElement newNode) {
void appendReplaceFileElement(@NotNull FileElement oldNode, @NotNull FileElement newNode) {
myEntries.add(new ReplaceFileElement(oldNode, newNode));
}
@@ -92,7 +92,7 @@ public class DiffLog implements DiffTreeChangeBuilder<ASTNode,ASTNode> {
private final ASTNode myOldChild;
private final ASTNode myNewChild;
public ReplaceEntry(@NotNull ASTNode oldNode, @NotNull ASTNode newNode) {
private ReplaceEntry(@NotNull ASTNode oldNode, @NotNull ASTNode newNode) {
myOldChild = oldNode;
myNewChild = newNode;
ASTNode parent = oldNode.getTreeParent();
@@ -133,10 +133,10 @@ public class DiffLog implements DiffTreeChangeBuilder<ASTNode,ASTNode> {
}
private static class DeleteEntry extends LogEntry {
private final ASTNode myOldParent;
private final ASTNode myOldNode;
@NotNull private final ASTNode myOldParent;
@NotNull private final ASTNode myOldNode;
public DeleteEntry(ASTNode oldParent, ASTNode oldNode) {
private DeleteEntry(@NotNull ASTNode oldParent, @NotNull ASTNode oldNode) {
myOldParent = oldParent;
myOldNode = oldNode;
}
@@ -167,11 +167,11 @@ public class DiffLog implements DiffTreeChangeBuilder<ASTNode,ASTNode> {
}
private static class InsertEntry extends LogEntry {
private final ASTNode myOldParent;
private final ASTNode myNewNode;
@NotNull private final ASTNode myOldParent;
@NotNull private final ASTNode myNewNode;
private final int myPos;
public InsertEntry(@NotNull ASTNode oldParent, @NotNull ASTNode newNode, int pos) {
private InsertEntry(@NotNull ASTNode oldParent, @NotNull ASTNode newNode, int pos) {
assert oldParent instanceof CompositeElement : oldParent;
myOldParent = oldParent;
myNewNode = newNode;
@@ -226,10 +226,10 @@ public class DiffLog implements DiffTreeChangeBuilder<ASTNode,ASTNode> {
}
private static class ReplaceFileElement extends LogEntry {
private final FileElement myOldNode;
private final FileElement myNewNode;
@NotNull private final FileElement myOldNode;
@NotNull private final FileElement myNewNode;
public ReplaceFileElement(FileElement oldNode, FileElement newNode) {
private ReplaceFileElement(@NotNull FileElement oldNode, @NotNull FileElement newNode) {
myOldNode = oldNode;
myNewNode = newNode;
}
@@ -250,10 +250,10 @@ public class DiffLog implements DiffTreeChangeBuilder<ASTNode,ASTNode> {
}
private static class ReplaceElementWithEvents extends LogEntry {
private final CompositeElement myOldRoot;
private final CompositeElement myNewRoot;
@NotNull private final CompositeElement myOldRoot;
@NotNull private final CompositeElement myNewRoot;
public ReplaceElementWithEvents(CompositeElement oldRoot, CompositeElement newRoot) {
private ReplaceElementWithEvents(@NotNull CompositeElement oldRoot, @NotNull CompositeElement newRoot) {
myOldRoot = oldRoot;
myNewRoot = newRoot;
}
@@ -15,8 +15,12 @@
*/
package com.intellij.dvcs.branch;
import com.intellij.dvcs.repo.RepositoryManager;
import org.jetbrains.annotations.NotNull;
/**
* @see RepositoryManager#isSyncEnabled()
*/
public interface DvcsSyncSettings {
enum Value {
@@ -27,14 +27,15 @@ import com.intellij.openapi.vcs.VcsTaskHandler;
import com.intellij.util.Function;
import com.intellij.util.NullableFunction;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.FactoryMap;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.Map;
public abstract class DvcsTaskHandler<R extends Repository> extends VcsTaskHandler {
@@ -49,8 +50,8 @@ public abstract class DvcsTaskHandler<R extends Repository> extends VcsTaskHandl
}
@Override
public boolean isEnabled(@Nullable Project project) {
return project != null && !project.isDisposed() && !myRepositoryManager.getRepositories().isEmpty();
public boolean isEnabled() {
return !myRepositoryManager.getRepositories().isEmpty();
}
@Override
@@ -62,17 +63,17 @@ public abstract class DvcsTaskHandler<R extends Repository> extends VcsTaskHandl
return hasBranch(repository, taskName);
}
});
MultiMap<String, String> map = new MultiMap<String, String>();
List<R> map = new ArrayList<R>();
if (!problems.isEmpty()) {
if (ApplicationManager.getApplication().isUnitTestMode() ||
Messages.showDialog(myProject,
"<html>The following repositories already have specified " + myBranchType + "<b>" + taskName + "</b>:<br>" +
StringUtil.join(problems, "<br>") + ".<br>" +
"Do you want to checkout existing " + myBranchType + "?", myBranchType + " Already Exists",
"Do you want to checkout existing " + myBranchType + "?", StringUtil.capitalize(myBranchType) + " Already Exists",
new String[]{Messages.YES_BUTTON, Messages.NO_BUTTON}, 0,
Messages.getWarningIcon(), new DialogWrapper.PropertyDoNotAskOption("git.checkout.existing.branch")) == 0) {
checkout(taskName, problems, null);
fillMap(taskName, problems, map);
map.addAll(problems);
}
}
repositories.removeAll(problems);
@@ -80,89 +81,88 @@ public abstract class DvcsTaskHandler<R extends Repository> extends VcsTaskHandl
checkoutAsNewBranch(taskName, repositories);
}
fillMap(taskName, repositories, map);
return new TaskInfo(map);
}
private static <R extends Repository> void fillMap(String taskName, List<R> repositories, MultiMap<String, String> map) {
for (R repository : repositories) {
map.putValue(taskName, repository.getPresentableUrl());
}
map.addAll(repositories);
return new TaskInfo(taskName, ContainerUtil.map(map, new Function<R, String>() {
@Override
public String fun(R r) {
return r.getPresentableUrl();
}
}));
}
@Override
public void switchToTask(@NotNull TaskInfo taskInfo, @Nullable Runnable invokeAfter) {
for (final String branchName : taskInfo.branches.keySet()) {
List<R> repositories = getRepositories(taskInfo.branches.get(branchName));
List<R> notFound = ContainerUtil.filter(repositories, new Condition<R>() {
@Override
public boolean value(R repository) {
return !hasBranch(repository, branchName);
}
});
if (!notFound.isEmpty()) {
checkoutAsNewBranch(branchName, notFound);
}
repositories.removeAll(notFound);
if (!repositories.isEmpty()) {
checkout(branchName, repositories, invokeAfter);
final String branchName = taskInfo.getName();
List<R> repositories = getRepositories(taskInfo.getRepositories());
List<R> notFound = ContainerUtil.filter(repositories, new Condition<R>() {
@Override
public boolean value(R repository) {
return !hasBranch(repository, branchName);
}
});
if (!notFound.isEmpty()) {
checkoutAsNewBranch(branchName, notFound);
}
repositories.removeAll(notFound);
if (!repositories.isEmpty()) {
checkout(branchName, repositories, invokeAfter);
}
}
@Override
public void closeTask(@NotNull final TaskInfo taskInfo, @NotNull TaskInfo original) {
Set<String> branches = original.branches.keySet();
final AtomicInteger counter = new AtomicInteger(branches.size());
for (final String originalBranch : branches) {
checkout(originalBranch, getRepositories(original.branches.get(originalBranch)), new Runnable() {
@Override
public void run() {
if (counter.decrementAndGet() == 0) {
merge(taskInfo);
}
}
});
}
}
private void merge(@NotNull TaskInfo taskInfo) {
for (String featureBranch : taskInfo.branches.keySet()) {
mergeAndClose(featureBranch, getRepositories(taskInfo.branches.get(featureBranch)));
}
checkout(original.getName(), getRepositories(original.getRepositories()), new Runnable() {
@Override
public void run() {
mergeAndClose(taskInfo.getName(), getRepositories(taskInfo.getRepositories()));
}
});
}
@Override
@NotNull
public TaskInfo getActiveTask() {
List<R> repositories = myRepositoryManager.getRepositories();
MultiMap<String, String> branches = new MultiMap<String, String>();
for (R repository : repositories) {
String branchName = repository.getCurrentBranchName();
if (branchName != null) {
branches.putValue(branchName, repository.getPresentableUrl());
}
}
return new TaskInfo(branches);
public boolean isSyncEnabled() {
return myRepositoryManager.isSyncEnabled();
}
@Override
public TaskInfo[] getCurrentTasks() {
List<R> repositories = myRepositoryManager.getRepositories();
final List<String> names = ContainerUtil.map(repositories, new Function<R, String>() {
@SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
FactoryMap<String, TaskInfo> tasks = new FactoryMap<String, TaskInfo>() {
@Nullable
@Override
public String fun(R repository) {
return repository.getPresentableUrl();
protected TaskInfo create(String key) {
return new TaskInfo(key, new ArrayList<String>());
}
});
Collection<String> branches = getCommonBranchNames(repositories);
return ContainerUtil.map2Array(branches, TaskInfo.class, new Function<String, TaskInfo>() {
};
for (R repository : repositories) {
String branch = getActiveBranch(repository);
if (branch != null) {
tasks.get(branch).getRepositories().add(repository.getPresentableUrl());
}
}
if (tasks.size() == 0) return new TaskInfo[0];
if (isSyncEnabled()) {
return new TaskInfo[] { tasks.values().iterator().next() };
}
else {
return tasks.values().toArray(new TaskInfo[tasks.values().size()]);
}
}
@Override
public TaskInfo[] getAllExistingTasks() {
List<R> repositories = myRepositoryManager.getRepositories();
MultiMap<String, String> tasks = new MultiMap<String, String>();
for (R repository : repositories) {
for (String branch : getAllBranches(repository)) {
tasks.putValue(branch, repository.getPresentableUrl());
}
}
return ContainerUtil.map2Array(tasks.entrySet(), TaskInfo.class, new Function<Map.Entry<String, Collection<String>>, TaskInfo>() {
@Override
public TaskInfo fun(String branchName) {
MultiMap<String, String> map = new MultiMap<String, String>();
map.put(branchName, names);
return new TaskInfo(map);
public TaskInfo fun(Map.Entry<String, Collection<String>> entry) {
return new TaskInfo(entry.getKey(), entry.getValue());
}
});
}
@@ -189,8 +189,11 @@ public abstract class DvcsTaskHandler<R extends Repository> extends VcsTaskHandl
protected abstract void checkoutAsNewBranch(@NotNull String name, @NotNull List<R> repositories);
@Nullable
protected abstract String getActiveBranch(R repository);
@NotNull
protected abstract Collection<String> getCommonBranchNames(@NotNull List<R> repositories);
protected abstract Iterable<String> getAllBranches(@NotNull R repository);
protected abstract void mergeAndClose(@NotNull String branch, @NotNull List<R> repositories);
@@ -36,6 +36,7 @@ import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.UIUtil;
import com.intellij.vcs.log.VcsFullCommitDetails;
import com.intellij.xml.util.XmlStringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -548,46 +549,15 @@ public class PushController implements Disposable {
final PushSupport activePushSupport = selectedModel.getSupport();
final PushTarget commonTarget = getCommonTarget(selectedNodes);
if (commonTarget != null && activePushSupport.isSilentForcePushAllowed(commonTarget)) return true;
return Messages.showOkCancelDialog(myProject, DvcsBundle.message("push.force.confirmation.text",
commonTarget != null
? " to <b>" +
commonTarget.getPresentation() + "</b>"
: ""),
return Messages.showOkCancelDialog(myProject, XmlStringUtil.wrapInHtml(DvcsBundle.message("push.force.confirmation.text",
commonTarget != null
? " to <b>" +
commonTarget.getPresentation() + "</b>"
: "")),
"Force Push", "&Force Push",
CommonBundle.getCancelButtonText(),
Messages.getWarningIcon(),
commonTarget != null
? new DialogWrapper.DoNotAskOption() {
@Override
public boolean isToBeShown() {
return true;
}
@Override
public void setToBeShown(boolean toBeShown, int exitCode) {
if (!toBeShown && exitCode == OK) {
activePushSupport.saveSilentForcePushTarget(commonTarget);
}
}
@Override
public boolean canBeHidden() {
return true;
}
@Override
public boolean shouldSaveOptionsOnCancel() {
return false;
}
@NotNull
@Override
public String getDoNotShowMessage() {
return "Don't warn about this target";
}
}
: null) == OK;
commonTarget != null ? new MyDoNotAskOptionForPush(activePushSupport, commonTarget) : null) == OK;
}
@Nullable
@@ -689,4 +659,44 @@ public class PushController implements Disposable {
return myCheckBoxModel;
}
}
private static class MyDoNotAskOptionForPush implements DialogWrapper.DoNotAskOption {
@NotNull private final PushSupport myActivePushSupport;
@NotNull private final PushTarget myCommonTarget;
public MyDoNotAskOptionForPush(@NotNull PushSupport support,
@NotNull PushTarget target) {
myActivePushSupport = support;
myCommonTarget = target;
}
@Override
public boolean isToBeShown() {
return true;
}
@Override
public void setToBeShown(boolean toBeShown, int exitCode) {
if (!toBeShown && exitCode == OK) {
myActivePushSupport.saveSilentForcePushTarget(myCommonTarget);
}
}
@Override
public boolean canBeHidden() {
return true;
}
@Override
public boolean shouldSaveOptionsOnCancel() {
return false;
}
@NotNull
@Override
public String getDoNotShowMessage() {
return "Don't warn about this target";
}
}
}
@@ -18,6 +18,7 @@ package com.intellij.psi.impl.cache;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.UsageSearchContext;
@@ -38,6 +39,9 @@ public interface CacheManager {
@NotNull
PsiFile[] getFilesWithWord(@NotNull String word, short occurenceMask, @NotNull GlobalSearchScope scope, final boolean caseSensitively);
@NotNull
VirtualFile[] getVirtualFilesWithWord(@NotNull String word, short occurenceMask, @NotNull GlobalSearchScope scope, final boolean caseSensitively);
boolean processFilesWithWord(@NotNull Processor<PsiFile> processor,
@NotNull String word,
@MagicConstant(flagsFromClass = UsageSearchContext.class) short occurenceMask,
@@ -65,6 +65,18 @@ public class IndexCacheManagerImpl implements CacheManager{
return processor.getResults().isEmpty() ? PsiFile.EMPTY_ARRAY : processor.toArray(PsiFile.EMPTY_ARRAY);
}
@Override
@NotNull
public VirtualFile[] getVirtualFilesWithWord(@NotNull final String word, final short occurenceMask, @NotNull final GlobalSearchScope scope, final boolean caseSensitively) {
if (myProject.isDefault()) {
return VirtualFile.EMPTY_ARRAY;
}
final List<VirtualFile> vFiles = new ArrayList<VirtualFile>(5);
collectVirtualFilesWithWord(new CommonProcessors.CollectProcessor<VirtualFile>(vFiles), word, occurenceMask, scope, caseSensitively);
return vFiles.isEmpty() ? VirtualFile.EMPTY_ARRAY : vFiles.toArray(new VirtualFile[vFiles.size()]);
}
// IMPORTANT!!!
// Since implementation of virtualFileProcessor.process() may call indices directly or indirectly,
// we cannot call it inside FileBasedIndex.processValues() method except in collecting form
@@ -82,6 +82,12 @@ public class PsiSearchHelperImpl implements PsiSearchHelper {
scope = scope.union(additionalScope);
}
}
for (UseScopeOptimizer optimizer : UseScopeOptimizer.EP_NAME.getExtensions()) {
final GlobalSearchScope scopeToExclude = optimizer.getScopeToExclude(element);
if (scopeToExclude != null) {
scope = scope.intersectWith(GlobalSearchScope.notScope(scopeToExclude));
}
}
return scope;
}
@@ -0,0 +1,16 @@
package com.intellij.psi.search;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Konstantin.Ulitin
*/
public abstract class UseScopeOptimizer {
public static final ExtensionPointName<UseScopeOptimizer> EP_NAME = ExtensionPointName.create("com.intellij.useScopeOptimizer");
@Nullable
public abstract GlobalSearchScope getScopeToExclude(@NotNull PsiElement element);
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2015 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,6 +28,26 @@ import java.util.List;
*/
public interface LineMarkerProvider {
@Nullable
/**
* Get line markers for this PsiElement.
*
* NOTE for implementers:
* Please return line marker info for exact element you were asked for.
* For example, do not return class marker info if getLineMarkerInfo() was called for a method.
* Please return relevant line marker info for as small element as possible.
* For example, do not return method marker for PsiMethod. Instead, return it for the PsiIdentifier which is a name of this method.
*
* More technical details:
* Inspection (specifically, LineMarkersPass) for performance reasons queries all LineMarkerProviders in two passes:
* - first pass for all elements in visible area
* - second pass for all the rest elements
* If providers return nothing for either area, its line markers are cleared.
* So if, for example a method, is half-visible (e.g. its name is visible but a part of its body isn't) and
* some poorly written LineMarkerProvider returns info for the PsiMethod instead of PsiIdentifier then following happens:
* - the first pass removes line marker info because whole PsiMethod is not visible.
* - the second pass tries to add line marker info back because LineMarkerProvider is called for the PsiMethod at last.
* As a result, line marker icon blinks annoyingly.
*/
LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement element);
void collectSlowLineMarkers(@NotNull List<PsiElement> elements, @NotNull Collection<LineMarkerInfo> result);
@@ -43,6 +43,8 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -62,6 +64,7 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane
private TabbedPaneWrapper myTabbedPane;
private final PredefinedCodeStyle[] myPredefinedCodeStyles;
private JPopupMenu myCopyFromMenu;
private @Nullable TabChangeListener myListener;
protected TabbedLanguageCodeStylePanel(@Nullable Language language, CodeStyleSettings currentSettings, CodeStyleSettings settings) {
super(language, currentSettings, settings);
@@ -123,6 +126,17 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane
myPanel = new JPanel();
myPanel.setLayout(new BorderLayout());
myTabbedPane = new TabbedPaneWrapper(this);
myTabbedPane.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
if (myListener != null) {
String title = myTabbedPane.getSelectedTitle();
if (title != null) {
myListener.tabChanged(TabbedLanguageCodeStylePanel.this, title);
}
}
}
});
myTabs = new ArrayList<CodeStyleAbstractPanel>();
myPanel.add(myTabbedPane.getComponent());
initTabs(getSettings());
@@ -662,4 +676,16 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane
}
}
public interface TabChangeListener {
void tabChanged(@NotNull TabbedLanguageCodeStylePanel source, @NotNull String tabTitle);
}
public void setListener(@Nullable TabChangeListener listener) {
myListener = listener;
}
public void changeTab(@NotNull String tabTitle) {
myTabbedPane.setSelectedTitle(tabTitle);
}
}
@@ -18,6 +18,8 @@ package com.intellij.application.options.codeStyle;
import com.intellij.application.options.CodeStyleAbstractPanel;
import com.intellij.application.options.TabbedLanguageCodeStylePanel;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.lang.Language;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.options.ConfigurationException;
@@ -27,6 +29,7 @@ import com.intellij.psi.codeStyle.CodeStyleSchemes;
import com.intellij.ui.components.labels.SwingActionLink;
import com.intellij.util.Alarm;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -37,7 +40,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class CodeStyleMainPanel extends JPanel {
public class CodeStyleMainPanel extends JPanel implements TabbedLanguageCodeStylePanel.TabChangeListener {
private final CardLayout myLayout = new CardLayout();
private final JPanel mySettingsPanel = new JPanel(myLayout);
@@ -61,12 +64,16 @@ public class CodeStyleMainPanel extends JPanel {
@NonNls
private static final String WAIT_CARD = "CodeStyleSchemesConfigurable.$$$.Wait.placeholder.$$$";
private final PropertiesComponent myProperties;
private final static String SELECTED_TAB = "settings.code.style.selected.tab";
public CodeStyleMainPanel(CodeStyleSchemesModel model, CodeStyleSettingsPanelFactory factory) {
super(new BorderLayout());
myModel = model;
myFactory = factory;
mySchemesPanel = new CodeStyleSchemesPanel(model);
myProperties = PropertiesComponent.getInstance();
model.addListener(new CodeStyleSettingsListener(){
@Override
@@ -214,6 +221,15 @@ public class CodeStyleMainPanel extends JPanel {
NewCodeStyleSettingsPanel panel = myFactory.createPanel(scheme);
panel.reset();
panel.setModel(myModel);
CodeStyleAbstractPanel settingsPanel = panel.getSelectedPanel();
if (settingsPanel instanceof TabbedLanguageCodeStylePanel) {
TabbedLanguageCodeStylePanel tabbedPanel = (TabbedLanguageCodeStylePanel)settingsPanel;
tabbedPanel.setListener(this);
String currentTab = myProperties.getValue(getSelectedTabPropertyName(tabbedPanel));
if (currentTab != null) {
tabbedPanel.changeTab(currentTab);
}
}
mySettingsPanels.put(name, panel);
mySettingsPanel.add(scheme.getName(), panel);
}
@@ -244,4 +260,18 @@ public class CodeStyleMainPanel extends JPanel {
final NewCodeStyleSettingsPanel panel = ensurePanel(defaultScheme);
return panel.processListOptions();
}
@Override
public void tabChanged(@NotNull TabbedLanguageCodeStylePanel source, @NotNull String tabTitle) {
myProperties.setValue(getSelectedTabPropertyName(source), tabTitle);
for (NewCodeStyleSettingsPanel panel : getPanels()) {
panel.tabChanged(source, tabTitle);
}
}
@NotNull
private static String getSelectedTabPropertyName(@NotNull TabbedLanguageCodeStylePanel panel) {
Language language = panel.getDefaultLanguage();
return SELECTED_TAB + (language != null ? "." + language.getID() : "");
}
}
@@ -19,6 +19,7 @@ package com.intellij.application.options.codeStyle;
import com.intellij.application.options.CodeStyleAbstractConfigurable;
import com.intellij.application.options.CodeStyleAbstractPanel;
import com.intellij.application.options.OptionsContainingConfigurable;
import com.intellij.application.options.TabbedLanguageCodeStylePanel;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
@@ -33,7 +34,7 @@ import java.util.Set;
/**
* @author max
*/
public class NewCodeStyleSettingsPanel extends JPanel {
public class NewCodeStyleSettingsPanel extends JPanel implements TabbedLanguageCodeStylePanel.TabChangeListener {
private static final Logger LOG = Logger.getInstance("#com.intellij.application.options.codeStyle.NewCodeStyleSettingsPanel");
private final Configurable myTab;
@@ -106,4 +107,12 @@ public class NewCodeStyleSettingsPanel extends JPanel {
}
return null;
}
@Override
public void tabChanged(@NotNull TabbedLanguageCodeStylePanel source, @NotNull String tabTitle) {
CodeStyleAbstractPanel panel = getSelectedPanel();
if (panel instanceof TabbedLanguageCodeStylePanel && panel != source) {
((TabbedLanguageCodeStylePanel)panel).changeTab(tabTitle);
}
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -85,7 +85,6 @@ import org.jetbrains.annotations.Nullable;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -436,7 +435,7 @@ public class DaemonListeners implements Disposable {
if (activeVcs == null) return Result.NOT_SURE;
FilePath path = VcsUtil.getFilePath(virtualFile);
boolean vcsIsThinking = !myVcsDirtyScopeManager.whatFilesDirty(Arrays.asList(path)).isEmpty();
boolean vcsIsThinking = !myVcsDirtyScopeManager.whatFilesDirty(Collections.singletonList(path)).isEmpty();
if (vcsIsThinking) return Result.NOT_SURE; // do not modify file which is in the process of updating
FileStatus status = myFileStatusManager.getStatus(virtualFile);
@@ -573,7 +572,7 @@ public class DaemonListeners implements Disposable {
if (myTogglePopupHintsPanel != null) myTogglePopupHintsPanel.updateStatus();
}
private class MyAnActionListener implements AnActionListener {
private class MyAnActionListener extends AnActionListener.Adapter {
private final AnAction escapeAction = myActionManager.getAction(IdeActions.ACTION_EDITOR_ESCAPE);
@Override
@@ -581,10 +580,6 @@ public class DaemonListeners implements Disposable {
myEscPressed = action == escapeAction;
}
@Override
public void afterActionPerformed(final AnAction action, final DataContext dataContext, AnActionEvent event) {
}
@Override
public void beforeEditorTyping(char c, DataContext dataContext) {
Editor editor = CommonDataKeys.EDITOR.getData(dataContext);
@@ -32,8 +32,6 @@ import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiPlainText;
import com.intellij.psi.PsiPlainTextFile;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import org.jetbrains.annotations.NotNull;
@@ -67,9 +65,7 @@ public class CompletionAutoPopupHandler extends TypedHandlerDelegate {
return Result.STOP;
}
if ((Character.isLetter(charTyped) || charTyped == '_') &&
!(file instanceof PsiPlainTextFile) // todo [maxim, peter] why we start autopopup when editing text files ? it cancels find preview
) {
if (Character.isLetter(charTyped) || charTyped == '_') {
AutoPopupController.getInstance(project).scheduleAutoPopup(editor);
return Result.STOP;
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -175,7 +175,6 @@ public final class NavigationUtil {
return false;
}
private static boolean activatePsiElementIfOpen(@NotNull PsiElement elt, boolean searchForOpen, boolean requestFocus) {
if (!elt.isValid()) return false;
elt = elt.getNavigationElement();
@@ -33,6 +33,7 @@ import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.EmptyRunnable;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.*;
import com.intellij.ui.speedSearch.SpeedSearchSupply;
import com.intellij.util.Alarm;
import com.intellij.util.NullableFunction;
import com.intellij.util.ObjectUtils;
@@ -947,20 +948,7 @@ public class TemplateListPanel extends JPanel implements Disposable {
}
void selectNode(@NotNull String searchQuery) {
for (TemplateGroup group : myTemplateGroups) {
for (TemplateImpl template : group.getElements()) {
if (StringUtil.startsWithIgnoreCase(template.getKey(), searchQuery)) {
selectTemplate(group.getName(), template.getKey());
return;
}
}
}
for (TemplateGroup group : myTemplateGroups) {
if (StringUtil.startsWithIgnoreCase(group.getName(), searchQuery)) {
selectTemplate(group.getName(), null);
return;
}
}
ObjectUtils.assertNotNull(SpeedSearchSupply.getSupply(myTree, true)).findAndSelectElement(searchQuery);
}
private void selectTemplate(@Nullable final String groupName, @Nullable final String templateKey) {
@@ -21,7 +21,6 @@ import com.intellij.codeInsight.hint.HintManagerImpl;
import com.intellij.codeInsight.hint.HintUtil;
import com.intellij.find.findUsages.PsiElement2UsageTargetAdapter;
import com.intellij.find.impl.FindInProjectUtil;
import com.intellij.find.impl.livePreview.LivePreview;
import com.intellij.find.replaceInProject.ReplaceInProjectManager;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.AnAction;
@@ -38,7 +37,6 @@ import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.event.CaretAdapter;
import com.intellij.openapi.editor.event.CaretEvent;
import com.intellij.openapi.editor.event.CaretListener;
import com.intellij.openapi.editor.ex.DocumentEx;
import com.intellij.openapi.editor.ex.RangeHighlighterEx;
import com.intellij.openapi.editor.markup.HighlighterLayer;
import com.intellij.openapi.editor.markup.HighlighterTargetArea;
@@ -89,7 +87,9 @@ public class FindUtil {
public static void initStringToFindWithSelection(FindModel findModel, Editor editor) {
if (editor != null) {
String s = editor.getSelectionModel().getSelectedText();
FindModel.initStringToFindNoMultiline(findModel, s);
if (s != null && s.length() < 10000) {
FindModel.initStringToFindNoMultiline(findModel, s);
}
}
}
@@ -97,10 +97,8 @@ public class FindUtil {
SelectionModel selectionModel = editor != null ? editor.getSelectionModel() : null;
if (selectionModel != null) {
String selectedText = selectionModel.getSelectedText();
if (selectedText != null) {
if (selectedText.indexOf("\n") != -1) {
return true;
}
if (selectedText != null && selectedText.contains("\n")) {
return true;
}
}
return false;
@@ -209,7 +207,7 @@ public class FindUtil {
final FindManager findManager = FindManager.getInstance(project);
String s = editor.getSelectionModel().getSelectedText();
final FindModel model = (FindModel)findManager.getFindInFileModel().clone();
final FindModel model = findManager.getFindInFileModel().clone();
if (StringUtil.isEmpty(s)) {
model.setGlobal(true);
}
@@ -330,7 +328,7 @@ public class FindUtil {
if (model == null) {
model = findManager.getFindInFileModel();
}
model = (FindModel)model.clone();
model = model.clone();
model.setForward(!model.isForward());
if (!model.isGlobal() && !editor.getSelectionModel().hasSelection()) {
model.setGlobal(true);
@@ -372,7 +370,7 @@ public class FindUtil {
if (model == null) {
model = findManager.getFindInFileModel();
}
model = (FindModel)model.clone();
model = model.clone();
int offset;
if (Direction.DOWN.equals(editor.getUserData(KEY)) && model.isForward()) {
@@ -410,7 +408,7 @@ public class FindUtil {
public static void replace(final Project project, final Editor editor) {
final FindManager findManager = FindManager.getInstance(project);
final FindModel model = (FindModel)findManager.getFindInFileModel().clone();
final FindModel model = findManager.getFindInFileModel().clone();
final String s = editor.getSelectionModel().getSelectedText();
if (!StringUtil.isEmpty(s)) {
if (s.indexOf('\n') >= 0) {
@@ -778,7 +776,7 @@ public class FindUtil {
short position = HintManager.UNDER;
if (model.isGlobal()) {
final FindModel newModel = (FindModel)model.clone();
final FindModel newModel = model.clone();
FindManager findManager = FindManager.getInstance(project);
Document document = editor.getDocument();
FindResult result = findManager.findString(document.getCharsSequence(),
@@ -61,6 +61,7 @@ import com.intellij.ui.table.JBTable;
import com.intellij.usageView.UsageInfo;
import com.intellij.usages.*;
import com.intellij.usages.impl.UsagePreviewPanel;
import com.intellij.util.Alarm;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Consumer;
import com.intellij.util.Processor;
@@ -128,6 +129,7 @@ public class FindDialog extends DialogWrapper {
private JBTable myResultsPreviewTable;
private UsagePreviewPanel myUsagePreviewPanel;
private TabbedPane myContent;
private Alarm mySearchRescheduleOnCancellationsAlarm;
private volatile ProgressIndicatorBase myResultsPreviewSearchProgress;
public FindDialog(@NotNull Project project, @NotNull FindModel model, @NotNull Consumer<FindModel> myOkHandler){
@@ -176,6 +178,7 @@ public class FindDialog extends DialogWrapper {
@Override
protected void dispose() {
finishPreviousPreviewSearch();
if (mySearchRescheduleOnCancellationsAlarm != null) Disposer.dispose(mySearchRescheduleOnCancellationsAlarm);
if (myUsagePreviewPanel != null) Disposer.dispose(myUsagePreviewPanel);
for(Map.Entry<EditorTextField, DocumentAdapter> e: myComboBoxListeners.entrySet()) {
e.getKey().removeDocumentListener(e.getValue());
@@ -324,6 +327,7 @@ public class FindDialog extends DialogWrapper {
if (state == ModalityState.NON_MODAL) return; // skip initial changes
finishPreviousPreviewSearch();
mySearchRescheduleOnCancellationsAlarm.cancelAllRequests();
final DefaultTableModel model = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
@@ -337,7 +341,6 @@ public class FindDialog extends DialogWrapper {
applyTo(modelClone, false);
ValidationInfo result = getValidationInfo(modelClone);
if (result != null) return; // todo
final PsiDirectory psiDirectory = FindInProjectUtil.getPsiDirectory(modelClone, myProject);
@@ -345,6 +348,12 @@ public class FindDialog extends DialogWrapper {
myResultsPreviewSearchProgress = progressIndicatorWhenSearchStarted;
myResultsPreviewTable.setModel(model);
if (result != null) {
myResultsPreviewTable.getEmptyText().setText(UIBundle.message("message.nothingToShow"));
return;
}
myResultsPreviewTable.getColumnModel().getColumn(0).setCellRenderer(new UsageTableCellRenderer());
myResultsPreviewTable.getEmptyText().setText("Searching...");
@@ -375,7 +384,7 @@ public class FindDialog extends DialogWrapper {
return resultsCount.incrementAndGet() < ShowUsagesAction.USAGES_PAGE_SIZE;
}
}, processPresentation);
if (resultsCount.get() == 0) {
if (resultsCount.get() == 0 && !progressIndicatorWhenSearchStarted.isCanceled()) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
@@ -389,8 +398,14 @@ public class FindDialog extends DialogWrapper {
@Override
public void onCanceled(@NotNull ProgressIndicator indicator) {
if (progressIndicatorWhenSearchStarted == myResultsPreviewSearchProgress && resultsCount.get() == 0) {
myResultsPreviewTable.getEmptyText().setText("Cancelled");
if (isShowing() && progressIndicatorWhenSearchStarted == myResultsPreviewSearchProgress) {
mySearchRescheduleOnCancellationsAlarm.cancelAllRequests();
mySearchRescheduleOnCancellationsAlarm.addRequest(new Runnable() {
@Override
public void run() {
findSettingsChanged();
}
}, 100);
}
}
});
@@ -513,6 +528,7 @@ public class FindDialog extends DialogWrapper {
}
}
});
mySearchRescheduleOnCancellationsAlarm = new Alarm();
previewSplitter.setFirstComponent(new JBScrollPane(myResultsPreviewTable));
previewSplitter.setSecondComponent(myUsagePreviewPanel.createComponent());
myPreviewSplitter = previewSplitter;
@@ -82,7 +82,7 @@ class FindInProjectTask {
private final Condition<VirtualFile> myFileMask;
private final ProgressIndicator myProgress;
@Nullable private final Module myModule;
private final Set<PsiFile> myLargeFiles = ContainerUtil.newTroveSet();
private final Set<VirtualFile> myLargeFiles = ContainerUtil.newTroveSet();
private boolean myWarningShown;
FindInProjectTask(@NotNull final FindModel findModel,
@@ -122,9 +122,9 @@ class FindInProjectTask {
try {
myProgress.setIndeterminate(true);
myProgress.setText("Scanning indexed files...");
final Set<PsiFile> filesForFastWordSearch = ApplicationManager.getApplication().runReadAction(new Computable<Set<PsiFile>>() {
final Set<VirtualFile> filesForFastWordSearch = ApplicationManager.getApplication().runReadAction(new Computable<Set<VirtualFile>>() {
@Override
public Set<PsiFile> compute() {
public Set<VirtualFile> compute() {
return getFilesForFastWordSearch();
}
});
@@ -138,7 +138,7 @@ class FindInProjectTask {
myProgress.setIndeterminate(true);
myProgress.setText("Scanning non-indexed files...");
boolean skipIndexed = canRelyOnIndices();
final Collection<PsiFile> otherFiles = collectFilesInScope(filesForFastWordSearch, skipIndexed);
final Collection<VirtualFile> otherFiles = collectFilesInScope(filesForFastWordSearch, skipIndexed);
myProgress.setIndeterminate(false);
if (LOG.isDebugEnabled()) {
@@ -167,13 +167,13 @@ class FindInProjectTask {
}
}
private static void logStats(Collection<PsiFile> otherFiles, long start) {
private static void logStats(Collection<VirtualFile> otherFiles, long start) {
long time = System.currentTimeMillis() - start;
final Multiset<String> stats = HashMultiset.create();
for (PsiFile file : otherFiles) {
for (VirtualFile file : otherFiles) {
//noinspection StringToUpperCaseOrToLowerCaseWithoutLocale
stats.add(StringUtil.notNullize(file.getViewProvider().getVirtualFile().getExtension()).toLowerCase());
stats.add(StringUtil.notNullize(file.getExtension()).toLowerCase());
}
List<String> extensions = ContainerUtil.newArrayList(stats.elementSet());
@@ -194,17 +194,16 @@ class FindInProjectTask {
LOG.info(message);
}
private void searchInFiles(@NotNull Collection<PsiFile> psiFiles,
private void searchInFiles(@NotNull Collection<VirtualFile> virtualFiles,
@NotNull FindUsagesProcessPresentation processPresentation,
@NotNull final Processor<UsageInfo> consumer) {
int i = 0;
long totalFilesSize = 0;
int count = 0;
for (final PsiFile psiFile : psiFiles) {
final VirtualFile virtualFile = psiFile.getVirtualFile();
for (final VirtualFile virtualFile : virtualFiles) {
final int index = i++;
if (virtualFile == null) continue;
if (!virtualFile.isValid()) continue;
long fileLength = UsageViewManagerImpl.getFileLength(virtualFile);
if (fileLength == -1) continue; // Binary or invalid
@@ -213,17 +212,26 @@ class FindInProjectTask {
if (skipProjectFile && !Registry.is("find.search.in.project.files")) continue;
if (fileLength > SINGLE_FILE_SIZE_LIMIT) {
myLargeFiles.add(psiFile);
myLargeFiles.add(virtualFile);
continue;
}
myProgress.checkCanceled();
myProgress.setFraction((double)index / psiFiles.size());
myProgress.setFraction((double)index / virtualFiles.size());
String text = FindBundle.message("find.searching.for.string.in.file.progress",
myFindModel.getStringToFind(), virtualFile.getPresentableUrl());
myProgress.setText(text);
myProgress.setText2(FindBundle.message("find.searching.for.string.in.file.occurrences.progress", count));
PsiFile psiFile = findFile(virtualFile);
if (psiFile == null) continue;
if (!(psiFile instanceof PsiBinaryFile)) {
PsiFile sourceFile = (PsiFile)psiFile.getNavigationElement();
if (sourceFile != null) psiFile = sourceFile;
if (psiFile.getFileType().isBinary()) continue;
}
int countInFile = FindInProjectUtil.processUsagesInFile(psiFile, myFindModel, new Processor<UsageInfo>() {
@Override
public boolean process(UsageInfo info) {
@@ -258,7 +266,7 @@ class FindInProjectTask {
}
@NotNull
private Collection<PsiFile> collectFilesInScope(@NotNull final Set<PsiFile> alreadySearched, final boolean skipIndexed) {
private Collection<VirtualFile> collectFilesInScope(@NotNull final Set<VirtualFile> alreadySearched, final boolean skipIndexed) {
SearchScope customScope = myFindModel.getCustomScope();
final GlobalSearchScope globalCustomScope = toGlobal(customScope);
@@ -266,7 +274,7 @@ class FindInProjectTask {
final boolean hasTrigrams = hasTrigrams(myFindModel.getStringToFind());
class EnumContentIterator implements ContentIterator {
final Set<PsiFile> myFiles = new LinkedHashSet<PsiFile>();
final Set<VirtualFile> myFiles = new LinkedHashSet<VirtualFile>();
@Override
public boolean processFile(@NotNull final VirtualFile virtualFile) {
@@ -285,14 +293,7 @@ class FindInProjectTask {
return;
}
PsiFile psiFile = myPsiManager.findFile(virtualFile);
if (psiFile != null && !(psiFile instanceof PsiBinaryFile) && !alreadySearched.contains(psiFile)) {
PsiFile sourceFile = (PsiFile)psiFile.getNavigationElement();
if (sourceFile != null) psiFile = sourceFile;
if (!psiFile.getFileType().isBinary()) {
myFiles.add(psiFile);
}
}
if (!alreadySearched.contains(virtualFile)) myFiles.add(virtualFile);
}
private final FileBasedIndexImpl fileBasedIndex = (FileBasedIndexImpl)FileBasedIndex.getInstance();
@@ -309,7 +310,7 @@ class FindInProjectTask {
}
@NotNull
private Collection<PsiFile> getFiles() {
private Collection<VirtualFile> getFiles() {
return myFiles;
}
}
@@ -425,7 +426,7 @@ class FindInProjectTask {
@NotNull
private Set<PsiFile> getFilesForFastWordSearch() {
private Set<VirtualFile> getFilesForFastWordSearch() {
String stringToFind = myFindModel.getStringToFind();
if (stringToFind.isEmpty() || DumbService.getInstance(myProject).isDumb()) {
return Collections.emptySet();
@@ -443,7 +444,7 @@ class FindInProjectTask {
scope = ProjectScope.getContentScope(myProject);
}
final Set<PsiFile> resultFiles = new LinkedHashSet<PsiFile>();
final Set<VirtualFile> resultFiles = new LinkedHashSet<VirtualFile>();
if (TrigramIndex.ENABLED) {
final Set<Integer> keys = ContainerUtil.newTroveSet();
@@ -468,10 +469,7 @@ class FindInProjectTask {
for (VirtualFile hit : hits) {
if (myFileMask.value(hit)) {
PsiFile file = findFile(hit);
if (file != null) {
resultFiles.add(file);
}
resultFiles.add(hit);
}
}
@@ -484,7 +482,7 @@ class FindInProjectTask {
@Override
public boolean process(VirtualFile file) {
if (myFileMask.value(file)) {
ContainerUtil.addIfNotNull(resultFiles, findFile(file));
ContainerUtil.addIfNotNull(resultFiles, file);
}
return true;
}
@@ -492,9 +490,10 @@ class FindInProjectTask {
// in case our word splitting is incorrect
CacheManager cacheManager = CacheManager.SERVICE.getInstance(myProject);
PsiFile[] filesWithWord = cacheManager.getFilesWithWord(stringToFind, UsageSearchContext.ANY, scope, myFindModel.isCaseSensitive());
for (PsiFile file : filesWithWord) {
if (myFileMask.value(file.getVirtualFile())) {
VirtualFile[] filesWithWord = cacheManager.getVirtualFilesWithWord(stringToFind, UsageSearchContext.ANY, scope,
myFindModel.isCaseSensitive());
for (VirtualFile file : filesWithWord) {
if (myFileMask.value(file)) {
resultFiles.add(file);
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2012 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -23,6 +23,7 @@ import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.psi.formatter.FormattingDocumentModelImpl;
import com.intellij.util.BitUtil;
import com.intellij.util.text.CharArrayUtil;
import org.jetbrains.annotations.NotNull;
@@ -61,13 +62,14 @@ class WhiteSpace {
private boolean myForceSkipTabulationsUsage;
private boolean myIsBeforeCodeBlockEnd;
private static final byte FIRST = 1;
private static final byte SAFE = 0x2;
private static final byte KEEP_FIRST_COLUMN = 0x4;
private static final byte LINE_FEEDS_ARE_READ_ONLY = 0x8;
private static final byte READ_ONLY = 0x10;
private static final byte CONTAINS_LF_INITIALLY = 0x20;
private static final byte CONTAINS_SPACES_INITIALLY = 0x40;
private static final byte FIRST_MASK = 1;
private static final byte SAFE_MASK = 0x2;
private static final byte KEEP_FIRST_COLUMN_MASK = 0x4;
private static final byte LINE_FEEDS_ARE_READ_ONLY_MASK = 0x8;
private static final byte READ_ONLY_MASK = 0x10;
private static final byte CONTAINS_LF_INITIALLY_MASK = 0x20;
private static final byte CONTAINS_SPACES_INITIALLY_MASK = 0x40;
private static final int LF_COUNT_SHIFT = 7;
private static final int MAX_LF_COUNT = 1 << 24;
@@ -139,12 +141,10 @@ class WhiteSpace {
myInitialLastLinesSpaces = indent.whiteSpaces;
myInitialLastLinesTabs = indent.tabs;
if (getLineFeeds() > 0) myFlags |= CONTAINS_LF_INITIALLY;
else myFlags &= ~CONTAINS_LF_INITIALLY;
setFlag(CONTAINS_LF_INITIALLY_MASK, getLineFeeds() > 0);
final int totalSpaces = getTotalSpaces();
if (totalSpaces > 0) myFlags |= CONTAINS_SPACES_INITIALLY;
else myFlags &=~ CONTAINS_SPACES_INITIALLY;
setFlag(CONTAINS_SPACES_INITIALLY_MASK, totalSpaces > 0);
}
/**
@@ -295,7 +295,7 @@ class WhiteSpace {
performModification(new Runnable() {
@Override
public void run() {
if (!isKeepFirstColumn() || (myFlags & CONTAINS_SPACES_INITIALLY) != 0) {
if (!isKeepFirstColumn() || getFlag(CONTAINS_SPACES_INITIALLY_MASK)) {
mySpaces = spaces;
myIndentSpaces = indent;
}
@@ -508,20 +508,15 @@ class WhiteSpace {
}
public void setIsSafe(final boolean value) {
setFlag(SAFE, value);
setFlag(SAFE_MASK, value);
}
private void setFlag(final int mask, final boolean value) {
if (value) {
myFlags |= mask;
}
else {
myFlags &= ~mask;
}
myFlags = BitUtil.set(myFlags, mask, value);
}
private boolean getFlag(final int mask) {
return (myFlags & mask) != 0;
return BitUtil.isSet(myFlags, mask);
}
private boolean isFirst() {
@@ -537,7 +532,7 @@ class WhiteSpace {
*/
public boolean containsLineFeedsInitially() {
if (myInitial == null) return false;
return (myFlags & CONTAINS_LF_INITIALLY) != 0;
return getFlag(CONTAINS_LF_INITIALLY_MASK);
}
/**
@@ -588,7 +583,7 @@ class WhiteSpace {
}
public void setKeepFirstColumn(final boolean b) {
setFlag(KEEP_FIRST_COLUMN, b);
setFlag(KEEP_FIRST_COLUMN_MASK, b);
}
public void setLineFeedsAreReadOnly() {
@@ -600,35 +595,35 @@ class WhiteSpace {
}
public boolean isIsFirstWhiteSpace() {
return getFlag(FIRST);
return getFlag(FIRST_MASK);
}
public boolean isIsSafe() {
return getFlag(SAFE);
return getFlag(SAFE_MASK);
}
public boolean isKeepFirstColumn() {
return getFlag(KEEP_FIRST_COLUMN);
return getFlag(KEEP_FIRST_COLUMN_MASK);
}
public boolean isLineFeedsAreReadOnly() {
return getFlag(LINE_FEEDS_ARE_READ_ONLY);
return getFlag(LINE_FEEDS_ARE_READ_ONLY_MASK);
}
public void setLineFeedsAreReadOnly(final boolean lineFeedsAreReadOnly) {
setFlag(LINE_FEEDS_ARE_READ_ONLY, lineFeedsAreReadOnly);
setFlag(LINE_FEEDS_ARE_READ_ONLY_MASK, lineFeedsAreReadOnly);
}
public boolean isIsReadOnly() {
return getFlag(READ_ONLY);
return getFlag(READ_ONLY_MASK);
}
public void setIsReadOnly(final boolean isReadOnly) {
setFlag(READ_ONLY, isReadOnly);
setFlag(READ_ONLY_MASK, isReadOnly);
}
public void setIsFirstWhiteSpace(final boolean isFirstWhiteSpace) {
setFlag(FIRST, isFirstWhiteSpace);
setFlag(FIRST_MASK, isFirstWhiteSpace);
}
public StringBuilder generateWhiteSpace(final CommonCodeStyleSettings.IndentOptions indentOptions,
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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,11 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.ide.actions;
import com.intellij.codeInsight.navigation.NavigationUtil;
import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.structureView.StructureView;
import com.intellij.ide.structureView.StructureViewBuilder;
import com.intellij.ide.structureView.StructureViewTreeElement;
@@ -29,7 +29,6 @@ import com.intellij.lang.LanguageStructureViewBuilder;
import com.intellij.lang.PsiStructureViewFactory;
import com.intellij.navigation.AnonymousElementProvider;
import com.intellij.navigation.ChooseByNameRegistry;
import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.AccessToken;
@@ -53,34 +52,38 @@ import com.intellij.psi.util.PsiUtilCore;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.*;
import java.awt.event.InputEvent;
import java.util.ArrayList;
import java.util.List;
public class GotoClassAction extends GotoActionBase implements DumbAware {
@Override
public void actionPerformed(@NotNull final AnActionEvent e) {
final Project project = e.getData(CommonDataKeys.PROJECT);
assert project != null;
public void actionPerformed(@NotNull AnActionEvent e) {
Project project = e.getProject();
if (project == null) return;
if (!DumbService.getInstance(project).isDumb()) {
super.actionPerformed(e);
}
else {
DumbService.getInstance(project)
.showDumbModeNotification("Goto Class action is not available until indices are built, using Goto File instead");
ActionManager.getInstance()
.tryToExecute(ActionManager.getInstance().getAction(GotoFileAction.ID), ActionCommand.getInputEvent(GotoFileAction.ID),
e.getData(PlatformDataKeys.CONTEXT_COMPONENT), e.getPlace(), true);
DumbService.getInstance(project).showDumbModeNotification(IdeBundle.message("go.to.class.dumb.mode.message"));
AnAction action = ActionManager.getInstance().getAction(GotoFileAction.ID);
InputEvent event = ActionCommand.getInputEvent(GotoFileAction.ID);
Component component = e.getData(PlatformDataKeys.CONTEXT_COMPONENT);
ActionManager.getInstance().tryToExecute(action, event, component, e.getPlace(), true);
}
}
@Override
public void gotoActionPerformed(AnActionEvent e) {
final Project project = e.getData(CommonDataKeys.PROJECT);
assert project != null;
public void gotoActionPerformed(@NotNull AnActionEvent e) {
final Project project = e.getProject();
if (project == null) return;
FeatureUsageTracker.getInstance().triggerFeatureUsed("navigation.popup.class");
PsiDocumentManager.getInstance(project).commitAllDocuments();
FeatureUsageTracker.getInstance().triggerFeatureUsed("navigation.popup.class");
final GotoClassModel2 model = new GotoClassModel2(project);
showNavigationPopup(e, model, new GotoActionCallback<Language>() {
@Override
@@ -93,17 +96,20 @@ public class GotoClassAction extends GotoActionBase implements DumbAware {
AccessToken token = ReadAction.start();
try {
if (element instanceof PsiElement) {
final PsiElement psiElement = getElement(((PsiElement)element), popup);
final VirtualFile file = PsiUtilCore.getVirtualFile(psiElement);
if (popup.getLinePosition() != -1 && file != null) {
Navigatable n = new OpenFileDescriptor(project, file, popup.getLinePosition(), popup.getColumnPosition()).setUseCurrentWindow(
popup.isOpenInCurrentWindowRequested());
PsiElement psiElement = getElement(((PsiElement)element), popup);
psiElement = psiElement.getNavigationElement();
VirtualFile file = PsiUtilCore.getVirtualFile(psiElement);
if (file != null && popup.getLinePosition() != -1) {
OpenFileDescriptor descriptor = new OpenFileDescriptor(project, file, popup.getLinePosition(), popup.getColumnPosition());
Navigatable n = descriptor.setUseCurrentWindow(popup.isOpenInCurrentWindowRequested());
if (n.canNavigate()) {
n.navigate(true);
return;
}
}
if (psiElement != null && file != null && popup.getMemberPattern() != null) {
if (file != null && popup.getMemberPattern() != null) {
NavigationUtil.activateFileWithPsiElement(psiElement, !popup.isOpenInCurrentWindowRequested());
Navigatable member = findMember(popup.getMemberPattern(), psiElement, file);
if (member != null) {
@@ -121,10 +127,11 @@ public class GotoClassAction extends GotoActionBase implements DumbAware {
token.finish();
}
}
}, "Classes matching pattern", true);
}, IdeBundle.message("go.to.class.toolwindow.title"), true);
}
@Nullable private static Navigatable findMember(String pattern, PsiElement psiElement, VirtualFile file) {
@Nullable
private static Navigatable findMember(String pattern, PsiElement psiElement, VirtualFile file) {
final PsiStructureViewFactory factory = LanguageStructureViewBuilder.INSTANCE.forLanguage(psiElement.getLanguage());
final StructureViewBuilder builder = factory == null ? null : factory.getStructureViewBuilder(psiElement.getContainingFile());
final FileEditor[] editors = FileEditorManager.getInstance(psiElement.getProject()).getEditors(file);
@@ -144,8 +151,7 @@ public class GotoClassAction extends GotoActionBase implements DumbAware {
Object target = null;
for (TreeElement treeElement : element.getChildren()) {
if (treeElement instanceof StructureViewTreeElement) {
final ItemPresentation presentation = treeElement.getPresentation();
String presentableText = presentation == null ? null : presentation.getPresentableText();
String presentableText = treeElement.getPresentation().getPresentableText();
if (presentableText != null) {
final int degree = matcher.matchingDegree(presentableText);
if (degree > max) {
@@ -181,6 +187,7 @@ public class GotoClassAction extends GotoActionBase implements DumbAware {
return null;
}
@NotNull
private static PsiElement getElement(@NotNull PsiElement element, ChooseByNamePopup popup) {
final String path = popup.getPathToAnonymous();
if (path != null) {
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2015 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,11 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.ide.actions;
import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.ide.util.gotoByName.*;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.util.gotoByName.ChooseByNameFilter;
import com.intellij.ide.util.gotoByName.ChooseByNamePopup;
import com.intellij.ide.util.gotoByName.GotoFileConfiguration;
import com.intellij.ide.util.gotoByName.GotoFileModel;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.application.ApplicationManager;
@@ -30,7 +33,6 @@ import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.Navigatable;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -52,8 +54,11 @@ public class GotoFileAction extends GotoActionBase implements DumbAware {
@Override
public void gotoActionPerformed(AnActionEvent e) {
FeatureUsageTracker.getInstance().triggerFeatureUsed("navigation.popup.file");
final Project project = e.getData(CommonDataKeys.PROJECT);
if (project == null) return;
FeatureUsageTracker.getInstance().triggerFeatureUsed("navigation.popup.file");
final GotoFileModel gotoFileModel = new GotoFileModel(project);
GotoActionCallback<FileType> callback = new GotoActionCallback<FileType>() {
@Override
@@ -71,9 +76,10 @@ public class GotoFileAction extends GotoActionBase implements DumbAware {
//this is for better cursor position
if (element instanceof PsiFile) {
VirtualFile vfile = ((PsiFile)element).getVirtualFile();
if (vfile == null) return;
n = new OpenFileDescriptor(project, vfile, popup.getLinePosition(), popup.getColumnPosition()).setUseCurrentWindow(popup.isOpenInCurrentWindowRequested());
VirtualFile file = ((PsiFile)element).getVirtualFile();
if (file == null) return;
OpenFileDescriptor descriptor = new OpenFileDescriptor(project, file, popup.getLinePosition(), popup.getColumnPosition());
n = descriptor.setUseCurrentWindow(popup.isOpenInCurrentWindowRequested());
}
if (!n.canNavigate()) return;
@@ -82,8 +88,8 @@ public class GotoFileAction extends GotoActionBase implements DumbAware {
}, ModalityState.NON_MODAL);
}
};
PsiElement context = getPsiContext(e);
showNavigationPopup(e, gotoFileModel, callback, "Files matching pattern", true, true, new GotoFileItemProvider(project, context));
GotoFileItemProvider provider = new GotoFileItemProvider(project, getPsiContext(e));
showNavigationPopup(e, gotoFileModel, callback, IdeBundle.message("go.to.file.toolwindow.title"), true, true, provider);
}
protected static class GotoFileFilter extends ChooseByNameFilter<FileType> {
@@ -148,5 +154,4 @@ public class GotoFileAction extends GotoActionBase implements DumbAware {
return o1.getName().compareToIgnoreCase(o2.getName());
}
}
}
@@ -36,7 +36,9 @@ import com.intellij.openapi.fileTypes.*;
import com.intellij.openapi.fileTypes.ex.FileTypeIdentifiableByVirtualFile;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Iconable;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.ThrowableComputable;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
@@ -305,8 +307,13 @@ public abstract class ScratchFileServiceImpl extends ScratchFileService {
}
private static boolean isFileInRootImpl(@NotNull VirtualFile file, RootId scratches) {
// files are created under scratches.getId() directory, quickly check parent name to avoid calling getPath()
VirtualFile parent = file.getParent();
if (parent == null) return false;
if (!Comparing.equal(parent.getNameSequence(), scratches.getId(), SystemInfo.isFileSystemCaseSensitive)) return false;
String rootPath = ScratchFileService.getInstance().getRootPath(scratches);
return file.getPath().startsWith(rootPath);
return FileUtil.startsWith(file.getPath(), rootPath);
}
private static class MyFileType extends LanguageFileType implements FileTypeIdentifiableByVirtualFile, InternalFileType {
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -30,18 +30,58 @@ import java.util.List;
import java.util.Map;
/**
* Allows plugins to handle the Move refactoring for a file in a custom way.
*
* @author Maxim.Mossienko
* Date: Sep 18, 2008
* Time: 3:40:48 PM
*/
public abstract class MoveFileHandler {
private static final ExtensionPointName<MoveFileHandler> EP_NAME = ExtensionPointName.create("com.intellij.moveFileHandler");
/**
* Checks whether a file can be handled by this move handler.
*
* @param element the file being moved.
* @return true if this handler can handle this file, false otherwise.
*/
public abstract boolean canProcessElement(PsiFile element);
/**
* Performs any necessary modifications of the file contents before the move.
*
* @param file the file being moved.
* @param moveDestination the directory to which the file is being moved.
* @param oldToNewMap the map of elements which can be referenced from other files directly (not through a file reference)
* to their counterparts after the move. The handler needs to add elements to this map according to the
* file modifications that it has performed.
*/
public abstract void prepareMovedFile(PsiFile file, PsiDirectory moveDestination, Map<PsiElement, PsiElement> oldToNewMap);
/**
* Finds the list of references to the file being moved that will need to be updated during the move refactoring.
*
* @param psiFile the file being moved.
* @param newParent the directory to which the file is being moved.
* @param searchInComments if true, search for references in comments has been requested.
* @param searchInNonJavaFiles if true, search for references in non-code files (such as .xml) has been requested.
* @return the list of usages that need to be updated, or null if nothing needs to be updated.
*/
@Nullable
public abstract List<UsageInfo> findUsages(PsiFile psiFile, PsiDirectory newParent, boolean searchInComments, boolean searchInNonJavaFiles);
/**
* After a file has been moved, updates the references to the file so that they point to the new location of the file.
*
* @param usageInfos the list of references, as returned from {@link #findUsages}
* @param oldToNewMap the map of all moved elements, filled by {@link #prepareMovedFile}
*/
public abstract void retargetUsages(List<UsageInfo> usageInfos, Map<PsiElement, PsiElement> oldToNewMap) ;
/**
* Updates the contents of the file after it has been moved (e.g. updates the package statement to correspond to the
* new location of a Java class).
*
* @param file the moved file.
*/
public abstract void updateMovedFile(PsiFile file) throws IncorrectOperationException;
@NotNull
@@ -43,5 +43,6 @@ public class CompletionContributorForTextField extends CompletionContributor imp
}
field.addCompletionVariants(text, offset, prefix, activeResult);
activeResult.stopHere();
}
}
@@ -81,7 +81,7 @@ public abstract class ActionPlaces {
public static final String ANT_MESSAGES_TOOLBAR = "AntMessagesToolbar";
public static final String ANT_EXPLORER_POPUP = "AntExplorerPopup";
public static final String ANT_EXPLORER_TOOLBAR = "AntExplorerToolbar";
public static final String GULP_VIEW_POPUP = "JavaScriptGulpPopup";
public static final String JS_BUILD_TOOL_POPUP = "JavaScriptBuildTool";
//todo: probably these context should be splitted into several contexts
public static final String CODE_INSPECTION = "CodeInspection";
@@ -143,7 +143,7 @@ public abstract class ActionPlaces {
FILEVIEW_POPUP, CHECKOUT_POPUP, LVCS_DIRECTORY_HISTORY_POPUP, GUI_DESIGNER_EDITOR_POPUP, GUI_DESIGNER_COMPONENT_TREE_POPUP,
GUI_DESIGNER_PROPERTY_INSPECTOR_POPUP,
CREATE_EJB_POPUP, CHANGES_VIEW_POPUP, REMOTE_HOST_VIEW_POPUP, REMOTE_HOST_DIALOG_POPUP, TFS_TREE_POPUP,
ACTION_PLACE_VCS_QUICK_LIST_POPUP_ACTION, PHING_EXPLORER_POPUP, NAVIGATION_BAR_POPUP, GULP_VIEW_POPUP
ACTION_PLACE_VCS_QUICK_LIST_POPUP_ACTION, PHING_EXPLORER_POPUP, NAVIGATION_BAR_POPUP, JS_BUILD_TOOL_POPUP
};
public static boolean isPopupPlace(@NotNull String place) {
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -36,21 +36,17 @@ import java.util.List;
public class OpenFileDescriptor implements Navigatable {
/**
* Tells descriptor to navigate in specific editor rather than file editor
* in main IDEA window.
* For example if you want to navigate in editor embedded into modal dialog,
* you should provide this data.
* Tells descriptor to navigate in specific editor rather than file editor in main IDEA window.
* For example if you want to navigate in editor embedded into modal dialog, you should provide this data.
*/
public static final DataKey<Editor> NAVIGATE_IN_EDITOR = DataKey.create("NAVIGATE_IN_EDITOR");
@NotNull
private final Project myProject;
private final VirtualFile myFile;
private final int myOffset;
private final int myLogicalLine;
private final int myLogicalColumn;
private final int myOffset;
private final RangeMarker myRangeMarker;
@NotNull
private final Project myProject;
private boolean myUseCurrentWindow = false;
@@ -62,8 +58,7 @@ public class OpenFileDescriptor implements Navigatable {
this(project, file, logicalLine, logicalColumn, -1, false);
}
public OpenFileDescriptor(@NotNull Project project, @NotNull VirtualFile file,
int logicalLine, int logicalColumn, boolean persistent) {
public OpenFileDescriptor(@NotNull Project project, @NotNull VirtualFile file, int logicalLine, int logicalColumn, boolean persistent) {
this(project, file, logicalLine, logicalColumn, -1, persistent);
}
@@ -71,10 +66,8 @@ public class OpenFileDescriptor implements Navigatable {
this(project, file, -1, -1, -1, false);
}
private OpenFileDescriptor(@NotNull Project project, @NotNull VirtualFile file,
int logicalLine, int logicalColumn, int offset, boolean persistent) {
private OpenFileDescriptor(@NotNull Project project, @NotNull VirtualFile file, int logicalLine, int logicalColumn, int offset, boolean persistent) {
myProject = project;
myFile = file;
myLogicalLine = logicalLine;
myLogicalColumn = logicalColumn;
@@ -139,7 +132,7 @@ public class OpenFileDescriptor implements Navigatable {
}
private boolean navigateInRequestedEditor() {
DataContext ctx = DataManager.getInstance().getDataContext();
@SuppressWarnings("deprecation") DataContext ctx = DataManager.getInstance().getDataContext();
Editor e = NAVIGATE_IN_EDITOR.getData(ctx);
if (e == null) return false;
if (!Comparing.equal(FileDocumentManager.getInstance().getFile(e.getDocument()), myFile)) return false;
@@ -72,8 +72,9 @@ public class CollectionListModel<T> extends AbstractListModel implements Editabl
public void remove(@NotNull final T element) {
int i = myItems.indexOf(element);
myItems.remove(element);
fireIntervalRemoved(this, i, i);
if (myItems.remove(element)) {
fireIntervalRemoved(this, i, i);
}
}
public void setElementAt(@NotNull final T element, final int index) {
@@ -25,6 +25,7 @@ import com.intellij.util.IconUtil;
import com.intellij.util.containers.ContainerUtilRt;
import com.intellij.util.ui.MacUIUtil;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -38,6 +39,7 @@ import java.util.*;
*/
public class CommonActionsPanel extends JPanel {
private final boolean myDecorateButtons;
private final ActionToolbarPosition myPosition;
public enum Buttons {
ADD, REMOVE, EDIT, UP, DOWN;
@@ -102,6 +104,7 @@ public class CommonActionsPanel extends JPanel {
String addName, String removeName, String moveUpName, String moveDownName, String editName,
Icon addIcon, Buttons... buttons) {
super(new BorderLayout());
myPosition = position;
final Listener listener = factory.createListener(this);
AnActionButton[] actions = new AnActionButton[buttons.length + (additionalActions == null ? 0 : additionalActions.length)];
for (int i = 0; i < buttons.length; i++) {
@@ -224,6 +227,11 @@ public class CommonActionsPanel extends JPanel {
}
}
@NotNull
public ActionToolbarPosition getPosition() {
return myPosition;
}
static class MyActionButton extends AnActionButton implements DumbAware {
private final Buttons myButton;
private final Listener myListener;
@@ -80,4 +80,10 @@ public abstract class SpeedSearchSupply {
public abstract void addChangeListener(@NotNull PropertyChangeListener listener);
public abstract void removeChangeListener(@NotNull PropertyChangeListener listener);
/**
* Find an element matching the searching query in the underlying component and select it there. Speed-search popup is not affected.
* @param searchQuery text that the selected element should match
*/
public abstract void findAndSelectElement(@NotNull String searchQuery);
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -21,6 +21,7 @@ import com.intellij.ide.IdeBundle;
import com.intellij.ide.plugins.HelpSetPath;
import com.intellij.ide.plugins.IdeaPluginDescriptor;
import com.intellij.ide.plugins.PluginManager;
import com.intellij.internal.statistic.UsageTrigger;
import com.intellij.openapi.application.ApplicationInfo;
import com.intellij.openapi.application.ex.ApplicationInfoEx;
import com.intellij.openapi.diagnostic.Logger;
@@ -49,6 +50,8 @@ public class HelpManagerImpl extends HelpManager {
private Object myFXHelpBrowser = null;
public void invokeHelp(@Nullable String id) {
UsageTrigger.trigger("ide.help." + id);
if (myHelpSet == null) {
myHelpSet = createHelpSet();
}
@@ -974,7 +974,7 @@ public class IdeEventQueue extends EventQueue {
!SystemInfo.isWindows ||
!Registry.is("actionSystem.win.suppressAlt") ||
!(UISettings.getInstance().HIDE_TOOL_STRIPES || UISettings.getInstance().PRESENTATION_MODE)) {
return true;
return false;
}
if (ke.getID() == KeyEvent.KEY_PRESSED) {
@@ -0,0 +1,32 @@
/*
* Copyright 2000-2015 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.notification.impl;
import com.intellij.ide.ui.search.SearchableOptionContributor;
import com.intellij.ide.ui.search.SearchableOptionProcessor;
import org.jetbrains.annotations.NotNull;
/**
* @author peter
*/
public class NotificationSearchableOptionContributor extends SearchableOptionContributor {
@Override
public void processOptions(@NotNull SearchableOptionProcessor processor) {
for (NotificationSettings settings : NotificationsConfigurationImpl.getInstanceImpl().getAllSettings()) {
processor.addOptions(settings.getGroupId(), null, settings.getGroupId() + " notifications", NotificationsConfigurable.ID, NotificationsConfigurable.DISPLAY_NAME, true);
}
}
}
@@ -30,6 +30,7 @@ import javax.swing.*;
*/
public class NotificationsConfigurable implements Configurable, SearchableConfigurable, Configurable.NoScroll {
public static final String DISPLAY_NAME = "Notifications";
static final String ID = "reference.settings.ide.settings.notifications";
private NotificationsConfigurablePanel myComponent;
@Override
@@ -41,7 +42,7 @@ public class NotificationsConfigurable implements Configurable, SearchableConfig
@Override
@NotNull
public String getHelpTopic() {
return "reference.settings.ide.settings.notifications";
return ID;
}
@Override
@@ -82,6 +83,11 @@ public class NotificationsConfigurable implements Configurable, SearchableConfig
@Override
public Runnable enableSearch(final String option) {
return null;
return new Runnable() {
@Override
public void run() {
myComponent.selectGroup(option);
}
};
}
}
@@ -23,6 +23,8 @@ import com.intellij.openapi.ui.ComboBoxTableRenderer;
import com.intellij.openapi.ui.StripeTable;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.ui.*;
import com.intellij.ui.speedSearch.SpeedSearchSupply;
import com.intellij.util.ObjectUtils;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
@@ -427,4 +429,8 @@ public class NotificationsConfigurablePanel extends JPanel implements Disposable
return result;
}
}
public void selectGroup(String searchQuery) {
ObjectUtils.assertNotNull(SpeedSearchSupply.getSupply(myTable, true)).findAndSelectElement(searchQuery);
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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,6 +16,7 @@
package com.intellij.openapi.editor;
import com.intellij.openapi.editor.markup.EffectType;
import com.intellij.openapi.editor.markup.TextAttributes;
import org.intellij.lang.annotations.JdkConstants;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -43,6 +44,13 @@ public class LineExtensionInfo {
myEffectColor = effectColor;
myFontType = fontType;
}
public LineExtensionInfo(@NotNull String text, @NotNull TextAttributes attr) {
myText = text;
myColor = attr.getForegroundColor();
myEffectType = attr.getEffectType();
myEffectColor = attr.getEffectColor();
myFontType = attr.getFontType();
}
@NotNull
public String getText() {
@@ -1323,7 +1323,7 @@ public class PersistentFSImpl extends PersistentFS implements ApplicationCompone
@NotNull
@Override
public CharSequence getNameSequence() {
return myParentLocalFile.getName();
return myParentLocalFile.getNameSequence();
}
@Override
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2013 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -17,12 +17,12 @@ package com.intellij.openapi.wm.impl;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.actionSystem.ToggleAction;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.util.BitUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -121,7 +121,7 @@ public class ProjectWindowAction extends ToggleAction implements DumbAware {
}
final JFrame projectFrame = WindowManager.getInstance().getFrame(project);
final int frameState = projectFrame.getExtendedState();
if ((frameState & Frame.ICONIFIED) == Frame.ICONIFIED) {
if (BitUtil.isSet(frameState, Frame.ICONIFIED)) {
// restore the frame if it is minimized
projectFrame.setExtendedState(frameState ^ Frame.ICONIFIED);
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 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.
@@ -36,6 +36,7 @@ import com.intellij.ui.PopupHandler;
import com.intellij.ui.UIBundle;
import com.intellij.ui.components.panels.Wrapper;
import com.intellij.ui.tabs.TabsUtil;
import com.intellij.util.BitUtil;
import com.intellij.util.Producer;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.EmptyIcon;
@@ -520,7 +521,7 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable, UIS
public void actionPerformed(final ActionEvent e) {
AnAction action =
myAlternativeAction != null && (e.getModifiers() & InputEvent.ALT_MASK) == InputEvent.ALT_MASK ? myAlternativeAction : myAction;
myAlternativeAction != null && BitUtil.isSet(e.getModifiers(), InputEvent.ALT_MASK) ? myAlternativeAction : myAction;
final DataContext dataContext = DataManager.getInstance().getDataContext(this);
final ActionManagerEx actionManager = ActionManagerEx.getInstanceEx();
InputEvent inputEvent = e.getSource() instanceof InputEvent ? (InputEvent) e.getSource() : null;
@@ -338,6 +338,11 @@ public abstract class SpeedSearchBase<Comp extends JComponent> extends SpeedSear
if ( mySearchPopup != null ) mySearchPopup.refreshSelection();
}
@Override
public void findAndSelectElement(@NotNull String searchQuery) {
selectElement(findElement(searchQuery), searchQuery);
}
private class SearchPopup extends JPanel {
private final SearchField mySearchField;
@@ -425,7 +430,7 @@ public abstract class SpeedSearchBase<Comp extends JComponent> extends SpeedSear
}
public void refreshSelection () {
updateSelection(findElement(mySearchField.getText()));
findAndSelectElement(mySearchField.getText());
}
private void updateSelection(Object element) {
@@ -19,6 +19,10 @@ import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.ui.popup.JBPopup;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.ui.popup.JBPopupListener;
import com.intellij.openapi.ui.popup.LightweightWindowEvent;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Ref;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.util.Consumer;
import com.intellij.util.ui.SwingHelper;
@@ -28,10 +32,8 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.*;
import java.util.Collections;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Hashtable;
@@ -65,7 +67,6 @@ public class SliderSelectorAction extends DumbAwareAction {
label.setBorder(BorderFactory.createEmptyBorder(4, 4, 0, 0));
JPanel wrapper = new JPanel(new BorderLayout());
wrapper.add(label, BorderLayout.NORTH);
result.add(wrapper, BorderLayout.WEST);
final JSlider slider = new JSlider(SwingConstants.HORIZONTAL, myConfiguration.getMin(), myConfiguration.getMax(), myConfiguration.getSelected());
slider.setMinorTickSpacing(1);
@@ -75,35 +76,52 @@ public class SliderSelectorAction extends DumbAwareAction {
UIUtil.setSliderIsFilled(slider, true);
slider.setPaintLabels(true);
slider.setLabelTable(myConfiguration.getDictionary());
result.add(slider, BorderLayout.CENTER);
final Runnable[] closeMe = new Runnable[1];
if (myConfiguration.isShowOk()) {
final JButton done = new JButton("Done");
result.add(SwingHelper.wrapWithoutStretch(done), BorderLayout.SOUTH);
done.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (closeMe[0] != null) closeMe[0].run();
}
});
if (! myConfiguration.isShowOk()) {
result.add(wrapper, BorderLayout.WEST);
result.add(slider, BorderLayout.CENTER);
} else {
result.add(wrapper, BorderLayout.WEST);
result.add(slider, BorderLayout.CENTER);
}
final JBPopup popup = JBPopupFactory.getInstance().createComponentPopupBuilder(result, slider).setMovable(true).createPopup();
final Runnable finalRunnable = new Runnable() {
final Runnable saveSelection = new Runnable() {
@Override
public void run() {
int value = slider.getModel().getValue();
myConfiguration.getResultConsumer().consume(value);
}
};
closeMe[0] = new Runnable() {
@Override
public void run() {
finalRunnable.run();
popup.closeOk(null);
}
};
popup.setFinalRunnable(finalRunnable);
final Ref<JBPopup> popupRef = new Ref<JBPopup>(null);
final JBPopup popup = JBPopupFactory.getInstance().createComponentPopupBuilder(result, slider)
.setMovable(true)
.setCancelOnWindowDeactivation(true)
.setCancelKeyEnabled(myConfiguration.isShowOk())
.setKeyboardActions(Collections.singletonList(Pair.<ActionListener, KeyStroke>create(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
saveSelection.run();
popupRef.get().closeOk(null);
}
}, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0))))
.createPopup();
popupRef.set(popup);
if (myConfiguration.isShowOk()) {
final JButton done = new JButton("Done");
final JBPanel doneWrapper = new JBPanel(new BorderLayout());
doneWrapper.add(done, BorderLayout.NORTH);
result.add(doneWrapper, BorderLayout.EAST);
done.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
saveSelection.run();
popup.closeOk(null);
}
});
} else {
popup.setFinalRunnable(saveSelection);
}
InputEvent inputEvent = e.getInputEvent();
show(e, result, popup, inputEvent);
}
@@ -21,6 +21,7 @@ import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.ex.ToolWindowEx;
import com.intellij.openapi.wm.ex.ToolWindowManagerEx;
import com.intellij.util.ObjectUtils;
public class ContentManagerUtil {
private ContentManagerUtil() {
@@ -43,18 +44,14 @@ public class ContentManagerUtil {
id = mgr.getLastActiveToolWindowId();
}
}
if(id == null){
ToolWindowEx toolWindow = id != null ? (ToolWindowEx)mgr.getToolWindow(id) : null;
if (requiresVisibleToolWindow && (toolWindow == null || !toolWindow.isVisible())) {
return null;
}
ToolWindowEx toolWindow = (ToolWindowEx)mgr.getToolWindow(id);
if (requiresVisibleToolWindow && !toolWindow.isVisible()) {
return null;
}
final ContentManager fromContext = PlatformDataKeys.CONTENT_MANAGER.getData(dataContext);
if (fromContext != null) return fromContext;
return toolWindow != null ? toolWindow.getContentManager() : null;
ContentManager fromToolWindow = toolWindow != null ? toolWindow.getContentManager() : null;
ContentManager fromContext = PlatformDataKeys.CONTENT_MANAGER.getData(dataContext);
return ObjectUtils.chooseNotNull(fromContext, fromToolWindow);
}
}
@@ -116,7 +116,7 @@ checkbox.use.fully.qualified.class.names.in.javadoc=Use fully qualified class na
radio.use.fully.qualified.class.names.in.javadoc=Use fully qualified class names in JavaDoc:
radio.use.fully.qualified.class.names.in.javadoc.always=Always
radio.use.fully.qualified.class.names.in.javadoc.if.not.imported=If not already imported
radio.use.fully.qualified.class.names.in.javadoc.never=Never: use short name and add import
radio.use.fully.qualified.class.names.in.javadoc.never=Never, use short name and add import
editbox.class.count.to.use.import.with.star=Class count to use import with '*':
editbox.names.count.to.use.static.import.with.star=Names count to use static import with '*':
title.packages.to.use.import.with=Packages to Use Import with '*'
@@ -1166,3 +1166,7 @@ new.dir.project.chooser.title=Select Location for Project Directory
new.dir.project.default.generator=Empty project
new.dir.project.error.empty=Project name can't be empty
new.dir.project.error.buck=Project directory name must not contain the ''$'' character
go.to.file.toolwindow.title=Files matching pattern
go.to.class.toolwindow.title=Classes matching pattern
go.to.class.dumb.mode.message=Go To Class action is not available until indices are built, using Go To File instead
@@ -95,6 +95,9 @@ options.java.attribute.descriptor.bad.character=Bad character
options.java.attribute.descriptor.breakpoint.line=Breakpoint line
options.java.attribute.descriptor.execution.point=Execution point
options.java.attribute.descriptor.not.top.frame=Not top frame
options.java.attribute.descriptor.inlined.values=Inlined values
options.java.attribute.descriptor.inlined.values.modified=Inlined modified values
options.java.attribute.descriptor.inlined.values.execution.line=Inlined values for breakpoint line
options.java.attribute.descriptor.recursive.call=Recursive calls highlighting
options.java.attribute.descriptor.annotation.name=Annotation name
options.java.attribute.descriptor.annotation.attribute.name=Annotation attribute name
@@ -33,6 +33,27 @@
<attributes>
<option name="DEBUGGER_INLINED_VALUES">
<value>
<option name="FOREGROUND" value="868686" />
<option name="FONT_TYPE" value="2" />
<option name="EFFECT_TYPE" value="0" />
</value>
</option>
<option name="DEBUGGER_INLINED_VALUES_EXECUTION_LINE">
<value>
<option name="FOREGROUND" value="ff56" />
<option name="FONT_TYPE" value="2" />
<option name="EFFECT_TYPE" value="0" />
</value>
</option>
<option name="DEBUGGER_INLINED_VALUES_MODIFIED">
<value>
<option name="FOREGROUND" value="ca8021" />
<option name="FONT_TYPE" value="2" />
<option name="EFFECT_TYPE" value="0" />
</value>
</option>
<option name="DEFAULT_TEMPLATE_LANGUAGE_COLOR">
<value>
<option name="BACKGROUND" value="f7faff"/>
@@ -246,6 +246,7 @@
<extensionPoint name="useScopeEnlarger" interface="com.intellij.psi.search.UseScopeEnlarger"/>
<extensionPoint name="resolveScopeEnlarger" interface="com.intellij.psi.ResolveScopeEnlarger"/>
<extensionPoint name="resolveScopeProvider" interface="com.intellij.psi.ResolveScopeProvider"/>
<extensionPoint name="useScopeOptimizer" interface="com.intellij.psi.search.UseScopeOptimizer"/>
<extensionPoint name="generatedSourcesFilter" interface="com.intellij.openapi.roots.GeneratedSourcesFilter"/>
@@ -241,6 +241,7 @@
displayName="Notifications"
id="reference.settings.ide.settings.notifications"
provider="com.intellij.notification.impl.NotificationsConfigurableProvider"/>
<search.optionContributor implementation="com.intellij.notification.impl.NotificationSearchableOptionContributor"/>
<!-- Plugins -->
<applicationConfigurable groupId="root" groupWeight="55" instance="com.intellij.ide.plugins.PluginManagerConfigurable" id="preferences.pluginManager"

Some files were not shown because too many files have changed in this diff Show More