mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-90594
This commit is contained in:
+32
@@ -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);
|
||||
}
|
||||
+1
-2
@@ -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() {
|
||||
|
||||
+13
-1
@@ -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>
|
||||
|
||||
+122
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user