1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-30 04:15:35 +02:00

Fix for bug 399101 - RSE edit actions on local files that map to

actually workspace resources should not use temp files (edit)
This commit is contained in:
xchen 2013-01-30 15:42:06 -05:00
parent aeb9f0311d
commit 163d44ea41
6 changed files with 487 additions and 16 deletions

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2002, 2012 IBM Corporation and others.
* Copyright (c) 2002, 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -49,6 +49,7 @@
* David McKnight (IBM) - [385420] double-click to open System editor from Remote Systems view not working
* David McKnight (IBM) - [385416] NPE during shutdown with remote editor open
* David McKnight (IBM) - [390609] Cached file opened twice in case of eclipse linked resource..
* Xuan Chen (IBM) - [399101] RSE edit actions on local files that map to actually workspace resources should not use temp files
*******************************************************************************/
package org.eclipse.rse.files.ui.resources;
@ -1009,6 +1010,16 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP
*/
private String getDownloadPath()
{
//If this remote file is actually local, and it is part of a project in this workspace, just return the absolute path of the remote file.
IFile file = null;
if (remoteFile.getHost().getSystemType().isLocal())
{
String absolutePath = remoteFile.getAbsolutePath();
file = getProjectFileForLocation(absolutePath);
}
if (file != null) {
return remotePath;
}
IPath path = new Path(root);
@ -2174,4 +2185,11 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP
_editorDescriptor = descriptor;
}
private static IFile getProjectFileForLocation(String absolutePath)
{
IPath workspacePath = new Path(absolutePath);
IFile file = SystemBasePlugin.getWorkspaceRoot().getFileForLocation(workspacePath);
return file;
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2002, 2010 IBM Corporation and others.
* Copyright (c) 2002, 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -19,6 +19,7 @@
* David McKnight (IBM) - [276103] Files with names in different cases are not handled properly
* David McKnight (IBM) - [309813] RSE permits opening of file after access removed
* David McKnight (IBM) - [312362] Editing Unix file after it changes on host edits old data
* Xuan Chen (IBM) - [399101] RSE edit actions on local files that map to actually workspace resources should not use temp files
*******************************************************************************/
package org.eclipse.rse.internal.files.ui.actions;
@ -26,6 +27,8 @@ package org.eclipse.rse.internal.files.ui.actions;
import java.util.Iterator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.rse.files.ui.resources.SystemEditableRemoteFile;
@ -35,6 +38,7 @@ import org.eclipse.rse.internal.files.ui.view.DownloadAndOpenJob;
import org.eclipse.rse.subsystems.files.core.SystemIFileProperties;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem;
import org.eclipse.rse.ui.SystemBasePlugin;
import org.eclipse.rse.ui.actions.SystemBaseAction;
import org.eclipse.rse.ui.view.ISystemEditableRemoteObject;
import org.eclipse.swt.widgets.Shell;
@ -188,6 +192,31 @@ public class SystemEditFilesAction extends SystemBaseAction {
editorId = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
}
//If this is a local file in the workspace projects, just open it up.
String absolutePath = remoteFile.getAbsolutePath();
IFile localFile = null;
if (remoteFile.getHost().getSystemType().isLocal())
{
localFile = SystemFileActionUtility.getProjectFileForLocation(absolutePath);
}
if (localFile != null) {
if (!localFile.exists()) {
try {
localFile.refreshLocal(IResource.DEPTH_ZERO, null);
} catch (CoreException e) {
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
}
}
try {
SystemFileActionUtility.openEditor(localFile, !remoteFile.canWrite());
}
catch (Exception e) {
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
return;
}
return;
}
SystemEditableRemoteFile editable = SystemRemoteEditManager.getEditableRemoteObject(remoteFile, des);
if (editable == null){
// case for cancelled operation when user was prompted to save file of different case
@ -231,6 +260,4 @@ public class SystemEditFilesAction extends SystemBaseAction {
}
}
}

View file

@ -0,0 +1,172 @@
/********************************************************************************
* Copyright (c) 2013 IBM Corporation and others. All rights reserved.
* This program and the accompanying materials are made available under the terms
* of the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Xuan Chen (IBM) - [399101] RSE edit actions on local files that map to actually workspace resources should not use temp files
********************************************************************************/
package org.eclipse.rse.internal.files.ui.actions;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourceAttributes;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.rse.ui.SystemBasePlugin;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.internal.WorkbenchPage;
import org.eclipse.ui.part.FileEditorInput;
public class SystemFileActionUtility {
static void openEditor(IFile localFile, boolean readOnly) throws PartInitException {
IEditorDescriptor editorDescriptor = null;
try {
editorDescriptor = IDE.getEditorDescriptor(localFile);
} catch (PartInitException e) {
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
}
if (editorDescriptor == null) {
if (PlatformUI.isWorkbenchRunning())
{
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
editorDescriptor = registry.findEditor("org.eclipse.ui.DefaultTextEditor"); //$NON-NLS-1$
}
}
//This file is from local connection, and it is inside a project in the work
IWorkbenchPage activePage = SystemBasePlugin.getActiveWorkbenchWindow().getActivePage();
ResourceAttributes attr = localFile.getResourceAttributes();
if (attr!=null) {
attr.setReadOnly(readOnly);
try
{
localFile.setResourceAttributes(attr);
}
catch (Exception e)
{
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
}
}
// set editor as preferred editor for this file
String editorId = null;
if (editorDescriptor != null) {
editorId = editorDescriptor.getId();
}
IDE.setDefaultEditor(localFile, editorId);
if (editorDescriptor.isOpenExternal()){
SystemFileActionUtility.openSystemEditor(localFile); // opening regular way doesn't work anymore
}
else {
FileEditorInput finput = new FileEditorInput(localFile);
IEditorPart editor = null;
// check for files already open
if (editorDescriptor != null && editorDescriptor.isOpenExternal()){
editor = ((WorkbenchPage)activePage).openEditorFromDescriptor(new FileEditorInput(localFile), editorDescriptor, true, null);
}
else {
editor = activePage.openEditor(finput, editorDescriptor.getId());
}
return;
}
}
static void openSystemEditor(IFile localFile) throws PartInitException {
IEditorDescriptor editorDescriptor = null;
try {
editorDescriptor = IDE.getEditorDescriptor(localFile);
} catch (PartInitException e) {
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
}
if (editorDescriptor == null) {
if (PlatformUI.isWorkbenchRunning())
{
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
editorDescriptor = registry.findEditor("org.eclipse.ui.DefaultTextEditor"); //$NON-NLS-1$
}
}
//This file is from local connection, and it is inside a project in the work
IWorkbenchPage activePage = SystemBasePlugin.getActiveWorkbenchWindow().getActivePage();
// set editor as preferred editor for this file
String editorId = null;
if (editorDescriptor != null) {
editorId = editorDescriptor.getId();
}
IDE.setDefaultEditor(localFile, editorId);
FileEditorInput fileInput = new FileEditorInput(localFile);
activePage.openEditor(fileInput, IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
return;
}
/**
* Open the in place editor
*/
public static void openInPlaceEditor(IFile localFile) throws PartInitException
{
IWorkbenchPage activePage = SystemBasePlugin.getActiveWorkbenchWindow().getActivePage();
FileEditorInput fileInput = new FileEditorInput(localFile);
activePage.openEditor(fileInput, IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID);
}
public static void hackOpenEditor(IFile localFile, IEditorDescriptor descriptor, boolean readOnly) throws PartInitException
{
//This file is from local connection, and it is inside a project in the work
IWorkbenchPage activePage = SystemBasePlugin.getActiveWorkbenchWindow().getActivePage();
ResourceAttributes attr = localFile.getResourceAttributes();
if (attr!=null) {
attr.setReadOnly(readOnly);
try {
localFile.setResourceAttributes(attr);
}
catch (Exception e)
{
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
}
}
// set editor as preferred editor for this file
String editorId = descriptor.getId();
IDE.setDefaultEditor(localFile, editorId);
FileEditorInput finput = new FileEditorInput(localFile);
IEditorPart editor = null;
if (descriptor.isOpenExternal()){
editor = ((WorkbenchPage)activePage).openEditorFromDescriptor(new FileEditorInput(localFile), descriptor, true, null);
}
else {
editor = activePage.openEditor(finput, descriptor.getId());
}
}
static IFile getProjectFileForLocation(String absolutePath)
{
IPath workspacePath = new Path(absolutePath);
IFile file = SystemBasePlugin.getWorkspaceRoot().getFileForLocation(workspacePath);
return file;
}
}

View file

@ -1,5 +1,5 @@
/********************************************************************************
* Copyright (c) 2002, 2011 IBM Corporation and others. All rights reserved.
* Copyright (c) 2002, 2013 IBM Corporation and others. All rights reserved.
* This program and the accompanying materials are made available under the terms
* of the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
@ -27,6 +27,7 @@
* David Dykstal (IBM) [230821] fix IRemoteFileSubSystem API to be consistent with IFileService
* David McKnight (IBM) - [240699] Problem with moving a file which has been opened in an editor
* David McKnight (IBM) - [191132] Incorrect error message when trying to edit a file that has been moved
* Xuan Chen (IBM) - [399101] RSE edit actions on local files that map to actually workspace resources should not use temp files
********************************************************************************/
package org.eclipse.rse.internal.files.ui.actions;
@ -64,6 +65,7 @@ import org.eclipse.rse.subsystems.files.core.SystemIFileProperties;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem;
import org.eclipse.rse.ui.RSEUIPlugin;
import org.eclipse.rse.ui.SystemBasePlugin;
import org.eclipse.rse.ui.actions.SystemBaseCopyAction;
import org.eclipse.rse.ui.messages.SystemMessageDialog;
import org.eclipse.rse.ui.validators.IValidatorRemoteSelection;
@ -454,14 +456,50 @@ public class SystemMoveRemoteFileAction extends SystemCopyRemoteFileAction
// TODO Auto-generated catch block
e.printStackTrace();
}
IResource oldLocalResource = null;
if (SystemRemoteEditManager.getInstance().doesRemoteEditProjectExist()){
oldLocalResource = UniversalFileTransferUtility.getTempFileFor(oldRemoteFile);
IResource oldLocalTempResource = null;
IResource newLocalTempResource = null;
IResource resourceInProjectForOldRemoteFile = null;
IResource resourceInProjectForNewRemoteFile = null;
if (oldRemoteFile.getHost().getSystemType().isLocal()) {
String absolutePath = oldRemoteFile.getAbsolutePath();
resourceInProjectForOldRemoteFile = SystemFileActionUtility.getProjectFileForLocation(absolutePath);
}
if (resourceInProjectForOldRemoteFile == null) {
//The source file is not one of the file inside an eclipse project
oldLocalTempResource = UniversalFileTransferUtility.getTempFileFor(oldRemoteFile);
if (newRemoteFile.getHost().getSystemType().isLocal()) {
String absolutePath = newRemoteFile.getAbsolutePath();
resourceInProjectForNewRemoteFile = SystemFileActionUtility.getProjectFileForLocation(absolutePath);
}
if (resourceInProjectForNewRemoteFile == null) {
//The destination file is not one of the files inside an eclipse project.
//We need to do regular moving of temp file.
if (SystemRemoteEditManager.getInstance().doesRemoteEditProjectExist()){
newLocalTempResource = UniversalFileTransferUtility.getTempFileFor(newRemoteFile);
}
}
}
if (oldLocalResource != null){
IResource newLocalResource = UniversalFileTransferUtility.getTempFileFor(newRemoteFile);
moveTempResource(oldLocalResource, newLocalResource, newRemoteFile, ss);
if (oldLocalTempResource != null && oldLocalTempResource.exists()) {
if (newLocalTempResource != null) {
moveTempResource(oldLocalTempResource, newLocalTempResource, newRemoteFile, ss);
}
else {
//Source file is not inside an eclipse project, but destination file is. So we need to delete the temp file for source file only.
try
{
oldLocalTempResource.delete(false, null);
// get rid of associated editable if there was one before
SystemIFileProperties properties = new SystemIFileProperties(oldLocalTempResource);
properties.setRemoteFileObject(null);
}
catch (Exception e)
{
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
}
}
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation and others.
* Copyright (c) 2005, 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -21,6 +21,7 @@
* David McKnight (IBM) - [309755] SystemRemoteFileOpenWithMenu.getPreferredEditor(), the listed default editor is not always correct
* David McKnight (IBM) - [312362] Editing Unix file after it changes on host edits old data
* Rick Sawyer (IBM) - [376535] RSE does not respect editor overrides
* Xuan Chen (IBM) - [399101] RSE edit actions on local files that map to actually workspace resources should not use temp files
*******************************************************************************/
package org.eclipse.rse.internal.files.ui.actions;
import java.lang.reflect.Method;
@ -32,7 +33,9 @@ import java.util.Comparator;
import java.util.Hashtable;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourceAttributes;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.action.ContributionItem;
@ -243,14 +246,49 @@ protected void openEditor(IRemoteFile remoteFile, IEditorDescriptor descriptor)
catch (Exception e){
}
boolean systemEditor = descriptor != null && descriptor.getId().equals(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
String absolutePath = remoteFile.getAbsolutePath();
IFile localFile = null;
if (remoteFile.getHost().getSystemType().isLocal())
{
localFile = SystemFileActionUtility.getProjectFileForLocation(absolutePath);
}
if (localFile != null) {
//It is a local file which inside an eclipse project.
try {
if (!localFile.exists()) {
try {
localFile.refreshLocal(IResource.DEPTH_ZERO, null);
} catch (CoreException e) {
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
}
}
if (systemEditor) {
SystemFileActionUtility.openSystemEditor(localFile);
}
else if (descriptor != null){
SystemFileActionUtility.hackOpenEditor(localFile, descriptor, !remoteFile.canWrite());
}
else {
SystemFileActionUtility.openEditor(localFile, !remoteFile.canWrite());
}
}
catch (Exception e) {
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
return;
}
return;
}
SystemEditableRemoteFile editable = SystemRemoteEditManager.getEditableRemoteObject(remoteFile, descriptor);
if (editable == null){
// case for cancelled operation when user was prompted to save file of different case
return;
}
boolean systemEditor = descriptor != null && descriptor.getId().equals(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
if (isFileCached(editable, remoteFile)) {
try {

View file

@ -80,6 +80,7 @@
* David McKnight (IBM) - [389838] Fast folder transfer does not account for code page
* David Mcknight (IBM) - [374681] Incorrect number of children on the properties page of a directory
* Samuel Wu (IBM) - [398988] [ftp] FTP Only support to zVM
* Xuan Chen (IBM) - [399101] RSE edit actions on local files that map to actually workspace resources should not use temp files
*******************************************************************************/
package org.eclipse.rse.internal.files.ui.view;
@ -96,12 +97,14 @@ import java.util.StringTokenizer;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourceAttributes;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
@ -215,8 +218,11 @@ import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.internal.WorkbenchPage;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.progress.IElementCollector;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
@ -630,7 +636,16 @@ public class SystemViewRemoteFileAdapter
*/
private IFile getLocalResource(IRemoteFile remoteFile)
{
return (IFile)UniversalFileTransferUtility.getTempFileFor(remoteFile);
IFile file = null;
if (remoteFile.getHost().getSystemType().isLocal())
{
String absolutePath = remoteFile.getAbsolutePath();
file = getProjectFileForLocation(absolutePath);
}
if (file == null) {
file = (IFile)UniversalFileTransferUtility.getTempFileFor(remoteFile);
}
return file;
}
/**
@ -3043,6 +3058,7 @@ public class SystemViewRemoteFileAdapter
}
catch (Exception e)
{
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
}
}
@ -3106,6 +3122,22 @@ public class SystemViewRemoteFileAdapter
String newRemotePath = file.getParentPath() + "/" + newName; //$NON-NLS-1$
IResource localResource = null;
IResource localProjectResource = null;
if (file.getHost().getSystemType().isLocal())
{
if (file.isFile()) {
localProjectResource = getProjectFileForLocation(file.getAbsolutePath());
}
else {
localProjectResource = getProjectFolderForLocation(file.getAbsolutePath());
}
}
if (localProjectResource != null) {
//This is a local project file. So we will rename it directly in the workbench.
IPath newLocalPath = localProjectResource.getParent().getFullPath().append(newName);
localProjectResource.move(newLocalPath, true, null);
return true;
}
if (SystemRemoteEditManager.getInstance().doesRemoteEditProjectExist())
{
localResource = UniversalFileTransferUtility.getTempFileFor(file);
@ -3433,6 +3465,26 @@ public class SystemViewRemoteFileAdapter
}
// only handle double click if object is a file
String absolutePath = remoteFile.getAbsolutePath();
IFile localFile = null;
if (remoteFile.getHost().getSystemType().isLocal())
{
localFile = getProjectFileForLocation(absolutePath);
}
if (localFile != null) {
try {
if (!localFile.exists()) {
localFile.refreshLocal(IResource.DEPTH_ZERO, null);
}
openEditor(localFile, !remoteFile.canWrite());
}
catch (Exception e) {
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
return false;
}
return true;
}
ISystemEditableRemoteObject editable = getEditableRemoteObject(remoteFile);
if (editable != null)
{
@ -3471,6 +3523,7 @@ public class SystemViewRemoteFileAdapter
editable = getEditableRemoteObject(remoteFile);
}
/* Commenting out - no longer needed with fix to bug #376535
if (editable instanceof SystemEditableRemoteFile){
SystemEditableRemoteFile edit = (SystemEditableRemoteFile)editable;
@ -3540,6 +3593,12 @@ public class SystemViewRemoteFileAdapter
// in the system editor)
IFile file = editable.getLocalResource();
SystemIFileProperties properties = new SystemIFileProperties(file);
try {
// refresh workspace with just added resource
file.refreshLocal(IResource.DEPTH_ZERO, null);
} catch (CoreException e) {
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
}
boolean newFile = !file.exists();
// detect whether there exists a temp copy already
@ -3611,9 +3670,21 @@ public class SystemViewRemoteFileAdapter
RemoteFile remoteFile = (RemoteFile) element;
if (remoteFile.isFile())
{
String absolutePath = remoteFile.getAbsolutePath();
IFile localProjectFile = null;
if (remoteFile.getHost().getSystemType().isLocal())
{
localProjectFile = getProjectFileForLocation(absolutePath);
}
try
{
IFile file = getCachedCopy(remoteFile); // Note that this is a case-sensitive check
IFile file = null;
if (localProjectFile == null) {
file = getCachedCopy(remoteFile); // Note that this is a case-sensitive check
}
else {
file = localProjectFile;
}
if (file != null)
{
SystemIFileProperties properties = new SystemIFileProperties(file);
@ -3898,4 +3969,111 @@ public class SystemViewRemoteFileAdapter
{
return new SystemFetchOperation(null, o, this, collector, true);
}
private static IFile getProjectFileForLocation(String absolutePath)
{
IPath workspacePath = new Path(absolutePath);
IFile file = SystemBasePlugin.getWorkspaceRoot().getFileForLocation(workspacePath);
return file;
}
private static IContainer getProjectFolderForLocation(String absolutePath)
{
IPath workspacePath = new Path(absolutePath);
IContainer container = SystemBasePlugin.getWorkspaceRoot().getContainerForLocation(workspacePath);
return container;
}
private static void openEditor(IFile localFile, boolean readOnly) throws PartInitException {
IEditorDescriptor editorDescriptor = null;
try {
editorDescriptor = IDE.getEditorDescriptor(localFile);
} catch (PartInitException e) {
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
}
if (editorDescriptor == null) {
if (PlatformUI.isWorkbenchRunning())
{
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
editorDescriptor = registry.findEditor("org.eclipse.ui.DefaultTextEditor"); //$NON-NLS-1$
}
}
//This file is from local connection, and it is inside a project in the work
IWorkbenchPage activePage = SystemBasePlugin.getActiveWorkbenchWindow().getActivePage();
ResourceAttributes attr = localFile.getResourceAttributes();
if (attr!=null) {
attr.setReadOnly(readOnly);
try
{
localFile.setResourceAttributes(attr);
}
catch (Exception e)
{
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
}
}
// set editor as preferred editor for this file
String editorId = null;
if (editorDescriptor != null) {
editorId = editorDescriptor.getId();
}
IDE.setDefaultEditor(localFile, editorId);
if (editorDescriptor.isOpenExternal()){
openSystemEditor(localFile); // opening regular way doesn't work anymore
}
else {
FileEditorInput finput = new FileEditorInput(localFile);
// check for files already open
if (editorDescriptor != null && editorDescriptor.isOpenExternal()){
((WorkbenchPage)activePage).openEditorFromDescriptor(new FileEditorInput(localFile), editorDescriptor, true, null);
}
else {
activePage.openEditor(finput, editorDescriptor.getId());
}
return;
}
}
private static void openSystemEditor(IFile localFile) throws PartInitException {
IEditorDescriptor editorDescriptor = null;
try {
editorDescriptor = IDE.getEditorDescriptor(localFile);
} catch (PartInitException e) {
SystemBasePlugin.logError(e.getLocalizedMessage(), e);
}
if (editorDescriptor == null) {
if (PlatformUI.isWorkbenchRunning())
{
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
editorDescriptor = registry.findEditor("org.eclipse.ui.DefaultTextEditor"); //$NON-NLS-1$
}
}
//This file is from local connection, and it is inside a project in the work
IWorkbenchPage activePage = SystemBasePlugin.getActiveWorkbenchWindow().getActivePage();
// set editor as preferred editor for this file
String editorId = null;
if (editorDescriptor != null) {
editorId = editorDescriptor.getId();
}
IDE.setDefaultEditor(localFile, editorId);
FileEditorInput fileInput = new FileEditorInput(localFile);
activePage.openEditor(fileInput, IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
return;
}
}