use of com.twinsoft.convertigo.eclipse.property_editors.DataOrNullPropertyDescriptor in project convertigo by convertigo.
the class DatabaseObjectTreeObject method findPropertyDescriptor.
private PropertyDescriptor findPropertyDescriptor(final String name, String displayName, java.beans.PropertyDescriptor databaseObjectPropertyDescriptor, Object value, final Class<?> pec, boolean isExtractionRule, boolean isMasked) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
PropertyDescriptor propertyDescriptor = null;
// Primitive types
if (pec == null) {
if (value instanceof Boolean) {
String[] values = new String[] { "true", "false" };
propertyDescriptor = new DynamicComboBoxPropertyDescriptor(name, displayName, values, this, name);
} else if (value instanceof Number) {
propertyDescriptor = new TextPropertyDescriptor(name, displayName);
// propertyDescriptor.setValidator(new CompilableValueValidator(new NumberValidator(value.getClass())));
}
} else // Complex types
{
if (PropertyWithValidatorEditor.class.isAssignableFrom(pec)) {
propertyDescriptor = new TextPropertyDescriptor(name, displayName);
propertyDescriptor.setValidator(getValidator(name));
} else if (PropertyWithTagsEditor.class.isAssignableFrom(pec)) {
String[] tags;
if (PropertyWithDynamicTagsEditor.class.isAssignableFrom(pec)) {
Method getTags = pec.getMethod("getTags", new Class[] { DatabaseObjectTreeObject.class, String.class });
tags = (String[]) getTags.invoke(null, new Object[] { this, name });
propertyDescriptor = new DynamicComboBoxPropertyDescriptor(name, displayName, getTags, this, name);
} else if (PropertyWithTagsEditorAdvance.class.isAssignableFrom(pec)) {
Method getTags = pec.getDeclaredMethod("getTags", new Class[] { DatabaseObjectTreeObject.class, String.class });
tags = (String[]) getTags.invoke(null, new Object[] { this, name });
propertyDescriptor = new DynamicComboBoxPropertyDescriptor(name, displayName, tags, this, name);
} else {
Method getTags = pec.getDeclaredMethod("getTags", new Class[] { DatabaseObjectTreeObject.class });
tags = (String[]) getTags.invoke(null, new Object[] { this });
propertyDescriptor = new DynamicComboBoxPropertyDescriptor(name, displayName, tags, this, name);
}
} else if (StringComboBoxPropertyDescriptor.class.isAssignableFrom(pec)) {
Method getTags = pec.getDeclaredMethod("getTags", new Class[] { DatabaseObjectTreeObject.class, String.class });
String[] tags = (String[]) getTags.invoke(null, new Object[] { this, name });
propertyDescriptor = new StringComboBoxPropertyDescriptor(name, displayName, tags, false);
} else if (com.twinsoft.convertigo.eclipse.property_editors.MobileSmartSourcePropertyDescriptor.class.isAssignableFrom(pec)) {
Method getTags = pec.getDeclaredMethod("getTags", new Class[] { DatabaseObjectTreeObject.class, String.class });
String[] tags = (String[]) getTags.invoke(null, new Object[] { this, name });
propertyDescriptor = new com.twinsoft.convertigo.eclipse.property_editors.MobileSmartSourcePropertyDescriptor(name, displayName, tags, false);
((com.twinsoft.convertigo.eclipse.property_editors.MobileSmartSourcePropertyDescriptor) propertyDescriptor).databaseObjectTreeObject = this;
} else if (com.twinsoft.convertigo.eclipse.property_editors.NgxSmartSourcePropertyDescriptor.class.isAssignableFrom(pec)) {
Method getTags = pec.getDeclaredMethod("getTags", new Class[] { DatabaseObjectTreeObject.class, String.class });
String[] tags = (String[]) getTags.invoke(null, new Object[] { this, name });
propertyDescriptor = new com.twinsoft.convertigo.eclipse.property_editors.NgxSmartSourcePropertyDescriptor(name, displayName, tags, false);
((com.twinsoft.convertigo.eclipse.property_editors.NgxSmartSourcePropertyDescriptor) propertyDescriptor).databaseObjectTreeObject = this;
} else if (PropertyWithDynamicInfoEditor.class.isAssignableFrom(pec)) {
Method getInfo = pec.getMethod("getInfo", new Class[] { DatabaseObjectTreeObject.class, String.class });
propertyDescriptor = new DynamicInfoPropertyDescriptor(name, displayName, getInfo, this, name);
} else if (AbstractDialogCellEditor.class.isAssignableFrom(pec)) {
propertyDescriptor = new PropertyDescriptor(name, displayName) {
@Override
public CellEditor createPropertyEditor(Composite parent) {
try {
Constructor<?> constructor = pec.getConstructor(new Class[] { Composite.class });
AbstractDialogCellEditor editor = (AbstractDialogCellEditor) constructor.newInstance(new Object[] { parent });
editor.propertyDescriptor = this;
editor.databaseObjectTreeObject = DatabaseObjectTreeObject.this;
if (getValidator() != null) {
editor.setValidator(getValidator());
}
return editor;
} catch (Exception e) {
ConvertigoPlugin.logException(e, "Unexpected exception");
return null;
}
}
};
} else if (Enum.class.isAssignableFrom(pec)) {
String[] tags = EnumUtils.toStrings(pec);
propertyDescriptor = new DynamicComboBoxPropertyDescriptor(name, displayName, tags, this, name);
}
}
// Special cases
if (propertyDescriptor == null) {
// editor for scriptable properties
Object scriptable = databaseObjectPropertyDescriptor.getValue("scriptable");
if ((scriptable != null) && (scriptable.equals(Boolean.TRUE)))
propertyDescriptor = new ScriptablePropertyDescriptor(name, displayName);
// editor for nillable properties
if (propertyDescriptor == null) {
Object nillable = databaseObjectPropertyDescriptor.getValue("nillable");
if ((nillable != null) && (nillable.equals(Boolean.TRUE))) {
int style = isMasked ? SWT.PASSWORD : SWT.NONE;
if (value instanceof String) {
propertyDescriptor = new DataOrNullPropertyDescriptor(name, displayName, StringOrNullEditor.class, style);
} else if (value instanceof XMLVector) {
propertyDescriptor = new DataOrNullPropertyDescriptor(name, displayName, ArrayOrNullEditor.class, style);
}
}
}
// editor for disabled properties
Object disable = databaseObjectPropertyDescriptor.getValue("disable");
if ((disable != null) && (disable.equals(Boolean.TRUE)))
propertyDescriptor = new InfoPropertyDescriptor(name, displayName);
}
// Default case
if (propertyDescriptor == null) {
propertyDescriptor = new TextPropertyDescriptor(name, displayName);
// propertyDescriptor.setValidator(new CompilableValueValidator(getValidator(name)));
}
if (propertyDescriptor != null) {
ICellEditorValidator validator = getValidator(name);
if (validator != null) {
propertyDescriptor.setValidator(validator);
}
final ILabelProvider labelProvider = propertyDescriptor.getLabelProvider();
propertyDescriptor.setLabelProvider(new ILabelProvider() {
@Override
public void removeListener(ILabelProviderListener listener) {
labelProvider.removeListener(listener);
}
@Override
public boolean isLabelProperty(Object element, String property) {
return labelProvider.isLabelProperty(element, property);
}
@Override
public void dispose() {
labelProvider.dispose();
}
@Override
public void addListener(ILabelProviderListener listener) {
labelProvider.addListener(listener);
}
@Override
public String getText(Object element) {
String text = labelProvider.getText(element);
try {
String compiled = Engine.theApp.databaseObjectsManager.getCompiledValue(text);
if (!text.equals(compiled)) {
text += " => " + compiled;
}
} catch (UndefinedSymbolsException e) {
text += " /!\\ undefined symbol /!\\";
}
return text;
}
@Override
public Image getImage(Object element) {
return labelProvider.getImage(element);
}
});
String beanDescription = databaseObjectPropertyDescriptor.getShortDescription();
int id = beanDescription.indexOf("|");
if (id != -1) {
beanDescription = beanDescription.substring(0, id);
}
if (isExtractionRule) {
propertyDescriptor.setCategory(databaseObjectPropertyDescriptor.isExpert() ? "Selection" : "Configuration");
} else {
Object categoryValue = databaseObjectPropertyDescriptor.getValue("category");
String category = categoryValue == null ? "Base properties" : String.valueOf(categoryValue);
propertyDescriptor.setCategory(databaseObjectPropertyDescriptor.isExpert() ? "Expert" : category);
}
beanDescription = cleanDescription(beanDescription);
propertyDescriptor.setDescription(beanDescription);
}
return propertyDescriptor;
}
use of com.twinsoft.convertigo.eclipse.property_editors.DataOrNullPropertyDescriptor in project convertigo by convertigo.
the class DatabaseObjectTreeObject method setPropertyValue.
public void setPropertyValue(Object id, Object value) {
MobileBuilder mb = null;
IEditorPart editorPart = ConvertigoPlugin.getDefault().getApplicationComponentEditor();
if (editorPart != null) {
IEditorInput input = editorPart.getEditorInput();
if (input instanceof com.twinsoft.convertigo.eclipse.editors.mobile.ApplicationComponentEditorInput) {
com.twinsoft.convertigo.eclipse.editors.mobile.ApplicationComponentEditorInput editorInput = GenericUtils.cast(input);
mb = editorInput.getApplication().getProject().getMobileBuilder();
}
if (input instanceof com.twinsoft.convertigo.eclipse.editors.ngx.ApplicationComponentEditorInput) {
com.twinsoft.convertigo.eclipse.editors.ngx.ApplicationComponentEditorInput editorInput = GenericUtils.cast(input);
mb = editorInput.getApplication().getProject().getMobileBuilder();
}
}
DatabaseObject databaseObject = getObject();
Object oldValue = getPropertyValue(id);
String propertyName = (String) id;
ComboBoxCellEditor editor = DynamicComboBoxPropertyDescriptor.getLast();
if (editor != null && (!acceptSymbols() || !Integer.valueOf(editor.getItems().length - 1).equals(value))) {
editor = null;
}
if (isValueInProcess || (oldValue != null && oldValue.equals(value) && editor == null)) {
return;
}
try {
isValueInProcess = true;
java.beans.PropertyDescriptor databaseObjectPropertyDescriptor = getPropertyDescriptor(propertyName);
TreeViewer viewer = (TreeViewer) getAdapter(TreeViewer.class);
if (databaseObjectPropertyDescriptor == null)
return;
Class<?> propertyClass = databaseObjectPropertyDescriptor.getPropertyType();
Class<?> pec = databaseObjectPropertyDescriptor.getPropertyEditorClass();
if (editor != null) {
Control control = editor.getControl();
Display display = control.getDisplay();
final Shell shell = new Shell(control.getShell(), SWT.ON_TOP | SWT.TOOL | SWT.NO_FOCUS | SWT.APPLICATION_MODAL);
shell.setLocation(control.toDisplay(0, 0));
shell.setSize(control.getSize());
shell.setLayout(new FillLayout());
final Text text = new Text(shell, SWT.NONE);
final String[] newValue = new String[] { null };
String[] items = editor.getItems();
text.setText(items[items.length - 1]);
text.addTraverseListener(new TraverseListener() {
@Override
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_RETURN) {
newValue[0] = text.getText();
shell.close();
}
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
if (newValue[0] != null) {
value = newValue[0];
}
}
Object oriValue = value;
boolean changed;
do {
changed = false;
boolean wasSymbolError = databaseObject.isSymbolError();
value = databaseObject.compileProperty(propertyClass, propertyName, oriValue);
try {
oldValue = Engine.theApp.databaseObjectsManager.getCompiledValue(oldValue);
} catch (UndefinedSymbolsException e) {
oldValue = e.incompletValue();
}
Set<String> symbolsErrors = databaseObject.getSymbolsErrors(propertyName);
if (symbolsErrors != null) {
boolean[] res = ConvertigoPlugin.warningGlobalSymbols(databaseObject.getProject().getName(), databaseObject.getName(), databaseObject.getDatabaseType(), propertyName, "" + databaseObject.getCompilablePropertySourceValue(propertyName), symbolsErrors, false);
changed = res[0];
if (changed) {
Engine.theApp.databaseObjectsManager.symbolsCreateUndefined(symbolsErrors);
} else {
databaseObject.getProject().undefinedGlobalSymbols = true;
viewer.update(getProjectTreeObject(), null);
}
} else if (wasSymbolError) {
Engine.theApp.databaseObjectsManager.symbolsProjectCheckUndefined(databaseObject.getProject().getName());
viewer.update(getProjectTreeObject(), null);
}
} while (changed);
if (editor != null && value instanceof String) {
String[] items = editor.getItems();
int len = items.length - 1;
String strValue = (String) value;
value = 0;
for (int i = 0; i < len; i++) {
if (items[i].equals(strValue)) {
value = i;
break;
}
;
}
}
if (pec != null && propertyClass != int.class && propertyClass != Integer.class && value instanceof Integer) {
Object[] values = null;
try {
int index = (Integer) value;
if (PropertyWithTagsEditorAdvance.class.isAssignableFrom(pec)) {
Method getTags = pec.getMethod("getTags", new Class[] { DatabaseObjectTreeObject.class, String.class });
values = (String[]) getTags.invoke(null, new Object[] { this, propertyName });
value = values[index];
} else if (Enum.class.isAssignableFrom(pec)) {
values = (Enum[]) pec.getMethod("values").invoke(null);
value = index < values.length ? values[index] : values[0];
if (propertyClass == String.class) {
value = value.toString();
}
}
} catch (ArrayIndexOutOfBoundsException e) {
value = values.length > 0 ? values[0] : "";
String message = "Incorrect property \"" + propertyName + "\" value for the object \"" + databaseObject.getName() + "\".";
ConvertigoPlugin.logWarning(message);
}
}
if ((EmulatorTechnologyEditor.class.equals(pec))) {
Method getEmulatorClassNames = pec.getDeclaredMethod("getEmulatorClassNames", new Class[] { DatabaseObjectTreeObject.class });
String[] emulatorClassNames = (String[]) getEmulatorClassNames.invoke(null, new Object[] { this });
value = emulatorClassNames[((Integer) value).intValue()];
}
// Must rename bean when normalizedScreenClassName changed
if (databaseObject instanceof ScHandlerStatement) {
ScHandlerStatement scHandlerStatement = (ScHandlerStatement) databaseObject;
if (propertyName.equals("normalizedScreenClassName")) {
if (!this.rename("on" + (String) value + scHandlerStatement.getHandlerType(), Boolean.FALSE))
return;
}
} else // Must rename bean when handlerType changed
if ((databaseObject instanceof HandlerStatement) && !(databaseObject instanceof ScDefaultHandlerStatement)) {
// HandlerStatement handlerStatement = (HandlerStatement)databaseObject;
if (propertyName.equals("handlerType")) {
if (!this.rename("on" + (String) value, Boolean.FALSE))
return;
}
}
// Set property's nillable value
if (Boolean.TRUE.equals(databaseObjectPropertyDescriptor.getValue("nillable"))) {
try {
PropertyDescriptor pd = findPropertyDescriptor(propertyName);
if ((pd != null) && (pd instanceof DataOrNullPropertyDescriptor)) {
Boolean isNull = ((DataOrNullPropertyDescriptor) pd).isNullProperty();
((INillableProperty) databaseObject).setNullProperty(propertyName, isNull);
if (isNull) {
// Overrides fake editor value to real bean's one
if (value instanceof String)
value = "";
if (value instanceof XMLVector)
value = new XMLVector<Object>();
}
}
} catch (Exception e) {
String message = "Error while trying to set 'isNull' attribute of property \"" + propertyName + "\" for the object \"" + databaseObject.getName() + "\".";
ConvertigoPlugin.logException(e, message);
}
}
// Check XML name property value if needed
if (Boolean.TRUE.equals(databaseObjectPropertyDescriptor.getValue(DatabaseObject.PROPERTY_XMLNAME))) {
if (value instanceof String) {
String sValue = value.toString();
if (!XMLUtils.checkName(sValue)) {
String message = "The property \"" + propertyName + "\" value for the object \"" + databaseObject.getName() + "\" is not a valid XML name: " + sValue;
ConvertigoPlugin.logWarning(message);
return;
}
}
}
Method setter = databaseObjectPropertyDescriptor.getWriteMethod();
Object[] args = { value };
setter.invoke(databaseObject, args);
hasBeenModified(true);
// Set treeObject isEnabled attribute value (Fix #1129)
if (propertyName.equals("isEnabled") || propertyName.equals("isEnable")) {
setEnabled(value.equals(true));
}
viewer.update(this, null);
// update property view and display the new value for zone editor
if (pec != null) {
PropertySheet propertySheet = ConvertigoPlugin.getDefault().getPropertiesView();
if (propertySheet != null && pec.getName().contains("ZoneEditor")) {
Tree tree = (Tree) propertySheet.getCurrentPage().getControl();
TreeItem[] treeItems = tree.getSelection();
for (int i = 0; i < treeItems.length; i++) {
TreeItem treeItem = treeItems[i];
if (treeItem.getText().equals(databaseObjectPropertyDescriptor.getDisplayName())) {
PropertySheetEntry propEntry = (PropertySheetEntry) treeItem.getData();
propEntry.getEditor(tree).setValue(value);
propEntry.setValues(args);
}
}
tree.update();
}
}
Engine.logStudio.info("---------------------- SetPropertyValue started: " + propertyName + "----------------------");
if (mb != null) {
mb.prepareBatchBuild();
}
BatchOperationHelper.start();
TreeObjectEvent treeObjectEvent = new TreeObjectEvent(this, propertyName, oldValue, value);
ConvertigoPlugin.projectManager.getProjectExplorerView().fireTreeObjectPropertyChanged(treeObjectEvent);
BatchOperationHelper.stop();
} catch (Exception e) {
String message = "Error while trying to set property \"" + propertyName + "\" value for the object \"" + databaseObject.getName() + "\".";
ConvertigoPlugin.logException(e, message);
} finally {
BatchOperationHelper.cancel();
Engine.logStudio.info("---------------------- SetPropertyValue ended: " + propertyName + "----------------------");
isValueInProcess = false;
}
}
use of com.twinsoft.convertigo.eclipse.property_editors.DataOrNullPropertyDescriptor in project convertigo by convertigo.
the class DatabaseObjectTreeObject method getPropertyValue.
public Object getPropertyValue(Object id) {
if (id == null)
return null;
DatabaseObject databaseObject = getObject();
String propertyName = (String) id;
if (propertyName.equals(P_TYPE))
return databaseObjectBeanDescriptor.getDisplayName();
else if (propertyName.equals(P_JAVA_CLASS))
return databaseObject.getClass().getName();
else if (propertyName.equals(P_NAME))
return databaseObject.getName();
else if (propertyName.equals(P_QNAME))
return databaseObject.getQName();
else if (propertyName.equals(P_PRIORITY))
return Long.toString(databaseObject.priority);
else if (propertyName.equals(P_DEPTH)) {
if (databaseObject instanceof ScreenClass)
return Integer.toString(((ScreenClass) databaseObject).getDepth());
else
return org.apache.commons.lang3.StringUtils.countMatches(databaseObject.getQName(), '.');
} else if (propertyName.equals(P_EXPORTED)) {
return databaseObject.getProject().getInfoForProperty("exported");
} else if (propertyName.equals(P_MIN_VERSION)) {
return databaseObject.getProject().getMinVersion();
} else {
try {
java.beans.PropertyDescriptor databaseObjectPropertyDescriptor = getPropertyDescriptor(propertyName);
if (databaseObjectPropertyDescriptor == null) {
return null;
}
Class<?> pec = databaseObjectPropertyDescriptor.getPropertyEditorClass();
Method getter = databaseObjectPropertyDescriptor.getReadMethod();
Object compilablePropertySourceValue = databaseObject.getCompilablePropertySourceValue(propertyName);
Object value;
if (compilablePropertySourceValue == null) {
Object[] args = {};
value = getter.invoke(databaseObject, args);
} else {
value = compilablePropertySourceValue;
}
boolean done = false;
if (value instanceof String) {
PropertyDescriptor propertyDescriptor = findPropertyDescriptor(id);
if (propertyDescriptor instanceof DynamicComboBoxPropertyDescriptor) {
DynamicComboBoxPropertyDescriptor pd = (DynamicComboBoxPropertyDescriptor) propertyDescriptor;
value = pd.setValue((String) value);
done = true;
}
}
if (done) {
// do nothing
} else if (value instanceof Boolean) {
value = ((Boolean) value).booleanValue() ? Integer.valueOf(0) : Integer.valueOf(1);
} else if ((pec != null) && (PropertyWithTagsEditor.class.isAssignableFrom(pec) || Enum.class.isAssignableFrom(pec))) {
if (!(value instanceof Integer)) {
if (PropertyWithTagsEditorAdvance.class.isAssignableFrom(pec)) {
Method getTags = pec.getMethod("getTags", new Class[] { DatabaseObjectTreeObject.class, String.class });
String[] tags = (String[]) getTags.invoke(null, new Object[] { this, propertyName });
int i;
for (i = 0; i < tags.length; i++) {
if (tags[i].equals(value)) {
value = Integer.valueOf(i);
break;
}
}
// if we did not find our string in the tag list set value to index 0
if (i == tags.length) {
value = Integer.valueOf(0);
String message = "Incorrect property \"" + propertyName + "\" value for the object \"" + databaseObject.getName() + "\".";
ConvertigoPlugin.logWarning(message);
}
} else if (Enum.class.isAssignableFrom(pec)) {
value = Integer.valueOf(((Enum<?>) value).ordinal());
} else if (StringComboBoxPropertyDescriptor.class.isAssignableFrom(pec)) {
// nothing to do: value is a string
}
}
if ((EmulatorTechnologyEditor.class.equals(pec))) {
Method getEmulatorClassNames = pec.getDeclaredMethod("getEmulatorClassNames", new Class[] { DatabaseObjectTreeObject.class });
String[] emulatorClassNames = (String[]) getEmulatorClassNames.invoke(null, new Object[] { this });
for (int i = 0; i < emulatorClassNames.length; i++) {
if (emulatorClassNames[i].equals(value)) {
value = Integer.valueOf(i);
break;
}
}
}
// else simply return the combo index
} else if (value instanceof Number) {
value = ((Number) value).toString();
}
// Get property's nillable value
if (Boolean.TRUE.equals(databaseObjectPropertyDescriptor.getValue("nillable"))) {
try {
Boolean isNull = ((INillableProperty) databaseObject).isNullProperty(propertyName);
PropertyDescriptor pd = findPropertyDescriptor(propertyName);
if ((pd != null) && (pd instanceof DataOrNullPropertyDescriptor)) {
((DataOrNullPropertyDescriptor) pd).setNullProperty(isNull);
if (isNull) {
// Overrides value by fake one used by property editor
if (value instanceof String)
value = "<value is null>";
if (value instanceof XMLVector) {
XMLVector<Object> xmlv = new XMLVector<Object>();
xmlv.add("null");
value = xmlv;
}
}
}
} catch (Exception e) {
String message = "Error while trying to retrieve 'isNull' attribute of property \"" + propertyName + "\" for the object \"" + databaseObject.getName() + "\".";
ConvertigoPlugin.logException(e, message);
}
}
// Check for property normalized value if needed
if (Boolean.TRUE.equals(databaseObjectPropertyDescriptor.getValue(DatabaseObject.PROPERTY_XMLNAME))) {
// Ignore compilable property source value
if (compilablePropertySourceValue == null) {
if (value instanceof String) {
if (!XMLUtils.checkName(value.toString())) {
String message = "Property \"" + propertyName + "\" value for the object \"" + databaseObject.getName() + "\" isn't XML compliant.";
ConvertigoPlugin.logError(message, Boolean.TRUE);
}
}
}
}
return value;
} catch (Exception e) {
String message = "Error while trying to retrieve property \"" + propertyName + "\" value for the object \"" + databaseObject.getName() + "\".";
ConvertigoPlugin.logException(e, message);
return null;
}
}
}
Aggregations