diff options
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/fileEditor')
7 files changed, 41 insertions, 233 deletions
diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java index c2353d5db207..03b03faffe03 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java @@ -277,6 +277,8 @@ public final class EditorTabbedContainer implements Disposable, CloseAction.Clos myTabs.getTabAt(index).setTooltipText(text); } + public boolean isTitleShortened(int index) { return myTabs.getTabAt(index).isTitleShortened(); } + public void setBackgroundColorAt(final int index, final Color color) { myTabs.getTabAt(index).setTabColor(color); } diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWindow.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWindow.java index 3519ab6a1af4..06a3966ade1d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWindow.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWindow.java @@ -34,6 +34,7 @@ import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.fileTypes.FileTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Splitter; +import com.intellij.openapi.ui.ThreeComponentsSplitter; import com.intellij.openapi.util.*; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; @@ -319,6 +320,16 @@ public class EditorWindow { if (disposeIfNeeded && getTabCount() == 0) { removeFromSplitter(); + if (UISettings.getInstance().EDITOR_TAB_PLACEMENT == UISettings.TABS_NONE) { + final EditorsSplitters owner = getOwner(); + if (owner != null) { + final ThreeComponentsSplitter splitter = UIUtil.getParentOfType(ThreeComponentsSplitter.class, owner); + if (splitter != null) { + splitter.revalidate(); + splitter.repaint(); + } + } + } } else { myPanel.revalidate(); @@ -453,6 +464,10 @@ public class EditorWindow { } } + private boolean isTitleShortenedAt(int index) { + return myTabbedPane != null && myTabbedPane.isTitleShortened(index); + } + private void setBackgroundColorAt(final int index, final Color color) { if (myTabbedPane != null) { myTabbedPane.setBackgroundColorAt(index, color); @@ -897,7 +912,9 @@ public class EditorWindow { final int index = findEditorIndex(findFileComposite(file)); if (index != -1) { setTitleAt(index, EditorTabbedContainer.calcTabTitle(getManager().getProject(), file)); - setToolTipTextAt(index, UISettings.getInstance().SHOW_TABS_TOOLTIPS ? getManager().getFileTooltipText(file) : null); + setToolTipTextAt(index, UISettings.getInstance().SHOW_TABS_TOOLTIPS || isTitleShortenedAt(index) + ? getManager().getFileTooltipText(file) + : null); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileDocumentManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileDocumentManagerImpl.java index f396b1eed399..091ff1171157 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileDocumentManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileDocumentManagerImpl.java @@ -37,6 +37,7 @@ import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.ex.DocumentEx; import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; import com.intellij.openapi.editor.impl.EditorFactoryImpl; +import com.intellij.openapi.editor.impl.TrailingSpacesStripper; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileEditor.*; import com.intellij.openapi.fileEditor.impl.text.TextEditorImpl; diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java index e36a120d609b..c7fa51f770d1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java @@ -227,7 +227,7 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec fm.doWhenFocusSettlesDown(run); } else { - run.run(); + UIUtil.invokeAndWaitIfNeeded(run); } return result; diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/NonProjectFileWritingAccessProvider.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/NonProjectFileWritingAccessProvider.java index 69a91ec31970..b19b2aa3e943 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/NonProjectFileWritingAccessProvider.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/NonProjectFileWritingAccessProvider.java @@ -16,7 +16,6 @@ package com.intellij.openapi.fileEditor.impl; import com.intellij.ProjectTopics; -import com.intellij.ide.IdeEventQueue; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.StorageScheme; import com.intellij.openapi.components.impl.stores.IProjectStore; @@ -30,6 +29,7 @@ import com.intellij.openapi.roots.ModuleRootEvent; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.NotNullLazyKey; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.*; import com.intellij.util.NotNullFunction; import com.intellij.util.NullableFunction; @@ -114,9 +114,7 @@ public class NonProjectFileWritingAccessProvider extends WritingAccessProvider { if (deniedFiles.isEmpty()) return Collections.emptyList(); - final int savedEventCount = IdeEventQueue.getInstance().getEventCount(); UnlockOption unlockOption = askToUnlock(deniedFiles); - IdeEventQueue.getInstance().setEventCount(savedEventCount); if (unlockOption == null) return deniedFiles; @@ -144,7 +142,9 @@ public class NonProjectFileWritingAccessProvider extends WritingAccessProvider { } private boolean isProjectFile(@NotNull VirtualFile file) { - if (ProjectFileIndex.SERVICE.getInstance(myProject).isInContent(file)) return true; + ProjectFileIndex fileIndex = ProjectFileIndex.SERVICE.getInstance(myProject); + if (fileIndex.isInContent(file)) return true; + if (!Registry.is("ide.hide.excluded.files") && fileIndex.isExcluded(file) && !fileIndex.isUnderIgnored(file)) return true; if (myProject instanceof ProjectEx) { IProjectStore store = ((ProjectEx)myProject).getStateStore(); diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/TrailingSpacesStripper.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/TrailingSpacesStripper.java deleted file mode 100644 index a5c477facfb3..000000000000 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/TrailingSpacesStripper.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright 2000-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.openapi.fileEditor.impl; - -import com.intellij.ide.DataManager; -import com.intellij.injected.editor.DocumentWindow; -import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.command.CommandProcessor; -import com.intellij.openapi.editor.*; -import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; -import com.intellij.openapi.editor.impl.DocumentImpl; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.fileEditor.FileDocumentManagerAdapter; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.ShutDownTracker; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.wm.IdeFocusManager; -import com.intellij.util.ArrayUtil; -import com.intellij.util.text.CharArrayUtil; -import gnu.trove.THashSet; -import org.jetbrains.annotations.NotNull; - -import java.awt.*; -import java.util.*; -import java.util.List; - -public final class TrailingSpacesStripper extends FileDocumentManagerAdapter { - - public static final Key<String> OVERRIDE_STRIP_TRAILING_SPACES_KEY = Key.create("OVERRIDE_TRIM_TRAILING_SPACES_KEY"); - public static final Key<Boolean> OVERRIDE_ENSURE_NEWLINE_KEY = Key.create("OVERRIDE_ENSURE_NEWLINE_KEY"); - - private final Set<Document> myDocumentsToStripLater = new THashSet<Document>(); - - @Override - public void beforeAllDocumentsSaving() { - Set<Document> documentsToStrip = new THashSet<Document>(myDocumentsToStripLater); - myDocumentsToStripLater.clear(); - for (Document document : documentsToStrip) { - strip(document); - } - } - - @Override - public void beforeDocumentSaving(@NotNull Document document) { - strip(document); - } - - private void strip(final Document document) { - if (!document.isWritable()) return; - FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); - VirtualFile file = fileDocumentManager.getFile(document); - if (file == null || !file.isValid()) return; - - final EditorSettingsExternalizable settings = EditorSettingsExternalizable.getInstance(); - if (settings == null) return; - - final String overrideStripTrailingSpacesData = file.getUserData(OVERRIDE_STRIP_TRAILING_SPACES_KEY); - final Boolean overrideEnsureNewlineData = file.getUserData(OVERRIDE_ENSURE_NEWLINE_KEY); - final String stripTrailingSpaces = overrideStripTrailingSpacesData != null ? overrideStripTrailingSpacesData : settings.getStripTrailingSpaces(); - final boolean doStrip = !stripTrailingSpaces.equals(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE); - final boolean ensureEOL = overrideEnsureNewlineData != null ? overrideEnsureNewlineData.booleanValue() : settings.isEnsureNewLineAtEOF(); - - if (doStrip) { - final boolean inChangedLinesOnly = !stripTrailingSpaces.equals(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE); - boolean success = stripIfNotCurrentLine(document, inChangedLinesOnly); - if (!success) { - myDocumentsToStripLater.add(document); - } - } - - final int lines = document.getLineCount(); - if (ensureEOL && lines > 0) { - final int start = document.getLineStartOffset(lines - 1); - final int end = document.getLineEndOffset(lines - 1); - if (start != end) { - final CharSequence content = document.getCharsSequence(); - ApplicationManager.getApplication().runWriteAction(new DocumentRunnable(document, null) { - @Override - public void run() { - CommandProcessor.getInstance().runUndoTransparentAction(new Runnable() { - @Override - public void run() { - if (CharArrayUtil.containsOnlyWhiteSpaces(content.subSequence(start, end)) && doStrip) { - document.deleteString(start, end); - } - else { - document.insertString(end, "\n"); - } - } - }); - } - }); - } - } - } - - // clears line modification flags except lines which was not stripped because the caret was in the way - public void clearLineModificationFlags(@NotNull Document document) { - if (document instanceof DocumentWindow) { - document = ((DocumentWindow)document).getDelegate(); - } - if (!(document instanceof DocumentImpl)) { - return; - } - - Component focusOwner = IdeFocusManager.getGlobalInstance().getFocusOwner(); - DataContext dataContext = DataManager.getInstance().getDataContext(focusOwner); - boolean isDisposeInProgress = ApplicationManager.getApplication().isDisposeInProgress(); // ignore caret placing when exiting - Editor activeEditor = isDisposeInProgress ? null : CommonDataKeys.EDITOR.getData(dataContext); - - // when virtual space enabled, we can strip whitespace anywhere - boolean isVirtualSpaceEnabled = activeEditor == null || activeEditor.getSettings().isVirtualSpace(); - - final EditorSettingsExternalizable settings = EditorSettingsExternalizable.getInstance(); - if (settings == null) return; - - String stripTrailingSpaces = settings.getStripTrailingSpaces(); - final boolean doStrip = !stripTrailingSpaces.equals(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE); - final boolean inChangedLinesOnly = !stripTrailingSpaces.equals(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE); - - int[] caretLines; - if (activeEditor != null && inChangedLinesOnly && doStrip && !isVirtualSpaceEnabled) { - List<Caret> carets = activeEditor.getCaretModel().getAllCarets(); - caretLines = new int[carets.size()]; - for (int i = 0; i < carets.size(); i++) { - Caret caret = carets.get(i); - caretLines[i] = caret.getLogicalPosition().line; - } - } - else { - caretLines = ArrayUtil.EMPTY_INT_ARRAY; - } - ((DocumentImpl)document).clearLineModificationFlagsExcept(caretLines); - } - - public static boolean stripIfNotCurrentLine(Document document, boolean inChangedLinesOnly) { - if (document instanceof DocumentWindow) { - document = ((DocumentWindow)document).getDelegate(); - } - if (!(document instanceof DocumentImpl)) { - return true; - } - DataContext dataContext = DataManager.getInstance().getDataContext(IdeFocusManager.getGlobalInstance().getFocusOwner()); - boolean isDisposeInProgress = ApplicationManager.getApplication().isDisposeInProgress(); // ignore caret placing when exiting - Editor activeEditor = isDisposeInProgress ? null : CommonDataKeys.EDITOR.getData(dataContext); - - // when virtual space enabled, we can strip whitespace anywhere - boolean isVirtualSpaceEnabled = activeEditor == null || activeEditor.getSettings().isVirtualSpace(); - - boolean markAsNeedsStrippingLater; - - if (activeEditor != null && activeEditor.getCaretModel().supportsMultipleCarets()) { - List<Caret> carets = activeEditor.getCaretModel().getAllCarets(); - List<VisualPosition> visualCarets = new ArrayList<VisualPosition>(carets.size()); - List<Integer> caretOffsets = new ArrayList<Integer>(carets.size()); - for (Caret caret : carets) { - visualCarets.add(caret.getVisualPosition()); - caretOffsets.add(caret.getOffset()); - } - - markAsNeedsStrippingLater = ((DocumentImpl)document).stripTrailingSpaces(activeEditor.getProject(), inChangedLinesOnly, isVirtualSpaceEnabled, caretOffsets); - - if (!ShutDownTracker.isShutdownHookRunning()) { - final Iterator<VisualPosition> visualCaretIterator = visualCarets.iterator(); - activeEditor.getCaretModel().runForEachCaret(new CaretAction() { - @Override - public void perform(Caret caret) { - if (visualCaretIterator.hasNext()) { - caret.moveToVisualPosition(visualCaretIterator.next()); - } - } - }); - } - } - else { - VisualPosition visualCaret = activeEditor == null ? null : activeEditor.getCaretModel().getVisualPosition(); - int caretLine = activeEditor == null ? -1 : activeEditor.getCaretModel().getLogicalPosition().line; - int caretOffset = activeEditor == null ? -1 : activeEditor.getCaretModel().getOffset(); - - final Project project = activeEditor == null ? null : activeEditor.getProject(); - markAsNeedsStrippingLater = ((DocumentImpl)document).stripTrailingSpaces(project, inChangedLinesOnly, isVirtualSpaceEnabled, - caretLine, caretOffset); - - if (!ShutDownTracker.isShutdownHookRunning() && activeEditor != null) { - activeEditor.getCaretModel().moveToVisualPosition(visualCaret); - } - } - return !markAsNeedsStrippingLater; - } - - public void documentDeleted(@NotNull Document doc) { - myDocumentsToStripLater.remove(doc); - } - - @Override - public void unsavedDocumentsDropped() { - myDocumentsToStripLater.clear(); - } -} diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorProvider.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorProvider.java index 60b42f75c22c..690e7c7d2820 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorProvider.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorProvider.java @@ -278,19 +278,22 @@ public class TextEditorProvider implements FileEditorProvider, DumbAware { } protected void setStateImpl(final Project project, final Editor editor, final TextEditorState state){ - if (editor.getCaretModel().supportsMultipleCarets()) { - CaretModel caretModel = editor.getCaretModel(); - List<CaretState> states = new ArrayList<CaretState>(state.CARETS.length); - for (TextEditorState.CaretState caretState : state.CARETS) { - states.add(new CaretState(new LogicalPosition(caretState.LINE, caretState.COLUMN), - new LogicalPosition(caretState.SELECTION_START_LINE, caretState.SELECTION_START_COLUMN), - new LogicalPosition(caretState.SELECTION_END_LINE, caretState.SELECTION_END_COLUMN))); + if (state.CARETS != null) { + if (editor.getCaretModel().supportsMultipleCarets()) { + CaretModel caretModel = editor.getCaretModel(); + List<CaretState> states = new ArrayList<CaretState>(state.CARETS.length); + for (TextEditorState.CaretState caretState : state.CARETS) { + states.add(new CaretState(new LogicalPosition(caretState.LINE, caretState.COLUMN), + new LogicalPosition(caretState.SELECTION_START_LINE, caretState.SELECTION_START_COLUMN), + new LogicalPosition(caretState.SELECTION_END_LINE, caretState.SELECTION_END_COLUMN))); + } + caretModel.setCaretsAndSelections(states); + } + else { + LogicalPosition pos = new LogicalPosition(state.CARETS[0].LINE, state.CARETS[0].COLUMN); + editor.getCaretModel().moveToLogicalPosition(pos); + editor.getSelectionModel().removeSelection(); } - caretModel.setCaretsAndSelections(states); - } else { - LogicalPosition pos = new LogicalPosition(state.CARETS[0].LINE, state.CARETS[0].COLUMN); - editor.getCaretModel().moveToLogicalPosition(pos); - editor.getSelectionModel().removeSelection(); } EditorEx editorEx = editor instanceof EditorEx ? (EditorEx)editor : null; boolean preciselyScrollVertically = |