/********************************************************* begin of preamble
**
** Copyright (C) 2003-2010 Software- und Organisations-Service GmbH.
** All rights reserved.
**
** This file may be used under the terms of either the
**
** GNU General Public License version 2.0 (GPL)
**
** as published by the Free Software Foundation
** http://www.gnu.org/licenses/gpl-2.0.txt and appearing in the file
** LICENSE.GPL included in the packaging of this file.
**
** or the
**
** Agreement for Purchase and Licensing
**
** as offered by Software- und Organisations-Service GmbH
** in the respective terms of supply that ship with this file.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
** IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
********************************************************** end of preamble*/
package sos.scheduler.editor.app;
import java.util.List;
import java.util.HashMap;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.jdom.xpath.XPath;
import sos.scheduler.editor.conf.SchedulerDom;
import sos.scheduler.editor.conf.forms.SchedulerForm;
import sos.scheduler.editor.conf.listeners.SchedulerListener;
import sos.scheduler.editor.actions.forms.ActionsForm;
public class ContextMenu {
private SchedulerDom _dom = null;
private Combo _combo = null;
private Menu _menu = null;
private static final String GOTO = "Goto";
private static final String DELETE = "Delete";
private static int _type = -1;
public ContextMenu(Combo combo, SchedulerDom dom, int type) {
_combo = combo;
_dom = dom;
_type = type;
createMenu();
}
public int message(String message, int style) {
MessageBox mb = new MessageBox(_combo.getShell(), style);
mb.setMessage(message);
return mb.open();
}
private void createMenu() {
_menu = new Menu(_combo.getShell(), SWT.POP_UP);
MenuItem item = new MenuItem(_menu, SWT.PUSH);
item.addListener(SWT.Selection, getListener());
if(_type == Editor.SCRIPT)
item.setText(ContextMenu.DELETE);
else
item.setText(ContextMenu.GOTO);
_menu.addListener(SWT.Show, new Listener() {
public void handleEvent(Event e) {
MenuItem item = null;
if(_type == Editor.SCRIPT) {
item = getItem(ContextMenu.DELETE);
}else
item = getItem(ContextMenu.GOTO);
if(item != null)
item.setEnabled(true);
}
});
}
public Menu getMenu() {
return _menu;
}
private Listener getListener() {
return new Listener() {
public void handleEvent(Event e) {
if(_type == Editor.SCRIPT)
delete(_combo, _dom, _type);
else
goTo(_combo.getText(), _dom, _type);
}
};
}
/*private void applyXMLChange(String newXML){
if(_dom instanceof SchedulerDom) {
if(!((sos.scheduler.editor.conf.SchedulerDom)_dom).isLifeElement())
newXML = newXML.replaceAll("\\?>", "?><spooler>" )+ "</spooler>";
}
//System.out.println("debug: \n" + newXML);
try {
_dom.readString(newXML, true);
refreshTree("main");
} catch (Exception de) {
try {
new ErrorLog("error in " + sos.util.SOSClassUtil.getMethodName() , de);
} catch(Exception ee) {
//tu nichts
}
MainWindow.message(MainWindow.getSShell(), "..error while update XML: " + de.getMessage(), SWT.ICON_WARNING );
}
}
private Listener getCopyListener() {
return new Listener() {
public void handleEvent(Event e) {
Element element = getElement();
if (element != null)
_copy = (Element) element.clone();
}
};
}
private Listener getDeleteListener () {
return new Listener() {
public void handleEvent(Event e) {
int ok = MainWindow.message("Do you wont really remove life file: " + _dom.getFilename(), //$NON-NLS-1$
SWT.ICON_QUESTION | SWT.YES | SWT.NO | SWT.CANCEL);
if (ok == SWT.CANCEL || ok == SWT.NO)
return;
if(!new java.io.File(_dom.getFilename()).delete()) {
MainWindow.message("could not remove life file", SWT.ICON_WARNING | SWT.OK);
}
sos.scheduler.editor.app.IContainer con = MainWindow.getContainer();
con.getCurrentTab().dispose();
}
};
}
private Listener getClipboardListener() {
return new Listener() {
public void handleEvent(Event e) {
}
};
}
private Listener getPasteListener() {
return new Listener() {
public void handleEvent(Event e) {
Element target = getElement();
if ((target != null && _copy != null)) {
String tName = target.getName();
String cName = _copy.getName();
if(_dom instanceof SchedulerDom && ((SchedulerDom)_dom).isLifeElement()) {
//if(cName.equals("job")) {
target = (Element)_copy.clone();
TreeData data = (TreeData) _combo.getData();
data.setElement(target);
return;
//}
}
if (tName.equals("jobs") && cName.equals("job")) { // copy job
String append = "copy(" + (target.getChildren("job").size() + 1);
Element currCopy = (Element)_copy.clone();
if(existJobname(target, Utils.getAttributeValue("name", _copy)))
currCopy.setAttribute("name", append + ")of_" + Utils.getAttributeValue("name", _copy));
target.addContent(currCopy);
refreshTree("jobs");
//_gui.update();
if(_dom instanceof SchedulerDom && !((SchedulerDom)_dom).isLifeElement())
//_gui.updateJobs();
_dom.setChanged(true);
} else if (tName.equals("job") && cName.equals("run_time")) { // copy
// run_time
target.removeChildren("run_time");
target.addContent(_copy);
//_gui.updateJob();
_dom.setChanged(true);
} else if (tName.equals("config") && cName.equals("config")) { // copy
// run_time
//target.getParentElement().removeContent();
Element spooler = target.getParentElement();
spooler.removeChildren("config");
spooler.addContent((Element)_copy.clone());
refreshTree("main");
_dom.setChanged(true);
//_gui.update();
} else if (tName.equals("commands") && cName.equals("order")) { // copy job
String append = "copy(" + (target.getChildren("order").size() + 1);
Element currCopy = (Element)_copy.clone();
currCopy.setAttribute("id", append + ")of_" + Utils.getAttributeValue("id", _copy));
target.addContent(currCopy);
refreshTree("main");
//_gui.updateCommands();
//_gui.updateOrders();
//_gui.update();
_dom.setChanged(true);
} else if (tName.equals("job_chains") && cName.equals("job_chain")) { // copy job
String append = "copy(" + (target.getChildren("job_chain").size() + 1);
Element currCopy = (Element)_copy.clone();
if(existJobname(target, Utils.getAttributeValue("name", _copy)))
currCopy.setAttribute("name", append + ")of_" + Utils.getAttributeValue("name", _copy));
target.addContent(currCopy);
//_gui.updateJobChains();
refreshTree("main");
//_gui.update();
_dom.setChanged(true);
}
}
}
};
}
*/
private MenuItem getItem(String name) {
MenuItem[] items = _menu.getItems();
for (int i = 0; i < items.length; i++) {
MenuItem item = items[i];
if(item.getText().equalsIgnoreCase(name)) {
return item;
}
}
return null;
}
public static void goTo(String name, DomParser _dom, int type) {
try {
if(name == null || name.length() == 0)
return;
if(_dom instanceof sos.scheduler.editor.actions.ActionsDom)
_dom = (sos.scheduler.editor.actions.ActionsDom)_dom;
else
_dom = (SchedulerDom)_dom;
if(name.startsWith("*")) {
name = name.substring(1);
}
if(type==Editor.JOB) {
XPath x3 = XPath.newInstance("//job[@name='"+ name + "']");
List listOfElement_3 = x3.selectNodes(_dom.getDoc());
if(!listOfElement_3.isEmpty()) {
SchedulerForm f = (SchedulerForm)(sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor());
if(f == null)
return;
Tree tree = f.getTree();
for(int i = 0; i < tree.getItemCount(); i++) {
TreeItem item = tree.getItem(i);
if(item.getText().equals(SchedulerListener.JOBS)){
TreeItem[] jobsItem = item.getItems();
for(int j = 0; j < jobsItem.length; j++) {
TreeItem jItem = jobsItem[j];
//if(jItem.getText().equals("Job: "+ name)){
if(jItem.getText().endsWith("Job: "+ name)){
tree.setSelection(new TreeItem [] {jItem});
f.updateTreeItem(jItem.getText());
f.updateTree("jobs");
break;
}
}
}
}
}
} else if(type==Editor.MONITOR) {
String[] split = name.split("_@_");
String jobname = split[0];
String monitorname = split[1];
XPath x3 = XPath.newInstance("//job[@name='"+ jobname + "']/monitor[@name='"+ monitorname + "']");
List listOfElement_3 = x3.selectNodes(_dom.getDoc());
if(!listOfElement_3.isEmpty()) {
SchedulerForm f = (SchedulerForm)(sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor());
if(f == null)
return;
Tree tree = f.getTree();
//if(tree.getSelection()[0].getText().equals("Monitor")){
if(tree.getSelection()[0].getText().equals(SchedulerListener.MONITOR)){
TreeItem[] monitorsItem = tree.getSelection()[0].getItems();
for(int k = 0; k < monitorsItem.length; k++) {
TreeItem monitor = monitorsItem[k];
if(monitor.getText().equals(monitorname)){
//if(jItem.getText().endsWith("Job: "+ name)){
tree.setSelection(new TreeItem [] {monitor});
f.updateTreeItem(monitorname);
f.updateTree("monitor");
break;
}
}
} else {
for(int i = 0; i < tree.getItemCount(); i++) {
TreeItem item = tree.getItem(i);
if(item.getText().equals(SchedulerListener.JOB + jobname)){
TreeItem[] jobsItem = item.getItems();
for(int j = 0; j < jobsItem.length; j++) {
TreeItem jItem = jobsItem[j];
if(jItem.getText().equals("Monitor")){
TreeItem[] monitorsItem = jItem.getItems();
for(int k = 0; k < monitorsItem.length; k++) {
TreeItem monitor = monitorsItem[k];
if(monitor.getText().equals(monitorname)){
//if(jItem.getText().endsWith("Job: "+ name)){
tree.setSelection(new TreeItem [] {monitor});
f.updateTreeItem(monitorname);
f.updateTree("monitor");
break;
}
}
}
}
}
}
}
}
} else if(type==Editor.JOB_CHAIN) {
XPath x3 = XPath.newInstance("//job_chain[@name='"+ name + "']");
List listOfElement_3 = x3.selectNodes(_dom.getDoc());
if(!listOfElement_3.isEmpty()) {
SchedulerForm f = (SchedulerForm)(sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor());
if(f == null)
return;
Tree tree = f.getTree();
for(int i = 0; i < tree.getItemCount(); i++) {
TreeItem item = tree.getItem(i);
if(item.getText().equals(SchedulerListener.JOB_CHAINS)){
TreeItem[] jobsItem = item.getItems();
for(int j = 0; j < jobsItem.length; j++) {
TreeItem jItem = jobsItem[j];
//if(jItem.getText().equals("Job Chain: "+ name)){
if(jItem.getText().endsWith("Job Chain: "+ name)){
tree.setSelection(new TreeItem [] {jItem});
f.updateTreeItem(jItem.getText());
f.updateTree("");
break;
}
}
}
}
}
} else if (type == Editor.PROCESS_CLASSES) {
XPath x3 = XPath.newInstance("//process_class[@name='"+ name + "']");
List listOfElement_3 = x3.selectNodes(_dom.getDoc());
if(!listOfElement_3.isEmpty()) {
SchedulerForm f = (SchedulerForm)(sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor());
if(f == null)
return;
Tree tree = f.getTree();
for(int i = 0; i < tree.getItemCount(); i++) {
TreeItem item = tree.getItem(i);
//if(item.getText().equals("Process Classes")){
if(item.getText().endsWith("Process Classes")){
tree.setSelection(new TreeItem [] {item});
f.updateTreeItem(item.getText());
f.updateTree("");
break;
}
}
}
} else if(type==Editor.SCHEDULE) {
XPath x3 = XPath.newInstance("//schedule[@name='"+ name + "']");
List listOfElement_3 = x3.selectNodes(_dom.getDoc());
if(!listOfElement_3.isEmpty()) {
SchedulerForm f = (SchedulerForm)(sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor());
if(f == null)
return;
Tree tree = f.getTree();
for(int i = 0; i < tree.getItemCount(); i++) {
TreeItem item = tree.getItem(i);
if(item.getText().equals(SchedulerListener.SCHEDULES)){
TreeItem[] items = item.getItems();
for(int j = 0; j < items.length; j++) {
TreeItem jItem = items[j];
//if(jItem.getText().equals(name)){
if(jItem.getText().endsWith(name)){
tree.setSelection(new TreeItem [] {jItem});
f.updateTreeItem(jItem.getText());
f.updateTree("");
break;
}
}
}
}
}
} else if(type == Editor.ORDER) {
XPath x3 = XPath.newInstance("//order[@id='"+ name + "']");
List listOfElement_3 = x3.selectNodes(_dom.getDoc());
if(listOfElement_3.isEmpty()) {
x3 = XPath.newInstance("//add_order[@id='"+ name + "']");
listOfElement_3 = x3.selectNodes(_dom.getDoc());
}
if(!listOfElement_3.isEmpty()) {
SchedulerForm f = (SchedulerForm)(sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor());
if(f == null)
return;
Tree tree = f.getTree();
for(int i = 0; i < tree.getItemCount(); i++) {
TreeItem item = tree.getItem(i);
if(item.getText().equals(SchedulerListener.ORDERS)){
TreeItem[] items = item.getItems();
for(int j = 0; j < items.length; j++) {
TreeItem jItem = items[j];
//if(jItem.getText().equals("Order: " + name)){
if(jItem.getText().endsWith("Order: " + name)){
tree.setSelection(new TreeItem [] {jItem});
f.updateTreeItem(jItem.getText());
f.updateTree("");
break;
}
}
}
}
}
} else if(type == Editor.WEBSERVICE) {
XPath x3 = XPath.newInstance("//web_service[@name='"+ name + "']");
List listOfElement_3 = x3.selectNodes(_dom.getDoc());
if(!listOfElement_3.isEmpty()) {
SchedulerForm f = (SchedulerForm)(sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor());
if(f == null)
return;
Tree tree = f.getTree();
for(int i = 0; i < tree.getItemCount(); i++) {
TreeItem item = tree.getItem(i);
if(item.getText().equals(SchedulerListener.HTTP_SERVER)){
for(int k = 0; k < item.getItemCount(); k++) {
TreeItem httpItem = item.getItem(k);
if(httpItem.getText().equals(SchedulerListener.WEB_SERVICES)){
TreeItem[] items = httpItem.getItems();
for(int j = 0; j < items.length; j++) {
TreeItem jItem = items[j];
if(jItem.getText().equals("Web Service: " + name)){
tree.setSelection(new TreeItem [] {jItem});
f.updateTreeItem(jItem.getText());
f.updateTree("");
break;
}
}
}
}
}
}
}
} else if (type == Editor.ACTIONS) {
XPath x3 = XPath.newInstance("//action[@name='"+ name + "']");
List listOfElement_3 = x3.selectNodes(_dom.getDoc());
if(!listOfElement_3.isEmpty()) {
ActionsForm f = (ActionsForm)(sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor());
if(f == null)
return;
Tree tree = f.getTree();
for(int i = 0; i < tree.getItemCount(); i++) {
TreeItem item = tree.getItem(i);
if(item.getText().equals("Actions")){
TreeItem[] jobsItem = item.getItems();
for(int j = 0; j < jobsItem.length; j++) {
TreeItem jItem = jobsItem[j];
//if(jItem.getText().equals("Job Chain: "+ name)){
if(jItem.getText().endsWith(sos.scheduler.editor.actions.listeners.ActionsListener.ACTION_PREFIX + name)){
tree.setSelection(new TreeItem [] {jItem});
f.updateTreeItem(jItem.getText());
f.updateTree("");
break;
}
}
}
}
}
} else if(type == Editor.EVENTS) {
//<event_group logic="or" group="1">
XPath x3 = XPath.newInstance("//event_group[@group='"+ name + "']");
List listOfElement_3 = x3.selectNodes(_dom.getDoc());
if(!listOfElement_3.isEmpty()) {
ActionsForm f = (ActionsForm)(sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor());
if(f == null)
return;
Tree tree = f.getTree();
if(tree.getSelectionCount() > 0) {
TreeItem itemp = tree.getSelection()[0];
for(int i = 0; i < itemp.getItemCount(); i++) {
TreeItem item = itemp.getItem(i);
if(item.getText().endsWith(sos.scheduler.editor.actions.listeners.ActionsListener.GROUP_PREFIX + name)){
tree.setSelection(new TreeItem [] {item});
f.updateTreeItem(item.getText());
f.updateTree("");
break;
}
}
}
}
} else if(type == Editor.ACTION_COMMANDS) {
XPath x3 = XPath.newInstance("//command[@name='"+ name + "']");
List listOfElement_3 = x3.selectNodes(_dom.getDoc());
if(!listOfElement_3.isEmpty()) {
ActionsForm f = (ActionsForm)(sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor());
if(f == null)
return;
Tree tree = f.getTree();
if(tree.getSelectionCount() > 0) {
TreeItem itemp = tree.getSelection()[0];
for(int i = 0; i < itemp.getItemCount(); i++) {
TreeItem item = itemp.getItem(i);
if(item.getText().endsWith(sos.scheduler.editor.actions.listeners.ActionsListener.COMMAND_PREFIX + name)){
tree.setSelection(new TreeItem [] {item});
f.updateTreeItem(item.getText());
f.updateTree("");
break;
}
}
}
}
} else if (type == Editor.JOB_COMMAND_EXIT_CODES &&
sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor() instanceof ActionsForm){
XPath x3 = null;
String job = "";
if(name.startsWith("start_job")) {
job = name.substring("start_job: ".length());
x3 = XPath.newInstance("//command/start_job[@job='"+ job + "']");
} else {
String child = name.substring(0, name.indexOf(": "));
job = name.substring(child.length() + 2);
x3 = XPath.newInstance("//command/"+child+"[@job_chain='"+ job + "']");
}
List listOfElement_3 = x3.selectNodes(_dom.getDoc());
if(!listOfElement_3.isEmpty()) {
ActionsForm f = (ActionsForm)(sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor());
if(f == null)
return;
Tree tree = f.getTree();
if(tree.getSelectionCount() > 0) {
TreeItem itemp = tree.getSelection()[0];
for(int i = 0; i < itemp.getItemCount(); i++) {
TreeItem item = itemp.getItem(i);
if(item.getText().equals(name)){
tree.setSelection(new TreeItem [] {item});
f.updateTreeItem(item.getText());
f.updateTree("");
break;
}
}
}
}
} else if (type == Editor.JOB_COMMAND_EXIT_CODES &&
sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor() instanceof SchedulerForm){
XPath x3 = null;
String job = "";
if(name.startsWith("start_job")) {
job = name.substring("start_job: ".length());
x3 = XPath.newInstance("//commands/start_job[@job='"+ job + "']");
} else {
String child = name.substring(0, name.indexOf(": "));
job = name.substring(child.length() + 2);
x3 = XPath.newInstance("//commands/"+child+"[@job_chain='"+ job + "']");
}
List listOfElement_3 = x3.selectNodes(_dom.getDoc());
if(!listOfElement_3.isEmpty()) {
SchedulerForm f = (SchedulerForm)(sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor());
if(f == null)
return;
Tree tree = f.getTree();
if(tree.getSelectionCount() > 0) {
TreeItem itemp = tree.getSelection()[0];
for(int i = 0; i < itemp.getItemCount(); i++) {
TreeItem item = itemp.getItem(i);
if(item.getText().equals(name)){
tree.setSelection(new TreeItem [] {item});
f.updateTreeItem(item.getText());
f.updateTree("");
break;
}
}
}
}
} else if(type == Editor.JOB_COMMAND) {
SchedulerForm f = (SchedulerForm)(sos.scheduler.editor.app.MainWindow.getContainer().getCurrentEditor());
if(f == null)
return;
Tree tree = f.getTree();
if(tree.getSelectionCount() > 0) {
TreeItem itemp = tree.getSelection()[0];
for(int i = 0; i < itemp.getItemCount(); i++) {
TreeItem item = itemp.getItem(i);
if(item.getText().equals(name)){
tree.setSelection(new TreeItem [] {item});
f.updateTreeItem(item.getText());
f.updateTree("");
break;
}
}
}
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
public static void delete(Combo combo, DomParser _dom, int type) {
try {
//favoriten l�schen
if(combo.getData("favorites") == null)
return;
if(type == Editor.SCRIPT) {
String prefix = "monitor_favorite_";
String name = combo.getText();
String lan = "";
if(combo.getData("favorites") != null)
lan = ((HashMap)(combo.getData("favorites"))).get(name) +"_";
name = prefix + lan + name;
Options.removeProperty(name);
combo.remove(combo.getText());
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
}