Eclipse – GMF – Making Figures Sensitive To Attributes Of Semantic Elements

TASK:
Change a diagram editor generated by GMF to make its figures sensitive to changes of semantic elements’ attributes’ values. Changes of attributes’ values should be automatically detected and reflected in figures’ look.

SOLUTION:
You have to make a little change in *EditPart class. I’m going to change edit part for the semantic model element named Port, so I will edit my.package.diagram.edit.parts.PortEditPart class.

Add a new method to the PortFigure class, which is PortEditPart‘s inner class:

	public void updateFace() {
		Port port = (Port) ((Node) PortEditPart.this.getModel()).getElement();
 
		// set line width according to number of some children
		int lineWidth = 1;
		if (port.getLogicalUnits().size() > 1) {
			lineWidth = 2;
		}
		this.setLineWidth(lineWidth);
 
		// update tooltip
		String tooltipText;
		if (port.getDescription() != null
				&& port.getDescription().length() > 0) {
			tooltipText = port.getDescription();
		} else {
			tooltipText = port.getName();
		}
		if (getToolTip() == null) {
			setToolTip(new Label(tooltipText));
		} else if (getToolTip() instanceof Label) {
			((Label) getToolTip()).setText(tooltipText);
		}
	}

The updateFace method makes actual changes to the figure’s look. This example implementation sets the line’s width according to the number of Port’s children (port.getLogicalUnits().size()) and sets the tool-tip text to the value of element’s attribute named description.

Then you have to hook up this method in two places: PortFigure‘s constructor to update the look when editor starts and the handleNotificationEvent method to react to live changes.

Change PortFigure‘s constructor to make it use new method.

	/**
	 * @generated NOT
	 */
	public PortFigure() {
		this.setFill(true);
		this.setFillXOR(false);
		this.setOutline(true);
		this.setOutlineXOR(false);
		this.setLineStyle(Graphics.LINE_SOLID);
		//this.setLineWidth(1);
		//this.setForegroundColor(PORTFIGURE_FORE);
		//this.setBackgroundColor(PORTFIGURE_BACK);
		updateFace();
		createContents();
	}

Override handleNotificationEvent(Notification notification) method in PortEditPart.

	@Override
	protected void handleNotificationEvent(Notification notification) {
		if (notification.getNotifier() instanceof Port) {
			getPrimaryShape().updateFace();
		}
		super.handleNotificationEvent(notification);
	}

Without this method you would need to restart editor to reflect element’s changes in figure parameters.

Tested on GMF version 2.0.

Photos from my bike trip through Szczecin wharves

Wylot rury w trakcie wylewania urobku z  pogłębiarki Because of the final of the Tall Ships’ Races 2007 in Szczecin one of the gates to Drobnica Port Szczecin was widely opened and I was able to legally get inside. Drobnica Port is connected with Gryfia Shipyard, and then you can get to Szczecin part of Szczecin-Świnoujście Port from which you can go without much trouble to Ostrów Grabowski. Here is google map (with photos) of the trip and here is the gallery itself.

New Feature On My Home Page: Gallery


Długopisy

The first gallery contains few 3D images, I have created quite long time ago using Blender 3D, a great 3D modeling and rendering tool. Some images were finally rendered by yafray renderer. Example image included. Click on thumbnail to pop-up bigger one. All images can be seen in my local gallery or on flickr.

XEland rewritten from scratch

The old C++/Gnome versionI have decided to reactivate XEland project. XELand is a small program, which generates night landscapes as stereo pairs for cross-eye viewing. Original version was written in C++/Gnome and had continually problems with compilation (due to lots of dependencies). Java version is of course free of such problems. Currently it uses two map generation methods (plus some variations). Generated height maps are seamless and can be saved as PNG images. The program requires only JDK 1.5 or above, and is very easy to use. To take full advantage of XEland you should learn cross-eye viewing. Support for anaglyph is expected soon.