Revise databinding code
  - Replace use of deprecated databinding APIs (untyped
    PojoProperties, untyped BeanProperties, untyped WidgetProperties,
    ViewerObservables, untyped ViewerProperties)
  - Add more nullable annotations
  - Rework code for better null analysis
  - Fix potential NPE
diff --git a/core/org.eclipse.statet.rj.services.core/srcEnv/org/eclipse/statet/rj/renv/core/RPkgType.java b/core/org.eclipse.statet.rj.services.core/srcEnv/org/eclipse/statet/rj/renv/core/RPkgType.java
index af1e02b..8a274cd 100644
--- a/core/org.eclipse.statet.rj.services.core/srcEnv/org/eclipse/statet/rj/renv/core/RPkgType.java
+++ b/core/org.eclipse.statet.rj.services.core/srcEnv/org/eclipse/statet/rj/renv/core/RPkgType.java
@@ -14,12 +14,15 @@
 
 package org.eclipse.statet.rj.renv.core;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 
 /**
  * Type ({@link #SOURCE source} or {@link #BINARY binary}) of R packages.
  * 
  * @since de.walware.rj.renv.core 2.0
  */
+@NonNullByDefault
 public enum RPkgType {
 	
 	
diff --git a/eclient/org.eclipse.statet.rj.eclient.graphics/META-INF/MANIFEST.MF b/eclient/org.eclipse.statet.rj.eclient.graphics/META-INF/MANIFEST.MF
index c465495..b225437 100644
--- a/eclient/org.eclipse.statet.rj.eclient.graphics/META-INF/MANIFEST.MF
+++ b/eclient/org.eclipse.statet.rj.eclient.graphics/META-INF/MANIFEST.MF
@@ -10,7 +10,7 @@
 Require-Bundle: org.eclipse.statet.rj.services.core;bundle-version="[4.1.0,4.2.0)",
  org.eclipse.statet.rj.client;bundle-version="[4.1.0,4.2.0)",
  org.eclipse.core.runtime;bundle-version="3.16.0",
- org.eclipse.core.databinding;bundle-version="1.7.0",
+ org.eclipse.statet.ecommons.databinding.core;bundle-version="[4.1.0,4.2.0)",
  org.eclipse.core.databinding.property,
  org.eclipse.ui;bundle-version="3.6.0",
  org.eclipse.jface.databinding,
diff --git a/eclient/org.eclipse.statet.rj.eclient.graphics/src/org/eclipse/statet/rj/eclient/graphics/RGraphicsPreferencePage.java b/eclient/org.eclipse.statet.rj.eclient.graphics/src/org/eclipse/statet/rj/eclient/graphics/RGraphicsPreferencePage.java
index b0b314f..bbad5ed 100644
--- a/eclient/org.eclipse.statet.rj.eclient.graphics/src/org/eclipse/statet/rj/eclient/graphics/RGraphicsPreferencePage.java
+++ b/eclient/org.eclipse.statet.rj.eclient.graphics/src/org/eclipse/statet/rj/eclient/graphics/RGraphicsPreferencePage.java
@@ -24,6 +24,7 @@
 import org.eclipse.core.databinding.UpdateValueStrategy;
 import org.eclipse.core.databinding.observable.Realm;
 import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.core.databinding.observable.value.IValueChangeListener;
 import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.databinding.observable.value.WritableValue;
 import org.eclipse.core.runtime.IStatus;
@@ -32,7 +33,7 @@
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
 import org.eclipse.core.runtime.preferences.IScopeContext;
 import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.databinding.swt.WidgetProperties;
+import org.eclipse.jface.databinding.swt.typed.WidgetProperties;
 import org.eclipse.jface.preference.PreferencePage;
 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.jface.viewers.ArrayContentProvider;
@@ -60,7 +61,9 @@
 import org.eclipse.ui.IWorkbenchPreferencePage;
 import org.eclipse.ui.statushandlers.StatusManager;
 
-import org.eclipse.statet.ecommons.databinding.DecimalValidator;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.ecommons.databinding.core.validation.DecimalValidator;
 import org.eclipse.statet.ecommons.ui.components.StatusInfo;
 import org.eclipse.statet.ecommons.ui.dialogs.DialogUtils;
 import org.eclipse.statet.ecommons.ui.util.LayoutUtils;
@@ -117,7 +120,7 @@
 		}
 		
 		@Override
-		public boolean equals(final Object obj) {
+		public boolean equals(final @Nullable Object obj) {
 			return (this == obj
 					|| (obj instanceof FontPref
 							&& this.prefKey.equals(((FontPref) obj).prefKey) ));
@@ -143,7 +146,7 @@
 		}
 		
 		@Override
-		public boolean equals(final Object obj) {
+		public boolean equals(final @Nullable Object obj) {
 			return (this == obj
 					|| (obj instanceof Encoding
 							&& this.prefValue.equals(((Encoding) obj).prefValue) ));
@@ -390,12 +393,15 @@
 		this.dbc= new DataBindingContext(realm);
 		addBindings(this.dbc, realm);
 		
-		final AggregateValidationStatus validationStatus= new AggregateValidationStatus(this.dbc, AggregateValidationStatus.MAX_SEVERITY);
-		validationStatus.addValueChangeListener(
-				(final ValueChangeEvent<? extends IStatus> event) -> {
-					final IStatus currentStatus= event.diff.getNewValue();
-					updateStatus(currentStatus);
-				} );
+		final AggregateValidationStatus validationStatus= new AggregateValidationStatus(this.dbc,
+				AggregateValidationStatus.MAX_SEVERITY );
+		validationStatus.addValueChangeListener(new IValueChangeListener<IStatus>() {
+			@Override
+			public void handleValueChange(final ValueChangeEvent<? extends IStatus> event) {
+				final IStatus currentStatus= event.diff.getNewValue();
+				updateStatus(currentStatus);
+			}
+		});
 	}
 	
 	protected void addBindings(final DataBindingContext dbc, final Realm realm) {
@@ -403,30 +409,38 @@
 		this.customVDpiVisibleValue= new WritableValue<>(realm, 96.0, Double.class);
 		
 		dbc.bindValue(
-				WidgetProperties.text(SWT.Modify).observe(this.customHDpiControl),
+				WidgetProperties.text(SWT.Modify)
+						.observe(this.customHDpiControl),
 				this.customHDpiVisibleValue,
-				new UpdateValueStrategy().setAfterGetValidator(new DecimalValidator(10.0, 10000.0,
-						"The value for Horizontal (x) DPI is invalid (10-10000)." )),
+				new UpdateValueStrategy<String, Double>()
+						.setAfterGetValidator(new DecimalValidator(10.0, 10000.0,
+								"The value for Horizontal (x) DPI is invalid (10-10000)." )),
 				null );
 		dbc.bindValue(
-				WidgetProperties.text(SWT.Modify).observe(this.customVDpiControl),
+				WidgetProperties.text(SWT.Modify)
+						.observe(this.customVDpiControl),
 				this.customVDpiVisibleValue,
-				new UpdateValueStrategy().setAfterGetValidator(new DecimalValidator(10.0, 10000.0,
-						"The value for Vertical (x) DPI is invalid (10-10000)." )),
+				new UpdateValueStrategy<String, Double>()
+						.setAfterGetValidator(new DecimalValidator(10.0, 10000.0,
+								"The value for Vertical (x) DPI is invalid (10-10000)." )),
 				null );
 		
-		this.customHDpiVisibleValue.addValueChangeListener(
-				(final ValueChangeEvent<? extends Double> event) -> {
-					if (RGraphicsPreferencePage.this.customEnabled) {
-						RGraphicsPreferencePage.this.customHDpiUserValue= RGraphicsPreferencePage.this.customHDpiVisibleValue.getValue();
-					}
-				} );
-		this.customVDpiVisibleValue.addValueChangeListener(
-				(final ValueChangeEvent<? extends Double> event) -> {
-					if (RGraphicsPreferencePage.this.customEnabled) {
-						RGraphicsPreferencePage.this.customVDpiUserValue= RGraphicsPreferencePage.this.customVDpiVisibleValue.getValue();
-					}
-				} );
+		this.customHDpiVisibleValue.addValueChangeListener(new IValueChangeListener<Double>() {
+			@Override
+			public void handleValueChange(final ValueChangeEvent<? extends Double> event) {
+				if (RGraphicsPreferencePage.this.customEnabled) {
+					RGraphicsPreferencePage.this.customHDpiUserValue= RGraphicsPreferencePage.this.customHDpiVisibleValue.getValue();
+				}
+			}
+		});
+		this.customVDpiVisibleValue.addValueChangeListener(new IValueChangeListener<Double>() {
+			@Override
+			public void handleValueChange(final ValueChangeEvent<? extends Double> event) {
+				if (RGraphicsPreferencePage.this.customEnabled) {
+					RGraphicsPreferencePage.this.customVDpiUserValue= RGraphicsPreferencePage.this.customVDpiVisibleValue.getValue();
+				}
+			}
+		});
 	}
 	
 	protected void updateStatus(final IStatus status) {