article de presse - Cap Data Consulting
article de presse - Cap Data Consulting
article de presse - Cap Data Consulting
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