From 07acad8dc9d9ed4d932b0e78ffbab179e38867c2 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 2 Dec 2011 13:31:02 +0100 Subject: [PATCH 01/60] what was that? --- resources/src/META-INF/IdeaPlugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index c2f291d22407..40d705ba42b6 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -548,7 +548,7 @@ Control Flow - com.intellij.codeInsight.intention.impl.DeannotateIntentionAction ยก + com.intellij.codeInsight.intention.impl.DeannotateIntentionAction Control Flow From 42a688b3b70b434560afa33c6bad68c0e0d8c4d0 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 2 Dec 2011 16:11:42 +0100 Subject: [PATCH 02/60] fix dolphin painting in new project wizard (IDEA-78084) --- .../src/com/intellij/ide/wizard/AbstractWizard.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java b/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java index 761d8fc96927..d52b65bc31ac 100644 --- a/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java +++ b/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java @@ -217,11 +217,11 @@ public abstract class AbstractWizard extends DialogWrapper { myIcon.paintIcon(this, gg, 0, 0); final Rectangle bounds = g.getClipBounds(); - int y = bounds.y; + int y = myIcon.getIconHeight()-10; while (y < bounds.y + bounds.height) { g.drawImage(image, bounds.x, y, bounds.x + bounds.width, y + 5, - 0, myIcon.getIconHeight() - 10, bounds.width, myIcon.getIconHeight() - 5, this); + 0, myIcon.getIconHeight() - 15, bounds.width, myIcon.getIconHeight() - 10, this); y += 5; } From aa80df5db631ed12b6723c194e04bfc1690f77e0 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 2 Dec 2011 16:51:41 +0100 Subject: [PATCH 03/60] fix Alt-Q going repeatedly up in hierarchy (IDEA-77791) --- .../hint/ShowContainerInfoHandler.java | 69 +++++++++++-------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hint/ShowContainerInfoHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/hint/ShowContainerInfoHandler.java index 8ef7ca97e746..92fb7bd5dd00 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hint/ShowContainerInfoHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/hint/ShowContainerInfoHandler.java @@ -37,58 +37,73 @@ import java.lang.ref.WeakReference; public class ShowContainerInfoHandler implements CodeInsightActionHandler { private static final Key> MY_LAST_HINT_KEY = Key.create("MY_LAST_HINT_KEY"); + private static final Key CONTAINER_KEY = Key.create("CONTAINER_KEY"); public void invoke(@NotNull final Project project, @NotNull final Editor editor, @NotNull PsiFile file) { PsiDocumentManager.getInstance(project).commitAllDocuments(); - + PsiElement container = null; WeakReference ref = editor.getUserData(MY_LAST_HINT_KEY); if (ref != null){ LightweightHint hint = ref.get(); if (hint != null && hint.isVisible()){ hint.hide(); + container = hint.getUserData(CONTAINER_KEY); + if (container != null && !container.isValid()){ + container = null; + } } } - PsiElement container = null; - StructureViewBuilder builder = LanguageStructureViewBuilder.INSTANCE.getStructureViewBuilder(file); - if (builder instanceof TreeBasedStructureViewBuilder) { - StructureViewModel model = ((TreeBasedStructureViewBuilder) builder).createStructureViewModel(); + StructureViewBuilder builder = LanguageStructureViewBuilder.INSTANCE.getStructureViewBuilder(file); + if (builder instanceof TreeBasedStructureViewBuilder) { + StructureViewModel model = ((TreeBasedStructureViewBuilder) builder).createStructureViewModel(); + boolean goOneLevelUp = true; + if (container == null) { + goOneLevelUp = false; Object element = model.getCurrentEditorElement(); if (element instanceof PsiElement) { container = (PsiElement) element; - while(true) { - if (container == null || container instanceof PsiFile) { - return; - } - if (!isDeclarationVisible(container, editor)) { - break; - } - - container = container.getParent(); - while(container != null && DeclarationRangeUtil.getPossibleDeclarationAtRange(container) == null) { - container = container.getParent(); - if (container instanceof PsiFile) return; - } - } } } - if (container == null) { - return; + while(true) { + if (container == null || container instanceof PsiFile) { + return; + } + if (goOneLevelUp) { + goOneLevelUp = false; + } + else { + if (!isDeclarationVisible(container, editor)) { + break; + } + } + + container = container.getParent(); + while(container != null && DeclarationRangeUtil.getPossibleDeclarationAtRange(container) == null) { + container = container.getParent(); + if (container instanceof PsiFile) return; + } } + } + if (container == null) { + return; + } final TextRange range = DeclarationRangeUtil.getPossibleDeclarationAtRange(container); if (range == null) { return; } + final PsiElement _container = container; ApplicationManager.getApplication().invokeLater(new Runnable() { - public void run() { - LightweightHint hint = EditorFragmentComponent.showEditorFragmentHint(editor, range, true, true); - if (hint != null) { - editor.putUserData(MY_LAST_HINT_KEY, new WeakReference(hint)); - } + public void run() { + LightweightHint hint = EditorFragmentComponent.showEditorFragmentHint(editor, range, true, true); + if (hint != null) { + hint.putUserData(CONTAINER_KEY, _container); + editor.putUserData(MY_LAST_HINT_KEY, new WeakReference(hint)); } - }); + } + }); } public boolean startInWriteAction() { From e4deac98b983b7a11ad9459afc3190fe1ad33355 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 2 Dec 2011 16:55:51 +0100 Subject: [PATCH 04/60] use short revision number for VCS virtual file tab title --- .../com/intellij/openapi/vcs/vfs/VcsVirtualFile.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/vfs/VcsVirtualFile.java b/platform/vcs-api/src/com/intellij/openapi/vcs/vfs/VcsVirtualFile.java index a0ae2a47cb52..4a1953f02f4c 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/vfs/VcsVirtualFile.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/vfs/VcsVirtualFile.java @@ -21,7 +21,9 @@ import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.vcs.VcsBundle; import com.intellij.openapi.vcs.VcsException; +import com.intellij.openapi.vcs.history.ShortVcsRevisionNumber; import com.intellij.openapi.vcs.history.VcsFileRevision; +import com.intellij.openapi.vcs.history.VcsRevisionNumber; import com.intellij.openapi.vfs.CharsetToolkit; import com.intellij.openapi.vfs.VirtualFileSystem; import com.intellij.util.ArrayUtil; @@ -76,7 +78,13 @@ public class VcsVirtualFile extends AbstractVcsVirtualFile { fireBeforeContentsChange(); myModificationStamp++; - setRevision(myFileRevision.getRevisionNumber().asString()); + final VcsRevisionNumber revisionNumber = myFileRevision.getRevisionNumber(); + if (revisionNumber instanceof ShortVcsRevisionNumber) { + setRevision(((ShortVcsRevisionNumber) revisionNumber).toShortString()); + } + else { + setRevision(revisionNumber.asString()); + } myContent = myFileRevision.getContent(); myCharset = new CharsetToolkit(myContent).guessEncoding(myContent.length); ApplicationManager.getApplication().runWriteAction(new Runnable() { From 7199e71409c287745c4c06538fb428553a76a6d1 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 2 Dec 2011 17:07:57 +0100 Subject: [PATCH 05/60] don't add cross button if we don't have space for it (IDEA-77240) --- .../openapi/wm/impl/welcomeScreen/WelcomeScreen.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/WelcomeScreen.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/WelcomeScreen.java index 661617b07101..9ad2d8a6ec62 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/WelcomeScreen.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/WelcomeScreen.java @@ -310,7 +310,9 @@ public class WelcomeScreen implements Disposable { @Override public void mouseEntered(MouseEvent e) { - actionLabel.setIcon(IconLoader.getIcon("/actions/closeNew.png")); + if (actionLabel.getSize().width > actionLabel.getPreferredSize().width) { + actionLabel.setIcon(IconLoader.getIcon("/actions/closeNew.png")); + } } @Override @@ -412,8 +414,8 @@ public class WelcomeScreen implements Disposable { else { final Comparator pluginsComparator = new Comparator() { public int compare(final IdeaPluginDescriptor o1, final IdeaPluginDescriptor o2) { - final boolean e1 = ((IdeaPluginDescriptorImpl)o1).isEnabled(); - final boolean e2 = ((IdeaPluginDescriptorImpl)o2).isEnabled(); + final boolean e1 = o1.isEnabled(); + final boolean e2 = o2.isEnabled(); if (e1 && !e2) return -1; if (!e1 && e2) return 1; return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase()); @@ -586,7 +588,7 @@ public class WelcomeScreen implements Disposable { if (r.getWidth() > maxWidth) { - StringBuffer prefix = new StringBuffer(); + StringBuilder prefix = new StringBuilder(); String suffix = string; int maxIdxPerLine = (int)(maxWidth / r.getWidth() * string.length()); int lengthLeft = string.length(); From 5cce14d18f6db1f0f73e3c3b069a3d9528a77290 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 2 Dec 2011 17:48:38 +0100 Subject: [PATCH 06/60] tips of the day update (IDEA-75847) --- platform/platform-resources-en/src/tips/GoToAction.html | 2 +- platform/platform-resources-en/src/tips/GoToClass.html | 4 ++-- .../platform-resources-en/src/tips/GoToInspection.html | 7 +++---- platform/platform-resources-en/src/tips/GoToSymbol.html | 2 +- .../platform-resources-en/src/tips/GotoLineInFile.html | 2 +- .../src/tips/HighlightUsagesInFile.html | 2 +- .../platform-resources-en/src/tips/JumpToLastEdit.html | 2 +- .../src/tips/QuickJavaDocInLookups.html | 2 +- platform/platform-resources-en/src/tips/ShowUsages.html | 2 +- .../src/tips/WildcardsInNavigationPopups.html | 4 ++-- 10 files changed, 14 insertions(+), 15 deletions(-) diff --git a/platform/platform-resources-en/src/tips/GoToAction.html b/platform/platform-resources-en/src/tips/GoToAction.html index 1938ed5092af..89a93e95e3f2 100644 --- a/platform/platform-resources-en/src/tips/GoToAction.html +++ b/platform/platform-resources-en/src/tips/GoToAction.html @@ -7,7 +7,7 @@

To quickly find a menu command or toolbar action, you do not need to look through the menus. Just press &shortcut:GotoAction; - (Go To | Action on the main + (Help | Find Action on the main menu) and start typing the name of the action. Choose the desired action from the suggestion list.

diff --git a/platform/platform-resources-en/src/tips/GoToClass.html b/platform/platform-resources-en/src/tips/GoToClass.html index 65217d1789cc..93b6adf80036 100644 --- a/platform/platform-resources-en/src/tips/GoToClass.html +++ b/platform/platform-resources-en/src/tips/GoToClass.html @@ -5,12 +5,12 @@

To open any class in the editor quickly, press &shortcut:GotoClass; - (Go To | Class) + (Navigate | Class) and start typing the name of the class. Choose the class from a drop-down list that appears.

You can open any file in your project in a similar way by using &shortcut:GotoFile; - (Go To | File)

+ (Navigate | File)

diff --git a/platform/platform-resources-en/src/tips/GoToInspection.html b/platform/platform-resources-en/src/tips/GoToInspection.html index d91dae04fb2e..dabb6ef4fb51 100644 --- a/platform/platform-resources-en/src/tips/GoToInspection.html +++ b/platform/platform-resources-en/src/tips/GoToInspection.html @@ -5,11 +5,10 @@ -

To quickly find and run an inspection press +

To quickly find and run an inspection, press &shortcut:RunInspection; - (Go To | Inspection on the main - menu) and start typing the name of the inspection or its group. Choose the desired inspection from the suggestion list and - then select a desired scope.

+ and start typing the name of the inspection or its group. Choose the desired inspection from the suggestion list and + then specify the desired scope.

diff --git a/platform/platform-resources-en/src/tips/GoToSymbol.html b/platform/platform-resources-en/src/tips/GoToSymbol.html index 841a9cfa37d0..8a4cd3e47d41 100644 --- a/platform/platform-resources-en/src/tips/GoToSymbol.html +++ b/platform/platform-resources-en/src/tips/GoToSymbol.html @@ -6,7 +6,7 @@

To open any particular method or field in the editor quickly, press &shortcut:GotoSymbol; - (Go To | Symbol) + (Navigate | Symbol) and start typing its name.

Choose the symbol from a drop-down list that appears.

diff --git a/platform/platform-resources-en/src/tips/GotoLineInFile.html b/platform/platform-resources-en/src/tips/GotoLineInFile.html index cafe6b6ef6f4..cc44b74064f1 100644 --- a/platform/platform-resources-en/src/tips/GotoLineInFile.html +++ b/platform/platform-resources-en/src/tips/GotoLineInFile.html @@ -5,7 +5,7 @@

To open any class or file in the editor at the desired line, press &shortcut:GotoFile; - (Go To | File), + (Navigate | File), start typing the name, and choose the one from the suggestion list. Then type the colon (:) and a line number.

diff --git a/platform/platform-resources-en/src/tips/HighlightUsagesInFile.html b/platform/platform-resources-en/src/tips/HighlightUsagesInFile.html index a205f86760b9..d99b48cb00e8 100644 --- a/platform/platform-resources-en/src/tips/HighlightUsagesInFile.html +++ b/platform/platform-resources-en/src/tips/HighlightUsagesInFile.html @@ -5,7 +5,7 @@ -

Use &shortcut:HighlightUsagesInFile; (Search | Highlight Usages in File) +

Use &shortcut:HighlightUsagesInFile; (Edit | Find | Highlight Usages in File) to quickly highlight usages of some variable in the current file.

Use &shortcut:FindNext; and &shortcut:FindPrevious; keys to navigate through highlighted usages.

Press &shortcut:EditorEscape; to remove the highlighting.

diff --git a/platform/platform-resources-en/src/tips/JumpToLastEdit.html b/platform/platform-resources-en/src/tips/JumpToLastEdit.html index 6e570e7d708e..1438812f4e1d 100644 --- a/platform/platform-resources-en/src/tips/JumpToLastEdit.html +++ b/platform/platform-resources-en/src/tips/JumpToLastEdit.html @@ -5,7 +5,7 @@ -

&shortcut:JumpToLastChange; (Go To | Last Edit Location) +

&shortcut:JumpToLastChange; (Navigate | Last Edit Location) brings you back to the last place where you made changes in the code.

Pressing &shortcut:JumpToLastChange; a few times moves you deeper into your changes history.

diff --git a/platform/platform-resources-en/src/tips/QuickJavaDocInLookups.html b/platform/platform-resources-en/src/tips/QuickJavaDocInLookups.html index 5ba036c05010..6d06b6283e7f 100644 --- a/platform/platform-resources-en/src/tips/QuickJavaDocInLookups.html +++ b/platform/platform-resources-en/src/tips/QuickJavaDocInLookups.html @@ -8,7 +8,7 @@

The shortcuts such as &shortcut:QuickJavaDoc; (View | Quick Documentation), &shortcut:ParameterInfo; (View | Parameter Info), - &shortcut:GotoDeclaration; (Go To | Declaration) + &shortcut:GotoDeclaration; (Navigate | Declaration) and others can be used not only in the editor but in the code completion popup list as well.

diff --git a/platform/platform-resources-en/src/tips/ShowUsages.html b/platform/platform-resources-en/src/tips/ShowUsages.html index b7104d24bbe0..83e009ffab12 100644 --- a/platform/platform-resources-en/src/tips/ShowUsages.html +++ b/platform/platform-resources-en/src/tips/ShowUsages.html @@ -7,7 +7,7 @@

You can bring forward the list of all usages of a class, method or variable across the whole project, and quickly jump to the selected usage. To do that, place the caret at the symbol's name or at its usage - in code and press &shortcut:ShowUsages; (Search | Show Usages + in code and press &shortcut:ShowUsages; (Edit | Find | Show Usages in the main menu), scroll the list and click the desired usage.

diff --git a/platform/platform-resources-en/src/tips/WildcardsInNavigationPopups.html b/platform/platform-resources-en/src/tips/WildcardsInNavigationPopups.html index 56786c9ddaf5..35b613eff122 100644 --- a/platform/platform-resources-en/src/tips/WildcardsInNavigationPopups.html +++ b/platform/platform-resources-en/src/tips/WildcardsInNavigationPopups.html @@ -7,8 +7,8 @@

For the pattern search in the Go to Class, Go to Symbol and - Go to File popups, - you can use * and space symbols.

+ Go to File pop-up frames, + use * and space symbols.

* stands for any symbol.

Space at the end means the end of a pattern, and the preceding string will be considered not just a prefix but a whole pattern. The list of the suggested names will be reduced accordingly.

From fcd13fbdc5aab4545eb0156a0209333d5752c995 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 2 Dec 2011 18:53:13 +0100 Subject: [PATCH 07/60] don't complain about directory not being writable if it doesn't exist (IDEA-77763) --- .../com/intellij/ide/util/newProjectWizard/ProjectNameStep.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/ProjectNameStep.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/ProjectNameStep.java index cd856b7c3ab4..c271ba377f4d 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/ProjectNameStep.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/ProjectNameStep.java @@ -152,7 +152,7 @@ public class ProjectNameStep extends ModuleWizardStep { } final File file = new File(projectFileDirectory); - if (!file.canWrite()) { + if (file.exists() && !file.canWrite()) { throw new ConfigurationException(String.format("Directory '%s' is not writable!\nPlease choose another project location.", projectFileDirectory)); } From 75bcdca0935cc2836e2a0a9c4bb9e7deafb5fb82 Mon Sep 17 00:00:00 2001 From: Evgeny Zakrevsky Date: Fri, 25 Nov 2011 20:20:47 +0300 Subject: [PATCH 08/60] IDEA-76845 'Paths affected in revision' dialog: frame AND separator look ugly --- .../src/com/intellij/openapi/vcs/changes/ChangesViewManager.java | 1 - .../intellij/openapi/vcs/changes/ui/ChangeListViewerDialog.java | 1 - 2 files changed, 2 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java index c27716f62009..6b82dc03f532 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java @@ -313,7 +313,6 @@ public class ChangesViewManager implements ChangesViewI, JDOMExternalizable, Pro final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myView); final JPanel wrapper = new JPanel(new BorderLayout()); wrapper.add(scrollPane, BorderLayout.CENTER); - mySplitter.setShowDividerControls(true); mySplitter.setFirstComponent(wrapper); content.add(mySplitter, BorderLayout.CENTER); content.add(myProgressLabel, BorderLayout.SOUTH); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangeListViewerDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangeListViewerDialog.java index 57515ce1d6b7..dfd29fc13cd6 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangeListViewerDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangeListViewerDialog.java @@ -165,7 +165,6 @@ public class ChangeListViewerDialog extends DialogWrapper implements DataProvide commitPanel.add(commitMessageScroll, BorderLayout.CENTER); splitter.setSecondComponent(commitPanel); - splitter.setShowDividerControls(true); } mainPanel.add(splitter, BorderLayout.CENTER); From b41a65f1b0a8225dbd671f365f2ab36c8def3620 Mon Sep 17 00:00:00 2001 From: Evgeny Zakrevsky Date: Fri, 25 Nov 2011 20:35:46 +0300 Subject: [PATCH 09/60] IDEA-77649 Splitters are incorrectly resized --- .../com/intellij/openapi/options/newEditor/OptionsEditor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java index cff762ce268a..e72b7a38cbff 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java @@ -207,12 +207,12 @@ public class OptionsEditor extends JPanel implements DataProvider, Place.Navigat myLeftSide.add(mySearchWrapper, BorderLayout.NORTH); myLeftSide.add(myTree, BorderLayout.CENTER); - myLeftSide.setMinimumSize(new Dimension(150, -1)); setLayout(new BorderLayout()); myMainSplitter = new Splitter(false); myMainSplitter.setFirstComponent(myLeftSide); + myMainSplitter.setHonorComponentsMinimumSize(false); myLoadingDecorator = new LoadingDecorator(myOwnDetails.getComponent(), this, 150); myMainSplitter.setSecondComponent(myLoadingDecorator.getComponent()); From 3cf1912e917dc4b1ea311e7316f7a7cd1ea08435 Mon Sep 17 00:00:00 2001 From: Evgeny Zakrevsky Date: Mon, 28 Nov 2011 20:49:24 +0300 Subject: [PATCH 10/60] IDEA-77664 Unify dialog title borders --- .../git4idea/src/git4idea/update/GitUpdateOptionsPanel.form | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/git4idea/src/git4idea/update/GitUpdateOptionsPanel.form b/plugins/git4idea/src/git4idea/update/GitUpdateOptionsPanel.form index ec4d512199fb..db27637ca0c1 100644 --- a/plugins/git4idea/src/git4idea/update/GitUpdateOptionsPanel.form +++ b/plugins/git4idea/src/git4idea/update/GitUpdateOptionsPanel.form @@ -15,7 +15,7 @@ - + @@ -56,7 +56,7 @@ - + From 7569a17648265fdab66509cc299b687a5e812e87 Mon Sep 17 00:00:00 2001 From: Evgeny Zakrevsky Date: Thu, 1 Dec 2011 20:58:05 +0300 Subject: [PATCH 11/60] Project Structure dialog. Some forms refactored. --- .../intellij/facet/impl/ui/FacetEditorImpl.java | 7 ++++++- .../ui/configuration/AnnotationsEditor.java | 14 ++++++-------- .../roots/ui/configuration/JavadocEditor.java | 17 +++++++---------- .../roots/ui/configuration/OutputEditor.java | 9 +++++---- .../artifacts/ArtifactEditorImpl.java | 6 ++---- .../intellij/ide/plugins/PluginManagerMain.java | 1 - .../src/messages/ProjectBundle.properties | 4 ++-- .../resources/messages/AndroidBundle.properties | 4 ++-- 8 files changed, 30 insertions(+), 32 deletions(-) diff --git a/java/idea-ui/src/com/intellij/facet/impl/ui/FacetEditorImpl.java b/java/idea-ui/src/com/intellij/facet/impl/ui/FacetEditorImpl.java index 78af4b89e87b..de8bbb9f157a 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/ui/FacetEditorImpl.java +++ b/java/idea-ui/src/com/intellij/facet/impl/ui/FacetEditorImpl.java @@ -28,6 +28,7 @@ import com.intellij.openapi.options.UnnamedConfigurable; import com.intellij.openapi.options.UnnamedConfigurableGroup; import com.intellij.openapi.util.Disposer; import com.intellij.ui.TabbedPaneWrapper; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -77,7 +78,11 @@ public class FacetEditorImpl extends UnnamedConfigurableGroup implements Unnamed if (myEditorTabs.length > 1) { final TabbedPaneWrapper tabbedPane = new TabbedPaneWrapper(myDisposable); for (FacetEditorTab editorTab : myEditorTabs) { - tabbedPane.addTab(editorTab.getDisplayName(), editorTab.getIcon(), editorTab.createComponent(), null); + JComponent c = editorTab.createComponent(); + if (c != null) { + UIUtil.addInsets(c, UIUtil.PANEL_SMALL_INSETS); + } + tabbedPane.addTab(editorTab.getDisplayName(), editorTab.getIcon(), c, null); } tabbedPane.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/AnnotationsEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/AnnotationsEditor.java index 9b4f8c0f7016..082ecbaef263 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/AnnotationsEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/AnnotationsEditor.java @@ -20,15 +20,16 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.roots.AnnotationOrderRootType; -import com.intellij.openapi.ui.PanelWithText; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.ColoredTableCellRenderer; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.TableUtil; +import com.intellij.ui.components.JBLabel; import com.intellij.util.ArrayUtil; import com.intellij.util.ui.ItemRemovable; import com.intellij.util.ui.Table; +import com.intellij.util.ui.UIUtil; import javax.swing.*; import javax.swing.border.Border; @@ -81,8 +82,7 @@ public class AnnotationsEditor extends ModuleElementsEditor { } public JComponent createComponentImpl() { - final JPanel mainPanel = new JPanel(new BorderLayout()); - mainPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); + final JPanel mainPanel = new JPanel(new BorderLayout(5, 10)); mainPanel.setPreferredSize(new Dimension(-1, 200)); final DefaultTableModel tableModel = createModel(); myTable = new Table(tableModel); @@ -109,14 +109,12 @@ public class AnnotationsEditor extends ModuleElementsEditor { }); final JPanel panel = new JPanel(new GridBagLayout()); - panel.add(myAddPathButton, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 6, 0, 0), 0, 0)); - panel.add(myRemoveButton, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(6, 6, 0, 0), 0, 0)); + panel.add(myAddPathButton, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); + panel.add(myRemoveButton, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(4, 0, 0, 0), 0, 0)); mainPanel.add(ScrollPaneFactory.createScrollPane(myTable), BorderLayout.CENTER); mainPanel.add(panel, BorderLayout.EAST); - final PanelWithText panelWithText = new PanelWithText(ProjectBundle.message("project.roots.external.annotations.description")); - panelWithText.setBorder(null); - mainPanel.add(panelWithText, BorderLayout.NORTH); + mainPanel.add(new JBLabel(ProjectBundle.message("project.roots.external.annotations.description"), UIUtil.ComponentStyle.SMALL, UIUtil.FontColor.BRIGHTER), BorderLayout.NORTH); myTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavadocEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavadocEditor.java index 2ae3030d7d00..4cbb4489199b 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavadocEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavadocEditor.java @@ -21,15 +21,16 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.projectRoots.ui.Util; import com.intellij.openapi.roots.JavadocOrderRootType; -import com.intellij.openapi.ui.PanelWithText; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.ColoredTableCellRenderer; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.TableUtil; +import com.intellij.ui.components.JBLabel; import com.intellij.util.ArrayUtil; import com.intellij.util.ui.ItemRemovable; import com.intellij.util.ui.Table; +import com.intellij.util.ui.UIUtil; import javax.swing.*; import javax.swing.border.Border; @@ -83,9 +84,7 @@ public class JavadocEditor extends ModuleElementsEditor { } public JComponent createComponentImpl() { - final JPanel mainPanel = new JPanel(new BorderLayout()); - mainPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); - mainPanel.setPreferredSize(new Dimension(-1, 200)); + final JPanel mainPanel = new JPanel(new BorderLayout(5, 10)); final DefaultTableModel tableModel = createModel(); myTable = new Table(tableModel); myTable.setIntercellSpacing(new Dimension(0, 0)); @@ -113,15 +112,13 @@ public class JavadocEditor extends ModuleElementsEditor { }); final JPanel panel = new JPanel(new GridBagLayout()); - panel.add(myAddPathButton, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 6, 0, 0), 0, 0)); - panel.add(myAddUrlButton, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(6, 6, 0, 0), 0, 0)); - panel.add(myRemoveButton, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(6, 6, 0, 0), 0, 0)); + panel.add(myAddPathButton, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); + panel.add(myAddUrlButton, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(4, 0, 0, 0), 0, 0)); + panel.add(myRemoveButton, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(4, 0, 0, 0), 0, 0)); mainPanel.add(ScrollPaneFactory.createScrollPane(myTable), BorderLayout.CENTER); mainPanel.add(panel, BorderLayout.EAST); - final PanelWithText panelWithText = new PanelWithText(ProjectBundle.message("project.roots.javadoc.tab.description")); - panelWithText.setBorder(null); - mainPanel.add(panelWithText, BorderLayout.NORTH); + mainPanel.add(new JBLabel(ProjectBundle.message("project.roots.javadoc.tab.description"), UIUtil.ComponentStyle.SMALL, UIUtil.FontColor.BRIGHTER), BorderLayout.NORTH); myTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/OutputEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/OutputEditor.java index 9b9cecbce37d..1f6c7e98882a 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/OutputEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/OutputEditor.java @@ -24,10 +24,12 @@ package com.intellij.openapi.roots.ui.configuration; import com.intellij.openapi.project.ProjectBundle; import com.intellij.ui.IdeBorderFactory; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.border.EmptyBorder; import java.awt.*; public class OutputEditor extends ModuleElementsEditor { @@ -44,18 +46,17 @@ public class OutputEditor extends ModuleElementsEditor { protected JComponent createComponentImpl() { final JPanel panel = new JPanel(new GridBagLayout()); + panel.setBorder(new EmptyBorder(UIUtil.PANEL_SMALL_INSETS)); final GridBagConstraints gc = - new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0); + new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0); panel.add(myCompilerOutputEditor.createComponentImpl(), gc); final JPanel javadocPanel = (JPanel)myJavadocEditor.createComponentImpl(); javadocPanel.setBorder(IdeBorderFactory.createTitledBorder(myJavadocEditor.getDisplayName(), false, false, true)); + gc.weighty = 1; panel.add(javadocPanel, gc); final JPanel annotationsPanel = (JPanel)myAnnotationsEditor.createComponentImpl(); annotationsPanel.setBorder(IdeBorderFactory.createTitledBorder(myAnnotationsEditor.getDisplayName(), false, false, true)); panel.add(annotationsPanel, gc); - panel.add(Box.createVerticalBox(), new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1, 1, GridBagConstraints.CENTER, - GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0)); - panel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); return panel; } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorImpl.java index f3959c21ff8a..c69cd57bc5af 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorImpl.java @@ -61,7 +61,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import javax.swing.border.Border; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import java.awt.*; @@ -198,8 +197,7 @@ public class ArtifactEditorImpl implements ArtifactEditorEx { Splitter splitter = new Splitter(false); final JPanel leftPanel = new JPanel(new BorderLayout()); leftPanel.add(myLayoutTreeComponent.getTreePanel(), BorderLayout.CENTER); - final Border border = BorderFactory.createEmptyBorder(3, 3, 3, 3); - leftPanel.setBorder(border); + leftPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 0)); splitter.setFirstComponent(leftPanel); final JPanel rightPanel = new JPanel(new BorderLayout()); @@ -224,7 +222,7 @@ public class ArtifactEditorImpl implements ArtifactEditorEx { rightTopPanel.add(labelPanel, BorderLayout.SOUTH); rightPanel.add(rightTopPanel, BorderLayout.NORTH); rightPanel.add(ScrollPaneFactory.createScrollPane(mySourceItemsTree), BorderLayout.CENTER); - rightPanel.setBorder(border); + rightPanel.setBorder(BorderFactory.createEmptyBorder(3, 0, 3, 3)); splitter.setSecondComponent(rightPanel); diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerMain.java b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerMain.java index d3a34ea078bc..3a51ce366750 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerMain.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerMain.java @@ -27,7 +27,6 @@ import com.intellij.openapi.actionSystem.ActionToolbar; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.options.Configurable; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.ui.Messages; diff --git a/platform/platform-resources-en/src/messages/ProjectBundle.properties b/platform/platform-resources-en/src/messages/ProjectBundle.properties index 2133db0e581e..ab1c4ae0ee85 100644 --- a/platform/platform-resources-en/src/messages/ProjectBundle.properties +++ b/platform/platform-resources-en/src/messages/ProjectBundle.properties @@ -316,7 +316,7 @@ project.roots.tooltip.library.has.broken.paths=Library ''{0}'' has broken {1, ch project.roots.error.message.invalid.roots=invalid {0} {1, choice, 1#root|2#roots} choose.modules.dialog.title=Choose Modules choose.modules.dialog.description=Library ''{0}'' will be added to the selected modules. -project.roots.javadoc.tab.description=Manage external JavaDocs attached to this module. External JavaDoc override JavaDoc annotations you might have in your module. +project.roots.javadoc.tab.description=Manage external JavaDocs attached to this module. External JavaDoc override JavaDoc annotations you might have in your module. project.roots.output.compiler.title=Compiler output project.roots.module.jdk.problem.message=Module SDK is not defined. project.roots.module.duplicate.name.message=duplicate module name @@ -338,7 +338,7 @@ external.annotations.suggestion.message=If you do not want annotatio sdk.configure.annotations.tab=Annotations project.roots.path.tab.title=Paths project.roots.external.annotations.tab.title=External Annotations -project.roots.external.annotations.description=Manage external annotations attached to this module. +project.roots.external.annotations.description=Manage external annotations attached to this module. add.external.annotations.path.title=Add path to external annotations add.external.annotations.path.description=Select path in which external annotations for module sources is located diff --git a/plugins/android/resources/messages/AndroidBundle.properties b/plugins/android/resources/messages/AndroidBundle.properties index 61c9e09482f2..5e2930c3a5a2 100644 --- a/plugins/android/resources/messages/AndroidBundle.properties +++ b/plugins/android/resources/messages/AndroidBundle.properties @@ -149,9 +149,9 @@ android.manifest.not.found.error=AndroidManifest.xml doesn't exist or has incorr android.apt.settings.title=AAPT Compiler android.aidl.settings.title=AIDL Compiler android.generate.r.java.checkbox=Re&generate R.java file when resources are changed -android.dest.directory.title=De&stination directory +android.dest.directory.title=De&stination directory\: android.generate.r.java.by.res.dir=Use res&ource directory specified at "Structure" section -android.use.custom.r.java.source.dir=Use custo&m resource directory +android.use.custom.r.java.source.dir=Use custo&m resource directory\: android.regenerate.idl.when.changed.checkbox=Regenerate &Java files when AIDL files are changed android.wizard.application.project.button=&Application android.wizard.lib.project.button=&Library From d29908fe459cf1a826c51f60471bc8559b384781 Mon Sep 17 00:00:00 2001 From: Evgeny Zakrevsky Date: Thu, 1 Dec 2011 21:03:43 +0300 Subject: [PATCH 12/60] IDEA-77431 Modules Configuration Window is ugly --- .../ConfigurationErrorsComponent.java | 5 +++-- .../ui/impl/DialogWrapperPeerImpl.java | 22 +------------------ .../util/src/com/intellij/util/ui/UIUtil.java | 17 ++++++++++++++ 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ConfigurationErrorsComponent.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ConfigurationErrorsComponent.java index 72e35ed64766..9233ad1d8c88 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ConfigurationErrorsComponent.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ConfigurationErrorsComponent.java @@ -135,6 +135,7 @@ public class ConfigurationErrorsComponent extends JPanel implements Disposable, add(myCurrentView.self(), BorderLayout.CENTER); myCurrentView.updateView(); + UIUtil.adjustWindowToMinimumSize(SwingUtilities.getWindowAncestor(this)); revalidate(); repaint(); } @@ -282,8 +283,8 @@ public class ConfigurationErrorsComponent extends JPanel implements Disposable, if (window != null) { final Dimension d = window.getSize(); final Dimension preferredSize = getPreferredSize(); - setPreferredSize(new Dimension(preferredSize.width, d.height / 4)); - setMinimumSize(new Dimension(preferredSize.width, 100)); + setPreferredSize(new Dimension(preferredSize.width, 200)); + setMinimumSize(getPreferredSize()); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java index 5e09f19f128f..2e2edd048091 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java @@ -937,27 +937,7 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra private class MyComponentListener extends ComponentAdapter { @SuppressWarnings({"RefusedBequest"}) public void componentResized(ComponentEvent e) { - final JRootPane pane = getRootPane(); - if (pane == null) return; - final Dimension minSize = pane.getMinimumSize(); - final Dimension size = pane.getSize(); - final Dimension winSize = getSize(); - if (minSize.width > size.width) { - winSize.width += minSize.width - size.width; - } - if (minSize.height > size.height) { - winSize.height += minSize.height - size.height; - } - - if (!winSize.equals(getSize())) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - if (isShowing()) { - setSize(winSize); - } - } - }); - } + UIUtil.adjustWindowToMinimumSize(getWindow()); } } diff --git a/platform/util/src/com/intellij/util/ui/UIUtil.java b/platform/util/src/com/intellij/util/ui/UIUtil.java index 2d9f73b9fcf9..d24d45272415 100644 --- a/platform/util/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/src/com/intellij/util/ui/UIUtil.java @@ -2555,5 +2555,22 @@ public class UIUtil { return ans; } + + public static void adjustWindowToMinimumSize(final Window window) { + if (window == null) return; + final Dimension minSize = window.getMinimumSize(); + final Dimension size = window.getSize(); + final Dimension newSize = new Dimension(Math.max(size.width, minSize.width), Math.max(size.height, minSize.height)); + + if (!newSize.equals(size)) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + if (window.isShowing()) { + window.setSize(newSize); + } + } + }); + } + } } From 8817724446e2d6242ff20793a3fc1a24f1c2c2e4 Mon Sep 17 00:00:00 2001 From: Evgeny Zakrevsky Date: Thu, 1 Dec 2011 21:07:15 +0300 Subject: [PATCH 13/60] Anchorable components. Correct getMinimumSize() method. --- .../src/com/intellij/ui/components/JBCheckBox.java | 13 +++++++++---- .../src/com/intellij/ui/components/JBLabel.java | 13 +++++++++++++ .../com/intellij/ui/components/JBRadioButton.java | 13 +++++++++---- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/components/JBCheckBox.java b/platform/platform-api/src/com/intellij/ui/components/JBCheckBox.java index 839146897853..d64551ddf6ef 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBCheckBox.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBCheckBox.java @@ -9,7 +9,7 @@ import java.awt.*; * @author evgeny.zakrevsky */ public class JBCheckBox extends JCheckBox implements AnchorableComponent { - private JComponent anchor; + private JComponent myAnchor; public JBCheckBox() { super(); @@ -46,18 +46,23 @@ public class JBCheckBox extends JCheckBox implements AnchorableComponent { @Override public JComponent getAnchor() { - return anchor; + return myAnchor; } @Override public void setAnchor(JComponent anchor) { if (this != anchor) { - this.anchor = anchor; + this.myAnchor = anchor; } } @Override public Dimension getPreferredSize() { - return anchor == null ? super.getPreferredSize() : anchor.getPreferredSize(); + return myAnchor == null ? super.getPreferredSize() : myAnchor.getPreferredSize(); + } + + @Override + public Dimension getMinimumSize() { + return myAnchor == null ? super.getMinimumSize() : myAnchor.getMinimumSize(); } } diff --git a/platform/platform-api/src/com/intellij/ui/components/JBLabel.java b/platform/platform-api/src/com/intellij/ui/components/JBLabel.java index e19c7d0fcfa7..4ced2491f3af 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBLabel.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBLabel.java @@ -30,9 +30,11 @@ public class JBLabel extends JLabel implements AnchorableComponent { private JComponent myAnchor = null; public JBLabel() { + super(); } public JBLabel(@NotNull UIUtil.ComponentStyle componentStyle) { + super(); setComponentStyle(componentStyle); } @@ -49,6 +51,12 @@ public class JBLabel extends JLabel implements AnchorableComponent { setComponentStyle(componentStyle); } + public JBLabel(@NotNull String text, @NotNull UIUtil.ComponentStyle componentStyle, @NotNull UIUtil.FontColor fontColor) { + super(text); + setComponentStyle(componentStyle); + setFontColor(fontColor); + } + public JBLabel(@NotNull String text, int horizontalAlignment) { super(text, horizontalAlignment); } @@ -101,4 +109,9 @@ public class JBLabel extends JLabel implements AnchorableComponent { public Dimension getPreferredSize() { return myAnchor == null ? super.getPreferredSize() : myAnchor.getPreferredSize(); } + + @Override + public Dimension getMinimumSize() { + return myAnchor == null ? super.getMinimumSize() : myAnchor.getMinimumSize(); + } } diff --git a/platform/platform-api/src/com/intellij/ui/components/JBRadioButton.java b/platform/platform-api/src/com/intellij/ui/components/JBRadioButton.java index 4d1f7432e944..a075495edf5e 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBRadioButton.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBRadioButton.java @@ -10,7 +10,7 @@ import java.awt.*; * @author evgeny.zakrevsky */ public class JBRadioButton extends JRadioButton implements AnchorableComponent { - private JComponent anchor; + private JComponent myAnchor; public JBRadioButton() { } @@ -45,18 +45,23 @@ public class JBRadioButton extends JRadioButton implements AnchorableComponent { @Override public JComponent getAnchor() { - return anchor; + return myAnchor; } @Override public void setAnchor(@Nullable JComponent anchor) { if (anchor != this) { - this.anchor = anchor; + this.myAnchor = anchor; } } @Override public Dimension getPreferredSize() { - return anchor == null ? super.getPreferredSize() : anchor.getPreferredSize(); + return myAnchor == null ? super.getPreferredSize() : myAnchor.getPreferredSize(); + } + + @Override + public Dimension getMinimumSize() { + return myAnchor == null ? super.getMinimumSize() : myAnchor.getMinimumSize(); } } From 6c1335d0c7193c28d77d046a22ce1b96d81794f0 Mon Sep 17 00:00:00 2001 From: Evgeny Zakrevsky Date: Thu, 1 Dec 2011 21:07:33 +0300 Subject: [PATCH 14/60] Minor fixes --- .../ui/SingleInspectionProfilePanel.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java index 45cb44146e42..909fa7e4e1c0 100644 --- a/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java +++ b/platform/lang-impl/src/com/intellij/profile/codeInspection/ui/SingleInspectionProfilePanel.java @@ -534,9 +534,6 @@ public class SingleInspectionProfilePanel extends JPanel { final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myTree); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); TreeUtil.collapseAll(myTree, 1); - final Dimension preferredSize = new Dimension(myTree.getPreferredSize().width + 20, scrollPane.getPreferredSize().height); - //scrollPane.setPreferredSize(preferredSize); - //scrollPane.setMinimumSize(preferredSize); myTree.addTreeExpansionListener(new TreeExpansionListener() { @@ -566,7 +563,6 @@ public class SingleInspectionProfilePanel extends JPanel { myTreeExpander = new DefaultTreeExpander(myTree); myProfileFilter = new MyFilterComponent(); - myProfileFilter.setPreferredSize(new Dimension(100, -1)); return scrollPane; } @@ -905,10 +901,10 @@ public class SingleInspectionProfilePanel extends JPanel { final JScrollPane tree = initTreeScrollPane(); treePanel.add(tree, BorderLayout.CENTER); - final JPanel northPanel = new JPanel(new BorderLayout()); + final JPanel northPanel = new JPanel(new GridBagLayout()); northPanel.setBorder(IdeBorderFactory.createEmptyBorder(2, 0, 2, 0)); - northPanel.add(createTreeToolbarPanel().getComponent(), BorderLayout.CENTER); - northPanel.add(myProfileFilter, BorderLayout.EAST); + northPanel.add(createTreeToolbarPanel().getComponent(), new GridBagConstraints(0, 0, 1, 1, 0.5, 1, GridBagConstraints.BASELINE_LEADING, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); + northPanel.add(myProfileFilter, new GridBagConstraints(1, 0, 1, 1, 1, 1, GridBagConstraints.BASELINE_TRAILING, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); treePanel.add(northPanel, BorderLayout.NORTH); myMainSplitter = new Splitter(false); @@ -919,7 +915,6 @@ public class SingleInspectionProfilePanel extends JPanel { final JPanel panel = new JPanel(new BorderLayout()); panel.add(myMainSplitter, BorderLayout.CENTER); - panel.setBorder(IdeBorderFactory.createEmptyBorder(2, 2, 0, 2)); return panel; } From dd7b0c523d49e5304dbd55bb87ed6e60349bb088 Mon Sep 17 00:00:00 2001 From: Evgeny Zakrevsky Date: Fri, 2 Dec 2011 18:41:02 +0300 Subject: [PATCH 15/60] IDEA-76534 find in path dialog always has width 100% --- .../lang-impl/src/com/intellij/find/impl/FindDialog.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java b/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java index 98e8b48a1af8..01c6bb74aee3 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java @@ -806,7 +806,12 @@ public class FindDialog extends DialogWrapper { gbConstraints.gridx++; gbConstraints.weightx = 1; gbConstraints.gridwidth = 2; - myScopeCombo = new ScopeChooserCombo(myProject, true, true, FindSettings.getInstance().getDefaultScopeName()); + myScopeCombo = new ScopeChooserCombo(myProject, true, true, FindSettings.getInstance().getDefaultScopeName()) { + @Override + public Dimension getMinimumSize() { + return new Dimension(200, super.getMinimumSize().height); + } + }; Disposer.register(myDisposable, myScopeCombo); scopePanel.add(myScopeCombo, gbConstraints); From bc048a008dc012d18bf93fa17812be198cf1e401 Mon Sep 17 00:00:00 2001 From: Evgeny Zakrevsky Date: Fri, 2 Dec 2011 18:38:07 +0300 Subject: [PATCH 16/60] IDEA-77732 Diff View: splitter position is incorrect in diff window called from the Commit Dialog --- .../src/com/intellij/openapi/diff/impl/DiffSplitter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffSplitter.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffSplitter.java index 6da18259ece1..5f4507dcfad3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffSplitter.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffSplitter.java @@ -40,6 +40,7 @@ class DiffSplitter extends Splitter implements DiffSplitterI { setDividerWidth(30); setFirstComponent(component1); setSecondComponent(component2); + setHonorComponentsMinimumSize(false); } protected Splitter.Divider createDivider() { From 02cc81bce99e4873a028225ab8f381dd42b2b11b Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 2 Dec 2011 15:31:05 +0100 Subject: [PATCH 17/60] [yole] Log IDE name/ version/build date, JRE and JVM version/vendor --- .../src/com/intellij/idea/MainImpl.java | 15 +++++++++++++-- .../com/intellij/util/text/DateFormatUtil.java | 11 ++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/platform/platform-main/src/com/intellij/idea/MainImpl.java b/platform/platform-main/src/com/intellij/idea/MainImpl.java index 966c9da3f515..bd1dfa8060df 100644 --- a/platform/platform-main/src/com/intellij/idea/MainImpl.java +++ b/platform/platform-main/src/com/intellij/idea/MainImpl.java @@ -15,11 +15,15 @@ */ package com.intellij.idea; +import com.intellij.openapi.application.ApplicationInfo; +import com.intellij.openapi.application.ApplicationNamesInfo; import com.intellij.openapi.application.ConfigImportHelper; import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.application.impl.ApplicationInfoImpl; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.SystemInfo; import com.intellij.ui.AppUIUtil; +import com.intellij.util.text.DateFormatUtil; import com.intellij.util.ui.UIUtil; import javax.swing.*; @@ -63,10 +67,17 @@ public class MainImpl { Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook - logging") { public void run() { LOG.info( - "------------------------------------------------------ IDEA SHUTDOWN ------------------------------------------------------"); + "------------------------------------------------------ IDE SHUTDOWN ------------------------------------------------------"); } }); - LOG.info("------------------------------------------------------ IDEA STARTED ------------------------------------------------------"); + LOG.info("------------------------------------------------------ IDE STARTED ------------------------------------------------------"); + + final ApplicationInfo appInfo = ApplicationInfoImpl.getShadowInstance(); + final ApplicationNamesInfo namesInfo = ApplicationNamesInfo.getInstance(); + LOG.info("IDE: " + namesInfo.getFullProductName() + " (build #" + appInfo.getBuild() + ", " + + DateFormatUtil.formatBuildDate(appInfo.getBuildDate()) + ")"); + LOG.info("JRE: " + System.getProperty("java.runtime.version", "-") + " (" + System.getProperty("java.vendor", "-") + ")"); + LOG.info("JVM: " + System.getProperty("java.vm.version", "-") + " (" + System.getProperty("java.vm.vendor", "-") + ")"); _main(args); } diff --git a/platform/util/src/com/intellij/util/text/DateFormatUtil.java b/platform/util/src/com/intellij/util/text/DateFormatUtil.java index 1ba2b7ca3d10..73f839109c23 100644 --- a/platform/util/src/com/intellij/util/text/DateFormatUtil.java +++ b/platform/util/src/com/intellij/util/text/DateFormatUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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,7 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; +import java.util.Locale; public class DateFormatUtil { private static final Logger LOG = Logger.getInstance("com.intellij.util.text.DateFormatUtil"); @@ -38,6 +39,9 @@ public class DateFormatUtil { private static final SyncDateFormat TIME_WITH_SECONDS_FORMAT = getFormat(DateFormat.MEDIUM, DateType.TIME); private static final SyncDateFormat DATE_TIME_FORMAT = getFormat(DateFormat.SHORT, DateType.DATETIME); + // fixed formats - should be locale-independent + private static final SimpleDateFormat BUILD_DATE_FORMAT = new SimpleDateFormat("dd MMM yyyy HH:ss", Locale.US); + public static final long SECOND = 1000; public static final long MINUTE = SECOND * 60; public static final long HOUR = MINUTE * 60; @@ -464,4 +468,9 @@ public class DateFormatUtil { private static final int MacFormatterLongStyle = 3; private static final int MacFormatterFullStyle = 4; private static final int MacFormatterBehavior_10_4 = 1040; + + @NotNull + public static String formatBuildDate(@NotNull Calendar cal) { + return BUILD_DATE_FORMAT.format(cal.getTime()); + } } \ No newline at end of file From e81184bae432ab5cbdb6b4409916cfa9c2cea2fd Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 2 Dec 2011 15:47:01 +0100 Subject: [PATCH 18/60] Unified dates in About dialog --- .../com/intellij/ide/actions/AboutAction.java | 26 +++++++++---------- .../intellij/util/text/DateFormatUtil.java | 6 +++++ .../util/text/DateFormatUtilTest.java | 24 ++++++++++++----- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/actions/AboutAction.java b/platform/platform-impl/src/com/intellij/ide/actions/AboutAction.java index 129086171e26..f0edf9dcda29 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/AboutAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/AboutAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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. @@ -24,7 +24,6 @@ import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.application.ApplicationInfo; import com.intellij.openapi.application.ApplicationNamesInfo; import com.intellij.openapi.application.ex.ApplicationInfoEx; -import com.intellij.openapi.application.impl.ApplicationInfoImpl; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.SystemInfo; @@ -33,16 +32,18 @@ import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.openapi.wm.WindowManager; import com.intellij.ui.LicensingFacade; import com.intellij.util.ImageLoader; +import com.intellij.util.text.DateFormatUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; import javax.swing.*; import java.awt.*; import java.awt.event.*; -import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Calendar; import java.util.List; +import java.util.Properties; public class AboutAction extends AnAction implements DumbAware { @NonNls private static final String COMPANY_URL = "http://www.jetbrains.com/"; // TODO move to ApplicationInfo.xml @@ -178,11 +179,9 @@ public class AboutAction extends AnAction implements DumbAware { public InfoSurface(Image image) { myImage = image; - setOpaque(false); - //col = new Color(0xfa, 0xfa, 0xfa, 200); col = Color.white; - linkCol = ApplicationInfoImpl.getInstanceEx().getLogoTextColor(); + linkCol = ApplicationInfoEx.getInstanceEx().getLogoTextColor(); setBackground(col); ApplicationInfoEx ideInfo = (ApplicationInfoEx)ApplicationInfo.getInstance(); Calendar cal = ideInfo.getBuildDate(); @@ -192,9 +191,10 @@ public class AboutAction extends AnAction implements DumbAware { if (ideInfo.getBuild().isSnapshot()) { buildDate = new SimpleDateFormat("HH:mm, ").format(cal.getTime()); } - buildDate += DateFormat.getDateInstance(DateFormat.LONG).format(cal.getTime()); + buildDate += DateFormatUtil.formatAboutDialogDate(cal.getTime()); myLines.add(new AboutBoxLine(IdeBundle.message("aboutbox.build.date", buildDate))); myLines.add(new AboutBoxLine("")); + LicensingFacade provider = LicensingFacade.getInstance(); if (provider != null) { myLines.add(new AboutBoxLine(provider.getLicensedToMessage(), true, false)); @@ -204,13 +204,11 @@ public class AboutAction extends AnAction implements DumbAware { } myLines.add(new AboutBoxLine("")); - { - final Properties properties = System.getProperties(); - myLines.add(new AboutBoxLine(IdeBundle.message("aboutbox.jdk", properties.getProperty("java.version", "unknown")), true, false)); - myLines.add(new AboutBoxLine(IdeBundle.message("aboutbox.vm", properties.getProperty("java.vm.name", "unknown")))); - myLines.add(new AboutBoxLine(IdeBundle.message("aboutbox.vendor", properties.getProperty("java.vendor", "unknown")))); + final Properties properties = System.getProperties(); + myLines.add(new AboutBoxLine(IdeBundle.message("aboutbox.jdk", properties.getProperty("java.version", "unknown")), true, false)); + myLines.add(new AboutBoxLine(IdeBundle.message("aboutbox.vm", properties.getProperty("java.vm.name", "unknown")))); + myLines.add(new AboutBoxLine(IdeBundle.message("aboutbox.vendor", properties.getProperty("java.vendor", "unknown")))); - } myLines.add(new AboutBoxLine("")); myLines.add(new AboutBoxLine("JetBrains s.r.o.", true, false)); myLines.add(new AboutBoxLine(COMPANY_URL, true, true)); diff --git a/platform/util/src/com/intellij/util/text/DateFormatUtil.java b/platform/util/src/com/intellij/util/text/DateFormatUtil.java index 73f839109c23..1b4fd217a55c 100644 --- a/platform/util/src/com/intellij/util/text/DateFormatUtil.java +++ b/platform/util/src/com/intellij/util/text/DateFormatUtil.java @@ -41,6 +41,7 @@ public class DateFormatUtil { // fixed formats - should be locale-independent private static final SimpleDateFormat BUILD_DATE_FORMAT = new SimpleDateFormat("dd MMM yyyy HH:ss", Locale.US); + private static final DateFormat ABOUT_DATE_FORMAT = DateFormat.getDateInstance(DateFormat.LONG, Locale.US); public static final long SECOND = 1000; public static final long MINUTE = SECOND * 60; @@ -473,4 +474,9 @@ public class DateFormatUtil { public static String formatBuildDate(@NotNull Calendar cal) { return BUILD_DATE_FORMAT.format(cal.getTime()); } + + @NotNull + public static String formatAboutDialogDate(@NotNull Date date) { + return ABOUT_DATE_FORMAT.format(date); + } } \ No newline at end of file diff --git a/platform/util/testSrc/com/intellij/util/text/DateFormatUtilTest.java b/platform/util/testSrc/com/intellij/util/text/DateFormatUtilTest.java index 3756fdeab891..aa40d77c244c 100644 --- a/platform/util/testSrc/com/intellij/util/text/DateFormatUtilTest.java +++ b/platform/util/testSrc/com/intellij/util/text/DateFormatUtilTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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 java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.GregorianCalendar; public class DateFormatUtilTest extends TestCase { private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd.MM.yyyy hh.mm.ss"); @@ -70,16 +71,20 @@ public class DateFormatUtilTest extends TestCase { doTestDateTime("Yesterday " + DateFormatUtil.formatTime(DATE_FORMAT.parse("31.12.2003 15.00.00")), "31.12.2003 15.00.00"); } - private void doTestPrettyDate(String expected, String date) throws ParseException { + private static void doTestPrettyDate(String expected, String date) throws ParseException { assertEquals(expected, DateFormatUtil.formatPrettyDate(DATE_FORMAT.parse(date))); } - private void doTestDateTime(String expected, String date) throws ParseException { + private static void doTestDateTime(String expected, String date) throws ParseException { assertEquals(expected, DateFormatUtil.formatPrettyDateTime(DATE_FORMAT.parse(date))); } + private static Date date(final int year, final int month, final int day, final int hour, final int minute, final int second) { + return new GregorianCalendar(year, month - 1, day, hour, minute, second).getTime(); + } + public void testConvertingMacToJavaPattern() throws Throwable { - Clock.setTime(new Date(2004 - 1900, 1, 5, 16, 6, 7).getTime() + 8); + Clock.setTime(date(2004, 2, 5, 16, 6, 7).getTime() + 8); String mon = new SimpleDateFormat("MMM").format(Clock.getTime()); String month = new SimpleDateFormat("MMMMM").format(Clock.getTime()); @@ -110,7 +115,7 @@ public class DateFormatUtilTest extends TestCase { assertConvertedFormat("%", ""); } - private void assertConvertedFormat(String pattern, String expected) throws Throwable { + private static void assertConvertedFormat(String pattern, String expected) throws Throwable { String converted = DateFormatUtil.convertMacPattern(pattern); try { assertEquals(expected, new SimpleDateFormat(converted).format(Clock.getTime())); @@ -121,7 +126,7 @@ public class DateFormatUtilTest extends TestCase { } } - private void assertConvertedFormatMatches(String pattern, String expectedPattern) throws Throwable { + private static void assertConvertedFormatMatches(String pattern, String expectedPattern) throws Throwable { String converted = DateFormatUtil.convertMacPattern(pattern); try { String actual = new SimpleDateFormat(converted).format(Clock.getTime()); @@ -132,4 +137,11 @@ public class DateFormatUtilTest extends TestCase { throw e; } } + + public void testAboutDialogDataFormatter() throws Exception { + assertEquals("December 12, 2012", + DateFormatUtil.formatAboutDialogDate(date(2012, 12, 12, 15, 35, 12))); + assertEquals("January 1, 1999", + DateFormatUtil.formatAboutDialogDate(date(1999, 1, 1, 0, 0, 0))); + } } From 2687a7657d42331100e3791f0b68c0fe0037dea7 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 2 Dec 2011 19:59:51 +0100 Subject: [PATCH 19/60] New project wizard icons cropped --- .../src/add_plugin_modulewizard.png | Bin 29899 -> 31318 bytes community-resources/src/addmodulewizard.png | Bin 27611 -> 29107 bytes community-resources/src/newprojectwizard.png | Bin 27716 -> 29209 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/community-resources/src/add_plugin_modulewizard.png b/community-resources/src/add_plugin_modulewizard.png index df657e54941e5308941e9ef9178c30b27606d19c..c801584be711efff14cb6fc2617fe4cb9a26619f 100644 GIT binary patch literal 31318 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 literal 29899 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
  • ?I>by$H9r9W3+xdWeW6}tbq3}+N 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 literal 27611 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 Ml~$ChkT44TUw%=b%K!iX diff --git a/community-resources/src/newprojectwizard.png b/community-resources/src/newprojectwizard.png index 45dac3fa5f95d5f3b0035c791d858c2e671b6597..de8c2332ce8727717c26aa57403492f4c1784033 100644 GIT binary patch literal 29209 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 Rp4&*E`daH%`Af^-{{|aFOD5il5IJT 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 From dbc10e43e945684790d1f11cec7c33f61ca52490 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 2 Dec 2011 20:05:24 +0100 Subject: [PATCH 20/60] extract utility method --- .../wm/impl/welcomeScreen/WelcomeScreen.java | 14 +------------- .../util/src/com/intellij/util/ui/UIUtil.java | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/WelcomeScreen.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/WelcomeScreen.java index 9ad2d8a6ec62..eb225e263c86 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/WelcomeScreen.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/WelcomeScreen.java @@ -48,8 +48,6 @@ import java.awt.event.*; import java.awt.font.FontRenderContext; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; -import java.awt.image.BufferedImage; -import java.awt.image.PixelGrabber; import java.io.File; import java.util.*; import java.util.List; @@ -164,17 +162,7 @@ public class WelcomeScreen implements Disposable { myCaptionImage = IconLoader.getIcon(applicationInfoEx.getWelcomeScreenCaptionUrl()); myDeveloperSlogan = IconLoader.getIcon(applicationInfoEx.getWelcomeScreenDeveloperSloganUrl()); - BufferedImage image = new BufferedImage(myCaptionImage.getIconWidth(), myCaptionImage.getIconHeight(), BufferedImage.TYPE_INT_RGB); - myCaptionImage.paintIcon(null, image.getGraphics(), 0, 0); - final int[] pixels = new int[1]; - final PixelGrabber pixelGrabber = - new PixelGrabber(image, myCaptionImage.getIconWidth() - 1, myCaptionImage.getIconHeight() - 2, 1, 1, pixels, 0, 1); - try { - pixelGrabber.grabPixels(); - myCaptionBackground = new Color(pixels[0]); - } - catch (InterruptedException ignore) { - } + myCaptionBackground = UIUtil.getColorAt(myCaptionImage, myCaptionImage.getIconWidth() - 1, myCaptionImage.getIconHeight() - 2); } } diff --git a/platform/util/src/com/intellij/util/ui/UIUtil.java b/platform/util/src/com/intellij/util/ui/UIUtil.java index d24d45272415..af1493d52a01 100644 --- a/platform/util/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/src/com/intellij/util/ui/UIUtil.java @@ -55,6 +55,7 @@ import java.awt.*; import java.awt.event.*; import java.awt.font.FontRenderContext; import java.awt.image.BufferedImage; +import java.awt.image.PixelGrabber; import java.beans.PropertyChangeListener; import java.lang.ref.WeakReference; import java.lang.reflect.Field; @@ -2572,5 +2573,21 @@ public class UIUtil { }); } } + + @Nullable + public static Color getColorAt(final Icon icon, final int x, final int y) { + BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_RGB); + icon.paintIcon(null, image.getGraphics(), 0, 0); + final int[] pixels = new int[1]; + final PixelGrabber pixelGrabber = + new PixelGrabber(image, x, y, 1, 1, pixels, 0, 1); + try { + pixelGrabber.grabPixels(); + return new Color(pixels[0]); + } + catch (InterruptedException ignore) { + } + return null; + } } From 1e88c7df521ac43dc8217fb3c0425c18075f69c5 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 2 Dec 2011 20:09:18 +0100 Subject: [PATCH 21/60] correct fix for AbstractWizard --- .../src/com/intellij/ide/wizard/AbstractWizard.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java b/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java index d52b65bc31ac..c3605e2bc7e4 100644 --- a/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java +++ b/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java @@ -217,13 +217,13 @@ public abstract class AbstractWizard extends DialogWrapper { myIcon.paintIcon(this, gg, 0, 0); final Rectangle bounds = g.getClipBounds(); - int y = myIcon.getIconHeight()-10; + int y = myIcon.getIconHeight()-1; while (y < bounds.y + bounds.height) { g.drawImage(image, - bounds.x, y, bounds.x + bounds.width, y + 5, - 0, myIcon.getIconHeight() - 15, bounds.width, myIcon.getIconHeight() - 10, this); + bounds.x, y, bounds.x + bounds.width, y + 1, + 0, myIcon.getIconHeight() - 1, bounds.width, myIcon.getIconHeight(), this); - y += 5; + y++; } From 29d1bb0aa07277c7fdb98164da30b1c3d2774c64 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Fri, 2 Dec 2011 23:12:41 +0400 Subject: [PATCH 22/60] missing icon --- platform/icons/src/general/comboArrowDown.png | Bin 0 -> 945 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 platform/icons/src/general/comboArrowDown.png diff --git a/platform/icons/src/general/comboArrowDown.png b/platform/icons/src/general/comboArrowDown.png new file mode 100644 index 0000000000000000000000000000000000000000..96d6cca1c07d262f0668a4b7b173e6dcb72d3df9 GIT binary patch literal 945 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRV!3HF!2OrA@QY`6?zK#qG>ra@ocD-a^V4Ruh z>>S|f?5q$_l%JNFlghwQ!MJvkzc-Vk#4&mELmaOs{Z-`nmLg~3!YQN_z%N>6AgGi7 zde_PYuZ^suY8&1;ZGUk={)NazO{-swdss_56<#p2I8C4McCPFp=b-6qY2VDx+kD<< z{h4n;iRtN8nhdYh(r5)bzD0Oleu4!0FWBBe{=GZhB&T(Dmf@rs%53H*W>p z&jejnsZ)>Bl-$Orp(K7?*G=x}6bqem{_$BhylZqBlV7Qxyv|{Q$f6a)2DBDpT_R| z{VX_YZB&Ysx!0-+y_Ifj59WAZ<}LsEpDj-&z_%gfuvN;{qSn=%Rk3WUYodMgHcZ%+ z`N~_-RH{>l`@Z<(ABFiwcTG2gVzIy@vY3H^TNs2H8D`Cq0LENiW=KRygs+cPa(=E} zVoH8es$NBI0Z=sqgH44MkeQoWlBiITo0C^;Rbi_HR$&EXgM{^!6u?SKvTcyou+33T=(vIt?JufitFqn9{IEHY@CSNJ{`*GfZ!65dA z@qEGgQWI>1Js9;`4GK3X Date: Fri, 2 Dec 2011 23:03:34 +0300 Subject: [PATCH 23/60] matching foreign psi elements --- .../src/com/intellij/codeInsight/CodeInsightUtil.java | 2 ++ .../src/com/intellij/codeInsight/PsiEquivalenceUtil.java | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java b/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java index b036d3ab8487..eb4ccea4bfbd 100644 --- a/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java @@ -230,6 +230,8 @@ public class CodeInsightUtil { }, new Comparator() { @Override public int compare(PsiElement o1, PsiElement o2) { + if (!o1.textMatches(o2)) return 1; + if (o1 instanceof PsiDiamondTypeElementImpl && o2 instanceof PsiDiamondTypeElementImpl) { final PsiDiamondType.DiamondInferenceResult thisInferenceResult = new PsiDiamondTypeImpl(o1.getManager(), (PsiTypeElement)o1).resolveInferredTypes(); final PsiDiamondType.DiamondInferenceResult otherInferenceResult = new PsiDiamondTypeImpl(o2.getManager(), (PsiTypeElement)o2).resolveInferredTypes(); diff --git a/platform/lang-api/src/com/intellij/codeInsight/PsiEquivalenceUtil.java b/platform/lang-api/src/com/intellij/codeInsight/PsiEquivalenceUtil.java index e86dd5aa7469..4da3f17387eb 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/PsiEquivalenceUtil.java +++ b/platform/lang-api/src/com/intellij/codeInsight/PsiEquivalenceUtil.java @@ -72,8 +72,12 @@ public class PsiEquivalenceUtil { } if (children1.length == 0) { - if (!element1.textMatches(element2)) return false; - if (leafElementsComparator != null && leafElementsComparator.compare(element1, element2) != 0) return false; + if (leafElementsComparator != null) { + if (leafElementsComparator.compare(element1, element2) != 0) return false; + } + else { + if (!element1.textMatches(element2)) return false; + } } PsiReference ref1 = element1.getReference(); From d6e12af85d61eb08930552e75b4bb8b5d2b7647c Mon Sep 17 00:00:00 2001 From: Alexander Kirillin Date: Fri, 2 Dec 2011 23:06:19 +0300 Subject: [PATCH 24/60] introduce parameter in objc --- .../introduce/inplace/AbstractInplaceIntroducer.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/AbstractInplaceIntroducer.java b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/AbstractInplaceIntroducer.java index d7f668616ae5..d4a5663304ae 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/AbstractInplaceIntroducer.java +++ b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/AbstractInplaceIntroducer.java @@ -469,13 +469,17 @@ public abstract class AbstractInplaceIntroducer Date: Sat, 3 Dec 2011 10:42:50 +0100 Subject: [PATCH 25/60] Editor double-release assertion improved --- .../openapi/editor/impl/EditorFactoryImpl.java | 10 ++++++++-- .../com/intellij/openapi/editor/impl/EditorImpl.java | 6 ++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFactoryImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFactoryImpl.java index 1aded33a9a4d..d66aa92c7f35 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFactoryImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFactoryImpl.java @@ -42,6 +42,7 @@ import com.intellij.util.SmartList; import com.intellij.util.text.CharArrayCharSequence; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.ArrayList; @@ -104,7 +105,7 @@ public class EditorFactoryImpl extends EditorFactory { @NonNls public static String notReleasedError(@NotNull Editor editor) { - final String creator = editor.getUserData(EDITOR_CREATOR); + final String creator = getCreator(editor); if (creator == null) { return "Editor of " + editor.getClass() + " and the following text hasn't been released:\n" + editor.getDocument().getText(); @@ -114,6 +115,11 @@ public class EditorFactoryImpl extends EditorFactory { } } + @Nullable + static String getCreator(@NotNull Editor editor) { + return editor.getUserData(EDITOR_CREATOR); + } + @Override public void disposeComponent() { } @@ -200,8 +206,8 @@ public class EditorFactoryImpl extends EditorFactory { @Override public void releaseEditor(@NotNull Editor editor) { - editor.putUserData(EDITOR_CREATOR, null); ((EditorImpl)editor).release(); + editor.putUserData(EDITOR_CREATOR, null); myEditors.remove(editor); myEditorFactoryEventDispatcher.getMulticaster().editorReleased(new EditorFactoryEvent(this, editor)); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 293e379296e4..e0a2c305e1a0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -644,10 +644,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi public void release() { assertIsDispatchThread(); if (isReleased) { - VirtualFile file = FileDocumentManager.getInstance().getFile(myDocument); - String hint = file != null ? file.getPath() : myDocument.getText(TextRange.create(0, Math.min(100, myDocument.getTextLength()))); - LOG.error("Double release:\n" + - hint + "\n" + + LOG.error("Double release of editor:\n" + + EditorFactoryImpl.getCreator(this) + "\n" + "First released at: =====\n" + myReleasedAt + "\n======"); } From 6f07e64598d512ac963aee1bad62ac1151f987a2 Mon Sep 17 00:00:00 2001 From: irengrig Date: Sat, 3 Dec 2011 13:50:28 +0400 Subject: [PATCH 26/60] IDEA-77360 SVN doesn't work in build 110.492 (impossible to connect to some servers using SSL ) svnkit 8254, defaul protocol for SSL = SSLv3 --- plugins/svn4ideaOld/lib/svnkit.jar | Bin 1804758 -> 1804790 bytes plugins/svn4ideaOld/lib/svnkitsrc.zip | Bin 1224970 -> 1224997 bytes .../src/org/jetbrains/idea/svn/SvnVcs.java | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/svn4ideaOld/lib/svnkit.jar b/plugins/svn4ideaOld/lib/svnkit.jar index b8d9ddefa3b9534ac924746c07c8e80a5cac685a..8f24005aa1b82934ac4b6c789a4cf1a12bfc0d74 100644 GIT binary patch delta 39559 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
    _nkUlvM(hz*#|YedERl6rs7j? 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 N+gh+=N`Wt$`5(TSwq5`L delta 39482 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 Zj1{tLR}$1`xUl`~3eB%|K!zt8`hQDan}q-X diff --git a/plugins/svn4ideaOld/lib/svnkitsrc.zip b/plugins/svn4ideaOld/lib/svnkitsrc.zip index c72fb3099c6b60933db6aa3f10b269377afcf13c..bf85af1097eb69e019d4abdf48fcade2e487f3c8 100644 GIT binary patch delta 11472 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 R*oF0^oVMYVHc4?)_&*{nGUNaN delta 11150 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 diff --git a/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/SvnVcs.java b/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/SvnVcs.java index bff309d590ed..cbfc1286ee84 100644 --- a/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/SvnVcs.java +++ b/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/SvnVcs.java @@ -177,9 +177,9 @@ public class SvnVcs extends AbstractVcs { } initLogFilters(); - // Alexander Kitaev says it is default value (empty string) + // Alexander Kitaev says it is default value (SSLv3) - since 8254 if (System.getProperty(SVNKIT_HTTP_SSL_PROTOCOLS) == null) { - System.setProperty(SVNKIT_HTTP_SSL_PROTOCOLS, ""); + System.setProperty(SVNKIT_HTTP_SSL_PROTOCOLS, "SSLv3"); } } From 11b01a85f9537f9a7bcad7ae081c603fd9eb4105 Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Sat, 3 Dec 2011 14:40:37 +0400 Subject: [PATCH 27/60] IDEA-77884 Smart completion inserts qualified names for inner Groovy classes --- .../groovy/lang/GrReferenceAdjuster.java | 57 ++++++++++--------- .../GroovySmartCompletionTest.groovy | 6 +- ...InnerClassReferenceWithoutQualifier.groovy | 6 ++ ...lassReferenceWithoutQualifier_after.groovy | 6 ++ 4 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 plugins/groovy/testdata/groovy/completion/smart/InnerClassReferenceWithoutQualifier.groovy create mode 100644 plugins/groovy/testdata/groovy/completion/smart/InnerClassReferenceWithoutQualifier_after.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/GrReferenceAdjuster.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/GrReferenceAdjuster.java index df87b6bbfc29..67efad10bc79 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/GrReferenceAdjuster.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/GrReferenceAdjuster.java @@ -91,36 +91,38 @@ public class GrReferenceAdjuster { final PsiElement resolved = resolveRef(ref, uncomplete); if (resolved == null) return false; - if (!CodeStyleSettingsManager.getSettings(ref.getProject()).INSERT_INNER_CLASS_IMPORTS && resolved instanceof PsiClass && ((PsiClass)resolved).getContainingClass() != null) { - return false; - } - - final GrQualifiedReference copy = getCopy(ref); - - copy.setQualifier(null); - if (!copy.isReferenceTo(resolved)) { - if (resolved instanceof PsiClass) { - final GroovyFileBase file = (GroovyFileBase)ref.getContainingFile(); - final PsiClass clazz = (PsiClass)resolved; - final String qName = clazz.getQualifiedName(); - if (qName != null) { - if (addImports && mayInsertImport(ref)) { - final GrImportStatement added = file.addImportForClass(clazz); - if (!copy.isReferenceTo(resolved)) { - file.removeImport(added); - return false; - } - } - } - } - else { - return false; - } - } + if (!checkCopyWithoutQualifier(ref, addImports, resolved)) return false; ref.setQualifier(null); return true; } + private static boolean checkCopyWithoutQualifier(GrQualifiedReference ref, + boolean addImports, + PsiElement resolved) { + final GrQualifiedReference copy = getCopy(ref); + copy.setQualifier(null); + + if (copy.isReferenceTo(resolved)) return true; + + if (resolved instanceof PsiClass) { + final PsiClass clazz = (PsiClass)resolved; + final String qName = clazz.getQualifiedName(); + if (qName != null && addImports && checkIsInnerClass(clazz) && mayInsertImport(ref)) { + final GroovyFileBase file = (GroovyFileBase)ref.getContainingFile(); + final GrImportStatement added = file.addImportForClass(clazz); + if (copy.isReferenceTo(resolved)) return true; + file.removeImport(added); + } + } + + return false; + } + + private static boolean checkIsInnerClass(PsiClass resolved) { + final PsiClass containingClass = resolved.getContainingClass(); + return containingClass == null || CodeStyleSettingsManager.getSettings(resolved.getProject()).INSERT_INNER_CLASS_IMPORTS; + } + @Nullable private static PsiElement resolveRef(GrQualifiedReference ref, boolean uncomplete) { if (!uncomplete) return ref.resolve(); @@ -176,7 +178,8 @@ public class GrReferenceAdjuster { private static boolean mayInsertImport(GrQualifiedReference ref) { return PsiTreeUtil.getParentOfType(ref, GrDocComment.class) == null && !(ref.getContainingFile() instanceof GroovyCodeFragment) && - PsiTreeUtil.getParentOfType(ref, GrImportStatement.class) == null; + PsiTreeUtil.getParentOfType(ref, GrImportStatement.class) == null && + ref.getContainingFile() instanceof GroovyFileBase; } public static boolean seemsToBeQualifiedClassName(@Nullable GrExpression expr) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovySmartCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovySmartCompletionTest.groovy index 3e72331e0454..682bdcd4e37e 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovySmartCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovySmartCompletionTest.groovy @@ -18,10 +18,10 @@ package org.jetbrains.plugins.groovy.completion; import com.intellij.codeInsight.completion.CompletionType +import com.intellij.codeInsight.completion.StaticallyImportable import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiFile import org.jetbrains.plugins.groovy.util.TestUtils -import com.intellij.codeInsight.completion.StaticallyImportable /** * @author peter @@ -110,6 +110,10 @@ class Expected { Expected exp = fooField''' } + + void testInnerClassReferenceWithoutQualifier() { + doSmartTest() + } def getFileText(PsiFile file) { return PsiDocumentManager.getInstance(project).getDocument(file).text diff --git a/plugins/groovy/testdata/groovy/completion/smart/InnerClassReferenceWithoutQualifier.groovy b/plugins/groovy/testdata/groovy/completion/smart/InnerClassReferenceWithoutQualifier.groovy new file mode 100644 index 000000000000..c915cfa25dd4 --- /dev/null +++ b/plugins/groovy/testdata/groovy/completion/smart/InnerClassReferenceWithoutQualifier.groovy @@ -0,0 +1,6 @@ +class Foo { + static class Bar {} + { + List l = new AL + } +} \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/completion/smart/InnerClassReferenceWithoutQualifier_after.groovy b/plugins/groovy/testdata/groovy/completion/smart/InnerClassReferenceWithoutQualifier_after.groovy new file mode 100644 index 000000000000..c6d80a381f7a --- /dev/null +++ b/plugins/groovy/testdata/groovy/completion/smart/InnerClassReferenceWithoutQualifier_after.groovy @@ -0,0 +1,6 @@ +class Foo { + static class Bar {} + { + List l = new ArrayList() + } +} \ No newline at end of file From 181cf1beb5dc530e6a1a464f2c1d9f2b49d9681e Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Sat, 3 Dec 2011 15:16:26 +0400 Subject: [PATCH 28/60] EA-32398 - IOE: PsiFileImplUtil.checkSetName --- .../convertToJava/ConvertToJavaProcessor.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ConvertToJavaProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ConvertToJavaProcessor.java index c437d8b4aa39..472d6efe43a5 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ConvertToJavaProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ConvertToJavaProcessor.java @@ -20,14 +20,17 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.io.FileUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.refactoring.BaseRefactoringProcessor; +import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.ui.UsageViewDescriptorAdapter; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; +import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.hash.HashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; @@ -93,7 +96,20 @@ public class ConvertToJavaProcessor extends BaseRefactoringProcessor { document.setText(builder.toString()); PsiDocumentManager.getInstance(myProject).commitDocument(document); String fileName = getNewFileName(file); - PsiElement newFile = file.setName(fileName); + PsiElement newFile; + try { + newFile = file.setName(fileName); + } + catch (final IncorrectOperationException e) { + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + Messages.showMessageDialog(myProject, e.getMessage(), RefactoringBundle.message("error.title"), Messages.getErrorIcon()); + } + }); + return; + } + if (ApplicationManager.getApplication().isUnitTestMode()) return; // don't move classes to new files with corresponding class names and reformat From da8d7d40786994620707e278d9d3676b10054120 Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Sat, 3 Dec 2011 15:17:05 +0400 Subject: [PATCH 29/60] EA-32385 - assert: GroovyPsiElementFactoryImpl.createStatementFromText --- .../RemoveParenthesesFromMethodPredicate.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/RemoveParenthesesFromMethodPredicate.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/RemoveParenthesesFromMethodPredicate.java index e91359015fb3..7777942d78a6 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/RemoveParenthesesFromMethodPredicate.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/RemoveParenthesesFromMethodPredicate.java @@ -16,6 +16,7 @@ package org.jetbrains.plugins.groovy.intentions.conversions; import com.intellij.psi.PsiElement; +import com.intellij.util.IncorrectOperationException; import org.jetbrains.plugins.groovy.intentions.base.PsiElementPredicate; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; @@ -50,8 +51,13 @@ class RemoveParenthesesFromMethodPredicate implements PsiElementPredicate { if (rightParen != null) rightParen.delete(); newStatementText.append(argumentList.getText()); } - final GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(element.getProject()); - final GrStatement newStatement = factory.createStatementFromText(newStatementText.toString()); + final GrStatement newStatement; + try { + newStatement = GroovyPsiElementFactory.getInstance(element.getProject()).createStatementFromText(newStatementText.toString()); + } + catch (IncorrectOperationException e) { + return false; + } if (newStatement instanceof GrApplicationStatement) { final GrCommandArgumentList newArgList = ((GrApplicationStatement)newStatement).getArgumentList(); if (newArgList == null && argumentList == null || From 6628d52974a7389d50f9600bdd2dae4781c071f5 Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Sat, 3 Dec 2011 16:15:55 +0400 Subject: [PATCH 30/60] check before cast to GroovyFile --- .../gradle/config/GradlePositionManager.java | 4 ++-- .../plugins/groovy/annotator/GroovyAnnotator.java | 2 +- .../annotator/intentions/GrMoveToDirFix.java | 2 ++ .../bugs/GroovyAccessibilityInspection.java | 4 +++- .../conversions/ConvertMapToClassIntention.java | 4 ++-- .../intentions/style/ImportOnDemandIntention.java | 11 +++++++---- .../intentions/style/ImportStaticIntention.java | 15 ++++++++------- .../completion/GroovyClassNameInsertHandler.java | 3 ++- .../completion/GroovyCompletionContributor.java | 1 + .../handlers/AfterNewClassInsertHandler.java | 11 ----------- .../smartEnter/GroovySmartEnterProcessor.java | 3 +-- .../statements/typedef/GrTypeDefinitionImpl.java | 3 +-- .../groovy/refactoring/GroovyRefactoringUtil.java | 2 +- .../extractMethod/ExtractMethodUtil.java | 5 ++--- .../introduce/GrIntroduceHandlerBase.java | 9 ++++----- .../parameter/GrIntroduceParameterHandler.java | 5 ++--- .../refactoring/inline/InlineMethodTest.java | 5 ++--- .../refactoring/inline/InlineVariableTest.java | 5 ++--- .../IntroduceVariableValidatorTest.java | 3 +-- 19 files changed, 44 insertions(+), 53 deletions(-) diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradlePositionManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradlePositionManager.java index 43c3f8f4cd30..fa234ee2a2bf 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradlePositionManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradlePositionManager.java @@ -30,8 +30,8 @@ import com.intellij.psi.PsiManager; import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; -import com.intellij.util.containers.FactoryMap; import com.intellij.util.containers.ConcurrentFactoryMap; +import com.intellij.util.containers.FactoryMap; import com.intellij.util.lang.UrlClassLoader; import com.sun.jdi.AbsentInformationException; import com.sun.jdi.ReferenceType; @@ -69,7 +69,7 @@ public class GradlePositionManager extends ScriptPositionManagerHelper { } public boolean isAppropriateScriptFile(@NotNull final PsiFile scriptFile) { - return GroovyScriptTypeDetector.isSpecificScriptFile((GroovyFile)scriptFile, GradleScriptType.INSTANCE); + return scriptFile instanceof GroovyFile && GroovyScriptTypeDetector.isSpecificScriptFile((GroovyFile)scriptFile, GradleScriptType.INSTANCE); } @NotNull diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java index c67aec8f8dc0..26f7775ca063 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java @@ -787,7 +787,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { assert file != null; PsiDirectory psiDirectory = file.getContainingDirectory(); - if (psiDirectory != null) { + if (psiDirectory != null && file instanceof GroovyFile) { PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(psiDirectory); if (aPackage != null) { String packageName = aPackage.getQualifiedName(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/GrMoveToDirFix.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/GrMoveToDirFix.java index 3ed96eb198b7..73c5f52c3bf6 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/GrMoveToDirFix.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/GrMoveToDirFix.java @@ -79,6 +79,8 @@ public class GrMoveToDirFix implements IntentionAction { @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + if (!(file instanceof GroovyFile)) return; + final String packageName = ((GroovyFile)file).getPackageName(); final Module module = ModuleUtil.findModuleForFile(file.getVirtualFile(), project); PsiDirectory directory = PackageUtil.findOrCreateDirectoryForPackage(module, packageName, null, true); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/bugs/GroovyAccessibilityInspection.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/bugs/GroovyAccessibilityInspection.java index a1d885d4a0dc..ee573ff774aa 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/bugs/GroovyAccessibilityInspection.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/bugs/GroovyAccessibilityInspection.java @@ -108,7 +108,9 @@ public class GroovyAccessibilityInspection extends BaseInspection { String[] modifiers = {PsiModifier.PROTECTED, PsiModifier.PUBLIC, PsiModifier.PACKAGE_LOCAL}; PsiClass accessObjectClass = PsiTreeUtil.getParentOfType(location, PsiClass.class, false); if (accessObjectClass == null) { - accessObjectClass = ((GroovyFile)location.getContainingFile()).getScriptClass(); + final PsiFile file = location.getContainingFile(); + if (!(file instanceof GroovyFile)) return GroovyFix.EMPTY_ARRAY; + accessObjectClass = ((GroovyFile)file).getScriptClass(); } for (int i = ArrayUtil.indexOf(modifiers, minModifier); i < modifiers.length; i++) { String modifier = modifiers[i]; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertMapToClassIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertMapToClassIntention.java index cc3a9e6595cf..f9c42d5f16fa 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertMapToClassIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertMapToClassIntention.java @@ -40,7 +40,6 @@ import org.jetbrains.plugins.groovy.intentions.base.Intention; import org.jetbrains.plugins.groovy.intentions.base.PsiElementPredicate; import org.jetbrains.plugins.groovy.lang.GrReferenceAdjuster; import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; -import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; @@ -77,7 +76,8 @@ public class ConvertMapToClassIntention extends Intention { final GrListOrMap map = (GrListOrMap)element; final GrNamedArgument[] namedArguments = map.getNamedArguments(); LOG.assertTrue(map.getInitializers().length == 0); - final String packageName = ((GroovyFileBase)map.getContainingFile()).getPackageName(); + final PsiFile file = map.getContainingFile(); + final String packageName = file instanceof GroovyFileBase ? ((GroovyFileBase)file).getPackageName() : ""; final CreateClassDialog dialog = new CreateClassDialog(project, GroovyBundle.message("create.class.family.name"), "", packageName, CreateClassKind.CLASS, true, diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/ImportOnDemandIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/ImportOnDemandIntention.java index 8683a9ab471b..320b1b6d0918 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/ImportOnDemandIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/ImportOnDemandIntention.java @@ -29,7 +29,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.intentions.base.Intention; import org.jetbrains.plugins.groovy.intentions.base.PsiElementPredicate; import org.jetbrains.plugins.groovy.lang.GrReferenceAdjuster; -import org.jetbrains.plugins.groovy.lang.psi.*; +import org.jetbrains.plugins.groovy.lang.psi.GrQualifiedReference; +import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; +import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.imports.GrImportStatement; /** @@ -41,10 +44,10 @@ public class ImportOnDemandIntention extends Intention { @Override protected void processIntention(@NotNull PsiElement element, Project project, Editor editor) throws IncorrectOperationException { - LOG.assertTrue(element instanceof GrReferenceElement); + if (!(element instanceof GrReferenceElement)) return; final GrReferenceElement ref = (GrReferenceElement)element; final PsiElement resolved = ref.resolve(); - LOG.assertTrue(resolved instanceof PsiClass); + if (!(resolved instanceof PsiClass)) return; final String qname = ((PsiClass)resolved).getQualifiedName(); @@ -52,7 +55,7 @@ public class ImportOnDemandIntention extends Intention { GroovyPsiElementFactory.getInstance(project).createImportStatementFromText(qname, true, true, null); final PsiFile containingFile = element.getContainingFile(); - LOG.assertTrue(containingFile instanceof GroovyFile); + if (!(containingFile instanceof GroovyFile)) return; ((GroovyFile)containingFile).addImport(importStatement); for (PsiReference reference : ReferencesSearch.search(resolved, new LocalSearchScope(containingFile), true)) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/ImportStaticIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/ImportStaticIntention.java index bc9ef5f0c7bd..36ceb3948420 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/ImportStaticIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/ImportStaticIntention.java @@ -43,19 +43,20 @@ public class ImportStaticIntention extends Intention { @Override protected void processIntention(@NotNull PsiElement element, Project project, Editor editor) throws IncorrectOperationException { - LOG.assertTrue(element instanceof GrReferenceExpression); + if (!(element instanceof GrReferenceExpression)) return; final GrReferenceExpression ref = (GrReferenceExpression)element; final PsiElement resolved = ref.resolve(); - LOG.assertTrue(resolved instanceof PsiMember); + if (!(resolved instanceof PsiMember)) return; final PsiClass containingClass = ((PsiMember)resolved).getContainingClass(); - LOG.assertTrue(containingClass != null); + if (containingClass == null) return; final String qname = containingClass.getQualifiedName(); final String name = ((PsiMember)resolved).getName(); final PsiFile containingFile = element.getContainingFile(); - LOG.assertTrue(containingFile instanceof GroovyFile); - ((GroovyFile)containingFile).accept(new GroovyRecursiveElementVisitor() { + if (!(containingFile instanceof GroovyFile)) return; + final GroovyFile file = (GroovyFile)containingFile; + file.accept(new GroovyRecursiveElementVisitor() { @Override public void visitReferenceExpression(GrReferenceExpression expression) { super.visitReferenceExpression(expression); @@ -72,7 +73,7 @@ public class ImportStaticIntention extends Intention { GroovyPsiElementFactory.getInstance(project).createImportStatementFromText(qname + "." + name, true, false, null); - ((GroovyFile)containingFile).addImport(importStatement); + file.addImport(importStatement); for (PsiReference reference : ReferencesSearch.search(resolved, new LocalSearchScope(containingFile))) { final PsiElement refElement = reference.getElement(); @@ -82,7 +83,7 @@ public class ImportStaticIntention extends Intention { } - ((GroovyFile)containingFile).accept(new GroovyRecursiveElementVisitor() { + file.accept(new GroovyRecursiveElementVisitor() { @Override public void visitReferenceExpression(GrReferenceExpression expression) { super.visitReferenceExpression(expression); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java index c92b9f1b3794..e73b13cb07a8 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java @@ -55,7 +55,8 @@ public class GroovyClassNameInsertHandler implements InsertHandler T findElementInRange(final GroovyFileBase file, + public static T findElementInRange(final PsiFile file, int startOffset, int endOffset, final Class klass) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/extractMethod/ExtractMethodUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/extractMethod/ExtractMethodUtil.java index 7410da1ec93f..aa0cf3eb81d2 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/extractMethod/ExtractMethodUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/extractMethod/ExtractMethodUtil.java @@ -74,8 +74,7 @@ public class ExtractMethodUtil { } startElement = startElement.getParent(); PsiElement parent = startElement.getParent(); - if (parent instanceof GroovyFile && - ((GroovyFile) parent).getScriptClass() == owner) { + if (parent instanceof GroovyFile && ((GroovyFile) parent).getScriptClass() == owner) { return startElement.getNextSibling(); } } @@ -418,7 +417,7 @@ public class ExtractMethodUtil { static PsiElement[] getElementsInOffset(PsiFile file, int startOffset, int endOffset) { PsiElement[] elements; - GrExpression expr = GroovyRefactoringUtil.findElementInRange(((GroovyFileBase) file), startOffset, endOffset, GrExpression.class); + GrExpression expr = GroovyRefactoringUtil.findElementInRange(file, startOffset, endOffset, GrExpression.class); if (expr != null) { PsiElement parent = expr.getParent(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java index fe35c7081066..6ed7c8e88f1b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/introduce/GrIntroduceHandlerBase.java @@ -42,7 +42,6 @@ import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; -import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; @@ -243,8 +242,8 @@ public abstract class GrIntroduceHandlerBase Date: Sat, 3 Dec 2011 16:21:22 +0400 Subject: [PATCH 31/60] capitalize dialog names & some cleanup --- .../plugins/groovy/GroovyBundle.properties | 10 ++++----- .../GroovyCodeInsightBundle.properties | 2 +- .../dynamic/DynamicToolWindowWrapper.java | 21 +++++++++++-------- .../intentions/dynamic/ui/DynamicDialog.java | 11 ++++------ .../groovy/codeInspection/BaseInspection.java | 3 --- .../GroovyInspectionBundle.properties | 4 ++-- .../groovy/compiler/GroovyCompiler.java | 3 ++- .../groovy/grape/GrabDependencies.java | 3 ++- .../GroovyIntentionsBundle.properties | 4 ++-- .../GroovyMapParameterDialog.java | 2 +- .../plugins/groovy/mvc/MvcConsole.java | 4 ++-- 11 files changed, 33 insertions(+), 34 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties index 8b7b70e6c566..8b6b797ae88d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovyBundle.properties @@ -260,7 +260,7 @@ class.is.not.expected.here=Class is not expected here fix.package.name=Fix package name #dynamic properties -add.dynamic.property=Add dynamic property ''{0}'' +add.dynamic.property=Add Dynamic Property ''{0}'' duplicate.element.in.the.map=Duplicate element in the map dynamic.toolwindow.search.elements=Search dynamic element dynamic.toolwindow.property.filter=Property Filter @@ -271,16 +271,16 @@ create.field.from.usage=Create Field ''{0}'' create.method.from.usage=Create Method ''{0}'' create.variable.from.usage=Create Variable ''{0}'' add.dynamic.element=Add dynamic element -add.dynamic.method=Add dynamic method +add.dynamic.method=Add Dynamic Method dynamic.type=Type dynamic.name=Name dynamic.properties.table.name=Method arguments dynamic.method.return.type=Return type dynamic.method.property.type=Property type are.you.sure.to.delete.dynamic.property=Are you sure to delete ''{0}''? -dynamic.property.deletion=Deletion dynamic property +dynamic.property.deletion=Deletion Dynamic Property are.you.sure.to.delete.elements=Are you sure to delete ''{0}'' elements? -dynamic.element.deletion=Dynamic element deletion +dynamic.element.deletion=Dynamic Element Deletion dynamic.window=Dynamic window dynamic.properties.table.no.arguments=Arguments list is empty. assignment.expected='=' expected @@ -304,7 +304,7 @@ break.outside.loop=The break statement with named labels is only allowed inside Constructor=Constructor Getter=Getter Setter=Setter -groovy.like.library.found=Groovy library found +groovy.like.library.found=Groovy Library Found groovy.like.library.found.text=Do you want to set up Groovy for module ''{0}'' \n\ with found library ''{1}'' (Groovy version {2})? compile.groovy.files=&Compile Groovy files diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/generate/GroovyCodeInsightBundle.properties b/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/generate/GroovyCodeInsightBundle.properties index 9b5b7606bac5..f42faeabcaac 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/generate/GroovyCodeInsightBundle.properties +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/generate/GroovyCodeInsightBundle.properties @@ -1,5 +1,5 @@ generate.equals.and.hashcode.already.defined.warning.anonymous=equals() and hashCode() already defined generate.equals.and.hashcode.already.defined.warning=equals() and hashCode() already defined -generate.equals.and.hashcode.already.defined.title=equals() and hashCode() already defined +generate.equals.and.hashcode.already.defined.title=equals() and hashCode() Already Defined generate.equals.compare.nested.arrays.comment= // Compare nested arrays - values of {0} here generate.equals.compare.arrays.comment= // Probably incorrect - comparing Object[] arrays with Arrays.equals \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/DynamicToolWindowWrapper.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/DynamicToolWindowWrapper.java index 46d8dd4b7372..512e00e1dc75 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/DynamicToolWindowWrapper.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/DynamicToolWindowWrapper.java @@ -40,14 +40,15 @@ import com.intellij.ui.treeStructure.treetable.ListTreeTableModelOnColumns; import com.intellij.ui.treeStructure.treetable.TreeTable; import com.intellij.ui.treeStructure.treetable.TreeTableModel; import com.intellij.ui.treeStructure.treetable.TreeTableTree; -import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.NullableFunction; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.AbstractTableCellEditor; import com.intellij.util.ui.ColumnInfo; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyBundle; import org.jetbrains.plugins.groovy.GroovyFileType; @@ -66,6 +67,7 @@ import javax.swing.tree.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Collection; @@ -247,7 +249,7 @@ public class DynamicToolWindowWrapper { myTreeTable.setTreeCellRenderer(treeCellRenderer); myTreeTable.setRootVisible(false); - myTreeTable.setSelectionMode(DefaultTreeSelectionModel.CONTIGUOUS_TREE_SELECTION); + myTreeTable.setSelectionMode(TreeSelectionModel.CONTIGUOUS_TREE_SELECTION); final MyPropertyTypeCellEditor typeCellEditor = new MyPropertyTypeCellEditor(); @@ -318,11 +320,11 @@ public class DynamicToolWindowWrapper { final String qualifiedName = ((PsiClass)element).getQualifiedName(); return new RefactoringElementListener() { - public void elementMoved(PsiElement newElement) { + public void elementMoved(@NotNull PsiElement newElement) { renameElement(qualifiedName, newElement); } - public void elementRenamed(PsiElement newElement) { + public void elementRenamed(@NotNull PsiElement newElement) { renameElement(qualifiedName, newElement); } @@ -358,7 +360,7 @@ public class DynamicToolWindowWrapper { final int selectionRow = myTreeTable.getTree().getLeadSelectionRow(); myTreeTable.editCellAt(selectionRow, TYPE_COLUMN, event); } - }, KeyStroke.getKeyStroke(KeyEvent.VK_F2, KeyEvent.CTRL_MASK), JComponent.WHEN_FOCUSED); + }, KeyStroke.getKeyStroke(KeyEvent.VK_F2, InputEvent.CTRL_MASK), JComponent.WHEN_FOCUSED); // todo use "myTreeTable.setAutoCreateRowSorter(true);" since 1.6 @@ -510,7 +512,7 @@ public class DynamicToolWindowWrapper { } } - class ClassColumnInfo extends ColumnInfo { + static class ClassColumnInfo extends ColumnInfo { public ClassColumnInfo(String name) { super(name); } @@ -565,7 +567,7 @@ public class DynamicToolWindowWrapper { if (!(childObject instanceof DItemElement)) break; filterText = getFilter(); - if (filterText == null || "".equals(filterText)) { + if (filterText == null || filterText.isEmpty()) { ((DItemElement)childObject).setHightlightedText(""); dynamicNodes.add(dynamicNode); @@ -689,7 +691,8 @@ public class DynamicToolWindowWrapper { } private static String[] mapToUnqualified(final String[] argumentsNames) { - return ContainerUtil.map2Array(argumentsNames, String.class, new Function() { + return ContainerUtil.map2Array(argumentsNames, String.class, new NullableFunction() { + @Nullable public String fun(final String s) { if (s == null) return null; int index = s.lastIndexOf("."); @@ -741,7 +744,7 @@ public class DynamicToolWindowWrapper { if (element == null) return null; return element.getContainingFile(); - } else if (LangDataKeys.DELETE_ELEMENT_PROVIDER.is(dataId)) { + } else if (PlatformDataKeys.DELETE_ELEMENT_PROVIDER.is(dataId)) { return new DeleteProvider() { @Override public void deleteElement(DataContext dataContext) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/ui/DynamicDialog.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/ui/DynamicDialog.java index 42b165d1c77d..2d6746084924 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/ui/DynamicDialog.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/ui/DynamicDialog.java @@ -148,7 +148,7 @@ public abstract class DynamicDialog extends DialogWrapper { setStatusTextAndIcon(null, ""); } - private void setStatusTextAndIcon(final Icon icon, final String text) { + private void setStatusTextAndIcon(@Nullable final Icon icon, final String text) { myTypeStatusLabel.setIcon(icon); myTypeStatusLabel.setText(text); pack(); @@ -177,7 +177,7 @@ public abstract class DynamicDialog extends DialogWrapper { public void actionPerformed(ActionEvent e) { myClassComboBox.requestFocus(); } - }, KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.ALT_MASK), JComponent.WHEN_IN_FOCUSED_WINDOW); + }, KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.ALT_MASK), JComponent.WHEN_IN_FOCUSED_WINDOW); } @Nullable @@ -191,7 +191,7 @@ public abstract class DynamicDialog extends DialogWrapper { final EditorComboBoxEditor comboEditor = new EditorComboBoxEditor(myProject, GroovyFileType.GROOVY_FILE_TYPE); final Document document = createDocument(""); - assert document != null; + LOG.assertTrue(document != null); comboEditor.setItem(document); @@ -213,7 +213,7 @@ public abstract class DynamicDialog extends DialogWrapper { public void actionPerformed(ActionEvent e) { myTypeComboBox.requestFocus(); } - }, KeyStroke.getKeyStroke(KeyEvent.VK_T, KeyEvent.ALT_MASK), JComponent.WHEN_IN_FOCUSED_WINDOW); + }, KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.ALT_MASK), JComponent.WHEN_IN_FOCUSED_WINDOW); final EditorTextField editorTextField = (EditorTextField) myTypeComboBox.getEditor().getEditorComponent(); @@ -228,9 +228,6 @@ public abstract class DynamicDialog extends DialogWrapper { }); PsiType type = typeConstraints.length == 1 ? typeConstraints[0].getDefaultType() : TypesUtil.getJavaLangObject(myContext); - if (type == null) { - type = TypesUtil.getJavaLangObject(myContext); - } myTypeComboBox.getEditor().setItem(createDocument(type.getCanonicalText())); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/BaseInspection.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/BaseInspection.java index 7a030222512d..a7d6f5302f2c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/BaseInspection.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/BaseInspection.java @@ -95,9 +95,6 @@ public abstract class BaseInspection extends GroovySuppressableInspectionTool { final BaseInspectionVisitor visitor = buildGroovyVisitor(problemsHolder, isOnTheFly); groovyFile.accept(visitor); final List problems = problemsHolder.getResults(); - if (problems == null) { - return null; - } return problems.toArray(new ProblemDescriptor[problems.size()]); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/GroovyInspectionBundle.properties b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/GroovyInspectionBundle.properties index cc1890234c9f..e89d06c35cff 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/GroovyInspectionBundle.properties +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/GroovyInspectionBundle.properties @@ -46,7 +46,7 @@ dynamic.property=Dynamic property unresolved.type.status=Type ''{0}'' is not resolved resolved.type.status=Type ''{0}'' is resolved no.type.specified=No type specified -dynamic.element=Dynamic element +dynamic.element=Dynamic Element ######################################################################################################################## # InpectorGroovy properties @@ -57,7 +57,7 @@ pointless.boolean.display.name=Pointless boolean expression pointless.boolean.quickfix=Simplify Cannot.perform.undo.operation=Cannot perform undo operation -Undo.disable=Undo disabled +Undo.disable=Undo Disabled field.already.defined=Variables with field names access.to.inaccessible.element=Access to inaccessible element diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompiler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompiler.java index 4dc37f8f06f6..4f20b2256506 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompiler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompiler.java @@ -138,7 +138,8 @@ public class GroovyCompiler extends GroovyCompilerBase { "You seem to have global Groovy AST transformations defined in your project,\n" + "but they won't be applied to your code because they are not marked as compiler resources.\n" + "Do you want to add them to compiler resource list?\n" + - "(you can do it yourself later in Settings | Compiler | Resource patterns)", "AST Transformations found", + "(you can do it yourself later in Settings | Compiler | Resource patterns)", + "AST Transformations Found", GroovyIcons.GROOVY_ICON_32x32); if (result == 0) { CompilerConfiguration.getInstance(myProject).addResourceFilePattern(AST_TRANSFORM_FILE_NAME); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/grape/GrabDependencies.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/grape/GrabDependencies.java index d19dce534bf8..609d1db536bc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/grape/GrabDependencies.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/grape/GrabDependencies.java @@ -103,7 +103,8 @@ public class GrabDependencies implements IntentionAction { assert vfile != null; if (JavaPsiFacade.getInstance(project).findClass("org.apache.ivy.core.report.ResolveReport", file.getResolveScope()) == null) { - Messages.showErrorDialog("Sorry, but IDEA cannot @Grab the dependencies without Ivy. Please add Ivy to your module dependencies and re-run the action.", "Ivy missing"); + Messages.showErrorDialog("Sorry, but IDEA cannot @Grab the dependencies without Ivy. Please add Ivy to your module dependencies and re-run the action.", + "Ivy Missing"); return; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/GroovyIntentionsBundle.properties b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/GroovyIntentionsBundle.properties index 17988f9cecce..23bda96924da 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/GroovyIntentionsBundle.properties +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/GroovyIntentionsBundle.properties @@ -90,7 +90,7 @@ do.not.create.first.new=Use &existing first parameter as map for named arguments convert.cannot.itself=Refactoring is not available for map parameter itself perform.refactoring=Performing refactoring map.param.name=Map parameter &name: -convert.param.to.map.entry=Convert parameter to map entry +convert.param.to.map.entry=Convert Parameter to Map Entry convert.java.style.array.intention.name=Convert java-style array creation convert.java.style.array.intention.family.name=Convert Java-Style Array Creation to Groovy Syntax @@ -102,7 +102,7 @@ create.parameter.for.field=Add parameter for field ''{0}'' create.parameter.for.fields=Add parameter for field... closure.used.as.variable=Closure is passed as argument. Refactoring can break semantic. -convert.map.to.class.intention.name=Convert to class +convert.map.to.class.intention.name=Convert to Class convert.map.to.class.intention.family.name=Convert Groovy native map to class instances do.you.want.to.change.method.return.type=Do you want to change return type of ''{0}'' method do.you.want.to.change.variable.type=Do you want to change type of ''{0}'' diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/GroovyMapParameterDialog.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/GroovyMapParameterDialog.java index cbec4da4b9e5..996026fa150a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/GroovyMapParameterDialog.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/GroovyMapParameterDialog.java @@ -161,7 +161,7 @@ public class GroovyMapParameterDialog extends DialogWrapper { public void actionPerformed(ActionEvent e) { myNameComboBox.requestFocus(); } - }, KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.ALT_MASK), JComponent.WHEN_IN_FOCUSED_WINDOW); + }, KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.ALT_MASK), JComponent.WHEN_IN_FOCUSED_WINDOW); for (String possibleName : possibleNames) { myNameComboBox.addItem(possibleName); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcConsole.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcConsole.java index 883140d6cb76..a0af4d23a3d1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcConsole.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcConsole.java @@ -294,7 +294,7 @@ public class MvcConsole implements Disposable { catch (final IOException e) { ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { - Messages.showErrorDialog(e.getMessage(), "Cannot start process"); + Messages.showErrorDialog(e.getMessage(), "Cannot Start Process"); try { if (onDone != null && !module.isDisposed()) onDone.run(); @@ -359,7 +359,7 @@ public class MvcConsole implements Disposable { super("Kill process", "Kill process", KILL_PROCESS_ICON); } - public void setHandler(OSProcessHandler handler) { + public void setHandler(@Nullable OSProcessHandler handler) { myHandler = handler; } From 68b7b96e405a17fbeace6b605a5aa72866e81b74 Mon Sep 17 00:00:00 2001 From: irengrig Date: Sat, 3 Dec 2011 18:01:08 +0400 Subject: [PATCH 32/60] ++ default protocol setting is needed only if java < 1.7 - for - IDEA-77360 SVN doesn't work in build 110.492 (impossible to connect to some servers using SSL ) svnkit 8254, defaul protocol for SSL = SSLv3 --- plugins/svn4ideaOld/src/org/jetbrains/idea/svn/SvnVcs.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/SvnVcs.java b/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/SvnVcs.java index cbfc1286ee84..16931f49a302 100644 --- a/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/SvnVcs.java +++ b/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/SvnVcs.java @@ -178,7 +178,7 @@ public class SvnVcs extends AbstractVcs { initLogFilters(); // Alexander Kitaev says it is default value (SSLv3) - since 8254 - if (System.getProperty(SVNKIT_HTTP_SSL_PROTOCOLS) == null) { + if (! SystemInfo.JAVA_RUNTIME_VERSION.startsWith("1.7") && System.getProperty(SVNKIT_HTTP_SSL_PROTOCOLS) == null) { System.setProperty(SVNKIT_HTTP_SSL_PROTOCOLS, "SSLv3"); } } From c8ad54490972cab475fa4c65fc108ff7c986a136 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Sat, 3 Dec 2011 21:17:21 +0100 Subject: [PATCH 33/60] Same-width buttons in New Project wizard --- .../intellij/ide/wizard/AbstractWizard.java | 50 +++++++++++++------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java b/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java index c3605e2bc7e4..aad1e97eedc1 100644 --- a/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java +++ b/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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.ide.wizard; +import com.google.common.collect.Lists; import com.intellij.CommonBundle; import com.intellij.ide.IdeBundle; import com.intellij.openapi.application.ApplicationInfo; @@ -37,6 +38,7 @@ import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -113,10 +115,11 @@ public abstract class AbstractWizard extends DialogWrapper { panel.setBorder(BorderFactory.createEmptyBorder(8, 0, 0, 0)); JPanel buttonPanel = new JPanel(); - buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS)); - panel.add(buttonPanel, BorderLayout.EAST); if (SystemInfo.isMac) { + panel.add(buttonPanel, BorderLayout.EAST); + buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS)); + myHelpButton.putClientProperty("JButton.buttonType", "help"); if (UIUtil.isUnderAquaLookAndFeel()) { myHelpButton.setText(""); @@ -127,7 +130,6 @@ public abstract class AbstractWizard extends DialogWrapper { leftPanel.add(myHelpButton); } leftPanel.add(myCancelButton); - panel.add(leftPanel, BorderLayout.WEST); buttonPanel.add(myFinishButton); @@ -139,20 +141,27 @@ public abstract class AbstractWizard extends DialogWrapper { } } else { + panel.add(buttonPanel, BorderLayout.EAST); + GroupLayout layout = new GroupLayout(buttonPanel); + buttonPanel.setLayout(layout); + layout.setAutoCreateGaps(true); + + final GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup(); + final GroupLayout.ParallelGroup vGroup = layout.createParallelGroup(); + final Collection buttons = Lists.newArrayListWithExpectedSize(5); + final boolean helpAvailable = ApplicationInfo.contextHelpAvailable(); + if (mySteps.size() > 1) { - buttonPanel.add(myPreviousButton); - buttonPanel.add(Box.createHorizontalStrut(5)); - buttonPanel.add(myNextButton); - buttonPanel.add(Box.createHorizontalStrut(5)); + add(hGroup, vGroup, buttons, myPreviousButton, myNextButton); + } + add(hGroup, vGroup, buttons, myFinishButton, myCancelButton); + if (helpAvailable) { + add(hGroup, vGroup, buttons, myHelpButton); } - buttonPanel.add(myFinishButton); - buttonPanel.add(Box.createHorizontalStrut(5)); - buttonPanel.add(myCancelButton); - buttonPanel.add(Box.createHorizontalStrut(5)); - if (ApplicationInfo.contextHelpAvailable()) { - buttonPanel.add(myHelpButton); - } + layout.setHorizontalGroup(hGroup); + layout.setVerticalGroup(vGroup); + layout.linkSize(buttons.toArray(new Component[buttons.size()])); } myPreviousButton.setEnabled(false); @@ -201,6 +210,17 @@ public abstract class AbstractWizard extends DialogWrapper { return panel; } + private static void add(final GroupLayout.Group hGroup, + final GroupLayout.Group vGroup, + final Collection all, + final Component... components) { + for (Component component : components) { + hGroup.addComponent(component); + vGroup.addComponent(component); + all.add(component); + } + } + private static class TallImageComponent extends OpaquePanel { private Icon myIcon; From 211495498e824836370dbccae185d6dc35363df4 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Sat, 3 Dec 2011 22:09:58 +0100 Subject: [PATCH 34/60] Place help button on the left under GTK+ --- .../src/com/intellij/ide/wizard/AbstractWizard.java | 12 ++++++++---- .../src/com/intellij/openapi/ui/DialogWrapper.java | 4 ++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java b/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java index aad1e97eedc1..1753af12cf65 100644 --- a/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java +++ b/platform/platform-api/src/com/intellij/ide/wizard/AbstractWizard.java @@ -141,7 +141,7 @@ public abstract class AbstractWizard extends DialogWrapper { } } else { - panel.add(buttonPanel, BorderLayout.EAST); + panel.add(buttonPanel, BorderLayout.CENTER); GroupLayout layout = new GroupLayout(buttonPanel); buttonPanel.setLayout(layout); layout.setAutoCreateGaps(true); @@ -151,11 +151,15 @@ public abstract class AbstractWizard extends DialogWrapper { final Collection buttons = Lists.newArrayListWithExpectedSize(5); final boolean helpAvailable = ApplicationInfo.contextHelpAvailable(); + if (helpAvailable && UIUtil.isUnderGTKLookAndFeel()) { + add(hGroup, vGroup, buttons, myHelpButton); + } + add(hGroup, vGroup, null, Box.createHorizontalGlue()); if (mySteps.size() > 1) { add(hGroup, vGroup, buttons, myPreviousButton, myNextButton); } add(hGroup, vGroup, buttons, myFinishButton, myCancelButton); - if (helpAvailable) { + if (helpAvailable && !UIUtil.isUnderGTKLookAndFeel()) { add(hGroup, vGroup, buttons, myHelpButton); } @@ -212,12 +216,12 @@ public abstract class AbstractWizard extends DialogWrapper { private static void add(final GroupLayout.Group hGroup, final GroupLayout.Group vGroup, - final Collection all, + @Nullable final Collection collection, final Component... components) { for (Component component : components) { hGroup.addComponent(component); vGroup.addComponent(component); - all.add(component); + if (collection != null) collection.add(component); } } diff --git a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java index b2cbf6be8258..63c853ea532c 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java @@ -368,6 +368,10 @@ public abstract class DialogWrapper { } } } + else if (UIUtil.isUnderGTKLookAndFeel() && Arrays.asList(actions).contains(getHelpAction())) { + leftSideActions = ArrayUtil.append(leftSideActions, getHelpAction()); + actions = ArrayUtil.remove(actions, getHelpAction()); + } JPanel panel = new JPanel(new BorderLayout()); final JPanel lrButtonsPanel = new JPanel(new GridBagLayout()); From e8899d2ad0c36aa68d8a450a74552eab3f6445dc Mon Sep 17 00:00:00 2001 From: irengrig Date: Sun, 4 Dec 2011 15:25:21 +0400 Subject: [PATCH 35/60] IDEA-78136 Can't resize digest view during commits (IDEA 11 RC) --- .../options/InitialConfigurationDialog.java | 5 + .../ui/AbstractTitledSeparatorWithIcon.java | 9 ++ .../ui/SplitterWithSecondHideable.java | 36 +++++- .../intellij/openapi/ui/PseudoSplitter.java | 107 ++++++++++++++++++ .../src/com/intellij/openapi/ui/Splitter.java | 2 +- .../openapi/vcs/changes/ShortDiffDetails.java | 4 +- .../changes/ui/CommitChangeListDialog.java | 82 +++++++------- 7 files changed, 194 insertions(+), 51 deletions(-) create mode 100644 platform/util/src/com/intellij/openapi/ui/PseudoSplitter.java diff --git a/platform/lang-impl/src/com/intellij/application/options/InitialConfigurationDialog.java b/platform/lang-impl/src/com/intellij/application/options/InitialConfigurationDialog.java index b7fafec0bfd3..a3b4ba723c13 100644 --- a/platform/lang-impl/src/com/intellij/application/options/InitialConfigurationDialog.java +++ b/platform/lang-impl/src/com/intellij/application/options/InitialConfigurationDialog.java @@ -159,6 +159,11 @@ public class InitialConfigurationDialog extends DialogWrapper { return myHidingPreviewPanel; } + @Override + protected void initOnImpl() { + //? + } + @Override protected void onImpl() { myWrapper.setVisible(true); diff --git a/platform/platform-impl/src/com/intellij/ui/AbstractTitledSeparatorWithIcon.java b/platform/platform-impl/src/com/intellij/ui/AbstractTitledSeparatorWithIcon.java index 7293e1289a47..5a061dfef07a 100644 --- a/platform/platform-impl/src/com/intellij/ui/AbstractTitledSeparatorWithIcon.java +++ b/platform/platform-impl/src/com/intellij/ui/AbstractTitledSeparatorWithIcon.java @@ -114,6 +114,15 @@ public abstract class AbstractTitledSeparatorWithIcon extends JPanel { onImpl(); } + public void initOn() { + initDetails(); + myOn = true; + myLabel.setIcon(myIconOpen); + initOnImpl(); + } + + protected abstract void initOnImpl(); + public void off() { myOn = false; myLabel.setIcon(myIcon); diff --git a/platform/platform-impl/src/com/intellij/ui/SplitterWithSecondHideable.java b/platform/platform-impl/src/com/intellij/ui/SplitterWithSecondHideable.java index 880060b2b868..2b86c4af99a6 100644 --- a/platform/platform-impl/src/com/intellij/ui/SplitterWithSecondHideable.java +++ b/platform/platform-impl/src/com/intellij/ui/SplitterWithSecondHideable.java @@ -15,6 +15,7 @@ */ package com.intellij.ui; +import com.intellij.openapi.ui.PseudoSplitter; import com.intellij.openapi.ui.Splitter; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vcs.changes.RefreshablePanel; @@ -35,7 +36,7 @@ import java.awt.event.MouseWheelEvent; * Time: 2:33 PM */ public abstract class SplitterWithSecondHideable { - private final Splitter mySplitter; + private final PseudoSplitter mySplitter; private final AbstractTitledSeparatorWithIcon myTitledSeparator; private final boolean myVertical; private final OnOffListener myListener; @@ -67,14 +68,32 @@ public abstract class SplitterWithSecondHideable { } @Override - protected void onImpl() { - final int firstSize = vertical ? mySplitter.getFirstComponent().getHeight() : mySplitter.getFirstComponent().getWidth(); + protected void initOnImpl() { final float proportion = myPreviousProportion > 0 ? myPreviousProportion : getSplitterInitialProportion(); - mySplitter.setProportion(proportion); + mySplitter.setSecondComponent(myDetailsComponent.getPanel()); + mySuperDivider.setResizeEnabled(true); + + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + mySplitter.fixFirst(proportion); + mySplitter.revalidate(); + mySplitter.repaint(); + } + }); + } + + @Override + protected void onImpl() { + final float proportion = myPreviousProportion > 0 ? myPreviousProportion : getSplitterInitialProportion(); + final int firstSize = vertical ? mySplitter.getFirstComponent().getHeight() : mySplitter.getFirstComponent().getWidth(); + // !! order is important! first fix + mySplitter.fixFirst(); + myListener.on((int) ((1 - proportion) * firstSize / proportion)); + //mySplitter.setProportion(proportion); mySplitter.setSecondComponent(myDetailsComponent.getPanel()); mySplitter.revalidate(); mySplitter.repaint(); - myListener.on((int) ((1 - proportion) * firstSize / proportion)); mySuperDivider.setResizeEnabled(true); } @@ -83,6 +102,7 @@ public abstract class SplitterWithSecondHideable { final int previousSize = vertical ? mySplitter.getSecondComponent().getHeight() : mySplitter.getSecondComponent().getWidth(); mySplitter.setSecondComponent(myFictivePanel); myPreviousProportion = mySplitter.getProportion(); + mySplitter.freeAll(); mySplitter.setProportion(1.0f); mySplitter.revalidate(); mySplitter.repaint(); @@ -90,7 +110,7 @@ public abstract class SplitterWithSecondHideable { mySuperDivider.setResizeEnabled(false); } }; - mySplitter = new Splitter(vertical) { + mySplitter = new PseudoSplitter(vertical) { { myTitledSeparator.mySeparator.addMouseListener(new MouseAdapter() { @Override @@ -200,6 +220,10 @@ public abstract class SplitterWithSecondHideable { public float getUsedProportion() { return isOn() ? mySplitter.getProportion() : myPreviousProportion; } + + public void initOn() { + myTitledSeparator.initOn(); + } public void on() { myTitledSeparator.on(); diff --git a/platform/util/src/com/intellij/openapi/ui/PseudoSplitter.java b/platform/util/src/com/intellij/openapi/ui/PseudoSplitter.java new file mode 100644 index 000000000000..34debeed1858 --- /dev/null +++ b/platform/util/src/com/intellij/openapi/ui/PseudoSplitter.java @@ -0,0 +1,107 @@ +/* + * Copyright 2000-2011 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.openapi.ui; + +import javax.swing.*; + +/** + * Created by IntelliJ IDEA. + * User: Irina.Chernushina + * Date: 12/3/11 + * Time: 6:13 PM + */ +public class PseudoSplitter extends Splitter { + private boolean myFirstIsFixed; + private boolean mySecondIsFixed; + private int myFirstFixedSize; + private int mySecondFixedSize; + + public PseudoSplitter(boolean vertical) { + super(vertical); + myFirstIsFixed = false; + mySecondIsFixed = false; + } + + public PseudoSplitter(boolean vertical, float proportion) { + super(vertical, proportion); + myFirstIsFixed = true; + } + + public PseudoSplitter(boolean vertical, float proportion, float minProp, float maxProp) { + super(vertical, proportion, minProp, maxProp); + myFirstIsFixed = true; + } + + private int getSizeForComp(final JComponent component) { + return getOrientation() ? component.getHeight() : component.getWidth(); + } + + public void fixFirst(final float proportion) { + assert getFirstComponent() != null; + int comp = getSizeForComp(this); + myFirstFixedSize = (int)(comp * proportion); + myFirstIsFixed = true; + mySecondIsFixed = false; + } + + public void fixFirst() { + assert getFirstComponent() != null; + myFirstFixedSize = getSizeForComp(getFirstComponent()); + myFirstIsFixed = true; + mySecondIsFixed = false; + } + + public void fixSecond() { + assert getSecondComponent() != null; + mySecondFixedSize = getSizeForComp(getSecondComponent()); + myFirstIsFixed = false; + mySecondIsFixed = true; + } + + public void freeAll() { + myFirstIsFixed = false; + mySecondIsFixed = false; + } + + @Override + public void doLayout() { + int total = getSizeForComp(this); + if (myFirstIsFixed) { + myProportion = ((float)myFirstFixedSize) / (total - getDividerWidth()); + } else if (mySecondIsFixed) { + myProportion = ((float)total - mySecondFixedSize) / (total - getDividerWidth()); + } + super.doLayout(); + } + + @Override + public void setProportion(float proportion) { + boolean firstIsFixed = myFirstIsFixed; + boolean secondIsFixed = mySecondIsFixed; + myFirstIsFixed = false; + mySecondIsFixed = false; + super.setProportion(proportion); + + int total = getSizeForComp(this); + if (firstIsFixed) { + myFirstFixedSize = (int) (myProportion * (total - getDividerWidth())); + myFirstIsFixed = true; + } else if (secondIsFixed) { + mySecondFixedSize = (int) ((1 - myProportion) * (total - getDividerWidth())); + mySecondIsFixed = true; + } + } +} diff --git a/platform/util/src/com/intellij/openapi/ui/Splitter.java b/platform/util/src/com/intellij/openapi/ui/Splitter.java index 1aac8335f09a..bfd632013c1a 100644 --- a/platform/util/src/com/intellij/openapi/ui/Splitter.java +++ b/platform/util/src/com/intellij/openapi/ui/Splitter.java @@ -53,7 +53,7 @@ public class Splitter extends JPanel { private final float myMaxProp; - private float myProportion; + protected float myProportion; private final Divider myDivider; private JComponent mySecondComponent; diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ShortDiffDetails.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ShortDiffDetails.java index 7dbf8370e7f9..b65831f7b667 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ShortDiffDetails.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ShortDiffDetails.java @@ -197,7 +197,9 @@ public class ShortDiffDetails implements RefreshablePanel, Disposable { @Override public void dispose() { - myDetailsLoader.dispose(); + if (myDetailsLoader != null) { + myDetailsLoader.dispose(); + } myDetailsPanel.clear(); myDetailsCache.clear(); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/CommitChangeListDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/CommitChangeListDialog.java index d81ac648695c..fb5976f0501c 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/CommitChangeListDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/CommitChangeListDialog.java @@ -46,7 +46,6 @@ import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.SplitterWithSecondHideable; import com.intellij.util.Alarm; import com.intellij.util.OnOffListener; -import com.intellij.util.ui.AdjustComponentWhenShown; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -54,7 +53,6 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; -import java.awt.font.LineMetrics; import java.io.File; import java.util.*; import java.util.List; @@ -83,7 +81,7 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj private final Alarm myOKButtonUpdateAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD); private String myLastKnownComment = ""; private final boolean myAllOfDefaultChangeListChangesIncluded; - @NonNls private static final String SPLITTER_PROPORTION_OPTION = "CommitChangeListDialog.SPLITTER_PROPORTION"; + @NonNls private static final String SPLITTER_PROPORTION_OPTION = "CommitChangeListDialog.SPLITTER_PROPORTION_"; private final Action[] myExecutorActions; private final boolean myShowVcsCommit; private final Map myPerVcsOptionsPanels = new HashMap(); @@ -104,12 +102,13 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj private String myHelpId; private SplitterWithSecondHideable myDetailsSplitter; - private static final String DETAILS_SPLITTER_PROPORTION_OPTION = "CommitChangeListDialog.DETAILS_SPLITTER_PROPORTION_OPTION"; - private static final String DETAILS_SHOW_OPTION = "CommitChangeListDialog.DETAILS_SHOW_OPTION"; + private static final String DETAILS_SPLITTER_PROPORTION_OPTION = "CommitChangeListDialog.DETAILS_SPLITTER_PROPORTION_OPTION_"; + private static final String DETAILS_SHOW_OPTION = "CommitChangeListDialog.DETAILS_SHOW_OPTION_"; private JPanel myDetailsPanel; - private final AdjustComponentWhenShown myAdjustWhenShown; private final FileAndDocumentListenersForShortDiff myListenersForShortDiff; private String myOkActionText; + private final ZipperUpdater myZipperUpdater; + private final Runnable myRefreshDetails; private static class MyUpdateButtonsRunnable implements Runnable { private CommitChangeListDialog myDialog; @@ -275,8 +274,8 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj myBrowserExtender = browser.getExtender(); } myDiffDetails.setParent(myBrowser); - final ZipperUpdater zipperUpdater = new ZipperUpdater(30, Alarm.ThreadToUse.SWING_THREAD, getDisposable()); - final Runnable refreshShortDiffDetails = new Runnable() { + myZipperUpdater = new ZipperUpdater(30, Alarm.ThreadToUse.SWING_THREAD, getDisposable()); + myRefreshDetails = new Runnable() { @Override public void run() { myDiffDetails.refresh(); @@ -285,7 +284,7 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj myListenersForShortDiff = new FileAndDocumentListenersForShortDiff(myDiffDetails) { @Override protected void updateDetails() { - zipperUpdater.queue(refreshShortDiffDetails); + myZipperUpdater.queue(myRefreshDetails); } @Override protected boolean updateSynchronously() { @@ -297,7 +296,7 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj myBrowser.getViewer().addSelectionListener(new Runnable() { @Override public void run() { - zipperUpdater.queue(refreshShortDiffDetails); + myZipperUpdater.queue(myRefreshDetails); } }); @@ -468,21 +467,23 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj support.installSearch(myCommitMessageArea.getEditorField(), myCommitMessageArea.getEditorField()); } - myAdjustWhenShown = new AdjustComponentWhenShown() { - @Override - protected boolean init() { - myDiffDetails.refresh(); - String value = PropertiesComponent.getInstance().getValue(DETAILS_SHOW_OPTION); - if (value != null) { - Boolean asBoolean = Boolean.valueOf(value); - if (Boolean.TRUE.equals(asBoolean)) { - myDetailsSplitter.on(); - } - } - return calcSplitterProportion(); + showDetailsIfSaved(); + } + + private void showDetailsIfSaved() { + String value = PropertiesComponent.getInstance().getValue(DETAILS_SHOW_OPTION); + if (value != null) { + Boolean asBoolean = Boolean.valueOf(value); + if (Boolean.TRUE.equals(asBoolean)) { + myDetailsSplitter.initOn(); } - }; - myAdjustWhenShown.install(myBrowser); + } + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + myZipperUpdater.queue(myRefreshDetails); + } + }); } private void updateOnListSelection() { @@ -938,6 +939,8 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj mySplitter.setFirstComponent(myBrowser); mySplitter.setSecondComponent(myCommitMessageArea); mySplitter.setDividerWidth(3); + initMainSplitter(); + rootPane.add(mySplitter, BorderLayout.CENTER); JComponent browserHeader = myBrowser.getHeaderPanel(); @@ -968,7 +971,7 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj new OnOffListener() { @Override public void on(Integer integer) { - if (! myAdjustWhenShown.isAdjusted()) return; + if (integer == 0) return; final Dimension dialogSize = getSize(); setSize(dialogSize.width, dialogSize.height + integer); repaint(); @@ -976,7 +979,7 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj @Override public void off(Integer integer) { - if (! myAdjustWhenShown.isAdjusted()) return; + if (integer == 0) return; final Dimension dialogSize = getSize(); setSize(dialogSize.width, dialogSize.height - integer); repaint(); @@ -1000,7 +1003,7 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj } } if (value <= 0.05 || value >= 0.95) { - return 0.7f; + return 0.6f; } return value; } @@ -1009,30 +1012,23 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj return myDetailsSplitter.getComponent(); } - private void initDetails() { - if (myDetailsPanel == null) { - myDetailsPanel = myDiffDetails.getPanel(); - //myDetailsPanel.setBorder(BorderFactory.createLineBorder(UIUtil.getBorderColor())); - } - } - - private boolean calcSplitterProportion() { + private void initMainSplitter() { final String s = PropertiesComponent.getInstance().getValue(SPLITTER_PROPORTION_OPTION); if (s != null) { try { mySplitter.setProportion(Float.valueOf(s).floatValue()); - return true; } catch (NumberFormatException e) { // } + } else { + mySplitter.setProportion(0.8f); + } + } + + private void initDetails() { + if (myDetailsPanel == null) { + myDetailsPanel = myDiffDetails.getPanel(); } - int height = mySplitter.getHeight(); - if (height == 0) return false; - Graphics g = myCommitMessageArea.getEditorField().getGraphics(); - final LineMetrics lm = g.getFont().getLineMetrics("Wp", g.getFontMetrics().getFontRenderContext()); - final float commentHeight = 8 * lm.getHeight(); - mySplitter.setProportion((height - commentHeight)/height); - return true; } public Collection getAffectedVcses() { From cca293623762ab30bcdea7c945194e31744604f5 Mon Sep 17 00:00:00 2001 From: irengrig Date: Sun, 4 Dec 2011 15:50:56 +0400 Subject: [PATCH 36/60] IDEA-78151 Create patch dialog title is "Create Patc_h" --- .../openapi/vcs/changes/patch/CreatePatchCommitExecutor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java index f3765c2b727b..ded368b51aae 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java @@ -32,6 +32,7 @@ import com.intellij.openapi.util.DefaultJDOMExternalizer; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.JDOMExternalizable; import com.intellij.openapi.util.WriteExternalException; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.*; import com.intellij.openapi.vcs.changes.*; import com.intellij.openapi.vcs.changes.shelf.ShelveChangesManager; @@ -70,7 +71,7 @@ public class CreatePatchCommitExecutor implements CommitExecutorWithHelp, Projec @Nls public String getActionText() { - return VcsBundle.message("create.patch.commit.action.text"); + return VcsBundle.message("create.patch.commit.action.title"); } @Override From 9c26b7ec9c8f88ff3af491e3eaf686a6e7aeefe8 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Sun, 4 Dec 2011 16:07:49 +0400 Subject: [PATCH 37/60] EA-32400 fix NPEs (File#listFiles can return null) --- .../android/compiler/AndroidCompileUtil.java | 8 ++++++-- .../compiler/AndroidPrecompileTask.java | 18 +++++++++++------- .../compiler/tools/AndroidDxRunner.java | 8 ++++++-- .../newProject/AndroidModuleBuilder.java | 17 ++++++++++------- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java index a5222ce3f74a..f71dbb397779 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java @@ -739,8 +739,12 @@ public class AndroidCompileUtil { throws IOException { if (file.isDirectory()) { - for (File child : file.listFiles()) { - addFileToJar(jar, child, rootDirectory, packRClasses); + final File[] children = file.listFiles(); + + if (children != null) { + for (File child : children) { + addFileToJar(jar, child, rootDirectory, packRClasses); + } } } else if (file.isFile()) { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java index a12daa8df257..4e6e537b16df 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java @@ -139,14 +139,18 @@ public class AndroidPrecompileTask implements CompileTask { private static void removeAllPackages(@Nullable String sourceRootPath, @NotNull CompileContext context) { final File sourceRoot = new File(sourceRootPath); - for (File child : sourceRoot.listFiles()) { - if (child.isDirectory() && - child.getName() != null && - StringUtil.isJavaIdentifier(child.getName())) { + final File[] children = sourceRoot.listFiles(); - if (!FileUtil.delete(child)) { - context.addMessage(CompilerMessageCategory.ERROR, "Cannot delete file " + child.getAbsolutePath(), - null, -1, -1); + if (children != null) { + for (File child : children) { + if (child.isDirectory() && + child.getName() != null && + StringUtil.isJavaIdentifier(child.getName())) { + + if (!FileUtil.delete(child)) { + context.addMessage(CompilerMessageCategory.ERROR, "Cannot delete file " + child.getAbsolutePath(), + null, -1, -1); + } } } } diff --git a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java b/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java index 7fd1c36e7179..93a1905e390c 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java +++ b/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java @@ -157,8 +157,12 @@ public class AndroidDxRunner { } if (file.isDirectory()) { - for (File child : file.listFiles()) { - collectFiles(root, child, result, visited, qNames); + final File[] children = file.listFiles(); + + if (children != null) { + for (File child : children) { + collectFiles(root, child, result, visited, qNames); + } } } else { diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java index b515b1cf7964..836dfb362a4f 100644 --- a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java @@ -253,15 +253,18 @@ public class AndroidModuleBuilder extends JavaModuleBuilder { AndroidUtils.runExternalTool(project, commandLine, true, null); if (finalTempContentRoot != null) { - for (File child : finalTempContentRoot.listFiles()) { + final File[] children = finalTempContentRoot.listFiles(); - if (SdkConstants.FD_SOURCES.equals(child.getName())) { - continue; - } - final File to = new File(contentRoot.getPath(), child.getName()); + if (children != null) { + for (File child : children) { + if (SdkConstants.FD_SOURCES.equals(child.getName())) { + continue; + } + final File to = new File(contentRoot.getPath(), child.getName()); - if (!FileUtil.moveDirWithContent(child, to)) { - LOG.error("Cannot move content from " + child.getPath() + " to " + to.getPath()); + if (!FileUtil.moveDirWithContent(child, to)) { + LOG.error("Cannot move content from " + child.getPath() + " to " + to.getPath()); + } } } From d3418fc1e11042295de1162b233d9fd5feb4f3e5 Mon Sep 17 00:00:00 2001 From: irengrig Date: Sun, 4 Dec 2011 16:23:01 +0400 Subject: [PATCH 38/60] IDEA-66552 (usability): modal windows for diff/merge: show diff from shelf - in frame, similar to show diff from changes | local --- .../openapi/vcs/changes/shelf/DiffShelvedChangesAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/DiffShelvedChangesAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/DiffShelvedChangesAction.java index c4b37c443f04..b9a1702e25d0 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/DiffShelvedChangesAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/DiffShelvedChangesAction.java @@ -141,7 +141,7 @@ public class DiffShelvedChangesAction extends AnAction implements DumbAware { VcsBalloonProblemNotifier.showOverChangesView(project, "Show Diff: Cannot find base for: " + StringUtil.join(missing, ",\n"), MessageType.WARNING); } - ShowDiffAction.showDiffImpl(project, diffRequestPresentables, toSelectIdx, new ShowDiffUIContext(false)); + ShowDiffAction.showDiffImpl(project, diffRequestPresentables, toSelectIdx, new ShowDiffUIContext(true)); } private static class PatchesPreloader { From 6f15c21633e33df778132085d50c7f46b5d8cfa7 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Sun, 4 Dec 2011 16:18:34 +0400 Subject: [PATCH 39/60] EA-32309 fix SOE --- .../android/resourceManagers/LocalResourceManager.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java index d37f4e5b992c..d0ae0d69c90d 100644 --- a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java +++ b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java @@ -72,7 +72,7 @@ public class LocalResourceManager extends ResourceManager { @Override public VirtualFile[] getAllResourceDirs() { Set result = new HashSet(); - collectResourceDirs(getModule(), result); + collectResourceDirs(getModule(), result, new HashSet()); return VfsUtil.toVirtualFileArray(result); } @@ -101,13 +101,17 @@ public class LocalResourceManager extends ResourceManager { return AndroidRootUtil.getResourceOverlayDirs(getModule()); } - private static void collectResourceDirs(Module module, Set result) { + private static void collectResourceDirs(Module module, Set result, Set visited) { + if (!visited.add(module)) { + return; + } + VirtualFile resDir = AndroidRootUtil.getResourceDir(module); if (resDir != null && !result.add(resDir)) { return; } for (AndroidFacet depFacet : AndroidUtils.getAllAndroidDependencies(module, false)) { - collectResourceDirs(depFacet.getModule(), result); + collectResourceDirs(depFacet.getModule(), result, visited); } } From 4a306d5af03ead9b64f2966594d887e580a9de76 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Sun, 4 Dec 2011 14:16:54 +0100 Subject: [PATCH 40/60] gratuitous rewrite, but now that it is done, I might as well commit it. --- .../refactoring/psi/PropertyUtils.java | 83 ++++++++- .../expression/FlipSetterCallIntention.java | 160 +++++++++--------- .../ipp/psiutils/PsiSelectionSearcher.java | 32 ++-- 3 files changed, 175 insertions(+), 100 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/psi/PropertyUtils.java b/java/java-impl/src/com/intellij/refactoring/psi/PropertyUtils.java index 47f7ac6d3098..44fc7a5725b0 100644 --- a/java/java-impl/src/com/intellij/refactoring/psi/PropertyUtils.java +++ b/java/java-impl/src/com/intellij/refactoring/psi/PropertyUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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. @@ -95,7 +95,14 @@ public class PropertyUtils { } final PsiReferenceExpression reference = (PsiReferenceExpression)value; final PsiExpression qualifier = reference.getQualifierExpression(); - if (qualifier != null && !(qualifier instanceof PsiThisExpression) && !(qualifier instanceof PsiSuperExpression)) { + if (qualifier instanceof PsiReferenceExpression) { + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)qualifier; + final PsiElement target = referenceExpression.resolve(); + if (!(target instanceof PsiClass)) { + return null; + } + } + else if (qualifier != null && !(qualifier instanceof PsiThisExpression) && !(qualifier instanceof PsiSuperExpression)) { return null; } final PsiElement referent = reference.resolve(); @@ -171,7 +178,14 @@ public class PropertyUtils { } final PsiReferenceExpression reference = (PsiReferenceExpression)lhs; final PsiExpression qualifier = reference.getQualifierExpression(); - if (qualifier != null && !(qualifier instanceof PsiThisExpression) && !(qualifier instanceof PsiSuperExpression)) { + if (qualifier instanceof PsiReferenceExpression) { + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)qualifier; + final PsiElement target = referenceExpression.resolve(); + if (!(target instanceof PsiClass)) { + return null; + } + } + else if (qualifier != null && !(qualifier instanceof PsiThisExpression) && !(qualifier instanceof PsiSuperExpression)) { return null; } final PsiElement referent = reference.resolve(); @@ -216,4 +230,67 @@ public class PropertyUtils { public static boolean isSimpleSetter(PsiMethod method) { return getFieldOfSetter(method) != null; } + + @Nullable + public static PsiMethod getReversePropertyMethod(PsiMethod propertyMethod) { + if (propertyMethod == null) { + return null; + } + final PsiClass aClass = propertyMethod.getContainingClass(); + if (aClass == null) { + return null; + } + final String methodName = propertyMethod.getName(); + final String prefix; + if (methodName.startsWith("get")) { + prefix = "get"; + } + else if (methodName.startsWith("is")) { + prefix = "is"; + } + else if (methodName.startsWith("set")) { + prefix = "set"; + } + else { + throw new IllegalArgumentException("argument is not a setter or getter"); + } + final String name = methodName.substring(prefix.length()); + final PsiField field; + if (prefix.equals("set")) { + field = PropertyUtils.getFieldOfSetter(propertyMethod); + } + else { + field = PropertyUtils.getFieldOfGetter(propertyMethod); + } + if (field == null) { + return null; + } + if (prefix.equals("set")) { + final PsiMethod result = findPropertyMethod(aClass, "get", name, field); + if (result != null) { + return result; + } + return findPropertyMethod(aClass, "is", name, field); + } + else { + return findPropertyMethod(aClass, "set", name, field); + } + } + + private static PsiMethod findPropertyMethod(PsiClass aClass, String prefix, String propertyName, PsiField field1) { + final PsiMethod[] methods = aClass.findMethodsByName(prefix + propertyName, true); + for (PsiMethod method : methods) { + final PsiField field2; + if (prefix.equals("set")) { + field2 = PropertyUtils.getFieldOfSetter(method); + } + else { + field2 = PropertyUtils.getFieldOfGetter(method); + } + if (field1.equals(field2)) { + return method; + } + } + return null; + } } diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/expression/FlipSetterCallIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/expression/FlipSetterCallIntention.java index 8dd58f6e008e..c83ff5dd1cfb 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/expression/FlipSetterCallIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/expression/FlipSetterCallIntention.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,8 +18,9 @@ package com.siyeh.ipp.expression; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.project.Project; import com.intellij.psi.*; -import com.intellij.psi.util.PropertyUtil; +import com.intellij.refactoring.psi.PropertyUtils; import com.intellij.util.IncorrectOperationException; import com.siyeh.ipp.base.Intention; import com.siyeh.ipp.base.PsiElementEditorPredicate; @@ -34,113 +35,106 @@ import java.util.List; * @author Konstantin Bulenkov */ public class FlipSetterCallIntention extends Intention { - private static final PsiElementPredicate PREDICATE = new SetterCallPredicate(); protected void processIntention(@NotNull PsiElement element) throws IncorrectOperationException { - final Editor editor = getEditorByElementIfItHasSelection(element); - if (editor == null) { - if (element instanceof PsiMethodCallExpression) { - flipCall((PsiMethodCallExpression)element); + final Project project = element.getProject(); + final Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); + if (editor != null) { + final List methodCalls = + PsiSelectionSearcher.searchElementsInSelection(editor, project, PsiMethodCallExpression.class, false); + if (methodCalls.size() > 0) { + for (PsiMethodCallExpression call : methodCalls) { + flipCall(call); + } + editor.getSelectionModel().removeSelection(); + return; } } - else { // editor not null - final List methodCalls = - PsiSelectionSearcher.searchElementsInSelection(editor, element.getProject(), PsiMethodCallExpression.class, false); - for (PsiMethodCallExpression call : methodCalls) { - flipCall(call); - } - editor.getSelectionModel().removeSelection(); + if (element instanceof PsiMethodCallExpression) { + flipCall((PsiMethodCallExpression)element); } } @NotNull protected PsiElementPredicate getElementPredicate() { - return PREDICATE; + return new SetterCallPredicate(); } private static void flipCall(PsiMethodCallExpression call) { - PsiExpression qualifierExpression = call.getMethodExpression().getQualifierExpression(); - if (qualifierExpression == null) return; - final String qualifier1 = qualifierExpression.getText(); - if (qualifier1 == null || qualifier1.length() == 0) return; - final PsiMethodCallExpression param = (PsiMethodCallExpression)call.getArgumentList().getExpressions()[0]; - qualifierExpression = param.getMethodExpression().getQualifierExpression(); - if (qualifierExpression == null) return; - final String qualifier2 = qualifierExpression.getText(); + final PsiExpression qualifierExpression1 = call.getMethodExpression().getQualifierExpression(); + if (qualifierExpression1 == null) { + return; + } + final PsiExpression[] arguments = call.getArgumentList().getExpressions(); + if (arguments.length != 1) { + return; + } + final PsiExpression argument = arguments[0]; + if (!(argument instanceof PsiMethodCallExpression)) { + return; + } + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)argument; + final PsiExpression qualifierExpression2 = methodCallExpression.getMethodExpression().getQualifierExpression(); + if (qualifierExpression2 == null) { + return; + } final PsiMethod setter = call.resolveMethod(); - final PsiMethod getter = param.resolveMethod(); - - if (getter == null || setter == null) return; - - final PsiMethod get = PropertyUtil.findPropertyGetter(setter.getContainingClass(), PropertyUtil.getPropertyName(setter), false, true); - final PsiMethod set = PropertyUtil.findPropertySetter(getter.getContainingClass(), PropertyUtil.getPropertyName(getter), false, true); - - if (get == null || set == null) return; - - StringBuilder text = new StringBuilder(); - text.append(qualifier2).append(".").append(set.getName()) - .append("(") - .append(qualifier1).append(".").append(get.getName()).append("()") - .append(")"); - final PsiExpression newExpression = - JavaPsiFacade.getElementFactory(call.getProject()).createExpressionFromText(text.toString(), call.getContext()); + final PsiMethod getter = methodCallExpression.resolveMethod(); + final PsiMethod get = PropertyUtils.getReversePropertyMethod(setter); + final PsiMethod set = PropertyUtils.getReversePropertyMethod(getter); + if (get == null || set == null) { + return; + } + final String text = + qualifierExpression2.getText() + "." + set.getName() + "(" + qualifierExpression1.getText() + "." + get.getName() + "())"; + final PsiExpression newExpression = JavaPsiFacade.getElementFactory(call.getProject()).createExpressionFromText(text, call); call.replace(newExpression); } - private static boolean isSetGetMethodCall(PsiMethodCallExpression call) { - final PsiExpression[] params = call.getArgumentList().getExpressions(); - if (params.length != 1) return false; - if (!(params[0] instanceof PsiMethodCallExpression)) return false; - final PsiMethodCallExpression call2 = (PsiMethodCallExpression)params[0]; - - //check expressions are simple properties - final PsiElement methodElement = call.getMethodExpression().resolve(); - final PsiElement param = call2.getMethodExpression().resolve(); - if (!(methodElement instanceof PsiMethod) - || !(param instanceof PsiMethod) - || !PropertyUtil.isSimplePropertySetter((PsiMethod)methodElement) - || !PropertyUtil.isSimplePropertyGetter((PsiMethod)param)) { + private static boolean isSetGetMethodCall(PsiElement element) { + if (!(element instanceof PsiMethodCallExpression)) { + return false; + } + final PsiMethodCallExpression call1 = (PsiMethodCallExpression)element; + final PsiExpression[] arguments = call1.getArgumentList().getExpressions(); + if (arguments.length != 1) { + return false; + } + final PsiExpression argument = arguments[0]; + if (!(argument instanceof PsiMethodCallExpression)) { + return false; + } + final PsiMethodCallExpression call2 = (PsiMethodCallExpression)argument; + final PsiMethod setter = call1.resolveMethod(); + final PsiMethod getter = call2.resolveMethod(); + final PsiMethod get = PropertyUtils.getReversePropertyMethod(setter); + final PsiMethod set = PropertyUtils.getReversePropertyMethod(getter); + if (setter == null || getter == null || get == null || set == null) { return false; } - final PsiMethod setter1 = (PsiMethod)methodElement; - final PsiMethod getter2 = (PsiMethod)param; //check types compatibility - if (!call.getArgumentList().getExpressionTypes()[0].equals(getter2.getReturnType())) return false; - - //check both classes have getters/setters - final PsiMethod getter1 = - PropertyUtil.findPropertyGetter(setter1.getContainingClass(), PropertyUtil.getPropertyName(setter1), false, true); - if (getter1 == null) return false; - - final PsiMethod setter2 = - PropertyUtil.findPropertyGetter(getter2.getContainingClass(), PropertyUtil.getPropertyName(getter2), false, true); - if (setter2 == null) return false; - - return true; - } - - @Nullable - private static Editor getEditorByElementIfItHasSelection(@NotNull PsiElement element) { - final Editor editor = FileEditorManager.getInstance(element.getProject()).getSelectedTextEditor(); - return editor != null && editor.getSelectionModel().hasSelection() ? editor : null; + final PsiParameter[] parameters = setter.getParameterList().getParameters(); + if (parameters.length != 1) { + return false; + } + final PsiParameter parameter = parameters[0]; + return parameter.getType().equals(getter.getReturnType()); } private static class SetterCallPredicate extends PsiElementEditorPredicate { @Override public boolean satisfiedBy(PsiElement element, @Nullable Editor editor) { - boolean underCorrectElement = element instanceof PsiMethodCallExpression && isSetGetMethodCall((PsiMethodCallExpression)element); - if (editor == null || !editor.getSelectionModel().hasSelection()) { - return underCorrectElement; + if (editor != null && editor.getSelectionModel().hasSelection()) { + final List list = + PsiSelectionSearcher.searchElementsInSelection(editor, element.getProject(), PsiMethodCallExpression.class, false); + for (PsiMethodCallExpression methodCallExpression : list) { + if (isSetGetMethodCall(methodCallExpression)) { + return true; + } + } } - - final List list = - PsiSelectionSearcher.searchElementsInSelection(editor, element.getProject(), PsiMethodCallExpression.class, false); - for (PsiMethodCallExpression methodCallExpression : list) { - if (isSetGetMethodCall(methodCallExpression)) return true; - } - - return underCorrectElement; + return isSetGetMethodCall(element); } } } diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/psiutils/PsiSelectionSearcher.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/psiutils/PsiSelectionSearcher.java index f4e24f8a4613..e0579aa347cb 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/psiutils/PsiSelectionSearcher.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/psiutils/PsiSelectionSearcher.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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,6 +17,7 @@ package com.siyeh.ipp.psiutils; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.SelectionModel; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; @@ -39,7 +40,7 @@ public class PsiSelectionSearcher { * @param editor editor to get text selection * @param project Project * @param filter PsiElement filter, e.g. PsiMethodCallExpression.class - * @param dontStopOnFound if true, visitor will look inside found elements. if false, visitor will stop looking for elements in children of found element + * @param searchChildrenOfFound if true, visitor will look for matching elements in the children of a found element, otherwise will not look inside found element. * @param type based on PsiElement type * @return elements in selection */ @@ -47,28 +48,31 @@ public class PsiSelectionSearcher { public static List searchElementsInSelection(Editor editor, Project project, final Class filter, - final boolean dontStopOnFound) { - final TextRange selection = new TextRange(editor.getSelectionModel().getSelectionStart(), editor.getSelectionModel().getSelectionEnd()); - + final boolean searchChildrenOfFound) { + final SelectionModel selectionModel = editor.getSelectionModel(); + if (!selectionModel.hasSelection()) { + return Collections.emptyList(); + } + final TextRange selection = new TextRange(selectionModel.getSelectionStart(), selectionModel.getSelectionEnd()); final PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); - if (file == null || file instanceof PsiCompiledElement) return Collections.emptyList(); - + if (file == null || file instanceof PsiCompiledElement) { + return Collections.emptyList(); + } final List results = new ArrayList(); final PsiElementVisitor visitor = new JavaRecursiveElementWalkingVisitor() { @Override public void visitElement(PsiElement element) { - if (!selection.intersects(element.getTextRange())) return; - + if (!selection.intersects(element.getTextRange())) { + return; + } if (filter.isAssignableFrom(element.getClass())) { results.add((T)element); - if (dontStopOnFound) { - super.visitElement(element); + if (!searchChildrenOfFound) { + return; } } - else { - super.visitElement(element); - } + super.visitElement(element); } }; From d4af62b1a41641d88eef00d3f9235c79d063af0a Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 4 Dec 2011 21:36:08 +0100 Subject: [PATCH 41/60] don't disable post-process reformatting after class name completion globally, correct javadoc, comment the test(cherry picked from commit c3d32ff) --- .../codeInsight/completion/JavaCompletionUtil.java | 13 +++---------- .../completion/NormalCompletionTest.groovy | 2 +- .../psi/impl/source/codeStyle/CodeEditUtil.java | 2 +- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index 0e8f314847b5..0dbb2f44ac76 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -730,16 +730,9 @@ public class JavaCompletionUtil { if (psiClass.isValid() && !psiClass.getManager().areElementsEquivalent(psiClass, resolveReference(ref))) { final boolean staticImport = ref instanceof PsiImportStaticReferenceElement; - CodeEditUtil.setAllowSuspendNodesReformatting(true); - PsiElement newElement; - try { - newElement = staticImport - ? ((PsiImportStaticReferenceElement)ref).bindToTargetClass(psiClass) - : ref.bindToElement(psiClass); - } - finally { - CodeEditUtil.setAllowSuspendNodesReformatting(false); - } + PsiElement newElement = staticImport + ? ((PsiImportStaticReferenceElement)ref).bindToTargetClass(psiClass) + : ref.bindToElement(psiClass); newElement = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(newElement); if (newElement != null) { diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index b691004f3053..d05310987c1a 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -621,7 +621,7 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { public void testSpacesAroundEq() throws Throwable { doTest('='); } - public void testClassBeforeCast() throws Throwable { doTest '\n' } + public void _testClassBeforeCast() throws Throwable { doTest '\n' } public void testNoAllClassesOnQualifiedReference() throws Throwable { configureByFile(getTestName(false) + ".java"); diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/codeStyle/CodeEditUtil.java b/platform/core-impl/src/com/intellij/psi/impl/source/codeStyle/CodeEditUtil.java index 21eb2ff933df..0a9ec4e8de95 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/codeStyle/CodeEditUtil.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/codeStyle/CodeEditUtil.java @@ -441,7 +441,7 @@ public class CodeEditUtil { *

      *
    1. This method is called with 'false' argument;
    2. *
    3. Document is processed at dedicated 'try' block;
    4. - *
    5. This method is called with 'false' argument from 'finally' section;
    6. + *
    7. This method is called with 'true' argument from 'finally' section;
    8. *
    */ From f577cbb45cb697e186584ec7f4398ef4eecb1f37 Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 4 Dec 2011 22:02:15 +0100 Subject: [PATCH 42/60] home/end in lookups should mark selection touched by user (IDEA-78182) --- .../src/com/intellij/codeInsight/lookup/impl/EndHandler.java | 1 + .../src/com/intellij/codeInsight/lookup/impl/HomeHandler.java | 1 + 2 files changed, 2 insertions(+) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/EndHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/EndHandler.java index 419d88935ad3..4ed85cc4e528 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/EndHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/EndHandler.java @@ -36,6 +36,7 @@ public class EndHandler extends EditorActionHandler { return; } + lookup.markSelectionTouched(); ListScrollingUtil.moveEnd(lookup.getList()); } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/HomeHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/HomeHandler.java index a8699b9454c8..3e742eb90e94 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/HomeHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/HomeHandler.java @@ -36,6 +36,7 @@ public class HomeHandler extends EditorActionHandler { return; } + lookup.markSelectionTouched(); ListScrollingUtil.moveHome(lookup.getList()); } } From 7ba57694f3d9a51eae14556574e309c62f8b31f8 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Sun, 4 Dec 2011 22:51:03 +0100 Subject: [PATCH 43/60] IDEA-78140 Change Signature: visibility drop down steals focus from return type suggestion list [anet](cherry picked from commit bc7919e) --- .../com/intellij/util/ui/UpDownHandler.java | 54 ++++++++++++++----- 1 file changed, 40 insertions(+), 14 deletions(-) rename platform/{platform-api => lang-impl}/src/com/intellij/util/ui/UpDownHandler.java (66%) diff --git a/platform/platform-api/src/com/intellij/util/ui/UpDownHandler.java b/platform/lang-impl/src/com/intellij/util/ui/UpDownHandler.java similarity index 66% rename from platform/platform-api/src/com/intellij/util/ui/UpDownHandler.java rename to platform/lang-impl/src/com/intellij/util/ui/UpDownHandler.java index 6a2b94d393f5..a05102599a44 100644 --- a/platform/platform-api/src/com/intellij/util/ui/UpDownHandler.java +++ b/platform/lang-impl/src/com/intellij/util/ui/UpDownHandler.java @@ -15,10 +15,14 @@ */ package com.intellij.util.ui; +import com.intellij.codeInsight.lookup.LookupEx; +import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.ide.ui.UISettings; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CustomShortcutSet; +import com.intellij.openapi.editor.impl.EditorComponentImpl; +import com.intellij.ui.EditorTextField; import javax.swing.*; @@ -36,22 +40,12 @@ public class UpDownHandler { register(input, affectedComponent, true); } - public static void register(JComponent input, final JComponent affectedComponent, boolean registerOnBothComponents) { + public static void register(final JComponent input, final JComponent affectedComponent, boolean registerOnBothComponents) { final SelectionMover mover = new SelectionMover(affectedComponent); - final AnAction up = new AnAction("Up") { - @Override - public void actionPerformed(AnActionEvent e) { - mover.move(-1); - } - }; + final AnAction up = new UpDownAction(mover, input, true); up.registerCustomShortcutSet(UP_KEY, input); - - final AnAction down = new AnAction("Down") { - @Override - public void actionPerformed(AnActionEvent e) { - mover.move(1); - } - }; + + final AnAction down = new UpDownAction(mover, input, false); down.registerCustomShortcutSet(DOWN_KEY, input); if (registerOnBothComponents) { up.registerCustomShortcutSet(UP_KEY, affectedComponent); @@ -103,4 +97,36 @@ public class UpDownHandler { } } } + + static class UpDownAction extends AnAction { + private final int myDirection; + private final SelectionMover myMover; + private final JComponent myInput; + + UpDownAction(SelectionMover mover, JComponent input, boolean isUp) { + super(isUp ? "Up" : "Down"); + myMover = mover; + myInput = input; + myDirection = isUp ? -1 : 1; + } + + @Override + public void actionPerformed(AnActionEvent e) { + myMover.move(myDirection); + } + + @Override + public void update(AnActionEvent e) { + final LookupEx lookup; + if (myInput instanceof EditorTextField) { + lookup = LookupManager.getActiveLookup(((EditorTextField)myInput).getEditor()); + } else if (myInput instanceof EditorComponentImpl) { + lookup = LookupManager.getActiveLookup(((EditorComponentImpl)myInput).getEditor()); + } else { + lookup = null; + } + + e.getPresentation().setEnabled(lookup == null); + } + } } From 753521e192428982d758088913d75e66036bd3e0 Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 4 Dec 2011 22:23:23 +0100 Subject: [PATCH 44/60] IDEA-78123 Stub generation fails for @AutoClone --- .../resolve/ast/AutoCloneContributor.java | 3 +- .../groovy/compiler/GeneratorTest.java | 4 +++ .../groovy/stubGenerator/autoCloneAnno.test | 30 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 plugins/groovy/testdata/groovy/stubGenerator/autoCloneAnno.test diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/AutoCloneContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/AutoCloneContributor.java index a293b17f52f0..f5259848482b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/AutoCloneContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/AutoCloneContributor.java @@ -16,6 +16,7 @@ package org.jetbrains.plugins.groovy.lang.resolve.ast; import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiModifier; import com.intellij.psi.impl.light.LightMethodBuilder; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; @@ -34,7 +35,7 @@ public class AutoCloneContributor extends AstTransformContributor { public void collectMethods(@NotNull GrTypeDefinition clazz, Collection collector) { if (PsiImplUtil.getAnnotation(clazz, GroovyCommonClassNames.GROOVY_TRANSFORM_AUTO_CLONE) == null) return; - final LightMethodBuilder clone = new LightMethodBuilder(clazz.getManager(), "clone"); + final LightMethodBuilder clone = new LightMethodBuilder(clazz.getManager(), "clone").addModifier(PsiModifier.PUBLIC); clone.setContainingClass(clazz); clone.addException(CloneNotSupportedException.class.getName()); collector.add(clone); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GeneratorTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GeneratorTest.java index 16c36945f9ca..f3ec84ab43fb 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GeneratorTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GeneratorTest.java @@ -102,6 +102,10 @@ public class GeneratorTest extends LightGroovyTestCase { myFixture.addClass("package groovy.lang; public @interface Delegate {}"); doTest(); } + public void testAutoCloneAnno() throws Throwable { + myFixture.addClass("package groovy.transform; public @interface AutoClone {}"); + doTest(); + } public void doTest() { final String relTestPath = getTestName(true) + ".test"; diff --git a/plugins/groovy/testdata/groovy/stubGenerator/autoCloneAnno.test b/plugins/groovy/testdata/groovy/stubGenerator/autoCloneAnno.test new file mode 100644 index 000000000000..fa785119a386 --- /dev/null +++ b/plugins/groovy/testdata/groovy/stubGenerator/autoCloneAnno.test @@ -0,0 +1,30 @@ +@groovy.transform.AutoClone +class Foo {} +----- +public class Foo extends groovy.lang.GroovyObjectSupport implements groovy.lang.GroovyObject { +public java.lang.Object clone() throws java.lang.CloneNotSupportedException { +return null; +} + +public java.lang.Object getProperty(java.lang.String property) { +return null; +} + +public void setProperty(java.lang.String property, java.lang.Object newValue) { +return ; +} + +public java.lang.Object invokeMethod(java.lang.String name, java.lang.Object args) { +return null; +} + +public groovy.lang.MetaClass getMetaClass() { +return null; +} + +public void setMetaClass(groovy.lang.MetaClass metaClass) { +return ; +} + +} +--- \ No newline at end of file From 3a529caaa9b9414ba46c85ec7a5db20dcf6d72bd Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 4 Dec 2011 22:39:54 +0100 Subject: [PATCH 45/60] don't duplicate @Delegated methods (IDEA-78066) --- .../ast/DelegatedMethodsContributor.java | 1 + .../groovy/stubGenerator/delegateAnno.test | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/DelegatedMethodsContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/DelegatedMethodsContributor.java index 2fc202956d5f..78faf0301610 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/DelegatedMethodsContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/DelegatedMethodsContributor.java @@ -57,6 +57,7 @@ public class DelegatedMethodsContributor extends AstTransformContributor { for (PsiMethod method : methods) { if (method.isConstructor()) continue; if (!deprecated && PsiImplUtil.getAnnotation(method, "java.lang.Deprecated") != null) continue; + if (clazz.findCodeMethodsBySignature(method, false).length > 0) continue; collector.add(generateDelegateMethod(method, clazz, resolveResult.getSubstitutor())); } } diff --git a/plugins/groovy/testdata/groovy/stubGenerator/delegateAnno.test b/plugins/groovy/testdata/groovy/stubGenerator/delegateAnno.test index 0a4eb4ce3447..2f202cdbdd9c 100644 --- a/plugins/groovy/testdata/groovy/stubGenerator/delegateAnno.test +++ b/plugins/groovy/testdata/groovy/stubGenerator/delegateAnno.test @@ -9,6 +9,10 @@ class DelegateBarImpl { private @Delegate(interfaces=false) Runnable zoo; private @Delegate Doo doo; } +class Del2 implements DelegateFoo { + @Delegate DelegateFoo foo; + def foo() {} +} ----- public interface DelegateFoo { public java.lang.Object foo() ; @@ -79,4 +83,40 @@ private DelegateFoo foo = null; private java.lang.Runnable zoo = null; private Doo doo = null; } +--- +public class Del2 extends groovy.lang.GroovyObjectSupport implements DelegateFoo, groovy.lang.GroovyObject { +public java.lang.Object foo() { +return null; +} + +public DelegateFoo getFoo() { +return null; +} + +public void setFoo(DelegateFoo foo) { +return ; +} + +public java.lang.Object getProperty(java.lang.String property) { +return null; +} + +public void setProperty(java.lang.String property, java.lang.Object newValue) { +return ; +} + +public java.lang.Object invokeMethod(java.lang.String name, java.lang.Object args) { +return null; +} + +public groovy.lang.MetaClass getMetaClass() { +return null; +} + +public void setMetaClass(groovy.lang.MetaClass metaClass) { +return ; +} + +private DelegateFoo foo = null; +} --- \ No newline at end of file From aa1d340325bf79dab8d71265ee83e4cbcd02d051 Mon Sep 17 00:00:00 2001 From: irengrig Date: Mon, 5 Dec 2011 10:44:42 +0400 Subject: [PATCH 46/60] IDEA-77177 Line status tracker: the modified marker is not removed after commit --- .../intellij/openapi/vcs/ex/LineStatusTracker.java | 13 +++++++++++++ .../openapi/vcs/impl/LineStatusTrackerManager.java | 11 +++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTracker.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTracker.java index 3bcfd4a6f6d0..27beb9ccae27 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTracker.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/ex/LineStatusTracker.java @@ -77,6 +77,7 @@ public class LineStatusTracker { private boolean myAnathemaThrown; private FileEditorManager myFileEditorManager; private final VirtualFile myVirtualFile; + private volatile boolean myReleased; private LineStatusTracker(final Document document, final Document upToDateDocument, final Project project, final VirtualFile virtualFile) { myVirtualFile = virtualFile; @@ -89,10 +90,12 @@ public class LineStatusTracker { myRanges = new ArrayList(); myAnathemaThrown = false; myFileEditorManager = FileEditorManager.getInstance(myProject); + myReleased = false; } public void initialize(@NotNull final String upToDateContent, @NotNull RevisionPack baseRevisionNumber) { ApplicationManager.getApplication().assertIsDispatchThread(); + if (myReleased) return; synchronized (myLock) { try { @@ -166,6 +169,7 @@ public class LineStatusTracker { @SuppressWarnings({"AutoBoxing"}) private RangeHighlighter createHighlighter(final Range range) { + assert ! myReleased; int first = range.getOffset1() >= myDocument.getLineCount() ? myDocument.getTextLength() : myDocument.getLineStartOffset(range.getOffset1()); @@ -204,6 +208,7 @@ public class LineStatusTracker { removeHighlightersFromMarkupModel(); myRanges.clear(); } + myReleased = true; } public Document getDocument() { @@ -228,6 +233,7 @@ public class LineStatusTracker { } public void startBulkUpdate() { + if (myReleased) return; synchronized (myLock) { myBulkUpdate = true; removeAnathema(); @@ -247,6 +253,7 @@ public class LineStatusTracker { } public void finishBulkUpdate() { + if (myReleased) return; synchronized (myLock) { myBulkUpdate = false; reinstallRanges(); @@ -286,6 +293,7 @@ public class LineStatusTracker { private final VcsDirtyScopeManager myVcsDirtyScopeManager = VcsDirtyScopeManager.getInstance(myProject); public void beforeDocumentChange(DocumentEvent e) { + if (myReleased) return; myApplication.assertWriteAccessAllowed(); synchronized (myLock) { @@ -338,6 +346,11 @@ public class LineStatusTracker { } public void documentChanged(final DocumentEvent e) { + if (myReleased) { + return; + } + // TODO: remove assertion when cached document listeners will work ok + //assert ! myReleased; myApplication.assertWriteAccessAllowed(); synchronized (myLock) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/LineStatusTrackerManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/LineStatusTrackerManager.java index 37e2a0df0656..ccd8400d2534 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/LineStatusTrackerManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/LineStatusTrackerManager.java @@ -212,14 +212,9 @@ public class LineStatusTrackerManager implements ProjectComponent, LineStatusTra if (tracker == null && (! shouldBeInstalled)) return; if (tracker != null) { - if (! shouldBeInstalled) { - releaseTracker(document); - return; - } else { - tracker.resetForBaseRevisionLoad(); - startAlarm(document, virtualFile); - } - } else if (shouldBeInstalled) { + releaseTracker(document); + } + if (shouldBeInstalled) { installTracker(virtualFile, document); } } From 39c6d2d9991dc70b1b78197f8f16c7c8c6e84ce6 Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Mon, 5 Dec 2011 11:23:17 +0400 Subject: [PATCH 47/60] [mac] async native clipboard quering [registry, ide.mac.use.native.clipboard.async] --- .../intellij/ide/ClipboardSynchronizer.java | 129 +++++++++++++----- .../src/misc/registry.properties | 5 +- 2 files changed, 102 insertions(+), 32 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/ClipboardSynchronizer.java b/platform/platform-impl/src/com/intellij/ide/ClipboardSynchronizer.java index 47bdc4769a07..117815929b75 100644 --- a/platform/platform-impl/src/com/intellij/ide/ClipboardSynchronizer.java +++ b/platform/platform-impl/src/com/intellij/ide/ClipboardSynchronizer.java @@ -25,12 +25,15 @@ import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; import com.intellij.ui.mac.foundation.Foundation; import com.intellij.ui.mac.foundation.ID; +import com.intellij.ui.mac.foundation.MacUtil; +import com.sun.jna.Callback; import com.sun.jna.IntegerType; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import sun.awt.datatransfer.DataTransferer; +import javax.swing.*; import java.awt.*; import java.awt.datatransfer.*; import java.io.IOException; @@ -180,8 +183,31 @@ public class ClipboardSynchronizer implements ApplicationComponent { private static class MacClipboardHandler extends ClipboardHandler { + private static final String CLIPBOARD_CONTENTS = "CLIPBOARD_CONTENTS"; private Pair myFullTransferable; + private static Callback myClipboardQueryCallback = new Callback() { + public void callback(ID self, String selector, ID params) { + JRootPane pane = getRootPane(); + if (pane != null) { + Transferable transferable = getClipboardContentNatively(); + if (transferable != null) { + pane.putClientProperty(CLIPBOARD_CONTENTS, transferable); + } + } + } + }; + + static { + if (SystemInfo.isMac) { + final ID delegateClass = Foundation.allocateObjcClassPair(Foundation.getClass("NSObject"), "ClipboardSynchronizer_"); + if (!Foundation.addMethod(delegateClass, Foundation.createSelector("run:"), myClipboardQueryCallback, "v*")) { + throw new RuntimeException("Unable to add method to objective-c delegate class!"); + } + Foundation.registerObjcClassPair(delegateClass); + } + } + @Nullable private Transferable doGetContents() throws IllegalStateException { if (Registry.is("ide.mac.useNativeClipboard")) { @@ -247,43 +273,45 @@ public class ClipboardSynchronizer implements ApplicationComponent { super.setContent(content, owner); } } + + @Nullable + private static JRootPane getRootPane() { + Window window = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow(); + if (window == null) return null; + return SwingUtilities.getRootPane(window); + } + @Nullable public static Transferable getContentsSafe() { + if (Registry.is("ide.mac.useNativeClipboard.async")) { + JRootPane pane = getRootPane(); + if (pane != null) { + ID synchronizer_ = Foundation.getClass("ClipboardSynchronizer_"); + final ID synchronizer = Foundation.invoke(Foundation.invoke(synchronizer_, "alloc"), "init"); + Foundation + .invoke(synchronizer, "performSelectorOnMainThread:withObject:waitUntilDone:", Foundation.createSelector("run:"), null, false); + + MacUtil.startModal(pane); + + Foundation.cfRelease(synchronizer); + + Object contents = pane.getClientProperty(CLIPBOARD_CONTENTS); + pane.putClientProperty(CLIPBOARD_CONTENTS, null); + if (contents != null) { + return (Transferable) contents; + } + + return null; + } + } + final Ref result = new Ref(); Foundation.executeOnMainThread(new Runnable() { @Override public void run() { - String plainText = "public.utf8-plain-text"; - String jvmObject = "application/x-java-jvm"; - - ID pasteboard = Foundation.invoke("NSPasteboard", "generalPasteboard"); - ID types = Foundation.invoke(pasteboard, "types"); - IntegerType count = Foundation.invoke(types, "count"); - - ID plainTextType = null; - - for (int i = 0; i < count.intValue(); i++) { - ID each = Foundation.invoke(types, "objectAtIndex:", i); - String eachType = Foundation.toStringViaUTF8(each); - if (plainText.equals(eachType)) { - plainTextType = each; - break; - } - } - - // will put string value even if we doesn't found java object. this is needed because java caches clipboard value internally and - // will reset it ONLY IF we'll put jvm-object into clipboard (see our setContent optimizations which avoids putting jvm-objects - // into clipboard) - - if (plainTextType != null) { - ID text = Foundation.invoke(pasteboard, "stringForType:", plainTextType); - String value = Foundation.toStringViaUTF8(text); - if (value == null) { - LOG.info(String.format("[Clipboard] Strange string value (null?) for type: %s", plainTextType)); - } - else { - result.set(new StringSelection(value)); - } + Transferable transferable = getClipboardContentNatively(); + if (transferable != null) { + result.set(transferable); } } }, true, true); @@ -291,6 +319,45 @@ public class ClipboardSynchronizer implements ApplicationComponent { return result.get(); } } + + @Nullable + private static Transferable getClipboardContentNatively() { + String plainText = "public.utf8-plain-text"; + String jvmObject = "application/x-java-jvm"; + + ID pasteboard = Foundation.invoke("NSPasteboard", "generalPasteboard"); + ID types = Foundation.invoke(pasteboard, "types"); + IntegerType count = Foundation.invoke(types, "count"); + + ID plainTextType = null; + + for (int i = 0; i < count.intValue(); i++) { + ID each = Foundation.invoke(types, "objectAtIndex:", i); + String eachType = Foundation.toStringViaUTF8(each); + if (plainText.equals(eachType)) { + plainTextType = each; + break; + } + } + + // will put string value even if we doesn't found java object. this is needed because java caches clipboard value internally and + // will reset it ONLY IF we'll put jvm-object into clipboard (see our setContent optimizations which avoids putting jvm-objects + // into clipboard) + + Transferable result = null; + if (plainTextType != null) { + ID text = Foundation.invoke(pasteboard, "stringForType:", plainTextType); + String value = Foundation.toStringViaUTF8(text); + if (value == null) { + LOG.info(String.format("[Clipboard] Strange string value (null?) for type: %s", plainTextType)); + } + else { + result = new StringSelection(value); + } + } + + return result; + } private static class LinuxClipboardHandler extends ClipboardHandler { private static final FlavorTable FLAVOR_MAP = (FlavorTable)SystemFlavorMap.getDefaultFlavorMap(); diff --git a/platform/platform-resources-en/src/misc/registry.properties b/platform/platform-resources-en/src/misc/registry.properties index 3dd265f62fcb..8eb94ba4ebdd 100644 --- a/platform/platform-resources-en/src/misc/registry.properties +++ b/platform/platform-resources-en/src/misc/registry.properties @@ -152,7 +152,10 @@ dir.diff.default.src.folder= dir.diff.default.trg.folder= show.live.templates.in.completion=false documentation.component.editor.font=false + ide.mac.useNativeClipboard=true +ide.mac.useNativeClipboard.async=false + show.all.classes.on.first.completion=false limited.relevance.sorting.in.completion=false limited.relevance.sorting.in.completion.description=Whether only 5 most relevant items are shown at the top of the completion list, or it's sorted by relevance completely @@ -166,4 +169,4 @@ show.anonymous.in.structure.view=false show.anonymous.in.structure.view.description=Enables Java anonymous classes in Structure View enable.groovy.hotswap=true -enable.groovy.hotswap.description=Whether IDEA should add a special java agent to the debugged process which allows to hot-swap Groovy changes in some cases \ No newline at end of file +enable.groovy.hotswap.description=Whether IDEA should add a special java agent to the debugged process which allows to hot-swap Groovy changes in some cases From f6bfc50c174b1f442bdedbc668b85b7fe9627882 Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Mon, 5 Dec 2011 11:53:54 +0400 Subject: [PATCH 48/60] disabling tab reordering for tabs in multiple rows --- .../src/com/intellij/ui/tabs/impl/JBEditorTabs.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/JBEditorTabs.java b/platform/platform-api/src/com/intellij/ui/tabs/impl/JBEditorTabs.java index 15bcc6c4ab7e..a924a048161d 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/JBEditorTabs.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/JBEditorTabs.java @@ -53,7 +53,12 @@ public class JBEditorTabs extends JBTabsImpl { super.paintLastGhost(g2d); } } - + + @Override + public boolean isTabDraggingEnabled() { + return super.isTabDraggingEnabled() && isSingleRow(); + } + public boolean isGhostsAlwaysVisible() { return super.isGhostsAlwaysVisible() && !isEditorTabs(); } From 86dc6d87007905f456cb477977e44021bc6662f1 Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Mon, 5 Dec 2011 12:39:50 +0400 Subject: [PATCH 49/60] ui: minor ui fix for editor tabs in multiple rows --- .../src/com/intellij/ui/tabs/impl/JBEditorTabs.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/JBEditorTabs.java b/platform/platform-api/src/com/intellij/ui/tabs/impl/JBEditorTabs.java index a924a048161d..92faf0983a2b 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/JBEditorTabs.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/JBEditorTabs.java @@ -76,7 +76,7 @@ public class JBEditorTabs extends JBTabsImpl { int _height = effectiveBounds.height - insets.top - insets.bottom; - if ((!isSingleRow() && label.getBounds().y > 0 /* for multiline */) || (isSingleRow() && isHorizontalTabs())) { + if ((!isSingleRow() /* for multiline */) || (isSingleRow() && isHorizontalTabs())) { if (isSingleRow() && getPosition() == JBTabsPosition.bottom) { _y += TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT; } else { From 51dfe9df93835a869068b32c4825c4012ee10a66 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 2 Dec 2011 17:27:14 +0400 Subject: [PATCH 50/60] notnull --- .../java/stubs/JavaAnnotationElementType.java | 4 +- .../impl/java/stubs/JavaClassElementType.java | 4 +- .../JavaClassInitializerElementType.java | 4 +- .../JavaClassReferenceListElementType.java | 4 +- .../java/stubs/JavaFieldStubElementType.java | 4 +- .../java/stubs/JavaImportListElementType.java | 4 +- .../stubs/JavaImportStatementElementType.java | 4 +- .../java/stubs/JavaMethodElementType.java | 5 ++- .../stubs/JavaModifierListElementType.java | 4 +- .../java/stubs/JavaParameterElementType.java | 4 +- .../stubs/JavaParameterListElementType.java | 4 +- .../impl/java/stubs/JavaStubElementType.java | 4 +- .../stubs/JavaTypeParameterElementType.java | 4 +- .../JavaTypeParameterListElementType.java | 4 +- .../psi/impl/source/JavaStubPsiElement.java | 2 +- .../psi/impl/source/PsiParameterImpl.java | 4 +- .../psi/impl/source/PsiParameterListImpl.java | 4 +- .../source/tree/java/ParameterElement.java | 3 +- .../intellij/psi/stubs/IStubElementType.java | 4 +- .../psi/stubs/EmptyStubElementType.java | 2 +- .../lang/parser/GroovyElementTypes.java | 44 +++++++++---------- .../elements/GrEnumConstantElementType.java | 5 ++- .../stubs/elements/GrFieldElementType.java | 5 ++- .../stubs/elements/GrMethodElementType.java | 3 +- .../elements/GrModifierListElementType.java | 5 ++- .../elements/GrReferenceListElementType.java | 3 +- .../elements/GrTypeDefinitionElementType.java | 2 +- .../parsing/PropertyListStubElementType.java | 5 ++- .../parsing/PropertyStubElementType.java | 5 ++- 29 files changed, 80 insertions(+), 73 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaAnnotationElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaAnnotationElementType.java index 90eab205435b..962e371793b3 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaAnnotationElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaAnnotationElementType.java @@ -48,12 +48,12 @@ public class JavaAnnotationElementType extends JavaStubElementType extends StubBasedPsiElementBase implements StubBasedPsiElement { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.JavaStubPsiElement"); - public JavaStubPsiElement(final T stub, IStubElementType nodeType) { + public JavaStubPsiElement(@NotNull T stub, @NotNull IStubElementType nodeType) { super(stub, nodeType); } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java index 38ff553b541d..ac27a012a2a9 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java @@ -44,11 +44,11 @@ public class PsiParameterImpl extends JavaStubPsiElement imple private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.PsiParameterImpl"); private volatile PatchedSoftReference myCachedType = null; - public PsiParameterImpl(final PsiParameterStub stub) { + public PsiParameterImpl(@NotNull PsiParameterStub stub) { super(stub, JavaStubElementTypes.PARAMETER); } - public PsiParameterImpl(final ASTNode node) { + public PsiParameterImpl(@NotNull ASTNode node) { super(node); } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterListImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterListImpl.java index b224bac150d7..687c19f90dfe 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterListImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterListImpl.java @@ -31,11 +31,11 @@ import org.jetbrains.annotations.NotNull; public class PsiParameterListImpl extends JavaStubPsiElement implements PsiParameterList { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.PsiParameterListImpl"); - public PsiParameterListImpl(final PsiParameterListStub stub) { + public PsiParameterListImpl(@NotNull PsiParameterListStub stub) { super(stub, JavaStubElementTypes.PARAMETER_LIST); } - public PsiParameterListImpl(final ASTNode node) { + public PsiParameterListImpl(@NotNull ASTNode node) { super(node); } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ParameterElement.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ParameterElement.java index c373753f96ae..0d3aeac52c66 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ParameterElement.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ParameterElement.java @@ -18,7 +18,6 @@ package com.intellij.psi.impl.source.tree.java; import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.JavaTokenType; -import com.intellij.psi.impl.source.Constants; import com.intellij.psi.impl.source.tree.ChildRole; import com.intellij.psi.impl.source.tree.CompositeElement; import com.intellij.psi.impl.source.tree.JavaElementType; @@ -29,7 +28,7 @@ public class ParameterElement extends CompositeElement{ private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.java.ParameterElement"); public ParameterElement() { - super(Constants.PARAMETER); + super(JavaElementType.PARAMETER); } protected ParameterElement(IElementType type) { diff --git a/platform/core-api/src/com/intellij/psi/stubs/IStubElementType.java b/platform/core-api/src/com/intellij/psi/stubs/IStubElementType.java index e698723506e7..a03fb0c5f9b8 100644 --- a/platform/core-api/src/com/intellij/psi/stubs/IStubElementType.java +++ b/platform/core-api/src/com/intellij/psi/stubs/IStubElementType.java @@ -32,9 +32,9 @@ public abstract class IStubElementType extends IStubEl } @Override - public final EmptyStub createStub(T psi, StubElement parentStub) { + public final EmptyStub createStub(@NotNull T psi, StubElement parentStub) { return createStub(parentStub); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java index d6522b4df6d0..45a1ce9622d3 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java @@ -68,32 +68,32 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy */ GrStubElementType CLASS_DEFINITION = new GrTypeDefinitionElementType("class definition") { - public GrClassDefinition createPsi(GrTypeDefinitionStub stub) { + public GrClassDefinition createPsi(@NotNull GrTypeDefinitionStub stub) { return new GrClassDefinitionImpl(stub); } }; GrStubElementType INTERFACE_DEFINITION = new GrTypeDefinitionElementType("interface definition") { - public GrInterfaceDefinition createPsi(GrTypeDefinitionStub stub) { + public GrInterfaceDefinition createPsi(@NotNull GrTypeDefinitionStub stub) { return new GrInterfaceDefinitionImpl(stub); } }; GrStubElementType ENUM_DEFINITION = new GrTypeDefinitionElementType("enumeration definition") { - public GrEnumTypeDefinition createPsi(GrTypeDefinitionStub stub) { + public GrEnumTypeDefinition createPsi(@NotNull GrTypeDefinitionStub stub) { return new GrEnumTypeDefinitionImpl(stub); } }; GrStubElementType ANNOTATION_DEFINITION = new GrTypeDefinitionElementType("annotation definition") { - public GrAnnotationTypeDefinition createPsi(GrTypeDefinitionStub stub) { + public GrAnnotationTypeDefinition createPsi(@NotNull GrTypeDefinitionStub stub) { return new GrAnnotationTypeDefinitionImpl(stub); } }; GrStubElementType ANONYMOUS_CLASS_DEFINITION = new GrTypeDefinitionElementType("Anonymous class") { @Override - public GrAnonymousClassDefinition createPsi(GrTypeDefinitionStub stub) { + public GrAnonymousClassDefinition createPsi(@NotNull GrTypeDefinitionStub stub) { return new GrAnonymousClassDefinitionImpl(stub); } }; @@ -101,7 +101,7 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy GrStubElementType ENUM_CONSTANT_INITIALIZER = new GrTypeDefinitionElementType("Enum constant initializer") { @Override - public GrEnumConstantInitializer createPsi(GrTypeDefinitionStub stub) { + public GrEnumConstantInitializer createPsi(@NotNull GrTypeDefinitionStub stub) { return new GrEnumConstantInitializerImpl(stub); } }; @@ -112,13 +112,13 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy GrStubElementType FIELD = new GrFieldElementType(); GrMethodElementType METHOD_DEFINITION = new GrMethodElementType("method definition") { - public GrMethod createPsi(GrMethodStub stub) { + public GrMethod createPsi(@NotNull GrMethodStub stub) { return new GrMethodImpl(stub); } }; GrStubElementType ANNOTATION_METHOD = new GrMethodElementType("annotation method") { @Override - public GrMethod createPsi(GrMethodStub stub) { + public GrMethod createPsi(@NotNull GrMethodStub stub) { return new GrAnnotationMethodImpl(stub); } @@ -133,12 +133,12 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy }; GrReferenceListElementType IMPLEMENTS_CLAUSE = new GrReferenceListElementType("implements clause") { - public GrImplementsClause createPsi(GrReferenceListStub stub) { + public GrImplementsClause createPsi(@NotNull GrReferenceListStub stub) { return new GrImplementsClauseImpl(stub); } }; GrReferenceListElementType EXTENDS_CLAUSE = new GrReferenceListElementType("super class clause") { - public GrExtendsClause createPsi(GrReferenceListStub stub) { + public GrExtendsClause createPsi(@NotNull GrReferenceListStub stub) { return new GrExtendsClauseImpl(stub); } }; @@ -263,19 +263,19 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy GroovyElementType TYPE_ARGUMENT = new GroovyElementType("type argument"); EmptyStubElementType TYPE_PARAMETER_LIST = new EmptyStubElementType("type parameter list", GroovyFileType.GROOVY_LANGUAGE) { @Override - public GrTypeParameterList createPsi(EmptyStub stub) { + public GrTypeParameterList createPsi(@NotNull EmptyStub stub) { return new GrTypeParameterListImpl(stub); } }; GrStubElementType TYPE_PARAMETER = new GrStubElementType("type parameter") { @Override - public GrTypeParameter createPsi(GrTypeParameterStub stub) { + public GrTypeParameter createPsi(@NotNull GrTypeParameterStub stub) { return new GrTypeParameterImpl(stub); } @Override - public GrTypeParameterStub createStub(GrTypeParameter psi, StubElement parentStub) { + public GrTypeParameterStub createStub(@NotNull GrTypeParameter psi, StubElement parentStub) { return new GrTypeParameterStub(parentStub, StringRef.fromString(psi.getName())); } @@ -295,7 +295,7 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy GrMethodElementType CONSTRUCTOR_DEFINITION = new GrMethodElementType("constructor definition") { @Override - public GrMethod createPsi(GrMethodStub stub) { + public GrMethod createPsi(@NotNull GrMethodStub stub) { return new GrConstructorImpl(stub); } }; @@ -313,12 +313,12 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy GrStubElementType ANNOTATION = new GrStubElementType("annotation") { @Override - public GrAnnotation createPsi(GrAnnotationStub stub) { + public GrAnnotation createPsi(@NotNull GrAnnotationStub stub) { return new GrAnnotationImpl(stub); } @Override - public GrAnnotationStub createStub(GrAnnotation psi, StubElement parentStub) { + public GrAnnotationStub createStub(@NotNull GrAnnotation psi, StubElement parentStub) { return new GrAnnotationStub(parentStub, psi); } @@ -335,19 +335,19 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy //parameters EmptyStubElementType PARAMETERS_LIST = new EmptyStubElementType("parameters list", GroovyFileType.GROOVY_LANGUAGE) { @Override - public GrParameterList createPsi(EmptyStub stub) { + public GrParameterList createPsi(@NotNull EmptyStub stub) { return new GrParameterListImpl(stub); } }; GrStubElementType PARAMETER = new GrStubElementType("parameter") { @Override - public GrParameter createPsi(GrParameterStub stub) { + public GrParameter createPsi(@NotNull GrParameterStub stub) { return new GrParameterImpl(stub); } @Override - public GrParameterStub createStub(GrParameter psi, StubElement parentStub) { + public GrParameterStub createStub(@NotNull GrParameter psi, StubElement parentStub) { return new GrParameterStub(parentStub, StringRef.fromString(psi.getName()), GrStubUtils.getAnnotationNames(psi), GrStubUtils.getTypeText(psi)); } @@ -369,7 +369,7 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy EmptyStubElementType CLASS_BODY = new EmptyStubElementType("class block", GroovyFileType.GROOVY_LANGUAGE) { @Override - public GrTypeDefinitionBody createPsi(EmptyStub stub) { + public GrTypeDefinitionBody createPsi(@NotNull EmptyStub stub) { return new GrTypeDefinitionBodyBase.GrClassBody(stub); } }; @@ -402,14 +402,14 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy } @Override - public GrVariableDeclaration createPsi(EmptyStub stub) { + public GrVariableDeclaration createPsi(@NotNull EmptyStub stub) { throw new UnsupportedOperationException("Not implemented"); } }; EmptyStubElementType VARIABLE_DEFINITION = new EmptyStubElementType("variable definitions", GroovyFileType.GROOVY_LANGUAGE) { @Override - public GrVariableDeclaration createPsi(EmptyStub stub) { + public GrVariableDeclaration createPsi(@NotNull EmptyStub stub) { return new GrVariableDeclarationBase.GrVariables(stub); } }; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrEnumConstantElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrEnumConstantElementType.java index 6c6f306f6ff9..25be19fda232 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrEnumConstantElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrEnumConstantElementType.java @@ -21,6 +21,7 @@ import com.intellij.psi.stubs.StubInputStream; import com.intellij.psi.stubs.StubOutputStream; import com.intellij.util.ArrayUtil; import com.intellij.util.io.StringRef; +import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.typedef.enumConstant.GrEnumConstantImpl; @@ -38,12 +39,12 @@ public class GrEnumConstantElementType extends GrStubElementType super("field"); } - public GrField createPsi(GrFieldStub stub) { + public GrField createPsi(@NotNull GrFieldStub stub) { return new GrFieldImpl(stub); } - public GrFieldStub createStub(GrField psi, StubElement parentStub) { + public GrFieldStub createStub(@NotNull GrField psi, StubElement parentStub) { String[] annNames = GrStubUtils.getAnnotationNames(psi); Set namedParameters = Collections.emptySet(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java index f5b746cbef1b..380a3a18e739 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrMethodElementType.java @@ -20,6 +20,7 @@ import com.intellij.psi.stubs.StubElement; import com.intellij.psi.stubs.StubInputStream; import com.intellij.psi.stubs.StubOutputStream; import com.intellij.util.io.StringRef; +import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrMethodStub; import org.jetbrains.plugins.groovy.lang.psi.stubs.GrStubUtils; @@ -38,7 +39,7 @@ public abstract class GrMethodElementType extends GrStubElementType namedParameters = psi.getNamedParameters().keySet(); return new GrMethodStub(parentStub, StringRef.fromString(psi.getName()), GrStubUtils.getAnnotationNames(psi), diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrModifierListElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrModifierListElementType.java index d9e342616506..c3eb8999161d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrModifierListElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrModifierListElementType.java @@ -18,6 +18,7 @@ package org.jetbrains.plugins.groovy.lang.psi.stubs.elements; import com.intellij.psi.stubs.StubElement; import com.intellij.psi.stubs.StubInputStream; import com.intellij.psi.stubs.StubOutputStream; +import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; import org.jetbrains.plugins.groovy.lang.psi.impl.auxiliary.modifiers.GrModifierListImpl; @@ -34,12 +35,12 @@ public class GrModifierListElementType extends GrStubElementType exte super(debugName); } - public GrReferenceListStub createStub(T psi, StubElement parentStub) { + public GrReferenceListStub createStub(@NotNull T psi, StubElement parentStub) { List refNames = new ArrayList(); for (GrCodeReferenceElement element : psi.getReferenceElements()) { final String name = element.getText(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrTypeDefinitionElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrTypeDefinitionElementType.java index 3abdb54889ee..d6d468845d25 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrTypeDefinitionElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrTypeDefinitionElementType.java @@ -42,7 +42,7 @@ public abstract class GrTypeDefinitionElementType Date: Mon, 5 Dec 2011 13:11:57 +0400 Subject: [PATCH 51/60] marks disappear on editor resize --- .../com/intellij/openapi/editor/impl/EditorImpl.java | 6 ++++-- .../openapi/editor/impl/EditorMarkupModelImpl.java | 10 +++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index e0a2c305e1a0..0378c3835c03 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -809,7 +809,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi myPanel.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { - myMarkupModel.repaint(0, myDocument.getTextLength()); + myMarkupModel.recalcEditorDimensions(); + myMarkupModel.repaint(-1, -1); } }); } @@ -1570,7 +1571,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi myEditorComponent.setSize(dim); myEditorComponent.fireResized(); - myMarkupModel.repaint(0, myDocument.getTextLength()); + myMarkupModel.recalcEditorDimensions(); + myMarkupModel.repaint(-1, -1); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java index e9610b3edf8a..af3064934e2d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java @@ -112,7 +112,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark return myMinMarkHeight; } - private void recalcEditorDimensions() { + void recalcEditorDimensions() { EditorImpl.MyScrollBar scrollBar = myEditor.getVerticalScrollBar(); int scrollBarHeight = scrollBar.getSize().height; @@ -751,10 +751,10 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark LOG.assertTrue(success); } - public void markDirtied(@NotNull ProperTextRange pos) { - int start = Math.max(0, pos.getStartOffset() - myEditor.getLineHeight()); - int end = myEditorScrollbarTop + myEditorTargetHeight == 0 ? pos.getEndOffset() + myEditor.getLineHeight() - : Math.min(myEditorScrollbarTop + myEditorTargetHeight, pos.getEndOffset() + myEditor.getLineHeight()); + public void markDirtied(@NotNull ProperTextRange yPositions) { + int start = Math.max(0, yPositions.getStartOffset() - myEditor.getLineHeight()); + int end = myEditorScrollbarTop + myEditorTargetHeight == 0 ? yPositions.getEndOffset() + myEditor.getLineHeight() + : Math.min(myEditorScrollbarTop + myEditorTargetHeight, yPositions.getEndOffset() + myEditor.getLineHeight()); ProperTextRange adj = new ProperTextRange(start, Math.max(end, start)); if (myDirtyYPositions == null) { From 84478438fe4f6f1122e30aa6f8ccf368159f5d9f Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 5 Dec 2011 11:15:18 +0100 Subject: [PATCH 52/60] [^serega] diagnose the surrouners returning null elements (EA-32448) --- .../codeInsight/generation/surroundWith/SurroundWithHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/generation/surroundWith/SurroundWithHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/generation/surroundWith/SurroundWithHandler.java index 7b57fa44d292..91972927595b 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/generation/surroundWith/SurroundWithHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/generation/surroundWith/SurroundWithHandler.java @@ -118,6 +118,7 @@ public class SurroundWithHandler implements CodeInsightActionHandler { final PsiElement[] elements = descriptor.getElementsToSurround(file, startOffset, endOffset); if (elements.length > 0) { for (PsiElement element : elements) { + assert element != null : "descriptor " + descriptor + " returned null element"; assert element.isValid() : descriptor; } for (Surrounder s: descriptor.getSurrounders()) { From 1f23970ca2a6017c8f8ebb53164b9b53e29bc448 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Mon, 5 Dec 2011 15:01:24 +0400 Subject: [PATCH 53/60] [r=kb] memory leak fixes --- .../src/com/intellij/ui/IconDeferrerImpl.java | 9 +++++++++ .../openapi/wm/impl/ToolWindowManagerImpl.java | 10 +++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java b/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java index 51e387171e96..58aa34bdc7f7 100644 --- a/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java +++ b/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java @@ -20,10 +20,13 @@ package com.intellij.ui; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.impl.ProjectLifecycleListener; import com.intellij.psi.util.PsiModificationTracker; import com.intellij.util.Function; import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.MessageBusConnection; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.util.HashMap; @@ -42,6 +45,12 @@ public class IconDeferrerImpl extends IconDeferrer { clear(); } }); + connection.subscribe(ProjectLifecycleListener.TOPIC, new ProjectLifecycleListener.Adapter() { + @Override + public void afterProjectClosed(@NotNull Project project) { + clear(); + } + }); } private void clear() { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java index 59028eb5373d..58b53843c80f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java @@ -1183,7 +1183,9 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements button.dispose(); myId2StripeButton.remove(id); // - myId2FocusWatcher.remove(id); + ToolWindowFocusWatcher watcher = (ToolWindowFocusWatcher)myId2FocusWatcher.remove(id); + watcher.deinstall(); + // Destroy decorator final InternalDecorator decorator = getInternalDecorator(id); decorator.dispose(); @@ -1946,11 +1948,17 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements */ private final class ToolWindowFocusWatcher extends FocusWatcher { private final String myId; + private final ToolWindowImpl myToolWindow; private ToolWindowFocusWatcher(final ToolWindowImpl toolWindow) { myId = toolWindow.getId(); install(toolWindow.getComponent()); + myToolWindow = toolWindow; + } + + public void deinstall() { + deinstall(myToolWindow.getComponent()); } protected boolean isFocusedComponentChangeValid(final Component comp, final AWTEvent cause) { From 60e7d2bf27fc74707b2986e59cbc8797e33df1c5 Mon Sep 17 00:00:00 2001 From: Oleg Shpynov Date: Mon, 5 Dec 2011 15:07:24 +0400 Subject: [PATCH 54/60] [den] change for ideaVIM plugin to get rid of reflection --- .../src/com/intellij/execution/impl/ConsoleViewImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index 1d20e51a57e2..ba8cd9f2fbdd 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -95,7 +95,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo private static final int FLUSH_DELAY = 200; //TODO : make it an option - private static final Key CONSOLE_VIEW_IN_EDITOR_VIEW = Key.create("CONSOLE_VIEW_IN_EDITOR_VIEW"); + public static final Key CONSOLE_VIEW_IN_EDITOR_VIEW = Key.create("CONSOLE_VIEW_IN_EDITOR_VIEW"); static { final EditorActionManager actionManager = EditorActionManager.getInstance(); From c46695452c2e00818cc25916039fb136a218febf Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 5 Dec 2011 15:22:31 +0400 Subject: [PATCH 55/60] IDEA-77613: all of under the WebContent dir and files to be droped while i rebuild the project --- .../intellij/compiler/impl/CompileDriver.java | 2 + .../impl/compiler/ArtifactCompilerUtil.java | 54 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java index a299bba3bb1c..9586c74ecb05 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -77,6 +77,7 @@ import com.intellij.packaging.artifacts.ArtifactManager; import com.intellij.packaging.impl.artifacts.ArtifactImpl; import com.intellij.packaging.impl.artifacts.ArtifactUtil; import com.intellij.packaging.impl.compiler.ArtifactCompileScope; +import com.intellij.packaging.impl.compiler.ArtifactCompilerUtil; import com.intellij.pom.Navigatable; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.PsiDocumentManager; @@ -2474,6 +2475,7 @@ public class CompileDriver { } } } + affectedOutputPaths.addAll(ArtifactCompilerUtil.getArtifactOutputsContainingSourceFiles(myProject)); if (!affectedOutputPaths.isEmpty()) { final StringBuilder paths = new StringBuilder(); diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerUtil.java b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerUtil.java index f512c68e7a0b..6915ae2e3379 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerUtil.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/compiler/ArtifactCompilerUtil.java @@ -18,14 +18,32 @@ package com.intellij.packaging.impl.compiler; import com.intellij.openapi.compiler.CompileContext; import com.intellij.openapi.compiler.CompilerMessageCategory; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.JarFileSystem; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.packaging.artifacts.Artifact; +import com.intellij.packaging.artifacts.ArtifactManager; +import com.intellij.packaging.elements.ComplexPackagingElement; +import com.intellij.packaging.elements.PackagingElement; +import com.intellij.packaging.elements.PackagingElementResolvingContext; +import com.intellij.packaging.impl.artifacts.ArtifactUtil; +import com.intellij.packaging.impl.artifacts.PackagingElementPath; +import com.intellij.packaging.impl.artifacts.PackagingElementProcessor; +import com.intellij.packaging.impl.elements.ArtifactPackagingElement; +import com.intellij.packaging.impl.elements.FileOrDirectoryCopyPackagingElement; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -65,4 +83,40 @@ public class ArtifactCompilerUtil { String fullPath = jarEntry.getPath(); return new File(FileUtil.toSystemDependentName(fullPath.substring(fullPath.indexOf(JarFileSystem.JAR_SEPARATOR)))); } + + + @NotNull + public static Set getArtifactOutputsContainingSourceFiles(final @NotNull Project project) { + final List allOutputs = new ArrayList(); + for (Artifact artifact : ArtifactManager.getInstance(project).getArtifacts()) { + ContainerUtil.addIfNotNull(artifact.getOutputFile(), allOutputs); + } + + final Set affectedOutputPaths = new HashSet(); + final PackagingElementResolvingContext context = ArtifactManager.getInstance(project).getResolvingContext(); + for (Artifact artifact : ArtifactManager.getInstance(project).getArtifacts()) { + ArtifactUtil.processPackagingElements(artifact, null, new PackagingElementProcessor>() { + @Override + public boolean shouldProcessSubstitution(ComplexPackagingElement element) { + return !(element instanceof ArtifactPackagingElement); + } + + @Override + public boolean process(@NotNull PackagingElement element, @NotNull PackagingElementPath path) { + if (element instanceof FileOrDirectoryCopyPackagingElement) { + final VirtualFile file = ((FileOrDirectoryCopyPackagingElement)element).findFile(); + if (file != null) { + for (VirtualFile output : allOutputs) { + if (VfsUtilCore.isAncestor(output, file, false)) { + affectedOutputPaths.add(output); + } + } + } + } + return true; + } + }, context, true); + } + return affectedOutputPaths; + } } From 2a2c7a2b7fe830e646fb836af46cba2280a225d0 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Mon, 5 Dec 2011 15:20:00 +0400 Subject: [PATCH 56/60] extensibility points for haml parser[r=oleg] --- .../com/intellij/indentation/IndentationParser.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/indentation/IndentationParser.java b/platform/lang-impl/src/com/intellij/indentation/IndentationParser.java index 76b41402461d..7edfc9f94405 100644 --- a/platform/lang-impl/src/com/intellij/indentation/IndentationParser.java +++ b/platform/lang-impl/src/com/intellij/indentation/IndentationParser.java @@ -79,7 +79,7 @@ public abstract class IndentationParser implements PsiParser { currentIndent = 0; } } - builder.advanceLexer(); + advanceLexer(builder); } // Close all left opened markers @@ -90,10 +90,20 @@ public abstract class IndentationParser implements PsiParser { stack.pop().second.done(myBlockElementType); } + return buildTree(fileMarker, builder, root); + } + + protected ASTNode buildTree(final PsiBuilder.Marker fileMarker, + final PsiBuilder builder, + final IElementType root) { fileMarker.done(root); return builder.getTreeBuilt(); } + protected void advanceLexer(PsiBuilder builder) { + builder.advanceLexer(); + } + private void passEOLsAndIndents(final PsiBuilder builder) { IElementType tokenType = builder.getTokenType(); while (tokenType == myEolTokenType || tokenType == myIndentTokenType){ From ddfbc3a858c6ae438ee4dfa1a463af64bf714950 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Mon, 5 Dec 2011 15:41:52 +0400 Subject: [PATCH 57/60] IDEA-75674: deadlock, fixed by lock ordering. --- .../vfs/impl/local/LocalFileSystemImpl.java | 150 ++++++++++-------- 1 file changed, 86 insertions(+), 64 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/LocalFileSystemImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/LocalFileSystemImpl.java index f779b2b28be4..567503997d9b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/LocalFileSystemImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/LocalFileSystemImpl.java @@ -20,6 +20,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileSystemUtil; import com.intellij.openapi.util.io.FileUtil; @@ -175,6 +176,8 @@ public final class LocalFileSystemImpl extends LocalFileSystemBase implements Ap private WatchRequest[] normalizeRootsForRefresh() { if (myCachedNormalizedRequests != null) return myCachedNormalizedRequests; List result = new ArrayList(); + + // No need to call for a read action here since we're only called with it on hands already. WRITE_LOCK.lock(); try { NextRoot: @@ -338,37 +341,43 @@ public final class LocalFileSystemImpl extends LocalFileSystemBase implements Ap } @Override - public WatchRequest addRootToWatch(@NotNull String rootPath, boolean toWatchRecursively) { + public WatchRequest addRootToWatch(@NotNull final String rootPath, final boolean toWatchRecursively) { if (rootPath.length() == 0 || !FileWatcher.getInstance().isOperational()) return null; - WRITE_LOCK.lock(); - try { - final WatchRequestImpl result = new WatchRequestImpl(rootPath, toWatchRecursively); - boolean alreadyWatched = isAlreadyWatched(result); - if (!alreadyWatched) { - final VirtualFile existingFile = findFileByPathIfCached(rootPath); - if (existingFile != null) { - final ModalityState modalityState = ModalityState.defaultModalityState(); - RefreshQueue.getInstance().refresh(true, toWatchRecursively, null, modalityState, existingFile); - if (existingFile.isDirectory() && !toWatchRecursively && existingFile instanceof NewVirtualFile) { - for (VirtualFile child : ((NewVirtualFile)existingFile).getCachedChildren()) { - RefreshQueue.getInstance().refresh(true, false, null, modalityState, child); + Application app = ApplicationManager.getApplication(); + return app.runReadAction(new Computable() { + @Override + public WatchRequest compute() { + WRITE_LOCK.lock(); + try { + final WatchRequestImpl result = new WatchRequestImpl(rootPath, toWatchRecursively); + boolean alreadyWatched = isAlreadyWatched(result); + if (!alreadyWatched) { + final VirtualFile existingFile = findFileByPathIfCached(rootPath); + if (existingFile != null) { + final ModalityState modalityState = ModalityState.defaultModalityState(); + RefreshQueue.getInstance().refresh(true, toWatchRecursively, null, modalityState, existingFile); + if (existingFile.isDirectory() && !toWatchRecursively && existingFile instanceof NewVirtualFile) { + for (VirtualFile child : ((NewVirtualFile)existingFile).getCachedChildren()) { + RefreshQueue.getInstance().refresh(true, false, null, modalityState, child); + } + } } } + myRootsToWatch.add(result); + if (alreadyWatched) { + result.myDominated = true; + return result; + } + myCachedNormalizedRequests = null; + setUpFileWatcher(); + return result; + } + finally { + WRITE_LOCK.unlock(); } } - myRootsToWatch.add(result); - if (alreadyWatched) { - result.myDominated = true; - return result; - } - myCachedNormalizedRequests = null; - setUpFileWatcher(); - return result; - } - finally { - WRITE_LOCK.unlock(); - } + }); } private boolean isAlreadyWatched(final WatchRequest request) { @@ -383,33 +392,38 @@ public final class LocalFileSystemImpl extends LocalFileSystemBase implements Ap public Set addRootsToWatch(@NotNull final Collection rootPaths, final boolean toWatchRecursively) { if (!FileWatcher.getInstance().isOperational()) return Collections.emptySet(); - Set result = new HashSet(); - Set filesToSynchronize = new HashSet(); + final Set result = new HashSet(); + final Set filesToSynchronize = new HashSet(); - WRITE_LOCK.lock(); - try { - for (String rootPath : rootPaths) { - LOG.assertTrue(rootPath != null); - if (rootPath.length() > 0) { - final WatchRequestImpl request = new WatchRequestImpl(rootPath, toWatchRecursively); - final VirtualFile existingFile = findFileByPathIfCached(rootPath); - if (existingFile != null) { - if (!isAlreadyWatched(request)) { - filesToSynchronize.add(existingFile); + Application application = ApplicationManager.getApplication(); + application.runReadAction(new Runnable() { + public void run() { + WRITE_LOCK.lock(); + try { + for (String rootPath : rootPaths) { + LOG.assertTrue(rootPath != null); + if (rootPath.length() > 0) { + final WatchRequestImpl request = new WatchRequestImpl(rootPath, toWatchRecursively); + final VirtualFile existingFile = findFileByPathIfCached(rootPath); + if (existingFile != null) { + if (!isAlreadyWatched(request)) { + filesToSynchronize.add(existingFile); + } + } + result.add(request); + myRootsToWatch.add(request); //add in any case, safe to add inplace without copying myRootsToWatch before the loop } } - result.add(request); - myRootsToWatch.add(request); //add in any case, safe to add inplace without copying myRootsToWatch before the loop + myCachedNormalizedRequests = null; + setUpFileWatcher(); + } + finally { + WRITE_LOCK.unlock(); } } - myCachedNormalizedRequests = null; - setUpFileWatcher(); - } - finally { - WRITE_LOCK.unlock(); - } + }); - if (!ApplicationManager.getApplication().isUnitTestMode() && !filesToSynchronize.isEmpty()) { + if (!application.isUnitTestMode() && !filesToSynchronize.isEmpty()) { for (VirtualFile file : filesToSynchronize) { if (file instanceof NewVirtualFile && file.getFileSystem() instanceof LocalFileSystem) { ((NewVirtualFile)file).markDirtyRecursively(); @@ -423,30 +437,38 @@ public final class LocalFileSystemImpl extends LocalFileSystemBase implements Ap @Override public void removeWatchedRoot(@NotNull final WatchRequest watchRequest) { - WRITE_LOCK.lock(); - try { - if (myRootsToWatch.remove((WatchRequestImpl)watchRequest) && !((WatchRequestImpl)watchRequest).myDominated) { - myCachedNormalizedRequests = null; - setUpFileWatcher(); + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + WRITE_LOCK.lock(); + try { + if (myRootsToWatch.remove((WatchRequestImpl)watchRequest) && !((WatchRequestImpl)watchRequest).myDominated) { + myCachedNormalizedRequests = null; + setUpFileWatcher(); + } + } + finally { + WRITE_LOCK.unlock(); + } } - } - finally { - WRITE_LOCK.unlock(); - } + }); } @Override public void removeWatchedRoots(@NotNull final Collection rootsToWatch) { - WRITE_LOCK.lock(); - try { - if (myRootsToWatch.removeAll(rootsToWatch)) { - myCachedNormalizedRequests = null; - setUpFileWatcher(); + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + WRITE_LOCK.lock(); + try { + if (myRootsToWatch.removeAll(rootsToWatch)) { + myCachedNormalizedRequests = null; + setUpFileWatcher(); + } + } + finally { + WRITE_LOCK.unlock(); + } } - } - finally { - WRITE_LOCK.unlock(); - } + }); } @Override From 1642da44f978ecefb848f2240bdbd674253b4328 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 5 Dec 2011 12:58:56 +0100 Subject: [PATCH 58/60] NPE from structure view on deleting module (IDEA-59437) --- .../impl/nodes/StructureViewModuleNode.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/StructureViewModuleNode.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/StructureViewModuleNode.java index 14fbc7249c8e..c9d8ac8b2fff 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/StructureViewModuleNode.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/StructureViewModuleNode.java @@ -25,6 +25,7 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; public class StructureViewModuleNode extends AbstractModuleNode { @@ -34,15 +35,20 @@ public class StructureViewModuleNode extends AbstractModuleNode { @NotNull public Collection getChildren() { + final Module module = getValue(); + if (module == null) { + // just deleted a module from project view + return Collections.emptyList(); + } final List children = new ArrayList(2); - children.add(new LibraryGroupNode(getProject(), new LibraryGroupElement(getValue()), getSettings()) { + children.add(new LibraryGroupNode(getProject(), new LibraryGroupElement(module), getSettings()) { @Override public boolean isAlwaysExpand() { return true; } }); - children.add(new ModuleListNode(getProject(), getValue(), getSettings())); + children.add(new ModuleListNode(getProject(), module, getSettings())); return children; } From 48449f51fb790c4c74c6c070f20550dc074cd4fc Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Mon, 5 Dec 2011 16:19:56 +0400 Subject: [PATCH 59/60] [r=maxim.mossienko] Rollback re-setting thread locals for release. Seem to have caused unexplainable issues in stub index update. --- .../intellij/openapi/application/impl/ApplicationImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index a91d360ede33..9c7c302d025b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -419,7 +419,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application LOG.error(t); } finally { - ReflectionUtil.resetThreadLocals(); + //ReflectionUtil.resetThreadLocals(); Thread.interrupted(); // reset interrupted status } } @@ -440,7 +440,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application LOG.error(t); } finally { - ReflectionUtil.resetThreadLocals(); + //ReflectionUtil.resetThreadLocals(); Thread.interrupted(); // reset interrupted status } return null; From 85075062a47f0396cc7de3b4f25d2407d3855586 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 5 Dec 2011 12:56:21 +0100 Subject: [PATCH 60/60] IDEA-78077 Notifications: balloons are not shown if notification is triggered without a project specified --- .../notification/impl/NotificationsManagerImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java b/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java index ef23e8aa07e1..bdd182ccc2df 100644 --- a/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java @@ -243,8 +243,13 @@ public class NotificationsManagerImpl extends NotificationsManager implements No } } + @Nullable public static Window findWindowForBalloon(Project project) { - return WindowManager.getInstance().getFrame(project); + final JFrame frame = WindowManager.getInstance().getFrame(project); + if (frame == null && project == null) { + return KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow(); + } + return frame; } public static Balloon createBalloon(final Notification notification, final boolean showCallout, final boolean hideOnClickOutside, final boolean fadeOut) {