IDEA-136853 readonly locker doesn't work well between splits

This commit is contained in:
Dmitry Batrak
2015-02-24 12:27:01 +03:00
parent 508344da8b
commit 37f6960311
@@ -20,7 +20,8 @@ import com.intellij.ide.DataManager;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx;
import com.intellij.openapi.fileEditor.impl.EditorsSplitters;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VirtualFile;
@@ -42,13 +43,7 @@ public class ToggleReadOnlyAttributePanel implements StatusBarWidget.Multiframe,
@NotNull
public Icon getIcon() {
Project project = getProject();
VirtualFile virtualFile = null;
if (project != null) {
FileEditorManager editorManager = FileEditorManager.getInstance(project);
VirtualFile[] selectedFiles = editorManager.getSelectedFiles();
virtualFile = selectedFiles.length > 0 ? selectedFiles[0] : null;
}
VirtualFile virtualFile = getCurrentFile();
return virtualFile == null || virtualFile.isWritable() ? AllIcons.Ide.Readwrite : AllIcons.Ide.Readonly;
}
@@ -82,13 +77,8 @@ public class ToggleReadOnlyAttributePanel implements StatusBarWidget.Multiframe,
public Consumer<MouseEvent> getClickConsumer() {
return new Consumer<MouseEvent>() {
public void consume(MouseEvent mouseEvent) {
final Project project = getProject();
if (project == null) {
return;
}
final FileEditorManager editorManager = FileEditorManager.getInstance(project);
final VirtualFile[] files = editorManager.getSelectedFiles();
if (!isReadOnlyApplicableForFiles(files)) {
final VirtualFile file = getCurrentFile();
if (!isReadOnlyApplicableForFile(file)) {
return;
}
FileDocumentManager.getInstance().saveAllDocuments();
@@ -96,11 +86,11 @@ public class ToggleReadOnlyAttributePanel implements StatusBarWidget.Multiframe,
ApplicationManager.getApplication().runWriteAction(new Runnable() {
public void run() {
try {
ReadOnlyAttributeUtil.setReadOnlyAttribute(files[0], files[0].isWritable());
ReadOnlyAttributeUtil.setReadOnlyAttribute(file, file.isWritable());
myStatusBar.updateWidget(ID());
}
catch (IOException e) {
Messages.showMessageDialog(project, e.getMessage(), UIBundle.message("error.dialog.title"), Messages.getErrorIcon());
Messages.showMessageDialog(getProject(), e.getMessage(), UIBundle.message("error.dialog.title"), Messages.getErrorIcon());
}
}
});
@@ -109,20 +99,24 @@ public class ToggleReadOnlyAttributePanel implements StatusBarWidget.Multiframe,
}
private boolean isReadonlyApplicable() {
final Project project = getProject();
if (project == null) return false;
final FileEditorManager editorManager = FileEditorManager.getInstance(project);
if (editorManager == null) return false;
VirtualFile[] selectedFiles = editorManager.getSelectedFiles();
return isReadOnlyApplicableForFiles(selectedFiles);
VirtualFile file = getCurrentFile();
return isReadOnlyApplicableForFile(file);
}
private static boolean isReadOnlyApplicableForFiles(final VirtualFile[] files) {
return files.length > 0 && !files[0].getFileSystem().isReadOnly();
private static boolean isReadOnlyApplicableForFile(@Nullable VirtualFile file) {
return file != null && !file.getFileSystem().isReadOnly();
}
@Nullable
private Project getProject() {
return CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext((JComponent) myStatusBar));
}
@Nullable
private VirtualFile getCurrentFile() {
final Project project = getProject();
if (project == null) return null;
EditorsSplitters splitters = FileEditorManagerEx.getInstanceEx(project).getSplittersFor(myStatusBar.getComponent());
return splitters.getCurrentFile();
}
}