1515 */
1616package org .androidannotations .holder ;
1717
18- import com .sun .codemodel .*;
18+ import static com .sun .codemodel .JExpr ._new ;
19+ import static com .sun .codemodel .JExpr ._null ;
20+ import static com .sun .codemodel .JExpr ._this ;
21+ import static com .sun .codemodel .JExpr .cast ;
22+ import static com .sun .codemodel .JExpr .invoke ;
23+ import static com .sun .codemodel .JMod .FINAL ;
24+ import static com .sun .codemodel .JMod .PRIVATE ;
25+ import static com .sun .codemodel .JMod .PUBLIC ;
26+
27+ import java .util .HashMap ;
28+ import java .util .Map ;
29+
30+ import javax .lang .model .element .TypeElement ;
31+ import javax .lang .model .type .TypeMirror ;
32+
1933import org .androidannotations .api .view .HasViews ;
2034import org .androidannotations .api .view .OnViewChangedListener ;
2135import org .androidannotations .api .view .OnViewChangedNotifier ;
2236import org .androidannotations .helper .ViewNotifierHelper ;
2337import org .androidannotations .process .ProcessHolder ;
2438
25- import javax .lang .model .element .TypeElement ;
26- import javax .lang .model .type .TypeMirror ;
27- import java .util .HashMap ;
28- import java .util .Map ;
29-
30- import static com .sun .codemodel .JExpr .*;
31- import static com .sun .codemodel .JMod .*;
39+ import com .sun .codemodel .JBlock ;
40+ import com .sun .codemodel .JClass ;
41+ import com .sun .codemodel .JDefinedClass ;
42+ import com .sun .codemodel .JExpr ;
43+ import com .sun .codemodel .JExpression ;
44+ import com .sun .codemodel .JFieldRef ;
45+ import com .sun .codemodel .JInvocation ;
46+ import com .sun .codemodel .JMethod ;
47+ import com .sun .codemodel .JVar ;
3248
3349public abstract class EComponentWithViewSupportHolder extends EComponentHolder {
3450
3551 protected ViewNotifierHelper viewNotifierHelper ;
3652 private JBlock onViewChangedBody ;
3753 private JBlock onViewChangedBodyBeforeFindViews ;
3854 private JVar onViewChangedHasViewsParam ;
39- private Map <String , FoundViewHolder > foundViewsHolders = new HashMap <String , FoundViewHolder >();
55+ private Map <String , FoundHolder > foundHolders = new HashMap <String , FoundHolder >();
4056 protected JMethod findNativeFragmentById ;
4157 protected JMethod findSupportFragmentById ;
4258 protected JMethod findNativeFragmentByTag ;
4359 protected JMethod findSupportFragmentByTag ;
4460 private HashMap <String , TextWatcherHolder > textWatcherHolders = new HashMap <String , TextWatcherHolder >();
4561 private HashMap <String , OnSeekBarChangeListenerHolder > onSeekBarChangeListenerHolders = new HashMap <String , OnSeekBarChangeListenerHolder >();
62+ private EComponentWithPreferenceSupportHolder preferenceSupportHolder ;
4663
4764 public EComponentWithViewSupportHolder (ProcessHolder processHolder , TypeElement annotatedElement ) throws Exception {
4865 super (processHolder , annotatedElement );
@@ -89,30 +106,30 @@ public JInvocation findViewById(JFieldRef idRef) {
89106
90107 public void assignFindViewById (JFieldRef idRef , JClass viewClass , JFieldRef fieldRef ) {
91108 String idRefString = codeModelHelper .getIdStringFromIdFieldRef (idRef );
92- FoundViewHolder foundViewHolder = foundViewsHolders .get (idRefString );
109+ FoundViewHolder foundViewHolder = ( FoundViewHolder ) foundHolders .get (idRefString );
93110
94111 JBlock block = getOnViewChangedBody ();
95112 JExpression assignExpression ;
96113
97114 if (foundViewHolder != null ) {
98- assignExpression = foundViewHolder .getView (viewClass );
115+ assignExpression = foundViewHolder .getOrCastRef (viewClass );
99116 } else {
100117 assignExpression = findViewById (idRef );
101118 if (viewClass != null && viewClass != classes ().VIEW ) {
102119 assignExpression = cast (viewClass , assignExpression );
103120 }
104- foundViewsHolders .put (idRefString , new FoundViewHolder (this , viewClass , fieldRef , block ));
121+ foundHolders .put (idRefString , new FoundViewHolder (this , viewClass , fieldRef , block ));
105122 }
106123
107124 block .assign (fieldRef , assignExpression );
108125 }
109126
110127 public FoundViewHolder getFoundViewHolder (JFieldRef idRef , JClass viewClass ) {
111128 String idRefString = codeModelHelper .getIdStringFromIdFieldRef (idRef );
112- FoundViewHolder foundViewHolder = foundViewsHolders .get (idRefString );
129+ FoundViewHolder foundViewHolder = ( FoundViewHolder ) foundHolders .get (idRefString );
113130 if (foundViewHolder == null ) {
114131 foundViewHolder = createFoundViewAndIfNotNullBlock (idRef , viewClass );
115- foundViewsHolders .put (idRefString , foundViewHolder );
132+ foundHolders .put (idRefString , foundViewHolder );
116133 }
117134 return foundViewHolder ;
118135 }
@@ -131,6 +148,57 @@ protected FoundViewHolder createFoundViewAndIfNotNullBlock(JFieldRef idRef, JCla
131148 return new FoundViewHolder (this , viewClass , view , block );
132149 }
133150
151+ public JInvocation findPreferenceByKey (JFieldRef idRef ) {
152+ JInvocation getString = invoke (_this (), "getString" ).arg (idRef );
153+ JInvocation findPreferenceByKey = invoke (_this (), "findPreference" );
154+ findPreferenceByKey .arg (getString );
155+ return findPreferenceByKey ;
156+ }
157+
158+ public void assignFindPreferenceByKey (JFieldRef idRef , JClass preferenceClass , JFieldRef fieldRef ) {
159+ String idRefString = codeModelHelper .getIdStringFromIdFieldRef (idRef );
160+ FoundPreferenceHolder foundViewHolder = (FoundPreferenceHolder ) foundHolders .get (idRefString );
161+
162+ JBlock block = getPreferenceSupportHolder ().getAddPreferencesFromResourceBlock ();
163+ JExpression assignExpression ;
164+
165+ if (foundViewHolder != null ) {
166+ assignExpression = foundViewHolder .getOrCastRef (preferenceClass );
167+ } else {
168+ assignExpression = findPreferenceByKey (idRef );
169+ if (preferenceClass != null && preferenceClass != classes ().PREFERENCE ) {
170+ assignExpression = cast (preferenceClass , assignExpression );
171+ }
172+ foundHolders .put (idRefString , new FoundPreferenceHolder (this , preferenceClass , fieldRef , block ));
173+ }
174+
175+ block .assign (fieldRef , assignExpression );
176+ }
177+
178+ public FoundPreferenceHolder getFoundPreferenceHolder (JFieldRef idRef , JClass preferenceClass ) {
179+ String idRefString = codeModelHelper .getIdStringFromIdFieldRef (idRef );
180+ FoundPreferenceHolder foundPreferenceHolder = (FoundPreferenceHolder ) foundHolders .get (idRefString );
181+ if (foundPreferenceHolder == null ) {
182+ foundPreferenceHolder = createFoundPreferenceAndIfNotNullBlock (idRef , preferenceClass );
183+ foundHolders .put (idRefString , foundPreferenceHolder );
184+ }
185+ return foundPreferenceHolder ;
186+ }
187+
188+ protected FoundPreferenceHolder createFoundPreferenceAndIfNotNullBlock (JFieldRef idRef , JClass preferenceClass ) {
189+ JExpression findPreferenceExpression = findPreferenceByKey (idRef );
190+ JBlock block = getPreferenceSupportHolder ().getAddPreferencesFromResourceBlock ();
191+
192+ if (preferenceClass == null ) {
193+ preferenceClass = classes ().PREFERENCE ;
194+ } else if (preferenceClass != classes ().PREFERENCE ) {
195+ findPreferenceExpression = cast (preferenceClass , findPreferenceExpression );
196+ }
197+
198+ JVar preference = block .decl (preferenceClass , "preference" , findPreferenceExpression );
199+ return new FoundPreferenceHolder (this , preferenceClass , preference , block );
200+ }
201+
134202 public JMethod getFindNativeFragmentById () {
135203 if (findNativeFragmentById == null ) {
136204 setFindNativeFragmentById ();
@@ -257,4 +325,19 @@ private OnSeekBarChangeListenerHolder createOnSeekBarChangeListenerHolder(JField
257325
258326 return new OnSeekBarChangeListenerHolder (this , onSeekbarChangeListenerClass );
259327 }
328+
329+ public EComponentWithPreferenceSupportHolder getPreferenceSupportHolder () {
330+ if (preferenceSupportHolder == null ) {
331+ preferenceSupportHolder = new EComponentWithPreferenceSupportHolder (this );
332+ }
333+ return preferenceSupportHolder ;
334+ }
335+
336+ public void setAddPreferencesFromResource () {
337+ JMethod method = generatedClass .method (PUBLIC , codeModel ().VOID , "addPreferencesFromResource" );
338+ method .annotate (Override .class );
339+ JVar preferencesResIdParam = method .param (int .class , "preferencesResId" );
340+ method .body ().invoke (JExpr ._super (), "addPreferencesFromResource" ).arg (preferencesResIdParam );
341+ getPreferenceSupportHolder ().addPreferencesFromResourceBlock = method .body ();
342+ }
260343}
0 commit comments