2007-02-24 04:26:45 +00:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
< html >
< head >
< META HTTP-EQUIV = "Content-Type" CONTENT = "text/html; charset=UTF-8" >
< META HTTP-EQUIV = "Content-Style-Type" CONTENT = "text/css" >
< meta name = "copyright" content = "Copyright (c) IBM Corporation and others 2002, 2007. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
< LINK REL = "STYLESHEET" HREF = "../../book.css" TYPE = "text/css" >
< title > Creating a Remote Resource Popup Menu Action< / title >
< / head >
< body bgcolor = "#ffffff" >
< h1 > Creating a Remote Resource pop-up Menu Action< / h1 >
< p > In this tutorial, you will use the
< samp > < A href = "../plugin/popup.html" > org.eclipse.ui.popupMenus< / a > < / samp > extension point to
create a pop-up menu action that will appear
in the context menu for any < samp > .jar< / samp > file, for any connection to
any system type. The action will be labeled "Show contents" and will simply
run the < samp > jar -tvf< / samp > JDK command when selected, displaying the results
in the command console. You could expand this example to copy the file
to a local temporary folder, extract the list of file names within the jar, and
display those names in an Eclipse table view.
< / p >
< h2 > Step-by-Step: Creating an RSE Remote Resource Pop-up Menu Action< / h2 >
< ol >
< li > If you have not already, first < a href = "pdeProject.html" > create or prepare a plugin project< / a > .
< / li >
< li > Open the < b > plugin.xml< / b > file for editing by right-clicking on it and selecting
< b > Open With-> Text Editor< / b > . Before the ending < /plugin> statement, add the following lines:
< pre > < code >
< !-- ======================================= -->
< !-- Remote Object Popup Menu Actions -->
< !-- ======================================= -->
< extension point=" org.eclipse.ui.popupMenus" >
< objectContribution
objectClass=" org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile"
2007-06-27 01:52:12 +00:00
nameFilter=" *.jar"
2007-02-24 04:26:45 +00:00
id=" actions.jar" >
< action
label=" Show contents"
tooltip=" List contents of this file"
class=" samples.ui.actions.ShowJarContents"
menubarPath=" additions"
enablesFor=" 1"
id=" actions.jar.show" >
< /action>
< /objectContribution>
< /extension>
< / code > < / pre >
Save and close the file.
< / li >
< li >
2007-06-27 01:52:12 +00:00
Right-click on the project and use the < b > New...< / b > action to create a new package in this project named < b > samples.ui.actions< / b > .
< / li >
2007-02-24 04:26:45 +00:00
< li >
2007-06-27 01:52:12 +00:00
Create the Java class: right-click on the new < B > samples.ui.actions< / B > package folder and select < B > New-> Class< / B > to open the < B > New
Java Class< / B > wizard.
Enter < B > " ShowJarContents" < / B > for the < b > Name< / b > , add < b > IObjectActionDelegate< / b >
to the < b > Interfaces< / b > that are implemented, and check the < b > constructors from superclass< / b > checkbox as shown
< A href = "popup_newClass.gif" > here< / A > .
Click < b > Finish< / b > to create the < samp > < a href = "ShowJarContents1.html" > ShowJarContents< / a > < / samp > class.
2007-02-24 04:26:45 +00:00
< / li >
2007-06-27 01:52:12 +00:00
< li > Edit the generated < samp > ShowJarContents.java< / samp > file as follows.
Use the "Source -> Organize Imports" context menu item to add the appropriate import statements as you edit.
2007-02-24 04:26:45 +00:00
< ol >
2007-06-27 01:52:12 +00:00
< li type = "i" > Add an instance variable to hold a list of remote files and initialize it in the constructor.< / li >
< pre > < code >
private List _selectedFiles;
/**
* Constructor for ShowJarContents.
*/
public ShowJarContents() {
_selectedFiles = new ArrayList();
}
< / code > < / pre >
< li type = "i" > Add the following three utility methods< / li >
< pre > < code >
protected Shell getShell() {
return SystemBasePlugin.getActiveWorkbenchShell();
}
protected IRemoteFile getFirstSelectedRemoteFile() {
if (_selectedFiles.size() > 0) {
return (IRemoteFile)_selectedFiles.get(0);
}
return null;
}
protected ISubSystem getSubSystem() {
return getFirstSelectedRemoteFile().getParentRemoteFileSubSystem();
}
< / code > < / pre >
< li type = "i" > Add the following methods to find the subsystem and run the command:< / li >
< pre > < code >
public void runCommand(String command) {
2007-02-24 04:26:45 +00:00
IRemoteCmdSubSystem cmdss = getRemoteCmdSubSystem();
2007-09-12 19:02:08 +00:00
if (cmdss != null & & cmdss.isConnected()) {
2007-06-27 01:52:12 +00:00
// Run the command in a visible shell
RemoteCommandHelpers.runUniversalCommand(getShell(), command, ".", cmdss); //$NON-NLS-1$
2007-02-24 04:26:45 +00:00
} else {
MessageDialog.openError(getShell(), "No command subsystem", "Found no command subsystem");
}
}
2007-06-27 01:52:12 +00:00
2007-02-24 04:26:45 +00:00
/**
* Gets the Command subsystem associated with the current host
*/
2007-06-27 01:52:12 +00:00
public IRemoteCmdSubSystem getRemoteCmdSubSystem() {
2007-02-24 04:26:45 +00:00
IHost myHost = getSubSystem().getHost();
IRemoteCmdSubSystem[] subsys = RemoteCommandHelpers.getCmdSubSystems(myHost);
2007-09-12 19:02:08 +00:00
for (int i = 0; i < subsys.length; i++) {
2007-02-24 04:26:45 +00:00
if (subsys[i].getSubSystemConfiguration().supportsCommands()) {
return subsys[i];
}
}
return null;
}
2007-06-27 01:52:12 +00:00
< / code > < / pre >
< li type = "i" > Finally, flesh out the methods that were created as stubs< / li >
< pre > < code >
public void run(IAction action) {
IRemoteFile selectedFile = getFirstSelectedRemoteFile();
String cmdToRun = "jar -tvf " + selectedFile.getAbsolutePath(); //$NON-NLS-1$
try {
runCommand(cmdToRun);
} catch (Exception e) {
String excType = e.getClass().getName();
MessageDialog.openError(getShell(), excType, excType + ": " + e.getLocalizedMessage()); //$NON-NLS-1$
e.printStackTrace();
}
}
public void selectionChanged(org.eclipse.jface.action.IAction action, org.eclipse.jface.viewers.ISelection selection) {
_selectedFiles.clear();
// store the selected jars to be used when running
Iterator theSet = ((IStructuredSelection) selection).iterator();
while (theSet.hasNext()) {
Object obj = theSet.next();
if (obj instanceof IRemoteFile) {
_selectedFiles.add(obj);
}
}
}
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
}
< / code > < / pre >
2007-02-24 04:26:45 +00:00
< / ol >
The final result after editing is shown < a href = "ShowJarContents2.html" > here< / a > .
< / li >
< / ol >
2007-06-27 01:52:12 +00:00
< p >
Now, you can try your new action. Use < b > Run-> Run As-> Eclipse Application< / b > .
Drill
2007-02-24 04:26:45 +00:00
down in the RSE to a Jar file in a local or remote connection and right-click to < a href = "popup_see.gif" > see< / a > and < a href = "popup_run.gif" > run< / a > your new action. Notice
2007-06-27 01:52:12 +00:00
how it does not appear for files that do not end with the ".jar" extension. This is because of the "nameFilter" attribute
2007-02-24 04:26:45 +00:00
in our extension point .xml file.
< / body >
< / html >