[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.tools.emf] Re: Limit Copy, Paste, Cut keyboard shortcuts to EMF tree only (not the entire editor)

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(input));
         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





JPEG image

JPEG image

JPEG image

JPEG image

JPEG image

JPEG image

JPEG image

JPEG image