package org.panlab.software.fstoolkit.views.FSDLView;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.IDialogPage;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.ide.IGotoMarker;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
import org.panlab.software.fstoolkit.extensionpoint.WorkflowEnginesBrowser;
import org.panlab.software.fstoolkit.providerAdapters.RunningScenariosContentProvider;
import org.panlab.software.fstoolkit.providerAdapters.RunningScenariosLabelProvider;
import FederationOffice.Office;
import FederationOffice.extensionInterfaces.IProvisioningJobListener;
import FederationOffice.extensionInterfaces.IWorkflowEngine;
import FederationOffice.federationscenarios.RequestedFederationScenario;
import FederationOffice.federationscenarios.ResourceRequest;
import FederationOffice.provider.FederationOfficeItemProviderAdapterFactory;
import FederationOffice.uiObjects.ui_TaxonomyTreeItem;
public class RunningScenariosView extends ViewPart
implements ITabbedPropertySheetPageContributor{ //we need this to display the selected item to the Tabbed property sheet editor
private TreeViewer viewer;
private DrillDownAdapter drillDownAdapter;
private ComposedAdapterFactory adapterFactory;
private Thread myUpdateThread;
private RunningScenariosProvisioningJobListener provisioningJobListener;
private RunningScenariosContentProvider runningScenariosProvider;
/**
* The ID of the view as specified by the extension.
*/
public static final String ID = "org.panlab.software.fstoolkit.views.RunningScenariosView";
public RunningScenariosView() {
}
@Override
public void createPartControl(Composite parent) {
// Just a little bit layout
//parent.setLayout(new GridLayout(1, false));
PatternFilter patternFilter = new PatternFilter();
final FilteredTree filter = new FilteredTree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL|
SWT.BORDER | SWT.FULL_SELECTION , patternFilter, true);
viewer = filter.getViewer();
viewer.getTree().setHeaderVisible(true);
viewer.getTree().setLinesVisible(true);
//viewer = new TreeViewer(parent , SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL );
drillDownAdapter = new DrillDownAdapter(viewer);
getSite().setSelectionProvider(viewer);
initializeRunningResourcesDomain();
initializeColumns();
initializeJobListeners();
viewer.setSorter(new NameSorter());
viewer.setInput( getViewSite() );
// Create the help context id for the viewer's control
PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "org.panlab.software.fstoolkit.viewer");
makeActions();
hookContextMenu();
hookDoubleClickAction();
contributeToActionBars();
}
private void initializeColumns() {
FontData[] boldFontData= getModifiedFontData(viewer.getTree().getFont().getFontData(), SWT.BOLD);
Font boldFont = new Font(Display.getCurrent(), boldFontData);
TreeViewerColumn column = new TreeViewerColumn(viewer, SWT.NONE);
column.getColumn().setWidth(200);
column.getColumn().setMoveable(true);
column.getColumn().setText("Requested Resource");
column.setLabelProvider(new RunningScenariosLabelProvider( boldFont ) );
//viewer.getTree().setSortColumn(column.getColumn());
column = new TreeViewerColumn(viewer, SWT.NONE);
column.getColumn().setWidth(100);
column.getColumn().setMoveable(true);
column.getColumn().setText("GUID");
column.setLabelProvider(new ColumnLabelProvider(){
public String getText(Object element){
if ( (element instanceof ui_TaxonomyTreeItem) &&
( ((ui_TaxonomyTreeItem)element).getOfficeElement() instanceof ResourceRequest ) ) {
ResourceRequest resReq= (ResourceRequest) ((ui_TaxonomyTreeItem)element).getOfficeElement() ;
if (resReq.getRuntimeInfo()!=null)
return resReq.getRuntimeInfo().getGUID() ;
}
return "";
}
});
column = new TreeViewerColumn(viewer, SWT.NONE);
column.getColumn().setWidth(200);
column.getColumn().setMoveable(true);
column.getColumn().setText("Resource Type");
column.setLabelProvider(new ColumnLabelProvider(){
public String getText(Object element){
if ( (element instanceof ui_TaxonomyTreeItem) &&
( ((ui_TaxonomyTreeItem)element).getOfficeElement() instanceof ResourceRequest ) ) {
ResourceRequest resReq= (ResourceRequest) ((ui_TaxonomyTreeItem)element).getOfficeElement() ;
String provider = ( (Office)resReq.getRefOfferedResource().getBelongsToSite().getBelongsToProvider().eContainer()).getName() +
"."+resReq.getRefOfferedResource().getBelongsToSite().getBelongsToProvider().getName()+
"."+resReq.getRefOfferedResource().getBelongsToSite().getName();
return provider+"."+ resReq.getRefOfferedResource().getName();
}
return "";
}
});
column = new TreeViewerColumn(viewer, SWT.NONE);
column.getColumn().setWidth(100);
column.getColumn().setMoveable(true);
column.getColumn().setText("Service");
column.setLabelProvider(new ColumnLabelProvider(){
public String getText(Object element){
if ( (element instanceof ui_TaxonomyTreeItem) &&
( ((ui_TaxonomyTreeItem)element).getOfficeElement() instanceof ResourceRequest ) ) {
ResourceRequest resReq= (ResourceRequest) ((ui_TaxonomyTreeItem)element).getOfficeElement() ;
String officeName =
((Office)resReq.getRefOfferedResource().getImplOfferedService().eContainer()).getName() ;
return officeName+"."+ resReq.getRefOfferedResource().getImplOfferedService().getName() ;
}
return "";
}
});
}
public void setFocusOnSelectedScenario( RequestedFederationScenario sourceFedScenario ){
for (TreeItem iterable_element : viewer.getTree().getItems() ) {
if (iterable_element.getData() instanceof ui_TaxonomyTreeItem)
if ( ((ui_TaxonomyTreeItem)iterable_element.getData()).getOfficeElement()!=null )
if ( ((ui_TaxonomyTreeItem)iterable_element.getData()).getOfficeElement() instanceof RequestedFederationScenario ){
RequestedFederationScenario tempScen = (RequestedFederationScenario) (((ui_TaxonomyTreeItem)iterable_element.getData()).getOfficeElement());
if ( tempScen == sourceFedScenario ){
viewer.expandToLevel( iterable_element, 4);
iterable_element.setExpanded(true);
viewer.refresh();
return;
}
}
}
}
public void initializeRunningResourcesDomain() {
// Create an adapter factory that yields item providers.
//
adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
AdapterFactory factory = (AdapterFactory) new FederationOfficeItemProviderAdapterFactory() ;
adapterFactory.addAdapterFactory( factory);
runningScenariosProvider = new RunningScenariosContentProvider( getViewSite());
for (IWorkflowEngine wEngine : WorkflowEnginesBrowser.getInstance().getWorkflowEngines()) {
runningScenariosProvider.AddRunningScenarios(wEngine.getRunningScenarios() );
}
viewer.setContentProvider( runningScenariosProvider );
//viewer.expandToLevel(2);
}
private static FontData[] getModifiedFontData(FontData[] originalData,
int additionalStyle) {
FontData[] styleData = new FontData[originalData.length];
for (int i = 0; i < styleData.length; i++) {
FontData base = originalData[i];
styleData[i] = new FontData(base.getName(), base.getHeight(),
base.getStyle() | additionalStyle);
// System.out.println("FONT = "+ base.getName());
// System.out.println("FONT getHeight= "+ base.getHeight());
}
return styleData;
}
private void fillContextMenu(IMenuManager manager) {
// Other plug-ins can contribute there actions here
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
drillDownAdapter.addNavigationActions(manager);
}
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
public void startUpdateTree( final RequestedFederationScenario scenario ) {
System.out.println("============startUpdateTree start =============== ");
myUpdateThread = new Thread() {
public void run() {
while (true) {
if (viewer.getTree().isDisposed())
return;
// RunningScenariosContentProvider contprovider = (RunningScenariosContentProvider)viewer.getContentProvider();
// contprovider.updateModel();
viewer.getTree().getDisplay().asyncExec(new Runnable() {
public void run() {
if (scenario!=null)
setFocusOnSelectedScenario( scenario );
viewer.refresh();
}
});
return;//run only one time
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }// try
// }//for
}// while
}// run
};// thread
myUpdateThread.start();
}
private void makeActions() {
}
private void hookDoubleClickAction() {
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
//openScenarioAction.run();
}
});
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
fillLocalToolBar(bars.getToolBarManager());
}
private void fillLocalPullDown(IMenuManager manager) {
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void fillLocalToolBar(IToolBarManager manager) {
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
drillDownAdapter.addNavigationActions(manager);
}
@Override
public void setFocus() {
}
class NameSorter extends ViewerSorter {
}
private void initializeJobListeners() {
provisioningJobListener = new RunningScenariosProvisioningJobListener(this);
runProvisioningJobListenerExtension();
}
/**
* @see IDialogPage#createControl(Composite)
*/ // This is the ID from your extension point
private static final String IPROVISIONINGJOB_ID = "org.panlab.software.fstoolkit.extensionpoint.provisioningjoblistener";
private void runProvisioningJobListenerExtension() {
IConfigurationElement[] config = Platform.getExtensionRegistry()
.getConfigurationElementsFor(IPROVISIONINGJOB_ID);
try {
for (IConfigurationElement e : config) {
System.out.println("Evaluating extension "+IPROVISIONINGJOB_ID);
final Object o = e.createExecutableExtension("class");
if (o instanceof IProvisioningJobListener) {
ISafeRunnable runnable = new ISafeRunnable() {
@Override
public void handleException(Throwable exception) {
System.out.println("Exception in client");
}
@Override
public void run() throws Exception {
//register this viewer on available provisioning engines
((IProvisioningJobListener)o).initialize(provisioningJobListener);
}
};
SafeRunner.run(runnable);
}
}
} catch (CoreException ex) {
System.out.println(ex.getMessage());
}
}
public void runWorkflowEngineExtensionAndLoadRunningScenarios() {
runningScenariosProvider.clearScenarios();
for (IWorkflowEngine wEngine : WorkflowEnginesBrowser.getInstance().getWorkflowEngines()) {
runningScenariosProvider.AddRunningScenarios(wEngine.getRunningScenarios() );
}
}
@Override
public String getContributorId() {
//System.out.println("RunningScenarios getContributorId() = "+ getSite().getId());
return getSite().getId();
}
public AdapterFactory getAdapterFactory() {
return adapterFactory;
}
//this is used for the Property Tab Sheet
/* This is how the framework determines which interfaces we implement.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Object getAdapter(@SuppressWarnings("rawtypes") Class key) {
if (key.equals(IPropertySheetPage.class)) {
RunningScenariosTabbedPropertySheetPage tp = new RunningScenariosTabbedPropertySheetPage(this);
return tp;
// if (key.equals(IPropertySheetPage.class)) {
// return getPropertySheetPage();
} else if (key.equals(IGotoMarker.class)) {
return this;
} else {
return super.getAdapter(key);
}
}
}