/* * Copyright 2003-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 jetbrains.mps; import com.intellij.openapi.Disposable; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManagerListener; import com.intellij.openapi.fileEditor.FileEditorProvider; import com.intellij.openapi.fileEditor.FileEditorState; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.fileEditor.ex.FileEditorProviderManager; import com.intellij.openapi.fileEditor.ex.IdeDocumentHistory; import com.intellij.openapi.fileEditor.impl.EditorComposite; import com.intellij.openapi.fileEditor.impl.EditorHistoryManager; import com.intellij.openapi.fileEditor.impl.EditorWindow; import com.intellij.openapi.fileEditor.impl.EditorWithProviderComposite; import com.intellij.openapi.fileEditor.impl.EditorsSplitters; import com.intellij.openapi.fileEditor.impl.IdeDocumentHistoryImpl; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.AsyncResult; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.JComponent; import java.awt.Component; import java.util.List; import java.util.Map; @NonNls public class MPSTestEditorManagerImpl extends FileEditorManagerEx { private static final Logger LOG = Logger.getInstance("#com.intellij.idea.test.TestEditorManagerImpl"); private Map<VirtualFile, FileEditor[]> myVirtualFile2FileEditor = new HashMap<VirtualFile, FileEditor[]>(); private final Project myProject; public MPSTestEditorManagerImpl(Project project) { myProject = project; } @Override @NotNull public void closeFile(@NotNull VirtualFile file) { if (myVirtualFile2FileEditor.containsKey(file)) { for (FileEditor fileEditor : myVirtualFile2FileEditor.get(file)) { fileEditor.dispose(); } myVirtualFile2FileEditor.remove(file); } } @Nullable @Override public Editor openTextEditor(@NotNull OpenFileDescriptor descriptor, boolean focusEditor) { return null; } @Nullable @Override public Editor getSelectedTextEditor() { return null; } @Override public boolean isFileOpen(@NotNull VirtualFile file) { return false; } @NotNull @Override public VirtualFile[] getOpenFiles() { return new VirtualFile[0]; } @NotNull @Override public VirtualFile[] getSelectedFiles() { return new VirtualFile[0]; } @NotNull @Override public FileEditor[] getSelectedEditors() { return new FileEditor[0]; } @Nullable @Override public FileEditor getSelectedEditor(@NotNull VirtualFile file) { return null; } @NotNull @Override public FileEditor[] getEditors(@NotNull VirtualFile file) { return new FileEditor[0]; } @NotNull @Override public FileEditor[] getAllEditors(@NotNull VirtualFile file) { return new FileEditor[0]; } @Override @NotNull public FileEditor[] getAllEditors() { return new FileEditor[0]; } @Override public void showEditorAnnotation(@NotNull FileEditor editor, @NotNull JComponent annotationComponent) { } @Override public void removeEditorAnnotation(@NotNull FileEditor editor, @NotNull JComponent annotationComponent) { } @Override public void addTopComponent(@NotNull FileEditor editor, @NotNull JComponent component) { } @Override public void removeTopComponent(@NotNull FileEditor editor, @NotNull JComponent component) { } @Override public void addBottomComponent(@NotNull FileEditor editor, @NotNull JComponent component) { } @Override public void removeBottomComponent(@NotNull FileEditor editor, @NotNull JComponent component) { } @Override public void addFileEditorManagerListener(@NotNull FileEditorManagerListener listener) { } @Override public void addFileEditorManagerListener(@NotNull FileEditorManagerListener listener, @NotNull Disposable parentDisposable) { } @Override public void removeFileEditorManagerListener(@NotNull FileEditorManagerListener listener) { } @NotNull @Override public List<FileEditor> openEditor(@NotNull OpenFileDescriptor descriptor, boolean focusEditor) { return null; } @NotNull @Override public Project getProject() { return null; } @Override public void setSelectedEditor(@NotNull VirtualFile file, @NotNull String fileEditorProviderId) { } @Override public JComponent getComponent() { return null; } @Nullable @Override public JComponent getPreferredFocusedComponent() { return null; } @NotNull @Override public Pair<FileEditor[], FileEditorProvider[]> getEditorsWithProviders(@NotNull VirtualFile file) { return null; } @Nullable @Override public VirtualFile getFile(@NotNull FileEditor editor) { return null; } @Override public void updateFilePresentation(@NotNull VirtualFile file) { } @Override public EditorWindow getCurrentWindow() { return null; } @NotNull @Override public AsyncResult<EditorWindow> getActiveWindow() { return null; } @Override public void setCurrentWindow(EditorWindow window) { } @Override public void closeFile(@NotNull VirtualFile file, @NotNull EditorWindow window) { } @Override public void unsplitWindow() { } @Override public void unsplitAllWindow() { } @Override public int getWindowSplitCount() { return 0; } @Override public boolean hasSplitOrUndockedWindows() { return false; } @NotNull @Override public EditorWindow[] getWindows() { return new EditorWindow[0]; } @NotNull @Override public VirtualFile[] getSiblings(@NotNull VirtualFile file) { return new VirtualFile[0]; } @Override public void createSplitter(int orientation, @Nullable EditorWindow window) { } @Override public void changeSplitterOrientation() { } @Override public void flipTabs() { } @Override public boolean tabsMode() { return false; } @Override public boolean isInSplitter() { return false; } @Override public boolean hasOpenedFile() { return false; } @Nullable @Override public VirtualFile getCurrentFile() { return null; } @Nullable @Override public Pair<FileEditor, FileEditorProvider> getSelectedEditorWithProvider(@NotNull VirtualFile file) { return null; } @Override public void closeAllFiles() { } @NotNull @Override public EditorsSplitters getSplitters() { return null; } @Override @NotNull public FileEditor[] openFile(@NotNull final VirtualFile file, final boolean focusEditor) { // Open file FileEditor[] editors; FileEditorProvider[] providers; final EditorWithProviderComposite newSelectedComposite; boolean newEditorCreated = false; // File is not opened yet. In this case we have to create editors // and select the created EditorComposite. final FileEditorProviderManager editorProviderManager = FileEditorProviderManager.getInstance(); providers = editorProviderManager.getProviders(getProject(), file); newEditorCreated = true; editors = new FileEditor[providers.length]; for (int i = 0; i < providers.length; i++) { try { final FileEditorProvider provider = providers[i]; LOG.assertTrue(provider != null); LOG.assertTrue(provider.accept(getProject(), file)); final FileEditor editor = provider.createEditor(getProject(), file); editors[i] = editor; LOG.assertTrue(editor != null); LOG.assertTrue(editor.isValid()); } catch (Exception e) { LOG.error(null, e); } catch (AssertionError e) { LOG.error(null, e); } } final EditorHistoryManager editorHistoryManager = EditorHistoryManager.getInstance(getProject()); for (int i = 0; i < editors.length; i++) { final FileEditor editor = editors[i]; final FileEditorProvider provider = providers[i];//getProvider(editor); // Restore editor state FileEditorState state = null; if (state == null) { // We have to try to get state from the history only in case // if editor is not opened. Otherwise history enty might have a state // out of sync with the current editor state. state = editorHistoryManager.getState(file, provider); } if (state != null) { editor.setState(state); } } //[jeka] this is a hack to support back-forward navigation // previously here was incorrect call to fireSelectionChanged() with a side-effect ((IdeDocumentHistoryImpl) IdeDocumentHistory.getInstance(getProject())).onSelectionChanged(); // Make back/forward work IdeDocumentHistory.getInstance(getProject()).includeCurrentCommandAsNavigation(); myVirtualFile2FileEditor.put(file, editors); return editors; } @NotNull @Override public Pair<FileEditor[], FileEditorProvider[]> openFileWithProviders(@NotNull VirtualFile file, boolean focusEditor, boolean searchForSplitter) { return null; } @NotNull @Override public Pair<FileEditor[], FileEditorProvider[]> openFileWithProviders(@NotNull VirtualFile file, boolean focusEditor, @NotNull EditorWindow window) { return null; } @Override public boolean isChanged(@NotNull EditorComposite editor) { return false; } @Override public EditorWindow getNextWindow(@NotNull EditorWindow window) { return null; } @Override public EditorWindow getPrevWindow(@NotNull EditorWindow window) { return null; } @Override public boolean isInsideChange() { return false; } @Override public EditorsSplitters getSplittersFor(Component c) { return null; } @NotNull @Override public ActionCallback notifyPublisher(@NotNull Runnable runnable) { return null; } @NotNull @Override public ActionCallback getReady(@NotNull Object requestor) { return null; } }