Fixed - bug 273244: [Theming] Link foreground color cannot be modified using theme variants
https://bugs.eclipse.org/bugs/show_bug.cgi?id=273244
diff --git a/bundles/org.eclipse.rap.rwt.q07/js/org/eclipse/swt/LinkUtil.js b/bundles/org.eclipse.rap.rwt.q07/js/org/eclipse/swt/LinkUtil.js
index b858d8e..fbe4c9b 100644
--- a/bundles/org.eclipse.rap.rwt.q07/js/org/eclipse/swt/LinkUtil.js
+++ b/bundles/org.eclipse.rap.rwt.q07/js/org/eclipse/swt/LinkUtil.js
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2008 Innoopract Informationssysteme GmbH.
+ * Copyright (c) 2002, 2009 Innoopract Informationssysteme GmbH.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -50,6 +50,30 @@
         }
       }
     },
+    
+    addState : function( widget, state ) {
+      if( widget ) {
+        if( state.substr( 0, 8 ) == "variant_" ) {
+          widget.addState( state );
+          var children = widget.getChildren();
+          for( var i = 0; i < children.length; i++ ) {
+            children[ i ].addState( state );
+          }
+        }
+      }
+    },
+
+    removeState : function( widget, state ) {
+      if( widget ) {
+        if( state.substr( 0, 8 ) == "variant_" ) {
+          widget.removeState( state );
+          var children = widget.getChildren();
+          for( var i = 0; i < children.length; i++ ) {
+            children[ i ].removeState( state );
+          }
+        }
+      }
+    },
 
     setSelectionListener : function( widget, value ) {
       widget.setUserData( "widgetSelectedListener", value );
diff --git a/bundles/org.eclipse.rap.rwt.q07/src/org/eclipse/swt/internal/widgets/linkkit/LinkLCA.java b/bundles/org.eclipse.rap.rwt.q07/src/org/eclipse/swt/internal/widgets/linkkit/LinkLCA.java
index 5eab067..a8429a7 100644
--- a/bundles/org.eclipse.rap.rwt.q07/src/org/eclipse/swt/internal/widgets/linkkit/LinkLCA.java
+++ b/bundles/org.eclipse.rap.rwt.q07/src/org/eclipse/swt/internal/widgets/linkkit/LinkLCA.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2008 Innoopract Informationssysteme GmbH.
+ * Copyright (c) 2002, 2009 Innoopract Informationssysteme GmbH.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -36,12 +36,16 @@
   private static final String JS_FUNC_INIT = JS_LINK_UTIL + ".init";
   private static final String JS_FUNC_ADD_LINK = JS_LINK_UTIL + ".addLink";
   private static final String JS_FUNC_ADD_TEXT = JS_LINK_UTIL + ".addText";
+  private static final String JS_FUNC_ADD_STATE = JS_LINK_UTIL + ".addState";
+  private static final String JS_FUNC_REMOVE_STATE
+    = JS_LINK_UTIL + ".removeState";
   private static final String JS_FUNC_CLEAR = JS_LINK_UTIL + ".clear";
   private static final String JS_FUNC_DESTROY = JS_LINK_UTIL + ".destroy";
   private static final String JS_FUNC_SET_SELECTION_LISTENER
     = JS_LINK_UTIL + ".setSelectionListener";
 
   private static final String PROP_TEXT = "text";
+  private static final String PROP_VARIANT = "variant";
   static final String PROP_SEL_LISTENER = "selectionListener";
 
   public void preserveValues( final Widget widget ) {
@@ -75,7 +79,7 @@
     ControlLCAUtil.writeChanges( link );
     writeSelectionListener( link );
     writeText( link );
-    WidgetLCAUtil.writeCustomVariant( link );
+    writeCustomVariant( link );
   }
 
   public void renderDispose( final Widget widget ) throws IOException {
@@ -189,4 +193,23 @@
       }
     }
   }
+
+  private static void writeCustomVariant( final Link link )
+    throws IOException
+  {
+    IWidgetAdapter adapter = WidgetUtil.getAdapter( link );
+    String oldValue = ( String )adapter.getPreserved( PROP_VARIANT );
+    String newValue = WidgetUtil.getVariant( link );
+    if( WidgetLCAUtil.hasChanged( link, PROP_VARIANT, newValue, null ) ) {
+      JSWriter writer = JSWriter.getWriterFor( link );
+      Object[] args = new Object[] { link, "variant_" + oldValue };
+      if( oldValue != null ) {
+        writer.callStatic( JS_FUNC_REMOVE_STATE, args );
+      }
+      if( newValue != null ) {
+        args = new Object[] { link, "variant_" + newValue };
+        writer.callStatic( JS_FUNC_ADD_STATE, args );
+      }
+    }
+  }
 }