Merge remote-tracking branch 'origin/master'

This commit is contained in:
Vladimir.Orlov
2016-06-03 19:08:10 +03:00
49 changed files with 387 additions and 262 deletions
@@ -1,92 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="org.intellij.lang.regexp.intention.CheckRegExpForm">
<grid id="a29f0" binding="myRootPanel" custom-create="true" layout-manager="BorderLayout" hgap="0" vgap="0">
<grid id="38faf" binding="myRootPanel" custom-create="true" layout-manager="GridLayoutManager" row-count="4" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="376" height="134"/>
<xy x="20" y="20" width="376" height="163"/>
</constraints>
<properties/>
<border type="empty">
<size top="0" left="1" bottom="0" right="1"/>
</border>
<border type="none"/>
<children>
<grid id="c2a42" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints border-constraint="Center"/>
<component id="5de69" class="com.intellij.ui.components.JBLabel" binding="myMessage">
<constraints>
<grid row="2" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="0" anchor="4" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<componentStyle value="SMALL"/>
<text value="Red means I can't hear you!"/>
</properties>
</component>
<vspacer id="dd293">
<constraints>
<grid row="3" column="0" row-span="1" col-span="2" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<component id="b01c9" class="javax.swing.JLabel">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<preferredSize width="55" height="16"/>
<text value="RegExp:"/>
</properties>
</component>
<component id="ec7ec" class="javax.swing.JLabel">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<preferredSize width="55" height="16"/>
<text value="Sample:"/>
</properties>
</component>
<component id="d8697" class="com.intellij.ui.EditorTextField" binding="myRegExp" custom-create="true">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<grid id="a052" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints border-constraint="Center"/>
<properties/>
<border type="empty">
<size top="5" left="5" bottom="10" right="5"/>
</border>
<children>
<grid id="b7b2b" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints border-constraint="North"/>
<properties/>
<border type="none"/>
<children>
<component id="d8697" class="com.intellij.ui.EditorTextField" binding="myRegExp" custom-create="true">
<constraints border-constraint="Center"/>
<properties/>
</component>
<component id="b01c9" class="javax.swing.JLabel">
<constraints border-constraint="West"/>
<properties>
<alignmentX value="1.0"/>
<preferredSize width="55" height="16"/>
<text value="RegExp:"/>
</properties>
</component>
</children>
</grid>
<grid id="aab68" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints border-constraint="Center"/>
<properties/>
<border type="none"/>
<children>
<component id="47807" class="com.intellij.ui.EditorTextField" binding="mySampleText" custom-create="true">
<constraints border-constraint="Center"/>
<properties/>
</component>
<component id="ec7ec" class="javax.swing.JLabel">
<constraints border-constraint="West"/>
<properties>
<alignmentX value="1.0"/>
<alignmentY value="0.0"/>
<preferredSize width="55" height="16"/>
<text value="Sample:"/>
</properties>
</component>
</children>
</grid>
</children>
</grid>
<grid id="fff6d" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints border-constraint="South"/>
<properties/>
<border type="none"/>
<children>
<component id="5de69" class="com.intellij.ui.components.JBLabel" binding="myMessage">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<alignmentX value="0.5"/>
<componentStyle value="SMALL"/>
<text value="Red means I can't hear you!"/>
</properties>
</component>
<hspacer id="c8c90">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
</hspacer>
</children>
</grid>
</children>
</grid>
</component>
<component id="47807" class="com.intellij.ui.EditorTextField" binding="mySampleText" custom-create="true">
<constraints>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="7" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
</children>
</grid>
</form>
@@ -21,14 +21,17 @@ import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CustomShortcutSet;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.event.DocumentAdapter;
import com.intellij.openapi.editor.event.DocumentEvent;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.fileTypes.PlainTextFileType;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.Balloon;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.wm.IdeFocusManager;
@@ -37,7 +40,6 @@ import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiLanguageInjectionHost;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.intellij.ui.EditorTextField;
import com.intellij.ui.Gray;
import com.intellij.ui.JBColor;
import com.intellij.ui.components.JBLabel;
import com.intellij.util.Alarm;
@@ -49,8 +51,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.TestOnly;
import javax.swing.*;
import javax.swing.border.CompoundBorder;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.util.regex.Pattern;
@@ -82,12 +82,17 @@ public class CheckRegExpForm {
Document document = PsiDocumentManager.getInstance(myProject).getDocument(myRegexpFile);
myRegExp = new EditorTextField(document, myProject, RegExpLanguage.INSTANCE.getAssociatedFileType());
myRegExp.setPreferredWidth(Math.max(JBUI.scale(300), myRegExp.getPreferredSize().width));
final String sampleText = PropertiesComponent.getInstance(myProject).getValue(LAST_EDITED_REGEXP, "Sample Text");
mySampleText = new EditorTextField(sampleText, myProject, PlainTextFileType.INSTANCE);
mySampleText.setBorder(
new CompoundBorder(JBUI.Borders.empty(2, 2, 2, 4), new LineBorder(UIUtil.isUnderDarcula() ? Gray._100 : JBColor.border())));
mySampleText = new EditorTextField(sampleText, myProject, PlainTextFileType.INSTANCE) {
@Override
protected void updateBorder(@NotNull EditorEx editor) {
setupBorder(editor);
}
};
mySampleText.setOneLineMode(false);
int preferredWidth = Math.max(JBUI.scale(250), myRegExp.getPreferredSize().width);
myRegExp.setPreferredWidth(preferredWidth);
mySampleText.setPreferredWidth(preferredWidth);
myRootPanel = new JPanel(new BorderLayout()) {
Disposable disposable;
@@ -112,7 +117,7 @@ public class CheckRegExpForm {
public void documentChanged(DocumentEvent e) {
updater.cancelAllRequests();
if (!updater.isDisposed()) {
updater.addRequest(() -> updateBalloon(), 200);
updater.addRequest(CheckRegExpForm.this::updateBalloon, 200);
}
}
};
@@ -130,6 +135,7 @@ public class CheckRegExpForm {
PropertiesComponent.getInstance(myProject).setValue(LAST_EDITED_REGEXP, mySampleText.getText());
}
};
myRootPanel.setBorder(JBUI.Borders.empty(UIUtil.DEFAULT_VGAP, UIUtil.DEFAULT_HGAP));
}
@NotNull
@@ -149,7 +155,9 @@ public class CheckRegExpForm {
mySampleText.setBackground(correct != null && correct ? BACKGROUND_COLOR_MATCH : BACKGROUND_COLOR_NOMATCH);
myMessage.setText(correct == null ? "Pattern is too complex" : correct ? "Matches!" : "No match");
myRootPanel.revalidate();
}, o -> false);
Balloon balloon = JBPopupFactory.getInstance().getParentBalloonFor(myRootPanel);
if (balloon != null) balloon.revalidate();
}, ModalityState.current());
}
@TestOnly
@@ -16,7 +16,9 @@
package org.intellij.lang.regexp.intention;
import com.intellij.codeInsight.intention.impl.QuickEditAction;
import com.intellij.codeInsight.intention.impl.QuickEditHandler;
import com.intellij.lang.Language;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
@@ -26,6 +28,7 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.util.IncorrectOperationException;
import org.intellij.lang.regexp.RegExpLanguage;
import org.jetbrains.annotations.NotNull;
@@ -44,7 +47,19 @@ public class CheckRegExpIntentionAction extends QuickEditAction implements Icona
Language language = pair.first.getLanguage();
return language.isKindOf(RegExpLanguage.INSTANCE);
}
return false;
PsiFile baseFile = InjectedLanguageManager.getInstance(project).getTopLevelFile(file);
return baseFile != null && baseFile.getLanguage().isKindOf(RegExpLanguage.INSTANCE);
}
@Override
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
PsiFile baseFile = InjectedLanguageManager.getInstance(project).getTopLevelFile(file);
if (baseFile == null || !baseFile.getLanguage().isKindOf(RegExpLanguage.INSTANCE)) {
super.invoke(project, editor, file);
return;
}
JComponent component = createBalloonComponent(file);
if (component != null) QuickEditHandler.showBalloon(editor, file, component);
}
@Override
+1 -1
View File
@@ -162,7 +162,7 @@ libraryLicense(name: "ANTLR 4 Runtime", libraryName: "antlr-runtime-4.1.jar", ve
libraryLicense(name: "Antlr", libraryName: "antlr.jar", version: "3.4", license: "BSD", url: "http://www.antlr.org", licenseUrl: "http://www.antlr.org/license.html")
libraryLicense(name: "Apache Commons BeanUtils", libraryName: "commons-beanutils.jar", version: "1.6", license: "Apache 2.0", url: "http://commons.apache.org/beanutils/")
libraryLicense(name: "Apache Commons Codec", libraryName: "commons-codec", version: "1.8", license: "Apache 2.0", url: "http://commons.apache.org/codec/", licenseUrl: "http://www.apache.org/licenses/")
libraryLicense(name: "Apache Commons Compress", libraryName: "commons-compress-android", version: "1.0", license: "Apache 2.0", url: "http://commons.apache.org/proper/commons-compress/", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0")
libraryLicense(name: "Apache Commons Compress", libraryName: "commons-compress", version: "1.10", license: "Apache 2.0", url: "http://commons.apache.org/proper/commons-compress/", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0")
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://www.apache.org/licenses/")
libraryLicense(name: "Apache Commons HTTPClient", libraryName: "http-client-3.1", version: "3.1&nbsp; (with patch by JetBrains)", license: "Apache 2.0", url: "http://hc.apache.org/httpclient-3.x")
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")
@@ -44,7 +44,6 @@ import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Getter;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
@@ -136,7 +135,6 @@ public abstract class JavaTestFrameworkRunnableState<T extends
Disposer.register(getConfiguration().getProject(), consoleView);
final OSProcessHandler handler = createHandler(executor);
handler.putUserData(TestStateStorage.RUN_CONFIGURATION_NAME_KEY, getConfiguration().getName());
consoleView.attachToProcess(handler);
final AbstractTestProxy root = viewer.getRoot();
@@ -209,10 +209,7 @@ public class ExtractMethodObjectDialog extends DialogWrapper implements Abstract
if (myProtectedRadioButton.isSelected()) {
return PsiModifier.PROTECTED;
}
if (myPrivateRadioButton.isSelected()) {
return PsiModifier.PRIVATE;
}
return null;
return PsiModifier.PRIVATE;
}
@@ -499,6 +499,13 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
}
}
}
for (PsiElement element : myElementsToMove) {
if (element instanceof PsiClass) {
MoveClassesOrPackagesUtil.prepareMoveClass((PsiClass)element);
}
}
final Map<PsiElement, PsiElement> oldToNewElementsMapping = new HashMap<PsiElement, PsiElement>();
for (int idx = 0; idx < myElementsToMove.length; idx++) {
PsiElement element = myElementsToMove[idx];
@@ -528,7 +535,6 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
}
else if (element instanceof PsiClass) {
final PsiClass psiClass = (PsiClass)element;
MoveClassesOrPackagesUtil.prepareMoveClass(psiClass);
final PsiClass newElement = MoveClassesOrPackagesUtil.doMoveClass(psiClass, myMoveDestination.getTargetDirectory(element.getContainingFile()), allClasses.get(psiClass));
oldToNewElementsMapping.put(element, newElement);
element = newElement;
@@ -42,7 +42,7 @@ public abstract class ForkedSplitter extends ForkedByModuleSplitter {
sendTree(myRootDescription);
if (myWorkingDirsPath == null || new File(myWorkingDirsPath).length() == 0) {
final String classpath = System.getProperty("java.class.path");
if (RepeatCount.getCount(repeatCount) != 0 && myForkMode.equals("repeat")) {
if (repeatCount != null && RepeatCount.getCount(repeatCount) != 0 && myForkMode.equals("repeat")) {
return startChildFork(createChildArgs(myRootDescription), null, classpath, repeatCount);
}
final List children = getChildren(myRootDescription);
@@ -0,0 +1,2 @@
package p2;
public class First {}
@@ -0,0 +1,4 @@
package p2;
public class Test {
public static void f() {}
}
@@ -0,0 +1,2 @@
package p3;
public class First extends p2.First {}
@@ -0,0 +1,10 @@
package p3;
import p2.*;
class Second {
{
new First();
Test.f();
}
}
@@ -0,0 +1,2 @@
package p1;
public class First extends p2.First {}
@@ -0,0 +1,10 @@
package p1;
import p2.*;
class Second {
{
new First();
Test.f();
}
}
@@ -0,0 +1,2 @@
package p2;
public class First {}
@@ -0,0 +1,4 @@
package p2;
public class Test {
public static void f() {}
}
@@ -94,6 +94,10 @@ public class MoveClassTest extends RefactoringTestCase {
doTest("qualifiedRef", new String[]{"p1.Test"}, "p2");
}
public void testConflictingClassNames() throws Exception {
doTest("conflictingNames", new String[] {"p1.First", "p1.Second"}, "p3");
}
private void doTest(@NonNls String testName, @NonNls String[] classNames, @NonNls String newPackageName) throws Exception{
String root = JavaTestUtil.getJavaTestDataPath() + "/refactoring/moveClass/" + testName;
@@ -16,7 +16,7 @@
package com.intellij.codeInsight.daemon.impl;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.util.pico.ConstructorInjectionComponentAdapter;
import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
import org.picocontainer.PicoContainer;
@@ -55,7 +55,7 @@ abstract class ThreadLocalAnnotatorMap<K, V> {
PicoContainer container = ApplicationManager.getApplication().getPicoContainer();
for (V template : templates) {
Class<? extends V> aClass = (Class<? extends V>)template.getClass();
V clone = (V)new ConstructorInjectionComponentAdapter(aClass.getName(), aClass).getComponentInstance(container);
V clone = (V)new CachingConstructorInjectionComponentAdapter(aClass.getName(), aClass).getComponentInstance(container);
result.add(clone);
}
return result;
@@ -37,7 +37,7 @@ import com.intellij.util.ReflectionUtil;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.messages.MessageBus;
import com.intellij.util.messages.MessageBusFactory;
import com.intellij.util.pico.ConstructorInjectionComponentAdapter;
import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter;
import com.intellij.util.pico.DefaultPicoContainer;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
@@ -461,7 +461,7 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements
return myNameToComponent.get(name);
}
private final class ComponentConfigComponentAdapter extends ConstructorInjectionComponentAdapter {
private final class ComponentConfigComponentAdapter extends CachingConstructorInjectionComponentAdapter {
private final PluginId myPluginId;
private volatile Object myInitializedComponentInstance;
private boolean myInitializing;
@@ -259,8 +259,8 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF
}
private void switchFromStubToAst(List<Pair<StubBasedPsiElementBase, AstPath>> bindings) {
if (!bindings.isEmpty()) {
LOG.assertTrue(!myUseStrongRefs, this + " of " + getClass() + "; " + bindings);
if (!bindings.isEmpty() && myUseStrongRefs) {
LOG.error(this + " of " + getClass() + "; " + bindings);
}
for (Pair<StubBasedPsiElementBase, AstPath> pair : bindings) {
@@ -15,6 +15,7 @@
*/
package com.intellij.diff.tools.util;
import com.intellij.diff.tools.util.base.TextDiffViewerUtil;
import com.intellij.diff.util.DiffDividerDrawUtil;
import com.intellij.diff.util.DiffDrawUtil;
import com.intellij.diff.util.DiffUtil;
@@ -22,6 +23,7 @@ import com.intellij.diff.util.LineRange;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.FoldRegion;
import com.intellij.openapi.editor.event.DocumentAdapter;
@@ -75,12 +77,14 @@ public class FoldingModelSupport {
myShouldUpdateLineNumbers = new boolean[myCount];
MyDocumentListener documentListener = new MyDocumentListener();
List<Document> documents = ContainerUtil.map(myEditors, EditorEx::getDocument);
TextDiffViewerUtil.installDocumentListeners(documentListener, documents, disposable);
for (int i = 0; i < myCount; i++) {
if (myCount > 1) {
myEditors[i].getFoldingModel().addListener(new MyFoldingListener(i), disposable);
}
myEditors[i].getGutterComponentEx().setLineNumberConvertor(getLineConvertor(i));
myEditors[i].getDocument().addDocumentListener(documentListener, disposable);
}
}
@@ -25,43 +25,31 @@ import com.intellij.openapi.editor.event.DocumentAdapter;
import com.intellij.openapi.editor.event.DocumentEvent;
import com.intellij.openapi.editor.event.DocumentListener;
import com.intellij.openapi.vfs.*;
import com.intellij.util.containers.HashSet;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.CalledInAwt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public abstract class ListenerDiffViewerBase extends DiffViewerBase {
@NotNull private final DocumentListener myDocumentListener;
@Nullable private final VirtualFileListener myFileListener;
public ListenerDiffViewerBase(@NotNull DiffContext context, @NotNull ContentDiffRequest request) {
super(context, request);
myDocumentListener = createDocumentListener();
myFileListener = createFileListener(request);
}
@Override
protected void onInit() {
super.onInit();
if (myFileListener != null) VirtualFileManager.getInstance().addVirtualFileListener(myFileListener);
for (Document document : getDocuments()) {
document.addDocumentListener(myDocumentListener);
}
}
VirtualFileListener fileListener = createFileListener(myRequest);
if (fileListener != null) VirtualFileManager.getInstance().addVirtualFileListener(fileListener, this);
@Override
protected void onDispose() {
if (myFileListener != null) VirtualFileManager.getInstance().removeVirtualFileListener(myFileListener);
for (Document document : getDocuments()) {
document.removeDocumentListener(myDocumentListener);
}
super.onDispose();
DocumentListener documentListener = createDocumentListener();
List<Document> documents = ContainerUtil.mapNotNull(myRequest.getContents(), (content) -> {
return content instanceof DocumentContent ? ((DocumentContent)content).getDocument() : null;
});
TextDiffViewerUtil.installDocumentListeners(documentListener, documents, this);
}
@NotNull
@@ -124,19 +112,4 @@ public abstract class ListenerDiffViewerBase extends DiffViewerBase {
protected void onFileChange(@NotNull VirtualFileEvent event) {
scheduleRediff();
}
//
// Helpers
//
@NotNull
private Set<Document> getDocuments() {
Set<Document> documents = new HashSet<>();
for (DiffContent content : myRequest.getContents()) {
if (content instanceof DocumentContent) {
documents.add(((DocumentContent)content).getDocument());
}
}
return documents;
}
}
@@ -31,7 +31,9 @@ import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.ex.ComboBoxAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.actions.EditorActionUtil;
import com.intellij.openapi.editor.event.DocumentListener;
import com.intellij.openapi.editor.event.EditorMouseEvent;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.project.DumbAware;
@@ -100,6 +102,14 @@ public class TextDiffViewerUtil {
return result;
}
public static void installDocumentListeners(@NotNull DocumentListener listener,
@NotNull List<Document> documents,
@NotNull Disposable disposable) {
for (Document document : ContainerUtil.newHashSet(documents)) {
document.addDocumentListener(listener, disposable);
}
}
public static void checkDifferentDocuments(@NotNull ContentDiffRequest request) {
// Actually, this should be a valid case. But it has little practical sense and will require explicit checks everywhere.
// Some listeners will be processed once instead of 2 times, some listeners will cause illegal document modifications.
@@ -16,7 +16,7 @@
package com.intellij.openapi.extensions;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.util.pico.ConstructorInjectionComponentAdapter;
import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.picocontainer.PicoContainer;
@@ -72,7 +72,7 @@ public abstract class AbstractExtensionPointBean implements PluginAware {
public static <T> T instantiate(@NotNull final Class<T> aClass,
@NotNull final PicoContainer container,
final boolean allowNonPublicClasses) {
return (T)new ConstructorInjectionComponentAdapter(aClass.getName(), aClass, null, allowNonPublicClasses).getComponentInstance(container);
return (T)new CachingConstructorInjectionComponentAdapter(aClass.getName(), aClass, null, allowNonPublicClasses).getComponentInstance(container);
}
}
@@ -21,7 +21,7 @@ import com.intellij.openapi.extensions.PluginDescriptor;
import com.intellij.openapi.extensions.PluginId;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.util.pico.AssignableToComponentAdapter;
import com.intellij.util.pico.ConstructorInjectionComponentAdapter;
import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter;
import com.intellij.util.xmlb.XmlSerializer;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
@@ -166,7 +166,7 @@ public class ExtensionComponentAdapter implements LoadingOrder.Orderable, Assign
private synchronized ComponentAdapter getDelegate() {
if (myDelegate == null) {
Class impl = loadImplementationClass();
myDelegate = new ConstructorInjectionComponentAdapter(getComponentKey(), impl, null, true);
myDelegate = new CachingConstructorInjectionComponentAdapter(getComponentKey(), impl, null, true);
}
return myDelegate;
@@ -18,7 +18,7 @@ package com.intellij.openapi.extensions.impl;
import com.intellij.openapi.extensions.*;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import com.intellij.util.pico.ConstructorInjectionComponentAdapter;
import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter;
import com.intellij.util.pico.DefaultPicoContainer;
import gnu.trove.THashMap;
import org.jdom.Attribute;
@@ -234,8 +234,8 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
}
private Object instantiate(Class clazz) {
ConstructorInjectionComponentAdapter adapter =
new ConstructorInjectionComponentAdapter(Integer.toString(System.identityHashCode(new Object())), clazz);
CachingConstructorInjectionComponentAdapter adapter =
new CachingConstructorInjectionComponentAdapter(Integer.toString(System.identityHashCode(new Object())), clazz);
return adapter.getComponentInstance(getPicoContainer());
}
@@ -27,27 +27,26 @@ import java.security.PrivilegedAction;
import java.util.*;
/**
* A drop-in replacement of {@link org.picocontainer.defaults.ConstructorInjectionComponentAdapter}
* A drop-in replacement of {@link ConstructorInjectionComponentAdapter}
* The same code (generified and cleaned up) but without constructor caching (hence taking up less memory).
* This class also inlines instance caching (e.g. it doesn't need to be wrapped in a CachingComponentAdapter).
*/
@SuppressWarnings("ClassNameSameAsAncestorName")
public class ConstructorInjectionComponentAdapter extends org.picocontainer.defaults.ConstructorInjectionComponentAdapter {
public class CachingConstructorInjectionComponentAdapter extends ConstructorInjectionComponentAdapter {
private Object myInstance;
public ConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters, boolean allowNonPublicClasses, ComponentMonitor monitor, LifecycleStrategy lifecycleStrategy) throws AssignabilityRegistrationException, NotConcreteRegistrationException {
public CachingConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters, boolean allowNonPublicClasses, ComponentMonitor monitor, LifecycleStrategy lifecycleStrategy) throws AssignabilityRegistrationException, NotConcreteRegistrationException {
super(componentKey, componentImplementation, parameters, allowNonPublicClasses, monitor, lifecycleStrategy);
}
public ConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters, boolean allowNonPublicClasses) throws AssignabilityRegistrationException, NotConcreteRegistrationException {
public CachingConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters, boolean allowNonPublicClasses) throws AssignabilityRegistrationException, NotConcreteRegistrationException {
super(componentKey, componentImplementation, parameters, allowNonPublicClasses);
}
public ConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters) {
public CachingConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters) {
this(componentKey, componentImplementation, parameters, false);
}
public ConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation) throws AssignabilityRegistrationException, NotConcreteRegistrationException {
public CachingConstructorInjectionComponentAdapter(@NotNull Object componentKey, @NotNull Class componentImplementation) throws AssignabilityRegistrationException, NotConcreteRegistrationException {
this(componentKey, componentImplementation, null);
}
@@ -353,7 +353,7 @@ public class DefaultPicoContainer implements AreaPicoContainer, Serializable {
@Override
public ComponentAdapter registerComponentImplementation(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters) {
ComponentAdapter componentAdapter = new ConstructorInjectionComponentAdapter(componentKey, componentImplementation, parameters, true);
ComponentAdapter componentAdapter = new CachingConstructorInjectionComponentAdapter(componentKey, componentImplementation, parameters, true);
return registerComponent(componentAdapter);
}
@@ -9,6 +9,7 @@ import com.intellij.execution.configurations.LocatableConfigurationBase;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.configurations.RunProfileState;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.process.AnsiEscapeDecoder;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.process.ProcessOutputTypes;
import com.intellij.execution.runners.ExecutionEnvironment;
@@ -30,6 +31,7 @@ import com.intellij.openapi.options.SettingsEditor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.util.ExceptionUtil;
import com.intellij.util.containers.ContainerUtilRt;
@@ -236,13 +238,19 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase {
}
}
private static class MyProcessHandler extends ProcessHandler {
private static class MyProcessHandler extends ProcessHandler implements AnsiEscapeDecoder.ColoredTextAcceptor {
private final ExternalSystemExecuteTaskTask myTask;
private final AnsiEscapeDecoder myAnsiEscapeDecoder = new AnsiEscapeDecoder();
public MyProcessHandler(ExternalSystemExecuteTaskTask task) {
myTask = task;
}
@Override
public void notifyTextAvailable(final String text, final Key outputType) {
myAnsiEscapeDecoder.escapeText(text, outputType, this);
}
@Override
protected void destroyProcessImpl() {
}
@@ -268,6 +276,11 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase {
public void notifyProcessTerminated(int exitCode) {
super.notifyProcessTerminated(exitCode);
}
@Override
public void coloredTextAvailable(String text, Key attributes) {
super.notifyTextAvailable(text, attributes);
}
}
@NotNull
@@ -194,30 +194,7 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable {
public void navigate(int injectedOffset) {
if (myAction.isShowInBalloon()) {
final JComponent component = myAction.createBalloonComponent(myNewFile);
if (component != null) {
final Balloon balloon = JBPopupFactory.getInstance().createBalloonBuilder(component)
.setShadow(true)
.setAnimationCycle(0)
.setHideOnClickOutside(true)
.setHideOnKeyOutside(true)
.setHideOnAction(false)
.setFillColor(UIUtil.getControlColor())
.createBalloon();
new AnAction() {
@Override
public void actionPerformed(AnActionEvent e) {
balloon.hide();
}
}.registerCustomShortcutSet(CommonShortcuts.ESCAPE, component);
Disposer.register(myNewFile.getProject(), balloon);
final Balloon.Position position = QuickEditAction.getBalloonPosition(myEditor);
RelativePoint point = JBPopupFactory.getInstance().guessBestPopupLocation(myEditor);
if (position == Balloon.Position.above) {
final Point p = point.getPoint();
point = new RelativePoint(point.getComponent(), new Point(p.x, p.y - myEditor.getLineHeight()));
}
balloon.show(point, position);
}
if (component != null) showBalloon(myEditor, myNewFile, component);
}
else {
final FileEditorManagerEx fileEditorManager = FileEditorManagerEx.getInstanceEx(myProject);
@@ -245,6 +222,31 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable {
}
}
public static void showBalloon(Editor editor, PsiFile newFile, JComponent component) {
final Balloon balloon = JBPopupFactory.getInstance().createBalloonBuilder(component)
.setShadow(true)
.setAnimationCycle(0)
.setHideOnClickOutside(true)
.setHideOnKeyOutside(true)
.setHideOnAction(false)
.setFillColor(UIUtil.getControlColor())
.createBalloon();
new AnAction() {
@Override
public void actionPerformed(AnActionEvent e) {
balloon.hide();
}
}.registerCustomShortcutSet(CommonShortcuts.ESCAPE, component);
Disposer.register(newFile.getProject(), balloon);
final Balloon.Position position = QuickEditAction.getBalloonPosition(editor);
RelativePoint point = JBPopupFactory.getInstance().guessBestPopupLocation(editor);
if (position == Balloon.Position.above) {
final Point p = point.getPoint();
point = new RelativePoint(point.getComponent(), new Point(p.x, p.y - editor.getLineHeight()));
}
balloon.show(point, position);
}
@Override
public void documentChanged(DocumentEvent e) {
UndoManager undoManager = UndoManager.getInstance(myProject);
@@ -20,7 +20,6 @@ import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.ThrowableComputable;
import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.openapi.vfs.newvfs.persistent.FlushingDaemon;
@@ -44,8 +43,6 @@ import java.util.concurrent.ScheduledFuture;
* @author Dmitry Avdeev
*/
public class TestStateStorage implements Disposable {
public static Key<String> RUN_CONFIGURATION_NAME_KEY = Key.create("run.configuration.name");
private static final File TEST_HISTORY_PATH = new File(PathManager.getSystemPath(), "testHistory");
@@ -68,7 +68,7 @@ import com.intellij.usages.*;
import com.intellij.util.CommonProcessors;
import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.pico.ConstructorInjectionComponentAdapter;
import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -189,7 +189,7 @@ public class FindUsagesManager {
for (FindUsagesHandlerFactory factory : Extensions.getExtensions(FindUsagesHandlerFactory.EP_NAME, myProject)) {
if (factory.canFindUsages(element)) {
Class<? extends FindUsagesHandlerFactory> aClass = factory.getClass();
FindUsagesHandlerFactory copy = (FindUsagesHandlerFactory)new ConstructorInjectionComponentAdapter(aClass.getName(), aClass)
FindUsagesHandlerFactory copy = (FindUsagesHandlerFactory)new CachingConstructorInjectionComponentAdapter(aClass.getName(), aClass)
.getComponentInstance(myProject.getPicoContainer());
final FindUsagesHandler handler = copy.createFindUsagesHandler(element, forHighlightUsages);
if (handler == FindUsagesHandler.NULL_HANDLER) return null;
@@ -22,14 +22,19 @@ import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.ide.fileTemplates.FileTemplateManager;
import com.intellij.ide.fileTemplates.FileTemplateUtil;
import com.intellij.ide.util.projectWizard.*;
import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.diagnostic.Attachment;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.module.*;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ex.ProjectManagerEx;
import com.intellij.openapi.roots.ModifiableRootModel;
@@ -38,6 +43,7 @@ import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.openapi.util.text.StringUtilRt;
import com.intellij.openapi.vfs.CharsetToolkit;
@@ -54,6 +60,7 @@ import org.apache.velocity.exception.VelocityException;
import org.jdom.JDOMException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.serialization.PathMacroUtil;
import javax.swing.*;
import java.io.File;
@@ -157,7 +164,7 @@ public class TemplateModuleBuilder extends ModuleBuilder {
throws InvalidDataException, IOException, ModuleWithNameAlreadyExists, JDOMException, ConfigurationException {
final String path = getContentEntryPath();
final ExistingModuleLoader loader = ExistingModuleLoader.setUpLoader(getModuleFilePath());
unzip(loader.getName(), path, true);
unzip(loader.getName(), path, true, null, true);
Module module = loader.createModule(moduleModel);
if (myProjectMode) {
moduleModel.renameModule(module, module.getProject().getName());
@@ -190,7 +197,11 @@ public class TemplateModuleBuilder extends ModuleBuilder {
return null;
}
private void unzip(final @Nullable String projectName, String path, final boolean moduleMode) {
private void unzip(final @Nullable String projectName,
String path,
final boolean moduleMode,
@Nullable ProgressIndicator pI,
boolean reportFailuresWithDialog) {
final WizardInputField basePackage = getBasePackageField();
try {
final NullableFunction<String, String> pathConvertor = path1 -> {
@@ -224,20 +235,21 @@ public class TemplateModuleBuilder extends ModuleBuilder {
return;
}
String dialogMessage;
if (myFailures.size() == 1) {
dialogMessage = "Failed to decode file \'" + myFailures.get(0).getFirst() + "\'";
}
else {
StringBuilder dialogMessageBuilder = new StringBuilder();
dialogMessageBuilder.append("Failed to decode files: \n");
for (Trinity<String, String, VelocityException> failure : myFailures) {
dialogMessageBuilder.append(failure.getFirst()).append("\n");
if(reportFailuresWithDialog) {
String dialogMessage;
if (myFailures.size() == 1) {
dialogMessage = "Failed to decode file \'" + myFailures.get(0).getFirst() + "\'";
}
dialogMessage = dialogMessageBuilder.toString();
else {
StringBuilder dialogMessageBuilder = new StringBuilder();
dialogMessageBuilder.append("Failed to decode files: \n");
for (Trinity<String, String, VelocityException> failure : myFailures) {
dialogMessageBuilder.append(failure.getFirst()).append("\n");
}
dialogMessage = dialogMessageBuilder.toString();
}
Messages.showErrorDialog(dialogMessage, "Decoding Template");
}
Messages.showErrorDialog(dialogMessage, "Decoding Template");
StringBuilder reportBuilder = new StringBuilder();
for (Trinity<String, String, VelocityException> failure : myFailures) {
@@ -259,6 +271,9 @@ public class TemplateModuleBuilder extends ModuleBuilder {
ZipUtil.unzip(ProgressManager.getInstance().getProgressIndicator(), dir, stream, pathConvertor, new ZipUtil.ContentProcessor() {
@Override
public byte[] processContent(byte[] content, File file) throws IOException {
if(pI != null){
pI.checkCanceled();
}
FileType fileType = FileTypeManager.getInstance().getFileTypeByExtension(FileUtilRt.getExtension(file.getName()));
String text = new String(content, CharsetToolkit.UTF8_CHARSET);
consumer.setCurrentFile(file.getName(), text);
@@ -269,6 +284,10 @@ public class TemplateModuleBuilder extends ModuleBuilder {
}
});
if(pI != null) {
pI.setText("Refreshing...");
}
String iml = ContainerUtil.find(dir.list(), s -> s.endsWith(".iml"));
if (moduleMode) {
File from = new File(path, iml);
@@ -318,21 +337,82 @@ public class TemplateModuleBuilder extends ModuleBuilder {
@Nullable
@Override
public Project createProject(String name, final String path) {
myProjectMode = true;
unzip(name, path, false);
return ApplicationManager.getApplication().runWriteAction(new NullableComputable<Project>() {
@Nullable
@Override
public Project compute() {
try {
return ProjectManagerEx.getInstanceEx().convertAndLoadProject(path);
}
catch (IOException e) {
LOG.error(e);
return null;
}
final File location = new File(FileUtil.toSystemDependentName(path));
LOG.assertTrue(location.exists());
final VirtualFile baseDir = ApplicationManager.getApplication().runWriteAction(new Computable<VirtualFile>() {
public VirtualFile compute() {
return LocalFileSystem.getInstance().refreshAndFindFileByIoFile(location);
}
});
if (baseDir == null) {
LOG.error("Couldn't find path '" + path + "' in VFS");
return null;
}
VirtualFile[] children = baseDir.getChildren();
boolean isSomehowOverwriting = children.length > 1 ||
(children.length == 1 && !PathMacroUtil.DIRECTORY_STORE_NAME.equals(children[0].getName()));
Ref<Boolean> canceledRef = new Ref<>();
Ref<Project> projectRef = new Ref<>();
Task.Modal task = new Task.Modal(null, "Applying Template", true) {
@Override
public void run(@NotNull ProgressIndicator indicator) {
try {
projectRef.set(createProject(name, path, indicator));
}
finally {
cleanup();
if(indicator.isCanceled()){
canceledRef.set(true);
if (!isSomehowOverwriting) {
ApplicationManager.getApplication().invokeLater(() -> {
AccessToken token = ApplicationManager.getApplication().acquireWriteActionLock(TemplateProjectDirectoryGenerator.class);
try {
baseDir.delete(TemplateProjectDirectoryGenerator.class);
}
catch (IOException e) {
LOG.error(e);
}
finally {
token.close();
}
});
}
}
}
}
};
ProgressManager.getInstance().run(task);
if(canceledRef.get() == Boolean.TRUE){
throw new ProcessCanceledException();
}
return projectRef.get();
}
@Nullable
private Project createProject(String name, final String path, @Nullable ProgressIndicator progressIndicator) {
myProjectMode = true;
unzip(name, path, false, progressIndicator, false);
Ref<Project> projectRef = new Ref<>();
ApplicationManager.getApplication().invokeAndWait(()->{
projectRef.set(
ApplicationManager.getApplication().runWriteAction(new NullableComputable<Project>() {
@Nullable
@Override
public Project compute() {
try {
return ProjectManagerEx.getInstanceEx().convertAndLoadProject(path);
}
catch (IOException e) {
LOG.error(e);
return null;
}
}
}));
}, ModalityState.any());
return projectRef.get();
}
private final static Logger LOG = Logger.getInstance(TemplateModuleBuilder.class);
@@ -53,7 +53,7 @@ import com.intellij.util.ReflectionUtil;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import com.intellij.util.messages.MessageBusConnection;
import com.intellij.util.pico.ConstructorInjectionComponentAdapter;
import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter;
import com.intellij.util.ui.UIUtil;
import gnu.trove.THashMap;
import gnu.trove.THashSet;
@@ -666,7 +666,7 @@ public final class ActionManagerImpl extends ActionManagerEx implements Disposab
group = new DefaultCompactActionGroup();
} else {
Class aClass = Class.forName(className, true, loader);
Object obj = new ConstructorInjectionComponentAdapter(className, aClass).getComponentInstance(ApplicationManager.getApplication().getPicoContainer());
Object obj = new CachingConstructorInjectionComponentAdapter(className, aClass).getComponentInstance(ApplicationManager.getApplication().getPicoContainer());
if (!(obj instanceof ActionGroup)) {
reportActionError(pluginId, "class with name \"" + className + "\" should be instance of " + ActionGroup.class.getName());
@@ -36,7 +36,7 @@ import com.intellij.util.PairProcessor;
import com.intellij.util.PlatformUtils;
import com.intellij.util.io.storage.HeavyProcessLatch;
import com.intellij.util.pico.AssignableToComponentAdapter;
import com.intellij.util.pico.ConstructorInjectionComponentAdapter;
import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.picocontainer.*;
@@ -263,7 +263,7 @@ public class ServiceManagerImpl implements BaseComponent {
throw new RuntimeException(e);
}
myDelegate = new ConstructorInjectionComponentAdapter(getComponentKey(), implClass, null, true);
myDelegate = new CachingConstructorInjectionComponentAdapter(getComponentKey(), implClass, null, true);
}
return myDelegate;
}
@@ -54,7 +54,7 @@ import com.intellij.openapi.wm.impl.FrameTitleBuilder;
import com.intellij.psi.impl.DebugUtil;
import com.intellij.util.TimedReference;
import com.intellij.util.io.storage.HeavyProcessLatch;
import com.intellij.util.pico.ConstructorInjectionComponentAdapter;
import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -161,7 +161,7 @@ public class ProjectImpl extends PlatformComponentManagerImpl implements Project
private ComponentAdapter getDelegate() {
if (myDelegate == null) {
Class storeClass = projectStoreClassProvider.getProjectStoreClass(isDefault());
myDelegate = new ConstructorInjectionComponentAdapter(storeClass, storeClass, null, true);
myDelegate = new CachingConstructorInjectionComponentAdapter(storeClass, storeClass, null, true);
}
return myDelegate;
}
@@ -531,26 +531,30 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener,
final Container parent = getParent();
if (parent instanceof JTable || parent instanceof CellRendererPane) return;
if (UIUtil.isUnderAquaLookAndFeel() || UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF()) {
editor.setBorder(UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF() ? new DarculaEditorTextFieldBorder() : new MacUIUtil.EditorTextFieldBorder(this));
editor.addFocusListener(new FocusChangeListener() {
@Override
public void focusGained(Editor editor) {
repaint();
}
setupBorder(editor);
}
}
@Override
public void focusLost(Editor editor) {
repaint();
}
});
}
else if (UIUtil.isUnderAlloyLookAndFeel() || UIUtil.isUnderJGoodiesLookAndFeel()) {
editor.setBorder(BorderFactory.createCompoundBorder(UIUtil.getTextFieldBorder(), BorderFactory.createEmptyBorder(1, 1, 1, 1)));
}
else {
editor.setBorder(BorderFactory.createCompoundBorder(UIUtil.getTextFieldBorder(), BorderFactory.createEmptyBorder(2, 2, 2, 2)));
}
protected void setupBorder(@NotNull EditorEx editor) {
if (UIUtil.isUnderAquaLookAndFeel() || UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF()) {
editor.setBorder(UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF() ? new DarculaEditorTextFieldBorder() : new MacUIUtil.EditorTextFieldBorder(this));
editor.addFocusListener(new FocusChangeListener() {
@Override
public void focusGained(Editor editor) {
repaint();
}
@Override
public void focusLost(Editor editor) {
repaint();
}
});
}
else if (UIUtil.isUnderAlloyLookAndFeel() || UIUtil.isUnderJGoodiesLookAndFeel()) {
editor.setBorder(BorderFactory.createCompoundBorder(UIUtil.getTextFieldBorder(), BorderFactory.createEmptyBorder(1, 1, 1, 1)));
}
else {
editor.setBorder(BorderFactory.createCompoundBorder(UIUtil.getTextFieldBorder(), BorderFactory.createEmptyBorder(2, 2, 2, 2)));
}
}
@@ -675,7 +675,13 @@ public class PopupFactoryImpl extends JBPopupFactory {
Point p = editor.visualPositionToXY(new VisualPosition(visualPosition.line + 1, visualPosition.column));
final Rectangle visibleArea = editor.getScrollingModel().getVisibleArea();
return visibleArea.contains(p) ? p : null;
if (!visibleArea.contains(p)) {
int h = editor.getLineHeight();
p.y -= h;
if (!visibleArea.contains(p)) return null;
p.y += h;
}
return p;
}
@Override
@@ -19,7 +19,6 @@ import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
import com.intellij.execution.TestStateStorage;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.configurations.RunProfile;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.testframework.*;
import com.intellij.execution.testframework.actions.ScrollToTestSourceAction;
import com.intellij.execution.testframework.export.TestResultsXmlFormatter;
@@ -46,7 +45,6 @@ import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pass;
import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.pom.Navigatable;
@@ -70,8 +68,6 @@ import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.FileWriter;
import java.text.SimpleDateFormat;
@@ -801,11 +797,7 @@ public class SMTestRunnerResultsForm extends TestResultsPanel
for (SMTestProxy proxy : tests) {
String url = proxy instanceof SMTestProxy.SMRootTestProxy ? ((SMTestProxy.SMRootTestProxy)proxy).getRootLocation() : proxy.getLocationUrl();
if (url != null) {
ProcessHandler handler = myRoot.getHandler();
String configurationName = null;
if (handler != null) {
configurationName = handler.getUserData(TestStateStorage.RUN_CONFIGURATION_NAME_KEY);
}
String configurationName = myConfiguration != null ? myConfiguration.getName() : null;
storage.writeState(url, new TestStateStorage.Record(proxy.getMagnitude(), new Date(),
configurationName == null ? 0 : configurationName.hashCode()));
}
@@ -20,7 +20,7 @@ import com.intellij.testFramework.builders.ModuleFixtureBuilder;
import com.intellij.testFramework.fixtures.HeavyIdeaTestFixture;
import com.intellij.testFramework.fixtures.IdeaProjectTestFixture;
import com.intellij.testFramework.fixtures.TestFixtureBuilder;
import com.intellij.util.pico.ConstructorInjectionComponentAdapter;
import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter;
import com.intellij.util.pico.DefaultPicoContainer;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
@@ -48,7 +48,8 @@ class HeavyTestFixtureBuilderImpl implements TestFixtureBuilder<IdeaProjectTestF
private <M extends ModuleFixtureBuilder> M createModuleBuilder(Class<M> key) {
Class<? extends ModuleFixtureBuilder> implClass = myProviders.get(key);
Assert.assertNotNull(key.toString(), implClass);
final ConstructorInjectionComponentAdapter adapter = new ConstructorInjectionComponentAdapter(implClass, implClass, null, true);
final CachingConstructorInjectionComponentAdapter
adapter = new CachingConstructorInjectionComponentAdapter(implClass, implClass, null, true);
return (M)adapter.getComponentInstance(myContainer);
}
@@ -21,7 +21,7 @@ import com.intellij.openapi.extensions.PluginAware;
import com.intellij.openapi.extensions.PluginDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.util.NotNullFunction;
import com.intellij.util.pico.ConstructorInjectionComponentAdapter;
import com.intellij.util.pico.CachingConstructorInjectionComponentAdapter;
import com.intellij.util.xmlb.annotations.Attribute;
import org.jetbrains.annotations.Nullable;
@@ -90,7 +90,7 @@ public class ChangesViewContentEP implements PluginAware {
try {
final Class<?> aClass = Class.forName(className, true,
myPluginDescriptor == null ? getClass().getClassLoader() : myPluginDescriptor.getPluginClassLoader());
return new ConstructorInjectionComponentAdapter(className, aClass).getComponentInstance(project.getPicoContainer());
return new CachingConstructorInjectionComponentAdapter(className, aClass).getComponentInstance(project.getPicoContainer());
}
catch(Exception e) {
LOG.error(e);
@@ -101,6 +101,7 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj
@Nullable private final AbstractVcs myVcs;
private final boolean myIsAlien;
private boolean myDisposed = false;
private boolean myUpdateDisabled = false;
@NotNull private final JLabel myWarningLabel;
@NotNull private final Map<String, CheckinChangeListSpecificComponent> myCheckinChangeListSpecificComponents;
@@ -855,12 +856,12 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj
}
private void stopUpdate() {
myDisposed = true;
myUpdateDisabled = true;
myUpdateButtonsRunnable.cancel();
}
private void restartUpdate() {
myDisposed = false;
myUpdateDisabled = false;
myUpdateButtonsRunnable.restart(this);
}
@@ -1213,7 +1214,7 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj
}
private void updateButtons() {
if (myDisposed) return;
if (myDisposed || myUpdateDisabled) return;
final boolean enabled = hasDiffs();
setOKActionEnabled(enabled);
if (myCommitAction != null) {
@@ -1229,7 +1230,7 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj
}
private void updateLegend() {
if (myDisposed) return;
if (myDisposed || myUpdateDisabled) return;
myChangesInfoCalculator.update(myBrowser.getCurrentDisplayedChanges(), getIncludedChanges(), myBrowser.getUnversionedFilesCount(),
myBrowser.getIncludedUnversionedFiles().size());
myLegend.update();
@@ -17,9 +17,13 @@ package org.jetbrains.plugins.gradle.execution.test.runner;
import com.intellij.execution.Location;
import com.intellij.execution.stacktrace.StackTraceLine;
import com.intellij.execution.testframework.Printable;
import com.intellij.execution.testframework.Printer;
import com.intellij.execution.testframework.sm.runner.SMTestProxy;
import com.intellij.execution.ui.ConsoleViewContentType;
import com.intellij.openapi.diff.LineTokenizer;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
@@ -40,6 +44,15 @@ public class GradleSMTestProxy extends SMTestProxy {
myClassName = className;
}
@Override
public void addStdOutput(String output, Key outputType) {
addLast(new Printable() {
public void printOn(final Printer printer) {
printer.printWithAnsiColoring(output, ConsoleViewContentType.getConsoleViewType(outputType));
}
});
}
@Override
public void setTestFailed(@NotNull String localizedMessage, @Nullable String stackTrace, boolean testError) {
setStacktraceIfNotSet(stackTrace);
@@ -19,6 +19,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.MultiLineLabelUI;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ui.JBDimension;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.svn.SvnBundle;
import org.tmatesoft.svn.core.SVNException;
@@ -75,7 +76,7 @@ public class AddRepositoryLocationDialog extends DialogWrapper {
myCombo = new JComboBox(ArrayUtil.toObjectArray(myPreviousLocations));
myCombo.setEditable(true);
myCombo.setMinimumSize(new Dimension(250, 20));
myCombo.setMinimumSize(new JBDimension(250, 20));
gb.fill = GridBagConstraints.HORIZONTAL;
mainPanel.add(myCombo, gb);
gb.fill = GridBagConstraints.NONE;
@@ -36,14 +36,14 @@ public abstract class LibraryContributingFacet<T extends FacetConfiguration> ext
connection.subscribe(FacetManager.FACETS_TOPIC, new FacetManagerAdapter() {
@Override
public void beforeFacetRemoved(@NotNull Facet facet) {
if (facet instanceof LibraryContributingFacet) {
if (facet == LibraryContributingFacet.this) {
((LibraryContributingFacet) facet).removeLibrary();
}
}
@Override
public void facetConfigurationChanged(@NotNull Facet facet) {
if (facet instanceof LibraryContributingFacet) {
if (facet == LibraryContributingFacet.this) {
((LibraryContributingFacet) facet).updateLibrary();
}
}