diff --git a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java index 5ac0528cc7e5..451a49752c8b 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java @@ -46,7 +46,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea { ourDefaultEPs.put(EPAvailabilityListenerExtension.EXTENSION_POINT_NAME, EPAvailabilityListenerExtension.class.getName()); } - private static final boolean DEBUG_REGISTRATION = true; + private static final boolean DEBUG_REGISTRATION = false; private AreaPicoContainerImpl myPicoContainer; private Throwable myCreationTrace = null; diff --git a/platform/lang-impl/src/com/intellij/ide/scriptingContext/LangScriptingContextConfigurable.java b/platform/lang-impl/src/com/intellij/ide/scriptingContext/LangScriptingContextConfigurable.java index 45f9a6cdcb34..cec9a3a05c46 100644 --- a/platform/lang-impl/src/com/intellij/ide/scriptingContext/LangScriptingContextConfigurable.java +++ b/platform/lang-impl/src/com/intellij/ide/scriptingContext/LangScriptingContextConfigurable.java @@ -15,6 +15,7 @@ */ package com.intellij.ide.scriptingContext; +import com.intellij.ide.scriptingContext.ui.ScriptingLibrariesPanelStub; import com.intellij.ide.scriptingContext.ui.ScriptingContextsConfigurable; import com.intellij.ide.scriptingContext.ui.ScriptingLibrariesPanel; import com.intellij.openapi.application.ApplicationManager; @@ -30,16 +31,22 @@ import javax.swing.*; * @author Rustam Vishnyakov */ public abstract class LangScriptingContextConfigurable implements Configurable, Configurable.Composite { - private ScriptingLibrariesPanel myPanel; - private ScriptingLibraryManager myLibManager; + private final ScriptingLibrariesPanelStub myPanel; + private final ScriptingLibraryManager myLibManager; private ScriptingContextsConfigurable myContextsConfigurable; + private final String productName = System.getProperty("idea.platform.prefix"); public LangScriptingContextConfigurable(Project project, LangScriptingContextProvider provider) { myLibManager = new ScriptingLibraryManager(project, provider.getLibraryType()); - myPanel = new ScriptingLibrariesPanel(provider, project, myLibManager); + myPanel = useDedicatedLibraryUI() ? new ScriptingLibrariesPanel(provider, project, myLibManager) : new ScriptingLibrariesPanelStub(); myContextsConfigurable = new ScriptingContextsConfigurable(project, provider); } + private boolean useDedicatedLibraryUI() { + //TODO Find a better way to check it + return "WebStorm".equalsIgnoreCase(productName) || "PhpStorm".equalsIgnoreCase(productName); + } + @Nls @Override public String getDisplayName() { diff --git a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanel.java b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanel.java index 7ff9a0f8f2bf..c2766e432d5c 100644 --- a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanel.java +++ b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanel.java @@ -32,7 +32,7 @@ import java.awt.event.ActionListener; /** * @author Rustam Vishnyakov */ -public class ScriptingLibrariesPanel { +public class ScriptingLibrariesPanel extends ScriptingLibrariesPanelStub { private JPanel myTopPanel; private JButton myAddLibraryButton; private JButton myRemoveLibraryButton; diff --git a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanelStub.form b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanelStub.form new file mode 100644 index 000000000000..f265e89629f9 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanelStub.form @@ -0,0 +1,26 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanelStub.java b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanelStub.java new file mode 100644 index 000000000000..49e6db0cf74a --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanelStub.java @@ -0,0 +1,23 @@ +package com.intellij.ide.scriptingContext.ui; + +import javax.swing.*; + +/** + * @author Rustam Vishnyakov + */ +public class ScriptingLibrariesPanelStub { + private JPanel myMainPanel; + + public JComponent getPanel() { + return myMainPanel; + } + + + public boolean isModified() { + return false; + } + + public void resetTable() { + // Do nothing + } +} diff --git a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibraryPanelBase.java b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibraryPanelBase.java new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerImpl.java index a26fe4b5c0f4..d173349a1877 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerImpl.java @@ -24,8 +24,10 @@ import com.intellij.injected.editor.DocumentWindow; import com.intellij.lang.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.CaretModel; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.VisualPosition; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; @@ -41,6 +43,7 @@ import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.impl.source.SourceTreeToPsiMap; import com.intellij.psi.impl.source.tree.*; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.util.PsiUtilBase; import com.intellij.util.CharTable; import com.intellij.util.IncorrectOperationException; import com.intellij.util.text.CharArrayUtil; @@ -159,6 +162,37 @@ public class CodeStyleManagerImpl extends CodeStyleManager { postProcessText(file, new TextRange(formatFromStart ? 0 : startElement.getTextRange().getStartOffset(), formatToEnd ? file.getTextLength() : endElement.getTextRange().getEndOffset())); } + + Editor editor = PsiUtilBase.findEditor(file); + if (editor == null) { + return; + } + + CaretModel caretModel = editor.getCaretModel(); + String indent = getLineIndent(file, caretModel.getOffset()); + int tabSize = getSettings().getTabSize(file.getFileType()); + int indentColumn = indentWithInVisualColumns(indent, tabSize); + VisualPosition position = caretModel.getVisualPosition(); + if (indentColumn != position.column) { + caretModel.moveToVisualPosition(new VisualPosition(position.line, indentColumn)); + } + } + + private static int indentWithInVisualColumns(String indent, int tabSize) { + if (tabSize <= 1) { + return indent.length(); + } + int result = 0; + for (int i = 0; i < indent.length(); i++) { + char c = indent.charAt(i); + if (c == '\t') { + result += tabSize - result % tabSize; + } + else { + result++; + } + } + return result; } private PsiElement reformatRangeImpl(final PsiElement element, diff --git a/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java b/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java index 313b92f74a2d..2580c6aee71d 100644 --- a/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java +++ b/platform/platform-impl/src/com/intellij/ide/impl/ProjectUtil.java @@ -21,6 +21,7 @@ import com.intellij.ide.IdeBundle; import com.intellij.ide.highlighter.ModuleFileType; import com.intellij.ide.highlighter.ProjectFileType; import com.intellij.ide.highlighter.WorkspaceFileType; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.StorageScheme; import com.intellij.openapi.components.impl.stores.IProjectStore; import com.intellij.openapi.diagnostic.Logger; @@ -31,6 +32,7 @@ import com.intellij.openapi.project.ex.ProjectEx; import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.ActionCallback; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.io.FileUtil; @@ -87,10 +89,14 @@ public class ProjectUtil { /** * @param project cannot be null */ - public static boolean closeProject(@NotNull Project project) { - if (!ProjectManagerEx.getInstanceEx().closeProject(project)) return false; - Disposer.dispose(project); - return true; + public static boolean closeProject(@NotNull final Project project) { + return ApplicationManager.getApplication().runWriteAction(new Computable() { + public Boolean compute() { + if (!ProjectManagerEx.getInstanceEx().closeProject(project)) return false; + Disposer.dispose(project); + return true; + } + }); } /** diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java index f2a9a597e533..c473abf4c7d3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java @@ -80,13 +80,8 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx { private final AtomicBoolean mySavingInProgress = new AtomicBoolean(false); - @NonNls private static final String PROJECT_LAYER = "project-components"; - public boolean myOptimiseTestLoadSpeed; @NonNls public static final String TEMPLATE_PROJECT_NAME = "Default (Template) Project"; - @NonNls private static final String DEPRECATED_MESSAGE = "Deprecated method usage: {0}.\n" + - "This method will cease to exist in IDEA 7.0 final release.\n" + - "Please contact plugin developers for plugin update."; private final Condition myDisposedCondition = new Condition() { public boolean value(final Object o) { @@ -325,7 +320,11 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx { public synchronized void dispose() { ApplicationEx application = ApplicationManagerEx.getApplicationEx(); - assert application.isHeadlessEnvironment() || application.isUnitTestMode() || application.isDispatchThread() || application.isInModalProgressThread(); + assert application.isDispatchThread(); + + // can call dispose only via com.intellij.ide.impl.ProjectUtil.closeProject() + LOG.assertTrue(ApplicationManager.getApplication().isUnitTestMode() || !ProjectManagerEx.getInstanceEx().isProjectOpened(this)); + LOG.assertTrue(!isDisposed()); if (myProjectManagerListener != null) { myManager.removeProjectManagerListener(this, myProjectManagerListener); @@ -472,10 +471,10 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx { public static class UnableToSaveProjectNotification extends Notification { private Project myProject; - private String[] myFileNames; + private final String[] myFileNames; private UnableToSaveProjectNotification(@NotNull final Project project, final VirtualFile[] readOnlyFiles) { - super("Project Settings", "Could not save project!", buildMessage(readOnlyFiles), NotificationType.ERROR, new NotificationListener() { + super("Project Settings", "Could not save project!", buildMessage(), NotificationType.ERROR, new NotificationListener() { @Override public void hyperlinkUpdate(@NotNull Notification notification, @NotNull HyperlinkEvent event) { final UnableToSaveProjectNotification unableToSaveProjectNotification = (UnableToSaveProjectNotification)notification; @@ -501,7 +500,7 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx { return myFileNames; } - private static String buildMessage(final VirtualFile[] readOnlyFiles) { + private static String buildMessage() { final StringBuffer sb = new StringBuffer( "

Unable to save project files. Please ensure project files are writable and you have permissions to modify them."); return sb.append(" Try to save project again.

").toString(); @@ -517,5 +516,4 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx { super.expire(); } } - } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/rename/RenameTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/rename/RenameTest.groovy index a31ee0af7343..a921fe515d4e 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/rename/RenameTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/rename/RenameTest.groovy @@ -225,6 +225,31 @@ class A { return newName; } + public void _testRecursivePathRename() { + def file = myFixture.configureByText("SomeBean.groovy", """ +class SomeBean { + + SomeBean someBean + + static { + new SomeBean().someBean.someBean.someBean.someBean.toString() + } +} +""") + myFixture.renameElementAtCaret "b" + + assertEquals """ +class SomeBean { + + SomeBean b + + static { + new SomeBean().b.b.b.b.toString() + } +} +""", file.text + } + public void testDontAutoRenameDynamicallyTypeUsage() throws Exception { myFixture.configureByText "a.groovy", """ class Goo {