From 1fe5c2d851034c749ae45f44db3545ecb6b911e8 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Fri, 3 Apr 2009 16:26:13 +0400 Subject: [PATCH] Control binding with annotations --- .../openapi/options/binding/BindControl.java | 15 +++++++++++++++ .../options/binding/BindableConfigurable.java | 14 ++++++++++++++ .../openapi/options/binding/ControlBinder.java | 21 +++++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 platform-impl/src/com/intellij/openapi/options/binding/BindControl.java diff --git a/platform-impl/src/com/intellij/openapi/options/binding/BindControl.java b/platform-impl/src/com/intellij/openapi/options/binding/BindControl.java new file mode 100644 index 0000000000..d9df78463d --- /dev/null +++ b/platform-impl/src/com/intellij/openapi/options/binding/BindControl.java @@ -0,0 +1,15 @@ +package com.intellij.openapi.options.binding; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author Dmitry Avdeev + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface BindControl { + String value() default ""; +} diff --git a/platform-impl/src/com/intellij/openapi/options/binding/BindableConfigurable.java b/platform-impl/src/com/intellij/openapi/options/binding/BindableConfigurable.java index 476ac4bf8a..5f225138c3 100644 --- a/platform-impl/src/com/intellij/openapi/options/binding/BindableConfigurable.java +++ b/platform-impl/src/com/intellij/openapi/options/binding/BindableConfigurable.java @@ -19,6 +19,8 @@ package com.intellij.openapi.options.binding; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.UnnamedConfigurable; +import javax.swing.*; + /** * @author Dmitry Avdeev */ @@ -29,6 +31,18 @@ public abstract class BindableConfigurable implements UnnamedConfigurable { protected BindableConfigurable(ControlBinder binder) { myBinder = binder; } + + protected void bindAnnotations() { + myBinder.bindAnnotations(this); + } + + protected void bindControl(JComponent control, String propertyName) { + myBinder.bindControl(control, propertyName); + } + + protected void bindControl(ValueAccessor controlAccessor, String propertyName) { + myBinder.bindControl(controlAccessor, propertyName); + } public boolean isModified() { return myBinder.isModified(); diff --git a/platform-impl/src/com/intellij/openapi/options/binding/ControlBinder.java b/platform-impl/src/com/intellij/openapi/options/binding/ControlBinder.java index c9935c04b3..4bc13a339b 100644 --- a/platform-impl/src/com/intellij/openapi/options/binding/ControlBinder.java +++ b/platform-impl/src/com/intellij/openapi/options/binding/ControlBinder.java @@ -22,6 +22,7 @@ import com.intellij.openapi.util.Pair; import javax.swing.*; import java.util.ArrayList; import java.util.List; +import java.lang.reflect.Field; /** * @author Dmitry Avdeev @@ -117,4 +118,24 @@ public class ControlBinder { } return value; } + + public void bindAnnotations(Object form) { + Field[] fields = form.getClass().getDeclaredFields(); + for (Field field : fields) { + BindControl annotation = field.getAnnotation(BindControl.class); + if (annotation != null) { + String name = annotation.value(); + if (name.length() == 0) { + name = field.getName(); + } + try { + field.setAccessible(true); + bindControl((JComponent)field.get(form), name); + } + catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + } + } } -- 2.11.4.GIT