mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-03 15:15:25 +02:00
[238294] ClassCastException using Link With Editor
This commit is contained in:
parent
f0dc80f98b
commit
40f3441b57
1 changed files with 108 additions and 73 deletions
|
@ -11,6 +11,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* David McKnight (IBM) - [187711] Link with Editor action for System View
|
||||
* David McKnight (IBM) - [238294] ClassCastException using Link With Editor
|
||||
*******************************************************************************/
|
||||
package org.eclipse.rse.internal.files.ui.actions;
|
||||
|
||||
|
@ -29,12 +30,12 @@ import org.eclipse.rse.core.RSECorePlugin;
|
|||
import org.eclipse.rse.core.filters.ISystemFilter;
|
||||
import org.eclipse.rse.core.filters.ISystemFilterPoolReferenceManager;
|
||||
import org.eclipse.rse.core.filters.ISystemFilterReference;
|
||||
import org.eclipse.rse.core.subsystems.ISubSystem;
|
||||
import org.eclipse.rse.internal.files.ui.FileResources;
|
||||
import org.eclipse.rse.internal.files.ui.resources.SystemRemoteEditManager;
|
||||
import org.eclipse.rse.internal.ui.view.SystemViewPart;
|
||||
import org.eclipse.rse.subsystems.files.core.SystemIFileProperties;
|
||||
import org.eclipse.rse.subsystems.files.core.model.RemoteFileFilterString;
|
||||
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
|
||||
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem;
|
||||
import org.eclipse.rse.ui.view.ContextObject;
|
||||
import org.eclipse.rse.ui.view.ISystemEditableRemoteObject;
|
||||
|
@ -65,18 +66,23 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
private Object _parentObject;
|
||||
private Object[] _children;
|
||||
private ISystemTree _systemTree;
|
||||
private IRemoteFile _targetRemoteFile;
|
||||
private IAdaptable _targetRemoteObj;
|
||||
private ISystemFilterReference _filterReference;
|
||||
|
||||
public ShowChildrenInTree(Object parentObject, Object[] children, ISystemFilterReference filterReference, ISystemTree systemTree, IRemoteFile targetRemoteFile)
|
||||
public ShowChildrenInTree(Object parentObject, Object[] children, ISystemFilterReference filterReference, ISystemTree systemTree, IAdaptable targetRemoteObj)
|
||||
{
|
||||
_parentObject = parentObject;
|
||||
_children = children;
|
||||
_systemTree = systemTree;
|
||||
_targetRemoteFile = targetRemoteFile;
|
||||
_targetRemoteObj = targetRemoteObj;
|
||||
_filterReference = filterReference;
|
||||
}
|
||||
|
||||
private String getAbsolutePath(IAdaptable adaptable){
|
||||
ISystemViewElementAdapter adapter = (ISystemViewElementAdapter)adaptable.getAdapter(ISystemViewElementAdapter.class);
|
||||
return adapter.getAbsoluteName(adaptable);
|
||||
}
|
||||
|
||||
public void run()
|
||||
{
|
||||
// make sure the filter is expanded
|
||||
|
@ -90,29 +96,30 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
_systemTree.createTreeItems(item, _children);
|
||||
item.setExpanded(true);
|
||||
|
||||
IRemoteFile containingFolder = null;
|
||||
IAdaptable containingFolder = null;
|
||||
|
||||
// is one of these items our remote file?
|
||||
for (int i = 0; i < item.getItemCount(); i++){
|
||||
TreeItem childItem = item.getItem(i);
|
||||
Object data = childItem.getData();
|
||||
if (data instanceof IRemoteFile){
|
||||
IRemoteFile childFile = (IRemoteFile)data;
|
||||
String childPath = childFile.getAbsolutePath();
|
||||
if (childPath.equals(_targetRemoteFile.getAbsolutePath())){
|
||||
if (data instanceof IAdaptable){
|
||||
IAdaptable childObj = (IAdaptable)data;
|
||||
String childPath = getAbsolutePath(childObj);
|
||||
String targetPath = getAbsolutePath(_targetRemoteObj);
|
||||
if (childPath.equals(targetPath)){
|
||||
// select our remote file
|
||||
_systemTree.getTree().setSelection(childItem);
|
||||
return; // we're done!
|
||||
}
|
||||
else if (_targetRemoteFile.getAbsolutePath().startsWith(childPath)){
|
||||
containingFolder = childFile; // using this to start a deeper search for the target remote file
|
||||
else if (targetPath.startsWith(childPath)){
|
||||
containingFolder = childObj; // using this to start a deeper search for the target remote file
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// remote file not found so now we have to expand further
|
||||
if (containingFolder != null){
|
||||
LinkFromFolderJob job = new LinkFromFolderJob(containingFolder, _filterReference, _targetRemoteFile, _systemTree);
|
||||
LinkFromFolderJob job = new LinkFromFolderJob(containingFolder, _filterReference, _targetRemoteObj, _systemTree);
|
||||
job.schedule();
|
||||
}
|
||||
}
|
||||
|
@ -124,21 +131,28 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
*/
|
||||
private class LinkFromFolderJob extends Job
|
||||
{
|
||||
private IRemoteFileSubSystem _subSystem;
|
||||
private IRemoteFile _remoteFolder;
|
||||
private IRemoteFile _targetRemoteFile;
|
||||
private ISubSystem _subSystem;
|
||||
private IAdaptable _remoteFolder;
|
||||
private IAdaptable _targetRemoteObj;
|
||||
private ISystemTree _systemTree;
|
||||
private ISystemFilterReference _filterRef;
|
||||
private ISystemViewElementAdapter _adapter;
|
||||
|
||||
public LinkFromFolderJob(IRemoteFile remoteFolder, ISystemFilterReference filterRef, IRemoteFile targetRemoteFile, ISystemTree systemTree) {
|
||||
public LinkFromFolderJob(IAdaptable remoteFolder, ISystemFilterReference filterRef, IAdaptable targetRemoteObj, ISystemTree systemTree) {
|
||||
super(FileResources.MESSAGE_EXPANDING_FOLDER);
|
||||
_remoteFolder = remoteFolder;
|
||||
_subSystem = _remoteFolder.getParentRemoteFileSubSystem();
|
||||
_subSystem = getSubSystem(remoteFolder);
|
||||
_filterRef = filterRef; // used for context of query
|
||||
_targetRemoteFile = targetRemoteFile;
|
||||
_targetRemoteObj = targetRemoteObj;
|
||||
_systemTree = systemTree;
|
||||
}
|
||||
|
||||
private ISubSystem getSubSystem(IAdaptable adaptable)
|
||||
{
|
||||
ISystemViewElementAdapter adapter = (ISystemViewElementAdapter)adaptable.getAdapter(ISystemViewElementAdapter.class);
|
||||
return adapter.getSubSystem(adaptable);
|
||||
}
|
||||
|
||||
public IStatus run(IProgressMonitor monitor){
|
||||
try
|
||||
{
|
||||
|
@ -157,7 +171,7 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
|
||||
// put these items in the tree and look for remoteFile
|
||||
// if we can't find the remote file under this filter, the ShowChildrenInTree will recurse
|
||||
Display.getDefault().asyncExec(new ShowChildrenInTree(_remoteFolder, children, _filterRef, _systemTree, _targetRemoteFile));
|
||||
Display.getDefault().asyncExec(new ShowChildrenInTree(_remoteFolder, children, _filterRef, _systemTree, _targetRemoteObj));
|
||||
}
|
||||
catch (Exception e){
|
||||
}
|
||||
|
@ -171,18 +185,29 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
*/
|
||||
private class LinkFromFilterJob extends Job
|
||||
{
|
||||
private IRemoteFileSubSystem _subSystem;
|
||||
private IRemoteFile _targetRemoteFile;
|
||||
private ISubSystem _subSystem;
|
||||
private IAdaptable _targetRemoteObj;
|
||||
private ISystemTree _systemTree;
|
||||
|
||||
public LinkFromFilterJob(IRemoteFile targetRemoteFile, ISystemTree systemTree) {
|
||||
public LinkFromFilterJob(IAdaptable targetRemoteObject, ISystemTree systemTree) {
|
||||
super(FileResources.MESSAGE_EXPANDING_FILTER);
|
||||
|
||||
_targetRemoteFile = targetRemoteFile;
|
||||
_subSystem = _targetRemoteFile.getParentRemoteFileSubSystem();
|
||||
_targetRemoteObj = targetRemoteObject;
|
||||
_subSystem = getSubSystem(_targetRemoteObj);
|
||||
_systemTree = systemTree;
|
||||
}
|
||||
|
||||
private ISystemViewElementAdapter getAdapter(IAdaptable adaptable)
|
||||
{
|
||||
return (ISystemViewElementAdapter)adaptable.getAdapter(ISystemViewElementAdapter.class);
|
||||
}
|
||||
|
||||
private ISubSystem getSubSystem(IAdaptable adaptable)
|
||||
{
|
||||
ISystemViewElementAdapter adapter = getAdapter(adaptable);
|
||||
return adapter.getSubSystem(adaptable);
|
||||
}
|
||||
|
||||
public IStatus run(IProgressMonitor monitor){
|
||||
try
|
||||
{
|
||||
|
@ -193,16 +218,12 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
// the object is nowhere to be found!
|
||||
return Status.OK_STATUS;
|
||||
}
|
||||
|
||||
// get the adapter
|
||||
ISystemViewElementAdapter adapter = (ISystemViewElementAdapter)((IAdaptable)ref).getAdapter(ISystemViewElementAdapter.class);
|
||||
|
||||
|
||||
// get the context
|
||||
ContextObject contextObject = new ContextObject(ref, _subSystem, ref);
|
||||
|
||||
// get the children
|
||||
Object[] children = adapter.getChildren(contextObject, monitor);
|
||||
Object[] children = getAdapter((IAdaptable)ref).getChildren(contextObject, monitor);
|
||||
|
||||
if (monitor.isCanceled()){
|
||||
return Status.CANCEL_STATUS;
|
||||
|
@ -210,16 +231,17 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
|
||||
// put these items in the tree and look for remoteFile
|
||||
// if we can't find the remote file under this filter, the ShowChildrenInTree will recurse
|
||||
Display.getDefault().asyncExec(new ShowChildrenInTree(ref, children, ref, _systemTree, _targetRemoteFile));
|
||||
Display.getDefault().asyncExec(new ShowChildrenInTree(ref, children, ref, _systemTree, _targetRemoteObj));
|
||||
}
|
||||
catch (Exception e){
|
||||
catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
return Status.OK_STATUS;
|
||||
}
|
||||
|
||||
private ISystemFilterReference findMatchingFilterReference()
|
||||
{
|
||||
String remoteObjectName = _targetRemoteFile.getAbsolutePath();
|
||||
String remoteObjectName = getAbsolutePath(_targetRemoteObj);
|
||||
ISystemFilterPoolReferenceManager refmgr = _subSystem.getFilterPoolReferenceManager();
|
||||
if (refmgr != null){
|
||||
ISystemFilterReference[] refs = refmgr.getSystemFilterReferences(_subSystem);
|
||||
|
@ -234,6 +256,11 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
return null;
|
||||
}
|
||||
|
||||
private String getAbsolutePath(IAdaptable adaptable){
|
||||
ISystemViewElementAdapter adapter = (ISystemViewElementAdapter)adaptable.getAdapter(ISystemViewElementAdapter.class);
|
||||
return adapter.getAbsoluteName(adaptable);
|
||||
}
|
||||
|
||||
private boolean doesFilterEncompass(ISystemFilter filter, String remoteObjectAbsoluteName)
|
||||
{
|
||||
boolean would = false;
|
||||
|
@ -247,10 +274,12 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
{
|
||||
// my home filter - will encompass iff remoteObjectAbsoluteName is within the home dir
|
||||
try
|
||||
{
|
||||
IRemoteFile homeDir = _subSystem.getRemoteFileObject(".", new NullProgressMonitor());
|
||||
String homePath = homeDir.getAbsolutePath();
|
||||
would = remoteObjectAbsoluteName.startsWith(homePath);
|
||||
{
|
||||
IAdaptable homeObj = (IAdaptable)_subSystem.getObjectWithAbsoluteName(".", new NullProgressMonitor());
|
||||
if (homeObj != null){
|
||||
String homePath = getAbsolutePath(homeObj);
|
||||
would = remoteObjectAbsoluteName.startsWith(homePath);
|
||||
}
|
||||
}
|
||||
catch (Exception e){
|
||||
}
|
||||
|
@ -264,37 +293,42 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
|
||||
private boolean doesFilterStringEncompass(String filterString, String remoteObjectAbsoluteName)
|
||||
{
|
||||
RemoteFileFilterString rffs = new RemoteFileFilterString(_subSystem.getParentRemoteFileSubSystemConfiguration(), filterString);
|
||||
// ok, this is a tweak: if the absolute name has " -folder" at the end, that means it is a folder...
|
||||
if (remoteObjectAbsoluteName.endsWith(" -folder")) //$NON-NLS-1$
|
||||
{
|
||||
if (!rffs.getShowSubDirs())
|
||||
if (_subSystem instanceof IRemoteFileSubSystem){
|
||||
RemoteFileFilterString rffs = new RemoteFileFilterString(((IRemoteFileSubSystem)_subSystem).getParentRemoteFileSubSystemConfiguration(), filterString);
|
||||
// ok, this is a tweak: if the absolute name has " -folder" at the end, that means it is a folder...
|
||||
if (remoteObjectAbsoluteName.endsWith(" -folder")) //$NON-NLS-1$
|
||||
{
|
||||
if (!rffs.getShowSubDirs())
|
||||
return false;
|
||||
remoteObjectAbsoluteName = remoteObjectAbsoluteName.substring(0, remoteObjectAbsoluteName.indexOf(" -folder")); //$NON-NLS-1$
|
||||
}
|
||||
// problem 1: we don't know if the given remote object name represents a file or folder. We have to assume a file,
|
||||
// since we don't support filtering by folder names.
|
||||
if (!rffs.getShowFiles())
|
||||
return false;
|
||||
remoteObjectAbsoluteName = remoteObjectAbsoluteName.substring(0, remoteObjectAbsoluteName.indexOf(" -folder")); //$NON-NLS-1$
|
||||
}
|
||||
// problem 1: we don't know if the given remote object name represents a file or folder. We have to assume a file,
|
||||
// since we don't support filtering by folder names.
|
||||
if (!rffs.getShowFiles())
|
||||
return false;
|
||||
|
||||
// step 1: verify the path of the remote object matches the path of the filter string
|
||||
String container = rffs.getPath();
|
||||
if (container == null)
|
||||
return false;
|
||||
// step 1: verify the path of the remote object matches the path of the filter string
|
||||
String container = rffs.getPath();
|
||||
if (container == null)
|
||||
return false;
|
||||
|
||||
if (container.equals(".")) //$NON-NLS-1$
|
||||
{
|
||||
try
|
||||
{
|
||||
container = _subSystem.getRemoteFileObject(container, new NullProgressMonitor()).getAbsolutePath();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
}
|
||||
}
|
||||
if (container.equals(".")) //$NON-NLS-1$
|
||||
{
|
||||
try
|
||||
{
|
||||
IAdaptable containerObj = (IAdaptable)_subSystem.getObjectWithAbsoluteName(container, new NullProgressMonitor());
|
||||
if (containerObj != null){
|
||||
container = getAbsolutePath(containerObj);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
if (remoteObjectAbsoluteName.startsWith(container)){
|
||||
return true;
|
||||
if (remoteObjectAbsoluteName.startsWith(container)){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -308,11 +342,11 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
*/
|
||||
private class SelectFileJob extends Job
|
||||
{
|
||||
private IRemoteFileSubSystem _subSystem;
|
||||
private ISubSystem _subSystem;
|
||||
private String _path;
|
||||
private ISystemTree _systemTree;
|
||||
|
||||
public SelectFileJob(IRemoteFileSubSystem subSystem, String path, ISystemTree systemTree) {
|
||||
public SelectFileJob(ISubSystem subSystem, String path, ISystemTree systemTree) {
|
||||
super(FileResources.MESSSAGE_QUERYING_FILE);
|
||||
_subSystem = subSystem;
|
||||
_path = path;
|
||||
|
@ -323,21 +357,21 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
try
|
||||
{
|
||||
// doing query to get the remote file
|
||||
final IRemoteFile remoteFile = _subSystem.getRemoteFileObject(_path, monitor);
|
||||
final IAdaptable remoteObj = (IAdaptable)_subSystem.getObjectWithAbsoluteName(_path, monitor);
|
||||
|
||||
Display.getDefault().asyncExec(new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
// on main thread, looking for the reference in the tree
|
||||
TreeItem item = (TreeItem)_systemTree.findFirstRemoteItemReference(remoteFile, null);
|
||||
TreeItem item = (TreeItem)_systemTree.findFirstRemoteItemReference(remoteObj, null);
|
||||
if (item != null){
|
||||
_systemTree.getTree().setSelection(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
// no reference in the tree so we will search forward from the filter in a job (avoiding query on the main thread)
|
||||
LinkFromFilterJob job = new LinkFromFilterJob(remoteFile, _systemTree);
|
||||
LinkFromFilterJob job = new LinkFromFilterJob(remoteObj, _systemTree);
|
||||
job.schedule();
|
||||
}
|
||||
}
|
||||
|
@ -411,12 +445,12 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
IFile file = fileInput.getFile();
|
||||
SystemIFileProperties properties = new SystemIFileProperties(file);
|
||||
Object rmtEditable = properties.getRemoteFileObject();
|
||||
IRemoteFile remoteObj = null;
|
||||
IRemoteFileSubSystem subSystem = null;
|
||||
IAdaptable remoteObj = null;
|
||||
ISubSystem subSystem = null;
|
||||
if (rmtEditable != null && rmtEditable instanceof ISystemEditableRemoteObject)
|
||||
{
|
||||
ISystemEditableRemoteObject editable = (ISystemEditableRemoteObject) rmtEditable;
|
||||
remoteObj = (IRemoteFile)editable.getRemoteObject();
|
||||
remoteObj = editable.getRemoteObject();
|
||||
|
||||
TreeItem item = (TreeItem)systemTree.findFirstRemoteItemReference(remoteObj, null);
|
||||
if (item != null){
|
||||
|
@ -424,7 +458,8 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
}
|
||||
else
|
||||
{
|
||||
subSystem = remoteObj.getParentRemoteFileSubSystem();
|
||||
ISystemViewElementAdapter adapter = (ISystemViewElementAdapter)remoteObj.getAdapter(ISystemViewElementAdapter.class);
|
||||
subSystem = adapter.getSubSystem(remoteObj);
|
||||
|
||||
// no match, so we will expand from filter
|
||||
// query matching filter in a job (to avoid main thread)
|
||||
|
@ -439,7 +474,7 @@ public class LinkWithSystemViewAction implements IViewActionDelegate {
|
|||
String path = properties.getRemoteFilePath();
|
||||
if (subsystemId != null && path != null)
|
||||
{
|
||||
subSystem = (IRemoteFileSubSystem)RSECorePlugin.getTheSystemRegistry().getSubSystem(subsystemId);
|
||||
subSystem = RSECorePlugin.getTheSystemRegistry().getSubSystem(subsystemId);
|
||||
if (subSystem != null)
|
||||
{
|
||||
// query for file in a job (to avoid main thread)
|
||||
|
|
Loading…
Add table
Reference in a new issue