/********************************************************* 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.io.File;
import java.util.ArrayList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabFolder2Adapter;
import org.eclipse.swt.custom.CTabFolderEvent;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.jdom.input.SAXBuilder;
import sos.scheduler.editor.actions.forms.ActionsForm;
import sos.scheduler.editor.conf.SchedulerDom;
import sos.scheduler.editor.conf.forms.SchedulerForm;
import sos.scheduler.editor.doc.forms.DocumentationForm;
import sos.scheduler.editor.conf.forms.JobChainConfigurationForm;
public class TabbedContainer implements IContainer {
private static final String NEW_SCHEDULER_TITLE = "Unknown";
private static final String NEW_DOCUMENTATION_TITLE = "Unknown";
private static final String NEW_DETAIL_TITLE = "Unknown";
private CTabFolder folder = null;
private ArrayList filelist = new ArrayList();
class TabData{
protected String title="";
protected String caption="";
protected int cnt=0;
public TabData (String title,String caption) {
this.title = title;
this.caption = caption;
}
}
//public TabbedContainer(MainWindow window, Composite parent) {
public TabbedContainer(Composite parent) {
//this.window = window;
folder = new CTabFolder(parent, SWT.TOP | SWT.CLOSE );
folder.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
initialize();
}
private void initialize() {
folder.setSimple(false);
folder.setSize(new Point(690, 478));
folder.setLayout(new FillLayout());
// on tab selection
folder.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
setWindowTitle();
MainWindow.setMenuStatus();
MainWindow.shellActivated_();
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
// on tab close
folder.addCTabFolder2Listener(new CTabFolder2Adapter() {
public void close(CTabFolderEvent event) {
//IEditor editor = getCurrentEditor();
IEditor editor = (IEditor)((CTabItem)(event.item)).getControl();
if (editor.hasChanges()) {
event.doit = editor.close();
}
if (event.doit)
filelist.remove(editor.getFilename());
}
});
folder.addTraverseListener(new TraverseListener() {
public void keyTraversed(final TraverseEvent e) {
/*if(e.detail == SWT.TRAVERSE_ESCAPE) {
System.out.println(folder.getChildren().length);
IEditor editor = (IEditor)folder.getSelection().getControl();
filelist.remove(editor.getFilename());
editor.close();
folder.getSelection().dispose();
folder.removeControlListener(listener)
}*/
}
});
}
public SchedulerForm newScheduler() {
SchedulerForm scheduler = new SchedulerForm(this, folder, SWT.NONE);
scheduler.openBlank();
CTabItem tab = newItem(scheduler, NEW_SCHEDULER_TITLE);
tab.setImage(new Image(tab.getDisplay(), getClass().getResourceAsStream(
"/sos/scheduler/editor/editor-small.png")));
return scheduler;
}
public SchedulerForm newScheduler(int type) {
SchedulerForm scheduler = new SchedulerForm(this, folder, SWT.NONE, type);
scheduler.openBlank(type);
CTabItem tab = newItem(scheduler, NEW_SCHEDULER_TITLE);
tab.setImage(new Image(tab.getDisplay(), getClass().getResourceAsStream(
"/sos/scheduler/editor/editor-small.png")));
return scheduler;
}
public JobChainConfigurationForm newDetails() {
JobChainConfigurationForm detailForm = new JobChainConfigurationForm(this, folder, SWT.NONE);
detailForm.openBlank();
CTabItem tab = newItem(detailForm, NEW_DETAIL_TITLE);
tab.setImage(new Image(tab.getDisplay(), getClass().getResourceAsStream(
"/sos/scheduler/editor/editor-small.png")));
return detailForm;
}
public JobChainConfigurationForm openDetails() {
JobChainConfigurationForm detailForm = new JobChainConfigurationForm(this, folder, SWT.NONE);
if(detailForm.open(filelist)) {
CTabItem tab = newItem(detailForm, detailForm.getFilename());
tab.setImage(new Image(tab.getDisplay(), getClass().getResourceAsStream(
"/sos/scheduler/editor/editor-small.png")));
return detailForm;
} else
return null;
}
public JobChainConfigurationForm openDetails(String filename) {
JobChainConfigurationForm detailForm = new JobChainConfigurationForm(this, folder, SWT.NONE);
if(detailForm.open(filename, filelist)) {
CTabItem tab = newItem(detailForm, detailForm.getFilename());
tab.setImage(new Image(tab.getDisplay(), getClass().getResourceAsStream(
"/sos/scheduler/editor/editor-small.png")));
return detailForm;
} else
return null;
}
public ActionsForm openActions(String filename) {
ActionsForm actionsForm = new ActionsForm(this, folder, SWT.NONE);
if(actionsForm.open(filename, filelist)) {
CTabItem tab = newItem(actionsForm, actionsForm.getFilename());
tab.setImage(new Image(tab.getDisplay(), getClass().getResourceAsStream(
"/sos/scheduler/editor/editor-small.png")));
return actionsForm;
} else
return null;
}
public SchedulerForm openScheduler() {
SchedulerForm scheduler = new SchedulerForm(this, folder, SWT.NONE);
if (scheduler.open(filelist)) {
CTabItem tab = newItem(scheduler, scheduler.getFilename());
tab.setImage(ResourceManager.getImageFromResource("/sos/scheduler/editor/editor-small.png"));
return scheduler;
} else
return null;
}
public SchedulerForm openScheduler(String filename) {
SchedulerForm scheduler = new SchedulerForm(this, folder, SWT.NONE);
if (scheduler.open(filename, filelist)) {
CTabItem tab = newItem(scheduler, scheduler.getFilename());
tab.setImage(ResourceManager.getImageFromResource("/sos/scheduler/editor/editor-small.png"));
return scheduler;
} else
return null;
}
public DocumentationForm newDocumentation() {
DocumentationForm doc = new DocumentationForm(this, folder, SWT.NONE);
doc.openBlank();
newItem(doc, NEW_DOCUMENTATION_TITLE);
return doc;
}
public DocumentationForm openDocumentation(){
try {
DocumentationForm doc = new DocumentationForm(this, folder, SWT.NONE);
if (doc.open(filelist)) {
//CTabItem tab = newItem(doc, doc.getFilename());
newItem(doc, doc.getFilename());
return doc;
} else
return null;
} catch (Exception e) {
try {
new ErrorLog("error in " + sos.util.SOSClassUtil.getMethodName() , e);
} catch(Exception ee) {
//tu nichts
}
System.out.println("error in TabbedContainer.openDocumentation()" + e.getMessage() );
return null;
}
}
public DocumentationForm openDocumentation(String filename){
try {
DocumentationForm doc = new DocumentationForm(this, folder, SWT.NONE);
if (doc.open(filename, filelist)) {
//CTabItem tab = newItem(doc, doc.getFilename());
newItem(doc, doc.getFilename());
// tab.setImage(ResourceManager.getImageFromResource("/sos/scheduler/editor/editor-small.png"));
return doc;
} else
return null;
} catch (Exception e) {
try {
new ErrorLog("error in " + sos.util.SOSClassUtil.getMethodName() , e);
} catch(Exception ee) {
//tu nichts
}
System.out.println("error in TabbedContainer.openDocumentation()" + e.getMessage() );
return null;
}
}
public String openDocumentationName(){
try {
DocumentationForm doc = new DocumentationForm(this, folder, SWT.NONE);
if (doc.open(filelist)) {
//CTabItem tab = newItem(doc, doc.getFilename());
// tab.setImage(ResourceManager.getImageFromResource("/sos/scheduler/editor/editor-small.png"));
return doc.getFilename();
} else
return null;
} catch (Exception e) {
try {
new ErrorLog("error in " + sos.util.SOSClassUtil.getMethodName() , e);
} catch(Exception ee) {
//tu nichts
}
System.out.println("error in TabbedContainer.openDocumentation()" + e.getMessage() );
return null;
}
}
private String shortCaption(String caption) {
File f = new File(caption);
if (caption.length() > 30 && f.getParentFile() != null && f.getParentFile().getParentFile() != null){
String s = "..." + f.getParentFile().getParentFile().getName() + "/" + f.getParentFile().getName() + "/" + f.getName();
if (s.length() > 30) {
return caption;
}else {
return s;
}
}else {
return caption;
}
}
private CTabItem newItem(Control control, String filename) {
CTabItem tab = new CTabItem(folder, SWT.NONE);
tab.addDisposeListener(new DisposeListener() {
public void widgetDisposed(final DisposeEvent e) {
MainWindow.getSShell().setText("Job Scheduler Editor");
MainWindow.setSaveStatus();
}
});
tab.setControl(control);
folder.setSelection(folder.indexOf(tab));
String actFilename = Utils.getFileFromURL(filename);
tab.setData(new TabData(actFilename,""));
String title = setSuffix(tab,actFilename);
TabData t = (TabData)tab.getData();
t.caption = shortCaption(title);
tab.setToolTipText(filename);
tab.setText(title);
if (!filename.equals(NEW_DOCUMENTATION_TITLE) && !filename.equals(NEW_SCHEDULER_TITLE))
filelist.add(filename);
return tab;
}
public CTabItem getCurrentTab() {
if (folder.getItemCount() == 0)
return null;
else
return folder.getItem(folder.getSelectionIndex());
}
public CTabItem getFolderTab(String filename) {
if (folder.getItemCount() == 0)
return null;
else {
for(int i = 0; i < folder.getItemCount(); i++) {
if(filelist.get(i).equals(filename))
return folder.getItem(i);
}
return null;
}
}
public IEditor getCurrentEditor() {
if (folder.getItemCount() == 0)
return null;
else
return (IEditor) getCurrentTab().getControl();
}
public IEditor getEditor(String filename) {
if (folder.getItemCount() == 0)
return null;
else
return ((SchedulerForm)(IEditor) getFolderTab(filename).getControl());
//SchedulerForm f = ((SchedulerForm)(IEditor) folder.getItem(0).getControl()).getDom().getFilename()
}
public void setStatusInTitle() {
if (folder.getItemCount() == 0)
return;
CTabItem tab = getCurrentTab();
TabData t = (TabData) tab.getData();
String title = t.caption;
if (tab.getData("ftp_profile_name") != null && tab.getData("ftp_profile_name").toString().length() > 0 &&
tab.getData("ftp_remote_directory") != null && tab.getData("ftp_remote_directory").toString().length() > 0)
title = tab.getData("ftp_remote_directory").toString();
if (tab.getData("webdav_profile_name") != null && tab.getData("webdav_profile_name").toString().length() > 0 &&
tab.getData("webdav_remote_directory") != null && tab.getData("webdav_remote_directory").toString().length() > 0)
title = tab.getData("webdav_remote_directory").toString();
tab.setText(getCurrentEditor().hasChanges() == false ? title : "*" + title);
setWindowTitle();
MainWindow.setMenuStatus();
}
public void setStatusInTitle(CTabItem tab) {
if (folder.getItemCount() == 0)
return;
TabData t = (TabData) tab.getData();
String title = t.caption;
if (tab.getData("ftp_profile_name") != null && tab.getData("ftp_profile_name").toString().length() > 0 &&
tab.getData("ftp_remote_directory") != null && tab.getData("ftp_remote_directory").toString().length() > 0)
title = tab.getData("ftp_remote_directory").toString();
if (tab.getData("webdav_profile_name") != null && tab.getData("webdav_profile_name").toString().length() > 0 &&
tab.getData("webdav_remote_directory") != null && tab.getData("webdav_remote_directory").toString().length() > 0)
title = tab.getData("webdav_remote_directory").toString();
tab.setText(getCurrentEditor().hasChanges() == false ? title : "*" + title);
setWindowTitle();
MainWindow.setMenuStatus();
}
public void setNewFilename(String oldFilename) {
if (folder.getItemCount() == 0)
return;
String filename = getCurrentEditor().getFilename();
CTabItem tab = getCurrentTab();
if (oldFilename != null) {
filelist.remove(oldFilename);
filelist.add(filename);
}
String title = setSuffix(tab,Utils.getFileFromURL(filename));
if(tab.getData("ftp_remote_directory") != null && tab.getData("ftp_remote_directory").toString().length() > 0
&& tab.getData("ftp_profile_name") != null && tab.getData("ftp_profile_name").toString().length() > 0)
title = tab.getData("ftp_remote_directory").toString();
tab.setText(title);
tab.setToolTipText(filename);
tab.setData(new TabData(Utils.getFileFromURL(filename),shortCaption(title)));
setWindowTitle();
}
public void setNewFilename(String oldFilename, String newFilename) {
if (folder.getItemCount() == 0)
return;
CTabItem tab = getCurrentTab();
if (oldFilename != null) {
filelist.remove(oldFilename);
filelist.add(newFilename);
}
String title = setSuffix(tab,Utils.getFileFromURL(newFilename));
tab.setText(title);
tab.setToolTipText(newFilename);
tab.setData(new TabData(Utils.getFileFromURL(newFilename),shortCaption(title)));
setWindowTitle();
}
private void setWindowTitle() {
Shell shell = folder.getShell();
String ftp = getCurrentTab().getData("ftp_title") != null ? getCurrentTab().getData("ftp_title").toString() + "\\": "";
String webdav = getCurrentTab().getData("webdav_title") != null ? getCurrentTab().getData("webdav_title").toString() + "\\": "";
/*if(ftp != null && ftp.length() > 0 ) {
String f = new File(getCurrentTab().getText()).getName();
}*/
shell.setText((String) shell.getData() + webdav + ftp + " " +getCurrentTab().getText());
//shell.setText((String) shell.getData() + " [" + getCurrentTab().getText() + "]");
}
private String setSuffix(CTabItem tab,String title) {
int sameTitles = getSameTitles(title);
TabData t = (TabData) tab.getData();
if (t != null){
t.cnt=sameTitles;
if (sameTitles > 0)
title = title + "(" + (sameTitles + 1) + ")";
}
return title;
}
private boolean isFreeIndex(int index,String title) {
boolean found=false;
CTabItem[] items = folder.getItems();
int i=0;
while (i < items.length && !found) {
TabData t = (TabData) items[i].getData();
if (items[i].getData() != null && t.title.equals(title) && t.cnt==index && !items[i].equals(getCurrentTab())) {
found = true;
}
i++;
}
return !found;
}
private int getSameTitles(String title) {
int cnt = -1;
int i=0;
//boolean found = false;
while (cnt==-1) {
if (isFreeIndex(i, title)){
//found = true;
cnt=i;
}
i++;
}
return cnt;
}
public boolean closeAll() {
boolean doit = true;
for (int i = 0; i < folder.getItemCount(); i++) {
CTabItem tab = folder.getItem(i);
folder.setSelection(i);
if (((IEditor) tab.getControl()).close()) {
tab.dispose();
i--;
} else {
doit = false;
}
}
return doit;
}
public void closeCurrentTab() {
if(folder.getSelectionIndex() > -1) {
CTabItem tab = folder.getSelection();
tab.dispose();
} else {
getCurrentTab().dispose();
}
}
public void updateLanguages() {
for (int i = 0; i < folder.getItemCount(); i++) {
CTabItem tab = folder.getItem(i);
((IEditor) tab.getControl()).updateLanguage();
}
}
/* public SchedulerForm openDirectory() {
SchedulerForm scheduler = new SchedulerForm(this, folder, SWT.NONE, SchedulerDom.DIRECTORY);
if (scheduler.openDirectory(null, filelist)) {
CTabItem tab = newItem(scheduler, scheduler.getFilename());
tab.setImage(ResourceManager.getImageFromResource("/sos/scheduler/editor/editor-small.png"));
return scheduler;
} else
return null;
}*/
public SchedulerForm openDirectory(String filename) {
SchedulerForm scheduler = new SchedulerForm(this, folder, SWT.NONE, SchedulerDom.DIRECTORY);
if (scheduler.openDirectory(filename, filelist)) {
CTabItem tab = newItem(scheduler, scheduler.getFilename());
tab.setImage(ResourceManager.getImageFromResource("/sos/scheduler/editor/editor-small.png"));
return scheduler;
} else
return null;
}
public SchedulerForm openLifeElement(String filename, int type) {
SchedulerForm scheduler = new SchedulerForm(this, folder, SWT.NONE, type);
if (scheduler.open(filename, filelist, type)) {
CTabItem tab = newItem(scheduler, scheduler.getFilename());
tab.setImage(ResourceManager.getImageFromResource("/sos/scheduler/editor/editor-small.png"));
return scheduler;
} else
return null;
}
public org.eclipse.swt.widgets.Composite openQuick(String xmlFilename) {
try {
if (xmlFilename != null && xmlFilename.length() > 0) {
SAXBuilder builder = new SAXBuilder();
org.jdom.Document doc = builder.build( new File( xmlFilename ) );
org.jdom.Element root = doc.getRootElement();
if(root.getName().equalsIgnoreCase("description")) {
return openDocumentation(xmlFilename);
} else if(root.getName().equalsIgnoreCase("spooler")) {
return openScheduler(xmlFilename);
//} else if(root.getName().equalsIgnoreCase("settings")) {
// return openDetails(xmlFilename);
} else if(root.getName().equalsIgnoreCase("actions")) {
return openActions(xmlFilename);
} else if(root.getName().equalsIgnoreCase("job")) {
return openLifeElement(xmlFilename, SchedulerDom.LIFE_JOB);
} else if(root.getName().equalsIgnoreCase("job_chain")) {
return openLifeElement(xmlFilename, SchedulerDom.LIFE_JOB_CHAIN);
} else if(root.getName().equalsIgnoreCase("process_class")) {
return openLifeElement(xmlFilename, SchedulerDom.LIFE_PROCESS_CLASS);
} else if(root.getName().equalsIgnoreCase("lock")) {
return openLifeElement(xmlFilename, SchedulerDom.LIFE_LOCK);
} else if(root.getName().equalsIgnoreCase("order") || root.getName().equalsIgnoreCase("add_order")) {
return openLifeElement(xmlFilename, SchedulerDom.LIFE_ORDER);
} else if(root.getName().equalsIgnoreCase("schedule")) {
return openLifeElement(xmlFilename, SchedulerDom.LIFE_SCHEDULE);
} else {
MainWindow.message("Unknows root Element: " + root.getName() + " from filename " + xmlFilename, SWT.NONE);
}
}
} catch (Exception e) {
try {
new ErrorLog("error in " + sos.util.SOSClassUtil.getMethodName() + " ; could not open file " + xmlFilename , e);
} catch(Exception ee) {
//tu nichts
}
MainWindow.message("could not open file cause" + e.getMessage(), SWT.NONE);
}
return null;
}
public org.eclipse.swt.widgets.Composite openQuick() {
String xmlFilename = "";
try {
FileDialog fdialog = new FileDialog(MainWindow.getSShell(), SWT.OPEN);
fdialog.setFilterPath(Options.getLastDirectory());
fdialog.setText("Open");
fdialog.setFilterExtensions(new String[] {"*.xml"});
xmlFilename = fdialog.open();
return openQuick(xmlFilename);
} catch (Exception e) {
try {
new ErrorLog("error in " + sos.util.SOSClassUtil.getMethodName() + " ; could not open File ", e);
} catch(Exception ee) {
//tu nichts
}
MainWindow.message("could not open file cause" + e.getMessage(), SWT.NONE);
}
return null;
}
public ActionsForm newActions() {
ActionsForm actions = new ActionsForm(this, folder, SWT.NONE);
actions.openBlank();
newItem(actions, NEW_DOCUMENTATION_TITLE);
return actions;
}
/**
* @return the filelist
*/
public ArrayList getFilelist() {
return filelist;
}
}