Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » Eclipse Platform » Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor)
Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor) [message #324609] Tue, 29 January 2008 07:50 Go to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Ed Merks schrieb:
> Mircea,
>
> Gosh, I don't have a lot of experience with this type of thing. I hope
> someone else has some clue, because I won't even know where to begin.
> Maybe Tom will read this and have an idea...
>
>

Tom has read it :-) I'm not really skilled when it comes to all those
key-binding thingies.

But the following could work. If your TextWidget receives focus I'd try
to reset the copy/cut/paste actions to their original counter parts:

widget.addFocusListener( new FocusListener() {
IAction emfcutaction =
actionBars.getGlobalActionHandler(ActionFactory.CUT.getId()) ;
IAction emfcopyaction =
actionBars.getGlobalActionHandler(ActionFactory.COPY.getId() );
IAction emfpasteaction =
actionBars.getGlobalActionHandler(ActionFactory.PASTE.getId( ));

IAction standardCut = ActionFactory.CUT.create(....);
IAction standardCopy = ActionFactory.COPY.create(....);
IAction standardPaste = ActionFactory.PASTE.create(....);

public void focusLost(FocusEvent e) {

actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), emfcutaction);
actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,emfcopyaction);

actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),emfpasteaction);
actionbars.updateActionBars();
}

public void focusGained(FocusEvent e) {
actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), standardCut);
actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,standardCopy);
actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),standardPaste);
actionbars.updateActionBars();
}
});

If this works it would be great if the EditingDomainActionBarContributor
would provide a possibility to restore the actions.

Another possible solution that comes to my mind is usage of the commands
framework. I don't know if COPY/CUT/PASTE are handled by commands (but
Paul knows so I've added eclipse.platform to the CC list :-).

Tom

> M. Luchian wrote:
>> Hello,
>>
>> The EditingDomainActionBarContributor.java class defined in the EMF
>> plugins overrides the Windows CUT/COPY/PASTE actions' keyboard
>> shortcuts (CTRL-X, CTRL-C, CTRL-V) with EMF's own.
>>
>> This is correct as long as the actions are performed on the tree.
>> However, I implemented an editor based on eclipse forms, with text
>> widgets (Windows native) handling the COPY CUT PASTE actions with a
>> right click of a mouse. As the mouse actions work fine and interact
>> with the windows' clipboard, pressing the keyboard shortcuts for the
>> same actions in the text widgets will call the actions reserved by EMF
>> .. This is problematic as the CTRL-X, CTRL-C, CTRL-V shortcuts are
>> overridden with the EMF copy, cut, paste actions for the entire editor.
>>
>> Is there a possible way to register the actions for the editor's tree
>> only? (See picture)
>>
>>
>>
>> I have a CustomEditingDomainActionBarContributor.java replacing a few
>> small things from the original EditingDomainActionBarContributor.java
>> class, but I don't want to manage the registering / unregistering the
>> copy, cut and paste actions when the tree is in focus or not.
>>
>> Any help appreciated
>>
>> Thanks,
>>
>> Mircea
>


--
B e s t S o l u t i o n . at
------------------------------------------------------------ --------
Tom Schindl JFace-Committer
------------------------------------------------------------ --------
Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor) [message #324610 is a reply to message #324609] Tue, 29 January 2008 11:38 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: merks.ca.ibm.com

Tom,

All that command stuff came long after we'd already done the EMF.Edit
support. It's impossible to keep up with the Jone's when there are
dozens of them and only two or three of us. Maybe an Eclipse 4.0 effort
would allow us to throw away some of the cruft and focus on supporting
only the latests and greatest patterns.

I'd be happy to provide hooks for whatever solution works well for this
type of scenario. I hope we can find at least a bit of time this
release to look at how to support forms and exploit data binding. I'm
kind of sick and tired of the limitations of the crummy properties view
(which doesn't even work for RAP).


Tom Schindl wrote:
> Ed Merks schrieb:
>> Mircea,
>>
>> Gosh, I don't have a lot of experience with this type of thing. I
>> hope someone else has some clue, because I won't even know where to
>> begin. Maybe Tom will read this and have an idea...
>>
>>
>
> Tom has read it :-) I'm not really skilled when it comes to all those
> key-binding thingies.
>
> But the following could work. If your TextWidget receives focus I'd
> try to reset the copy/cut/paste actions to their original counter parts:
>
> widget.addFocusListener( new FocusListener() {
> IAction emfcutaction =
> actionBars.getGlobalActionHandler(ActionFactory.CUT.getId()) ;
> IAction emfcopyaction =
> actionBars.getGlobalActionHandler(ActionFactory.COPY.getId() );
> IAction emfpasteaction =
> actionBars.getGlobalActionHandler(ActionFactory.PASTE.getId( ));
>
> IAction standardCut = ActionFactory.CUT.create(....);
> IAction standardCopy = ActionFactory.COPY.create(....);
> IAction standardPaste = ActionFactory.PASTE.create(....);
>
> public void focusLost(FocusEvent e) {
>
> actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), emfcutaction);
>
> actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,emfcopyaction);
>
> actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),emfpasteaction);
>
> actionbars.updateActionBars();
> }
>
> public void focusGained(FocusEvent e) {
> actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), standardCut);
> actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,standardCopy);
>
> actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),standardPaste);
>
> actionbars.updateActionBars();
> }
> });
>
> If this works it would be great if the
> EditingDomainActionBarContributor would provide a possibility to
> restore the actions.
>
> Another possible solution that comes to my mind is usage of the
> commands framework. I don't know if COPY/CUT/PASTE are handled by
> commands (but Paul knows so I've added eclipse.platform to the CC list
> :-).
>
> Tom
>
>> M. Luchian wrote:
>>> Hello,
>>>
>>> The EditingDomainActionBarContributor.java class defined in the EMF
>>> plugins overrides the Windows CUT/COPY/PASTE actions' keyboard
>>> shortcuts (CTRL-X, CTRL-C, CTRL-V) with EMF's own.
>>>
>>> This is correct as long as the actions are performed on the tree.
>>> However, I implemented an editor based on eclipse forms, with text
>>> widgets (Windows native) handling the COPY CUT PASTE actions with a
>>> right click of a mouse. As the mouse actions work fine and interact
>>> with the windows' clipboard, pressing the keyboard shortcuts for the
>>> same actions in the text widgets will call the actions reserved by
>>> EMF .. This is problematic as the CTRL-X, CTRL-C, CTRL-V shortcuts
>>> are overridden with the EMF copy, cut, paste actions for the entire
>>> editor.
>>>
>>> Is there a possible way to register the actions for the editor's
>>> tree only? (See picture)
>>>
>>>
>>>
>>> I have a CustomEditingDomainActionBarContributor.java replacing a
>>> few small things from the original
>>> EditingDomainActionBarContributor.java class, but I don't want to
>>> manage the registering / unregistering the copy, cut and paste
>>> actions when the tree is in focus or not.
>>>
>>> Any help appreciated
>>>
>>> Thanks,
>>>
>>> Mircea
>>
>
>
Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor) [message #324641 is a reply to message #324609] Tue, 29 January 2008 21:06 Go to previous messageGo to next message
Mircea Luchian is currently offline Mircea LuchianFriend
Messages: 89
Registered: July 2009
Member
This is a multi-part message in MIME format.
--------------010508000907040505010103
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hello Tom,

Thank you for the focus listener solution. I added the listeners on
every text widget that accepts a copy, paste, cut command set. The EMF
actions are disabled successfully while the focus is in the text widgets
and enabled when the focus goes out. However, the keyboard shortcuts for
the normal cut, paste, copy actions are not properly initialized.
Pressing CTRL-X, CTRL-C or CTRL-V does nothing while the focus is in one
of these widgets.

Would it be possible that I pass the wrong workbench window to these
three actions? Here is how I initialized them below:

IAction standardCut =
ActionFactory.CUT.create(editor.getEditorSite().getWorkbench Window());
IAction standardCopy =
ActionFactory.COPY.create(editor.getEditorSite().getWorkbenc hWindow());
IAction standardPaste =
ActionFactory.PASTE.create(editor.getEditorSite().getWorkben chWindow());

Thanks,

Mircea


Tom Schindl wrote:
> Ed Merks schrieb:
>> Mircea,
>>
>> Gosh, I don't have a lot of experience with this type of thing. I
>> hope someone else has some clue, because I won't even know where to
>> begin. Maybe Tom will read this and have an idea...
>>
>>
>
> Tom has read it :-) I'm not really skilled when it comes to all those
> key-binding thingies.
>
> But the following could work. If your TextWidget receives focus I'd
> try to reset the copy/cut/paste actions to their original counter parts:
>
> widget.addFocusListener( new FocusListener() {
> IAction emfcutaction =
> actionBars.getGlobalActionHandler(ActionFactory.CUT.getId()) ;
> IAction emfcopyaction =
> actionBars.getGlobalActionHandler(ActionFactory.COPY.getId() );
> IAction emfpasteaction =
> actionBars.getGlobalActionHandler(ActionFactory.PASTE.getId( ));
>
> IAction standardCut = ActionFactory.CUT.create(....);
> IAction standardCopy = ActionFactory.COPY.create(....);
> IAction standardPaste = ActionFactory.PASTE.create(....);
>
> public void focusLost(FocusEvent e) {
>
> actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), emfcutaction);
>
> actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,emfcopyaction);
>
> actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),emfpasteaction);
>
> actionbars.updateActionBars();
> }
>
> public void focusGained(FocusEvent e) {
> actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), standardCut);
> actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,standardCopy);
>
> actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),standardPaste);
>
> actionbars.updateActionBars();
> }
> });
>
> If this works it would be great if the
> EditingDomainActionBarContributor would provide a possibility to
> restore the actions.
>
> Another possible solution that comes to my mind is usage of the
> commands framework. I don't know if COPY/CUT/PASTE are handled by
> commands (but Paul knows so I've added eclipse.platform to the CC list
> :-).
>
> Tom
>
>> M. Luchian wrote:
>>> Hello,
>>>
>>> The EditingDomainActionBarContributor.java class defined in the EMF
>>> plugins overrides the Windows CUT/COPY/PASTE actions' keyboard
>>> shortcuts (CTRL-X, CTRL-C, CTRL-V) with EMF's own.
>>>
>>> This is correct as long as the actions are performed on the tree.
>>> However, I implemented an editor based on eclipse forms, with text
>>> widgets (Windows native) handling the COPY CUT PASTE actions with a
>>> right click of a mouse. As the mouse actions work fine and interact
>>> with the windows' clipboard, pressing the keyboard shortcuts for the
>>> same actions in the text widgets will call the actions reserved by
>>> EMF .. This is problematic as the CTRL-X, CTRL-C, CTRL-V shortcuts
>>> are overridden with the EMF copy, cut, paste actions for the entire
>>> editor.
>>>
>>> Is there a possible way to register the actions for the editor's
>>> tree only? (See picture)
>>>
>>>
>>>
>>> I have a CustomEditingDomainActionBarContributor.java replacing a
>>> few small things from the original
>>> EditingDomainActionBarContributor.java class, but I don't want to
>>> manage the registering / unregistering the copy, cut and paste
>>> actions when the tree is in focus or not.
>>>
>>> Any help appreciated
>>>
>>> Thanks,
>>>
>>> Mircea
>>
>
>


--------------010508000907040505010103
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Hello Tom, <br>
<br>
Thank you for the focus listener solution. I added the listeners on
every text widget that accepts a copy, paste, cut command set. The EMF
actions are disabled successfully while the focus is in the text
widgets and enabled when the focus goes out. However, the keyboard
shortcuts for the normal cut, paste, copy actions are not properly
initialized. Pressing CTRL-X, CTRL-C or CTRL-V does nothing while the
focus is in one of these widgets.<br>
<br>
Would it be possible that I pass the wrong workbench window to these
three actions? Here is how I initialized them below: <br>
<br>
<font face="Courier New, Courier, monospace">&nbsp;&nbsp;&nbsp; IAction standardCut =
ActionFactory.CUT.create(editor.getEditorSite().getWorkbench Window());
<br>
&nbsp;&nbsp;&nbsp; IAction standardCopy =
ActionFactory.COPY.create(editor.getEditorSite().getWorkbenc hWindow());
<br>
&nbsp;&nbsp;&nbsp; IAction standardPaste =
ActionFactory.PASTE.create(editor.getEditorSite().getWorkben chWindow());
</font><br>
<br>
Thanks, <br>
<br>
Mircea<br>
<br>
<br>
Tom Schindl wrote:
<blockquote cite="midfnmlsf$nbi$1@build.eclipse.org" type="cite">Ed
Merks schrieb:
<br>
<blockquote type="cite">Mircea,
<br>
<br>
Gosh, I don't have a lot of experience with this type of thing.&nbsp;&nbsp; I
hope someone else has some clue, because I won't even know where to
begin.&nbsp; Maybe Tom will read this and have an idea...
<br>
<br>
<br>
</blockquote>
<br>
Tom has read it :-) I'm not really skilled when it comes to all those
key-binding thingies.
<br>
<br>
But the following could work. If your TextWidget receives focus I'd try
to reset the copy/cut/paste actions to their original counter parts:
<br>
<br>
widget.addFocusListener( new FocusListener() {
<br>
&nbsp;&nbsp;&nbsp; IAction emfcutaction =
actionBars.getGlobalActionHandler(ActionFactory.CUT.getId()) ;
<br>
&nbsp;&nbsp;&nbsp; IAction emfcopyaction =
actionBars.getGlobalActionHandler(ActionFactory.COPY.getId() );
<br>
&nbsp;&nbsp;&nbsp; IAction emfpasteaction =
actionBars.getGlobalActionHandler(ActionFactory.PASTE.getId( ));
<br>
<br>
&nbsp;&nbsp;&nbsp; IAction standardCut = ActionFactory.CUT.create(....);
<br>
&nbsp;&nbsp;&nbsp; IAction standardCopy = ActionFactory.COPY.create(....);
<br>
&nbsp;&nbsp;&nbsp; IAction standardPaste = ActionFactory.PASTE.create(....);
<br>
<br>
&nbsp;&nbsp;&nbsp; public void focusLost(FocusEvent e) {
<br>
<br>
actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), emfcutaction);
<br>
actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,emfcopyaction);
<br>
actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),emfpasteaction);
<br>
actionbars.updateActionBars();
<br>
&nbsp;&nbsp;&nbsp; }
<br>
<br>
&nbsp;&nbsp;&nbsp; public void focusGained(FocusEvent e) {
<br>
actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), standardCut);
<br>
actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,standardCopy);
<br>
actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),standardPaste);
<br>
actionbars.updateActionBars();
<br>
&nbsp;&nbsp;&nbsp; }
<br>
});
<br>
<br>
If this works it would be great if the
EditingDomainActionBarContributor would provide a possibility to
restore the actions.
<br>
<br>
Another possible solution that comes to my mind is usage of the
commands framework. I don't know if COPY/CUT/PASTE are handled by
commands (but Paul knows so I've added eclipse.platform to the CC list
:-).
<br>
<br>
Tom
<br>
<br>
<blockquote type="cite">M. Luchian wrote:
<br>
<blockquote type="cite">Hello,
<br>
<br>
The EditingDomainActionBarContributor.java class defined in the EMF
plugins overrides the Windows CUT/COPY/PASTE actions' keyboard
shortcuts (CTRL-X, CTRL-C, CTRL-V) with EMF's own.
<br>
<br>
This is correct as long as the actions are performed on the tree.
However, I implemented an editor based on eclipse forms, with text
widgets (Windows native) handling the COPY CUT PASTE actions with a
right click of a mouse. As the mouse actions work fine and interact
with the windows' clipboard, pressing the keyboard shortcuts for the
same actions in the text widgets will call the actions reserved by EMF
... This is problematic as the CTRL-X, CTRL-C, CTRL-V shortcuts are
overridden with the EMF copy, cut, paste actions for the entire editor.
<br>
<br>
Is there a possible way to register the actions for the editor's tree
only? (See picture)
<br>
<br>
<br>
<br>
I have a CustomEditingDomainActionBarContributor.java replacing a few
small things from the original EditingDomainActionBarContributor.java
class, but I don't want to manage the registering / unregistering the
copy, cut and paste actions when the tree is in focus or not.
<br>
<br>
Any help appreciated
<br>
<br>
Thanks,
<br>
<br>
Mircea </blockquote>
<br>
</blockquote>
<br>
<br>
</blockquote>
<br>
</body>
</html>

--------------010508000907040505010103--
Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor) [message #324644 is a reply to message #324641] Tue, 29 January 2008 21:39 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Mircea Luchian schrieb:
> Hello Tom,
>
> Thank you for the focus listener solution. I added the listeners on
> every text widget that accepts a copy, paste, cut command set. The EMF
> actions are disabled successfully while the focus is in the text widgets
> and enabled when the focus goes out. However, the keyboard shortcuts for
> the normal cut, paste, copy actions are not properly initialized.
> Pressing CTRL-X, CTRL-C or CTRL-V does nothing while the focus is in one
> of these widgets.
>
> Would it be possible that I pass the wrong workbench window to these
> three actions? Here is how I initialized them below:
>
> IAction standardCut =
> ActionFactory.CUT.create(editor.getEditorSite().getWorkbench Window());
> IAction standardCopy =
> ActionFactory.COPY.create(editor.getEditorSite().getWorkbenc hWindow());
> IAction standardPaste =
> ActionFactory.PASTE.create(editor.getEditorSite().getWorkben chWindow());
>

This might not be 100% correct, those WorkbenchWindow-Actions are
special ones because they are retargetabe. Maybe it is a enough to set
your own anonmyous instance.

As said those are only guesses, I've never worked with those actions
myself :-(

Tom

--
B e s t S o l u t i o n . at
------------------------------------------------------------ --------
Tom Schindl JFace-Committer
------------------------------------------------------------ --------
Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor) [message #324667 is a reply to message #324641] Wed, 30 January 2008 14:41 Go to previous messageGo to next message
Paul Webster is currently offline Paul WebsterFriend
Messages: 6859
Registered: July 2009
Location: Ottawa
Senior Member

Mircea Luchian wrote:
>
> Would it be possible that I pass the wrong workbench window to these
> three actions? Here is how I initialized them below:
>
> IAction standardCut =
> ActionFactory.CUT.create(editor.getEditorSite().getWorkbench Window());
> IAction standardCopy =
> ActionFactory.COPY.create(editor.getEditorSite().getWorkbenc hWindow());
> IAction standardPaste =
> ActionFactory.PASTE.create(editor.getEditorSite().getWorkben chWindow());

As Tom mentioned, the ActionFactory actions are retargetable (and not
even that in 3.4). They don't do anything, they just delegate execution
to something else.

If you need to have "copy" work as *either* normal copy in the current
text control *or* run your copy action to deal with something in the
part (a graphical object, for example) you can use
org.eclipse.ui.actions.TextActionHandler

PW


--
Paul Webster
http://wiki.eclipse.org/Platform_Command_Framework
http://wiki.eclipse.org/Command_Core_Expressions
http://wiki.eclipse.org/Menu_Contributions
http://wiki.eclipse.org/Menus_Extension_Mapping
http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse. platform.doc.isv/guide/workbench.htm


Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor) [message #324679 is a reply to message #324610] Wed, 30 January 2008 16:16 Go to previous messageGo to next message
Mircea Luchian is currently offline Mircea LuchianFriend
Messages: 89
Registered: July 2009
Member
This is a multi-part message in MIME format.
--------------060600010109030808000101
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hello Ed,

I agree with your point on the properties view. It's purpose is
justified for requirements not needing GUI validation, however, to
implement on the spot GUI validation, the Properties view is not
sufficient. For this reason, I believe an effort in 4.0 should be
reserved towards the adjustment of the JET templates to generate an EMF
editor using eclipse forms.

Here are the main changes I made. I feel that some of them could be
improvements made for 4.0 whenever possible.

* I created a composite panel for every node in the tree. I modified
the ObjectDetailsPage and removed the SampleSection inner class. I
replaced it with a DetailsSection class responsible to create the
panels and update them in function of the "Object input" variable

private void detailsPageSwitch(final Object input)
{
sampleSectionHolder = new DetailSection(toolkit, input,
adapterFactoryItemDelegator, adapterFactoryLabelProvider,
mform.getMessageManager(), this);
ScrolledPropertiesBlock.setDetailsPage(this);
sampleSectionHolder.createSection(input);
}

public void update()
{

detailsSection.setText(adapterFactoryItemDelegator.getText(i nput));
detailsSection.layout();
ScrolledPropertiesBlock.setDetailsPage(this);
sampleSectionHolder.updateSection(input);
}

With the detailsPageSwitch(), I pass the message manager of the
managed form (mform) SrolledPropertiesBlock class to every panel.
As such, the panels now have control on the message manager and
can add / remove errors depending whether the user types in a
widget or switches from the one node to another.
_
_

* There is one "problem" with radio buttons (A = "true" and B =
"false" initially) attached to boolean attributes in EMF.

and

As radio buttons are mutually exclusive, setting B, unsets A
automatically. This will register as two actions in the EMF's
command stack (B = "true", then A = "false"). If the user presses
undo once, the B radio button will be "false" leaving A radio
button "false" as well. The user must execute a second undo
action to revert to the initial state.

To prevent this from happening, I had to "hack" the
EditingDomainActionBarContributor class located in
org.eclipse.emf.edit.ui.action so I can call cutom Undo and Redo
actions.

I created the following and put all custom code in my plugin:

public class CustomEditingDomainActionBarContributor extends
MultiPageEditorActionBarContributor implements IMenuListener,
IPropertyListener {
[....]

protected CustomUndoAction customUndoAction;

protected CustomRedoAction customRedoAction;
[....]
}

Custom Undo/Redo actions call themselves recursively if they
detect that variables reserved for a group of mutually exclusive
radio buttons are all set to false

public class CustomRedoAction extends RedoAction {

@Override
public void run()
{
super.run();
MyEditor.updateFromRedoUndo();

Command mostRecentCommand =
domain.getCommandStack().getMostRecentCommand();

if (mostRecentCommand instanceof SetCommand)
{
SetCommand mostRecentSetCommand = (SetCommand)
mostRecentCommand;
EObject owner = mostRecentSetCommand.getOwner();


/*********************************************************** ************************************************
* MyNodeImpl OWNER

************************************************************ **********************************************/
if (owner instanceof MyNodeImpl)
{
if (!((MyNodeImpl) owner).isReadOnly() &&
!((MyNodeImpl) owner).isReadWrite() && !((MyNodeImpl)
owner).isWriteOnly())
run(); // RUN AGAIN TO SET THE RADIO BUTTON
THAT WAS DESELECTED
[....]
_



_
* The eclipse forms panels (with every widget bound to the model)
was not updated during an Undo or Redo action. I added both
actions a MyEditor.updateFromRedoUndo(); statement that calls the
editor to refresh the current selected panel in the Scrolled
properties block:

public static void updateFromRedoUndo()
{
try
{
if
(scrolledPropertiesBlock.treeViewer.getTree().getSelection() .length
!= 0)
{
scrolledPropertiesBlock.getObjectDetailsPage().update();
}
}
catch (Exception e)
{
}
}_
_
This update mechanism for the eclipse forms does not exist on the
EMF example found on the net.
_
_
_

_
* I added error and warning status variables for every node in the
model. This is really custom work, however with the usage of the
eclispe forms' message manager, this complements very well the
user experience.
Data can have errors or warnings in the panels, so I changed the
item providers for every node to display the icons in an
error/warning state. Whenever we use validation on such panels,
the nodes in the tree must reflect these same error states for
later correction (say the errors exist but the user chooses to
save/closes his file and chooses fix the errors later during the
day; he must then know where the errors are...).

I also made the parent nodes aware if their children have errors
or warnings so they can be propagated to the root node. This makes
the errors easier to search if the nodes are collapsed. How the
error/warning flags are initialized on the faulty node is custom
implementation, however, the error propagation to the parent nodes
is performed in the model's implementation classes. Only the
latter mechanism could be accomodated in a future version of EMF.
See pictures below for a better understanding. I had to hide some
information as the product is still under development.

1.
2.
3.
4.
5.
6.No more errors / warnings in the tree

Thanks,

Mircea





Ed Merks wrote:
> Tom,
>
> All that command stuff came long after we'd already done the EMF.Edit
> support. It's impossible to keep up with the Jone's when there are
> dozens of them and only two or three of us. Maybe an Eclipse 4.0
> effort would allow us to throw away some of the cruft and focus on
> supporting only the latests and greatest patterns.
>
> I'd be happy to provide hooks for whatever solution works well for
> this type of scenario. I hope we can find at least a bit of time this
> release to look at how to support forms and exploit data binding. I'm
> kind of sick and tired of the limitations of the crummy properties
> view (which doesn't even work for RAP).
>
>
> Tom Schindl wrote:
>> Ed Merks schrieb:
>>> Mircea,
>>>
>>> Gosh, I don't have a lot of experience with this type of thing. I
>>> hope someone else has some clue, because I won't even know where to
>>> begin. Maybe Tom will read this and have an idea...
>>>
>>>
>>
>> Tom has read it :-) I'm not really skilled when it comes to all those
>> key-binding thingies.
>>
>> But the following could work. If your TextWidget receives focus I'd
>> try to reset the copy/cut/paste actions to their original counter parts:
>>
>> widget.addFocusListener( new FocusListener() {
>> IAction emfcutaction =
>> actionBars.getGlobalActionHandler(ActionFactory.CUT.getId()) ;
>> IAction emfcopyaction =
>> actionBars.getGlobalActionHandler(ActionFactory.COPY.getId() );
>> IAction emfpasteaction =
>> actionBars.getGlobalActionHandler(ActionFactory.PASTE.getId( ));
>>
>> IAction standardCut = ActionFactory.CUT.create(....);
>> IAction standardCopy = ActionFactory.COPY.create(....);
>> IAction standardPaste = ActionFactory.PASTE.create(....);
>>
>> public void focusLost(FocusEvent e) {
>>
>> actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), emfcutaction);
>>
>> actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,emfcopyaction);
>>
>> actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),emfpasteaction);
>>
>> actionbars.updateActionBars();
>> }
>>
>> public void focusGained(FocusEvent e) {
>> actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), standardCut);
>>
>> actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,standardCopy);
>>
>> actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),standardPaste);
>>
>> actionbars.updateActionBars();
>> }
>> });
>>
>> If this works it would be great if the
>> EditingDomainActionBarContributor would provide a possibility to
>> restore the actions.
>>
>> Another possible solution that comes to my mind is usage of the
>> commands framework. I don't know if COPY/CUT/PASTE are handled by
>> commands (but Paul knows so I've added eclipse.platform to the CC
>> list :-).
>>
>> Tom
>>
>>> M. Luchian wrote:
>>>> Hello,
>>>>
>>>> The EditingDomainActionBarContributor.java class defined in the EMF
>>>> plugins overrides the Windows CUT/COPY/PASTE actions' keyboard
>>>> shortcuts (CTRL-X, CTRL-C, CTRL-V) with EMF's own.
>>>>
>>>> This is correct as long as the actions are performed on the tree.
>>>> However, I implemented an editor based on eclipse forms, with text
>>>> widgets (Windows native) handling the COPY CUT PASTE actions with a
>>>> right click of a mouse. As the mouse actions work fine and interact
>>>> with the windows' clipboard, pressing the keyboard shortcuts for
>>>> the same actions in the text widgets will call the actions reserved
>>>> by EMF .. This is problematic as the CTRL-X, CTRL-C, CTRL-V
>>>> shortcuts are overridden with the EMF copy, cut, paste actions for
>>>> the entire editor.
>>>>
>>>> Is there a possible way to register the actions for the editor's
>>>> tree only? (See picture)
>>>>
>>>>
>>>>
>>>> I have a CustomEditingDomainActionBarContributor.java replacing a
>>>> few small things from the original
>>>> EditingDomainActionBarContributor.java class, but I don't want to
>>>> manage the registering / unregistering the copy, cut and paste
>>>> actions when the tree is in focus or not.
>>>>
>>>> Any help appreciated
>>>>
>>>> Thanks,
>>>>
>>>> Mircea
>>>
>>
>>


--------------060600010109030808000101
Content-Type: multipart/related;
boundary="------------090307060804040709080604"


--------------090307060804040709080604
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Hello Ed, <br>
<br>
I agree with your point on the properties view. It's purpose is
justified for requirements not needing GUI validation, however, to
implement on the spot GUI validation, the Properties view is not
sufficient. For this reason, I believe an effort in 4.0 should be
reserved towards the adjustment of the JET templates to generate an EMF
editor using eclipse forms. <br>
<br>
Here are the main changes I made. I feel that some of them could be
improvements made for 4.0 whenever possible.<br>
<br>
<ul>
<li>I created a composite panel for every node in the tree. I
modified the ObjectDetailsPage and removed the SampleSection inner
class. I replaced it with a DetailsSection class responsible to create
the panels and update them in function of the "Object input" variable<br>
<br>
<font face="Courier New">private void detailsPageSwitch(final
Object input)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp; sampleSectionHolder = new DetailSection(toolkit, input,
adapterFactoryItemDelegator, adapterFactoryLabelProvider,
mform.getMessageManager(), this);<br>
&nbsp;&nbsp;&nbsp;&nbsp; ScrolledPropertiesBlock.setDetailsPage(this);<br>
&nbsp;&nbsp;&nbsp;&nbsp; sampleSectionHolder.createSection(input);<br>
}<br>
<br>
public void update()<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp; detailsSection.setText(adapterFactoryItemDelegator.getText(i nput)); <br>
&nbsp;&nbsp;&nbsp;&nbsp; detailsSection.layout();<br>
&nbsp;&nbsp;&nbsp;&nbsp; ScrolledPropertiesBlock.setDetailsPage(this);<br>
&nbsp;&nbsp;&nbsp;&nbsp; sampleSectionHolder.updateSection(input);<br>
}<br>
<br>
</font>With the detailsPageSwitch(), I pass the message manager of
the managed form (mform) SrolledPropertiesBlock class to every panel.
As such, the panels now have control on the message manager and can add
/ remove errors depending whether the user types in a widget or
switches from the one node to another. <br>
<u> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
</u><br>
</li>
</ul>
<ul>
<li>There is one "problem" with radio buttons (A = "true" and B =
"false" initially) attached to boolean attributes in EMF.<br>
<br>
<img src="cid:part1.09000005.08090205@matrox.com" alt=""> and <img
src="cid:part2.06000707.00060204@matrox.com" alt=""><br>
<br>
As radio buttons are mutually exclusive, setting B, unsets A
automatically. This will register as two actions in the EMF's command
stack (B = "true", then A = "false"). If the user presses undo once,
the B radio button will be "false"&nbsp; leaving&nbsp; A radio button "false" as
well.&nbsp; The user must execute a second undo action to revert to the
initial state. <br>
<br>
To prevent this from happening, I had to "hack" the <font
face="Courier New, Courier, monospace">EditingDomainActionBarContributor</font>
class located in <font face="Courier New, Courier, monospace">org.eclipse.emf.edit.ui.action</font>&nbsp;
so I can call cutom Undo and Redo actions. <br>
<br>
I created the following and put all custom code in my plugin:<br>
<br>
<font face="Courier New, Courier, monospace">public class
CustomEditingDomainActionBarContributor extends
MultiPageEditorActionBarContributor implements IMenuListener,
IPropertyListener {<br>
[....]<br>
<br>
&nbsp;&nbsp;&nbsp; protected CustomUndoAction customUndoAction;<br>
<br>
&nbsp;&nbsp;&nbsp; protected CustomRedoAction customRedoAction;<br>
[....]<br>
}<br>
<br>
</font>Custom Undo/Redo actions call themselves recursively if they
detect that variables reserved for a group of mutually exclusive radio
buttons are all set to false<br>
<font face="Courier New, Courier, monospace"><br>
public class CustomRedoAction extends RedoAction {<br>
<br>
&nbsp;&nbsp;&nbsp; @Override<br>
&nbsp;&nbsp;&nbsp; public void run()<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; super.run();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MyEditor.updateFromRedoUndo();<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Command mostRecentCommand =
domain.getCommandStack().getMostRecentCommand();<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (mostRecentCommand instanceof SetCommand)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SetCommand mostRecentSetCommand = (SetCommand)
mostRecentCommand;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; EObject owner = mostRecentSetCommand.getOwner();<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
/*********************************************************** ************************************************ <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* </font><font face="Courier New, Courier, monospace">MyNodeImpl
</font><font face="Courier New, Courier, monospace">OWNER<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;************************************************** ********************************************************/ <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (owner instanceof MyNodeImpl)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!((</font><font
face="Courier New, Courier, monospace">MyNodeImpl</font><font
face="Courier New, Courier, monospace">) owner).isReadOnly()
&amp;&amp; !((</font><font face="Courier New, Courier, monospace">MyNodeImpl</font><font
face="Courier New, Courier, monospace">) owner).isReadWrite()
&amp;&amp; !((</font><font face="Courier New, Courier, monospace">MyNodeImpl</font><font
face="Courier New, Courier, monospace">) owner).isWriteOnly())<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; run(); // RUN AGAIN TO SET THE RADIO BUTTON THAT
WAS DESELECTED<br>
[....]<br>
</font><u> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
<br>
<br>
<br>
</u></li>
<li>The eclipse forms panels (with every widget bound to the model)
was not updated during an Undo or Redo action. I added both actions a&nbsp; <font
face="Courier New, Courier, monospace">MyEditor.updateFromRedoUndo();</font>
statement that calls the editor to refresh the current selected panel
in the Scrolled properties block: <br>
<br>
<font face="Courier New, Courier, monospace">public static void
updateFromRedoUndo()<br>
{<br>
&nbsp;&nbsp;&nbsp; try<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if
(scrolledPropertiesBlock.treeViewer.getTree().getSelection() .length !=
0)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; scrolledPropertiesBlock.getObjectDetailsPage().update();<br >
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; catch (Exception e)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; }<br>
}</font><u><br>
</u><br>
This update mechanism for the eclipse forms does not exist on the EMF
example found on the net.<br>
<u> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;
</u><br>
<u> <br>
<br>
</u></li>
<li>I added error and warning status variables for every node in the
model. This is really custom work, however with the usage of the
eclispe forms' message manager, this complements very well the user
experience. <br>
Data can have errors or warnings in the panels, so I changed the item
providers for every node to display the icons in an error/warning
state. Whenever we use validation on such panels, the nodes in the tree
must reflect these same error states for later correction (say the
errors exist but the user chooses to save/closes his file and chooses
fix the errors later during the day; he must then know where the errors
are...).<br>
<br>
I also made the parent nodes aware if their children have errors or
warnings so they can be propagated to the root node. This makes the
errors easier to search if the nodes are collapsed. How the
error/warning flags are initialized on the faulty node is custom
implementation, however, the error propagation to the parent nodes is
performed in the model's implementation classes. Only the latter
mechanism could be accomodated in a future version of EMF. See pictures
below for a better understanding. I had to hide some information as the
product is still under development. <br>
<br>
1.<img src="cid:part3.07080308.06040607@matrox.com" alt=""> <br>
2.<img src="cid:part4.07050408.08000008@matrox.com" alt=""><br>
3.<img src="cid:part5.05000702.01070906@matrox.com" alt=""><br>
4.<img src="cid:part6.03040502.04020901@matrox.com" alt=""><br>
5.<img src="cid:part7.02090802.09010406@matrox.com" alt=""><br>
6.<img src="cid:part8.00080607.00060408@matrox.com" alt="">No more
errors / warnings in the tree<br>
<br>
</li>
</ul>
Thanks, <br>
<br>
Mircea<br>
<br>
<br>
<br>
<br>
<br>
Ed Merks wrote:
<blockquote cite="midfnn379$99b$1@build.eclipse.org" type="cite">Tom,
<br>
<br>
All that command stuff came long after we'd already done the EMF.Edit
support.&nbsp; It's impossible to keep up with the Jone's when there are
dozens of them and only two or three of us.&nbsp; Maybe an Eclipse 4.0
effort would allow us to throw away some of the cruft and focus on
supporting only the latests and greatest patterns.
<br>
<br>
I'd be happy to provide hooks for whatever solution works well for this
type of scenario.&nbsp; I hope we can find at least a bit of time this
release to look at how to support forms and exploit data binding.&nbsp; I'm
kind of sick and tired of the limitations of the crummy properties view
(which doesn't even work for RAP).
<br>
<br>
<br>
Tom Schindl wrote:
<br>
<blockquote type="cite">Ed Merks schrieb:
<br>
<blockquote type="cite">Mircea,
<br>
<br>
Gosh, I don't have a lot of experience with this type of thing.&nbsp;&nbsp; I
hope someone else has some clue, because I won't even know where to
begin.&nbsp; Maybe Tom will read this and have an idea...
<br>
<br>
<br>
</blockquote>
<br>
Tom has read it :-) I'm not really skilled when it comes to all those
key-binding thingies.
<br>
<br>
But the following could work. If your TextWidget receives focus I'd try
to reset the copy/cut/paste actions to their original counter parts:
<br>
<br>
widget.addFocusListener( new FocusListener() {
<br>
&nbsp;&nbsp;&nbsp; IAction emfcutaction =
actionBars.getGlobalActionHandler(ActionFactory.CUT.getId()) ;
<br>
&nbsp;&nbsp;&nbsp; IAction emfcopyaction =
actionBars.getGlobalActionHandler(ActionFactory.COPY.getId() );
<br>
&nbsp;&nbsp;&nbsp; IAction emfpasteaction =
actionBars.getGlobalActionHandler(ActionFactory.PASTE.getId( ));
<br>
<br>
&nbsp;&nbsp;&nbsp; IAction standardCut = ActionFactory.CUT.create(....);
<br>
&nbsp;&nbsp;&nbsp; IAction standardCopy = ActionFactory.COPY.create(....);
<br>
&nbsp;&nbsp;&nbsp; IAction standardPaste = ActionFactory.PASTE.create(....);
<br>
<br>
&nbsp;&nbsp;&nbsp; public void focusLost(FocusEvent e) {
<br>
<br>
actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), emfcutaction);
<br>
actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,emfcopyaction);
<br>
actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),emfpasteaction);
<br>
actionbars.updateActionBars();
<br>
&nbsp;&nbsp;&nbsp; }
<br>
<br>
&nbsp;&nbsp;&nbsp; public void focusGained(FocusEvent e) {
<br>
actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), standardCut);
<br>
actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,standardCopy);
<br>
actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),standardPaste);
<br>
actionbars.updateActionBars();
<br>
&nbsp;&nbsp;&nbsp; }
<br>
});
<br>
<br>
If this works it would be great if the
EditingDomainActionBarContributor would provide a possibility to
restore the actions.
<br>
<br>
Another possible solution that comes to my mind is usage of the
commands framework. I don't know if COPY/CUT/PASTE are handled by
commands (but Paul knows so I've added eclipse.platform to the CC list
:-).
<br>
<br>
Tom
<br>
<br>
<blockquote type="cite">M. Luchian wrote:
<br>
<blockquote type="cite">Hello,
<br>
<br>
The EditingDomainActionBarContributor.java class defined in the EMF
plugins overrides the Windows CUT/COPY/PASTE actions' keyboard
shortcuts (CTRL-X, CTRL-C, CTRL-V) with EMF's own.
<br>
<br>
This is correct as long as the actions are performed on the tree.
However, I implemented an editor based on eclipse forms, with text
widgets (Windows native) handling the COPY CUT PASTE actions with a
right click of a mouse. As the mouse actions work fine and interact
with the windows' clipboard, pressing the keyboard shortcuts for the
same actions in the text widgets will call the actions reserved by EMF
... This is problematic as the CTRL-X, CTRL-C, CTRL-V shortcuts are
overridden with the EMF copy, cut, paste actions for the entire editor.
<br>
<br>
Is there a possible way to register the actions for the editor's tree
only? (See picture)
<br>
<br>
<br>
<br>
I have a CustomEditingDomainActionBarContributor.java replacing a few
small things from the original EditingDomainActionBarContributor.java
class, but I don't want to manage the registering / unregistering the
copy, cut and paste actions when the tree is in focus or not.
<br>
<br>
Any help appreciated
<br>
<br>
Thanks,
<br>
<br>
Mircea </blockquote>
<br>
</blockquote>
<br>
<br>
</blockquote>
</blockquote>
<br>
</body>
</html>

--------------090307060804040709080604
Content-Type: image/jpeg;
name="moz-screenshot-4.jpg"
Content-Transfer-Encoding: base64
Content-ID: <part1.09000005.08090205@matrox.com>
Content-Disposition: inline;
filename="moz-screenshot-4.jpg"

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRof
Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwL DBgNDRgyIRwh
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjL/wAAR
CAEWANwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1Cw0O0urKOZ94Zs5C4x1I 9KSTTdDikaOS
+jR1OCrTICPwxWno/wDyCof+Bf8AoRrCudY1Kzd4LLVtNtFWSXdFdWLzPuMr nO4TJgEEcY98
88b1JtTl6mUYrlRox6Bp0sayRyO6NyGVlIP44rK1SGy00nFld3IWGWdzE8Y2 Rx7Q7Hdj+8OB
k10Gjyebpwl6+ZLK4PqDIxz+tYPiiG1f+zXujYoq3si+bexB41BjlOCCRwSF 7jkD0p05Nysx
SStdF06JaqCzI+0cnDjOP++as/8ACN2PrL+a/wCFcx4fuZ59cvC+qLdxtFcM PLeco/7xcFVc
bAFHy/Kx69T1rW8Z2f286Nb/ANmWGp7rxj9lv22xNiGTqdj8jt8v5UVXKDsV CKZo/wDCN2Pr
L+a/4Uf8I3Y+sv5r/hWvRWXtJFciMj/hG7H1l/Nf8KP+EbsfWX81/wAK16KP aSDkRkf8I3Y+
sv5r/hR/wjdj6y/mv+Fa9FHtJByIyP8AhG7H1l/Nf8KP+EbsfWX81/wrXoo9 pIORGR/wjdj6
y/mv+FH/AAjdj6y/mv8AhWvRR7SQciMj/hG7H1l/Nf8ACj/hG7H1l/Nf8K16 KPaSDkRkf8I3
Y+sv5r/hR/wjdj6y/mv+Fa9FHtJByIyP+EbsfWX81/wo/wCEbsfWX81/wrXo o9pIORGR/wAI
3Y+sv5r/AIUf8I3Y+sv5r/hWvRR7SQciMj/hG7H1l/Nf8KP+EbsfWX81/wAK 16KPaSDkRkf8
I3Y+sv5r/hR/wjdj6y/mv+Fa9FHtJByIo6P/AMgqH/gX/oRq9VHR/wDkFQ/8 C/8AQjV6nV/i
S9WEPhQVCbcFiRI6gnOBj+oqasbWnMc8RW0s7txDIUhvJCkRbfHyWCPggFsf KfTjOahDYWPh
6wtrp7+NJluJ1YyZlYj5yGYAHpkjsB+FaskojIG0sT0ArB0i4ml1FN+nabZS +VJmOxmMiMu6
PBLGNDkZbjH488S+JXuF0G+ZY4vMFpLwZCBjaNxzt6jnAxzgdM8Wm5yV2CXQ 1BexmVogrGRV
DMgZcgHIBIz0OD+RqaOQSKSAQQcEHtXiU4lSS8P2azAWBCCr8jryOOteyW7S fZJWlVUlxllR
iwVtozg4GR74FXXpKlG9zapS5Gtb3LlFcj4DkL2H7y01mGd7a3lkk1G8a4WY sG+aPMjhRkHI
G08jI6V11YtWdjIKKKKQBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAUdH/5BUP/
AAL/ANCNXqo6P/yCof8AgX/oRq9WlX+JL1ZMPhQVFPa29yALiCKUDkCRA2Pz qWisyiCCztbZ
i1vbQxEjBMaBc/lS3FuLhdrbSCpUq67gQeoIqaqupSPFpd3JGxV0hdlI7EKa abuJ2SMtPDGk
LeOy6bp4k2Jn/RlwBlsYXPB684545OONlIxGj72BzyxIwOn/ANaucvdRETXU MejazD5aybL2
S/RosqDtbaJy5BwMAp3GQOa6CeRjBKPKcDaw3EjHQ+/sPzHvinJy3YXfUqnV 9IscWpure38p
QoiOE2DHAx2GMUSzRazaGPT9Wltzux9otBGzAjkr86Mv6Zqlb3y2+oamh1Kx tT9oU7LgZY/u
o+fvjj8O1SaVMLi+vZBPDODeD95D9w/uE6cn+dc8ZylNxa7lbI1LO2+yWkcB nmnKDmWZtzue
5PQdewAA6AAcVPXK311qr+NUtbd9WNlFFA7rZi08obncMZTL+8xhR/q+cA45 xXVVruK1tAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAKOj/APIKh/4F/wChGr1U dH/5BUP/AAL/
ANCNXq0q/wASXqyYfCgooorMoKbJGksTxyKGRwVYHuD1p1FAGX/YWnmZg0Uj DAOGlkIPXqS2
D9P8a0pE8yJ0zjcCM0xR/pUhx1RRnHu3fH9T9B3louwsY32TV7W5upbW5slj uJVkKS27yMp2
KnUMOPlB6cc1Np9jdwTzzXk0Eks03mkwoUA/dqgABJ7LnOavTjMYGM/Oh6Z/ iHsf89x1AJ0O
MCTnHWNh6e3uP19DiVGKd0tQI/KtYLyS5JVJ5UVHYv1VSccf8Cb86l+0Qf8A PaP/AL6FZOp3
EkbQuj3UcTzgSvBAZHVfKJHy7WI+YKOneq8d0WvrRLe61OdXkIlFxZGNAmxj ncYl/iC9+9Dm
lLlsws7XOiorOvNSj0rSYrmWKaUExRBIV3MWdgowMjuRTtK1QapDMxtLi0mg lMUsFxs3o2Ae
qMynIYHgnr61QF+iiigAooooAKKKKACiiigAooooAKKKKACiiigCjo//ACCo f+Bf+hGr1UdH
/wCQVD/wL/0I1erSr/El6smHwoKKKKzKCiiigCFSv2yQcbvLTPrjLe317/gO 81RKf9KkGeiK
cZ927Z/oPqe0tAENyVES7sY8xOvruGOx/wA9x1qaopziMHOPnQdcfxD3H+ex 6EFxA2MTRnOM
YYc5xj/0JfzHrQBG6SLK5EZYMcggj0A7n2rJ8O2F/pulG1u7ZVcTyyL5dwZs q7s4yzAEkbiM
nOcZzzgW7q5jWVCIGummkCRLHtOfk3dWIGMAnrUfn7J4Ip9Mmg85yiO/lEZC lsfKxPRT2qva
xXutkcrepduLCO7s4YJmYCJ4pMof4kYMOo6ZFOtbGK0uLuaMuXupRK+48AhV XA9sKKGuVttO
+0yiVlSMMwjjaRzx2VQWY+wBNR6bqltqsTS2pk2KdrLLC8Tq3cMjgMp6HkDg g96l7/1/XQvo
XaKKKACiiigAooooAKKKKACiiigAooooAKKKKAKOj/8AIKh/4F/6EavVR0f/ AJBUP/Av/QjV
6tKv8SXqyYfCgooorMoKKKKAIlP+lSDPRFOM+7ds/wBB9T2lqJR/pUhx1RRn Hu3fH9T9B3lo
AinOIwc4+dB1x/EPcf57HoZainGYwMZ+dD0z/EPY/wCe46iWgDNvbKK6kxOs /wAsgkjaF3Qg
7dudyEHoSPxqGPTbaOeKb/TpHiJZPOuJ5ACQRnDEjOCR+NWLu6jgkPnNN80g jRYldiTt3Ywv
PQE1Cl9A80cX+mI8hKp5sUyAnBOMsAOgP5UN07pO1ybS6DtW0p9V0JtPEqws 6pkuhdDgglXU
MNynGCuRkEioPDXh5fD1tcxIbUCeXzTHaWot4kO0AhUBOBxnr3rUNzHBY/ab mZIokj3ySSMF
VQBkkk8AVT0bXLTXUu5bGaCe2gn8lJ4JhIknyKxII46tjv0otqyuiNOiiigA ooooAKKKKACi
iigAooooAKKKKACiiigCjo//ACCof+Bf+hGr1UdH/wCQVD/wL/0I1erSr/El 6smHwoKKKKzK
CiiigCJR/pUhx1RRnHu3fH9T9B3lqFQv2yQ8bvLTPrjLe/17fie01AEU4zGB jPzoemf4h7H/
AD3HUAt4FxiGMYxjCjjGMf8AoK/kPSkuQpiXdjHmJ19dwx3H+ex6VNQBk3to kkiBbl7RoJRJ
E0WwEfIU6MCMYJHSoxalrmCa41e4uBA5dEk8kLuKlcnagPRj3qzeXskEyIiT SPJJ5SRxbMk7
C/8AEQOgPeo/ttyk8EU9veQec5RHcwkZClsfKxPRT2qW6fMr7itK2gmr6fPq GhLbwLCZ0aGZ
EnyEdo3VwrEAkA7cZwcdcHGKNEsr62a/uNQW3Sa7uBL5dvIzqg8tFxuKqScq ecDtVu4v47Sz
hnmViJXijwg/idgo6npk1bqvP+un/AH0sFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFAFH
R/8AkFQ/8C/9CNXqo6P/AMgqH/gX/oRq9WlX+JL1ZMPhQUUUVmUFFFFAESn/ AEqQZ6Ipxn3b
tn+g+p7S1EoP2qQ5bGxeMnHVunGM/j6dO8tAEU5xGDnHzoOuP4h7j/PY9CCB BjBk4x1kY+nv
7D9fU5JwTGMFh86fdJB+8PQHj/PHWpaAMy5sYLpvLl8391IGRkmdGB2bc7lI PQkde9Y3hlrb
VrJNQaYzTwXMyYjv5biNCrMgI3MQSUIOcDIbOBmtu+uooZB5qKSX8tAIGlZj t3cBeemfyqBL
yB5o4vJ2PISqebYyICcE4ywA6A/lT5qd7StfQm0t1sLqlrPeaRax26b3We3k I3AfKsisTn6A
1keB9Gn0gXqyaY1nG4jCvOkP2iZhuLNI8LlZOWGGKqx53ZPJ6yN/MiR8Y3AH FIJY2laISKZE
AZkB5UHOCR74P5Gja5Seg+iiikAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBR 0f8A5BUP/Av/
AEI1eqjo/wDyCof+Bf8AoRq9WlX+JL1ZMPhQUUUVmUFFFFAESj/SpDjqijOP du+P6n6DvLUK
/wDH5JyP9WnGBnq3fr+fHp3qagCKcZjAxn50PTP8Q9j/AJ7jqAROMZnkOMdQ vPT29j+Z9sJc
8xLyB+8TqAf4h6//AK/TmpqAMu6smuZFxdTwywSh0ljCbs+XtOQykchj2rO0 j7RqsMF/dXd9
mC4mAt5/J+VkZ4uSiDnGeASOep61ty4aVsR5I4J8wrk49qqWenWenQmGy0+C 2iLbikDFAT0z
gDrwPyq+SL1a1Iu77lfxCJm8KSLBc3Nu5WMGW1t5JnC7lzhIyHIIyCUIYAkg 8VU8INft5xuo
L2CEwR+Ul1PLL/y0mzhpVV842cMAwGAeldNGVaJGUYUgED0FOqe5fQKKKKQB RRRQAUUUUAFF
FFABRRRQAUUUUAFFFFAFHR/+QVD/AMC/9CNXqo6P/wAgqH/gX/oRq9WlX+JL 1ZMPhQUUUVmU
FFFFAESn/SpBnoinGfdu2f6D6ntLUS7vtUmfu7Fx165bPt6dOfXtUtAEU5xG DnHzoOuP4h7j
/PY9CBZ+MyRnpnEZ9s9/978x6ck+7yxt6709em4Z6e34evGaloAxdTS4Zods U86rODOltL5T
MvlEcEsvG4qcZ/Oq8aSm+tDBp+p26LITM9zdh0KbGGMea2TuK9q2Jdvmtt83 P8WzbjOPf2xT
Of8Ap4/8cpOlGUlJk8zWhFfm7XQjJYuVuI41kUAA79uCU5B+8AVz1GeKTRLy TULaW+Mpe3uJ
DJajaAFiwAuD33bS+T/fFaMe3yk2fcwNv0p1PqV0CiiigAooooAKKKKACiii gAooooAKKKKA
CiiigCjo/wDyCof+Bf8AoRq9VHR/+QVD/wAC/wDQjV6tKv8AEl6smHwoKKKK zKCiiigCJR/p
Uhx1RRnHu3fH9T9B3lqFf+PyTgf6tOcjPVu3X8+PTvU1AEU4zGBjPzoemf4h 7H/PcdQBp+Mx
xjpnEh9s9v8Ae/IevCXPES8A/vE6kD+Iev8A+v05qagDmNauoTf2ttJHbTTi dJHgnDmLDIyK
GcIwXLH5dwG4jA5qC6kg02+sJbrT9M01VkZg9uzO8vyMvlqBEMsSwIXOTg4B xxpaho1tdaqL
s3MyMfKMsSJuWQxtvj3cZG1jngjOecjis/U/Cen6y0UmpTPczRLhJXtV3AgA AkhRkAhm2nKk
u2QRgCvYUpSU5GbnNJpGxqd8+naAbiI/v9iJCPJMu6RiFUbdy5ySByyj1IHN UvDGq6nqkcw1
KJILi1lkgmjEaqWOEZThZZAvDEEbm9cjpTPEOsaLoOmWun6hYm5sriMxrAkK PGUUKMFSQMcj
isay8f8AhjTYPIsdKuLWEf8ALOC3jRegHQNjoAPwrWOFq1FzRjdP/P8A4f8A pClWhF2b1/4B
3tMSKONpGjjRWkbc5VQCxwBk+pwAPwrjf+Fn6L/z66h/37T/AOLo/wCFn6L/ AM+uof8AftP/
AIuq+p1/5WL6xS/mO1oriv8AhZ+i/wDPrqH/AH7T/wCLo/4Wfov/AD66h/37 T/4uj6nX/lYf
WKX8x2tFcV/ws/Rf+fXUP+/af/F0f8LP0X/n11D/AL9p/wDF0fU6/wDKw+sU v5jtaK4r/hZ+
i/8APrqH/ftP/i6P+Fn6L/z66h/37T/4uj6nX/lYfWKX8x2tFcV/ws/Rf+fX UP8Av2n/AMXR
/wALP0X/AJ9dQ/79p/8AF0fU6/8AKw+sUv5jtaK4r/hZ+i/8+uof9+0/+Lo/ 4Wfov/PrqH/f
tP8A4uj6nX/lYfWKX8x2tFQWd0l9Y293EGEc8ayqG6gMMjPvzU9c7VnZmydy jo//ACCof+Bf
+hGr1UdH/wCQVD/wL/0I1eq6v8SXqyYfCgooorMoKKKKAIlP+lSDPRFOM+7d s/0H1PaWolJ+
1SDDY2Lzg46t05xn8PTr2loAinOIwc4+dB1x/EPcf57HoQSucZgkGcdSvHT3 9z+R9sk5IjGA
x+dPugk/eHoRx/nnpUtAGLqd+bNoWaeC0WecI8lyMrH+6Lc/MBnKgde9V49W Rr60gi1fTL3z
pCjR2w+dQEZt3+sbjKgdO9bEv7uVjviG7nDvtPTH9KZ5n/TS3/7+/wD1qTpy clJSJvbSxx/j
iwTUZNEgkn8hBBcSNJs3YCojdMj0rj18OW76Z9s/tJEMiPLAkvlIXVSQMgyb gx2nAVWHTnrj
u/Gmj6xejTTpEPmtDHNFIdyLhXVV/iPcZrlY/DXjGOxFn/Z8TwruCCX7O7Jn rtZslfXgjnmv
cwtVKjFKaXq13f8AwDz60L1G3Fv/AIZf8EqnwiPKjk+2tGFbFykqJvhARnPy pIxzhSMNtOce
+LB0jTr2zsorVWZvJik85oxG7IZ3RywBI/iTkk8LVttJ8dsQfssakSeaSgt1 3tgjLY+9kMQc
5znmo20Lxw04m+yKjiBrceW0CARnOVABAHU1s6re9SP3kKCX2H9xVfQtOuTK 8R+yw3Debbt8
0hjjWEyOuM88so59Kih0fTDYTTSySlTZCaF0g+bPn7MsDJjOMDAOMH1HNoeG vGgigiFp8kET
xRjzYflV87h15zk0Q+GvGcCqqWSlFhMAR2gZShbdggkg/Nzk80/aL/n4vv8A 68vxDlfWD+70
/wCD+Bla14fi0i3LDUYZp0k8qWEPHkHByVCuzYBGPmCnkcemY8NuqWpjuPNe QZlj2FfLO7GM
98jByPWuovfDPjHUIwt1p0MhBBMn+jrI2Bj5nHzN+JNQy+EPFs8NtFJY7ktl KxDzohtBJb+9
zyT1rSFeCS55q/qjOdKTvyxf3FyTT9FGu3FksOkmOEzfKrXm9QiMRvJOCAQM 7efSqN5omnSR
xXv2hLWzaONd9pG8qySMzj5VkYMAAhzuOcjgc1onSPHDTmc6dZ+cxYs4gtAz bgQcnHOQTnNN
TRfHMczSLZxYKqvlkW5jAU5GI/ujBJOQOpPqaxU0rfvF/wCBGrje/uP7jLPh UW8xtp7wfbws
siQrFlGSNmBy+eCdjEDB6DJGatat4YgWe+uTe29sWkmeC3zGo2q7ALguGydp ACoR0564nGg+
OBbPb/ZtyPuyzSQs/wAxywDk7gCeoBwcn1NLJoXjaeKSOaxilDs7ZlFu7KWO W2k8rzz8uOea
ftXdP2kfvQuRa+4ykPCCGFZHv2iCg+ekkaF4iI2flVkYj7pGG2n264xdTsIr L7NJb3DzQXMX
mozx+Ww+YqQQCR1U966qTR/HUsbo1pGFkJL7BbqXJUqSxGCSQx5PPNZ83gzx XPHDHJYblgTZ
GPOiG1ck4+96k1cK6vedRfeiZU9LKD+49S8Pf8i1pX/XnD/6AK0qpaPby2uh 6fbzLtlito0d
cg4YKARx71dr56o7zZ6sfhRR0f8A5BUP/Av/AEI1eqjo/wDyCof+Bf8AoRq9 Tq/xJerCHwoK
KKKzKCiiigCJR/pUhx1RRnHu3fH9T9B3lqFSv2yQcbvLTPrjLe317/gO81AE U4zGBjPzoemf
4h7H/PcdQCdDjAk5x1jYent7j9fQ4S5KiJd2MeYnX13DHY/57jrU1AGXc3Uk c8SW8SySXM2x
RK5jA/dl+flJ6L0xSPPe29xbR3Vtbqk8hjDR3DMQdjN0KD+6e9TXljDdlkub OO6iLBwsiqwB
xjo3fr+dQQaPY2syzW+kW8Mq/deOKNWHbgik4zck1LQV12JbzUo9K0mK5lim lBMUQSFdzFnY
KMDI7kVNYahFfrKER45YHEc8MmN0TlFfaSCQSA69CR70XFhHd2cMEzMBE8Um UP8AEjBh1HTI
qWC0htpbiSJSGuJPNk+YnLbVXPtwo6f1pjVrE1FFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFF
FAFHR/8AkFQ/8C/9CNXqo6P/AMgqH/gX/oRq9WlX+JL1ZMPhQUUUVmUFFFFA ESn/AEqQZ6Ip
xn3btn+g+p7S1Ep/0qQZ6Ipxn3btn+g+p7S0ARTnEYOcfOg64/iHuP8APY9C C4gbGJoznGMM
Oc4x/wChL+Y9aJziMHOPnQdcfxD3H+ex6GWgDLurmNZUIga6aaQJEse05+Td 1YgYwCetR+fs
ngin0yaDznKI7+URkKWx8rE9FPapr2yiupMTrP8ALIJI2hd0IO3bnchB6Ej8 ahj022jnim/0
6R4iWTzrieQAkEZwxIzgkfjQ1U5k09Cfd6ot3Go22m6bHd3s3lxfIpYqWJZi FAwMkkkgfjU1
peQXsRkgcnGAyspR0JUMAykAqcMDggHmq93p5vbC3gaTyzHLDKTjP3HVsde+ 3GaltLCKznvZ
oyxa7nE7g44bYicfgg65/lQUrWLVFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFAFHR/+QVD
/wAC/wDQjV6qOj/8gqH/AIF/6EavVpV/iS9WTD4UFFFFZlBRRRQBEo/0qQ46 oozj3bvj+p+g
7y1Eo/0qQ46oozj3bvj+p+g7y0ARTjMYGM/Oh6Z/iHsf89x1EtRTjMYGM/Oh 6Z/iHsf89x1A
LeBcYhjGMYwo4xjH/oK/kPSgCpd3UcEh85pvmkEaLErsSdu7GF56AmoUvoHm ji/0xHkJVPNi
mQE4JxlgB0B/Ki9tEkkQLcvaNBKJImi2Aj5CnRgRjBI6VGLUtcwTXGr3FwIH LoknkhdxUrk7
UB6Me9D9rzLltYn3epyXxLSW4i0XYjSP5czkKuTgBCTx2xk1wSadfSPsjsrh nwDtWJicEbge
ncAke1ejeObpbC78PTTK5jVZllVR8xQqisB74Jrmz4rgYMwimjkYTKSmOFKy CIZz28wg+wHW
voMJKcaEeVX3/NnmV4xdV8ztt+SMqLw3qc0czR20peCLzZIvJkDj59mMbeTk E+mAecgioYdD
1OWW2Q2U0QueYpJkKIwxknceMAc59KvwaxZfYktJxOq/Yfs7OiK2HE3mDgsM jGB1FX7rxVbS
3TToZWhuHLXFr9jhi4ZGU4lU7mI3nBI+tdDnWTaS7mSjTau2YsuhzmFZrGaH UULmNvsgclWx
nBVlDdATnGODzxQdBvktJnltriO4jlRPszQsHIZXbdjrwEPar9jrGnaPbzwW T3kvnhy80kax
lT5bogChj3cknP4UsPiBF0zTrWAOt1bywsHkwI8q8p5Oen7xf1ocqvRdgtDd +f8AwDnmhlRI
3aJ1WUExsVIDjOOPXnirdppc9zqDWUhW1lRXaT7QrLsCqWOQAT0HpU+vXVvc ay62nFnb4hg2
HPyL3B9zk/jU9nqttaeJJr5bi/8AJdZVSdsNONyFQx5AJBOetaOcnC6Wtn/w CeWKlZvqv+CR
x6DHLC8yazp5hR0jL7Z8bmzgY8vP8J7YqrPpF/bi5ZrSZobaQxSzIhaNWBwR uxj0/Ot6HxFD
HBPGdf10yyPG32nyhv2rvyn+u6fMD1/Cmy+JLCXdciCeKdIriGO1VVMJWVmO ScgjG88bTnaO
RWSnVT2uv68l/X43ywa3Mi20O8kdftEE9tG8Ek0ckkJAkCIW4zjOcDketQHS dSXyM6fdj7R/
qcwt+97/AC8c/hXRP4n09WvZI1u5HvXeWRZVXETGJ0Cqd3zDL9cDgDii68S6 fd3nnS+Y0Esv
nSWx0+EBX2thi4YGXax6MBkdaPaVb/D/AF/Xy08w5Kdt/wCv6+evkYA0TVmn aBdLvTMmN0Yt
33LkZGRj0BqTQVZPFGmI6lWW9iBBGCDvFauq+IrS60yO0tvP3KYtz+RHCrBG kJ+RDgffXA9j
VS0u0v8Ax5bXcYYRz6kkihuoBkB5p803F8y6MXLFNWfY9wooor5c9oo6P/yC of8AgX/oRq9V
HR/+QVD/AMC/9CNXq0q/xJerJh8KCiiisygooooAhUL9skPG7y0z64y3v9e3 4ntNUSn/AEqQ
Z6Ipxn3btn+g+p7S0AQ3IUxLuxjzE6+u4Y7j/PY9KmqKc4jBzj50HXH8Q9x/ nsehBAgxgycY
6yMfT39h+vqcgFa6vI7dmae6S3jDBAXZVBOM9T36/lUMOp2txKIodUhkkboi SISfwFNu7WeS
aJrWdIpbaYOplQyA/uymD8wP8Wc57U02+pT3VrJd3lq8cEhkCQ2rIWOxl6mR uPmz07Um6nMk
loTp3Lk1jZ6lDC97Z29wQuV82IPtzjOM9O35VD/wj2i/9AfT/wDwGT/Cmapb SXXh8rBEZZ41
jnhjDBd7oQ6jJIAyVA545pdA06bTLB4JmBLSeZx03Mql/wA33n8a0U5LRMfK mrsd/wAI9ov/
AEB9P/8AAZP8KP8AhHtF/wCgPp//AIDJ/hWlRR7Sfdi5I9jN/wCEe0X/AKA+ n/8AgMn+FMOg
6MJlT+w7IqVJMn2aPaCMceuTn0xwfatWmu6RRtJIyoigszMcAAdSTR7Wfdhy R7Gf/wAI9ov/
AEB9P/8AAZP8KYNB0YzMh0OyCgAiQ20eGzngd+Mdx3HXnGorK6hlIZSMgg5B FLR7SfdhyR7G
VFoOjSJubQ7KM5I2vbR54OM8Z69fx5xUP9kaV/aP2X/hGYPJ8vf9r+zweVnP 3cZ35/4Dj3rb
oo9pPuw5I9jKfQdGV41Gh2ThjgsttHhOCcnP5cZ60/8A4R7Rf+gPp/8A4DJ/ hWlRR7SfdhyR
7Gb/AMI9ov8A0B9P/wDAZP8ACnx6FpEMqSxaVYpIhDKy26AqR0IOODV+ij2k +7Dkj2CmRO0i
bmieM5I2uRng4zwT16/jzin0VBRR0f8A5BUP/Av/AEI1eqjo/wDyCof+Bf8A oRq9WlX+JL1Z
MPhQUUUVmUFFFFAESg/apDlsbF4ycdW6cYz+Pp07y1Eo/wBKkOOqKM49274/ qfoO8tAEU4Jj
GCw+dPukg/eHoDx/njrUtRTjMYGM/Oh6Z/iHsf8APcdQCJxjM8hxjqF56e3s fzPtgAil/eSs
NkR28ZdNx6Z/rTPL/wCmdv8A9+v/AK9UtTs5blodkNvd+TOHeO6basg8orzh Tzlgenaq8eny
/brSVdJ0yyWGQu728hZ2BRl248te7A9e1JzmpJKOhNlvcyPHniDVNHGlSadc NAs6yNIPLDA4
MZAOUI6bh94HBOAeq8YvjnxOu3OrM2MZzbxfNjb1wnfaf++2xj5dvY+MTbx3 2hzXMUDolnd7
fPQFd3loVGSvUkDA3DOOjYyvNwz6fJ4eD/ZLKWaWOU3JM9vCySZOCqFN+ANp AjIBxjHXPq4S
lSlTvKN9e/8AXY5K85qVlKxSXxz4nXbnVmbGM5t4vmxt64TvtP8A322MfLtt w+JfGsjWyRXd
xcPNH5kaR2sTs6ggE4VM9UbPT77dPl26Tx6MscSSHTnkhl2wStJb7Zv3b7Wd Y1G1d4Thycd+
+a1/MLvSF08XmnpftbxFxFLFHEwWSQmPcuEB+ZGxnBx64ro9jQe0Pz/rTqZK dTrL+v8Ag9DP
l8ZeLbOfybnUZkljIDpLaxK3G3qNgxnafT77Yx8u1X8YeLbaO3km1RtsqB0J hh+dQQCTheMl
G9PvtjHy7bU9/bWmjQRl7C71C3EMLySIk+FzKSq7gQQAUUkZHoelWbhNJvtV XTlaA2nkSFZI
cP5ISeR+COgKZH4im6FBbw0+fTqL2lR/a/puxjr458TrtzqzNjGc28XzY29c J32n/vtsY+Xb
asfE/ja+z9jubu78vbv8qyjf+712pxna3p99sYwu3JtZ1utbnnSLT4lkErLH cqFiUFTgADuP
4ffFXNDMb6HfQGGwnka4iYRXl15IwFfJB3pnGR371pPC0IxvydvxfqRGvUbt zd/yLza/48t4
DPM9+IYvvySWCBeCoOT5YxyrZ6ffbphdtFfHPiddudWZsYzm3i+bG3rhO+0/ 99tjHy7dYy20
VhAZF0yJY7KeJ5YbwPLEzNJhEXzDuB3AZweGJ3dw5/7I+0jzf7J8vzz/AGf5 ezbs8ttvnY5x
u8vPmc5znjNZKjQV7wv/AF6mnPUe0v6t/SMyPxh4t+yG6/tRnhidEdjDDyxA IBG3PPlt0/vt
0+XES+OfE67c6szYxnNvF82NvXCd9p/77bGPl27kEukiOKK9ew89miadIXjW IyhJtp+UFMcx
5IBXJ571FEbBr6SdrbT4pFjRDB9qsmWQFmy+7YUGAANqruPB+r9jQu17P8f6 /qwvaVbJ8xkL
458TrtzqzNjGc28XzY29cJ32n/vtsY+Xb0/gLxHrWr67JbahevcQpas/MSKN wMagkqgGfvH7
w+82AQBsyr6fSY7trK3TTTaNbXRMgSNm3hpPL+fqDwmMEZyOtJ8MVz4qnfbn FjIN23pl4+M7
eOnTcM46NjK44qjSWHlOMbPT87GtGpU9qoylff8AK563RRRXkHcUdH/5BUP/ AAL/ANCNXqKK
0q/xJerJh8KCiiisygooooAgQj7dKueREhxtHq3fqfp2/Gp6KKAILshYVJOP 3sY+6G/jHr/P
t1qeiigCrLhpWxHkjgnzCuTj2pm3/pl/5HaiitUtDJvUzdd8Laf4m+xS3Uk8 Yt1PliHYDhih
IJKkgYQDAI6nuFIx1+F2jLtzfak2MZy8fzY29cJ32n/vtsY+XaUVKqTjpGTX o2W4Rlq0n8gX
4XaMu3N9qTYxnLx/Njb1wnfaf++2xj5dovwu0Zdub7UmxjOXj+bG3rhO+0/9 9tjHy7Siq9vV
/nf3v/MXs6f8q+5Avwu0Zdub7UmxjOXj+bG3rhO+0/8AfbYx8u10Pwz0qD7m paoMqFfEsY3j
5cg4Todpz/vt0wu0ope2q/zv73/mHs4fyr7kNX4XaMu3N9qTYxnLx/Njb1wn faf++2xj5dov
wu0Zdub7UmxjOXj+bG3rhO+0/wDfbYx8u0op+3q/zv73/mHs6f8AKvuQL8Lt GXbm+1JsYzl4
/mxt64TvtP8A322MfLtF+F2jLtzfak2MZy8fzY29cJ32n/vtsY+XaUUe3q/z v73/AJh7On/K
vuQL8LtGXbm+1JsYzl4/mxt64TvtP/fbYx8u0X4XaMu3N9qTYxnLx/Njb1wn faf++2xj5dpR
R7er/O/vf+Yezp/yr7kC/C7Rl25vtSbGM5eP5sbeuE77T/322MfLt0tA8E6f 4dvze2txdTTG
Ewkz+WeDszyEBHKZ4OMseOF2lFTKrUkrSk2vVjUIJ3SX3HS0UUVBR//Z
--------------090307060804040709080604
Content-Type: image/jpeg;
name="moz-screenshot-5.jpg"
Content-Transfer-Encoding: base64
Content-ID: <part2.06000707.00060204@matrox.com>
Content-Disposition: inline;
filename="moz-screenshot-5.jpg"

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRof
Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwL DBgNDRgyIRwh
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjL/wAAR
CABnAIEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD28kKCSQAOpNM84f8APOf/ AL8P/hSyDIQf
9NE/9CFZGr366Xp0166GRl+6mcF2JwBn3JrSEObQmUrGt5w/55z/APfh/wDC jzh/zzn/AO/D
/wCFco3ieNdKsr02km6e5FtJEMsYmyQegOSMcDqami8R2z6je20kM8UdrGsh laGTkFSx3Db8
uMd+vatvq0tdDP2q7nS+cP8AnnP/AN+H/wAKPOH/ADzn/wC/D/4Vy114ntPJ c2M0EzeTI67t
/wB5EDYxtweCM8j061LaeJLCTTknupvKlWKN5lMLrgvwCARkjPcZHvR9Wla9 mHto9zpPOH/P
Of8A78P/AIUecP8AnnP/AN+H/wAK5vUfEVrYlVjR7hhdrbSqqt8hPOfunJx2 HWrMmtadFII5
JXVvkBJhcBC33QxxhSfRsGp9g7Xsx+0W1zb84f8APOf/AL8P/hR5w/55z/8A fh/8KyrfUbS7
uHggaSRkYqzLC+wEdRvxtz+NXNlS6aW5SlfYs+cP+ec//fh/8KPOH/POf/vw /wDhVbZRspcs
Quyz5w/55z/9+H/wo84f885/+/D/AOFVtlGyjliF2WfOH/POf/vw/wDhR5w/ 55z/APfh/wDC
q2yjZRyxC7LPnD/nnP8A9+H/AMKKrbKKOWIXZdxlk/31/mKxtX0Uau9osk7J bwS+a8aZBkIH
HzAgjB5raBwQfQ5pMVMJuDuhyipKzOUfwht84W98yRm7jvIkkQybHXrklssD 9Qanl8O3Etzq
Ev26Ifb7dYpx9nPBCldy/PwOc4OfrXSYoxWn1ip3/rT/ACJ9lHsczdeFftEN jGLvZ9ltJLXP
lZ3bkC7uvGMZxVZ/BjT2ssc+oBpTbxW8TpBtCLGwYZBY5JIHcV1+KMU1iqq2 f9XuS6EH0/rb
9DlW8KzSJM8l+huHvUvA625CBlGMbd+SPxp58LA6lLes1jM8+xpRcWQkwwGC UO4FQfQ5rp8U
YpfWanf+v6Q3Rg91/X9M5yy8NLaa6+prLHGX3boreNow+em/LkHHsBzzW7sq bFGKidWU/iKj
BRvYh2UbKmxRip5irEOyjZU2KMUcwWIdlGypsUYo5gsQ7KKmxRRzBYKKKKkZ z95qVzcTXJiu
xYWFq5je4EYd5HGM7c5AA5HIJJB9ObFhfXCXMEFzcR3cF0he1u41C7sAZVhn GcZIIwMA8DHN
C/02NEu7K9trqXTbiVriOa0Qs8DtywKjJOWLEEA9SCPW1ptkGksUgs5bTTNP DGBJxiSWRhje
RnIADOOeSWPTu/e5nty2+dzBOfP5f1+BBLrutS32qRafpGnzW+nyiJ5LjUXh Zz5aSHCiFgBh
wOW7dqsf8JZpK2lhcTSTRC9gW4VfId/KjbGGkKgiNefvMQODzwaytQ8Aadq8 2tXF/aWTXl3c
rNaXnkq8sG2OMLksOgdCdvIIPPUiodX8K6rql0l7Its1zc2SWt3Gmp3VvFGV LHcBFgyqd7fI
23pgMMmhW0v5fl/n9x0NK+h0c/iLTLbUlsJZpBMXVCywSNGjtjarSBdiMcjA YgncPUZrXPiq
yi1qz0uFZJpp7o27N5brGpEbucOV2uRtwVByM89Ky9Z8OazqOqoyTRNZxXFv PATfTRCJY2Rm
jMKrskyUJ3OxI3cAYqaLQtXh1KzhX7CdNtdRlvRKXbznEglJXZswCGk+9u5A 7UK2l/62/wCC
Gln/AF0/zN977GrxWCx7i0DTO+fuAFQBj3yf++TWW3ifA07Fpk3Nw8EwEh/c bJPKJ+783zlR
2657YrSt7KRNYvb6VlIlSOKIA/dRcnn3LM34AVkv4euXuNZJkh8q4T/QhzmJ 2+Zy3H98KeM1
PqIsp4nsftP2eXessk8sNuscbymQRsEdjtU7QHOCTwMZzVKx8b2NzcTxzI8U UOnwXzXCxytG
wkz8qkxjPRcd2JIC5Uip7PQbqC+024kkhJgsJ4Z8MctLK8bkjI6ZVuvPI4rD /wCEI1E6Wlm0
1vxpllAXSeSMie2cuACqghGzjeCGXGQD2tJW13/4f/hylytf13/yOy07UrXV bYz2rSFVYoyy
xPE6MOzI4DKcEHBA4IPQirdYnhrSZ9KtLj7TGkc083mFVvZ7sgBQozLN8zHj 0UDgY4ydukyQ
ooopAFFFFABRRRQBDc3dtZwma6uIoIh1eVwoH4mnxTRTxLLDIkkbchkYEH8R WHp1omo6neX9
0okmiuHgiVwD5KKcYX03Y3Z/2h6VPJZxaXrtk9mojW9MiTwoAFYhdwkI9RgL nvuHpVWWxPM9
zYorzTWLxYdU8RXN9aeI57e3u0iS4sdVaCC3Bhi+8onTADMWLbCADkng409Q 8TaxpM9tpu0X
N7a2EVxdmLTri5+1O2RtQxDEWSjfMwI+YfLwaSWif9bXLas7HcUVyOr+J7zT 9agjSW2a2a4g
t3tltJpZAZGQZeZT5cJG8EKwO4Ac/NxHJqer32r6TcrPbxaY+rS23kRhllIj SZTvbdtcFkzt
2jHHXFCVwtpf+u52VFc9e2x1nxHNp9zcXkNpa2scypa3MluZHdnBJaMqxChO Bux8xyPu4yrT
WtcmNpplpc2bTbL3deXcLSbxBMsanarJksG5OQM8j0pBZnbUVxOn+JLm4vW1 NjstpdO06eSF
mLLEJXlDlecAj5ST6LXV6Zcy3mmw3MyqrTAyKFBGEJyuQe+3GffNNxabTE9H Yt0UUUgCiiig
AooooAKKKKAM2fTJVvXvdPu/ss8mPNVoxJHKQAAWXIOQBjII4/CpLTTmiumv Lu5a6uyuwSMo
URrxlUA6AkAnqT61Bd6w63j2Vhafa7iMfvSZAkcROCAzYJyQc4APFS2WqG4u WtLq2e1uwu8R
swYOvGWQjqASAehHpV+9Yj3bkyabZp9txApF6++4DEsJDsCcg/7KgYHHFZ03 hPRriC2gkt5j
HbReQii6lG+P+5Jhv3i/7L5HXjk1buNb0+1tnuJpysUc4t2IjYkSEgYwBnv1 6Y5zjmrSXUMl
1NbI+ZYQrOuDwGzjnp2NQu6/r+kXfUzrrwxpN5etdzQzeY7pI6JdSpG7rjaz RqwQsNq/MRn5
R6Uv/CNaV/aq6l9nk+0rKZ1/0iTy1kKlS4j3bAxDHJA5zzVtNTtZLyO0Dutx IsjpG8ToSsbB
WPIHGWXHqDkZHNW6NtQ8jO1LRLHVnie6WdZYgQk1vcyQSAHGV3xsrbTgEjOC QDjgU+LR9Pt5
LZ4bVIzbQNbwhMgJGxUlQBx/Av5VXn8S6VbaibGW4kEqusbuIJGijdsYV5Qu xGOV4ZgfmX1G
dagDDn8MWY02WysUjt1mto7KQyK0ubdNwCAFuuGYBjnrkg4xW2qhVCqMADAF QWd7b38DTW0n
mRrI8RO0j5kYqw59GUirFNt9QfmFFFFIAooooAKKKKACiiigDD0p4rTU7ywu nEdzLcPPCXIH
noxyCvrtztx/sj1qaeeHUNeso7N1lFkZHuJoyCqkrtEZPqchsdtg9a0Lm0tr yEw3VvFPEeqS
oGB/A0+KGKCJYoY0jjXgKigAfgKq636k8r2OWvdIe98RXdhJby/YrhDeGbB2 CQxeRtzjAOPm
x+NZ66VNqy6PNqemySC61NpbyCaElVVbZ4xvU8bSUU88EsPWu8oqVoXdnmDa FefaEuLfTXj1
JoNYhtbk253RSvOWiO/HyAqX2sSB8xwfm52/Adk1q96Y4Rb2zJEPJj0iTT4/ MG7cdsjsXfG0
FwADgctjjtKKd/6+d/1CT5jirpp4dF1Xw42n3s19eSXAgkFtI0DrM7MrmUZV QobkMwb5Dgcr
mtc6E/2/UNR/s95L+LWrP7PcmEl1hxbiQoeoUjzAxHHBz0rvqKE7O/8AXT/I L33/AKucHbad
dJBawtbsn26/vbadZF2kxNcPKGwexRWA/wCugNd5UTWtu12l00ERuUQxrMUG 9VJBKg9QCQOP
YVLQDd22FFFFIQUUUUAFFFFABRRRQBz/APpOtX1yDdTW9jBK0KxwSFGlYY3M zD5hg5AAI6Z7
1YgFzpep29pLcyXNrdBhE0xy8bqM7c4+YEBjk8gjvmiirvq0Z9Lmfcavrdzr Oq22lfYf+JZ5
Za0mhZpLoMu75ZN6rHnlRkNgrk8HFNg8XTi81S3udJui8F+tnZxxGLdcExCQ jJk2ggbmyxUb
do+9kUUVMNdPL9UbLVN9v8ipf+OZYpY3t9PnS1On3lxNLJGjtBLAwUqVEo3Y OQQDgkrhsZI2
5/EkFvqi2RtLp0EkcMt0gTyopJMbFYFt5JyvKqQNwyRzgoptfCu7/WwVFyp2 6X/CxtUUUVJI
UUUUAFFFFABRRRQAUUUUAf/Z
--------------090307060804040709080604
Content-Type: image/jpeg;
name="moz-screenshot-10.jpg"
Content-Transfer-Encoding: base64
Content-ID: <part3.07080308.06040607@matrox.com>
Content-Disposition: inline;
filename="moz-screenshot-10.jpg"

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRof
Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwL DBgNDRgyIRwh
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjL/wAAR
CAD5AZIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2NbJ3G64kdnP8KSMir7Db gn6n9OlO+wR/
9Nf/AAIk/wDiqt0UKy6AUHtoI2w3m5xn/j4k/wDiqb5Nv/02/wDAiT/4qqfi B7jypY7R9lw0
J8ttwXDc4OSrAf8AfJ+hriYdQ8RaZqMP2678+BY5JpYV2tuQMgJHy7lI3E43 Nn2yAOmNKLSb
W5i5tN6noXk2/wD02/8AAiT/AOKo8m3/AOm3/gRJ/wDFV59/wnNzbssKWM9+ weR5HiilbEfm
uqhfLiYFsJ/EUHTk840pPFxjkkRrM7kEoI83nepbYvT+MIxz24HNWqEOwnOS OwFtCwyFnI9p
5P8A4ql+yxf3Lj/v/J/8VTtMk8y2Zv8Ab/oKu1zzUYyasaRu1e5Q+yxf3Lj/ AL/yf/FUfZYv
7lx/3/k/+Kq/RU3j/KOz7lD7LF/cuP8Av/J/8VR9li/uXH/f+T/4qr9FF4/y hZ9yh9li/uXH
/f8Ak/8AiqabeBTgicH3uJP/AIqtGsrU5vLuVGf4Af1NaU4xnK1iZtxV7iyW 8DoVElxGT/El
w+R+ZI/SoPs7Q8mSadB1xNIrgf8AfWGP5e3pWdp9laLpsaJGoO1hb2yyLGuo qqghmBHXsSOG
AycqQKWweK3s1ji2hdzEqqbArFiWUL/CASRg8jGD0ojSjUbSVgc3FXNiO3t5 k3pJOR0/18gw
fQjPFP8AsUX9+f8A8CH/AMazkuzFL5ick/eXPDj/AB9/wPtrQzJPGJIzlT+n sa5qtKVN2ZpC
aktCL7FF/fn/APAh/wDGj7FF/fn/APAh/wDGrFFZFlf7FF/fn/8AAh/8aPsU X9+f/wACH/xq
xRQBX+xRf35//Ah/8aPsUX9+f/wIf/GrFFAFf7FF/fn/APAh/wDGj7FF/fn/ APAh/wDGrFFA
Ff7FF/fn/wDAh/8AGj7FF/fn/wDAh/8AGrFFAFf7FF/fn/8AAh/8aPsUX9+f /wACH/xqxRQB
X+xRf35//Ah/8aPsUX9+f/wIf/GrFFAFf7FF/fn/APAh/wDGj7FF/fn/APAh /wDGrFFAFf7F
F/fn/wDAh/8AGj7FF/fn/wDAh/8AGrFFAFf7FF/fn/8AAh/8aPsUX9+f/wAC H/xqxRQBX+xR
f35//Ah/8aPsUX9+f/wIf/GrFFAFf7FF/fn/APAh/wDGj7FF/fn/APAh/wDG rFFAFf7FF/fn
/wDAh/8AGj7FF/fn/wDAh/8AGrFFAFf7FF/fn/8AAh/8aPsUX9+f/wACH/xq xRQBX+xRf35/
/Ah/8aPsUX9+f/wIf/GrFFAFf7FF/fn/APAh/wDGj7FF/fn/APAh/wDGrFFA Ff7FF/fn/wDA
h/8AGirFFAC/bbT/AJ+of+/go+22n/P1D/38FYcOlQyQRuWkyygnBHp9Kk/s iD+9L+Y/wr0n
SpLqzm559iHW50kvUMUiuvlgZUgjOTWQYka5W4IzKiFFbPRSQSMfgK3f7Ig/ vS/mP8KP7Ig/
vS/mP8K6oVacYqPYxlTm3c5EeHdMQRCGGW28oEL9muJIeCxbadjDIySQDkDJ xirTabaPJLI0
WWllSZzuPLqAFPX2HHTr6muk/siD+9L+Y/wo/seD+9L+Y/wqvb0kL2cw8PfY 7O2um8yOKS4u
DLJuflm2KueT6KBx6VsfbbT/AJ+of+/grH/siD+9L+Y/wo/siD+9L+Y/wrln GlKV7s2jKola
xsfbbT/n6h/7+Cj7baf8/UP/AH8FY/8AZEH96X8x/hR/ZEH96X8x/hU+ypd2 Pnn2Nj7baf8A
P1D/AN/BR9ttP+fqH/v4Kx/7Ig/vSfmP8KP7Ig/vS/mP8KPZUu7Dnn2Nj7ba f8/UP/fwVg63
Okl6hikV18sDKkEZyam/siD+9L+Y/wAKP7Ig/vS/mP8ACtKSpU5cyZM+eStY wEgSOIRqXwAq
qWkYlQv3QCTkY6jHQ9KkiXyU2IWxksSzFiSTkkk8nkmtv+x4P70v5j/Cj+yI P70v5j/Ct1Wp
LZfgZOnN7mPvb1qe2vprVyyEHP3lbof/AK/v/OtH+yIP70v5j/Cj+yIP70v5 j/ClOpRqR5ZD
jCpF3RZh1e0lADSeU3pJwPz6frV4EEZHIrI/siD+9L+Y/wAKb/Ylr/t/p/hX nyw8L+7L8DpV
SXVGzRWN/Ylr/t/p/hR/Ylr/ALf6f4VP1dfzD9o+xs0Vjf2Ja/7f6f4Uf2Ja /wC3+n+FH1df
zB7R9jZorG/sS1/2/wBP8KP7Etf9v9P8KPq6/mD2j7GzRWN/Ylr/ALf6f4Uf 2Ja/7f6f4UfV
1/MHtH2Nmisb+xLX/b/T/Cj+xLX/AG/0/wAKPq6/mD2j7GzRWN/Ylr/t/p/h R/Ylr/t/p/hR
9XX8we0fY2aKxv7Etf8Ab/T/AAo/sS1/2/0/wo+rr+YPaPsbNFY39iWv+3+n +FH9iWv+3+n+
FH1dfzB7R9jZorG/sS1/2/0/wo/sS1/2/wBP8KPq6/mD2j7GzRWN/Ylr/t/p /hR/Ylr/ALf6
f4UfV1/MHtH2Nmisb+xLX/b/AE/wo/sS1/2/0/wo+rr+YPaPsbNFY39iWv8A t/p/hR/Ylr/t
/p/hR9XX8we0fY2aKxv7Etf9v9P8KP7Dtf8Ab/T/AAo+rr+YPaPsbNFY/wDY dr/t/p/hR/Yd
r/t/p/hS+rr+YPaPsbFFZH9hWv8At/p/hR/YNp/t/p/hR9XX8we0fY16Kyf7 BtP9v9P8KKPq
6/mDnfY0bOLNlAf+ma/yrCuvEyJczRWdp9oSEkSTO5RAQQDjCkkZOM4xmuos I86dbHH/ACyT
+QryvQrs6LePNqIeU24+zNaKv+sJBV95PGBycdyy9skTiKkouy0PSy3CQrqT kr2Ssu9zt9K1
qLUbg2ssD210E8wIxyHXjlW78EHt1raWEd6888OLeXfjiF2uftaI0kzTbCpK FGUEg/dyWXj/
AGeOBXpci7cUqVSUo3ZGYYaGHqqMOqT9CDyV96PJX3qSir5mcNiPyV96PJX3 qSijmYWI/JX3
o8lfepKKOZhYj8lfejyV96koo5mFiPyV96PJX3qSijmYWI/JX3o8lfepKKOZ hYj8lfejyV96
koo5mFiPyV96PJX3qSijmYWI/JX3o8lfepKKOZhYj8lfemtCB0qanxruzTUm Fir5VHlVB4it
hJod0/mTxtEhkRoZniIIB7qQSPY8VmTRXWkXuoPYuhgt7eGSQXTSTvIMyEqG Zsr9Tu+lKVRp
7HVSwyqQupa/h06/PsbXlUvk1l6ZqWq3+qvmwA04Syw+YAnyFGK5LeaSclfu +WMZ68ZO2Rhi
PehVLq6Mq1B0pcsmr+Tv8vUg8k0eSamop8zMrEPkmjyamoo5mFiHyTR5Jqal UZYD3o5mFiv5
VHlVl38l7aapqNzam3EcFtDJIsqMxcAyZUYI2nHfn6VDNrepJfzCC1Se1cTL bF41h3yIDxuM
pJGVIyUUd846z7ZLdHZHAzkrxa2v26J2+5m15VHlVnw6rcRaBqN7cqktxZBy 8Yha3wVQNtIZ
mHf7wYqRyDUFvfeIHaGCe1gt5J5dqTSxAKV2MxwiTPkgqOrDO725ftUSsFPV 3St579dFvsa/
lUeVWYL/AFOSOHa9jE93dvbwl42YRhDISSNw3khBwNuOTk9KjttW1S7huZIo bUm2gLFGBUzy
AyL8pLYVSUBBOeD+NL2yH9RqWbutPP5fnp/wNTX8qjyqr6RfPcQsl7NELoTG HZ5LQHcEDFdr
M2SBk5VmBAyDitXy/arU7q5z1KTpy5WUvKo8qrvl+1Hl+1PmM7FLyqXyqu
Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor) [message #324680 is a reply to message #324679] Wed, 30 January 2008 16:39 Go to previous messageGo to next message
Steve Blass is currently offline Steve BlassFriend
Messages: 276
Registered: July 2009
Senior Member
Very nice. Thanks for sharing the forms tips.
-
Steve


Mircea Luchian wrote:
> Hello Ed,
>
> I agree with your point on the properties view. It's purpose is
> justified for requirements not needing GUI validation, however, to
> implement on the spot GUI validation, the Properties view is not
> sufficient. For this reason, I believe an effort in 4.0 should be
> reserved towards the adjustment of the JET templates to generate an EMF
> editor using eclipse forms.
>
> Here are the main changes I made. I feel that some of them could be
> improvements made for 4.0 whenever possible.
>
> * I created a composite panel for every node in the tree. I modified
> the ObjectDetailsPage and removed the SampleSection inner class. I
> replaced it with a DetailsSection class responsible to create the
> panels and update them in function of the "Object input" variable
>
> private void detailsPageSwitch(final Object input)
> {
> sampleSectionHolder = new DetailSection(toolkit, input,
> adapterFactoryItemDelegator, adapterFactoryLabelProvider,
> mform.getMessageManager(), this);
> ScrolledPropertiesBlock.setDetailsPage(this);
> sampleSectionHolder.createSection(input);
> }
>
> public void update()
> {
>
> detailsSection.setText(adapterFactoryItemDelegator.getText(i nput));
> detailsSection.layout();
> ScrolledPropertiesBlock.setDetailsPage(this);
> sampleSectionHolder.updateSection(input);
> }
>
> With the detailsPageSwitch(), I pass the message manager of the
> managed form (mform) SrolledPropertiesBlock class to every panel.
> As such, the panels now have control on the message manager and
> can add / remove errors depending whether the user types in a
> widget or switches from the one node to another.
> _
> _
>
> * There is one "problem" with radio buttons (A = "true" and B =
> "false" initially) attached to boolean attributes in EMF.
>
> and
>
> As radio buttons are mutually exclusive, setting B, unsets A
> automatically. This will register as two actions in the EMF's
> command stack (B = "true", then A = "false"). If the user presses
> undo once, the B radio button will be "false" leaving A radio
> button "false" as well. The user must execute a second undo
> action to revert to the initial state.
>
> To prevent this from happening, I had to "hack" the
> EditingDomainActionBarContributor class located in
> org.eclipse.emf.edit.ui.action so I can call cutom Undo and Redo
> actions.
>
> I created the following and put all custom code in my plugin:
>
> public class CustomEditingDomainActionBarContributor extends
> MultiPageEditorActionBarContributor implements IMenuListener,
> IPropertyListener {
> [....]
>
> protected CustomUndoAction customUndoAction;
>
> protected CustomRedoAction customRedoAction;
> [....]
> }
>
> Custom Undo/Redo actions call themselves recursively if they
> detect that variables reserved for a group of mutually exclusive
> radio buttons are all set to false
>
> public class CustomRedoAction extends RedoAction {
>
> @Override
> public void run()
> {
> super.run();
> MyEditor.updateFromRedoUndo();
>
> Command mostRecentCommand =
> domain.getCommandStack().getMostRecentCommand();
>
> if (mostRecentCommand instanceof SetCommand)
> {
> SetCommand mostRecentSetCommand = (SetCommand)
> mostRecentCommand;
> EObject owner = mostRecentSetCommand.getOwner();
>
>
> /*********************************************************** ************************************************
> * MyNodeImpl OWNER
>
> ************************************************************ **********************************************/
> if (owner instanceof MyNodeImpl)
> {
> if (!((MyNodeImpl) owner).isReadOnly() &&
> !((MyNodeImpl) owner).isReadWrite() && !((MyNodeImpl)
> owner).isWriteOnly())
> run(); // RUN AGAIN TO SET THE RADIO BUTTON
> THAT WAS DESELECTED
> [....]
> _
>
>
>
> _
> * The eclipse forms panels (with every widget bound to the model)
> was not updated during an Undo or Redo action. I added both
> actions a MyEditor.updateFromRedoUndo(); statement that calls the
> editor to refresh the current selected panel in the Scrolled
> properties block:
>
> public static void updateFromRedoUndo()
> {
> try
> {
> if
> (scrolledPropertiesBlock.treeViewer.getTree().getSelection() .length
> != 0)
> {
> scrolledPropertiesBlock.getObjectDetailsPage().update();
> }
> }
> catch (Exception e)
> {
> }
> }_
> _
> This update mechanism for the eclipse forms does not exist on the
> EMF example found on the net.
> _
> _
> _
>
> _
> * I added error and warning status variables for every node in the
> model. This is really custom work, however with the usage of the
> eclispe forms' message manager, this complements very well the
> user experience.
> Data can have errors or warnings in the panels, so I changed the
> item providers for every node to display the icons in an
> error/warning state. Whenever we use validation on such panels,
> the nodes in the tree must reflect these same error states for
> later correction (say the errors exist but the user chooses to
> save/closes his file and chooses fix the errors later during the
> day; he must then know where the errors are...).
>
> I also made the parent nodes aware if their children have errors
> or warnings so they can be propagated to the root node. This makes
> the errors easier to search if the nodes are collapsed. How the
> error/warning flags are initialized on the faulty node is custom
> implementation, however, the error propagation to the parent nodes
> is performed in the model's implementation classes. Only the
> latter mechanism could be accomodated in a future version of EMF.
> See pictures below for a better understanding. I had to hide some
> information as the product is still under development.
>
> 1.
> 2.
> 3.
> 4.
> 5.
> 6.No more errors / warnings in the tree
>
> Thanks,
>
> Mircea
>
>
>
>
>
> Ed Merks wrote:
>> Tom,
>>
>> All that command stuff came long after we'd already done the EMF.Edit
>> support. It's impossible to keep up with the Jone's when there are
>> dozens of them and only two or three of us. Maybe an Eclipse 4.0
>> effort would allow us to throw away some of the cruft and focus on
>> supporting only the latests and greatest patterns.
>>
>> I'd be happy to provide hooks for whatever solution works well for
>> this type of scenario. I hope we can find at least a bit of time this
>> release to look at how to support forms and exploit data binding. I'm
>> kind of sick and tired of the limitations of the crummy properties
>> view (which doesn't even work for RAP).
>>
>>
>> Tom Schindl wrote:
>>> Ed Merks schrieb:
>>>> Mircea,
>>>>
>>>> Gosh, I don't have a lot of experience with this type of thing. I
>>>> hope someone else has some clue, because I won't even know where to
>>>> begin. Maybe Tom will read this and have an idea...
>>>>
>>>>
>>>
>>> Tom has read it :-) I'm not really skilled when it comes to all those
>>> key-binding thingies.
>>>
>>> But the following could work. If your TextWidget receives focus I'd
>>> try to reset the copy/cut/paste actions to their original counter parts:
>>>
>>> widget.addFocusListener( new FocusListener() {
>>> IAction emfcutaction =
>>> actionBars.getGlobalActionHandler(ActionFactory.CUT.getId()) ;
>>> IAction emfcopyaction =
>>> actionBars.getGlobalActionHandler(ActionFactory.COPY.getId() );
>>> IAction emfpasteaction =
>>> actionBars.getGlobalActionHandler(ActionFactory.PASTE.getId( ));
>>>
>>> IAction standardCut = ActionFactory.CUT.create(....);
>>> IAction standardCopy = ActionFactory.COPY.create(....);
>>> IAction standardPaste = ActionFactory.PASTE.create(....);
>>>
>>> public void focusLost(FocusEvent e) {
>>>
>>> actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), emfcutaction);
>>>
>>> actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,emfcopyaction);
>>>
>>> actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),emfpasteaction);
>>>
>>> actionbars.updateActionBars();
>>> }
>>>
>>> public void focusGained(FocusEvent e) {
>>> actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), standardCut);
>>>
>>> actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,standardCopy);
>>>
>>> actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),standardPaste);
>>>
>>> actionbars.updateActionBars();
>>> }
>>> });
>>>
>>> If this works it would be great if the
>>> EditingDomainActionBarContributor would provide a possibility to
>>> restore the actions.
>>>
>>> Another possible solution that comes to my mind is usage of the
>>> commands framework. I don't know if COPY/CUT/PASTE are handled by
>>> commands (but Paul knows so I've added eclipse.platform to the CC
>>> list :-).
>>>
>>> Tom
>>>
>>>> M. Luchian wrote:
>>>>> Hello,
>>>>>
>>>>> The EditingDomainActionBarContributor.java class defined in the EMF
>>>>> plugins overrides the Windows CUT/COPY/PASTE actions' keyboard
>>>>> shortcuts (CTRL-X, CTRL-C, CTRL-V) with EMF's own.
>>>>>
>>>>> This is correct as long as the actions are performed on the tree.
>>>>> However, I implemented an editor based on eclipse forms, with text
>>>>> widgets (Windows native) handling the COPY CUT PASTE actions with a
>>>>> right click of a mouse. As the mouse actions work fine and interact
>>>>> with the windows' clipboard, pressing the keyboard shortcuts for
>>>>> the same actions in the text widgets will call the actions reserved
>>>>> by EMF .. This is problematic as the CTRL-X, CTRL-C, CTRL-V
>>>>> shortcuts are overridden with the EMF copy, cut, paste actions for
>>>>> the entire editor.
>>>>>
>>>>> Is there a possible way to register the actions for the editor's
>>>>> tree only? (See picture)
>>>>>
>>>>>
>>>>>
>>>>> I have a CustomEditingDomainActionBarContributor.java replacing a
>>>>> few small things from the original
>>>>> EditingDomainActionBarContributor.java class, but I don't want to
>>>>> manage the registering / unregistering the copy, cut and paste
>>>>> actions when the tree is in focus or not.
>>>>>
>>>>> Any help appreciated
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Mircea
>>>>
>>>
>>>
>
Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor) [message #324682 is a reply to message #324679] Wed, 30 January 2008 17:08 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: merks.ca.ibm.com

This is a multi-part message in MIME format.
--------------040700020803000804040900
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Mircea,

Wow, lots of good helpful details! I hope we have some time for forms
even for this release. It would be really good to add your comments to
https://bugs.eclipse.org/bugs/show_bug.cgi?id=108470 so we can track all
the folks who have been contributing towards the forms stuff in various
ways. We hold contributors in high regard!


Mircea Luchian wrote:
> Hello Ed,
>
> I agree with your point on the properties view. It's purpose is
> justified for requirements not needing GUI validation, however, to
> implement on the spot GUI validation, the Properties view is not
> sufficient. For this reason, I believe an effort in 4.0 should be
> reserved towards the adjustment of the JET templates to generate an
> EMF editor using eclipse forms.
>
> Here are the main changes I made. I feel that some of them could be
> improvements made for 4.0 whenever possible.
>
> * I created a composite panel for every node in the tree. I
> modified the ObjectDetailsPage and removed the SampleSection
> inner class. I replaced it with a DetailsSection class
> responsible to create the panels and update them in function of
> the "Object input" variable
>
> private void detailsPageSwitch(final Object input)
> {
> sampleSectionHolder = new DetailSection(toolkit, input,
> adapterFactoryItemDelegator, adapterFactoryLabelProvider,
> mform.getMessageManager(), this);
> ScrolledPropertiesBlock.setDetailsPage(this);
> sampleSectionHolder.createSection(input);
> }
>
> public void update()
> {
>
> detailsSection.setText(adapterFactoryItemDelegator.getText(i nput));
> detailsSection.layout();
> ScrolledPropertiesBlock.setDetailsPage(this);
> sampleSectionHolder.updateSection(input);
> }
>
> With the detailsPageSwitch(), I pass the message manager of the
> managed form (mform) SrolledPropertiesBlock class to every
> panel. As such, the panels now have control on the message
> manager and can add / remove errors depending whether the user
> types in a widget or switches from the one node to another.
> _
> _
>
> * There is one "problem" with radio buttons (A = "true" and B =
> "false" initially) attached to boolean attributes in EMF.
>
> and
>
> As radio buttons are mutually exclusive, setting B, unsets A
> automatically. This will register as two actions in the EMF's
> command stack (B = "true", then A = "false"). If the user
> presses undo once, the B radio button will be "false" leaving
> A radio button "false" as well. The user must execute a second
> undo action to revert to the initial state.
>
> To prevent this from happening, I had to "hack" the
> EditingDomainActionBarContributor class located in
> org.eclipse.emf.edit.ui.action so I can call cutom Undo and
> Redo actions.
>
> I created the following and put all custom code in my plugin:
>
> public class CustomEditingDomainActionBarContributor extends
> MultiPageEditorActionBarContributor implements IMenuListener,
> IPropertyListener {
> [....]
>
> protected CustomUndoAction customUndoAction;
>
> protected CustomRedoAction customRedoAction;
> [....]
> }
>
> Custom Undo/Redo actions call themselves recursively if they
> detect that variables reserved for a group of mutually exclusive
> radio buttons are all set to false
>
> public class CustomRedoAction extends RedoAction {
>
> @Override
> public void run()
> {
> super.run();
> MyEditor.updateFromRedoUndo();
>
> Command mostRecentCommand =
> domain.getCommandStack().getMostRecentCommand();
>
> if (mostRecentCommand instanceof SetCommand)
> {
> SetCommand mostRecentSetCommand = (SetCommand)
> mostRecentCommand;
> EObject owner = mostRecentSetCommand.getOwner();
>
>
> /*********************************************************** ************************************************
> * MyNodeImpl OWNER
>
> ************************************************************ **********************************************/
> if (owner instanceof MyNodeImpl)
> {
> if (!((MyNodeImpl) owner).isReadOnly() &&
> !((MyNodeImpl) owner).isReadWrite() && !((MyNodeImpl)
> owner).isWriteOnly())
> run(); // RUN AGAIN TO SET THE RADIO BUTTON
> THAT WAS DESELECTED
> [....]
> _
>
>
>
> _
> * The eclipse forms panels (with every widget bound to the model)
> was not updated during an Undo or Redo action. I added both
> actions a MyEditor.updateFromRedoUndo(); statement that calls
> the editor to refresh the current selected panel in the Scrolled
> properties block:
>
> public static void updateFromRedoUndo()
> {
> try
> {
> if
> (scrolledPropertiesBlock.treeViewer.getTree().getSelection() .length
> != 0)
> {
> scrolledPropertiesBlock.getObjectDetailsPage().update();
> }
> }
> catch (Exception e)
> {
> }
> }_
> _
> This update mechanism for the eclipse forms does not exist on
> the EMF example found on the net.
> _
> _
> _
>
> _
> * I added error and warning status variables for every node in the
> model. This is really custom work, however with the usage of the
> eclispe forms' message manager, this complements very well the
> user experience.
> Data can have errors or warnings in the panels, so I changed the
> item providers for every node to display the icons in an
> error/warning state. Whenever we use validation on such panels,
> the nodes in the tree must reflect these same error states for
> later correction (say the errors exist but the user chooses to
> save/closes his file and chooses fix the errors later during the
> day; he must then know where the errors are...).
>
> I also made the parent nodes aware if their children have errors
> or warnings so they can be propagated to the root node. This
> makes the errors easier to search if the nodes are collapsed.
> How the error/warning flags are initialized on the faulty node
> is custom implementation, however, the error propagation to the
> parent nodes is performed in the model's implementation classes.
> Only the latter mechanism could be accomodated in a future
> version of EMF. See pictures below for a better understanding. I
> had to hide some information as the product is still under
> development.
>
> 1.
> 2.
> 3.
> 4.
> 5.
> 6.No more errors / warnings in the tree
>
> Thanks,
>
> Mircea
>
>
>
>
>
> Ed Merks wrote:
>> Tom,
>>
>> All that command stuff came long after we'd already done the EMF.Edit
>> support. It's impossible to keep up with the Jone's when there are
>> dozens of them and only two or three of us. Maybe an Eclipse 4.0
>> effort would allow us to throw away some of the cruft and focus on
>> supporting only the latests and greatest patterns.
>>
>> I'd be happy to provide hooks for whatever solution works well for
>> this type of scenario. I hope we can find at least a bit of time
>> this release to look at how to support forms and exploit data
>> binding. I'm kind of sick and tired of the limitations of the crummy
>> properties view (which doesn't even work for RAP).
>>
>>
>> Tom Schindl wrote:
>>> Ed Merks schrieb:
>>>> Mircea,
>>>>
>>>> Gosh, I don't have a lot of experience with this type of thing. I
>>>> hope someone else has some clue, because I won't even know where to
>>>> begin. Maybe Tom will read this and have an idea...
>>>>
>>>>
>>>
>>> Tom has read it :-) I'm not really skilled when it comes to all
>>> those key-binding thingies.
>>>
>>> But the following could work. If your TextWidget receives focus I'd
>>> try to reset the copy/cut/paste actions to their original counter
>>> parts:
>>>
>>> widget.addFocusListener( new FocusListener() {
>>> IAction emfcutaction =
>>> actionBars.getGlobalActionHandler(ActionFactory.CUT.getId()) ;
>>> IAction emfcopyaction =
>>> actionBars.getGlobalActionHandler(ActionFactory.COPY.getId() );
>>> IAction emfpasteaction =
>>> actionBars.getGlobalActionHandler(ActionFactory.PASTE.getId( ));
>>>
>>> IAction standardCut = ActionFactory.CUT.create(....);
>>> IAction standardCopy = ActionFactory.COPY.create(....);
>>> IAction standardPaste = ActionFactory.PASTE.create(....);
>>>
>>> public void focusLost(FocusEvent e) {
>>>
>>> actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), emfcutaction);
>>>
>>> actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,emfcopyaction);
>>>
>>> actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),emfpasteaction);
>>>
>>> actionbars.updateActionBars();
>>> }
>>>
>>> public void focusGained(FocusEvent e) {
>>> actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), standardCut);
>>>
>>> actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,standardCopy);
>>>
>>> actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),standardPaste);
>>>
>>> actionbars.updateActionBars();
>>> }
>>> });
>>>
>>> If this works it would be great if the
>>> EditingDomainActionBarContributor would provide a possibility to
>>> restore the actions.
>>>
>>> Another possible solution that comes to my mind is usage of the
>>> commands framework. I don't know if COPY/CUT/PASTE are handled by
>>> commands (but Paul knows so I've added eclipse.platform to the CC
>>> list :-).
>>>
>>> Tom
>>>
>>>> M. Luchian wrote:
>>>>> Hello,
>>>>>
>>>>> The EditingDomainActionBarContributor.java class defined in the
>>>>> EMF plugins overrides the Windows CUT/COPY/PASTE actions' keyboard
>>>>> shortcuts (CTRL-X, CTRL-C, CTRL-V) with EMF's own.
>>>>>
>>>>> This is correct as long as the actions are performed on the tree.
>>>>> However, I implemented an editor based on eclipse forms, with text
>>>>> widgets (Windows native) handling the COPY CUT PASTE actions with
>>>>> a right click of a mouse. As the mouse actions work fine and
>>>>> interact with the windows' clipboard, pressing the keyboard
>>>>> shortcuts for the same actions in the text widgets will call the
>>>>> actions reserved by EMF ... This is problematic as the CTRL-X,
>>>>> CTRL-C, CTRL-V shortcuts are overridden with the EMF copy, cut,
>>>>> paste actions for the entire editor.
>>>>>
>>>>> Is there a possible way to register the actions for the editor's
>>>>> tree only? (See picture)
>>>>>
>>>>>
>>>>>
>>>>> I have a CustomEditingDomainActionBarContributor.java replacing a
>>>>> few small things from the original
>>>>> EditingDomainActionBarContributor.java class, but I don't want to
>>>>> manage the registering / unregistering the copy, cut and paste
>>>>> actions when the tree is in focus or not.
>>>>>
>>>>> Any help appreciated
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Mircea
>>>>
>>>
>>>
>


--------------040700020803000804040900
Content-Type: multipart/related;
boundary="------------060305050908010501090008"


--------------060305050908010501090008
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Mircea,<br>
<br>
Wow, lots of good helpful details!&nbsp; I hope we have some time for forms
even for this release.&nbsp; It would be really good to add your comments to
<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108470">https://bugs.eclipse.org/bugs/show_bug.cgi?id=108470</a>
so we can track all the folks who have been contributing towards the
forms stuff in various ways.&nbsp; We hold contributors in high regard!<br>
<br>
<br>
Mircea Luchian wrote:
<blockquote cite="mid:fnq7sm$7bu$1@build.eclipse.org" type="cite">
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
Hello Ed, <br>
<br>
I agree with your point on the properties view. It's purpose is
justified for requirements not needing GUI validation, however, to
implement on the spot GUI validation, the Properties view is not
sufficient. For this reason, I believe an effort in 4.0 should be
reserved towards the adjustment of the JET templates to generate an EMF
editor using eclipse forms. <br>
<br>
Here are the main changes I made. I feel that some of them could be
improvements made for 4.0 whenever possible.<br>
<br>
<ul>
<li>I created a composite panel for every node in the tree. I
modified the ObjectDetailsPage and removed the SampleSection inner
class. I replaced it with a DetailsSection class responsible to create
the panels and update them in function of the "Object input" variable<br>
<br>
<font face="Courier New">private void detailsPageSwitch(final
Object input)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp; sampleSectionHolder = new DetailSection(toolkit, input,
adapterFactoryItemDelegator, adapterFactoryLabelProvider,
mform.getMessageManager(), this);<br>
&nbsp;&nbsp;&nbsp;&nbsp; ScrolledPropertiesBlock.setDetailsPage(this);<br>
&nbsp;&nbsp;&nbsp;&nbsp; sampleSectionHolder.createSection(input);<br>
}<br>
<br>
public void update()<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp; detailsSection.setText(adapterFactoryItemDelegator.getText(i nput)); <br>
&nbsp;&nbsp;&nbsp;&nbsp; detailsSection.layout();<br>
&nbsp;&nbsp;&nbsp;&nbsp; ScrolledPropertiesBlock.setDetailsPage(this);<br>
&nbsp;&nbsp;&nbsp;&nbsp; sampleSectionHolder.updateSection(input);<br>
}<br>
<br>
</font>With the detailsPageSwitch(), I pass the message manager
of
the managed form (mform) SrolledPropertiesBlock class to every panel.
As such, the panels now have control on the message manager and can add
/ remove errors depending whether the user types in a widget or
switches from the one node to another. <br>
<u> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
</u><br>
</li>
</ul>
<ul>
<li>There is one "problem" with radio buttons (A = "true" and B =
"false" initially) attached to boolean attributes in EMF.<br>
<br>
<img src="cid:part1.01060806.08090601@ca.ibm.com" alt=""> and <img
src="cid:part2.05030804.08080306@ca.ibm.com" alt=""><br>
<br>
As radio buttons are mutually exclusive, setting B, unsets A
automatically. This will register as two actions in the EMF's command
stack (B = "true", then A = "false"). If the user presses undo once,
the B radio button will be "false"&nbsp; leaving&nbsp; A radio button "false" as
well.&nbsp; The user must execute a second undo action to revert to the
initial state. <br>
<br>
To prevent this from happening, I had to "hack" the <font
face="Courier New, Courier, monospace">EditingDomainActionBarContributor</font>
class located in <font face="Courier New, Courier, monospace">org.eclipse.emf.edit.ui.action</font>&nbsp;
so I can call cutom Undo and Redo actions. <br>
<br>
I created the following and put all custom code in my plugin:<br>
<br>
<font face="Courier New, Courier, monospace">public class
CustomEditingDomainActionBarContributor extends
MultiPageEditorActionBarContributor implements IMenuListener,
IPropertyListener {<br>
[....]<br>
<br>
&nbsp;&nbsp;&nbsp; protected CustomUndoAction customUndoAction;<br>
<br>
&nbsp;&nbsp;&nbsp; protected CustomRedoAction customRedoAction;<br>
[....]<br>
}<br>
<br>
</font>Custom Undo/Redo actions call themselves recursively if
they
detect that variables reserved for a group of mutually exclusive radio
buttons are all set to false<br>
<font face="Courier New, Courier, monospace"><br>
public class CustomRedoAction extends RedoAction {<br>
<br>
&nbsp;&nbsp;&nbsp; @Override<br>
&nbsp;&nbsp;&nbsp; public void run()<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; super.run();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MyEditor.updateFromRedoUndo();<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Command mostRecentCommand =
domain.getCommandStack().getMostRecentCommand();<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (mostRecentCommand instanceof SetCommand)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SetCommand mostRecentSetCommand = (SetCommand)
mostRecentCommand;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; EObject owner = mostRecentSetCommand.getOwner();<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
/*********************************************************** ************************************************ <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* </font><font face="Courier New, Courier, monospace">MyNodeImpl
</font><font face="Courier New, Courier, monospace">OWNER<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;************************************************** ********************************************************/ <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (owner instanceof MyNodeImpl)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!((</font><font
face="Courier New, Courier, monospace">MyNodeImpl</font><font
face="Courier New, Courier, monospace">) owner).isReadOnly()
&amp;&amp; !((</font><font face="Courier New, Courier, monospace">MyNodeImpl</font><font
face="Courier New, Courier, monospace">) owner).isReadWrite()
&amp;&amp; !((</font><font face="Courier New, Courier, monospace">MyNodeImpl</font><font
face="Courier New, Courier, monospace">) owner).isWriteOnly())<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; run(); // RUN AGAIN TO SET THE RADIO BUTTON THAT
WAS DESELECTED<br>
[....]<br>
</font><u> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
<br>
<br>
<br>
</u></li>
<li>The eclipse forms panels (with every widget bound to the model)
was not updated during an Undo or Redo action. I added both actions a&nbsp; <font
face="Courier New, Courier, monospace">MyEditor.updateFromRedoUndo();</font>
statement that calls the editor to refresh the current selected panel
in the Scrolled properties block: <br>
<br>
<font face="Courier New, Courier, monospace">public static void
updateFromRedoUndo()<br>
{<br>
&nbsp;&nbsp;&nbsp; try<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if
(scrolledPropertiesBlock.treeViewer.getTree().getSelection() .length !=
0)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; scrolledPropertiesBlock.getObjectDetailsPage().update();<br >
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; catch (Exception e)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; }<br>
}</font><u><br>
</u><br>
This update mechanism for the eclipse forms does not exist on the EMF
example found on the net.<br>
<u> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;
</u><br>
<u> <br>
<br>
</u></li>
<li>I added error and warning status variables for every node in
the
model. This is really custom work, however with the usage of the
eclispe forms' message manager, this complements very well the user
experience. <br>
Data can have errors or warnings in the panels, so I changed the item
providers for every node to display the icons in an error/warning
state. Whenever we use validation on such panels, the nodes in the tree
must reflect these same error states for later correction (say the
errors exist but the user chooses to save/closes his file and chooses
fix the errors later during the day; he must then know where the errors
are...).<br>
<br>
I also made the parent nodes aware if their children have errors or
warnings so they can be propagated to the root node. This makes the
errors easier to search if the nodes are collapsed. How the
error/warning flags are initialized on the faulty node is custom
implementation, however, the error propagation to the parent nodes is
performed in the model's implementation classes. Only the latter
mechanism could be accomodated in a future version of EMF. See pictures
below for a better understanding. I had to hide some information as the
product is still under development. <br>
<br>
1.<img src="cid:part3.01050608.06060202@ca.ibm.com" alt=""> <br>
2.<img src="cid:part4.07050308.05060709@ca.ibm.com" alt=""><br>
3.<img src="cid:part5.00080906.08050204@ca.ibm.com" alt=""><br>
4.<img src="cid:part6.08010708.04050605@ca.ibm.com" alt=""><br>
5.<img src="cid:part7.04050708.02000902@ca.ibm.com" alt=""><br>
6.<img src="cid:part8.08070005.08090901@ca.ibm.com" alt="">No more
errors / warnings in the tree<br>
<br>
</li>
</ul>
Thanks, <br>
<br>
Mircea<br>
<br>
<br>
<br>
<br>
<br>
Ed Merks wrote:
<blockquote cite="midfnn379$99b$1@build.eclipse.org" type="cite">Tom,
<br>
<br>
All that command stuff came long after we'd already done the EMF.Edit
support.&nbsp; It's impossible to keep up with the Jone's when there are
dozens of them and only two or three of us.&nbsp; Maybe an Eclipse 4.0
effort would allow us to throw away some of the cruft and focus on
supporting only the latests and greatest patterns. <br>
<br>
I'd be happy to provide hooks for whatever solution works well for this
type of scenario.&nbsp; I hope we can find at least a bit of time this
release to look at how to support forms and exploit data binding.&nbsp; I'm
kind of sick and tired of the limitations of the crummy properties view
(which doesn't even work for RAP). <br>
<br>
<br>
Tom Schindl wrote: <br>
<blockquote type="cite">Ed Merks schrieb: <br>
<blockquote type="cite">Mircea, <br>
<br>
Gosh, I don't have a lot of experience with this type of thing.&nbsp;&nbsp; I
hope someone else has some clue, because I won't even know where to
begin.&nbsp; Maybe Tom will read this and have an idea... <br>
<br>
<br>
</blockquote>
<br>
Tom has read it :-) I'm not really skilled when it comes to all those
key-binding thingies. <br>
<br>
But the following could work. If your TextWidget receives focus I'd try
to reset the copy/cut/paste actions to their original counter parts: <br>
<br>
widget.addFocusListener( new FocusListener() { <br>
&nbsp;&nbsp;&nbsp; IAction emfcutaction =
actionBars.getGlobalActionHandler(ActionFactory.CUT.getId()) ; <br>
&nbsp;&nbsp;&nbsp; IAction emfcopyaction =
actionBars.getGlobalActionHandler(ActionFactory.COPY.getId() ); <br>
&nbsp;&nbsp;&nbsp; IAction emfpasteaction =
actionBars.getGlobalActionHandler(ActionFactory.PASTE.getId( )); <br>
<br>
&nbsp;&nbsp;&nbsp; IAction standardCut = ActionFactory.CUT.create(....); <br>
&nbsp;&nbsp;&nbsp; IAction standardCopy = ActionFactory.COPY.create(....); <br>
&nbsp;&nbsp;&nbsp; IAction standardPaste = ActionFactory.PASTE.create(....); <br>
<br>
&nbsp;&nbsp;&nbsp; public void focusLost(FocusEvent e) { <br>
<br>
actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), emfcutaction);
<br>
actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,emfcopyaction);
<br>
actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),emfpasteaction);
<br>
actionbars.updateActionBars(); <br>
&nbsp;&nbsp;&nbsp; } <br>
<br>
&nbsp;&nbsp;&nbsp; public void focusGained(FocusEvent e) { <br>
actionbars.setGlobalActionHandler(ActionFactory.CUT.getId(), standardCut);
<br>
actionbars.setGlobalActionHandler(ActionFactory.COPY.getId() ,standardCopy);
<br>
actionbars.setGlobalActionHandler(ActionFactory.PASTE.getId( ),standardPaste);
<br>
actionbars.updateActionBars(); <br>
&nbsp;&nbsp;&nbsp; } <br>
}); <br>
<br>
If this works it would be great if the
EditingDomainActionBarContributor would provide a possibility to
restore the actions. <br>
<br>
Another possible solution that comes to my mind is usage of the
commands framework. I don't know if COPY/CUT/PASTE are handled by
commands (but Paul knows so I've added eclipse.platform to the CC list
:-). <br>
<br>
Tom <br>
<br>
<blockquote type="cite">M. Luchian wrote: <br>
<blockquote type="cite">Hello, <br>
<br>
The EditingDomainActionBarContributor.java class defined in the EMF
plugins overrides the Windows CUT/COPY/PASTE actions' keyboard
shortcuts (CTRL-X, CTRL-C, CTRL-V) with EMF's own. <br>
<br>
This is correct as long as the actions are performed on the tree.
However, I implemented an editor based on eclipse forms, with text
widgets (Windows native) handling the COPY CUT PASTE actions with a
right click of a mouse. As the mouse actions work fine and interact
with the windows' clipboard, pressing the keyboard shortcuts for the
same actions in the text widgets will call the actions reserved by EMF
.... This is problematic as the CTRL-X, CTRL-C, CTRL-V shortcuts are
overridden with the EMF copy, cut, paste actions for the entire editor.
<br>
<br>
Is there a possible way to register the actions for the editor's tree
only? (See picture) <br>
<br>
<br>
<br>
I have a CustomEditingDomainActionBarContributor.java replacing a few
small things from the original EditingDomainActionBarContributor.java
class, but I don't want to manage the registering / unregistering the
copy, cut and paste actions when the tree is in focus or not. <br>
<br>
Any help appreciated <br>
<br>
Thanks, <br>
<br>
Mircea </blockquote>
<br>
</blockquote>
<br>
<br>
</blockquote>
</blockquote>
<br>
</blockquote>
<br>
</body>
</html>

--------------060305050908010501090008
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: <part1.01060806.08090601@ca.ibm.com>

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRof
Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwL DBgNDRgyIRwh
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjL/wAAR
CAEWANwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1Cw0O0urKOZ94Zs5C4x1I 9KSTTdDikaOS
+jR1OCrTICPwxWno/wDyCof+Bf8AoRrCudY1Kzd4LLVtNtFWSXdFdWLzPuMr nO4TJgEEcY98
88b1JtTl6mUYrlRox6Bp0sayRyO6NyGVlIP44rK1SGy00nFld3IWGWdzE8Y2 Rx7Q7Hdj+8OB
k10Gjyebpwl6+ZLK4PqDIxz+tYPiiG1f+zXujYoq3si+bexB41BjlOCCRwSF 7jkD0p05Nysx
SStdF06JaqCzI+0cnDjOP++as/8ACN2PrL+a/wCFcx4fuZ59cvC+qLdxtFcM PLeco/7xcFVc
bAFHy/Kx69T1rW8Z2f286Nb/ANmWGp7rxj9lv22xNiGTqdj8jt8v5UVXKDsV CKZo/wDCN2Pr
L+a/4Uf8I3Y+sv5r/hWvRWXtJFciMj/hG7H1l/Nf8KP+EbsfWX81/wAK16KP aSDkRkf8I3Y+
sv5r/hR/wjdj6y/mv+Fa9FHtJByIyP8AhG7H1l/Nf8KP+EbsfWX81/wrXoo9 pIORGR/wjdj6
y/mv+FH/AAjdj6y/mv8AhWvRR7SQciMj/hG7H1l/Nf8ACj/hG7H1l/Nf8K16 KPaSDkRkf8I3
Y+sv5r/hR/wjdj6y/mv+Fa9FHtJByIyP+EbsfWX81/wo/wCEbsfWX81/wrXo o9pIORGR/wAI
3Y+sv5r/AIUf8I3Y+sv5r/hWvRR7SQciMj/hG7H1l/Nf8KP+EbsfWX81/wAK 16KPaSDkRkf8
I3Y+sv5r/hR/wjdj6y/mv+Fa9FHtJByIo6P/AMgqH/gX/oRq9VHR/wDkFQ/8 C/8AQjV6nV/i
S9WEPhQVCbcFiRI6gnOBj+oqasbWnMc8RW0s7txDIUhvJCkRbfHyWCPggFsf KfTjOahDYWPh
6wtrp7+NJluJ1YyZlYj5yGYAHpkjsB+FaskojIG0sT0ArB0i4ml1FN+nabZS +VJmOxmMiMu6
PBLGNDkZbjH488S+JXuF0G+ZY4vMFpLwZCBjaNxzt6jnAxzgdM8Wm5yV2CXQ 1BexmVogrGRV
DMgZcgHIBIz0OD+RqaOQSKSAQQcEHtXiU4lSS8P2azAWBCCr8jryOOteyW7S fZJWlVUlxllR
iwVtozg4GR74FXXpKlG9zapS5Gtb3LlFcj4DkL2H7y01mGd7a3lkk1G8a4WY sG+aPMjhRkHI
G08jI6V11YtWdjIKKKKQBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAUdH/5BUP/
AAL/ANCNXqo6P/yCof8AgX/oRq9WlX+JL1ZMPhQVFPa29yALiCKUDkCRA2Pz qWisyiCCztbZ
i1vbQxEjBMaBc/lS3FuLhdrbSCpUq67gQeoIqaqupSPFpd3JGxV0hdlI7EKa abuJ2SMtPDGk
LeOy6bp4k2Jn/RlwBlsYXPB684545OONlIxGj72BzyxIwOn/ANaucvdRETXU MejazD5aybL2
S/RosqDtbaJy5BwMAp3GQOa6CeRjBKPKcDaw3EjHQ+/sPzHvinJy3YXfUqnV 9IscWpure38p
QoiOE2DHAx2GMUSzRazaGPT9Wltzux9otBGzAjkr86Mv6Zqlb3y2+oamh1Kx tT9oU7LgZY/u
o+fvjj8O1SaVMLi+vZBPDODeD95D9w/uE6cn+dc8ZylNxa7lbI1LO2+yWkcB nmnKDmWZtzue
5PQdewAA6AAcVPXK311qr+NUtbd9WNlFFA7rZi08obncMZTL+8xhR/q+cA45 xXVVruK1tAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAKOj/APIKh/4F/wChGr1U dH/5BUP/AAL/
ANCNXq0q/wASXqyYfCgooorMoKbJGksTxyKGRwVYHuD1p1FAGX/YWnmZg0Uj DAOGlkIPXqS2
D9P8a0pE8yJ0zjcCM0xR/pUhx1RRnHu3fH9T9B3louwsY32TV7W5upbW5slj uJVkKS27yMp2
KnUMOPlB6cc1Np9jdwTzzXk0Eks03mkwoUA/dqgABJ7LnOavTjMYGM/Oh6Z/ iHsf89x1AJ0O
MCTnHWNh6e3uP19DiVGKd0tQI/KtYLyS5JVJ5UVHYv1VSccf8Cb86l+0Qf8A PaP/AL6FZOp3
EkbQuj3UcTzgSvBAZHVfKJHy7WI+YKOneq8d0WvrRLe61OdXkIlFxZGNAmxj ncYl/iC9+9Dm
lLlsws7XOiorOvNSj0rSYrmWKaUExRBIV3MWdgowMjuRTtK1QapDMxtLi0mg lMUsFxs3o2Ae
qMynIYHgnr61QF+iiigAooooAKKKKACiiigAooooAKKKKACiiigCjo//ACCo f+Bf+hGr1UdH
/wCQVD/wL/0I1erSr/El6smHwoKKKKzKCiiigCFSv2yQcbvLTPrjLe317/gO 81RKf9KkGeiK
cZ927Z/oPqe0tAENyVES7sY8xOvruGOx/wA9x1qaopziMHOPnQdcfxD3H+ex 6EFxA2MTRnOM
YYc5xj/0JfzHrQBG6SLK5EZYMcggj0A7n2rJ8O2F/pulG1u7ZVcTyyL5dwZs q7s4yzAEkbiM
nOcZzzgW7q5jWVCIGummkCRLHtOfk3dWIGMAnrUfn7J4Ip9Mmg85yiO/lEZC lsfKxPRT2qva
xXutkcrepduLCO7s4YJmYCJ4pMof4kYMOo6ZFOtbGK0uLuaMuXupRK+48AhV XA9sKKGuVttO
+0yiVlSMMwjjaRzx2VQWY+wBNR6bqltqsTS2pk2KdrLLC8Tq3cMjgMp6HkDg g96l7/1/XQvo
XaKKKACiiigAooooAKKKKACiiigAooooAKKKKAKOj/8AIKh/4F/6EavVR0f/ AJBUP/Av/QjV
6tKv8SXqyYfCgooorMoKKKKAIlP+lSDPRFOM+7ds/wBB9T2lqJR/pUhx1RRn Hu3fH9T9B3lo
AinOIwc4+dB1x/EPcf57HoZainGYwMZ+dD0z/EPY/wCe46iWgDNvbKK6kxOs /wAsgkjaF3Qg
7dudyEHoSPxqGPTbaOeKb/TpHiJZPOuJ5ACQRnDEjOCR+NWLu6jgkPnNN80g jRYldiTt3Ywv
PQE1Cl9A80cX+mI8hKp5sUyAnBOMsAOgP5UN07pO1ybS6DtW0p9V0JtPEqws 6pkuhdDgglXU
MNynGCuRkEioPDXh5fD1tcxIbUCeXzTHaWot4kO0AhUBOBxnr3rUNzHBY/ab mZIokj3ySSMF
VQBkkk8AVT0bXLTXUu5bGaCe2gn8lJ4JhIknyKxII46tjv0otqyuiNOiiigA ooooAKKKKACi
iigAooooAKKKKACiiigCjo//ACCof+Bf+hGr1UdH/wCQVD/wL/0I1erSr/El 6smHwoKKKKzK
CiiigCJR/pUhx1RRnHu3fH9T9B3lqFQv2yQ8bvLTPrjLe/17fie01AEU4zGB jPzoemf4h7H/
AD3HUAt4FxiGMYxjCjjGMf8AoK/kPSkuQpiXdjHmJ19dwx3H+ex6VNQBk3to kkiBbl7RoJRJ
E0WwEfIU6MCMYJHSoxalrmCa41e4uBA5dEk8kLuKlcnagPRj3qzeXskEyIiT SPJJ5SRxbMk7
C/8AEQOgPeo/ttyk8EU9veQec5RHcwkZClsfKxPRT2qW6fMr7itK2gmr6fPq GhLbwLCZ0aGZ
EnyEdo3VwrEAkA7cZwcdcHGKNEsr62a/uNQW3Sa7uBL5dvIzqg8tFxuKqScq ecDtVu4v47Sz
hnmViJXijwg/idgo6npk1bqvP+un/AH0sFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFAFH
R/8AkFQ/8C/9CNXqo6P/AMgqH/gX/oRq9WlX+JL1ZMPhQUUUVmUFFFFAESn/ AEqQZ6Ipxn3b
tn+g+p7S1EoP2qQ5bGxeMnHVunGM/j6dO8tAEU5xGDnHzoOuP4h7j/PY9CCB BjBk4x1kY+nv
7D9fU5JwTGMFh86fdJB+8PQHj/PHWpaAMy5sYLpvLl8391IGRkmdGB2bc7lI PQkde9Y3hlrb
VrJNQaYzTwXMyYjv5biNCrMgI3MQSUIOcDIbOBmtu+uooZB5qKSX8tAIGlZj t3cBeemfyqBL
yB5o4vJ2PISqebYyICcE4ywA6A/lT5qd7StfQm0t1sLqlrPeaRax26b3We3k I3AfKsisTn6A
1keB9Gn0gXqyaY1nG4jCvOkP2iZhuLNI8LlZOWGGKqx53ZPJ6yN/MiR8Y3AH FIJY2laISKZE
AZkB5UHOCR74P5Gja5Seg+iiikAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBR 0f8A5BUP/Av/
AEI1eqjo/wDyCof+Bf8AoRq9WlX+JL1ZMPhQUUUVmUFFFFAESj/SpDjqijOP du+P6n6DvLUK
/wDH5JyP9WnGBnq3fr+fHp3qagCKcZjAxn50PTP8Q9j/AJ7jqAROMZnkOMdQ vPT29j+Z9sJc
8xLyB+8TqAf4h6//AK/TmpqAMu6smuZFxdTwywSh0ljCbs+XtOQykchj2rO0 j7RqsMF/dXd9
mC4mAt5/J+VkZ4uSiDnGeASOep61ty4aVsR5I4J8wrk49qqWenWenQmGy0+C 2iLbikDFAT0z
gDrwPyq+SL1a1Iu77lfxCJm8KSLBc3Nu5WMGW1t5JnC7lzhIyHIIyCUIYAkg 8VU8INft5xuo
L2CEwR+Ul1PLL/y0mzhpVV842cMAwGAeldNGVaJGUYUgED0FOqe5fQKKKKQB RRRQAUUUUAFF
FFABRRRQAUUUUAFFFFAFHR/+QVD/AMC/9CNXqo6P/wAgqH/gX/oRq9WlX+JL 1ZMPhQUUUVmU
FFFFAESn/SpBnoinGfdu2f6D6ntLUS7vtUmfu7Fx165bPt6dOfXtUtAEU5xG DnHzoOuP4h7j
/PY9CBZ+MyRnpnEZ9s9/978x6ck+7yxt6709em4Z6e34evGaloAxdTS4Zods U86rODOltL5T
MvlEcEsvG4qcZ/Oq8aSm+tDBp+p26LITM9zdh0KbGGMea2TuK9q2Jdvmtt83 P8WzbjOPf2xT
Of8Ap4/8cpOlGUlJk8zWhFfm7XQjJYuVuI41kUAA79uCU5B+8AVz1GeKTRLy TULaW+Mpe3uJ
DJajaAFiwAuD33bS+T/fFaMe3yk2fcwNv0p1PqV0CiiigAooooAKKKKACiii gAooooAKKKKA
CiiigCjo/wDyCof+Bf8AoRq9VHR/+QVD/wAC/wDQjV6tKv8AEl6smHwoKKKK zKCiiigCJR/p
Uhx1RRnHu3fH9T9B3lqFf+PyTgf6tOcjPVu3X8+PTvU1AEU4zGBjPzoemf4h 7H/PcdQBp+Mx
xjpnEh9s9v8Ae/IevCXPES8A/vE6kD+Iev8A+v05qagDmNauoTf2ttJHbTTi dJHgnDmLDIyK
GcIwXLH5dwG4jA5qC6kg02+sJbrT9M01VkZg9uzO8vyMvlqBEMsSwIXOTg4B xxpaho1tdaqL
s3MyMfKMsSJuWQxtvj3cZG1jngjOecjis/U/Cen6y0UmpTPczRLhJXtV3AgA AkhRkAhm2nKk
u2QRgCvYUpSU5GbnNJpGxqd8+naAbiI/v9iJCPJMu6RiFUbdy5ySByyj1IHN UvDGq6nqkcw1
KJILi1lkgmjEaqWOEZThZZAvDEEbm9cjpTPEOsaLoOmWun6hYm5sriMxrAkK PGUUKMFSQMcj
isay8f8AhjTYPIsdKuLWEf8ALOC3jRegHQNjoAPwrWOFq1FzRjdP/P8A4f8A pClWhF2b1/4B
3tMSKONpGjjRWkbc5VQCxwBk+pwAPwrjf+Fn6L/z66h/37T/AOLo/wCFn6L/ AM+uof8AftP/
AIuq+p1/5WL6xS/mO1oriv8AhZ+i/wDPrqH/AH7T/wCLo/4Wfov/AD66h/37 T/4uj6nX/lYf
WKX8x2tFcV/ws/Rf+fXUP+/af/F0f8LP0X/n11D/AL9p/wDF0fU6/wDKw+sU v5jtaK4r/hZ+
i/8APrqH/ftP/i6P+Fn6L/z66h/37T/4uj6nX/lYfWKX8x2tFcV/ws/Rf+fX UP8Av2n/AMXR
/wALP0X/AJ9dQ/79p/8AF0fU6/8AKw+sUv5jtaK4r/hZ+i/8+uof9+0/+Lo/ 4Wfov/PrqH/f
tP8A4uj6nX/lYfWKX8x2tFQWd0l9Y293EGEc8ayqG6gMMjPvzU9c7VnZmydy jo//ACCof+Bf
+hGr1UdH/wCQVD/wL/0I1eq6v8SXqyYfCgooorMoKKKKAIlP+lSDPRFOM+7d s/0H1PaWolJ+
1SDDY2Lzg46t05xn8PTr2loAinOIwc4+dB1x/EPcf57HoQSucZgkGcdSvHT3 9z+R9sk5IjGA
x+dPugk/eHoRx/nnpUtAGLqd+bNoWaeC0WecI8lyMrH+6Lc/MBnKgde9V49W Rr60gi1fTL3z
pCjR2w+dQEZt3+sbjKgdO9bEv7uVjviG7nDvtPTH9KZ5n/TS3/7+/wD1qTpy clJSJvbSxx/j
iwTUZNEgkn8hBBcSNJs3YCojdMj0rj18OW76Z9s/tJEMiPLAkvlIXVSQMgyb gx2nAVWHTnrj
u/Gmj6xejTTpEPmtDHNFIdyLhXVV/iPcZrlY/DXjGOxFn/Z8TwruCCX7O7Jn rtZslfXgjnmv
cwtVKjFKaXq13f8AwDz60L1G3Fv/AIZf8EqnwiPKjk+2tGFbFykqJvhARnPy pIxzhSMNtOce
+LB0jTr2zsorVWZvJik85oxG7IZ3RywBI/iTkk8LVttJ8dsQfssakSeaSgt1 3tgjLY+9kMQc
5znmo20Lxw04m+yKjiBrceW0CARnOVABAHU1s6re9SP3kKCX2H9xVfQtOuTK 8R+yw3Debbt8
0hjjWEyOuM88so59Kih0fTDYTTSySlTZCaF0g+bPn7MsDJjOMDAOMH1HNoeG vGgigiFp8kET
xRjzYflV87h15zk0Q+GvGcCqqWSlFhMAR2gZShbdggkg/Nzk80/aL/n4vv8A 68vxDlfWD+70
/wCD+Bla14fi0i3LDUYZp0k8qWEPHkHByVCuzYBGPmCnkcemY8NuqWpjuPNe QZlj2FfLO7GM
98jByPWuovfDPjHUIwt1p0MhBBMn+jrI2Bj5nHzN+JNQy+EPFs8NtFJY7ktl KxDzohtBJb+9
zyT1rSFeCS55q/qjOdKTvyxf3FyTT9FGu3FksOkmOEzfKrXm9QiMRvJOCAQM 7efSqN5omnSR
xXv2hLWzaONd9pG8qySMzj5VkYMAAhzuOcjgc1onSPHDTmc6dZ+cxYs4gtAz bgQcnHOQTnNN
TRfHMczSLZxYKqvlkW5jAU5GI/ujBJOQOpPqaxU0rfvF/wCBGrje/uP7jLPh UW8xtp7wfbws
siQrFlGSNmBy+eCdjEDB6DJGatat4YgWe+uTe29sWkmeC3zGo2q7ALguGydp ACoR0564nGg+
OBbPb/ZtyPuyzSQs/wAxywDk7gCeoBwcn1NLJoXjaeKSOaxilDs7ZlFu7KWO W2k8rzz8uOea
ftXdP2kfvQuRa+4ykPCCGFZHv2iCg+ekkaF4iI2flVkYj7pGG2n264xdTsIr L7NJb3DzQXMX
mozx+Ww+YqQQCR1U966qTR/HUsbo1pGFkJL7BbqXJUqSxGCSQx5PPNZ83gzx XPHDHJYblgTZ
GPOiG1ck4+96k1cK6vedRfeiZU9LKD+49S8Pf8i1pX/XnD/6AK0qpaPby2uh 6fbzLtlito0d
cg4YKARx71dr56o7zZ6sfhRR0f8A5BUP/Av/AEI1eqjo/wDyCof+Bf8AoRq9 Tq/xJerCHwoK
KKKzKCiiigCJR/pUhx1RRnHu3fH9T9B3lqFSv2yQcbvLTPrjLe317/gO81AE U4zGBjPzoemf
4h7H/PcdQCdDjAk5x1jYent7j9fQ4S5KiJd2MeYnX13DHY/57jrU1AGXc3Uk c8SW8SySXM2x
RK5jA/dl+flJ6L0xSPPe29xbR3Vtbqk8hjDR3DMQdjN0KD+6e9TXljDdlkub OO6iLBwsiqwB
xjo3fr+dQQaPY2syzW+kW8Mq/deOKNWHbgik4zck1LQV12JbzUo9K0mK5lim lBMUQSFdzFnY
KMDI7kVNYahFfrKER45YHEc8MmN0TlFfaSCQSA69CR70XFhHd2cMEzMBE8Um UP8AEjBh1HTI
qWC0htpbiSJSGuJPNk+YnLbVXPtwo6f1pjVrE1FFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFF
FAFHR/8AkFQ/8C/9CNXqo6P/AMgqH/gX/oRq9WlX+JL1ZMPhQUUUVmUFFFFA ESn/AEqQZ6Ip
xn3btn+g+p7S1Ep/0qQZ6Ipxn3btn+g+p7S0ARTnEYOcfOg64/iHuP8APY9C C4gbGJoznGMM
Oc4x/wChL+Y9aJziMHOPnQdcfxD3H+ex6GWgDLurmNZUIga6aaQJEse05+Td 1YgYwCetR+fs
ngin0yaDznKI7+URkKWx8rE9FPapr2yiupMTrP8ALIJI2hd0IO3bnchB6Ej8 ahj022jnim/0
6R4iWTzrieQAkEZwxIzgkfjQ1U5k09Cfd6ot3Go22m6bHd3s3lxfIpYqWJZi FAwMkkkgfjU1
peQXsRkgcnGAyspR0JUMAykAqcMDggHmq93p5vbC3gaTyzHLDKTjP3HVsde+ 3GaltLCKznvZ
oyxa7nE7g44bYicfgg65/lQUrWLVFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFAFHR/+QVD
/wAC/wDQjV6qOj/8gqH/AIF/6EavVpV/iS9WTD4UFFFFZlBRRRQBEo/0qQ46 oozj3bvj+p+g
7y1Eo/0qQ46oozj3bvj+p+g7y0ARTjMYGM/Oh6Z/iHsf89x1EtRTjMYGM/Oh 6Z/iHsf89x1A
LeBcYhjGMYwo4xjH/oK/kPSgCpd3UcEh85pvmkEaLErsSdu7GF56AmoUvoHm ji/0xHkJVPNi
mQE4JxlgB0B/Ki9tEkkQLcvaNBKJImi2Aj5CnRgRjBI6VGLUtcwTXGr3FwIH LoknkhdxUrk7
UB6Me9D9rzLltYn3epyXxLSW4i0XYjSP5czkKuTgBCTx2xk1wSadfSPsjsrh nwDtWJicEbge
ncAke1ejeObpbC78PTTK5jVZllVR8xQqisB74Jrmz4rgYMwimjkYTKSmOFKy CIZz28wg+wHW
voMJKcaEeVX3/NnmV4xdV8ztt+SMqLw3qc0czR20peCLzZIvJkDj59mMbeTk E+mAecgioYdD
1OWW2Q2U0QueYpJkKIwxknceMAc59KvwaxZfYktJxOq/Yfs7OiK2HE3mDgsM jGB1FX7rxVbS
3TToZWhuHLXFr9jhi4ZGU4lU7mI3nBI+tdDnWTaS7mSjTau2YsuhzmFZrGaH UULmNvsgclWx
nBVlDdATnGODzxQdBvktJnltriO4jlRPszQsHIZXbdjrwEPar9jrGnaPbzwW T3kvnhy80kax
lT5bogChj3cknP4UsPiBF0zTrWAOt1bywsHkwI8q8p5Oen7xf1ocqvRdgtDd +f8AwDnmhlRI
3aJ1WUExsVIDjOOPXnirdppc9zqDWUhW1lRXaT7QrLsCqWOQAT0HpU+vXVvc ay62nFnb4hg2
HPyL3B9zk/jU9nqttaeJJr5bi/8AJdZVSdsNONyFQx5AJBOetaOcnC6Wtn/w CeWKlZvqv+CR
x6DHLC8yazp5hR0jL7Z8bmzgY8vP8J7YqrPpF/bi5ZrSZobaQxSzIhaNWBwR uxj0/Ot6HxFD
HBPGdf10yyPG32nyhv2rvyn+u6fMD1/Cmy+JLCXdciCeKdIriGO1VVMJWVmO ScgjG88bTnaO
RWSnVT2uv68l/X43ywa3Mi20O8kdftEE9tG8Ek0ckkJAkCIW4zjOcDketQHS dSXyM6fdj7R/
qcwt+97/AC8c/hXRP4n09WvZI1u5HvXeWRZVXETGJ0Cqd3zDL9cDgDii68S6 fd3nnS+Y0Esv
nSWx0+EBX2thi4YGXax6MBkdaPaVb/D/AF/Xy08w5Kdt/wCv6+evkYA0TVmn aBdLvTMmN0Yt
33LkZGRj0BqTQVZPFGmI6lWW9iBBGCDvFauq+IrS60yO0tvP3KYtz+RHCrBG kJ+RDgffXA9j
VS0u0v8Ax5bXcYYRz6kkihuoBkB5p803F8y6MXLFNWfY9wooor5c9oo6P/yC of8AgX/oRq9V
HR/+QVD/AMC/9CNXq0q/xJerJh8KCiiisygooooAhUL9skPG7y0z64y3v9e3 4ntNUSn/AEqQ
Z6Ipxn3btn+g+p7S0AQ3IUxLuxjzE6+u4Y7j/PY9KmqKc4jBzj50HXH8Q9x/ nsehBAgxgycY
6yMfT39h+vqcgFa6vI7dmae6S3jDBAXZVBOM9T36/lUMOp2txKIodUhkkboi SISfwFNu7WeS
aJrWdIpbaYOplQyA/uymD8wP8Wc57U02+pT3VrJd3lq8cEhkCQ2rIWOxl6mR uPmz07Um6nMk
loTp3Lk1jZ6lDC97Z29wQuV82IPtzjOM9O35VD/wj2i/9AfT/wDwGT/Cmapb SXXh8rBEZZ41
jnhjDBd7oQ6jJIAyVA545pdA06bTLB4JmBLSeZx03Mql/wA33n8a0U5LRMfK mrsd/wAI9ov/
AEB9P/8AAZP8KP8AhHtF/wCgPp//AIDJ/hWlRR7Sfdi5I9jN/wCEe0X/AKA+ n/8AgMn+FMOg
6MJlT+w7IqVJMn2aPaCMceuTn0xwfatWmu6RRtJIyoigszMcAAdSTR7Wfdhy R7Gf/wAI9ov/
AEB9P/8AAZP8KYNB0YzMh0OyCgAiQ20eGzngd+Mdx3HXnGorK6hlIZSMgg5B FLR7SfdhyR7G
VFoOjSJubQ7KM5I2vbR54OM8Z69fx5xUP9kaV/aP2X/hGYPJ8vf9r+zweVnP 3cZ35/4Dj3rb
oo9pPuw5I9jKfQdGV41Gh2ThjgsttHhOCcnP5cZ60/8A4R7Rf+gPp/8A4DJ/ hWlRR7SfdhyR
7Gb/AMI9ov8A0B9P/wDAZP8ACnx6FpEMqSxaVYpIhDKy26AqR0IOODV+ij2k +7Dkj2CmRO0i
bmieM5I2uRng4zwT16/jzin0VBRR0f8A5BUP/Av/AEI1eqjo/wDyCof+Bf8A oRq9WlX+JL1Z
MPhQUUUVmUFFFFAESg/apDlsbF4ycdW6cYz+Pp07y1Eo/wBKkOOqKM49274/ qfoO8tAEU4Jj
GCw+dPukg/eHoDx/njrUtRTjMYGM/Oh6Z/iHsf8APcdQCJxjM8hxjqF56e3s fzPtgAil/eSs
NkR28ZdNx6Z/rTPL/wCmdv8A9+v/AK9UtTs5blodkNvd+TOHeO6basg8orzh Tzlgenaq8eny
/brSVdJ0yyWGQu728hZ2BRl248te7A9e1JzmpJKOhNlvcyPHniDVNHGlSadc NAs6yNIPLDA4
MZAOUI6bh94HBOAeq8YvjnxOu3OrM2MZzbxfNjb1wnfaf++2xj5dvY+MTbx3 2hzXMUDolnd7
fPQFd3loVGSvUkDA3DOOjYyvNwz6fJ4eD/ZLKWaWOU3JM9vCySZOCqFN+ANp AjIBxjHXPq4S
lSlTvKN9e/8AXY5K85qVlKxSXxz4nXbnVmbGM5t4vmxt64TvtP8A322MfLtt w+JfGsjWyRXd
xcPNH5kaR2sTs6ggE4VM9UbPT77dPl26Tx6MscSSHTnkhl2wStJb7Zv3b7Wd Y1G1d4Thycd+
+a1/MLvSF08XmnpftbxFxFLFHEwWSQmPcuEB+ZGxnBx64ro9jQe0Pz/rTqZK dTrL+v8Ag9DP
l8ZeLbOfybnUZkljIDpLaxK3G3qNgxnafT77Yx8u1X8YeLbaO3km1RtsqB0J hh+dQQCTheMl
G9PvtjHy7bU9/bWmjQRl7C71C3EMLySIk+FzKSq7gQQAUUkZHoelWbhNJvtV XTlaA2nkSFZI
cP5ISeR+COgKZH4im6FBbw0+fTqL2lR/a/puxjr458TrtzqzNjGc28XzY29c J32n/vtsY+Xb
asfE/ja+z9jubu78vbv8qyjf+712pxna3p99sYwu3JtZ1utbnnSLT4lkErLH cqFiUFTgADuP
4ffFXNDMb6HfQGGwnka4iYRXl15IwFfJB3pnGR371pPC0IxvydvxfqRGvUbt zd/yLza/48t4
DPM9+IYvvySWCBeCoOT5YxyrZ6ffbphdtFfHPiddudWZsYzm3i+bG3rhO+0/ 99tjHy7dYy20
VhAZF0yJY7KeJ5YbwPLEzNJhEXzDuB3AZweGJ3dw5/7I+0jzf7J8vzz/AGf5 ezbs8ttvnY5x
u8vPmc5znjNZKjQV7wv/AF6mnPUe0v6t/SMyPxh4t+yG6/tRnhidEdjDDyxA IBG3PPlt0/vt
0+XES+OfE67c6szYxnNvF82NvXCd9p/77bGPl27kEukiOKK9ew89miadIXjW IyhJtp+UFMcx
5IBXJ571FEbBr6SdrbT4pFjRDB9qsmWQFmy+7YUGAANqruPB+r9jQu17P8f6 /qwvaVbJ8xkL
458TrtzqzNjGc28XzY29cJ32n/vtsY+Xb0/gLxHrWr67JbahevcQpas/MSKN wMagkqgGfvH7
w+82AQBsyr6fSY7trK3TTTaNbXRMgSNm3hpPL+fqDwmMEZyOtJ8MVz4qnfbn FjIN23pl4+M7
eOnTcM46NjK44qjSWHlOMbPT87GtGpU9qoylff8AK563RRRXkHcUdH/5BUP/ AAL/ANCNXqKK
0q/xJerJh8KCiiisygooooAgQj7dKueREhxtHq3fqfp2/Gp6KKAILshYVJOP 3sY+6G/jHr/P
t1qeiigCrLhpWxHkjgnzCuTj2pm3/pl/5HaiitUtDJvUzdd8Laf4m+xS3Uk8 Yt1PliHYDhih
IJKkgYQDAI6nuFIx1+F2jLtzfak2MZy8fzY29cJ32n/vtsY+XaUVKqTjpGTX o2W4Rlq0n8gX
4XaMu3N9qTYxnLx/Njb1wnfaf++2xj5dovwu0Zdub7UmxjOXj+bG3rhO+0/9 9tjHy7Siq9vV
/nf3v/MXs6f8q+5Avwu0Zdub7UmxjOXj+bG3rhO+0/8AfbYx8u10Pwz0qD7m paoMqFfEsY3j
5cg4Todpz/vt0wu0ope2q/zv73/mHs4fyr7kNX4XaMu3N9qTYxnLx/Njb1wn faf++2xj5dov
wu0Zdub7UmxjOXj+bG3rhO+0/wDfbYx8u0op+3q/zv73/mHs6f8AKvuQL8Lt GXbm+1JsYzl4
/mxt64TvtP8A322MfLtF+F2jLtzfak2MZy8fzY29cJ32n/vtsY+XaUUe3q/z v73/AJh7On/K
vuQL8LtGXbm+1JsYzl4/mxt64TvtP/fbYx8u0X4XaMu3N9qTYxnLx/Njb1wn faf++2xj5dpR
R7er/O/vf+Yezp/yr7kC/C7Rl25vtSbGM5eP5sbeuE77T/322MfLt0tA8E6f 4dvze2txdTTG
Ewkz+WeDszyEBHKZ4OMseOF2lFTKrUkrSk2vVjUIJ3SX3HS0UUVBR//Z
--------------060305050908010501090008
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: <part2.05030804.08080306@ca.ibm.com>

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRof
Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwL DBgNDRgyIRwh
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjL/wAAR
CABnAIEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD28kKCSQAOpNM84f8APOf/ AL8P/hSyDIQf
9NE/9CFZGr366Xp0166GRl+6mcF2JwBn3JrSEObQmUrGt5w/55z/APfh/wDC jzh/zzn/AO/D
/wCFco3ieNdKsr02km6e5FtJEMsYmyQegOSMcDqami8R2z6je20kM8UdrGsh laGTkFSx3Db8
uMd+vatvq0tdDP2q7nS+cP8AnnP/AN+H/wAKPOH/ADzn/wC/D/4Vy114ntPJ c2M0EzeTI67t
/wB5EDYxtweCM8j061LaeJLCTTknupvKlWKN5lMLrgvwCARkjPcZHvR9Wla9 mHto9zpPOH/P
Of8A78P/AIUecP8AnnP/AN+H/wAK5vUfEVrYlVjR7hhdrbSqqt8hPOfunJx2 HWrMmtadFII5
JXVvkBJhcBC33QxxhSfRsGp9g7Xsx+0W1zb84f8APOf/AL8P/hR5w/55z/8A fh/8KyrfUbS7
uHggaSRkYqzLC+wEdRvxtz+NXNlS6aW5SlfYs+cP+ec//fh/8KPOH/POf/vw /wDhVbZRspcs
Quyz5w/55z/9+H/wo84f885/+/D/AOFVtlGyjliF2WfOH/POf/vw/wDhR5w/ 55z/APfh/wDC
q2yjZRyxC7LPnD/nnP8A9+H/AMKKrbKKOWIXZdxlk/31/mKxtX0Uau9osk7J bwS+a8aZBkIH
HzAgjB5raBwQfQ5pMVMJuDuhyipKzOUfwht84W98yRm7jvIkkQybHXrklssD 9Qanl8O3Etzq
Ev26Ifb7dYpx9nPBCldy/PwOc4OfrXSYoxWn1ip3/rT/ACJ9lHsczdeFftEN jGLvZ9ltJLXP
lZ3bkC7uvGMZxVZ/BjT2ssc+oBpTbxW8TpBtCLGwYZBY5JIHcV1+KMU1iqq2 f9XuS6EH0/rb
9DlW8KzSJM8l+huHvUvA625CBlGMbd+SPxp58LA6lLes1jM8+xpRcWQkwwGC UO4FQfQ5rp8U
YpfWanf+v6Q3Rg91/X9M5yy8NLaa6+prLHGX3boreNow+em/LkHHsBzzW7sq bFGKidWU/iKj
BRvYh2UbKmxRip5irEOyjZU2KMUcwWIdlGypsUYo5gsQ7KKmxRRzBYKKKKkZ z95qVzcTXJiu
xYWFq5je4EYd5HGM7c5AA5HIJJB9ObFhfXCXMEFzcR3cF0he1u41C7sAZVhn GcZIIwMA8DHN
C/02NEu7K9trqXTbiVriOa0Qs8DtywKjJOWLEEA9SCPW1ptkGksUgs5bTTNP DGBJxiSWRhje
RnIADOOeSWPTu/e5nty2+dzBOfP5f1+BBLrutS32qRafpGnzW+nyiJ5LjUXh Zz5aSHCiFgBh
wOW7dqsf8JZpK2lhcTSTRC9gW4VfId/KjbGGkKgiNefvMQODzwaytQ8Aadq8 2tXF/aWTXl3c
rNaXnkq8sG2OMLksOgdCdvIIPPUiodX8K6rql0l7Its1zc2SWt3Gmp3VvFGV LHcBFgyqd7fI
23pgMMmhW0v5fl/n9x0NK+h0c/iLTLbUlsJZpBMXVCywSNGjtjarSBdiMcjA YgncPUZrXPiq
yi1qz0uFZJpp7o27N5brGpEbucOV2uRtwVByM89Ky9Z8OazqOqoyTRNZxXFv PATfTRCJY2Rm
jMKrskyUJ3OxI3cAYqaLQtXh1KzhX7CdNtdRlvRKXbznEglJXZswCGk+9u5A 7UK2l/62/wCC
Gln/AF0/zN977GrxWCx7i0DTO+fuAFQBj3yf++TWW3ifA07Fpk3Nw8EwEh/c bJPKJ+783zlR
2657YrSt7KRNYvb6VlIlSOKIA/dRcnn3LM34AVkv4euXuNZJkh8q4T/QhzmJ 2+Zy3H98KeM1
PqIsp4nsftP2eXessk8sNuscbymQRsEdjtU7QHOCTwMZzVKx8b2NzcTxzI8U UOnwXzXCxytG
wkz8qkxjPRcd2JIC5Uip7PQbqC+024kkhJgsJ4Z8MctLK8bkjI6ZVuvPI4rD /wCEI1E6Wlm0
1vxpllAXSeSMie2cuACqghGzjeCGXGQD2tJW13/4f/hylytf13/yOy07UrXV bYz2rSFVYoyy
xPE6MOzI4DKcEHBA4IPQirdYnhrSZ9KtLj7TGkc083mFVvZ7sgBQozLN8zHj 0UDgY4ydukyQ
ooopAFFFFABRRRQBDc3dtZwma6uIoIh1eVwoH4mnxTRTxLLDIkkbchkYEH8R WHp1omo6neX9
0okmiuHgiVwD5KKcYX03Y3Z/2h6VPJZxaXrtk9mojW9MiTwoAFYhdwkI9RgL nvuHpVWWxPM9
zYorzTWLxYdU8RXN9aeI57e3u0iS4sdVaCC3Bhi+8onTADMWLbCADkng409Q 8TaxpM9tpu0X
N7a2EVxdmLTri5+1O2RtQxDEWSjfMwI+YfLwaSWif9bXLas7HcUVyOr+J7zT 9agjSW2a2a4g
t3tltJpZAZGQZeZT5cJG8EKwO4Ac/NxHJqer32r6TcrPbxaY+rS23kRhllIj SZTvbdtcFkzt
2jHHXFCVwtpf+u52VFc9e2x1nxHNp9zcXkNpa2scypa3MluZHdnBJaMqxChO Bux8xyPu4yrT
WtcmNpplpc2bTbL3deXcLSbxBMsanarJksG5OQM8j0pBZnbUVxOn+JLm4vW1 NjstpdO06eSF
mLLEJXlDlecAj5ST6LXV6Zcy3mmw3MyqrTAyKFBGEJyuQe+3GffNNxabTE9H Yt0UUUgCiiig
AooooAKKKKAM2fTJVvXvdPu/ss8mPNVoxJHKQAAWXIOQBjII4/CpLTTmiumv Lu5a6uyuwSMo
URrxlUA6AkAnqT61Bd6w63j2Vhafa7iMfvSZAkcROCAzYJyQc4APFS2WqG4u WtLq2e1uwu8R
swYOvGWQjqASAehHpV+9Yj3bkyabZp9txApF6++4DEsJDsCcg/7KgYHHFZ03 hPRriC2gkt5j
HbReQii6lG+P+5Jhv3i/7L5HXjk1buNb0+1tnuJpysUc4t2IjYkSEgYwBnv1 6Y5zjmrSXUMl
1NbI+ZYQrOuDwGzjnp2NQu6/r+kXfUzrrwxpN5etdzQzeY7pI6JdSpG7rjaz RqwQsNq/MRn5
R6Uv/CNaV/aq6l9nk+0rKZ1/0iTy1kKlS4j3bAxDHJA5zzVtNTtZLyO0Dutx IsjpG8ToSsbB
WPIHGWXHqDkZHNW6NtQ8jO1LRLHVnie6WdZYgQk1vcyQSAHGV3xsrbTgEjOC QDjgU+LR9Pt5
LZ4bVIzbQNbwhMgJGxUlQBx/Av5VXn8S6VbaibGW4kEqusbuIJGijdsYV5Qu xGOV4ZgfmX1G
dagDDn8MWY02WysUjt1mto7KQyK0ubdNwCAFuuGYBjnrkg4xW2qhVCqMADAF QWd7b38DTW0n
mRrI8RO0j5kYqw59GUirFNt9QfmFFFFIAooooAKKKKACiiigDD0p4rTU7ywu nEdzLcPPCXIH
noxyCvrtztx/sj1qaeeHUNeso7N1lFkZHuJoyCqkrtEZPqchsdtg9a0Lm0tr yEw3VvFPEeqS
oGB/A0+KGKCJYoY0jjXgKigAfgKq636k8r2OWvdIe98RXdhJby/YrhDeGbB2 CQxeRtzjAOPm
x+NZ66VNqy6PNqemySC61NpbyCaElVVbZ4xvU8bSUU88EsPWu8oqVoXdnmDa FefaEuLfTXj1
JoNYhtbk253RSvOWiO/HyAqX2sSB8xwfm52/Adk1q96Y4Rb2zJEPJj0iTT4/ MG7cdsjsXfG0
FwADgctjjtKKd/6+d/1CT5jirpp4dF1Xw42n3s19eSXAgkFtI0DrM7MrmUZV QobkMwb5Dgcr
mtc6E/2/UNR/s95L+LWrP7PcmEl1hxbiQoeoUjzAxHHBz0rvqKE7O/8AXT/I L33/AKucHbad
dJBawtbsn26/vbadZF2kxNcPKGwexRWA/wCugNd5UTWtu12l00ERuUQxrMUG 9VJBKg9QCQOP
YVLQDd22FFFFIQUUUUAFFFFABRRRQBz/APpOtX1yDdTW9jBK0KxwSFGlYY3M zD5hg5AAI6Z7
1YgFzpep29pLcyXNrdBhE0xy8bqM7c4+YEBjk8gjvmiirvq0Z9Lmfcavrdzr Oq22lfYf+JZ5
Za0mhZpLoMu75ZN6rHnlRkNgrk8HFNg8XTi81S3udJui8F+tnZxxGLdcExCQ jJk2ggbmyxUb
do+9kUUVMNdPL9UbLVN9v8ipf+OZYpY3t9PnS1On3lxNLJGjtBLAwUqVEo3Y OQQDgkrhsZI2
5/EkFvqi2RtLp0EkcMt0gTyopJMbFYFt5JyvKqQNwyRzgoptfCu7/WwVFyp2 6X/CxtUUUVJI
UUUUAFFFFABRRRQAUUUUAf/Z
--------------060305050908010501090008
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: <part3.01050608.06060202@ca.ibm.com>

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRof
Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwL DBgNDRgyIRwh
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjL/wAAR
CAD5AZIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2NbJ3G64kdnP8KSMir7Db gn6n9OlO+wR/
9Nf/AAIk/wDiqt0UKy6AUHtoI2w3m5xn/j4k/wDiqb5Nv/02/wDAiT/4qqfi B7jypY7R9lw0
J8ttwXDc4OSrAf8AfJ+hriYdQ8RaZqMP2678+BY5JpYV2tuQMgJHy7lI3E43 Nn2yAOmNKLSb
W5i5tN6noXk2/wD02/8AAiT/AOKo8m3/AOm3/gRJ/wDFV59/wnNzbssKWM9+ weR5HiilbEfm
uqhfLiYFsJ/EUHTk840pPFxjkkRrM7kEoI83nepbYvT+MIxz24HNWqEOwnOS OwFtCwyFnI9p
5P8A4ql+yxf3Lj/v/J/8VTtMk8y2Zv8Ab/oKu1zzUYyasaRu1e5Q+yxf3Lj/ AL/yf/FUfZYv
7lx/3/k/+Kq/RU3j/KOz7lD7LF/cuP8Av/J/8VR9li/uXH/f+T/4qr9FF4/y hZ9yh9li/uXH
/f8Ak/8AiqabeBTgicH3uJP/AIqtGsrU5vLuVGf4Af1NaU4xnK1iZtxV7iyW 8DoVElxGT/El
w+R+ZI/SoPs7Q8mSadB1xNIrgf8AfWGP5e3pWdp9laLpsaJGoO1hb2yyLGuo qqghmBHXsSOG
AycqQKWweK3s1ji2hdzEqqbArFiWUL/CASRg8jGD0ojSjUbSVgc3FXNiO3t5 k3pJOR0/18gw
fQjPFP8AsUX9+f8A8CH/AMazkuzFL5ick/eXPDj/AB9/wPtrQzJPGJIzlT+n sa5qtKVN2ZpC
aktCL7FF/fn/APAh/wDGj7FF/fn/APAh/wDGrFFZFlf7FF/fn/8AAh/8aPsU X9+f/wACH/xq
xRQBX+xRf35//Ah/8aPsUX9+f/wIf/GrFFAFf7FF/fn/APAh/wDGj7FF/fn/ APAh/wDGrFFA
Ff7FF/fn/wDAh/8AGj7FF/fn/wDAh/8AGrFFAFf7FF/fn/8AAh/8aPsUX9+f /wACH/xqxRQB
X+xRf35//Ah/8aPsUX9+f/wIf/GrFFAFf7FF/fn/APAh/wDGj7FF/fn/APAh /wDGrFFAFf7F
F/fn/wDAh/8AGj7FF/fn/wDAh/8AGrFFAFf7FF/fn/8AAh/8aPsUX9+f/wAC H/xqxRQBX+xR
f35//Ah/8aPsUX9+f/wIf/GrFFAFf7FF/fn/APAh/wDGj7FF/fn/APAh/wDG rFFAFf7FF/fn
/wDAh/8AGj7FF/fn/wDAh/8AGrFFAFf7FF/fn/8AAh/8aPsUX9+f/wACH/xq xRQBX+xRf35/
/Ah/8aPsUX9+f/wIf/GrFFAFf7FF/fn/APAh/wDGj7FF/fn/APAh/wDGrFFA Ff7FF/fn/wDA
h/8AGirFFAC/bbT/AJ+of+/go+22n/P1D/38FYcOlQyQRuWkyygnBHp9Kk/s iD+9L+Y/wr0n
SpLqzm559iHW50kvUMUiuvlgZUgjOTWQYka5W4IzKiFFbPRSQSMfgK3f7Ig/ vS/mP8KP7Ig/
vS/mP8K6oVacYqPYxlTm3c5EeHdMQRCGGW28oEL9muJIeCxbadjDIySQDkDJ xirTabaPJLI0
WWllSZzuPLqAFPX
Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor) [message #324687 is a reply to message #324682] Wed, 30 January 2008 18:06 Go to previous messageGo to next message
Mircea Luchian is currently offline Mircea LuchianFriend
Messages: 89
Registered: July 2009
Member
This is a multi-part message in MIME format.
--------------080102060804060803080601
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi Ed,

I added it to bugzilla. I'll be happy to discuss further and give more
hints and help regarding this issue.

Mircea

Ed Merks wrote:
> Mircea,
>
> Wow, lots of good helpful details! I hope we have some time for forms
> even for this release. It would be really good to add your comments
> to https://bugs.eclipse.org/bugs/show_bug.cgi?id=108470 so we can
> track all the folks who have been contributing towards the forms stuff
> in various ways. We hold contributors in high regard!
>
>
> Mircea Luchian wrote:
>> Hello Ed,
>>
>> I agree with your point on the properties view. It's purpose is
>> justified for requirements not needing GUI validation, however, to
>> implement on the spot GUI validation, the Properties view is not
>> sufficient. For this reason, I believe an effort in 4.0 should be
>> reserved towards the adjustment of the JET templates to generate an
>> EMF editor using eclipse forms.
>>
>> Here are the main changes I made. I feel that some of them could be
>> improvements made for 4.0 whenever possible.
>>
>> * I created a composite panel for every node in the tree. I
>> modified the ObjectDetailsPage and removed the SampleSection
>> inner class. I replaced it with a DetailsSection class
>> responsible to create the panels and update them in function of
>> the "Object input" variable
>>
>> private void detailsPageSwitch(final Object input)
>> {
>> sampleSectionHolder = new DetailSection(toolkit, input,
>> adapterFactoryItemDelegator, adapterFactoryLabelProvider,
>> mform.getMessageManager(), this);
>> ScrolledPropertiesBlock.setDetailsPage(this);
>> sampleSectionHolder.createSection(input);
>> }
>>
>> public void update()
>> {
>>
>> detailsSection.setText(adapterFactoryItemDelegator.getText(i nput));
>> detailsSection.layout();
>> ScrolledPropertiesBlock.setDetailsPage(this);
>> sampleSectionHolder.updateSection(input);
>> }
>>
>> With the detailsPageSwitch(), I pass the message manager of the
>> managed form (mform) SrolledPropertiesBlock class to every
>> panel. As such, the panels now have control on the message
>> manager and can add / remove errors depending whether the user
>> types in a widget or switches from the one node to another.
>>
>>
>>
>> * There is one "problem" with radio buttons (A = "true" and B =
>> "false" initially) attached to boolean attributes in EMF.
>>
>> and
>>
>> As radio buttons are mutually exclusive, setting B, unsets A
>> automatically. This will register as two actions in the EMF's
>> command stack (B = "true", then A = "false"). If the user
>> presses undo once, the B radio button will be "false" leaving
>> A radio button "false" as well. The user must execute a second
>> undo action to revert to the initial state.
>>
>> To prevent this from happening, I had to "hack" the
>> EditingDomainActionBarContributor class located in
>> org.eclipse.emf.edit.ui.action so I can call cutom Undo and
>> Redo actions.
>>
>> I created the following and put all custom code in my plugin:
>>
>> public class CustomEditingDomainActionBarContributor extends
>> MultiPageEditorActionBarContributor implements IMenuListener,
>> IPropertyListener {
>> [....]
>>
>> protected CustomUndoAction customUndoAction;
>>
>> protected CustomRedoAction customRedoAction;
>> [....]
>> }
>>
>> Custom Undo/Redo actions call themselves recursively if they
>> detect that variables reserved for a group of mutually
>> exclusive radio buttons are all set to false
>>
>> public class CustomRedoAction extends RedoAction {
>>
>> @Override
>> public void run()
>> {
>> super.run();
>> MyEditor.updateFromRedoUndo();
>>
>> Command mostRecentCommand =
>> domain.getCommandStack().getMostRecentCommand();
>>
>> if (mostRecentCommand instanceof SetCommand)
>> {
>> SetCommand mostRecentSetCommand = (SetCommand)
>> mostRecentCommand;
>> EObject owner = mostRecentSetCommand.getOwner();
>>
>>
>> /*********************************************************** ************************************************
>> * MyNodeImpl OWNER
>>
>> ************************************************************ **********************************************/
>> if (owner instanceof MyNodeImpl)
>> {
>> if (!(( MyNodeImpl ) owner).isReadOnly() && !((
>> MyNodeImpl ) owner).isReadWrite() && !(( MyNodeImpl )
>> owner).isWriteOnly())
>> run(); // RUN AGAIN TO SET THE RADIO BUTTON
>> THAT WAS DESELECTED
>> [....]
>>
>>
>>
>>
>> * The eclipse forms panels (with every widget bound to the model)
>> was not updated during an Undo or Redo action. I added both
>> actions a MyEditor.updateFromRedoUndo(); statement that calls
>> the editor to refresh the current selected panel in the
>> Scrolled properties block:
>>
>> public static void updateFromRedoUndo()
>> {
>> try
>> {
>> if
>> (scrolledPropertiesBlock.treeViewer.getTree().getSelection() .length
>> != 0)
>> {
>>
>> scrolledPropertiesBlock.getObjectDetailsPage().update();
>> }
>> }
>> catch (Exception e)
>> {
>> }
>> }
>>
>> This update mechanism for the eclipse forms does not exist on
>> the EMF example found on the net.
>>
>>
>>
>>
>> * I added error and warning status variables for every node in
>> the model. This is really custom work, however with the usage
>> of the eclispe forms' message manager, this complements very
>> well the user experience.
>> Data can have errors or warnings in the panels, so I changed
>> the item providers for every node to display the icons in an
>> error/warning state. Whenever we use validation on such panels,
>> the nodes in the tree must reflect these same error states for
>> later correction (say the errors exist but the user chooses to
>> save/closes his file and chooses fix the errors later during
>> the day; he must then know where the errors are...).
>>
>> I also made the parent nodes aware if their children have
>> errors or warnings so they can be propagated to the root node.
>> This makes the errors easier to search if the nodes are
>> collapsed. How the error/warning flags are initialized on the
>> faulty node is custom implementation, however, the error
>> propagation to the parent nodes is performed in the model's
>> implementation classes. Only the latter mechanism could be
>> accomodated in a future version of EMF. See pictures below for
>> a better understanding. I had to hide some information as the
>> product is still under development.
>>
>> 1.
>> 2.
>> 3.
>> 4.
>> 5.
>> 6.No more errors / warnings in the tree
>>
>> Thanks,
>>
>> Mircea
>>
>>
>>
>>
>>
>> Ed Merks wrote:
>>> Tom,
>>>
>>> All that command stuff came long after we'd already done the
>>> EMF.Edit support. It's impossible to keep up with the Jone's when
>>> there are dozens of them and only two or three of us. Maybe an
>>> Eclipse 4.0 effort would allow us to throw away some of the cruft
>>> and focus on supporting only the latests and greatest patterns.
>>>
>>> I'd be happy to provide hooks for whatever solution works well for
>>> this type of scenario. I hope we can find at least a bit of time
>>> this release to look at how to support forms and exploit data
>>> binding. I'm kind of sick and tired of the limitations of the
>>> crummy properties view (which doesn't even work for RAP).


--------------080102060804060803080601
Content-Type: multipart/related;
boundary="------------060508040805090502000700"


--------------060508040805090502000700
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Hi Ed, <br>
<br>
I added it to bugzilla. I'll be happy to discuss further and give more
hints and help regarding this issue. <br>
<br>
Mircea<br>
<br>
Ed Merks wrote:
<blockquote cite="midfnqavh$pnt$1@build.eclipse.org" type="cite">
<meta http-equiv="Context-Type"
content="text/html; charset=ISO-8859-1">
Mircea,<br>
<br>
Wow, lots of good helpful details!&nbsp; I hope we have some time for forms
even for this release.&nbsp; It would be really good to add your comments to
<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108470">https://bugs.eclipse.org/bugs/show_bug.cgi?id=108470</a>
so we can track all the folks who have been contributing towards the
forms stuff in various ways.&nbsp; We hold contributors in high regard!<br>
<br>
<br>
Mircea Luchian wrote:
<blockquote cite="mid:fnq7sm$7bu$1@build.eclipse.org" type="cite">
Hello Ed, <br>
<br>
I agree with your point on the properties view. It's purpose is
justified for requirements not needing GUI validation, however, to
implement on the spot GUI validation, the Properties view is not
sufficient. For this reason, I believe an effort in 4.0 should be
reserved towards the adjustment of the JET templates to generate an EMF
editor using eclipse forms. <br>
<br>
Here are the main changes I made. I feel that some of them could be
improvements made for 4.0 whenever possible.<br>
<br>
<ul>
<li>I created a composite panel for every node in the tree. I
modified the ObjectDetailsPage and removed the SampleSection inner
class. I replaced it with a DetailsSection class responsible to create
the panels and update them in function of the "Object input" variable<br>
<br>
private void detailsPageSwitch(final
Object input)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp; sampleSectionHolder = new DetailSection(toolkit, input,
adapterFactoryItemDelegator, adapterFactoryLabelProvider,
mform.getMessageManager(), this);<br>
&nbsp;&nbsp;&nbsp;&nbsp; ScrolledPropertiesBlock.setDetailsPage(this);<br>
&nbsp;&nbsp;&nbsp;&nbsp; sampleSectionHolder.createSection(input);<br>
}<br>
<br>
public void update()<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp; detailsSection.setText(adapterFactoryItemDelegator.getText(i nput)); <br>
&nbsp;&nbsp;&nbsp;&nbsp; detailsSection.layout();<br>
&nbsp;&nbsp;&nbsp;&nbsp; ScrolledPropertiesBlock.setDetailsPage(this);<br>
&nbsp;&nbsp;&nbsp;&nbsp; sampleSectionHolder.updateSection(input);<br>
}<br>
<br>
With the detailsPageSwitch(), I pass the message manager
of
the managed form (mform) SrolledPropertiesBlock class to every panel.
As such, the panels now have control on the message manager and can add
/ remove errors depending whether the user types in a widget or
switches from the one node to another. <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
</li>
</ul>
<ul>
<li>There is one "problem" with radio buttons (A = "true" and B =
"false" initially) attached to boolean attributes in EMF.<br>
<br>
<img src="cid:part1.08070703.03030300@matrox.com" alt=""> and <img
src="cid:part2.01060000.00070209@matrox.com" alt=""><br>
<br>
As radio buttons are mutually exclusive, setting B, unsets A
automatically. This will register as two actions in the EMF's command
stack (B = "true", then A = "false"). If the user presses undo once,
the B radio button will be "false"&nbsp; leaving&nbsp; A radio button "false" as
well.&nbsp; The user must execute a second undo action to revert to the
initial state. <br>
<br>
To prevent this from happening, I had to "hack" the
EditingDomainActionBarContributor class located in
org.eclipse.emf.edit.ui.action &nbsp;
so I can call cutom Undo and Redo actions. <br>
<br>
I created the following and put all custom code in my plugin:<br>
<br>
public class
CustomEditingDomainActionBarContributor extends
MultiPageEditorActionBarContributor implements IMenuListener,
IPropertyListener {<br>
[....]<br>
<br>
&nbsp;&nbsp;&nbsp; protected CustomUndoAction customUndoAction;<br>
<br>
&nbsp;&nbsp;&nbsp; protected CustomRedoAction customRedoAction;<br>
[....]<br>
}<br>
<br>
Custom Undo/Redo actions call themselves recursively if
they
detect that variables reserved for a group of mutually exclusive radio
buttons are all set to false<br>
<br>
public class CustomRedoAction extends RedoAction {<br>
<br>
&nbsp;&nbsp;&nbsp; @Override<br>
&nbsp;&nbsp;&nbsp; public void run()<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; super.run();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MyEditor.updateFromRedoUndo();<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Command mostRecentCommand =
domain.getCommandStack().getMostRecentCommand();<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (mostRecentCommand instanceof SetCommand)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SetCommand mostRecentSetCommand = (SetCommand)
mostRecentCommand;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; EObject owner = mostRecentSetCommand.getOwner();<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
/*********************************************************** ************************************************ <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* MyNodeImpl OWNER<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;************************************************** ********************************************************/ <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (owner instanceof MyNodeImpl)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!(( MyNodeImpl ) owner).isReadOnly()
&amp;&amp; !(( MyNodeImpl ) owner).isReadWrite()
&amp;&amp; !(( MyNodeImpl ) owner).isWriteOnly())<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; run(); // RUN AGAIN TO SET THE RADIO BUTTON THAT
WAS DESELECTED<br>
[....]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
<br>
<br>
<br>
</li>
<li>The eclipse forms panels (with every widget bound to the
model)
was not updated during an Undo or Redo action. I added both actions a&nbsp;
MyEditor.updateFromRedoUndo(); statement that calls the editor to
refresh the current selected panel
in the Scrolled properties block: <br>
<br>
public static void
updateFromRedoUndo()<br>
{<br>
&nbsp;&nbsp;&nbsp; try<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if
(scrolledPropertiesBlock.treeViewer.getTree().getSelection() .length !=
0)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; scrolledPropertiesBlock.getObjectDetailsPage().update();<br >
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; catch (Exception e)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; }<br>
} <br>
<br>
This update mechanism for the eclipse forms does not exist on the EMF
example found on the net.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;
<br>
<br>
<br>
</li>
<li>I added error and warning status variables for every node in
the
model. This is really custom work, however with the usage of the
eclispe forms' message manager, this complements very well the user
experience. <br>
Data can have errors or warnings in the panels, so I changed the item
providers for every node to display the icons in an error/warning
state. Whenever we use validation on such panels, the nodes in the tree
must reflect these same error states for later correction (say the
errors exist but the user chooses to save/closes his file and chooses
fix the errors later during the day; he must then know where the errors
are...).<br>
<br>
I also made the parent nodes aware if their children have errors or
warnings so they can be propagated to the root node. This makes the
errors easier to search if the nodes are collapsed. How the
error/warning flags are initialized on the faulty node is custom
implementation, however, the error propagation to the parent nodes is
performed in the model's implementation classes. Only the latter
mechanism could be accomodated in a future version of EMF. See pictures
below for a better understanding. I had to hide some information as the
product is still under development. <br>
<br>
1.<img src="cid:part3.04000700.05080503@matrox.com" alt=""> <br>
2.<img src="cid:part4.04020807.08080105@matrox.com" alt=""><br>
3.<img src="cid:part5.06090900.06030401@matrox.com" alt=""><br>
4.<img src="cid:part6.00020309.08020802@matrox.com" alt=""><br>
5.<img src="cid:part7.04050800.01000502@matrox.com" alt=""><br>
6.<img src="cid:part8.04030208.06070000@matrox.com" alt="">No more
errors / warnings in the tree<br>
<br>
</li>
</ul>
Thanks, <br>
<br>
Mircea<br>
<br>
<br>
<br>
<br>
<br>
Ed Merks wrote:
<blockquote cite="midfnn379$99b$1@build.eclipse.org" type="cite">Tom,
<br>
<br>
All that command stuff came long after we'd already done the EMF.Edit
support.&nbsp; It's impossible to keep up with the Jone's when there are
dozens of them and only two or three of us.&nbsp; Maybe an Eclipse 4.0
effort would allow us to throw away some of the cruft and focus on
supporting only the latests and greatest patterns. <br>
<br>
I'd be happy to provide hooks for whatever solution works well for this
type of scenario.&nbsp; I hope we can find at least a bit of time this
release to look at how to support forms and exploit data binding.&nbsp; I'm
kind of sick and tired of the limitations of the crummy properties view
(which doesn't even work for RAP). <br>
</blockquote>
</blockquote>
</blockquote>
<br>
</body>
</html>

--------------060508040805090502000700
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: <part1.08070703.03030300@matrox.com>

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRof
Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwL DBgNDRgyIRwh
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjL/wAAR
CAEWANwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1Cw0O0urKOZ94Zs5C4x1I 9KSTTdDikaOS
+jR1OCrTICPwxWno/wDyCof+Bf8AoRrCudY1Kzd4LLVtNtFWSXdFdWLzPuMr nO4TJgEEcY98
88b1JtTl6mUYrlRox6Bp0sayRyO6NyGVlIP44rK1SGy00nFld3IWGWdzE8Y2 Rx7Q7Hdj+8OB
k10Gjyebpwl6+ZLK4PqDIxz+tYPiiG1f+zXujYoq3si+bexB41BjlOCCRwSF 7jkD0p05Nysx
SStdF06JaqCzI+0cnDjOP++as/8ACN2PrL+a/wCFcx4fuZ59cvC+qLdxtFcM PLeco/7xcFVc
bAFHy/Kx69T1rW8Z2f286Nb/ANmWGp7rxj9lv22xNiGTqdj8jt8v5UVXKDsV CKZo/wDCN2Pr
L+a/4Uf8I3Y+sv5r/hWvRWXtJFciMj/hG7H1l/Nf8KP+EbsfWX81/wAK16KP aSDkRkf8I3Y+
sv5r/hR/wjdj6y/mv+Fa9FHtJByIyP8AhG7H1l/Nf8KP+EbsfWX81/wrXoo9 pIORGR/wjdj6
y/mv+FH/AAjdj6y/mv8AhWvRR7SQciMj/hG7H1l/Nf8ACj/hG7H1l/Nf8K16 KPaSDkRkf8I3
Y+sv5r/hR/wjdj6y/mv+Fa9FHtJByIyP+EbsfWX81/wo/wCEbsfWX81/wrXo o9pIORGR/wAI
3Y+sv5r/AIUf8I3Y+sv5r/hWvRR7SQciMj/hG7H1l/Nf8KP+EbsfWX81/wAK 16KPaSDkRkf8
I3Y+sv5r/hR/wjdj6y/mv+Fa9FHtJByIo6P/AMgqH/gX/oRq9VHR/wDkFQ/8 C/8AQjV6nV/i
S9WEPhQVCbcFiRI6gnOBj+oqasbWnMc8RW0s7txDIUhvJCkRbfHyWCPggFsf KfTjOahDYWPh
6wtrp7+NJluJ1YyZlYj5yGYAHpkjsB+FaskojIG0sT0ArB0i4ml1FN+nabZS +VJmOxmMiMu6
PBLGNDkZbjH488S+JXuF0G+ZY4vMFpLwZCBjaNxzt6jnAxzgdM8Wm5yV2CXQ 1BexmVogrGRV
DMgZcgHIBIz0OD+RqaOQSKSAQQcEHtXiU4lSS8P2azAWBCCr8jryOOteyW7S fZJWlVUlxllR
iwVtozg4GR74FXXpKlG9zapS5Gtb3LlFcj4DkL2H7y01mGd7a3lkk1G8a4WY sG+aPMjhRkHI
G08jI6V11YtWdjIKKKKQBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAUdH/5BUP/
AAL/ANCNXqo6P/yCof8AgX/oRq9WlX+JL1ZMPhQVFPa29yALiCKUDkCRA2Pz qWisyiCCztbZ
i1vbQxEjBMaBc/lS3FuLhdrbSCpUq67gQeoIqaqupSPFpd3JGxV0hdlI7EKa abuJ2SMtPDGk
LeOy6bp4k2Jn/RlwBlsYXPB684545OONlIxGj72BzyxIwOn/ANaucvdRETXU MejazD5aybL2
S/RosqDtbaJy5BwMAp3GQOa6CeRjBKPKcDaw3EjHQ+/sPzHvinJy3YXfUqnV 9IscWpure38p
QoiOE2DHAx2GMUSzRazaGPT9Wltzux9otBGzAjkr86Mv6Zqlb3y2+oamh1Kx tT9oU7LgZY/u
o+fvjj8O1SaVMLi+vZBPDODeD95D9w/uE6cn+dc8ZylNxa7lbI1LO2+yWkcB nmnKDmWZtzue
5PQdewAA6AAcVPXK311qr+NUtbd9WNlFFA7rZi08obncMZTL+8xhR/q+cA45 xXVVruK1tAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAKOj/APIKh/4F/wChGr1U dH/5BUP/AAL/
ANCNXq0q/wASXqyYfCgooorMoKbJGksTxyKGRwVYHuD1p1FAGX/YWnmZg0Uj DAOGlkIPXqS2
D9P8a0pE8yJ0zjcCM0xR/pUhx1RRnHu3fH9T9B3louwsY32TV7W5upbW5slj uJVkKS27yMp2
KnUMOPlB6cc1Np9jdwTzzXk0Eks03mkwoUA/dqgABJ7LnOavTjMYGM/Oh6Z/ iHsf89x1AJ0O
MCTnHWNh6e3uP19DiVGKd0tQI/KtYLyS5JVJ5UVHYv1VSccf8Cb86l+0Qf8A PaP/AL6FZOp3
EkbQuj3UcTzgSvBAZHVfKJHy7WI+YKOneq8d0WvrRLe61OdXkIlFxZGNAmxj ncYl/iC9+9Dm
lLlsws7XOiorOvNSj0rSYrmWKaUExRBIV3MWdgowMjuRTtK1QapDMxtLi0mg lMUsFxs3o2Ae
qMynIYHgnr61QF+iiigAooooAKKKKACiiigAooooAKKKKACiiigCjo//ACCo f+Bf+hGr1UdH
/wCQVD/wL/0I1erSr/El6smHwoKKKKzKCiiigCFSv2yQcbvLTPrjLe317/gO 81RKf9KkGeiK
cZ927Z/oPqe0tAENyVES7sY8xOvruGOx/wA9x1qaopziMHOPnQdcfxD3H+ex 6EFxA2MTRnOM
YYc5xj/0JfzHrQBG6SLK5EZYMcggj0A7n2rJ8O2F/pulG1u7ZVcTyyL5dwZs q7s4yzAEkbiM
nOcZzzgW7q5jWVCIGummkCRLHtOfk3dWIGMAnrUfn7J4Ip9Mmg85yiO/lEZC lsfKxPRT2qva
xXutkcrepduLCO7s4YJmYCJ4pMof4kYMOo6ZFOtbGK0uLuaMuXupRK+48AhV XA9sKKGuVttO
+0yiVlSMMwjjaRzx2VQWY+wBNR6bqltqsTS2pk2KdrLLC8Tq3cMjgMp6HkDg g96l7/1/XQvo
XaKKKACiiigAooooAKKKKACiiigAooooAKKKKAKOj/8AIKh/4F/6EavVR0f/ AJBUP/Av/QjV
6tKv8SXqyYfCgooorMoKKKKAIlP+lSDPRFOM+7ds/wBB9T2lqJR/pUhx1RRn Hu3fH9T9B3lo
AinOIwc4+dB1x/EPcf57HoZainGYwMZ+dD0z/EPY/wCe46iWgDNvbKK6kxOs /wAsgkjaF3Qg
7dudyEHoSPxqGPTbaOeKb/TpHiJZPOuJ5ACQRnDEjOCR+NWLu6jgkPnNN80g jRYldiTt3Ywv
PQE1Cl9A80cX+mI8hKp5sUyAnBOMsAOgP5UN07pO1ybS6DtW0p9V0JtPEqws 6pkuhdDgglXU
MNynGCuRkEioPDXh5fD1tcxIbUCeXzTHaWot4kO0AhUBOBxnr3rUNzHBY/ab mZIokj3ySSMF
VQBkkk8AVT0bXLTXUu5bGaCe2gn8lJ4JhIknyKxII46tjv0otqyuiNOiiigA ooooAKKKKACi
iigAooooAKKKKACiiigCjo//ACCof+Bf+hGr1UdH/wCQVD/wL/0I1erSr/El 6smHwoKKKKzK
CiiigCJR/pUhx1RRnHu3fH9T9B3lqFQv2yQ8bvLTPrjLe/17fie01AEU4zGB jPzoemf4h7H/
AD3HUAt4FxiGMYxjCjjGMf8AoK/kPSkuQpiXdjHmJ19dwx3H+ex6VNQBk3to kkiBbl7RoJRJ
E0WwEfIU6MCMYJHSoxalrmCa41e4uBA5dEk8kLuKlcnagPRj3qzeXskEyIiT SPJJ5SRxbMk7
C/8AEQOgPeo/ttyk8EU9veQec5RHcwkZClsfKxPRT2qW6fMr7itK2gmr6fPq GhLbwLCZ0aGZ
EnyEdo3VwrEAkA7cZwcdcHGKNEsr62a/uNQW3Sa7uBL5dvIzqg8tFxuKqScq ecDtVu4v47Sz
hnmViJXijwg/idgo6npk1bqvP+un/AH0sFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFAFH
R/8AkFQ/8C/9CNXqo6P/AMgqH/gX/oRq9WlX+JL1ZMPhQUUUVmUFFFFAESn/ AEqQZ6Ipxn3b
tn+g+p7S1EoP2qQ5bGxeMnHVunGM/j6dO8tAEU5xGDnHzoOuP4h7j/PY9CCB BjBk4x1kY+nv
7D9fU5JwTGMFh86fdJB+8PQHj/PHWpaAMy5sYLpvLl8391IGRkmdGB2bc7lI PQkde9Y3hlrb
VrJNQaYzTwXMyYjv5biNCrMgI3MQSUIOcDIbOBmtu+uooZB5qKSX8tAIGlZj t3cBeemfyqBL
yB5o4vJ2PISqebYyICcE4ywA6A/lT5qd7StfQm0t1sLqlrPeaRax26b3We3k I3AfKsisTn6A
1keB9Gn0gXqyaY1nG4jCvOkP2iZhuLNI8LlZOWGGKqx53ZPJ6yN/MiR8Y3AH FIJY2laISKZE
AZkB5UHOCR74P5Gja5Seg+iiikAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBR 0f8A5BUP/Av/
AEI1eqjo/wDyCof+Bf8AoRq9WlX+JL1ZMPhQUUUVmUFFFFAESj/SpDjqijOP du+P6n6DvLUK
/wDH5JyP9WnGBnq3fr+fHp3qagCKcZjAxn50PTP8Q9j/AJ7jqAROMZnkOMdQ vPT29j+Z9sJc
8xLyB+8TqAf4h6//AK/TmpqAMu6smuZFxdTwywSh0ljCbs+XtOQykchj2rO0 j7RqsMF/dXd9
mC4mAt5/J+VkZ4uSiDnGeASOep61ty4aVsR5I4J8wrk49qqWenWenQmGy0+C 2iLbikDFAT0z
gDrwPyq+SL1a1Iu77lfxCJm8KSLBc3Nu5WMGW1t5JnC7lzhIyHIIyCUIYAkg 8VU8INft5xuo
L2CEwR+Ul1PLL/y0mzhpVV842cMAwGAeldNGVaJGUYUgED0FOqe5fQKKKKQB RRRQAUUUUAFF
FFABRRRQAUUUUAFFFFAFHR/+QVD/AMC/9CNXqo6P/wAgqH/gX/oRq9WlX+JL 1ZMPhQUUUVmU
FFFFAESn/SpBnoinGfdu2f6D6ntLUS7vtUmfu7Fx165bPt6dOfXtUtAEU5xG DnHzoOuP4h7j
/PY9CBZ+MyRnpnEZ9s9/978x6ck+7yxt6709em4Z6e34evGaloAxdTS4Zods U86rODOltL5T
MvlEcEsvG4qcZ/Oq8aSm+tDBp+p26LITM9zdh0KbGGMea2TuK9q2Jdvmtt83 P8WzbjOPf2xT
Of8Ap4/8cpOlGUlJk8zWhFfm7XQjJYuVuI41kUAA79uCU5B+8AVz1GeKTRLy TULaW+Mpe3uJ
DJajaAFiwAuD33bS+T/fFaMe3yk2fcwNv0p1PqV0CiiigAooooAKKKKACiii gAooooAKKKKA
CiiigCjo/wDyCof+Bf8AoRq9VHR/+QVD/wAC/wDQjV6tKv8AEl6smHwoKKKK zKCiiigCJR/p
Uhx1RRnHu3fH9T9B3lqFf+PyTgf6tOcjPVu3X8+PTvU1AEU4zGBjPzoemf4h 7H/PcdQBp+Mx
xjpnEh9s9v8Ae/IevCXPES8A/vE6kD+Iev8A+v05qagDmNauoTf2ttJHbTTi dJHgnDmLDIyK
GcIwXLH5dwG4jA5qC6kg02+sJbrT9M01VkZg9uzO8vyMvlqBEMsSwIXOTg4B xxpaho1tdaqL
s3MyMfKMsSJuWQxtvj3cZG1jngjOecjis/U/Cen6y0UmpTPczRLhJXtV3AgA AkhRkAhm2nKk
u2QRgCvYUpSU5GbnNJpGxqd8+naAbiI/v9iJCPJMu6RiFUbdy5ySByyj1IHN UvDGq6nqkcw1
KJILi1lkgmjEaqWOEZThZZAvDEEbm9cjpTPEOsaLoOmWun6hYm5sriMxrAkK PGUUKMFSQMcj
isay8f8AhjTYPIsdKuLWEf8ALOC3jRegHQNjoAPwrWOFq1FzRjdP/P8A4f8A pClWhF2b1/4B
3tMSKONpGjjRWkbc5VQCxwBk+pwAPwrjf+Fn6L/z66h/37T/AOLo/wCFn6L/ AM+uof8AftP/
AIuq+p1/5WL6xS/mO1oriv8AhZ+i/wDPrqH/AH7T/wCLo/4Wfov/AD66h/37 T/4uj6nX/lYf
WKX8x2tFcV/ws/Rf+fXUP+/af/F0f8LP0X/n11D/AL9p/wDF0fU6/wDKw+sU v5jtaK4r/hZ+
i/8APrqH/ftP/i6P+Fn6L/z66h/37T/4uj6nX/lYfWKX8x2tFcV/ws/Rf+fX UP8Av2n/AMXR
/wALP0X/AJ9dQ/79p/8AF0fU6/8AKw+sUv5jtaK4r/hZ+i/8+uof9+0/+Lo/ 4Wfov/PrqH/f
tP8A4uj6nX/lYfWKX8x2tFQWd0l9Y293EGEc8ayqG6gMMjPvzU9c7VnZmydy jo//ACCof+Bf
+hGr1UdH/wCQVD/wL/0I1eq6v8SXqyYfCgooorMoKKKKAIlP+lSDPRFOM+7d s/0H1PaWolJ+
1SDDY2Lzg46t05xn8PTr2loAinOIwc4+dB1x/EPcf57HoQSucZgkGcdSvHT3 9z+R9sk5IjGA
x+dPugk/eHoRx/nnpUtAGLqd+bNoWaeC0WecI8lyMrH+6Lc/MBnKgde9V49W Rr60gi1fTL3z
pCjR2w+dQEZt3+sbjKgdO9bEv7uVjviG7nDvtPTH9KZ5n/TS3/7+/wD1qTpy clJSJvbSxx/j
iwTUZNEgkn8hBBcSNJs3YCojdMj0rj18OW76Z9s/tJEMiPLAkvlIXVSQMgyb gx2nAVWHTnrj
u/Gmj6xejTTpEPmtDHNFIdyLhXVV/iPcZrlY/DXjGOxFn/Z8TwruCCX7O7Jn rtZslfXgjnmv
cwtVKjFKaXq13f8AwDz60L1G3Fv/AIZf8EqnwiPKjk+2tGFbFykqJvhARnPy pIxzhSMNtOce
+LB0jTr2zsorVWZvJik85oxG7IZ3RywBI/iTkk8LVttJ8dsQfssakSeaSgt1 3tgjLY+9kMQc
5znmo20Lxw04m+yKjiBrceW0CARnOVABAHU1s6re9SP3kKCX2H9xVfQtOuTK 8R+yw3Debbt8
0hjjWEyOuM88so59Kih0fTDYTTSySlTZCaF0g+bPn7MsDJjOMDAOMH1HNoeG vGgigiFp8kET
xRjzYflV87h15zk0Q+GvGcCqqWSlFhMAR2gZShbdggkg/Nzk80/aL/n4vv8A 68vxDlfWD+70
/wCD+Bla14fi0i3LDUYZp0k8qWEPHkHByVCuzYBGPmCnkcemY8NuqWpjuPNe QZlj2FfLO7GM
98jByPWuovfDPjHUIwt1p0MhBBMn+jrI2Bj5nHzN+JNQy+EPFs8NtFJY7ktl KxDzohtBJb+9
zyT1rSFeCS55q/qjOdKTvyxf3FyTT9FGu3FksOkmOEzfKrXm9QiMRvJOCAQM 7efSqN5omnSR
xXv2hLWzaONd9pG8qySMzj5VkYMAAhzuOcjgc1onSPHDTmc6dZ+cxYs4gtAz bgQcnHOQTnNN
TRfHMczSLZxYKqvlkW5jAU5GI/ujBJOQOpPqaxU0rfvF/wCBGrje/uP7jLPh UW8xtp7wfbws
siQrFlGSNmBy+eCdjEDB6DJGatat4YgWe+uTe29sWkmeC3zGo2q7ALguGydp ACoR0564nGg+
OBbPb/ZtyPuyzSQs/wAxywDk7gCeoBwcn1NLJoXjaeKSOaxilDs7ZlFu7KWO W2k8rzz8uOea
ftXdP2kfvQuRa+4ykPCCGFZHv2iCg+ekkaF4iI2flVkYj7pGG2n264xdTsIr L7NJb3DzQXMX
mozx+Ww+YqQQCR1U966qTR/HUsbo1pGFkJL7BbqXJUqSxGCSQx5PPNZ83gzx XPHDHJYblgTZ
GPOiG1ck4+96k1cK6vedRfeiZU9LKD+49S8Pf8i1pX/XnD/6AK0qpaPby2uh 6fbzLtlito0d
cg4YKARx71dr56o7zZ6sfhRR0f8A5BUP/Av/AEI1eqjo/wDyCof+Bf8AoRq9 Tq/xJerCHwoK
KKKzKCiiigCJR/pUhx1RRnHu3fH9T9B3lqFSv2yQcbvLTPrjLe317/gO81AE U4zGBjPzoemf
4h7H/PcdQCdDjAk5x1jYent7j9fQ4S5KiJd2MeYnX13DHY/57jrU1AGXc3Uk c8SW8SySXM2x
RK5jA/dl+flJ6L0xSPPe29xbR3Vtbqk8hjDR3DMQdjN0KD+6e9TXljDdlkub OO6iLBwsiqwB
xjo3fr+dQQaPY2syzW+kW8Mq/deOKNWHbgik4zck1LQV12JbzUo9K0mK5lim lBMUQSFdzFnY
KMDI7kVNYahFfrKER45YHEc8MmN0TlFfaSCQSA69CR70XFhHd2cMEzMBE8Um UP8AEjBh1HTI
qWC0htpbiSJSGuJPNk+YnLbVXPtwo6f1pjVrE1FFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFF
FAFHR/8AkFQ/8C/9CNXqo6P/AMgqH/gX/oRq9WlX+JL1ZMPhQUUUVmUFFFFA ESn/AEqQZ6Ip
xn3btn+g+p7S1Ep/0qQZ6Ipxn3btn+g+p7S0ARTnEYOcfOg64/iHuP8APY9C C4gbGJoznGMM
Oc4x/wChL+Y9aJziMHOPnQdcfxD3H+ex6GWgDLurmNZUIga6aaQJEse05+Td 1YgYwCetR+fs
ngin0yaDznKI7+URkKWx8rE9FPapr2yiupMTrP8ALIJI2hd0IO3bnchB6Ej8 ahj022jnim/0
6R4iWTzrieQAkEZwxIzgkfjQ1U5k09Cfd6ot3Go22m6bHd3s3lxfIpYqWJZi FAwMkkkgfjU1
peQXsRkgcnGAyspR0JUMAykAqcMDggHmq93p5vbC3gaTyzHLDKTjP3HVsde+ 3GaltLCKznvZ
oyxa7nE7g44bYicfgg65/lQUrWLVFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFAFHR/+QVD
/wAC/wDQjV6qOj/8gqH/AIF/6EavVpV/iS9WTD4UFFFFZlBRRRQBEo/0qQ46 oozj3bvj+p+g
7y1Eo/0qQ46oozj3bvj+p+g7y0ARTjMYGM/Oh6Z/iHsf89x1EtRTjMYGM/Oh 6Z/iHsf89x1A
LeBcYhjGMYwo4xjH/oK/kPSgCpd3UcEh85pvmkEaLErsSdu7GF56AmoUvoHm ji/0xHkJVPNi
mQE4JxlgB0B/Ki9tEkkQLcvaNBKJImi2Aj5CnRgRjBI6VGLUtcwTXGr3FwIH LoknkhdxUrk7
UB6Me9D9rzLltYn3epyXxLSW4i0XYjSP5czkKuTgBCTx2xk1wSadfSPsjsrh nwDtWJicEbge
ncAke1ejeObpbC78PTTK5jVZllVR8xQqisB74Jrmz4rgYMwimjkYTKSmOFKy CIZz28wg+wHW
voMJKcaEeVX3/NnmV4xdV8ztt+SMqLw3qc0czR20peCLzZIvJkDj59mMbeTk E+mAecgioYdD
1OWW2Q2U0QueYpJkKIwxknceMAc59KvwaxZfYktJxOq/Yfs7OiK2HE3mDgsM jGB1FX7rxVbS
3TToZWhuHLXFr9jhi4ZGU4lU7mI3nBI+tdDnWTaS7mSjTau2YsuhzmFZrGaH UULmNvsgclWx
nBVlDdATnGODzxQdBvktJnltriO4jlRPszQsHIZXbdjrwEPar9jrGnaPbzwW T3kvnhy80kax
lT5bogChj3cknP4UsPiBF0zTrWAOt1bywsHkwI8q8p5Oen7xf1ocqvRdgtDd +f8AwDnmhlRI
3aJ1WUExsVIDjOOPXnirdppc9zqDWUhW1lRXaT7QrLsCqWOQAT0HpU+vXVvc ay62nFnb4hg2
HPyL3B9zk/jU9nqttaeJJr5bi/8AJdZVSdsNONyFQx5AJBOetaOcnC6Wtn/w CeWKlZvqv+CR
x6DHLC8yazp5hR0jL7Z8bmzgY8vP8J7YqrPpF/bi5ZrSZobaQxSzIhaNWBwR uxj0/Ot6HxFD
HBPGdf10yyPG32nyhv2rvyn+u6fMD1/Cmy+JLCXdciCeKdIriGO1VVMJWVmO ScgjG88bTnaO
RWSnVT2uv68l/X43ywa3Mi20O8kdftEE9tG8Ek0ckkJAkCIW4zjOcDketQHS dSXyM6fdj7R/
qcwt+97/AC8c/hXRP4n09WvZI1u5HvXeWRZVXETGJ0Cqd3zDL9cDgDii68S6 fd3nnS+Y0Esv
nSWx0+EBX2thi4YGXax6MBkdaPaVb/D/AF/Xy08w5Kdt/wCv6+evkYA0TVmn aBdLvTMmN0Yt
33LkZGRj0BqTQVZPFGmI6lWW9iBBGCDvFauq+IrS60yO0tvP3KYtz+RHCrBG kJ+RDgffXA9j
VS0u0v8Ax5bXcYYRz6kkihuoBkB5p803F8y6MXLFNWfY9wooor5c9oo6P/yC of8AgX/oRq9V
HR/+QVD/AMC/9CNXq0q/xJerJh8KCiiisygooooAhUL9skPG7y0z64y3v9e3 4ntNUSn/AEqQ
Z6Ipxn3btn+g+p7S0AQ3IUxLuxjzE6+u4Y7j/PY9KmqKc4jBzj50HXH8Q9x/ nsehBAgxgycY
6yMfT39h+vqcgFa6vI7dmae6S3jDBAXZVBOM9T36/lUMOp2txKIodUhkkboi SISfwFNu7WeS
aJrWdIpbaYOplQyA/uymD8wP8Wc57U02+pT3VrJd3lq8cEhkCQ2rIWOxl6mR uPmz07Um6nMk
loTp3Lk1jZ6lDC97Z29wQuV82IPtzjOM9O35VD/wj2i/9AfT/wDwGT/Cmapb SXXh8rBEZZ41
jnhjDBd7oQ6jJIAyVA545pdA06bTLB4JmBLSeZx03Mql/wA33n8a0U5LRMfK mrsd/wAI9ov/
AEB9P/8AAZP8KP8AhHtF/wCgPp//AIDJ/hWlRR7Sfdi5I9jN/wCEe0X/AKA+ n/8AgMn+FMOg
6MJlT+w7IqVJMn2aPaCMceuTn0xwfatWmu6RRtJIyoigszMcAAdSTR7Wfdhy R7Gf/wAI9ov/
AEB9P/8AAZP8KYNB0YzMh0OyCgAiQ20eGzngd+Mdx3HXnGorK6hlIZSMgg5B FLR7SfdhyR7G
VFoOjSJubQ7KM5I2vbR54OM8Z69fx5xUP9kaV/aP2X/hGYPJ8vf9r+zweVnP 3cZ35/4Dj3rb
oo9pPuw5I9jKfQdGV41Gh2ThjgsttHhOCcnP5cZ60/8A4R7Rf+gPp/8A4DJ/ hWlRR7SfdhyR
7Gb/AMI9ov8A0B9P/wDAZP8ACnx6FpEMqSxaVYpIhDKy26AqR0IOODV+ij2k +7Dkj2CmRO0i
bmieM5I2uRng4zwT16/jzin0VBRR0f8A5BUP/Av/AEI1eqjo/wDyCof+Bf8A oRq9WlX+JL1Z
MPhQUUUVmUFFFFAESg/apDlsbF4ycdW6cYz+Pp07y1Eo/wBKkOOqKM49274/ qfoO8tAEU4Jj
GCw+dPukg/eHoDx/njrUtRTjMYGM/Oh6Z/iHsf8APcdQCJxjM8hxjqF56e3s fzPtgAil/eSs
NkR28ZdNx6Z/rTPL/wCmdv8A9+v/AK9UtTs5blodkNvd+TOHeO6basg8orzh Tzlgenaq8eny
/brSVdJ0yyWGQu728hZ2BRl248te7A9e1JzmpJKOhNlvcyPHniDVNHGlSadc NAs6yNIPLDA4
MZAOUI6bh94HBOAeq8YvjnxOu3OrM2MZzbxfNjb1wnfaf++2xj5dvY+MTbx3 2hzXMUDolnd7
fPQFd3loVGSvUkDA3DOOjYyvNwz6fJ4eD/ZLKWaWOU3JM9vCySZOCqFN+ANp AjIBxjHXPq4S
lSlTvKN9e/8AXY5K85qVlKxSXxz4nXbnVmbGM5t4vmxt64TvtP8A322MfLtt w+JfGsjWyRXd
xcPNH5kaR2sTs6ggE4VM9UbPT77dPl26Tx6MscSSHTnkhl2wStJb7Zv3b7Wd Y1G1d4Thycd+
+a1/MLvSF08XmnpftbxFxFLFHEwWSQmPcuEB+ZGxnBx64ro9jQe0Pz/rTqZK dTrL+v8Ag9DP
l8ZeLbOfybnUZkljIDpLaxK3G3qNgxnafT77Yx8u1X8YeLbaO3km1RtsqB0J hh+dQQCTheMl
G9PvtjHy7bU9/bWmjQRl7C71C3EMLySIk+FzKSq7gQQAUUkZHoelWbhNJvtV XTlaA2nkSFZI
cP5ISeR+COgKZH4im6FBbw0+fTqL2lR/a/puxjr458TrtzqzNjGc28XzY29c J32n/vtsY+Xb
asfE/ja+z9jubu78vbv8qyjf+712pxna3p99sYwu3JtZ1utbnnSLT4lkErLH cqFiUFTgADuP
4ffFXNDMb6HfQGGwnka4iYRXl15IwFfJB3pnGR371pPC0IxvydvxfqRGvUbt zd/yLza/48t4
DPM9+IYvvySWCBeCoOT5YxyrZ6ffbphdtFfHPiddudWZsYzm3i+bG3rhO+0/ 99tjHy7dYy20
VhAZF0yJY7KeJ5YbwPLEzNJhEXzDuB3AZweGJ3dw5/7I+0jzf7J8vzz/AGf5 ezbs8ttvnY5x
u8vPmc5znjNZKjQV7wv/AF6mnPUe0v6t/SMyPxh4t+yG6/tRnhidEdjDDyxA IBG3PPlt0/vt
0+XES+OfE67c6szYxnNvF82NvXCd9p/77bGPl27kEukiOKK9ew89miadIXjW IyhJtp+UFMcx
5IBXJ571FEbBr6SdrbT4pFjRDB9qsmWQFmy+7YUGAANqruPB+r9jQu17P8f6 /qwvaVbJ8xkL
458TrtzqzNjGc28XzY29cJ32n/vtsY+Xb0/gLxHrWr67JbahevcQpas/MSKN wMagkqgGfvH7
w+82AQBsyr6fSY7trK3TTTaNbXRMgSNm3hpPL+fqDwmMEZyOtJ8MVz4qnfbn FjIN23pl4+M7
eOnTcM46NjK44qjSWHlOMbPT87GtGpU9qoylff8AK563RRRXkHcUdH/5BUP/ AAL/ANCNXqKK
0q/xJerJh8KCiiisygooooAgQj7dKueREhxtHq3fqfp2/Gp6KKAILshYVJOP 3sY+6G/jHr/P
t1qeiigCrLhpWxHkjgnzCuTj2pm3/pl/5HaiitUtDJvUzdd8Laf4m+xS3Uk8 Yt1PliHYDhih
IJKkgYQDAI6nuFIx1+F2jLtzfak2MZy8fzY29cJ32n/vtsY+XaUVKqTjpGTX o2W4Rlq0n8gX
4XaMu3N9qTYxnLx/Njb1wnfaf++2xj5dovwu0Zdub7UmxjOXj+bG3rhO+0/9 9tjHy7Siq9vV
/nf3v/MXs6f8q+5Avwu0Zdub7UmxjOXj+bG3rhO+0/8AfbYx8u10Pwz0qD7m paoMqFfEsY3j
5cg4Todpz/vt0wu0ope2q/zv73/mHs4fyr7kNX4XaMu3N9qTYxnLx/Njb1wn faf++2xj5dov
wu0Zdub7UmxjOXj+bG3rhO+0/wDfbYx8u0op+3q/zv73/mHs6f8AKvuQL8Lt GXbm+1JsYzl4
/mxt64TvtP8A322MfLtF+F2jLtzfak2MZy8fzY29cJ32n/vtsY+XaUUe3q/z v73/AJh7On/K
vuQL8LtGXbm+1JsYzl4/mxt64TvtP/fbYx8u0X4XaMu3N9qTYxnLx/Njb1wn faf++2xj5dpR
R7er/O/vf+Yezp/yr7kC/C7Rl25vtSbGM5eP5sbeuE77T/322MfLt0tA8E6f 4dvze2txdTTG
Ewkz+WeDszyEBHKZ4OMseOF2lFTKrUkrSk2vVjUIJ3SX3HS0UUVBR//Z
--------------060508040805090502000700
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: <part2.01060000.00070209@matrox.com>

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRof
Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwL DBgNDRgyIRwh
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjL/wAAR
CABnAIEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD28kKCSQAOpNM84f8APOf/ AL8P/hSyDIQf
9NE/9CFZGr366Xp0166GRl+6mcF2JwBn3JrSEObQmUrGt5w/55z/APfh/wDC jzh/zzn/AO/D
/wCFco3ieNdKsr02km6e5FtJEMsYmyQegOSMcDqami8R2z6je20kM8UdrGsh laGTkFSx3Db8
uMd+vatvq0tdDP2q7nS+cP8AnnP/AN+H/wAKPOH/ADzn/wC/D/4Vy114ntPJ c2M0EzeTI67t
/wB5EDYxtweCM8j061LaeJLCTTknupvKlWKN5lMLrgvwCARkjPcZHvR9Wla9 mHto9zpPOH/P
Of8A78P/AIUecP8AnnP/AN+H/wAK5vUfEVrYlVjR7hhdrbSqqt8hPOfunJx2 HWrMmtadFII5
JXVvkBJhcBC33QxxhSfRsGp9g7Xsx+0W1zb84f8APOf/AL8P/hR5w/55z/8A fh/8KyrfUbS7
uHggaSRkYqzLC+wEdRvxtz+NXNlS6aW5SlfYs+cP+ec//fh/8KPOH/POf/vw /wDhVbZRspcs
Quyz5w/55z/9+H/wo84f885/+/D/AOFVtlGyjliF2WfOH/POf/vw/wDhR5w/ 55z/APfh/wDC
q2yjZRyxC7LPnD/nnP8A9+H/AMKKrbKKOWIXZdxlk/31/mKxtX0Uau9osk7J bwS+a8aZBkIH
HzAgjB5raBwQfQ5pMVMJuDuhyipKzOUfwht84W98yRm7jvIkkQybHXrklssD 9Qanl8O3Etzq
Ev26Ifb7dYpx9nPBCldy/PwOc4OfrXSYoxWn1ip3/rT/ACJ9lHsczdeFftEN jGLvZ9ltJLXP
lZ3bkC7uvGMZxVZ/BjT2ssc+oBpTbxW8TpBtCLGwYZBY5JIHcV1+KMU1iqq2 f9XuS6EH0/rb
9DlW8KzSJM8l+huHvUvA625CBlGMbd+SPxp58LA6lLes1jM8+xpRcWQkwwGC UO4FQfQ5rp8U
YpfWanf+v6Q3Rg91/X9M5yy8NLaa6+prLHGX3boreNow+em/LkHHsBzzW7sq bFGKidWU/iKj
BRvYh2UbKmxRip5irEOyjZU2KMUcwWIdlGypsUYo5gsQ7KKmxRRzBYKKKKkZ z95qVzcTXJiu
xYWFq5je4EYd5HGM7c5AA5HIJJB9ObFhfXCXMEFzcR3cF0he1u41C7sAZVhn GcZIIwMA8DHN
C/02NEu7K9trqXTbiVriOa0Qs8DtywKjJOWLEEA9SCPW1ptkGksUgs5bTTNP DGBJxiSWRhje
RnIADOOeSWPTu/e5nty2+dzBOfP5f1+BBLrutS32qRafpGnzW+nyiJ5LjUXh Zz5aSHCiFgBh
wOW7dqsf8JZpK2lhcTSTRC9gW4VfId/KjbGGkKgiNefvMQODzwaytQ8Aadq8 2tXF/aWTXl3c
rNaXnkq8sG2OMLksOgdCdvIIPPUiodX8K6rql0l7Its1zc2SWt3Gmp3VvFGV LHcBFgyqd7fI
23pgMMmhW0v5fl/n9x0NK+h0c/iLTLbUlsJZpBMXVCywSNGjtjarSBdiMcjA YgncPUZrXPiq
yi1qz0uFZJpp7o27N5brGpEbucOV2uRtwVByM89Ky9Z8OazqOqoyTRNZxXFv PATfTRCJY2Rm
jMKrskyUJ3OxI3cAYqaLQtXh1KzhX7CdNtdRlvRKXbznEglJXZswCGk+9u5A 7UK2l/62/wCC
Gln/AF0/zN977GrxWCx7i0DTO+fuAFQBj3yf++TWW3ifA07Fpk3Nw8EwEh/c bJPKJ+783zlR
2657YrSt7KRNYvb6VlIlSOKIA/dRcnn3LM34AVkv4euXuNZJkh8q4T/QhzmJ 2+Zy3H98KeM1
PqIsp4nsftP2eXessk8sNuscbymQRsEdjtU7QHOCTwMZzVKx8b2NzcTxzI8U UOnwXzXCxytG
wkz8qkxjPRcd2JIC5Uip7PQbqC+024kkhJgsJ4Z8MctLK8bkjI6ZVuvPI4rD /wCEI1E6Wlm0
1vxpllAXSeSMie2cuACqghGzjeCGXGQD2tJW13/4f/hylytf13/yOy07UrXV bYz2rSFVYoyy
xPE6MOzI4DKcEHBA4IPQirdYnhrSZ9KtLj7TGkc083mFVvZ7sgBQozLN8zHj 0UDgY4ydukyQ
ooopAFFFFABRRRQBDc3dtZwma6uIoIh1eVwoH4mnxTRTxLLDIkkbchkYEH8R WHp1omo6neX9
0okmiuHgiVwD5KKcYX03Y3Z/2h6VPJZxaXrtk9mojW9MiTwoAFYhdwkI9RgL nvuHpVWWxPM9
zYorzTWLxYdU8RXN9aeI57e3u0iS4sdVaCC3Bhi+8onTADMWLbCADkng409Q 8TaxpM9tpu0X
N7a2EVxdmLTri5+1O2RtQxDEWSjfMwI+YfLwaSWif9bXLas7HcUVyOr+J7zT 9agjSW2a2a4g
t3tltJpZAZGQZeZT5cJG8EKwO4Ac/NxHJqer32r6TcrPbxaY+rS23kRhllIj SZTvbdtcFkzt
2jHHXFCVwtpf+u52VFc9e2x1nxHNp9zcXkNpa2scypa3MluZHdnBJaMqxChO Bux8xyPu4yrT
WtcmNpplpc2bTbL3deXcLSbxBMsanarJksG5OQM8j0pBZnbUVxOn+JLm4vW1 NjstpdO06eSF
mLLEJXlDlecAj5ST6LXV6Zcy3mmw3MyqrTAyKFBGEJyuQe+3GffNNxabTE9H Yt0UUUgCiiig
AooooAKKKKAM2fTJVvXvdPu/ss8mPNVoxJHKQAAWXIOQBjII4/CpLTTmiumv Lu5a6uyuwSMo
URrxlUA6AkAnqT61Bd6w63j2Vhafa7iMfvSZAkcROCAzYJyQc4APFS2WqG4u WtLq2e1uwu8R
swYOvGWQjqASAehHpV+9Yj3bkyabZp9txApF6++4DEsJDsCcg/7KgYHHFZ03 hPRriC2gkt5j
HbReQii6lG+P+5Jhv3i/7L5HXjk1buNb0+1tnuJpysUc4t2IjYkSEgYwBnv1 6Y5zjmrSXUMl
1NbI+ZYQrOuDwGzjnp2NQu6/r+kXfUzrrwxpN5etdzQzeY7pI6JdSpG7rjaz RqwQsNq/MRn5
R6Uv/CNaV/aq6l9nk+0rKZ1/0iTy1kKlS4j3bAxDHJA5zzVtNTtZLyO0Dutx IsjpG8ToSsbB
WPIHGWXHqDkZHNW6NtQ8jO1LRLHVnie6WdZYgQk1vcyQSAHGV3xsrbTgEjOC QDjgU+LR9Pt5
LZ4bVIzbQNbwhMgJGxUlQBx/Av5VXn8S6VbaibGW4kEqusbuIJGijdsYV5Qu xGOV4ZgfmX1G
dagDDn8MWY02WysUjt1mto7KQyK0ubdNwCAFuuGYBjnrkg4xW2qhVCqMADAF QWd7b38DTW0n
mRrI8RO0j5kYqw59GUirFNt9QfmFFFFIAooooAKKKKACiiigDD0p4rTU7ywu nEdzLcPPCXIH
noxyCvrtztx/sj1qaeeHUNeso7N1lFkZHuJoyCqkrtEZPqchsdtg9a0Lm0tr yEw3VvFPEeqS
oGB/A0+KGKCJYoY0jjXgKigAfgKq636k8r2OWvdIe98RXdhJby/YrhDeGbB2 CQxeRtzjAOPm
x+NZ66VNqy6PNqemySC61NpbyCaElVVbZ4xvU8bSUU88EsPWu8oqVoXdnmDa FefaEuLfTXj1
JoNYhtbk253RSvOWiO/HyAqX2sSB8xwfm52/Adk1q96Y4Rb2zJEPJj0iTT4/ MG7cdsjsXfG0
FwADgctjjtKKd/6+d/1CT5jirpp4dF1Xw42n3s19eSXAgkFtI0DrM7MrmUZV QobkMwb5Dgcr
mtc6E/2/UNR/s95L+LWrP7PcmEl1hxbiQoeoUjzAxHHBz0rvqKE7O/8AXT/I L33/AKucHbad
dJBawtbsn26/vbadZF2kxNcPKGwexRWA/wCugNd5UTWtu12l00ERuUQxrMUG 9VJBKg9QCQOP
YVLQDd22FFFFIQUUUUAFFFFABRRRQBz/APpOtX1yDdTW9jBK0KxwSFGlYY3M zD5hg5AAI6Z7
1YgFzpep29pLcyXNrdBhE0xy8bqM7c4+YEBjk8gjvmiirvq0Z9Lmfcavrdzr Oq22lfYf+JZ5
Za0mhZpLoMu75ZN6rHnlRkNgrk8HFNg8XTi81S3udJui8F+tnZxxGLdcExCQ jJk2ggbmyxUb
do+9kUUVMNdPL9UbLVN9v8ipf+OZYpY3t9PnS1On3lxNLJGjtBLAwUqVEo3Y OQQDgkrhsZI2
5/EkFvqi2RtLp0EkcMt0gTyopJMbFYFt5JyvKqQNwyRzgoptfCu7/WwVFyp2 6X/CxtUUUVJI
UUUUAFFFFABRRRQAUUUUAf/Z
--------------060508040805090502000700
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: <part3.04000700.05080503@matrox.com>

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRof
Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwL DBgNDRgyIRwh
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjL/wAAR
CAD5AZIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2NbJ3G64kdnP8KSMir7Db gn6n9OlO+wR/
9Nf/AAIk/wDiqt0UKy6AUHtoI2w3m5xn/j4k/wDiqb5Nv/02/wDAiT/4qqfi B7jypY7R9lw0
J8ttwXDc4OSrAf8AfJ+hriYdQ8RaZqMP2678+BY5JpYV2tuQMgJHy7lI3E43 Nn2yAOmNKLSb
W5i5tN6noXk2/wD02/8AAiT/AOKo8m3/AOm3/gRJ/wDFV59/wnNzbssKWM9+ weR5HiilbEfm
uqhfLiYFsJ/EUHTk840pPFxjkkRrM7kEoI83nepbYvT+MIxz24HNWqEOwnOS OwFtCwyFnI9p
5P8A4ql+yxf3Lj/v/J/8VTtMk8y2Zv8Ab/oKu1zzUYyasaRu1e5Q+yxf3Lj/ AL/yf/FUfZYv
7lx/3/k/+Kq/RU3j/KOz7lD7LF/cuP8Av/J/8VR9li/uXH/f+T/4qr9FF4/y hZ9yh9li/uXH
/f8Ak/8AiqabeBTgicH3uJP/AIqtGsrU5vLuVGf4Af1NaU4xnK1iZtxV7iyW 8DoVElxGT/El
w+R+ZI/SoPs7Q8mSadB1xNIrgf8AfWGP5e3pWdp9laLpsaJGoO1hb2yyLGuo qqghmBHXsSOG
AycqQKWweK3s1ji2hdzEqqbArFiWUL/CASRg8jGD0ojSjUbSVgc3FXNiO3t5 k3pJOR0/18gw
fQjPFP8AsUX9+f8A8CH/AMazkuzFL5ick/eXPDj/AB9/wPtrQzJPGJIzlT+n sa5qtKVN2ZpC
aktCL7FF/fn/APAh/wDGj7FF/fn/APAh/wDGrFFZFlf7FF/fn/8AAh/8aPsU X9+f/wACH/xq
xRQBX+xRf35//Ah/8aPsUX9+f/wIf/GrFFAFf7FF/fn/APAh/wDGj7FF/fn/ APAh/wDGrFFA
Ff7FF/fn/wDAh/8AGj7FF/fn/wDAh/8AGrFFAFf7FF/fn/8AAh/8aPsUX9+f /wACH/xqxRQB
X+xRf35//Ah/8aPsUX9+f/wIf/GrFFAFf7FF/fn/APAh/wDGj7FF/fn/APAh /wDGrFFAFf7F
F/fn/wDAh/8AGj7FF/fn/wDAh/8AGrFFAFf7FF/fn/8AAh/8aPsUX9+f/wAC H/xqxRQBX+xR
f35//Ah/8aPsUX9+f/wIf/GrFFAFf7FF/fn/APAh/wDGj7FF/fn/APAh/wDG rFFAFf7FF/fn
/wDAh/8AGj7FF/fn/wDAh/8AGrFFAFf7FF/fn/8AAh/8aPsUX9+f/wACH/xq xRQBX+xRf35/
/Ah/8aPsUX9+f/wIf/GrFFAFf7FF/fn/APAh/wDGj7FF/fn/APAh/wDGrFFA Ff7FF/fn/wDA
h/8AGirFFAC/bbT/AJ+of+/go+22n/P1D/38FYcOlQyQRuWkyygnBHp9Kk/s iD+9L+Y/wr0n
SpLqzm559iHW50kvUMUiuvlgZUgjOTWQYka5W4IzKiFFbPRSQSMfgK3f7Ig/ vS/mP8KP7Ig/
vS/mP8K6oVacYqPYxlTm3c5EeHdMQRCGGW28oEL9muJIeCxbadjDIySQDkDJ xirTabaPJLI0
WWllSZzuPLqAFPX2HHTr6muk/siD+9L+Y/wo/seD+9L+Y/wqvb0kL2cw8PfY 7O2um8yOKS4u
DLJuflm2KueT6KBx6VsfbbT/AJ+of+/grH/siD+9L+Y/wo/siD+9L+Y/wrln GlKV7s2jKola
xsfbbT/n6h/7+Cj7baf8/UP/AH8FY/8AZEH96X8x/hR/ZEH96X8x/hU+ypd2 Pnn2Nj7baf8A
P1D/AN/BR9ttP+fqH/v4Kx/7Ig/vSfmP8KP7Ig/vS/mP8KPZUu7Dnn2Nj7ba f8/UP/fwVg63
Okl6hikV18sDKkEZyam/siD+9L+Y/wAKP7Ig/vS/mP8ACtKSpU5cyZM+eStY wEgSOIRqXwAq
qWkYlQv3QCTkY6jHQ9KkiXyU2IWxksSzFiSTkkk8nkmtv+x4P70v5j/Cj+yI P70v5j/Ct1Wp
LZfgZOnN7mPvb1qe2vprVyyEHP3lbof/AK/v/OtH+yIP70v5j/Cj+yIP70v5 j/ClOpRqR5ZD
jCpF3RZh1e0lADSeU3pJwPz6frV4EEZHIrI/siD+9L+Y/wAKb/Ylr/t/p/hX nyw8L+7L8DpV
SXVGzRWN/Ylr/t/p/hR/Ylr/ALf6f4VP1dfzD9o+xs0Vjf2Ja/7f6f4Uf2Ja /wC3+n+FH1df
zB7R9jZorG/sS1/2/wBP8KP7Etf9v9P8KPq6/mD2j7GzRWN/Ylr/ALf6f4Uf 2Ja/7f6f4UfV
1/MHtH2Nmisb+xLX/b/T/Cj+xLX/AG/0/wAKPq6/mD2j7GzRWN/Ylr/t/p/h R/Ylr/t/p/hR
9XX8we0fY2aKxv7Etf8Ab/T/AAo/sS1/2/0/wo+rr+YPaPsbNFY39iWv+3+n +FH9iWv+3+n+
FH1dfzB7R9jZorG/sS1/2/0/wo/sS1/2/wBP8KPq6/mD2j7GzRWN/Ylr/t/p /hR/Ylr/ALf6
f4UfV1/MHtH2Nmisb+xLX/b/AE/wo/sS1/2/0/wo+rr+YPaPsbNFY39iWv8A t/p/hR/Ylr/t
/p/hR9XX8we0fY2aKxv7Etf9v9P8KP7Dtf8Ab/T/AAo+rr+YPaPsbNFY/wDY dr/t/p/hR/Yd
r/t/p/hS+rr+YPaPsbFFZH9hWv8At/p/hR/YNp/t/p/hR9XX8we0fY16Kyf7 BtP9v9P8KKPq
6/mDnfY0bOLNlAf+ma/yrCuvEyJczRWdp9oSEkSTO5RAQQDjCkkZOM4xmuos I86dbHH/ACyT
+QryvQrs6LePNqIeU24+zNaKv+sJBV95PGBycdyy9skTiKkouy0PSy3CQrqT kr2Ssu9zt9K1
qLUbg2ssD210E8wIxyHXjlW78EHt1raWEd6888OLeXfjiF2uftaI0kzTbCpK FGUEg/dyWXj/
AGeOBXpci7cUqVSUo3ZGYYaGHqqMOqT9CDyV96PJX3qSir5mcNiPyV96PJX3 qSijmYWI/JX3
o8lfepKKOZhYj8lfejyV96koo5mFiPyV96PJX3qSijmYWI/JX3o8lfepKKOZ hYj8lfejyV96
koo5mFiPyV96PJX3qSijmYWI/JX3o8lfepKKOZhYj8lfemtCB0qanxruzTUm Fir5VHlVB4it
hJod0/mTxtEhkRoZniIIB7qQSPY8VmTRXWkXuoPYuhgt7eGSQXTSTvIMyEqG Zsr9Tu+lKVRp
7HVSwyqQupa/h06/PsbXlUvk1l6ZqWq3+qvmwA04Syw+YAnyFGK5LeaSclfu +WMZ68ZO2Rhi
PehVLq6Mq1B0pcsmr+Tv8vUg8k0eSamop8zMrEPkmjyamoo5mFiHyTR5Jqal UZYD3o5mFiv5
VHlVl38l7aapqNzam3EcFtDJIsqMxcAyZUYI2nHfn6VDNrepJfzCC1Se1cTL bF41h3yIDxuM
pJGVIyUUd846z7ZLdHZHAzkrxa2v26J2+5m15VHlVnw6rcRaBqN7cqktxZBy 8Yha3wVQNtIZ
mHf7wYqRyDUFvfeIHaGCe1gt5J5dqTSxAKV2MxwiTPkgqOrDO725ftUSsFPV 3St579dFvsa/
lUeVWYL/AFOSOHa9jE93dvbwl42YRhDISSNw3khBwNuOTk9KjttW1S7huZIo bUm2gLFGBUzy
AyL8pLYVSUBBOeD+NL2yH9RqWbutPP5fnp/wNTX8qjyqr6RfPcQsl7NELoTG HZ5LQHcEDFdr
M2SBk5VmBAyDitXy/arU7q5z1KTpy5WUvKo8qrvl+1Hl+1PmM7FLyqXyqueX 7Uvl+1HMFil5
VL5XtVzy6PLpcwWKnlUvl1a8ujy6LjsVfLoq3soouKwzTx/xLbX/AK4p/IVS 1HwxpGq3X2m7
tCZ8BTLHK8TEDoCUIz+NSWMzjT7YBuBEvb2FSvdmJd0kqoOmWwKU1eTRdOpK naUXZiabo2n6
PE8dhbLCJDucgksx92OSfxqzNGzbdozVT+0ov+fqH/vtaP7Si/5+of8AvtaS i10CU3J80ndk
3kyf3f1o8mT+7+tQ/wBpRf8AP1D/AN9rR/aUX/P1D/32tHK+xN0TeTJ/d/Wj yZP7v61D/aUX
/P1D/wB9rR/aUX/P1D/32tHK+wXRN5Mn939aPJk/u/rUP9pRf8/UP/fa0f2l F/z9Q/8Afa0c
r7BdE3kyf3f1o8mT+7+tQ/2lF/z9Q/8Afa0f2lF/z9Q/99rRyvsF0TeTJ/d/ WjyZP7v61D/a
UX/P1D/32tH9pRf8/UP/AH2tHK+wXRN5Mn939aPJk/u/rUP9pRf8/UP/AH2t H9pRf8/UP/fa
0cr7BdE3kyf3f1o8mT+7+tQ/2lF/z9Q/99rR/aUX/P1D/wB9rRyvsF0TeTJ/ d/WjyZP7v61D
/aUX/P1D/wB9rR/aUX/P1D/32tHK+wXRN5Mn939aPJk/u/rUP9pRf8/UP/fa 0f2lF/z9Q/8A
fa0cr7BdE3kyf3f1qWGNl3bhiqn9pRf8/UP/AH2tH9pRf8/UP/fa0cr7BdEu oWLX9qYBdS24
J+ZokjYsMH5SHVhj8O1Z7+Hp5PM367qDeYoV90NqdwGeD+55HJ/Orf8AaUX/ AD9Q/wDfa0f2
lF/z9Q/99rSdNvo/xNoYiUFaNvuT/NGcvhNVv2v11W6F43BuBbWnmHjH3vJz 04rXS1kSNVaU
ysAAZHwGb3OABk+wAqH+0ov+fqH/AL7Wj+0ov+fqH/vtaI0+XZBVxEqtudrT yS/IsfZ39Vo+
zv6rVf8AtKL/AJ+of++1o/tKL/n6h/77WnyvsY3RY+zv6rR9nf1Wq/8AaUX/ AD9Q/wDfa0f2
lF/z9Q/99rRyvsF0WPs7+q017WR42VZTExBAkTBZfcZBGR7gimR3glz5cyPj rtIOKf50n979
KTQ0+pnP4enk8zfruoN5ihXzDancBng/ueRyfzqufB0LSzSnUrgyT5Erm0tM yZBB3HyOcgkc
+prZ86T+9+lHnSf3v0qHTi9zqjjK0drfcv8AIzLXw09lbi3tNavoIBnEcVva ooz14EOKitPC
EVh/x56nc23zbv3NraJzgjPEHXBI/GtjzpP736UedJ/e/Sj2cQ+uVtdVrvot fwMubwubm1a1
n1i9lt2OWikt7RkJznJBhx15+tH/AAjDCBoP7ZvfJaMQtH9ntNpQDAUjycbc EjHTmtTzpP73
6UedJ/e/Sj2cf6YfXKtrafcv8jJt/Cv2WOKO31e7hjhYvGsdtaKEYggkAQ8E gnp6mt2KIxwo
jSNKyqAZHxuY+pwAMn2AFQedJ/e/SjzpP736U1FLYyq151fj/JL8i1to21V8 6T+9+lHnSf3v
0qjItbaMVV86T+9+lHnSf3v0oAtYoxVXzpP736UedJ/e/SgC1ijFVfOk/vfp R50n979KALWK
Kq+dJ/e/SigCpZf8eFv/ANcl/kKJGZZZGViDtQAjtktn+Q/Kiy/48Lf/AK5L /IU51yZD/uf+
zVo/iZPRCIJnQN58gz7mnbJv+fiT8z/jToxiMU6p5mOxHsm/5+JPzP8AjRsm /wCfiT8z/jUl
FLmYWRHsm/5+JPzP+NGyb/n4k/M/41JRRzMLIj2Tf8/En5n/ABo2Tf8APxJ+ Z/xqSijmYWRH
sm/5+JPzP+NGyb/n4k/M/wCNSUUczCyI9k3/AD8Sfmf8aNk3/PxJ+Z/xqSij mYWRHsm/5+JP
zP8AjRsm/wCfiT8z/jUlFHMwsiPZN/z8Sfmf8aNk3/PxJ+Z/xqSijmYWRHsm /wCfiT8z/jUL
STBiPOk4P941aquy/MfrVRfcTQzzZv8AnrJ/30aPNm/56yf99GnbaNtVdCG+ bN/z1k/76NHm
zf8APWT/AL6NO20baLoBvmzf89ZP++jR5s3/AD1k/wC+jTttG2i6Ab5s3/PW T/vo0ebN/wA9
ZP8Avo07bRtougG+bN/z1k/76NHmzf8APWT/AL6NO20baLoBvmzf89ZP++jR 5s3/AD1k/wC+
jTttG2i6AFZ3MZZiSJMZJ5wVbj9B+VWahReF/wB8f+gtU1RIpBRRRUjCiiig AooooAKKKKAC
iiigAooooAKKKKACiiigAooooAgsv+PC3/65L/IVPtyrfVf61BZf8eFv/wBc l/kKnqpfExR2
QgGBilooqRhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU0pk06igBuyj ZTqKdwsN2UbK
dRRcLDdlGynUUXCw3ZRsp1FFwsN2UbKdRRcLDdlGynUUXCwgXCf8CH8jS0UU gCiiigAooooA
KKKKACiiigAooooAKKKKACiiigAooooAKKKKAILL/jwt/wDrkv8AIVPUFl/x 4W//AFyX+Qqe
qn8TFHZBRRRUjCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAxL7V tRt9ch0230+1
lE8byxySXbJwu3dkCM4OW4wT07Vbt9QmSO4fVIrazWHBMi3G+PB9WZVwc9se nrXP6/d6S/jL
Tob3Uo7cQ204k23pgZGJjKhirAjI5wetV9duNDfwbqltb3kN5HEDIsrzeaFk YkgCRicv175A
+orn9o03rtc9mODhUhSXI05Wu7PrJq9722tpbqdcdTsAzKb62DKzIwMq5DKM sDz1A5PoKZPr
GmWsUMtxqNpDHON0TyTqokHHKknkcjp61zmpx6DH4j8PTRjTlaeRz5i7AZF8 pgnP8QztA98V
Ja3NhpGuava6r9ms4JljFoZtqRSQBAPLXPHDFsr/ALXTmn7SV7aGX1Km4qS5 npe3V+9ytLfb
f0Ommu7a2Kie4iiLgld7hdwAycZ9ByfahrhHsjcQTQshj3pIWyhGMg5Hb3rh LO1tLCbwpBqJ
hScSzCNbggSLEQ/lKc891AB78da6/VYbGDw9dQzRW8dmkBGx1URqAOBg8DnG KPaNwlLt/l1M
6+EhRnCKbd3vbT4mtPuHQanbx2MMl9fWKym3WaRo5gIyOAXUk/cyeD7ir0ci TRJLE6vG6hld
TkMD0IPcV5/4futFXVNFne5sFkXRP3jmRAQ67PvHPUKG69AD6V0ng2a3m8L2 q28sciRloz5b
BguGOBx04I/AiqhU5pW9fwdjTG4FUYuavuullrzf5fiawv7NpxALuAyl2jEY kG4soyVxnqAQ
SKbBqen3N1Ja299bS3Eed8Mcqs6YODkA5GDxXH2NvaXGneKE0ZbR76O5la2E O3KExAKVx93k
uAeOc+9TSTWGr2WgwaU8a39pcRN5KcSWqLxIHUcqMZUg8E4HcVKqt287fj/k U8vgna78/LS9
35dPvfkdVPqen213Ha3F9bRXMmNkMkqq7ZOBgE5OTxVafXtPt9bh0qW5hS4l jLgNIAQcqFXB
7tuOB7GucjubIaZrulazsS/nnmPkyY33Kt/qjGOr8BVGOQVxVqxMmna7okWp TAXLaS0JZ2yZ
JQ0eQD/Ee/60RqOTX9d9PUPqNON+a7dn89L3Xl/wPQ6iWeGAIZpUjDuEXewG 5j0Az1J9KbbX
lrextJa3MM6IxRmicMAw6gkd/auf8ZnT1ttMa+NspF/DtaYqCF3jfgntjr7d aydTuI7ibxJD
prx3Um+2ea3gcM8ka4WUBR14G0j8KJVXFtf1tcjD4BVqaldq/W2i95L9b/I7 Kz1Ow1Hf9hvr
a62Y3+RKr7c9M4PHQ1l674hTTgsVncWMl2s8STQSTfvER3VchByT8w646556 GnNNa6z4g0m9
0S6hmeCOUTywtkLEyfKj46ZbBCnngnsaxptQ09fBNtaXDIup21zA9zbkZmWU TLvcqOTnJ577
vepnVe2367bG+HwEPawbTd2rx6q7a18tOy3Xz7ufULK1uIre4u7eKaY4ijkk Cs5zj5QTk8+l
WK4bUIrS8vtXstX1O8tY7x0kgt1jj/0iPYm0JujLlwwPyg5B7ZOT18N7bvdt YCRjdRRLI6MD
kK2QCT0PQ9K1hPm3OLEYT2UIyV22rvR2tp1t52f562WfrGuvol1bNdWqnTpp PLe5WUlojgnL
Jt+7x13cVavb27hktBZ29vcR3D7S8lwUxwWyMI2RgHuO1V9YvLCO+022vLm2 QyzMPKmdRvUx
uvQ9QSQPxxWTbWl5oWtWGlKrz6RJMz2khJLW5CPmJieq91PXjHNS5SUrX0v/ AEjanQpTpxly
2lZvW9pJX213XbZrz36Y6hZLfLYm7txdsMrAZB5hGM5C5z0BoOoWS3y2LXdu LthlYDIPMIxn
IXOegNcbBb21zcmz1PVLxb+DUmuI7JViy7eYWR0+TeV2kZO7AGQcAcEFvbXN ybPU9UvFv4NS
a4jslWLLt5hZHT5N5XaRk7sAZBwBwlVbtpv/AF95o8upreT0XZ/etNV+H946 DxFr0ej6ddGG
4sv7QjgaaO3uJtpYAE5Cjk9DxxnHUda1oHMtvHI2MsgY49xXDXd5ZxeGvEth qLxJqbm5cxyY
DzDBMbKOrAKFwR029sV2emzJcaZbSoHCtGuN6FT09CARTpTcm/RfLcxxWGVG hGy1u9e+itby
3t/VrVFFFbHnBRRRQAUUUUAFFFFAEFl/x4W//XJf5Cp6gsv+PC3/AOuS/wAh U9VP4mKOyCii
ipGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUVhXN9qKeL7ezi jgNn9keR905U
43oC2Np5HYZ5yeRUU3ieWCxXVmsAdGLD/SFmzKEJwJDHtxtzjo2cHOO1R7SP U61gq0lHlV7+
a63svV223OioqC7vIbGxmvJ3xBDGZHYc8AZrAs/Fhvr+awtobGe58gzweRfi RHAOCrsF+RuQ
ehB9eKJTjF2ZFLC1qsXOC0W/9P8ApHTUVg6Tr11q0UcsenIEVH+0qs53wyqS PKwyAFuBnJGM
+mCa6eKrk6MuryaSY7JHZLjM4MkYDlSwULhgMc8jvjOMlOrFamn1CvzONtU7 brd3st+tv6uj
pqK5OK5ttI8S+ILt/MdGhtW2hyzO7FwFXccDJIAGQB7Vorrl1balBY6lp6wy 3KM1sbefzVkZ
RlkJZU2tjkZ4PPPFCqLqE8FUT9zVWT6LopPS+tr626am3RXNW/iuR9NXUbrT vstmd6GSS4X5
ZRJ5YU+x67ugwe2CbOheI4tZury1xb+da7GLWtyJ4nVhwQwA5BBBBA7dc01U i3ZMU8DiIRlN
x0jvqnbW3Rm5RWBd3eov4sg0+OOI2b2bu/8ApDI2N6Atwv3hzgZHU8is7w3q MmnaVptt9kJt
Jbye285pvmDeZIVwpB3DjGSQc9jS9orr+uti1gZul7RPXTTTZ83nv7ux2FFc xP40s4dRigVr
WSB7r7KxW7Xz0bJXcYsfd3DGc5wc4xV/xTeXdh4avrmyCeckRwzOV2DpuGAc kdhTVSLTa6Ef
UqynCE1bn2ubFFc/Nrupw6h/Z40USXZtWuFCXQ8tyrAbQxUHuOSBzxjHzVXm 8a2kWoQwg2rw
vc/ZX23a+ej5K5MWPu7hjOc4OcYpe1h3HHL8RL4Y366NP9fu79DqKK5ifxpZ w6jFArWskD3X
2Vit2vno2Su4xY+7uGM5zg5xiunqozjLZmVbDVaKTqK19goooqjAKKKKACii igAooooAKKKK
ACiiigAooooAgsv+PC3/AOuS/wAhU9QWX/Hhb/8AXJf5Cp6qfxMUdkFFFFSM KKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigDJvNOupNft76HyGg+zSW0yyMVYBmVs rgHP3SMEis2H
QNRTRP8AhHpXtpNNH7sXPmMJvJznaU27c4+Xdu98dq6iiodNM64Y2pCKiraW t6q9n6q78u6Z
U1Gwj1HS7mwdikc8TRbl6rkYyPpVOEeIBasJv7PM8cZWMq77Zn7M3y/IB6Dd knqMc69FNxu7
mUKzjHlaTV76/wBdf61MC10zUrHWkurdbb7NcQr9uV7hizSj+NfkxnHHbIxw MCsvSLLUdT8M
tp5W1WwnnnWSbzG8wJ5z7lCbcZPIzu4znHHPYyRpLG0ciK6MCrKwyCD1BFQ2 dhZ6fG0dlaQW
0bHcVhjCAn1wBUOnrbpr+J1LHPkd1711Z+l7dd1fT0sc7f8Ahu91HUNTLPBb wXEcH2eWOQs8
bxMWUlCoBBJ5Ge3vxfWx1K9vLS71KGzjksgzRRwTM4kkZduSSg2gDPGG6+3O 3RTVNGcsdUcV
F200X3JP70rP8LM5u10K/Phk6fcPbwXUVwbiCWJzIobzfNXIKr3OCPTn6bFj /aTbn1AW0ZwA
sVu5cZ7sWYA8+mOMdTni5RVRjYzq4mVS/Mlq2/m97ev/AAxk3lje/wBv2+o2 gt3RbaSCRJXZ
SMsrAjCnP3cdvXnpWRDomtR6dptqYdP3Wt+10xF0+CpZmAH7vr85H4D1462i pdNP+vO5pDGz
hFRsnb/g+fmzEstP1TT5ZbSCS1OnvO0ySsW82IMxZk24w3JOGyMZ5Bxzb12w k1TQr2xhdUln
iKoX6Z7Zx2rQoquVcvKZvEzdRVdLrX1fdmHHZ6q/iO31GeGyWJbVoJAlwxYF mVsgFBnG3HUd
c8dKWy0/VNPlltIJLU6e87TJKxbzYgzFmTbjDck4bIxnkHHO3RSULdSnipNc tla1rel7P11M
Sy0/VNPlltIJLU6e87TJKxbzYgzFmTbjDck4bIxnkHHOnb/bPOuftPkeVvH2 fy87tmB97PfO
enbFWKKajYzqV3Ubckrv+r+oUUUVRiFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAQWX/Hhb/8A
XJf5Cp6gsv8Ajwt/+uS/yFT1U/iYo7IKKybyTToL+eXUVtyPKhSPzUDlmJlO 1BgksccAcnFV
/wCxn1H/AI+bS0sLY/8ALG3iQzMPRpMYXIOCE5BGRJUtpadTWFNyXM9F3f6d /wCrmtd31pp8
QlvbqC2jLbQ80gQE9cZPfg/lVP8At
Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor) [message #324692 is a reply to message #324667] Wed, 30 January 2008 19:30 Go to previous messageGo to next message
Mircea Luchian is currently offline Mircea LuchianFriend
Messages: 89
Registered: July 2009
Member
This is a multi-part message in MIME format.
--------------050409070902010705050606
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi Paul an Tom,

With some extra inspiration, I found the solution to my problem. Here it
is:

textName.addFocusListener(new FocusListener()
{
IAction emfcutaction =
detailsPage.getActionBars().getGlobalActionHandler(ActionFac tory.CUT.getId());
IAction emfcopyaction =
detailsPage.getActionBars().getGlobalActionHandler(ActionFac tory.COPY.getId());
IAction emfpasteaction =
detailsPage.getActionBars().getGlobalActionHandler(ActionFac tory.PASTE.getId());

IAction standardCut = new Action()
{
public void run()
{
textName.cut();
}
};

IAction standardCopy = new Action()
{
public void run()
{
textName.copy();
}
};

IAction standardPaste = new Action()
{
public void run()
{
textName.paste();
}
};

public void focusLost(FocusEvent e)
{


detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.CUT.getId(),
emfcutaction);

detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.COPY.getId(),
emfcopyaction);

detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.PASTE.getId(),
emfpasteaction);
detailsPage.getActionBars().updateActionBars();
}


public void focusGained(FocusEvent e)
{

detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.CUT.getId(),
standardCut);

detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.COPY.getId(),
standardCopy);

detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.PASTE.getId(),
standardPaste);
detailsPage.getActionBars().updateActionBars();
}
});

Thanks for your help.

Mircea


Paul Webster wrote:
> Mircea Luchian wrote:
>>
>> Would it be possible that I pass the wrong workbench window to these
>> three actions? Here is how I initialized them below:
>>
>> IAction standardCut =
>> ActionFactory.CUT.create(editor.getEditorSite().getWorkbench Window());
>> IAction standardCopy =
>> ActionFactory.COPY.create(editor.getEditorSite().getWorkbenc hWindow());
>> IAction standardPaste =
>> ActionFactory.PASTE.create(editor.getEditorSite().getWorkben chWindow());
>
> As Tom mentioned, the ActionFactory actions are retargetable (and not
> even that in 3.4). They don't do anything, they just delegate
> execution to something else.
>
> If you need to have "copy" work as *either* normal copy in the current
> text control *or* run your copy action to deal with something in the
> part (a graphical object, for example) you can use
> org.eclipse.ui.actions.TextActionHandler
>
> PW
>
>


--------------050409070902010705050606
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Hi Paul an Tom, <br>
<br>
With some extra inspiration, I found the solution to my problem. Here
it is: <br>
<br>
&nbsp;&nbsp;<font face="Courier New, Courier, monospace">&nbsp; &nbsp;&nbsp;&nbsp;
textName.addFocusListener(new FocusListener()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IAction emfcutaction =
detailsPage.getActionBars().getGlobalActionHandler(ActionFac tory.CUT.getId()); <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IAction emfcopyaction =
detailsPage.getActionBars().getGlobalActionHandler(ActionFac tory.COPY.getId()); <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IAction emfpasteaction =
detailsPage.getActionBars().getGlobalActionHandler(ActionFac tory.PASTE.getId()); <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IAction standardCut = new Action()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void run()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; textName.cut();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; };<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IAction standardCopy = new Action()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void run()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; textName.copy();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; };<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IAction standardPaste = new Action()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void run()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; textName.paste();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void focusLost(FocusEvent e)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.CUT.getId(),
emfcutaction);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.COPY.getId(),
emfcopyaction);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.PASTE.getId(),
emfpasteaction);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; detailsPage.getActionBars().updateActionBars();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void focusGained(FocusEvent e)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.CUT.getId(),
standardCut);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.COPY.getId(),
standardCopy);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.PASTE.getId(),
standardPaste);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; detailsPage.getActionBars().updateActionBars();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</font><br>
<font face="Courier New, Courier, monospace">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }); </font><br>
<br>
Thanks for your help. <br>
<br>
Mircea<br>
<br>
<br>
Paul Webster wrote:
<blockquote cite="midfnq256$hkm$1@build.eclipse.org" type="cite">Mircea
Luchian wrote:
<br>
<blockquote type="cite"><br>
Would it be possible that I pass the wrong workbench window to these
three actions? Here is how I initialized them below:
<br>
<br>
&nbsp;&nbsp;&nbsp; IAction standardCut =
ActionFactory.CUT.create(editor.getEditorSite().getWorkbench Window());
<br>
&nbsp;&nbsp;&nbsp; IAction standardCopy =
ActionFactory.COPY.create(editor.getEditorSite().getWorkbenc hWindow());
<br>
&nbsp;&nbsp;&nbsp; IAction standardPaste =
ActionFactory.PASTE.create(editor.getEditorSite().getWorkben chWindow());
<br>
</blockquote>
<br>
As Tom mentioned, the ActionFactory actions are retargetable (and not
even that in 3.4).&nbsp; They don't do anything, they just delegate
execution to something else.
<br>
<br>
If you need to have "copy" work as *either* normal copy in the current
text control *or* run your copy action to deal with something in the
part (a graphical object, for example) you can use
org.eclipse.ui.actions.TextActionHandler
<br>
<br>
PW
<br>
<br>
<br>
</blockquote>
<br>
</body>
</html>

--------------050409070902010705050606--
Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor) [message #324697 is a reply to message #324692] Wed, 30 January 2008 20:16 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: merks.ca.ibm.com

This is a multi-part message in MIME format.
--------------080608080206030402080502
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Mircea,

Such a nice community effort all around! Thanks everyone and thanks for
sharing the results!! Please include this in the bugzilla...


Mircea Luchian wrote:
> Hi Paul an Tom,
>
> With some extra inspiration, I found the solution to my problem. Here
> it is:
>
> textName.addFocusListener(new FocusListener()
> {
> IAction emfcutaction =
> detailsPage.getActionBars().getGlobalActionHandler(ActionFac tory.CUT.getId());
> IAction emfcopyaction =
> detailsPage.getActionBars().getGlobalActionHandler(ActionFac tory.COPY.getId());
> IAction emfpasteaction =
> detailsPage.getActionBars().getGlobalActionHandler(ActionFac tory.PASTE.getId());
>
> IAction standardCut = new Action()
> {
> public void run()
> {
> textName.cut();
> }
> };
>
> IAction standardCopy = new Action()
> {
> public void run()
> {
> textName.copy();
> }
> };
>
> IAction standardPaste = new Action()
> {
> public void run()
> {
> textName.paste();
> }
> };
>
> public void focusLost(FocusEvent e)
> {
>
>
> detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.CUT.getId(),
> emfcutaction);
>
> detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.COPY.getId(),
> emfcopyaction);
>
> detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.PASTE.getId(),
> emfpasteaction);
> detailsPage.getActionBars().updateActionBars();
> }
>
>
> public void focusGained(FocusEvent e)
> {
>
> detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.CUT.getId(),
> standardCut);
>
> detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.COPY.getId(),
> standardCopy);
>
> detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.PASTE.getId(),
> standardPaste);
> detailsPage.getActionBars().updateActionBars();
> }
> });
>
> Thanks for your help.
>
> Mircea
>
>
> Paul Webster wrote:
>> Mircea Luchian wrote:
>>>
>>> Would it be possible that I pass the wrong workbench window to these
>>> three actions? Here is how I initialized them below:
>>>
>>> IAction standardCut =
>>> ActionFactory.CUT.create(editor.getEditorSite().getWorkbench Window());
>>> IAction standardCopy =
>>> ActionFactory.COPY.create(editor.getEditorSite().getWorkbenc hWindow());
>>> IAction standardPaste =
>>> ActionFactory.PASTE.create(editor.getEditorSite().getWorkben chWindow());
>>>
>>
>> As Tom mentioned, the ActionFactory actions are retargetable (and not
>> even that in 3.4). They don't do anything, they just delegate
>> execution to something else.
>>
>> If you need to have "copy" work as *either* normal copy in the
>> current text control *or* run your copy action to deal with something
>> in the part (a graphical object, for example) you can use
>> org.eclipse.ui.actions.TextActionHandler
>>
>> PW
>>
>>
>


--------------080608080206030402080502
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Mircea,<br>
<br>
Such a nice community effort all around!&nbsp; Thanks everyone and thanks
for sharing the results!!&nbsp; Please include this in the bugzilla...<br>
<br>
<br>
Mircea Luchian wrote:
<blockquote cite="mid:fnqj93$7s9$1@build.eclipse.org" type="cite">
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<title></title>
Hi Paul an Tom, <br>
<br>
With some extra inspiration, I found the solution to my problem. Here
it is: <br>
<br>
&nbsp;&nbsp;<font face="Courier New, Courier, monospace">&nbsp; &nbsp;&nbsp;&nbsp;
textName.addFocusListener(new FocusListener()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IAction emfcutaction =
detailsPage.getActionBars().getGlobalActionHandler(ActionFac tory.CUT.getId()); <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IAction emfcopyaction =
detailsPage.getActionBars().getGlobalActionHandler(ActionFac tory.COPY.getId()); <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IAction emfpasteaction =
detailsPage.getActionBars().getGlobalActionHandler(ActionFac tory.PASTE.getId()); <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IAction standardCut = new Action()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void run()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; textName.cut();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; };<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IAction standardCopy = new Action()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void run()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; textName.copy();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; };<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IAction standardPaste = new Action()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void run()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; textName.paste();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void focusLost(FocusEvent e)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.CUT.getId(),
emfcutaction);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.COPY.getId(),
emfcopyaction);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.PASTE.getId(),
emfpasteaction);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; detailsPage.getActionBars().updateActionBars();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void focusGained(FocusEvent e)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.CUT.getId(),
standardCut);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.COPY.getId(),
standardCopy);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
detailsPage.getActionBars().setGlobalActionHandler(ActionFac tory.PASTE.getId(),
standardPaste);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; detailsPage.getActionBars().updateActionBars();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</font><br>
<font face="Courier New, Courier, monospace">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }); </font><br>
<br>
Thanks for your help. <br>
<br>
Mircea<br>
<br>
<br>
Paul Webster wrote:
<blockquote cite="midfnq256$hkm$1@build.eclipse.org" type="cite">Mircea
Luchian wrote: <br>
<blockquote type="cite"><br>
Would it be possible that I pass the wrong workbench window to these
three actions? Here is how I initialized them below: <br>
<br>
&nbsp;&nbsp;&nbsp; IAction standardCut =
ActionFactory.CUT.create(editor.getEditorSite().getWorkbench Window()); <br>
&nbsp;&nbsp;&nbsp; IAction standardCopy =
ActionFactory.COPY.create(editor.getEditorSite().getWorkbenc hWindow());
<br>
&nbsp;&nbsp;&nbsp; IAction standardPaste =
ActionFactory.PASTE.create(editor.getEditorSite().getWorkben chWindow());
<br>
</blockquote>
<br>
As Tom mentioned, the ActionFactory actions are retargetable (and not
even that in 3.4).&nbsp; They don't do anything, they just delegate
execution to something else. <br>
<br>
If you need to have "copy" work as *either* normal copy in the current
text control *or* run your copy action to deal with something in the
part (a graphical object, for example) you can use
org.eclipse.ui.actions.TextActionHandler <br>
<br>
PW <br>
<br>
<br>
</blockquote>
<br>
</blockquote>
<br>
</body>
</html>

--------------080608080206030402080502--
Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor) [message #324732 is a reply to message #324692] Thu, 31 January 2008 13:45 Go to previous message
Paul Webster is currently offline Paul WebsterFriend
Messages: 6859
Registered: July 2009
Location: Ottawa
Senior Member

Mircea Luchian wrote:
> Hi Paul an Tom,
>
> With some extra inspiration, I found the solution to my problem. Here it
> is:

>> org.eclipse.ui.actions.TextActionHandler

That's more or less how TextActionHandler works :-) You add multiple
text controls to it, and your part-level actions (i.e. one part level
cut + any of your text controls).

When the text control is active, it will use textControl.cut() and if no
registered text control is active, it will use the part level cut.

Later,
PW


--
Paul Webster
http://wiki.eclipse.org/Platform_Command_Framework
http://wiki.eclipse.org/Command_Core_Expressions
http://wiki.eclipse.org/Menu_Contributions
http://wiki.eclipse.org/Menus_Extension_Mapping
http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse. platform.doc.isv/guide/workbench.htm


Previous Topic:Plugin export generates "logs.zip", notifying errors in a error-free workbench
Next Topic:Migration source code
Goto Forum:
  


Current Time: Tue Sep 17 09:21:14 GMT 2024

Powered by FUDForum. Page generated in 0.05394 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top