The mouse listener for the workspace JTree was not designed for some OS which like as linux.
So, I made a temporary strategy myself. It adjust a popup trigger timing.
Sample strategy is as below.
package jforex;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.lang.reflect.Field;
import javax.swing.JOptionPane;
import javax.swing.JTree;
import com.dukascopy.api.IAccount;
import com.dukascopy.api.IBar;
import com.dukascopy.api.IConsole;
import com.dukascopy.api.IContext;
import com.dukascopy.api.IMessage;
import com.dukascopy.api.IStrategy;
import com.dukascopy.api.ITick;
import com.dukascopy.api.Instrument;
import com.dukascopy.api.JFException;
import com.dukascopy.api.Period;
import com.dukascopy.api.RequiresFullAccess;
@RequiresFullAccess
public class BugFixSample implements IStrategy{
@Override
public void onStart(final IContext context) throws JFException {
int option = JOptionPane.showConfirmDialog(null,
"<html><b>Bug fix for DDS2-jCLient-JForex-2.45.3<br>Would you like to replace the WorkspaceJTreeMouseListener?</b></html>",
"Bug fix for DDS2-jCLient-JForex-2.45.3",
JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
if(option == JOptionPane.OK_OPTION){
bugfix(context);
}
context.stop();
}
private void bugfix(IContext context) throws JFException {
IConsole console = context.getConsole();
console.getNotif().println("start: Bug fix for the WorkspaceJTreeMouseListener");
Object obj = context.getUserInterface().getMainFrame();
obj = getField(obj.getClass(), obj, "dealPanel");
obj = getField(obj.getClass(), obj, "workspaceTreePanel");
JTree tree = (JTree) getField(obj.getClass(), obj, "workspaceJTree");
for(final MouseListener ml: tree.getMouseListeners()){
if(ml.getClass().getName().equals("com.dukascopy.dds2.greed.gui.component.tree.a.p")){
tree.removeMouseListener(ml);
tree.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent event) {
MouseEvent me = event.getButton() == MouseEvent.BUTTON3 && !event.isPopupTrigger()?
new MouseEvent(event.getComponent(), event.getID(), event.getWhen(), event.getModifiers(), event.getX(), event.getY(), event.getClickCount(), true, event.getButton()):
event;
ml.mouseReleased(me);
}
@Override
public void mousePressed(MouseEvent event) {
MouseEvent me = event.getButton() == MouseEvent.BUTTON3 && event.isPopupTrigger()?
new MouseEvent(event.getComponent(), event.getID(), event.getWhen(), event.getModifiers(), event.getX(), event.getY(), event.getClickCount(), false, event.getButton()):
event;
ml.mousePressed(me);
}
@Override
public void mouseExited(MouseEvent event) {
ml.mouseExited(event);
}
@Override
public void mouseEntered(MouseEvent event){
ml.mouseEntered(event);
}
@Override
public void mouseClicked(MouseEvent event) {
ml.mouseClicked(event);
}
});
console.getWarn().println("replaced the mouse listener!!");
break;
}
}
console.getNotif().println("end: Bug fix for the WorkspaceJTreeMouseListener");
}
private Object getField(Class<?> calzz, Object obj, String name){
Field field;
try {
field = calzz.getDeclaredField(name);
field.setAccessible(true);
return field.get(obj);
} catch (Exception e) {
return null;
}
}
@Override
public void onMessage(IMessage message) throws JFException {
}
@Override
public void onStop() throws JFException {
}
@Override
public void onTick(Instrument instrument, ITick tick) throws JFException {
}
@Override
public void onBar(Instrument instrument, Period period, IBar askBar,
IBar bidBar) throws JFException {
}
@Override
public void onAccount(IAccount account) throws JFException {
}
}
(How to use that without right click menu of the Worlspace,
Main menu Tools >> Strategies >> Open >> Local Run)
The popup trigger timing of the Linux OS is not same as Windows.
Please tell that to a programer of the WorkspaceJTreeMouseListener.
Best Regards.