Sunday, August 8, 2010

useful Eclipse PDE faqs

http://wiki.eclipse.org/Eclipse_Plug-in_Development_FAQ#How_do_I_ask_my_decorator_to_decorate_items.3F



How do I find a class from Eclipse?

See here.

I see these $NON-NLS-1$ tags all over the place when I'm browsing Eclipse's source code? What do they mean?

They are meant to mark a string literal as not needing to be externalized (as in, translated / localized). You will often see something like...

if (string.equals("")) { //$NON-NLS-1$

// do stuff
}

...this would be a scenario where a string wouldn't need to be localized because it is a string for the code to "manipulate", per se, over it being part of a message to the user at the UI level.

I need help debugging my plug-in...

Are you getting errors like "Unhandled loop event exception" messages in your console with nothing useful after it? Make sure you have -consoleLog as a Program Argument in your launch configuration. You may also want to take a look at these runtime tools.

I'm using third party jar files and my plug-in is not working...

Did you add those jars to your project's Java Build Path? Do not use that project property page when developing plug-ins. You have two options.

Option 1: turn the jars into plug-ins Use New > Project > Plug-in Development > Plug-in from existing JAR archive. That will turn one or more jar files into a single jar plug-in. For something like log4j you can then set up Buddy-Classloading, etc.

Prior to 3.2.1, you had to make modifications to the build.properties file. See bug 146042 (RCP export has problems with required plug-ins).

Option 2: include the jars in a plug-in

  1. Use Import>File System to import the jar files into your plug-in project, say in the /lib directory.
  2. Use "Add..." to add the jars to the classpath section of the PDE Editor>Runtime tab.
  3. Use "New..." to add "." library back (with no quotes, of course). Some versions of eclipse automatically do this for you.
  4. Make sure your binary build exports the new jar files on the PDE Editor>Build tab.
  5. Save
  6. On the project, use the popup menu>PDE Tools>Update Classpath to correctly add the jars to the eclipse project classpath.
  7. Export any packages that you need to using the PDE Editor>Runtime tab
  8. Save

Check out bug 108781.

It talks about how adding a 3rd party jar removes the default "." classpath, and the need to add it back.

Also, Eclipse can handle jars within jars. It expands them into a temporary location during runtime.

What is the IAdaptable interface?

The articles below may be of your interest.

How do I read from a file that I've included in my bundle/plug-in?

The FileLocator class should be able to do most of the things that you want. It can open up a java.io.InputStream as well as provide a java.io.File. You should keep in mind that the java.io.File approach is not going to work if your bundle is packaged as a jar file. To get a reference to your bundle's Bundle instance, you can use Platform's getBundle(String) method. Alternatively, if your bundle's activator subclasses Plugin or AbstractUIPlugin, then you can just call getBundle() from it directly. If your activator simply implements the BundleActivator interface, then from your implementation of the start(BundleContext) method, you can just call getBundle() on the passed in BundleContext to store the Bundle instance in a field for retrieval later. You can also query for Bundle instances from the PackageAdmin service.

// your BundleActivator implementation will probably look something

// like the following
public class Activator implements BundleActivator {
private static Activator instance;

private Bundle bundle;

public void start(BundleContext context) throws Exception {
instance = this;
bundle = context.getBundle();
}

public void stop(BundleContext context) throws Exception {
instance = null;
}

public static Activator getDefault() {
return instance;
}

public Bundle getBundle() {
return bundle;
}
}

// code to retrieve an java.io.InputStream
InputStream inputStream = FileLocator.openStream(
Activator.getDefault().getBundle(), new Path("resources/setup.xml"), false);

Where do I find the javadoc for the Eclipse API locally? I don't always want to load stuff up in a browser.

You will already have the javadocs for the Eclipse Platform if you installed the Eclipse SDK. The HTML files are stored in the org.eclipse.platform.doc.isv jar file located in your eclipse/plugins folder. Likewise, you can find JDT APIs in their org.eclipse.jdt.doc.isv jar file and so on.

A plug-in in my 'Eclipse Application' launch configuration is listed as being "out of sync", what should I do?

One known workaround to this problem is to remove your workspace's .metadata/org.eclipse.pde.core folder. Cleaning and reloading the target platform does not appear to fix this problem.

User Interface

There's a view / editor that I want to model. How do I find out how it was designed?

Views and editors generally extend ViewPart and EditorPart respectively. Placing a breakpoint in its constructor when you show the view or editor or invoking the "Plug-in Spy" with the Alt+Shift+F1 keybinding will tell you what the name of that class is. From there, you can inspect the class's code to see how it works. In the case of the user interface elements, you should look at its implementation of the createPartControl(Composite) method.

There's a preference / property page that I want to model. How do I find out how they designed it?

Put a breakpoint in the constructors of the PreferencePage / PropertyPage class. Open the preferences / properties dialog, and then select the page you are interested about. Now you can identify which class is constructing that page based on the stack trace.

You can also invoke the "Plug-in Spy" with the Alt+Shift+F1 keybinding to retrieve information about the page that your mouse is currently hovering over.

There's a window / dialog / popup that I want to model. How do I find out how it was designed?

There are two usual suspects, an SWT Shell or a JFace Window. Generally, most developers subclass's JFace's Dialog class (which is a subclass of Window) for their dialog needs. So you should first try and put a breakpoint in Window's open() method and see if the window you're trying to model stops at that breakpoint when it has been opened (shown). If not, try Shell's open() or setVisible(boolean) methods.

You can also invoke the "Plug-in Spy" with the Alt+Shift+F1 keybinding to retrieve information about the window that your mouse is currently hovering over.

Wayne's blog post may be of help to you.

There's a wizard page that I want to model. How do I find out how they designed it?

Wizard pages usually extend the WizardPage class. Putting a breakpoint in its constructor will help you identify the class that is creating that page.

You can also invoke the "Plug-in Spy" with the Alt+Shift+F1 keybinding to retrieve information about the wizard that your mouse is currently hovering over.

How can I leverage the 'Outline' view?

In your IWorkbenchPart's implementation, you should override the getAdapter(Class) method and return your own implementation of IContentOutlinePage or you can choose to subclass ContentOutlinePage.

public Object getAdapter(Class adapter) {

if (adapter.equals(IContentOutlinePage.class)) {
return page;
}
// do NOT forget this line
return super.getAdapter(adapter);
}

How can I show the perspective bar in my RCP application?

In your concrete subclass of WorkbenchWindowAdvsior, you should override its preWindowOpen() method and then call setShowPerspectiveBar(boolean) on your IWorkbenchWindowConfigurer (which you retrieve by invoking getWindowConfigurer()).

How do I get the perspective bar to show on the top right corner?

The code below will demonstrate this.

PlatformUI.getPreferenceStore().setValue(IWorkbenchPreferenceConstants.DOCK_PERSPECTIVE_BAR, IWorkbenchPreferenceConstants.TOP_RIGHT);

How do I warn the user that a workbench part that is not currently visible has changed?

From your WorkbenchPart subclass, you can use the code below. Please note that the code below currently only works on views. For notification support in editors, please see bug 86221.

IWorkbenchSiteProgressService service = (IWorkbenchSiteProgressService) part.getSite().getService(IWorkbenchSiteProgressService.class);

// notify the user by turning the workbench part's title bold
service.warnOfContentChange();

How can I make use of the workbench's browser capabilities?

To leverage the workbench's browser capabilities, you will have to interact with the IWorkbenchBrowserSupport class. The code below will show you how to retrieve an implementation of this interface and open a website with the external browser:

try {

IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
browserSupport.getExternalBrowser().openURL(new URL("http://www.eclipse.org"));
} catch (PartInitException e) {
// handle the exception
}

How do I retrieve the id of a preference page?

You can try the following code below:

public String getId(IPreferencePage page) {

PreferenceManager pm = PlatformUI.getWorkbench().getPreferenceManager();
List list = pm.getElements(PreferenceManager.PRE_ORDER);

for (int i = 0; i < class="me1">size(); i++) {
PreferenceNode node = (PreferenceNode) list.get(i);
IPreferencePage p = node.getPage();

if (p == page) {
return node.getId();
}
}
return null;
}

How do I ask my decorator to decorate items?

You can try the following code below:

PlatformUI.getWorkbench().getDecoratorManager().update("com.mycompany.product.ui.decoratorId");

How do I get the icon associated with a file or content type?

You can try the following code below:

IContentType contentType = IDE.getContentType(file);

ImageDescriptor imageDescriptor =
PlatformUI.getWorkbench().getEditorRegistry().getImageDescriptor(file.getName(), contentType);

How do I set the selection of an editor or view?

You can retrieve the selection provider from a workbench part from its site.

IWorkbenchPartSite site = workbenchPart.getSite();

ISelectionProvider provider = site.getSelectionProvider();
// this can be null if the workbench part hasn't set one, better safe than sorry
if (provider != null) {
provider.setSelection(...);
}

How do I get progress feedback in the status bar in my RCP application?

Try adding the following piece of code in your WorkbenchWindowAdvisor's preWindow() implementation:

public void preWindowOpen() {

getWindowConfigurer().setShowProgressIndicator(true);
}

Editors

How do I add those rectangles in my source editor like what JDT does for parameter names during code completion?

To achieve this, you will need to use a LinkedModeModel and a LinkedModeUI. Open the 'Call Hierarchy' on either of the two constructors to find out how to use those two classes.

How do I implement a 'Quick Outline' for my editor?

JDT's implementing class is named 'org.eclipse.jdt.internal.ui.text.JavaOutlineInformationControl', you should take a look at that.

How do I get an editor's StyledText widget?

Since you cannot access the editor's ITextViewer, you will have to try using the code below.

StyledText text = (StyledText) editor.getAdapter(Control.class);

How can I get the IDocument from an editor?

Assuming the editor implements the ITextEditor interface, you can try the code below.

// assuming 'editorPart' is an instance of an org.eclipse.ui.IEditorPart

ITextEditor editor = (ITextEditor) editorPart.getAdapter(ITextEditor.class):
if (editor != null) {
IDocumentProvider provider = editor.getDocumentProvider();
IDocument document = provider.getDocument(editor.getEditorInput());
}

This code should work on most text editors.

How do I get an IFile given an IEditorPart or IEditorInput?

The code below will demonstrate how to do this.

IFile file = (IFile) editorPart.getEditorInput().getAdapter(IFile.class);

if (file != null) {
// do stuff
}

Note that IFiles are meant to represent files within the workspace and will not work if the file that has been opened is not contained within the workspace. Instead, a FileStoreEditorInput is usually passed into the editor when the editor is opening a file outside the workspace.

How do I hide the tabs of a MultiPageEditorPart if it only has one page?

Adding the code below into your MultiPageEditorPart's subclass should do the trick.

protected void createPages() {

super.createPages();
if (getPageCount() == 1) {
Composite container = getContainer();
if (container instanceof CTabFolder) {
((CTabFolder) container).setTabHeight(0);
}
}
}

How do I change the editor that is being opened when a marker has been opened?

You can associate the string ID of your editor onto your marker with IMarker's setAttribute(String, Object) method by using the EDITOR_ID_ATTR string constant defined in the IDE class as the attribute name.

marker.setAttribute(IDE.EDITOR_ID_ATTR, "com.example.xyz.editorID");

How can I make my editor respond to a user opening a marker?

When a marker has been opened, the Eclipse Platform tries to help the user out via the IGotoMarker interface. Your editor should either implement the interface or respond to this class by returning an implementation via the getAdapter(Class) method.

public Object getAdapter(Class adapter) {

if (adapter.equals(IGotoMarker.class)) {
return gotoMarker;
}
return super.getAdapter(adapter);
}

IGotoMarker's gotoMarker(IMarker) method will be called accordingly on the corresponding interface implementation and it is in that method implementation that you can react to a user opening a marker.

Why does the workbench keep opening a new editor every time I open a marker?

Are you using a custom IEditorInput implementation for your editor? You should override Object's equals(Object) method to return true if your custom implementation is equal to another IEditorInput.

Clients implementing this editor input interface should override Object.equals(Object) to answer true for two inputs that are the same. The IWorbenchPage.openEditor APIs are dependent on this to find an editor with the same input.

How should I let my editor know that its syntax colours have changed?

You should return true when you receive the proper notifications through AbstractTextEditor's affectsTextPresentation(PropertyChangeEvent) method.

How do I close one/all of my editors upon workbench shutdown so that it won't appear upon workbench restart?

See here.

How do I prevent a particular editor from being restored on the next workbench startup?

In your IEditorInput implementation, you can return null for getPersistable() or false for exists().

Debug

How do I invoke a process and have its output managed by the 'Console' view?

Use DebugPlugin's newProcess(ILaunch, Process, String) or newProcess(ILaunch, Process, String, Map) method. You will probably be calling this in your ILaunchConfigurationDelegate implementation.

How do I associate my executed process with its command line counterpart?

Your IProcess implementation must return a valid string that corresponds to the IProcess.ATTR_CMDLINE attribute. The sample code below will demonstrate how this is done with the DebugPlugin's newProcess(ILaunch, Process, String, Map) method.

String commandLine = "/usr/bin/make";

Map attributes = new HashMap();
attributes.put(IProcess.ATTR_CMDLINE, commandLine);
Process process = Runtime.getRuntime().exec(commandLine);
// this assumes that 'launch' is a non-null reference to an ILaunch implementation
DebugPlugin.newProcess(launch, process, "make", attributes);

How do I capture the output of my launched application like the 'Console' view?

If the underlying IProcess allows for the retrieval of its IStreamsProxy, you can retrieve a corresponding IStreamMonitor and attach an IStreamListener onto it to monitor changes to the stream.

The sample code below will demonstrate how to read the InputStream of an executed process:

String commandLine = "/usr/bin/make";

Process process = Runtime.getRuntime().exec(commandLine);
IProcess iProcess = DebugPlugin.newProcess(launch, process, "make", attributes);
iProcess.getStreamsProxy().getOutputStreamMonitor().addListener(new IStreamListener(){
public void streamAppended (String text, IStreamMonitor monitor){
//TODO: As per user requirement.
}
});

How do I run Eclipse launch configurations programmatically?

Let us say you want to contribute to the PackageExplorer and run a CompilationUnit using a context menu. This is how you would run a Java Application using a dynamic launch configuration.

First, an ILaunchConfiguration is created by using its ILaunchConfigurationType. Already existing types can be obtained via the ILaunchManager:

ILaunchConfigurationType javaType = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);

ILaunchConfigurationWorkingCopy config = javaType.newInstance(null, name);

Then you need so set each attribute to complete your launch configuration. Check out JavaRuntime for further methods, e.g. variable entries.

List classpath = new ArrayList();

classpath.add(JavaRuntime.newArchiveRuntimeClasspathEntry(new Path("/project.web/src/main/java")).getMemento());
classpath.add(JavaRuntime.newArchiveRuntimeClasspathEntry(new Path("/lib/dev-2.0.0.jar")).getMemento());
classpath.add(JavaRuntime.newRuntimeContainerClasspathEntry(new Path( JavaRuntime.JRE_CONTAINER ), IRuntimeClasspathEntry.STANDARD_CLASSES, project).getMemento());
classpath.add(new DefaultProjectClasspathEntry(project).getMemento());
config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH, classpath);

config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, false);

List resourceTypes = new ArrayList();
List resourcePaths = new ArrayList();
resourcePaths.add("/project.web");
resourceTypes.add("4");
config.setAttribute(LaunchConfiguration.ATTR_MAPPED_RESOURCE_TYPES, resourceTypes);
config.setAttribute(LaunchConfiguration.ATTR_MAPPED_RESOURCE_PATHS, resourcePaths);

config.setAttribute(ILaunchManager.ATTR_APPEND_ENVIRONMENT_VARIABLES, true);

config.setAttribute(JavaMainTab.ATTR_CONSIDER_INHERITED_MAIN, true);
config.setAttribute(JavaMainTab.ATTR_INCLUDE_EXTERNAL_JARS, true);

config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, "project.Main");
config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, "-startupUrl index.html");
config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "project.web");
config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, "-Xmx256M");

Now you can either run it directly in Eclipse...

DebugUITools.launch(config, ILaunchManager.RUN_MODE);

...or save this configuration, which is great for verifying the attributes.

config.doSave();

See also FAQ How do I launch a Java program?

Release

How do I make a p2 repository

This is not the only way to create a repository, and it may not be the best way, but it worked for me. YMMV.

  • Initially, create a project in your workspace called "UpdateSite".
    • If you choose a different name, some of the following steps will need modification.
  • Export the updated plugins and features:
    • Select the features you want to release in the Package Explorer view.
    • Choose File -> Export from the menu.
    • Plug-In Development -> Deployable Features, click Next
    • Select features to update
    • Destination Directory should be the UpdateSite project in your workspace.
    • Turn off "generate repository metadata"
    • Click Finish
  • Edit your category.xml and add any new or updated features to it, in the correct categories.
  • Generate the artifacts.xml file using the ant build.xml file below with target="artifacts"
  • Generate the content.jar with categories:
  • Launch an eclipse application with the following parameters:
    • -application org.eclipse.equinox.p2.publisher.CategoryPublisher
    • -consolelog
    • -repositoryName "My Update Site"
    • -metadataRepository file:${project_loc:UpdateSite}
    • -categoryDefinition file:${project_loc:UpdateSite}/category.xml
    • -categoryQualifier
    • -compress

Here is the Ant build file for generating artifacts.xml

 version="1.0" encoding="UTF-8"?>

name="project" default="artifacts">
name="artifacts">
file="artifacts.xml"/>
file="content.xml"/>
file="artifacts.jar"/>
file="content.jar"/>
.publish.featuresAndBundles
repository="file:${basedir}"
repositoryname="My Update Site"
source="${basedir}"
compress="true" />

>

>

Tuesday, July 27, 2010

Add Actions-sets in existing Perspectives

Assumption/PRE-required knowledge : Actionsets has already been created in your plugin. I will only be using the ID declared fr this action set in order to customize its visibility on existing Perspectives.

Example Objective: To display my Actionset with id =”myActionSet” only in Debug perspective(id : org.eclipse.debug.ui.DebugPerspective")

Steps:

There are two ways of doing this.. One is through the class implementation as in (1) below), while is other is by using only plugin.xml file(2) below)

  1. Class implementation: As a first step, we need to register our plug-in as a perspective change listener.
--> include the below xml snippet in plugin.xml

--> Now, implement the class EarlyStartup mentioned in your xml code. This class should implement the IStartup interface and implement the method perspectiveActivated from within the method earlyStartup(). This method is responsible for the action performed every time a perspective is activated.
--------

--------
With the above code, your action sets will be visible only in perspectives related to JAVA, such as : Java, Java Browsing and Java Type Hierarchy.

***************************************************************

2. Extend your plug-in with the extension -Perspective Extensions(refer the blog - 'Customizing existing Perspective')

References:







Sunday, July 25, 2010

source code websites

DOCJAR

GREPCODE

KICKJAVA

http://www.devdaily.com/java/jwarehouse/eclipse/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertyEditingSupport.java.shtml

JAD - JAVA Decompiler / JADCLIPSE

  • In order to use JAD in eclipse, you need to update the eclipse version with the Update site forJADClipse - http://jadclipse.sf.net/update 1) Eclipse >> help >> install new software >> type - http://jadclipse.sf.net/update >> add >> choose ' JDT Decompiler feature' from list
    >> next >>and just follow eclipse instructions once this is done.... and you restart eclipseNow, you will be able to view source codes of all library classes when you search for a certain "java' element using the "alt+shift+t"

Wednesday, July 14, 2010

Externalize/Internationalize Plug-in strings

Externalize / Internationalize Strings in plugin.xml

When we extend our plug-in projects with some extension.. there will be soo many attribute values such as Names, labels etc. It becomes tedious to change every such attributue if in case required in the later stage of the project.

The easier way to do it is to be able to see it all at one file(the .properties file).

This becomes of utmost importance when the developer is ignorant of the local language and would want to just type-in English texts for these attribute values..

The language interpreter could just refer to this one file(.properties file) and convert all the required strings into the local language without having to know the Extension implementation details.

How is this implemented??

note: This article is applicable only for externalization of PLugin.xml files.. If you are to externalize source files.. its a whole new procedure...
  • Create your plug-in project.
  • once you have completed with including all the required extensions, make sure you have completed with all the textual values of attributes such as name, label, etc
  • Now, select your plugin.xml file form the explorer view
  • right click >>
  • PDE Tools >>
  • Externalize Strings/Internationalize >>
  • choose and expand the plug-in of interest
  • choose the manifest.mf and the plugin.xml file one by one to check if you are alright with the appended changes.
  • You could even modify the 'substitution key ' values if preferred
  • Next>> check with the appended changes in each file under your plug-in
  • Finish
Now, you will have a new bundle.properties file in your project which will map all the strings to a certain value.

Check the below screenshot after externalization:

Monday, July 12, 2010

Debug Eclipse Runtime Plug-ins

showView >> Plug-ins>>

choose the plug-in you want to debug..

>>right-click

>>Import as

>> source project

Now look at your project explorer to fins this plug-in...

Now.. go ahead and debug :)

Eclipse Pop-up Menu

org.eclipse.ui.popupMenus
****************************

Eclipse Pop-up menus are menuitems that appear when you right-click on an object in the Eclipse workbench.

Steps:

1) Create a Plug-in project with the.. While you are in the process of creating your plug-in project, when prompted for a template.. choose

' Plug-in project with pop-up menu'>>
next>>
finish

2)Open the Plugin.xml file

3)choose the 'extensions' tab. You will see th eextension structure as seen in the figure below:


4) Now, click on the ....(Object Contribution) item. This will populate the right tab with the details of 'id' and 'Object class'.(figure below)




5) Now, when you right-click on a object from the eclipse workbench, this Object class attribute is the value which determines, when right-clicked on which object, the pop-up needs to be visible as the context menu. Now, if you want to enable this pop-up meny when you click on a folder from any of the eclipse views, you have to browse to 'org.eclipse.core.resources.IFolder' in the field for Object class.


6) As a result of the above step, you will be able to view the pop-up when right-clicking on a folder object in your Eclipse wrkbench as seen in the figure below.

7) In your step 3), click on the ....(Action) item. This will populate the right tab with many details. Now when you click at the 'class' parameter from this view, It opens the class in an editor. This is the class where you can define the action that needs to be performed when you click on the popUpMenu Action(refer figure above)

And there you gooooo :)
***************************************

Eclipse SPY - (ALT+SHIFT+F1)

The Class responsible and the various class instances within the responsible class for a certain part of the Eclipse workbench can be easily recognised using the Eclipse SPY feature.


What exactly do I mean?

Let's consider an example...


Let's say that we want to know about the class and the list of classes instances called or responsible fo rth elaunch tab of "Eclipse Application".


How to see this list?


1)Create any eclipse application( a plug-in project)

2)Now right-click and open 'run configurations../debug configuration.." over this application.This will open the Debug/Run configuration dialog.

3)Now press, "alt+shift+f1". This will open the Eclipse spy dialog as shown in the figure below showing all the responsible classes fo rthe configuration dialog.

Sunday, July 11, 2010

Customizing Eclipse Launch Configurations

http://www.eclipse.org/articles/Article-Launch-Framework/launch.html

Launching is centered around two main entities, LaunchConfigurations and LaunchConfigurationTypes.
  • LaunchConfigurationType/Config-type : is an entity that knows how to launch certain types of launch configurations.
  • Launch configurations / configs : are entities that contain all information necessary to perform a specific launch.

Once a config type is implemented , the launching infrastructure contributed by the Debug core plug-in (org.eclipse.debug.core) creates configs on behalf of the config type, and infrastructure provided by the Debug UI plug-in ( org.eclipse.debug.ui) provides a dialog to manage configs (the 'LaunchConfigurationDialog'), as well as other launching-related UI.

To use the launcher API, plug-in must make some import declarations in its plugin.xml file.

  • If your plug-in declares a config type, it must import org.eclipse.debug.core, and
  • if plug-in declares anything related to launching UI, must import org.eclipse.debug.ui.
  • Note : In this case, the launcher can only be used programmatically from within code, not by a user (see the forthcoming related article "How to Launch Java Applications Programmatically" by Darin Wright).

****************************************************************************

Developing a launcher for Java applets. :

******************************************************************

  1. declaring a config type : as shown in the following snippet of XML from our plug-in's plugin.xml file.

Non-UI declaration

extension point<"org.eclipse.debug.core.launchConfigurationTypes">
launchConfigurationType
name="Diana's Java Applet"
modes="run, debug"

delegate= "org.eclipse.jdt.internal.launching.JavaAppletLaunchConfigurationDelegate"

id="org.eclipse.jdt.launching.dianasjavaApplet">
launchConfigurationType
extension>

  • The most important part of this declaration is the delegate attribute which specifies the fully-qualified name of a class that implements the interface org.eclipse.debug.core.model.ILaunchConfigurationDelegate. The delegate is the brains of the launcher, and implements the launch() method which launches a specified config.
  • The modes attribute specifies one or both of run & debug. Note :When specifying a launch mode in code, you should never use a hard-coded String. Instead, use one of the constants defined in org.eclipse.debug.core.ILaunchManager.
  • if the launch configuration dialog is opened in run mode, but your config type is for debug mode only, then your config type and any associated configs will not appear.
  • Note : if your config type declares both modes, it is your delegate's responsibility in the launch() method to handle both modes.
  • An optional attribute not present in the above declaration is private. This is a boolean attribute that indicates whether the config type should appear in the UI, if there is one. Setting this attribute to true effectively makes your launcher usable for programmatic launching only. The default value, if this attribute is omitted, is false.
  • Another optional attribute not shown above is category.

Result : Including the above snippet in plugin.xml as the first step will enable the type, "Diana's Java Applet" to be visible as one of the Config types in both,



Debug configurations.... & Run Configurations.... as in figure below




******************************************************************
2. declaring a config type icon: For this, include the snippet below in Plugin.xml


UI declaration

extension point="org.eclipse.debug.ui.launchConfigurationTypeImages"
launchConfigurationTypeImage icon="icons/full/ctool16/java_applet.gif"
configTypeID="org.eclipse.jdt.launching.dianajavaApplet"
id="org.eclipse.jdt.debug.ui.launchConfigurationTypeImage.javaApplet"
launchConfigurationTypeImage
extension

  • Note that the id attribute is just a unique identifier,
  • whereas the configTypeID attribute should have the same value as the id attribute for our config type declaration.

Result:


*************************************************************
3. Declaring a tab group : LaunchConfigurationDialog(LCD) provided by the Debug UI plug-in is a central point for creating, managing, deleting and launching configs of any config type. The LCD is broken into two main regions:

  • The config tree shows all configs currently defined in the workspace, grouped by config type.
  • The tabbed folder(list of tabs collectively called as tab groups), lets users edit attributes of the config currently selected in the tree. The contents of this tabbed folder are specified when you declare a tab group. For this, include the snippet below in Plugin.xml :

extension point="org.eclipse.debug.ui.launchConfigurationTabGroups"
launchConfigurationTabGroup
type="org.eclipse.jdt.launching.dianajavaApplet"
class="org.eclipse.jdt.internal.debug.ui.launcher.JavaAppletTabGroup"
id="org.eclipse.jdt.debug.ui.launchConfigurationTabGroup.javaApplet"
launchConfigurationTabGroup
extension

******************************************************************

Now, in order to make a customised Launch configuration, that is... to make a customised launch item in the list of Launch types(Eclipse Application, SWT application, Java Application, Java Applet, etc),

All the above steps would include copy of the JavaApplet Launch item in the Run/Debug configurations.... However, since the delegate included for the ConfigurationType in the extension point is specific for JavaApplet,which is -->"delegate = "org.eclipse.jdt.internal.launching.ui.JavaAppletLaunchConfigurationDelegate""..

This would open the TabGroup specific to JavaApplet Launch. And hence, everytime double-clicked, a Configuration item is added not under your type, but under JavaApplet type. or. the set of tabs opening for TabGroup woul dbe that of Applet Configuration

Now, To open a customised TabGroup, We need to map the "class" attribute of the launchConfigurationTabGroup in the extensions tab to your customised class.

The customised class for Configuration TabGroup should

1) implement AbstractLaunchConfigurationTabGroup.

2)overide Launch() to include the list of default tabs or customised tabs that needs to make up your tab group.

Find below an example code snippet:

---------------------------------------------------------------------------------

package z_launchconfig.TabImplementation;

import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;

import org.eclipse.debug.ui.CommonTab;

import org.eclipse.debug.ui.ILaunchConfigurationDialog;

import org.eclipse.debug.ui.ILaunchConfigurationTab;

/*import org.eclipse.jdt.debug.ui.launchConfigurations.AppletMainTab;import org.eclipse.jdt.debug.ui.launchConfigurations.AppletParametersTab;import org.eclipse.jdt.debug.ui.launchConfigurations.JavaArgumentsTab;import org.eclipse.jdt.debug.ui.launchConfigurations.JavaClasspathTab;import org.eclipse.jdt.debug.ui.launchConfigurations.JavaJRETab;*/

public class MyJavaAppletTabGroupClass extends AbstractLaunchConfigurationTabGroup
{
/** * Constructs a new Java applet tab group. */


public MyJavaAppletTabGroupClass()
{
}

/* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTabGroup#createTabs(org.eclipse.debug.ui.ILaunchConfigurationDialog, java.lang.String) */


public void createTabs(ILaunchConfigurationDialog dialog, String mode)
{
ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] { new CommonTab() };
setTabs(tabs);
}
}

--------------------------------------------------------------------------

In the code above, the line

new CommonTab()

adds the 'common' tab into the Configuration group. And therefore our customised ConfigurationTabGroup would consis of only one Tab as in figure below:

Now, if the line new CommonTab(),

is replaced with many more default tabs as in the code below..

------------------------------------

new CommonTab(),

new AppletMainTab(),

new AppletParametersTab(),

new JavaArgumentsTab(),

new JavaJRETab(),

new JavaClasspathTab(),

------------------------------------


The tabGroup will have more tabs as in figure below.


Now, for a quick summary of the above steps:

1) Create a simple plu-in project, maybe with a pop-upMenu

2) Open the Plugin.xml file of this project and include the following snippet in it.

This would like like the figure below in your extensions tab :

3) Now, the class attribute of the (launchConfigurationTabGroup) extension needs to be implemented as below(you could also refer above for the code) :


4)
Important note : The import statement of this source is not available in the default library of the project. Hence we need to add them.

And hence,
Add,
1)org.eclipse.debug.ui
and all other related plug-in in the dependencies tab of Plugin.xml

The above 4 steps ensures the implementation of customised Run and debug Configurations in your project.

*****************************************************