/*
* generated by Xtext
*/
package gr.upatras.ece.nam.fsdl.ui.contentassist;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
import gr.upatras.ece.nam.fsdl.ui.contentassist.AbstractFSDLProposalProvider;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.StyledString.Styler;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.TextStyle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.scoping.IGlobalScopeProvider;
import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
import com.google.common.base.Predicate;
import com.google.inject.Inject;
import brokermodel.Broker;
import brokermodel.BrokermodelPackage;
import brokermodel.federationscenarios.ResourceRequest;
import brokermodel.federationscenarios.ResourceSettingInstance;
import brokermodel.federationscenarios.ServiceRequest;
import brokermodel.federationscenarios.ServiceSettingInstance;
import brokermodel.providersite.Site;
import brokermodel.resources.OfferedResource;
import brokermodel.services.OfferedService;
import brokermodel.services.brTypeEnum;
import brokermodel.services.brTypeEnumItem;
import brokermodel.users.BrokerUser;
import brokermodel.users.ResourcesProvider;
/**
* see http://www.eclipse.org/Xtext/documentation/latest/xtext.html#contentAssist on how to customize content assistant
*/
public class FSDLProposalProvider extends AbstractFSDLProposalProvider {
private static final Image IMAGEServiceSetting= AbstractUIPlugin.imageDescriptorFromPlugin( "gr.upatras.ece.nam.broker.model.edit",
"icons/full/obj16/ServiceSetting.gif").createImage();
private static final Image IMAGEServiceSettingInstance= AbstractUIPlugin.imageDescriptorFromPlugin( "gr.upatras.ece.nam.broker.model.edit",
"icons/full/obj16/ServiceSettingInstance.gif").createImage();
private static final Image IMAGEtideTypeEnumItem= AbstractUIPlugin.imageDescriptorFromPlugin( "gr.upatras.ece.nam.broker.model.edit",
"icons/full/obj16/brTypeEnumItem.gif").createImage();
private static final Image IMAGEOfferedService= AbstractUIPlugin.imageDescriptorFromPlugin( "gr.upatras.ece.nam.broker.model.edit",
"icons/full/obj16/OfferedService.gif").createImage();
private static final Image IMAGEResourceSetting= AbstractUIPlugin.imageDescriptorFromPlugin( "gr.upatras.ece.nam.broker.model.edit",
"icons/full/obj16/ResourceSetting.gif").createImage();
private static final Image IMAGEServiceRequest= AbstractUIPlugin.imageDescriptorFromPlugin( "gr.upatras.ece.nam.broker.model.edit",
"icons/full/obj16/ServiceRequest.gif").createImage();
public void completeServiceSettingInstance_RefServiceSetting(
ServiceSettingInstance model, Assignment assignment, ContentAssistContext context,
ICompletionProposalAcceptor acceptor) {
// call implementation in superclass
// super.completeMyServiceSettingInstance_RefServiceSetting(
// model,
// assignment,
// context,
// acceptor);
// // compute the plain proposal
// String proposal = "Description for model" ;
// System.out.println("completeServiceSettingInstance_RefServiceSetting model, " +model.toString()+
// " assignment, " +assignment.getFeature().toString()+
// " context, " +context.toString()+
// " acceptor" +acceptor.toString()
// );
brokermodel.services.Service offeredService = null;
if ( model.eContainer() instanceof ServiceRequest){
offeredService = ((ServiceRequest)model.eContainer()).getRefService();
}
if ( offeredService ==null)
return;
//Have in mind that the proposal must be the same as the scoping!
for (int i = 0; i < offeredService.getServiceSettings().size() ; i++) {
offeredService.getServiceSettings().get(i);
String proposedName = "\""+offeredService.getServiceSettings().get(i).getName()+"\"";
// convert it to a valid STRING-terminal
String proposal = getValueConverter().toString( proposedName , null);
// create the completion proposal the result may be null as the createCompletionProposal(..) methods
// check for valid prefixes and terminal token conflicts
Styler fBoldStyler= new Styler() {
@Override
public void applyStyles(TextStyle textStyle) {
FontData[] boldFontData= getModifiedFontData(Display.getCurrent().getFontList("Segoe UI", true), SWT.BOLD);
Font boldFont = new Font(Display.getCurrent(), boldFontData);
textStyle.font= boldFont;
}
};
Styler style= fBoldStyler;
StyledString styledString= new StyledString( proposedName , style );
String descr = " ";
if (offeredService.getServiceSettings().get(i).getDescription() != null)
if (offeredService.getServiceSettings().get(i).getDescription().length()>0 )
descr = " - "+offeredService.getServiceSettings().get(i).getDescription();
styledString.append(descr, StyledString.COUNTER_STYLER);
ICompletionProposal completionProposal = createCompletionProposal( proposal, styledString, IMAGEServiceSetting, context) ;
// register the proposal, the acceptor handles null-values gracefully
acceptor.accept(completionProposal);
}
}
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(), 9, base.getStyle() | additionalStyle);
} return styleData;
}
public void completeServiceSettingInstance_Name(ServiceSettingInstance model, Assignment assignment, ContentAssistContext context,
ICompletionProposalAcceptor acceptor){
// call implementation in superclass
super.completeServiceSettingInstance_Name(
model,
assignment,
context,
acceptor);
String proposedName = model.getRefServiceSetting().getName().toLowerCase().replace(' ', '_');
String proposal = proposedName ;
// convert it to a valid STRING-terminal
proposal = getValueConverter(). toString(proposal, null);
Styler fBoldStyler= new Styler() {
@Override
public void applyStyles(TextStyle textStyle) {
FontData[] boldFontData= getModifiedFontData(Display.getCurrent().getFontList("Segoe UI", true), SWT.BOLD);
Font boldFont = new Font(Display.getCurrent(), boldFontData);
textStyle.font= boldFont;
}
};
Styler style= fBoldStyler;
StyledString styledString= new StyledString( proposedName , style );
String descr = " - Type here an alias name for "+model.getRefServiceSetting().getName()+". This can be used as assignment by other settings";
styledString.append(descr, StyledString.COUNTER_STYLER);
ICompletionProposal completionProposal = createCompletionProposal( proposal, styledString, IMAGEServiceSettingInstance, context) ;
// register the proposal, the acceptor handles null-values gracefully
acceptor.accept(completionProposal);
}
public void completeServiceSettingInstance_StaticValue(ServiceSettingInstance model,
Assignment assignment, ContentAssistContext context,
ICompletionProposalAcceptor acceptor) {
// TODO Auto-generated method stub
super.completeServiceSettingInstance_StaticValue(model, assignment, context,
acceptor);
if ( !( model.getRefServiceSetting().getSettingType() instanceof brTypeEnum ))
return;
brTypeEnum enumtype = (brTypeEnum)model.getRefServiceSetting().getSettingType();
Styler fBoldStyler= new Styler() {
@Override
public void applyStyles(TextStyle textStyle) {
FontData[] boldFontData= getModifiedFontData(Display.getCurrent().getFontList("Segoe UI", true), SWT.BOLD);
Font boldFont = new Font(Display.getCurrent(), boldFontData);
textStyle.font= boldFont;
}
};
Styler style= fBoldStyler;
for (brTypeEnumItem item : enumtype.getTideEnumlist()) {
String proposedName = item.getValue();
String proposal = "\""+proposedName +"\"" ;
// convert it to a valid STRING-terminal
proposal = getValueConverter(). toString(proposal, null);
StyledString styledString= new StyledString( proposedName , style );
String descr = " - "+item.getDescription() ;
styledString.append(descr, StyledString.COUNTER_STYLER);
ICompletionProposal completionProposal = createCompletionProposal( proposal, styledString, IMAGEtideTypeEnumItem, context) ;
// register the proposal, the acceptor handles null-values gracefully
acceptor.accept(completionProposal);
}
}
public void completeServiceRequest_Name(ServiceRequest model, Assignment assignment, ContentAssistContext context,
ICompletionProposalAcceptor acceptor){
// call implementation in superclass
super.completeServiceRequest_Name(
model,
assignment,
context,
acceptor);
String proposedName = "my"+model.getRefService().getName().toLowerCase().replace(' ', '_');
String proposal = proposedName ;
String proposalArray = proposedName+"[1..N]" ;
// convert it to a valid STRING-terminal
proposal = getValueConverter(). toString(proposal, null);
proposalArray = getValueConverter(). toString(proposalArray, null);
Styler fBoldStyler= new Styler() {
@Override
public void applyStyles(TextStyle textStyle) {
FontData[] boldFontData= getModifiedFontData(Display.getCurrent().getFontList("Segoe UI", true), SWT.BOLD);
Font boldFont = new Font(Display.getCurrent(), boldFontData);
textStyle.font= boldFont;
}
};
Styler style= fBoldStyler;
StyledString styledString= new StyledString( proposedName , style );
String descr = " - Type here an alias name for service "+model.getRefService().getName();
styledString.append(descr, StyledString.COUNTER_STYLER);
StyledString styledStringArray= new StyledString( proposalArray , style );
descr = " - Type here an alias name for an array of N "+model.getRefService().getName()+" services";
styledStringArray.append(descr, StyledString.COUNTER_STYLER);
ICompletionProposal completionProposal = createCompletionProposal( proposal, styledString, IMAGEServiceRequest, context) ;
acceptor.accept(completionProposal);
completionProposal = createCompletionProposal( proposalArray, styledStringArray, IMAGEServiceRequest, context) ;
acceptor.accept(completionProposal);
}
@Inject
IGlobalScopeProvider provider;
protected Predicate<IEObjectDescription > rResOfferedServices = new Predicate<IEObjectDescription>() {
public boolean apply(IEObjectDescription input) {
System.out.println(">>>Predicate apply>>>="+ input.toString() );
return true;
// return input.getName().length()==6;
}
};
@Override
public void completeServiceRequest_RefService(EObject model, Assignment assignment, ContentAssistContext context,
ICompletionProposalAcceptor acceptor){
//Scoping must be used in Code Completion because elements from Imported files are not shown.
//See http://chilifreak.wordpress.com/2010/02/22/extending-proposals-in-xtext-using-scoping/
// FederationOfficePackage contains all static elements of the mm
org.eclipse.xtext.scoping.IScope scope = provider.getScope( model.eResource() ,
BrokermodelPackage.eINSTANCE.getBroker_OfferedServices(),
rResOfferedServices );
for (IEObjectDescription element : scope.getAllElements()) {
// we know that they are OfferedService
OfferedService os = (OfferedService) element.getEObjectOrProxy() ;
EObject obj = null;
// if (os.eIsProxy()){
// System.out.println(">>>>>>>>> scoping model object is Proxy" ); //context.getRootModel().eResource().getResourceSet()
// obj = org.eclipse.emf.ecore.util.EcoreUtil.resolve( os, element.getEObjectOrProxy().eResource().getResourceSet() );
// os = (OfferedService) obj;
// }
if (os.eIsProxy()){
System.out.println(">>>>>>>>> scoping model object is Proxy" ); //context.getRootModel().eResource().getResourceSet()
obj = org.eclipse.emf.ecore.util.EcoreUtil.resolve( os, context.getRootModel().eResource().getResourceSet() );
os = (OfferedService) obj;
}
//String proposal = "\""+((Office)os.eContainer()).getName()+ "."+ os.getName()+"\"";
String proposal = "\"" + os.getName()+ "."+((Broker)os.eContainer()).getName()+"\"";
// convert it to a valid STRING-terminal
proposal = getValueConverter(). toString(proposal, null);
Styler fBoldStyler= new Styler() {
@Override
public void applyStyles(TextStyle textStyle) {
FontData[] boldFontData= getModifiedFontData(Display.getCurrent().getFontList("Segoe UI", true), SWT.BOLD);
Font boldFont = new Font(Display.getCurrent(), boldFontData);
textStyle.font= boldFont;
}
};
Styler style= fBoldStyler;
StyledString styledString= new StyledString( proposal , style );
String descr = " - "+ os.getDescription();
styledString.append(descr, StyledString.COUNTER_STYLER);
ICompletionProposal completionProposal = createCompletionProposal( proposal,
styledString, IMAGEOfferedService, context) ;
// register the proposal, the acceptor handles null-values gracefully
acceptor.accept(completionProposal);
}
}
// @Override
// public void completeServiceRequest_RefService(EObject model, Assignment assignment, ContentAssistContext context,
// ICompletionProposalAcceptor acceptor){
// // call implementation in superclass
//// super.completeServiceRequest_RefService(
//// model,
//// assignment,
//// context,
//// acceptor);
//
//
//
// //System.out.println(">>>>>>>>> scoping model object=" + model.toString());
//
// //Have in mind that the proposal must be the same as the scoping!
// //NOTE. If you like to have FQN ID instead of Strings, the you must go to FSDL syntax and change the efService=[services::Service|STRING] to FQN
// //we have strings Services because we afraid that there might be blanks or other characters in a offered service name
// //TreeIterator<Object> iterator = EcoreUtil.getAllProperContents(context.getRootModel().eResource().getResourceSet(), true);
// TreeIterator<Object> iterator = EcoreUtil.getAllContents(context.getRootModel().eResource().getResourceSet() , true);
//
//
//
// while (iterator.hasNext()) {
// Object object = (Object) iterator.next();
// System.out.println(">>>>>>>>> scoping scope_OfferedService object=" + object.toString());
//
////
//// if (object instanceof FederationOffice.federationscenarios.Import ){
//// FederationOffice.federationscenarios.Import imp = (FederationOffice.federationscenarios.Import) object;
//// imp.getImportURI();
////
//// }
// if (object instanceof OfferedService ){
// OfferedService os = (OfferedService)object;
// String proposal = "\""+((Office)os.eContainer()).getName()+ "."+ os.getName()+"\"";
// // convert it to a valid STRING-terminal
// proposal = getValueConverter(). toString(proposal, null);
// Styler fBoldStyler= new Styler() {
// @Override
// public void applyStyles(TextStyle textStyle) {
// FontData[] boldFontData= getModifiedFontData(Display.getCurrent().getFontList("Segoe UI", true), SWT.BOLD);
//
// Font boldFont = new Font(Display.getCurrent(), boldFontData);
// textStyle.font= boldFont;
// }
// };
//
// Styler style= fBoldStyler;
// StyledString styledString= new StyledString( proposal , style );
// String descr = " - "+ os.getDescription();
// styledString.append(descr, StyledString.COUNTER_STYLER);
//
// ICompletionProposal completionProposal = createCompletionProposal( proposal,
// styledString, IMAGEOfferedService, context) ;
//
// // register the proposal, the acceptor handles null-values gracefully
// acceptor.accept(completionProposal);
//
// }
// }
//
// }
public void completeResourceSettingInstance_RefResourceSetting(
ResourceSettingInstance model, Assignment assignment, ContentAssistContext context,
ICompletionProposalAcceptor acceptor) {
// call implementation in superclass
// super.completeMyServiceSettingInstance_RefServiceSetting(
// model,
// assignment,
// context,
// acceptor);
// // compute the plain proposal
// String proposal = "Description for model" ;
// System.out.println("completeServiceSettingInstance_RefServiceSetting model, " +model.toString()+
// " assignment, " +assignment.getFeature().toString()+
// " context, " +context.toString()+
// " acceptor" +acceptor.toString()
// );
brokermodel.resources.OfferedResource offeredResource = null;
if ( model.eContainer() instanceof ResourceRequest){
offeredResource = ((ResourceRequest)model.eContainer()).getRefOfferedResource();
}
if ( offeredResource ==null)
return;
//Have in mind that the proposal must be the same as the scoping!
for (int i = 0; i < offeredResource.getResourceSettings().size() ; i++) {
offeredResource.getResourceSettings().get(i);
String proposedName = "\""+offeredResource.getResourceSettings().get(i).getName()+"\"";
// convert it to a valid STRING-terminal
String proposal = getValueConverter().toString( proposedName , null);
// create the completion proposal the result may be null as the createCompletionProposal(..) methods
// check for valid prefixes and terminal token conflicts
Styler fBoldStyler= new Styler() {
@Override
public void applyStyles(TextStyle textStyle) {
FontData[] boldFontData= getModifiedFontData(Display.getCurrent().getFontList("Segoe UI", true), SWT.BOLD);
Font boldFont = new Font(Display.getCurrent(), boldFontData);
textStyle.font= boldFont;
}
};
Styler style= fBoldStyler;
StyledString styledString= new StyledString( proposedName , style );
String descr = " ";
if (offeredResource.getResourceSettings().get(i).getDescription().length()>0 )
descr = " - "+offeredResource.getResourceSettings().get(i).getDescription();
styledString.append(descr, StyledString.COUNTER_STYLER);
ICompletionProposal completionProposal = createCompletionProposal( proposal, styledString, IMAGEResourceSetting, context) ;
// register the proposal, the acceptor handles null-values gracefully
acceptor.accept(completionProposal);
}
}
@Override
public void completeResourceRequest_RefOfferedResource(EObject model,
Assignment assignment, ContentAssistContext context,
ICompletionProposalAcceptor acceptor) {
// Scoping must be used in Code Completion because elements from
// Imported files are not shown.
// See http://chilifreak.wordpress.com/2010/02/22/extending-proposals-in-xtext-using-scoping/
org.eclipse.xtext.scoping.IScope scope = provider.getScope( model.eResource(),
BrokermodelPackage.eINSTANCE.getBroker_RegisteredUsers(), null);
// scope contains only customer
for (IEObjectDescription element : scope.getAllElements()) {
BrokerUser user = (BrokerUser) element.getEObjectOrProxy();
System.out.println(">>USER: "+user.getName()); // context.getRootModel().eResource().getResourceSet()
EObject obj = null;
if (user.eIsProxy()) {
System.out.println(">>>>>>>>> scoping model user "+user.getName()+" is Proxy"); // context.getRootModel().eResource().getResourceSet()
obj = org.eclipse.emf.ecore.util.EcoreUtil.resolve(user, context.getRootModel().eResource().getResourceSet());
user = (BrokerUser) obj;
}
if (user instanceof ResourcesProvider) {
for (Site site : ((ResourcesProvider) user).getOfferedSiteList()) {
for (OfferedResource os : site.getOfferedResourcesList()) {
if (os.eIsProxy()) {
System.out.println(">>>>>>>>> scoping OfferedResource "+user.getName()+" object is Proxy"); // context.getRootModel().eResource().getResourceSet()
obj = org.eclipse.emf.ecore.util.EcoreUtil.resolve(
os, context.getRootModel().eResource().getResourceSet());
os = (OfferedResource) obj;
}
//String proposal = "\""+ os.getFullQualifiedName() + "\"";
String proposal = "\""+ os.getName() + "\"";
System.out.println(">> "+ proposal ); // context.getRootModel().eResource().getResourceSet()
// convert it to a valid STRING-terminal
proposal = getValueConverter().toString(proposal, null);
Styler fBoldStyler = new Styler() {
@Override
public void applyStyles(TextStyle textStyle) {
FontData[] boldFontData = getModifiedFontData(
Display.getCurrent().getFontList(
"Segoe UI", true), SWT.BOLD);
Font boldFont = new Font(Display.getCurrent(),
boldFontData);
textStyle.font = boldFont;
}
};
Styler style = fBoldStyler;
StyledString styledString = new StyledString(proposal,
style);
String descr = " - " + os.getDescription();
styledString.append(descr, StyledString.COUNTER_STYLER);
ICompletionProposal completionProposal = createCompletionProposal(
proposal, styledString, IMAGEOfferedService,
context);
// register the proposal, the acceptor handles
// null-values gracefully
acceptor.accept(completionProposal);
}
}
}
}
}
}