DelegateAction is a special AbstractAction which can do something then delegate to another action depending on the return value of {@link #delegateActionPerformed(java.awt.event.ActionEvent)}. There are two usages of it. First, you can use {@link #replaceAction(javax.swing.JComponent,int,javax.swing.KeyStroke,DelegateAction)} to replace the actionassociated with the specified keystroke with the DelegateAction. The DelegateAction will be triggered when the keystroke is pressed. After DelegateAction is done, it can return true or false. If false, the original action associated with the keystroke will be triggered as well. This solves the problem that {@link JComponent#registerKeyboardAction(java.awt.event.ActionListener,String,javax.swing.KeyStroke,int)} will replace theoriginal action so that the original action will never be triggered.
The second way to use DelegateAction is to delegate the action from one component to another component using {@link #replaceAction(javax.swing.JComponent,int,javax.swing.JComponent,int,javax.swing.KeyStroke,DelegateAction)}. In this case, the keystroke on the first component parameter will be triggered the DelegateAction. If DelegateAction returns false, the registered action on the second component parameter will be triggered. If you pass in {@link PassthroughDelegateAction}, the registered action on the second component will always be triggered.
Please notes, if you call replaceAction several times on the same component with the same keystroke, it will form a chain of DelegateActions. In this case, the first call will be the first DelegateAction. In the other words, the first one will have the highest priority and will be triggered first. Ideally, we should assign a priority to each DelegateAction. But for the sake of simplicity, we decided not doing it for now. So because of this, this class is not ready to be used as public API. We have to make it public because different packages in JIDE need to use it. If you want to use, please use it with caution. We don't guarantee that we will not change the public methods on this classes.