02.07.2013 Views

article de presse - Cap Data Consulting

article de presse - Cap Data Consulting

article de presse - Cap Data Consulting

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

P ratique<br />

ment la métho<strong>de</strong> dispose mérite d'être appelée. Bien évi<strong>de</strong>mment, ça ne<br />

sera pas le cas pour un objet <strong>de</strong> type Rectangle, alors que ça peut l'être pour<br />

un objet <strong>de</strong> type GC. Dans ce cas, la règle est simple, si l'objet est fourni par<br />

le runtime Eclipse on ne le libère pas, car le runtime va s'en charger lui<br />

même. Si l'objet est instancié par nous, alors nous <strong>de</strong>vons le libérer. A titre<br />

d'illustration <strong>de</strong> ce principe, voici l'implémentation du gestionnaire d'événement<br />

Paint <strong>de</strong> notre vue.<br />

public void paintControl(PaintEvent e) {<br />

Color blue;<br />

Font font;<br />

GC gc = e.gc;<br />

}<br />

gc.setForeground(red);<br />

Rectangle rect =<br />

((Composite)e.widget).getClientArea();<br />

rect.height -= 1;<br />

rect.width -= 1;<br />

gc.drawRectangle(rect);<br />

font = new Font(display,"Times",<br />

24, SWT.ITALIC|SWT.BOLD);<br />

gc.setFont(font);<br />

blue = new Color(display, 0, 0, 255);<br />

gc.setForeground(blue);<br />

Font<strong>Data</strong>[] fd = font.getFont<strong>Data</strong>();<br />

Point pt = gc.textExtent(texte, 0);<br />

gc.drawString(texte, (rect.width - pt.x)/2,<br />

(rect.height - fd[0].height)/2);<br />

blue.dispose();<br />

font.dispose();<br />

Nous voyons que le GC nous est fourni donc pas libéré, tandis que les<br />

polices et couleurs créées par nous sont libérées. Parallèlement, la couleur<br />

rouge obtenue du système (voir extrait <strong>de</strong> co<strong>de</strong> précé<strong>de</strong>nt) n'est pas non<br />

plus libérée. Voici maintenant le co<strong>de</strong> <strong>de</strong> la métho<strong>de</strong> qui <strong>de</strong>ssine le second<br />

texte. Nous y voyons comment obtenir un contexte graphique à la volée,<br />

contexte qui doit être libéré.<br />

public void abonnementProgrammez() {<br />

Font font;<br />

String texte = "Abonnez vous! :-)";<br />

Color green = display.getSystemColor(SWT.COLOR_DARK_GREEN);<br />

Rectangle rect = canvas.getClientArea();<br />

GC gc = new GC(canvas);<br />

font = new Font(display,"Times",<br />

24, SWT.ITALIC|SWT.BOLD);<br />

gc.setFont(font);<br />

gc.setForeground(green);<br />

}<br />

5<br />

Programmez n°85 79 avril 2006<br />

Font<strong>Data</strong>[] fd = font.getFont<strong>Data</strong>();<br />

gc.drawString(texte, rect.x + 10,<br />

rect.height - fd[0].height - 20);<br />

font.dispose();<br />

gc.dispose();<br />

Passer à l’action<br />

Jetons maintenant un coup d'oeil au co<strong>de</strong> <strong>de</strong> la classe ApplicationAction<br />

BarAdvisor. Le Workbench invoque successivement les métho<strong>de</strong>s<br />

makeActions, fillMenuBar et fillCoolBar. Les noms <strong>de</strong>s <strong>de</strong>ux <strong>de</strong>rnières parlent<br />

d'eux mêmes. On remarque dans le co<strong>de</strong>, que <strong>de</strong>s objets <strong>de</strong> type Action sont<br />

insérés dans les <strong>de</strong>ux cas, et que le système gère tous les détails <strong>de</strong> bas<br />

niveau. La première métho<strong>de</strong> instancie les classes <strong>de</strong> type Action, dont le<br />

rôle est <strong>de</strong> diriger <strong>de</strong>s actions possibles <strong>de</strong> l'utilisateur final (touches clavier,<br />

menu, bouton <strong>de</strong> barre) vers le co<strong>de</strong> <strong>de</strong> traitement. L'environnement fournit<br />

<strong>de</strong>s actions standard et il est aussi possible <strong>de</strong> spécialiser une action par<br />

dérivation <strong>de</strong> la classe Action. Ce que nous faisons ici :<br />

public class MyAction extends Action {<br />

private final IWorkbenchWindow window;<br />

public MyAction(IWorkbenchWindow window, String label) {<br />

this.window = window;<br />

setText(label);<br />

setId(ICommandIds.CMD_HINT);<br />

setActionDefinitionId(ICommandIds.CMD_HINT);<br />

setImageDescriptor(getImageDescriptor("/icons/progicon.png"));<br />

}<br />

public void run() {<br />

if(window != null) {<br />

MyView myView;<br />

myView =<br />

(MyView)window.getActivePage().findView(MyView.ID);<br />

myView.abonnementProgrammez();<br />

}<br />

}<br />

public static ImageDescriptor getImageDescriptor(String path) {<br />

ImageDescriptor id =<br />

AbstractUIPlugin.imageDescriptorFromPlugin("monrcp", path);<br />

return id;<br />

}<br />

}<br />

Ce co<strong>de</strong> présente <strong>de</strong> nombreux points intéressants. Nous voyons comment<br />

accé<strong>de</strong>r à une image au moyen org.eclipse.ui.plugin. AbstractUIPlugin, classe<br />

magique dans ce genre <strong>de</strong> situations. Ensuite la métho<strong>de</strong> run, qui<br />

contient le traitement <strong>de</strong> l'action invoque une métho<strong>de</strong> <strong>de</strong> notre vue. Nous<br />

avons besoin d'accé<strong>de</strong>r à celle-ci et le co<strong>de</strong> montre un moyen d'y parvenir.<br />

■ Frédéric Mazué fmazue@programmez.com<br />

Niveau<br />

java facile avancé expert

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!