/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.action;
import java.util.*;
import org.jboss.tools.common.model.ui.dnd.DnDUtil;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Menu;
import org.jboss.tools.common.meta.action.*;
import org.jboss.tools.common.model.XModelObject;
public abstract class XMenuInvoker implements MouseListener, KeyListener {
protected Viewer viewer;
protected boolean onKeyRelease = false;
ModelContributionManager standardInvoker;
public XMenuInvoker() {}
public void setStandardInvoker(ModelContributionManager standardInvoker) {
this.standardInvoker = standardInvoker;
}
public void setViewer(Viewer viewer) {
this.viewer = viewer;
}
public void setOnKeyRelease(boolean b) {
onKeyRelease = b;
}
public void mouseDoubleClick(MouseEvent e) {
}
public void mouseDown(MouseEvent e) {
if(standardInvoker != null) {
XModelObject eo = getModelObjectAt(new Point(e.x, e.y));
XModelObject o = getSelectedModelObject();
if(o == null && eo == null) return;
XModelObject[] os = getSelectedModelObjects();
if(eo != null && (o == null || os == null || os.length < 2)) {
o = eo;
os = null;
} else if(isIncluded(eo, os)) {
o = eo;
}
if(os != null && os.length > 0) {
standardInvoker.setSelection(new StructuredSelection(os));
} else if(o != null) {
standardInvoker.setSelection(new StructuredSelection(o));
}
}
}
public void mouseUp(MouseEvent e) {
handleMouseUp(e);
}
protected void handleMouseUp(MouseEvent e) {
if(e.button == 3 && standardInvoker == null) {
XModelObject eo = getModelObjectAt(new Point(e.x, e.y));
XModelObject o = getSelectedModelObject();
if(o == null && eo == null) return;
XModelObject[] os = getSelectedModelObjects();
if(eo != null && (o == null || os == null || os.length < 2)) {
o = eo;
os = null;
} else if(isIncluded(eo, os)) {
o = eo;
}
XModelObjectActionList l = new XModelObjectActionList(getActionList(o), o, os, new Object[]{o, getRunningProperties()});
Menu menu = l.createMenu(viewer.getControl());
menu.setVisible(true);
}
if(e.button == 1) {
XModelObject o = getSelectedModelObject();
if(o == null) return;
if("true".equals(o.get("overlapped"))) { //$NON-NLS-1$ //$NON-NLS-2$
XActionInvoker.invoke("Open", o, new Properties()); //$NON-NLS-1$
}
}
}
private boolean isIncluded(XModelObject object, XModelObject[] objects) {
if(object == null || objects == null) return false;
for (int i = 0; i < objects.length; i++) if(objects[i] == object) return true;
return false;
}
protected XActionList getActionList(XModelObject o) {
return o.getModelEntity().getActionList();
}
public abstract XModelObject getSelectedModelObject();
public XModelObject[] getSelectedModelObjects() {
return null;
}
public XModelObject getModelObjectAt(Point p) {
return null;
}
public void keyPressed(KeyEvent e) {
if(!onKeyRelease) processKey(e);
}
public void keyReleased(KeyEvent e) {
if(onKeyRelease) processKey(e);
}
protected void processKey(KeyEvent e) {
if(((e.stateMask & SWT.CTRL) != 0) && e.keyCode == (int)'c') {
invoke("CopyActions.Copy"); //$NON-NLS-1$
} else if(((e.stateMask & SWT.CTRL) != 0) && e.keyCode == (int)'x') {
invoke("CopyActions.Cut"); //$NON-NLS-1$
} else if(((e.stateMask & SWT.CTRL) != 0) && e.keyCode == (int)'v') {
invoke("CopyActions.Paste"); //$NON-NLS-1$
} else if((e.stateMask == 0) && e.character == SWT.DEL) {
invoke("DeleteActions.Delete"); //$NON-NLS-1$
}
}
private void invoke(String actionPath) {
XModelObject object = getSelectedModelObject();
if(object == null) return;
XModelObject[] objects = getSelectedModelObjects();
if(DnDUtil.getEnabledAction(object, objects, actionPath) == null) return;
if(objects == null) {
XActionInvoker.invoke(actionPath, object, getRunningProperties());
} else {
XActionInvoker.invoke(actionPath, object, objects, getRunningProperties());
}
}
private Properties getRunningProperties() {
Properties p = new Properties();
fillRunningProperties(p);
return p;
}
protected void fillRunningProperties(Properties p) {}
}