woensdag 11 december 2013

Manage your Eclipse Preferences with the Workspace Mechanic

Summary

Workspace Mechanic is a tool that will manage your Eclipse preferences. I recommend that you start using it. This blog tells you why and how.

What problem does it solve

Every time you start a new workspace in Eclipse, the preferences will be "reset" to their default values. This is extremely frustrating because it takes a lot of time to find all your carefully crafted settings and re-apply them. For example, one of the preferences that came up lately [3] is "Completion overwrites":



Unfortunately, the default is wrong (at least for me). The number of times I have changed this setting are countless. I want to set this preference only once and let a tool manage it for eternity. For every new and existing workspace. Interested? Read on.

Workspace Mechanic

I had heard about Workspace Mechanic before but never gave it much attention until I read this bug posted by Markus Kuppe. Markus wanted to have this tool in the default Eclipse distributions so I figured it was time I gave it a spin. Markus also provided a set of preferences to kickstart the configuration [2]. I like it so much that I'm even writing a blog about it.

First, a tip-of-the-hat to Robert Konigsberg for writing this tool.

What does it do

Workspace Mechanic will monitor your preferences and detect if one or more of these is not according to your.. well.. preferences! 

Workspace Mechanic has a little indicator to tell if your preferences are out of sync. It optionally shows a pop-up that will enable you to set them straight.


You can also double-click the icon and Workspace Mechanic will set the out-of-sync preferences to the prefered state.

Configure Workspace Mechanic

Install Workspace Mechanic from its update site [1]. Then go to the command line and execute the following sequence of commands.

git clone https://github.com/wimjongman/myWorkspaceMechanics.git
cd myWorkspaceMechanics


Now we have a set of sensible preferences that we can start with but we need to copy them to a place where Workspace Mechanic can find them. One of the default places is the mechanic directory in the .eclipse directory in your home directory (replace $home$ with your home directory.)

mkdir $home$/.eclipse/mechanic

Once this directory is created, copy all the epf files from the git repo into that new directory.

cp   *.epf    $home$/.eclipse/mechanic/     // or equivalent for your OS

That's it. Restart your Eclipse switch to a few new workspaces and enjoy this great new tool. If it does not work, please look at its preferences! ;)

Yours truly,

Wim

[1] http://workspacemechanic.eclipselabs.org.codespot.com/git.update/mechanic//
[2] https://github.com/lemmy/myWorkspaceMechanics
[3]
https://bugs.eclipse.org/bugs/show_bug.cgi?id=423767
https://bugs.eclipse.org/bugs/show_bug.cgi?id=423697
https://bugs.eclipse.org/bugs/show_bug.cgi?id=423658
https://bugs.eclipse.org/bugs/show_bug.cgi?id=423642

maandag 5 augustus 2013

A Giant Leap for Eclipse RCP

It is the end of my working day so I thought I give Eclipse Luna a spin in honor of tomorrow's all day test day for Eclipse Luna M1. The reason for my curiosity was Eric Moffatt's answer to my question about the priority of the Eclipse mixed mode model that allows us to use the e4 programming model in the e3 workbench. Sure enough I got a report when Lars was doing housekeeping for bug 356511.

Lars mentioned that Eric had erected a new extension to the "views" extension point call "e4view" so I was eager to try this out. This is what I did.

Taking Luna for a spin

Pick up a copy of Eclipse Luna from the Platform download page. Look for the 4.4 Integration build link, ignore all the red you see, find the build for your platform and click on "(http)" to get the zip.


Then extract the zip and enter that directory to find the Eclipse executable and run it.

Creating the RCP application

With the information from the bug and the mailing list, I asked myself, what is intuitive? My first idea was to create an RCP application with the usual wizards and use the "RCP with a view" template and then extend this application to add an e4 view. This turned out to be exactly how it works.

I took the first step and let Eclipse generate the little RCP application for me. Once the application was generated, I executed it once to see if it worked. As usual, no problems.


Adding an e4 part

The next thing was to look for the new extension in the views extension point and there it was: 


What crossed my mind is that the extension is called "e4view". I could have been called "e4part" since the difference between views and editors is no longer there in e4. 

Another note is that Eric could have re-used the "view" extension since they both share the same structure. One thing that you get for free with that approach is the cross referencing in the manifest editor. More about this later.

Creating the part

I clicked the class* link and the editor started the "create new class" wizard. I just pressed enter because the e4 views do not extend ViewPart. After the editor was opened, I re-activated the manifest editor and added the following dependencies to my bundle.


  • org.eclipse.e4.ui.di
    This contains the @Focus annotation.
  • javax.annotation
    This contains the @PostContruct annotation.
Then I re-actived the java editor and created the following code:

package com.test.plugin.luna;

import javax.annotation.PostConstruct;

import org.eclipse.e4.ui.di.Focus;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;

public class E4view1 {

 private Button button;

 public E4view1() {
 }

 @PostConstruct
 public void createPartControl(Composite parent) {
  GridLayout gridLayout = new GridLayout(1, false);
  gridLayout.marginWidth = 5;
  gridLayout.marginHeight = 5;
  gridLayout.verticalSpacing = 0;
  gridLayout.horizontalSpacing = 0;
  parent.setLayout(gridLayout);

  button = new Button(parent, SWT.PUSH);
  button.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false,
    false));
  button.setText("Push me");
  button.addSelectionListener(new SelectionAdapter() {
   @Override
   public void widgetSelected(SelectionEvent e) {

   }
  });
 }

 @Focus
 public void setFocus() {
  button.setFocus();
 }

}

Adding the e4 view to the perspective

Time to add this nice e4 view to the perspective. But how... I just followed a hunch and added the id of the "e4view" extension to the "perspectiveExtensions" extension point. Referencing the view (by clicking on the "Browse.." button) did not work because of the new name...


Changing the run configuration

I saved all my files, opened the run configuration and added the following directives to the launcher



  • -console
    Should be a default option IMO
  • -clearPersistedState
    This will clear the e4 model and rebuild it freshly from the filesystem. I suspected that my view would not be shown otherwise.

Then I clicked on the "Plug-ins" tab and pressed "Add Required Plug-ins". Subsequently I added all plugins with "gogo" in the name (3) and I added "org.eclipse.equinox.console".

Running the mixed mode application.

Then I pressed "Run" and behold; A truly mixed mode application appeared where my dependency injected view co-existed with a traditional e3 view.



One small step for [a] man but a giant leap for Eclipse RCP

In my opinion this is the most important step in the history of Eclipse 4. This opens the door to start exploring the new programming paradigm for everyone.  This seemingly little change truly is the bridge between old and new and I predict that we are in the rapids. Things could be happening real fast now the platform team has crossed this threshold. Companies can start working on the transformation from old to new, upgrading view by view which will trigger new ideas and changes.


photo by Robert J Moffatt

Why Eclipse 4?

Curious why you should go to Eclipse 4? I have created a blog about this a while ago. You should definitively read it.

Thanks..

Thanks to the platform team for this change and getting up to speed with the mixed mode changes so early in the development cycle of Luna. Great job!


Cheers,

Wim