blob: b85e9e84d1f462056e6eac02d7ea2f9a59dc7e1c [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2004, 2007 Boeing
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Boeing - initial API and implementation
**********************************************************************/
package org.eclipse.osee.framework.ui.skynet.widgets.util;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import org.eclipse.osee.framework.core.OrcsTokenService;
import org.eclipse.osee.framework.core.data.ArtifactTypeToken;
import org.eclipse.osee.framework.core.data.AttributeTypeToken;
import org.eclipse.osee.framework.core.data.IOseeBranch;
import org.eclipse.osee.framework.core.enums.BranchArchivedState;
import org.eclipse.osee.framework.core.enums.BranchType;
import org.eclipse.osee.framework.jdk.core.type.OseeArgumentException;
import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
import org.eclipse.osee.framework.jdk.core.util.Strings;
import org.eclipse.osee.framework.logging.OseeLevel;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
import org.eclipse.osee.framework.skynet.core.attribute.BooleanAttribute;
import org.eclipse.osee.framework.ui.skynet.internal.Activator;
import org.eclipse.osee.framework.ui.skynet.internal.ServiceUtil;
import org.eclipse.osee.framework.ui.skynet.widgets.ArtifactWidget;
import org.eclipse.osee.framework.ui.skynet.widgets.AttributeWidget;
import org.eclipse.osee.framework.ui.skynet.widgets.SkynetSpellModifyDictionary;
import org.eclipse.osee.framework.ui.skynet.widgets.XArtifactList;
import org.eclipse.osee.framework.ui.skynet.widgets.XArtifactMultiChoiceSelect;
import org.eclipse.osee.framework.ui.skynet.widgets.XArtifactTypeComboViewer;
import org.eclipse.osee.framework.ui.skynet.widgets.XArtifactTypeMultiChoiceSelect;
import org.eclipse.osee.framework.ui.skynet.widgets.XAttributeTypeComboViewer;
import org.eclipse.osee.framework.ui.skynet.widgets.XAttributeTypeMultiChoiceSelect;
import org.eclipse.osee.framework.ui.skynet.widgets.XBranchSelectWidget;
import org.eclipse.osee.framework.ui.skynet.widgets.XBranchSelectWidgetDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XBranchSelectWidgetWithSave;
import org.eclipse.osee.framework.ui.skynet.widgets.XButton;
import org.eclipse.osee.framework.ui.skynet.widgets.XButtonPush;
import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBoxDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBoxThreeState;
import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBoxThreeStateDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XCombo;
import org.eclipse.osee.framework.ui.skynet.widgets.XComboBooleanDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XComboDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XComboViewer;
import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
import org.eclipse.osee.framework.ui.skynet.widgets.XDateDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XFileTextWithSelectionDialog;
import org.eclipse.osee.framework.ui.skynet.widgets.XFileTextWithSelectionDialog.Type;
import org.eclipse.osee.framework.ui.skynet.widgets.XFloat;
import org.eclipse.osee.framework.ui.skynet.widgets.XFloatDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XHyperlabelMemberSelDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XHyperlabelMemberSelection;
import org.eclipse.osee.framework.ui.skynet.widgets.XHyperlinkLabel;
import org.eclipse.osee.framework.ui.skynet.widgets.XInteger;
import org.eclipse.osee.framework.ui.skynet.widgets.XIntegerDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XLabel;
import org.eclipse.osee.framework.ui.skynet.widgets.XLabelDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XList;
import org.eclipse.osee.framework.ui.skynet.widgets.XListDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XListDropViewWithSave;
import org.eclipse.osee.framework.ui.skynet.widgets.XListDropViewer;
import org.eclipse.osee.framework.ui.skynet.widgets.XListRelationWidget;
import org.eclipse.osee.framework.ui.skynet.widgets.XLong;
import org.eclipse.osee.framework.ui.skynet.widgets.XLongDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XMembersCombo;
import org.eclipse.osee.framework.ui.skynet.widgets.XMembersList;
import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
import org.eclipse.osee.framework.ui.skynet.widgets.XOptionHandler;
import org.eclipse.osee.framework.ui.skynet.widgets.XRadioButton;
import org.eclipse.osee.framework.ui.skynet.widgets.XRadioButtons;
import org.eclipse.osee.framework.ui.skynet.widgets.XSelectFromMultiChoiceBranch;
import org.eclipse.osee.framework.ui.skynet.widgets.XSelectFromMultiChoiceDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XStackedDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XText;
import org.eclipse.osee.framework.ui.skynet.widgets.XTextDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XTextFlatDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XTextResourceDropDam;
import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
import org.eclipse.swt.SWT;
/**
* @author Jeff C. Phillips
* @author Donald G. Dunne
*/
public final class FrameworkXWidgetProvider {
private static final FrameworkXWidgetProvider reference = new FrameworkXWidgetProvider();
private FrameworkXWidgetProvider() {
// Hide Constructor to enforce singleton pattern
}
public static FrameworkXWidgetProvider getInstance() {
return reference;
}
private String getXWidgetNameBasedOnAttribute(ArtifactTypeToken artType, AttributeTypeToken attributeType) {
if (attributeType != AttributeTypeToken.SENTINEL) {
IAttributeXWidgetProvider xWidgetProvider =
AttributeXWidgetManager.getAttributeXWidgetProvider(artType, attributeType);
List<XWidgetRendererItem> concreteWidgets =
xWidgetProvider.getDynamicXWidgetLayoutData(artType, attributeType);
return concreteWidgets.iterator().next().getXWidgetName();
}
return null;
}
public XWidget createXWidget(XWidgetRendererItem xWidgetLayoutData) {
String xWidgetName = xWidgetLayoutData.getXWidgetName();
String name = xWidgetLayoutData.getName();
XWidget xWidget = null;
try {
OrcsTokenService tokenService = ServiceUtil.getTokenService();
// Set xWidgetName from attribute type if not already set
Artifact artifact = xWidgetLayoutData.getArtifact();
if (!Strings.isValid(xWidgetName) && artifact != null) {
AttributeTypeToken attributeType = AttributeTypeToken.SENTINEL;
ArtifactTypeToken artType = ArtifactTypeToken.SENTINEL;
if (!Strings.isValid(xWidgetName) && xWidgetLayoutData.getStoreId() > 0) {
tokenService.getAttributeTypeOrSentinel(xWidgetLayoutData.getStoreId());
tokenService.getArtifactType(xWidgetLayoutData.getArtifactType().getId());
}
if (attributeType == AttributeTypeToken.SENTINEL && !Strings.isValid(xWidgetName) && Strings.isValid(
xWidgetLayoutData.getStoreName())) {
attributeType = tokenService.getAttributeType(xWidgetLayoutData.getStoreName());
}
xWidgetName = getXWidgetNameBasedOnAttribute(artType, attributeType);
}
// Look for widget provider to create widget
for (IXWidgetProvider widgetProvider : getXWidgetProviders()) {
xWidget = widgetProvider.createXWidget(xWidgetName, name, xWidgetLayoutData);
if (xWidget != null) {
break;
}
}
XOptionHandler options = xWidgetLayoutData.getXOptionHandler();
if (xWidget == null) {
// Otherwise, use default widget creation
if (xWidgetName.equals("XText")) {
xWidget = new XText(name);
if (Strings.isValid(xWidgetLayoutData.getDefaultValue())) {
((XText) xWidget).set(xWidgetLayoutData.getDefaultValue());
}
} else if (xWidgetName.equals("XSelectFromMultiChoiceBranch")) {
XSelectFromMultiChoiceBranch multiBranchSelect = new XSelectFromMultiChoiceBranch(name);
try {
List<? extends IOseeBranch> branches =
BranchManager.getBranches(BranchArchivedState.ALL, BranchType.WORKING, BranchType.BASELINE);
Collections.sort(branches);
multiBranchSelect.setSelectableItems(branches);
} catch (OseeCoreException ex) {
OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, ex);
}
multiBranchSelect.setRequiredEntry(true);
xWidget = multiBranchSelect;
} else if (xWidgetName.equals("XInteger")) {
xWidget = new XInteger(name);
} else if (xWidgetName.equals("XLong")) {
xWidget = new XLong(name);
} else if (xWidgetName.equals("XTextDam")) {
xWidget = new XTextDam(name);
} else if (xWidgetName.equals("XButton")) {
xWidget = new XButton(name);
} else if (xWidgetName.equals("XButtonPush")) {
xWidget = new XButtonPush(name);
} else if (xWidgetName.startsWith("XRadioButtons")) {
String values[] =
xWidgetLayoutData.getDynamicXWidgetLayout().getOptionResolver().getWidgetOptions(xWidgetLayoutData);
if (values.length > 0) {
XRadioButtons radio = new XRadioButtons(name, "");
if (options.contains(XOption.SORTED)) {
Arrays.sort(values);
}
String defaultValue = xWidgetLayoutData.getDefaultValue();
for (String value : values) {
XRadioButton button = radio.addButton(value);
if (Strings.isValid(defaultValue) && value.equals(defaultValue)) {
button.setSelected(true);
}
}
xWidget = radio;
} else {
throw new OseeArgumentException(
"Invalid XRadioButtons. Must be \"XRadioButtons(option1,option2,option3)\"");
}
} else if (xWidgetName.equals("XLabelDam")) {
xWidget = new XLabelDam(name);
} else if (xWidgetName.equals("XMembersList")) {
try {
xWidget = new XMembersList(name);
} catch (Exception ex) {
OseeLog.log(Activator.class, Level.SEVERE, ex);
}
} else if (xWidgetName.equals("XMembersCombo")) {
xWidget = new XMembersCombo(name);
} else if (xWidgetName.equals("XMembersComboAll")) {
xWidget = new XMembersCombo(name, true);
} else if (xWidgetName.equals("XDate")) {
xWidget = new XDate(name);
} else if (xWidgetName.equals("XFileSelectionDialog")) {
xWidget = new XFileTextWithSelectionDialog(name);
} else if (xWidgetName.equals("XDirectorySelectionDialog")) {
String defaultValue = xWidgetLayoutData.getDefaultValue();
if (Strings.isValid(defaultValue)) {
xWidget = new XFileTextWithSelectionDialog(name, Type.Directory, defaultValue);
} else {
xWidget = new XFileTextWithSelectionDialog(name, Type.Directory);
}
} else if (xWidgetName.equals("XDateDam")) {
xWidget = new XDateDam(name);
} else if (xWidgetName.equals("XTextResourceDropDam")) {
xWidget = new XTextResourceDropDam(name);
} else if (xWidgetName.equals("XFloat")) {
xWidget = new XFloat(name);
} else if (xWidgetName.equals("XFloatDam")) {
xWidget = new XFloatDam(name);
} else if (xWidgetName.equals("XIntegerDam")) {
xWidget = new XIntegerDam(name);
} else if (xWidgetName.equals("XLongDam")) {
xWidget = new XLongDam(name);
} else if (xWidgetName.equals("XFileTextWithSelectionDialog")) {
xWidget = new XFileTextWithSelectionDialog(name);
} else if (xWidgetName.equals("XLabel")) {
String defaultValue = xWidgetLayoutData.getDefaultValue();
if (Strings.isValid(defaultValue)) {
xWidget = new XLabel(name, xWidgetLayoutData.getDefaultValue());
} else {
xWidget = new XLabel(name);
}
} else if (xWidgetName.equals("XCheckBox")) {
XCheckBox checkBox = new XCheckBox(name);
checkBox.setLabelAfter(options.contains(XOption.LABEL_AFTER));
if (Strings.isValid(xWidgetLayoutData.getDefaultValue())) {
checkBox.set(Boolean.valueOf(xWidgetLayoutData.getDefaultValue()));
}
xWidget = checkBox;
} else if (xWidgetName.equals("XCheckBoxDam")) {
XCheckBoxDam checkBox = new XCheckBoxDam(name);
checkBox.setLabelAfter(options.contains(XOption.LABEL_AFTER));
xWidget = checkBox;
} else if (xWidgetName.equals("XCheckBoxThreeState")) {
XCheckBoxThreeState checkBox = new XCheckBoxThreeState(name);
checkBox.setLabelAfter(options.contains(XOption.LABEL_AFTER));
xWidget = checkBox;
} else if (xWidgetName.equals("XCheckBoxThreeStateDam")) {
XCheckBoxThreeStateDam checkBox = new XCheckBoxThreeStateDam(name);
checkBox.setLabelAfter(options.contains(XOption.LABEL_AFTER));
xWidget = checkBox;
} else if (xWidgetName.startsWith("XComboDam")) {
if (xWidgetLayoutData.getDynamicXWidgetLayout() != null) {
String values[] = xWidgetLayoutData.getDynamicXWidgetLayout().getOptionResolver().getWidgetOptions(
xWidgetLayoutData);
if (values.length > 0) {
xWidget = new XComboDam(name);
XComboDam combo = new XComboDam(name);
combo.setDataStrings(values);
if (options.contains(XOption.NO_DEFAULT_VALUE)) {
combo.setDefaultSelectionAllowed(false);
}
if (options.contains(XOption.ADD_DEFAULT_VALUE)) {
combo.setDefaultSelectionAllowed(true);
}
xWidget = combo;
} else {
throw new OseeArgumentException(
"Invalid XComboDam. Must be \"XComboDam(option1,option2,option3)\"");
}
}
} else if (xWidgetName.startsWith("XSelectFromMultiChoiceDam")) {
if (xWidgetLayoutData.getDynamicXWidgetLayout() != null) {
String values[] = xWidgetLayoutData.getDynamicXWidgetLayout().getOptionResolver().getWidgetOptions(
xWidgetLayoutData);
if (values.length > 0) {
XSelectFromMultiChoiceDam widget = new XSelectFromMultiChoiceDam(name);
widget.setSelectableItems(Arrays.asList(values));
xWidget = widget;
} else {
throw new OseeArgumentException(
"Invalid XSelectFromMultiChoiceDam. Must be \"XSelectFromMultiChoiceDam(option1,option2,option3)\"");
}
}
} else if (xWidgetName.startsWith("XStackedDam")) {
xWidget = new XStackedDam(name);
} else if (xWidgetName.startsWith("XFlatDam")) {
xWidget = new XTextFlatDam(name);
} else if (xWidgetName.startsWith("XComboBooleanDam")) {
xWidget = new XComboBooleanDam(name);
XComboBooleanDam combo = new XComboBooleanDam(name);
combo.setDataStrings(BooleanAttribute.booleanChoices);
xWidget = combo;
if (Strings.isValid(xWidgetLayoutData.getDefaultValue())) {
String value = xWidgetLayoutData.getDefaultValue();
if ("true".equals(value)) {
combo.set("true");
} else if ("false".equals(value)) {
combo.set("false");
} else {
combo.set("");
}
}
if (options.contains(XOption.NO_DEFAULT_VALUE)) {
combo.setDefaultSelectionAllowed(false);
}
if (options.contains(XOption.ADD_DEFAULT_VALUE)) {
combo.setDefaultSelectionAllowed(true);
}
} else if (xWidgetName.startsWith("XComboViewer")) {
xWidget = new XComboViewer(name, SWT.NONE);
} else if (xWidgetName.startsWith("XCombo")) {
String values[] =
xWidgetLayoutData.getDynamicXWidgetLayout().getOptionResolver().getWidgetOptions(xWidgetLayoutData);
if (values.length > 0) {
XCombo combo = new XCombo(name);
if (options.contains(XOption.SORTED)) {
Arrays.sort(values);
}
combo.setDataStrings(values);
if (options.contains(XOption.NO_DEFAULT_VALUE)) {
combo.setDefaultSelectionAllowed(false);
}
if (options.contains(XOption.ADD_DEFAULT_VALUE)) {
combo.setDefaultSelectionAllowed(true);
}
xWidget = combo;
String defaultValue = xWidgetLayoutData.getDefaultValue();
if (Strings.isValid(defaultValue)) {
combo.setDefaultValue(defaultValue);
}
} else {
throw new OseeArgumentException("Invalid XCombo. Must be \"XCombo(option1,option2,option3)\"");
}
} else if (xWidgetName.startsWith("XListDam")) {
if (xWidgetLayoutData.getDynamicXWidgetLayout() != null) {
String values[] = xWidgetLayoutData.getDynamicXWidgetLayout().getOptionResolver().getWidgetOptions(
xWidgetLayoutData);
XListDam list = new XListDam(name);
if (values.length > 0) {
list.add(values);
}
xWidget = list;
}
} else if (xWidgetName.equals("XHyperlabelMemberSelDam")) {
xWidget = new XHyperlabelMemberSelDam(name);
} else if (xWidgetName.equals("XHyperlabelMemberSelection")) {
xWidget = new XHyperlabelMemberSelection(name);
} else if (xWidgetName.startsWith("XListDropViewer")) {
if ("XListDropViewerWithSave".equals(xWidgetName)) {
xWidget = new XListDropViewWithSave(name);
} else {
xWidget = new XListDropViewer(name);
}
} else if (xWidgetName.equals(XListRelationWidget.WIDGET_ID)) {
return new XListRelationWidget(artifact, xWidgetName, xWidgetLayoutData.getRelationTypeSide());
} else if (xWidgetName.startsWith("XList")) {
String values[] =
xWidgetLayoutData.getDynamicXWidgetLayout().getOptionResolver().getWidgetOptions(xWidgetLayoutData);
if (values.length > 0) {
XList list = new XList(name);
list.add(values);
xWidget = list;
String defaultValue = xWidgetLayoutData.getDefaultValue();
if (Strings.isValid(defaultValue)) {
list.setSelected(Arrays.asList(defaultValue.split(",")));
}
} else {
throw new OseeArgumentException("Invalid XList. Must be \"XList(option1,option2,option3)\"");
}
} else if (xWidgetName.startsWith("XArtifactList")) {
XArtifactList artifactList = new XArtifactList(name);
artifactList.setMultiSelect(options.contains(XOption.MULTI_SELECT));
xWidget = artifactList;
} else if (xWidgetName.equals(XBranchSelectWidgetDam.WIDGET_ID)) {
xWidget = new XBranchSelectWidgetDam();
} else if (xWidgetName.startsWith(XBranchSelectWidget.WIDGET_ID)) {
XBranchSelectWidget widget = null;
if (xWidgetName.endsWith("WithSave")) {
widget = new XBranchSelectWidgetWithSave(name);
} else {
widget = new XBranchSelectWidget(name);
}
widget.setToolTip(xWidgetLayoutData.getToolTip());
try {
String branchUuid = xWidgetLayoutData.getDefaultValue();
if (Strings.isValid(branchUuid)) {
try {
Long uuid = Long.valueOf(branchUuid);
widget.setSelection(BranchManager.getBranchToken(uuid));
} catch (Exception ex) {
// do nothing
}
}
} catch (OseeCoreException ex) {
OseeLog.log(Activator.class, Level.SEVERE, ex);
}
xWidget = widget;
} else if (xWidgetName.equals(XArtifactTypeComboViewer.WIDGET_ID)) {
XArtifactTypeComboViewer widget = new XArtifactTypeComboViewer();
xWidget = widget;
} else if (xWidgetName.equals(XAttributeTypeComboViewer.WIDGET_ID)) {
XAttributeTypeComboViewer widget = new XAttributeTypeComboViewer();
xWidget = widget;
} else if (xWidgetName.equals(XAttributeTypeMultiChoiceSelect.WIDGET_ID)) {
XAttributeTypeMultiChoiceSelect widget = new XAttributeTypeMultiChoiceSelect();
xWidget = widget;
} else if (xWidgetName.equals(XArtifactTypeMultiChoiceSelect.WIDGET_ID)) {
XArtifactTypeMultiChoiceSelect widget = new XArtifactTypeMultiChoiceSelect();
String defaultType = xWidgetLayoutData.getDefaultValue();
if (Strings.isValid(defaultType)) {
List<ArtifactTypeToken> types = new LinkedList<>();
for (String type : defaultType.split(",")) {
try {
types.add(ServiceUtil.getTokenService().getArtifactType(type));
} catch (Exception ex) {
// do nothing
}
}
widget.setSelected(types);
}
xWidget = widget;
} else if (xWidgetName.equals(XArtifactMultiChoiceSelect.WIDGET_ID)) {
xWidget = new XArtifactMultiChoiceSelect();
} else if (xWidgetName.equals(XTextFlatDam.WIDGET_ID)) {
XTextFlatDam widget = new XTextFlatDam();
xWidget = widget;
} else if (xWidgetName.equals("XHyperlinkLabel")) {
xWidget = new XHyperlinkLabel(name);
String defaultValue = xWidgetLayoutData.getDefaultValue();
if (Strings.isValid(defaultValue)) {
XHyperlinkLabel widget = (XHyperlinkLabel) xWidget;
widget.setUrl(xWidgetLayoutData.getDefaultValue());
}
} else if (xWidgetName.equals("XRadioButton")) {
xWidget = new XRadioButton(name);
} else {
xWidget = new XLabel("Error: Unhandled XWidget \"" + xWidgetName + "\"");
}
}
if (xWidget instanceof XText) {
((XText) xWidget).addXTextSpellModifyDictionary(new SkynetSpellModifyDictionary());
}
if (xWidget != null && options.contains(XOption.NO_LABEL)) {
xWidget.setDisplayLabel(false);
}
if (artifact != null) {
AttributeTypeToken attributeType = AttributeTypeToken.SENTINEL;
if (xWidget instanceof AttributeWidget && xWidgetLayoutData.getStoreId() > 0) {
attributeType = tokenService.getAttributeType(xWidgetLayoutData.getStoreId());
}
if (attributeType == AttributeTypeToken.SENTINEL && Strings.isValid(xWidgetLayoutData.getStoreName())) {
attributeType = tokenService.getAttributeType(xWidgetLayoutData.getStoreName());
}
if (attributeType != AttributeTypeToken.SENTINEL && xWidget instanceof AttributeWidget) {
((AttributeWidget) xWidget).setAttributeType(artifact, attributeType);
}
if (xWidget instanceof ArtifactWidget) {
((ArtifactWidget) xWidget).setArtifact(artifact);
}
}
if (xWidget != null) {
xWidget.setObject(xWidgetLayoutData.getObject());
}
} catch (Exception ex) {
String msg = String.format("Error creating widget for [%s][%s] exception: [%s] (see error log for details)",
name, xWidgetName, ex.getLocalizedMessage());
OseeLog.log(Activator.class, Level.SEVERE, msg, ex);
xWidget = new XLabel(msg);
}
return xWidget;
}
private static Collection<IXWidgetProvider> getXWidgetProviders() {
ExtensionDefinedObjects<IXWidgetProvider> contributions =
new ExtensionDefinedObjects<>(Activator.PLUGIN_ID + ".XWidgetProvider", "XWidgetProvider", "classname", true);
return contributions.getObjects();
}
}