IDEA-90594

This commit is contained in:
Alexander Lobas
2012-10-12 15:08:50 +04:00
parent ad4c99cc23
commit c56f24896d
7 changed files with 182 additions and 65 deletions
@@ -0,0 +1,32 @@
/*
* Copyright 2000-2012 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;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.Nullable;
/**
* @author Alexander Lobas
*/
public interface SelectedFileEditorProvider {
ExtensionPointName<SelectedFileEditorProvider> EP_SELECTED_FILE_EDITOR_PROVIDER =
new ExtensionPointName<SelectedFileEditorProvider>("com.intellij.selectedFileEditorProvider");
@Nullable
FileEditorProvider getSelectedProvider(Project project, VirtualFile file);
}
@@ -30,7 +30,6 @@ import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.FocusWatcher;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.ui.PrevNextActionsDescriptor;
import com.intellij.ui.SideBorder;
import com.intellij.ui.TabbedPaneWrapper;
@@ -226,7 +225,7 @@ public abstract class EditorComposite implements Disposable {
}
private void fireSelectedEditorChanged(final FileEditor oldSelectedEditor, final FileEditor newSelectedEditor){
if (!myFileEditorManager.isInsideChange() && !Comparing.equal(oldSelectedEditor, newSelectedEditor)) {
if ((!EventQueue.isDispatchThread() || !myFileEditorManager.isInsideChange()) && !Comparing.equal(oldSelectedEditor, newSelectedEditor)) {
myFileEditorManager.notifyPublisher(new Runnable() {
@Override
public void run() {
@@ -796,7 +796,7 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec
}
// Restore selected editor
final FileEditorProvider selectedProvider = editorHistoryManager.getSelectedProvider(file);
final FileEditorProvider selectedProvider = getSelectedFileEditorProvider(editorHistoryManager, file);
if (selectedProvider != null) {
final FileEditor[] _editors = newSelectedComposite.getEditors();
final FileEditorProvider[] _providers = newSelectedComposite.getProviders();
@@ -866,6 +866,18 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec
return Pair.create(editors, providers);
}
@Nullable
private FileEditorProvider getSelectedFileEditorProvider(EditorHistoryManager editorHistoryManager, VirtualFile file) {
for (SelectedFileEditorProvider selectedEditorProvider : Extensions
.getExtensions(SelectedFileEditorProvider.EP_SELECTED_FILE_EDITOR_PROVIDER)) {
FileEditorProvider provider = selectedEditorProvider.getSelectedProvider(myProject, file);
if (file != null) {
return provider;
}
}
return editorHistoryManager.getSelectedProvider(file);
}
@Override
public ActionCallback notifyPublisher(final Runnable runnable) {
final IdeFocusManager focusManager = IdeFocusManager.getInstance(myProject);
@@ -25,6 +25,9 @@
<extensionPoint name="fileEditorProvider"
interface="com.intellij.openapi.fileEditor.FileEditorProvider"/>
<extensionPoint name="selectedFileEditorProvider"
interface="com.intellij.openapi.fileEditor.SelectedFileEditorProvider"/>
<extensionPoint name="fileTypeFactory"
interface="com.intellij.openapi.fileTypes.FileTypeFactory"/>
@@ -13,6 +13,11 @@
<fileEditorProvider implementation="com.intellij.android.designer.AndroidDesignerEditorProvider"/>
<selectedFileEditorProvider implementation="com.intellij.android.designer.AndroidSelectedFileEditorProvider"/>
<projectService serviceInterface="com.intellij.android.designer.AndroidSelectedFileEditorProvider$MyState"
serviceImplementation="com.intellij.android.designer.AndroidSelectedFileEditorProvider$MyState"/>
<projectService serviceInterface="com.intellij.android.designer.profile.ProfileList"
serviceImplementation="com.intellij.android.designer.profile.ProfileList"/>
@@ -20,6 +25,12 @@
serviceImplementation="com.intellij.android.designer.model.ViewsMetaManager"/>
</extensions>
<project-components>
<component>
<implementation-class>com.intellij.android.designer.AndroidSelectedFileEditorProvider$MyEditorListener</implementation-class>
</component>
</project-components>
<extensions defaultExtensionNs="org.jetbrains.android">
<refactoringContextProvider implementation="com.intellij.android.designer.AndroidDesignerRefactoringContextProvider"/>
</extensions>
@@ -0,0 +1,122 @@
/*
* Copyright 2000-2012 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.android.designer;
import com.intellij.openapi.components.*;
import com.intellij.openapi.fileEditor.*;
import com.intellij.openapi.fileEditor.ex.FileEditorProviderManager;
import com.intellij.openapi.fileEditor.impl.EditorHistoryManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.xmlb.XmlSerializerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Alexander Lobas
*/
public class AndroidSelectedFileEditorProvider implements SelectedFileEditorProvider {
@Nullable
@Override
public FileEditorProvider getSelectedProvider(Project project, VirtualFile openedFile) {
if (!AndroidDesignerEditorProvider.acceptLayout(project, openedFile)) {
return null;
}
String editorTypeId = MyState.getInstance(project).editorTypeId;
if (editorTypeId != null) {
return FileEditorProviderManager.getInstance().getProvider(editorTypeId);
}
return null;
}
public static class MyEditorListener implements ProjectComponent {
private final Project myProject;
public MyEditorListener(Project project) {
myProject = project;
}
@Override
public void projectOpened() {
StartupManager.getInstance(myProject).registerPostStartupActivity(new Runnable() {
public void run() {
myProject.getMessageBus().connect(myProject)
.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerListener() {
@Override
public void fileOpened(FileEditorManager source, VirtualFile file) {
}
@Override
public void fileClosed(FileEditorManager source, VirtualFile file) {
}
@Override
public void selectionChanged(FileEditorManagerEvent event) {
VirtualFile file = event.getNewFile();
if (file != null && AndroidDesignerEditorProvider.acceptLayout(myProject, file)) {
FileEditorProvider provider = EditorHistoryManager.getInstance(myProject).getSelectedProvider(file);
if (provider != null) {
MyState.getInstance(myProject).editorTypeId = provider.getEditorTypeId();
}
}
}
});
}
});
}
@Override
public void projectClosed() {
}
@Override
public void initComponent() {
}
@Override
public void disposeComponent() {
}
@NotNull
@Override
public String getComponentName() {
return "AndroidLayoutSelectedEditorListener";
}
}
@State(name = "AndroidLayoutSelectedEditor", storages = {@Storage(file = StoragePathMacros.WORKSPACE_FILE)})
public static class MyState implements PersistentStateComponent<MyState> {
public String editorTypeId;
@Nullable
@Override
public MyState getState() {
return this;
}
@Override
public void loadState(MyState state) {
XmlSerializerUtil.copyBean(state, this);
}
public static MyState getInstance(Project project) {
return ServiceManager.getService(project, MyState.class);
}
}
}
@@ -17,37 +17,25 @@
package org.jetbrains.android.actions;
import com.android.resources.ResourceFolderType;
import com.android.resources.ResourceType;
import com.intellij.CommonBundle;
import com.intellij.facet.ProjectFacetManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.FileEditorProvider;
import com.intellij.openapi.fileEditor.impl.EditorHistoryManager;
import com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.InputValidator;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.xml.XmlFile;
import com.intellij.ui.TextFieldWithAutoCompletion;
import com.intellij.ui.components.JBLabel;
import com.intellij.util.containers.HashSet;
import org.jetbrains.android.dom.layout.AndroidLayoutUtil;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.facet.AndroidRootUtil;
import org.jetbrains.android.util.AndroidBundle;
import org.jetbrains.android.util.AndroidCommonUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.util.Set;
/**
* @author Eugene.Kudelevsky
@@ -79,62 +67,12 @@ public class AndroidCreateLayoutFileAction extends CreateTypedResourceFileAction
return doCreateAndNavigate(newName, directory, rootTag, false);
}
@Override
protected void doNavigate(XmlFile file) {
final Project project = file.getProject();
final String preferredEditorProviderId = computePreferredEditorForLayoutFiles(project);
super.doNavigate(file);
if (preferredEditorProviderId != null) {
final FileEditorManager manager = FileEditorManager.getInstance(project);
if (manager instanceof FileEditorManagerImpl) {
final VirtualFile vFile = file.getVirtualFile();
if (vFile != null) {
((FileEditorManagerImpl)manager).setSelectedEditor(vFile, preferredEditorProviderId);
}
}
}
}
@NotNull
@Override
public List<String> getAllowedTagNames(@NotNull AndroidFacet facet) {
return AndroidLayoutUtil.getPossibleRoots(facet);
}
@Nullable
private static String computePreferredEditorForLayoutFiles(Project project) {
final EditorHistoryManager manager = EditorHistoryManager.getInstance(project);
final Set<VirtualFile> resourceDirs = new HashSet<VirtualFile>();
final List<AndroidFacet> facets = ProjectFacetManager.getInstance(project).getFacets(AndroidFacet.ID);
for (AndroidFacet facet : facets) {
final VirtualFile resourceDir = AndroidRootUtil.getResourceDir(facet);
if (resourceDir != null) {
resourceDirs.add(resourceDir);
}
}
final VirtualFile[] files = manager.getFiles();
for (int i = files.length - 1; i >= 0; i--) {
final VirtualFile file = files[i];
final VirtualFile parent = file.getParent();
if (parent != null) {
final String resType = AndroidCommonUtils.getResourceTypeByDirName(parent.getName());
if (ResourceType.LAYOUT.getName().equals(resType) && resourceDirs.contains(parent.getParent())) {
final FileEditorProvider provider = manager.getSelectedProvider(file);
if (provider != null) {
return provider.getEditorTypeId();
}
}
}
}
return null;
}
public class MyDialog extends DialogWrapper {
private final InputValidator myValidator;