In progress: [ Issue 43 ] Allow code generation in multiple languages simultaneously
https://code.google.com/p/protobuf-dt/issues/detail?id=43

Working on "Compiler" preference page.
diff --git a/com.google.eclipse.protobuf.ui/icons/checked.gif b/com.google.eclipse.protobuf.ui/icons/checked.gif
new file mode 100644
index 0000000..b90c36b
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/icons/checked.gif
Binary files differ
diff --git a/com.google.eclipse.protobuf.ui/icons/unchecked.gif b/com.google.eclipse.protobuf.ui/icons/unchecked.gif
new file mode 100644
index 0000000..7ed00d7
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/icons/unchecked.gif
Binary files differ
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferencePage.java
index ed7a6c0..7c73fab 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferencePage.java
@@ -22,6 +22,7 @@
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.*;
+import org.eclipse.xtext.ui.PluginImageHelper;
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
 import com.google.eclipse.protobuf.ui.preferences.PreferenceAndPropertyPage;
@@ -52,6 +53,7 @@
   private Button btnRefreshProject;
   private Button btnRefreshOutputFolder;
 
+  @Inject private PluginImageHelper imageHelper;
   @Inject private DirectoryNameValidator directoryNameValidator;
   @Inject private EventListeners eventListeners;
   private TargetLanguageOutputDirectoryEditor targetLanguageOutputDirectoryEditor;
@@ -101,7 +103,7 @@
     new Label(grpCompilerLocation, SWT.NONE);
     new Label(grpCompilerLocation, SWT.NONE);
 
-    targetLanguageOutputDirectoryEditor = new TargetLanguageOutputDirectoryEditor(cmpMain);
+    targetLanguageOutputDirectoryEditor = new TargetLanguageOutputDirectoryEditor(cmpMain, imageHelper);
     targetLanguageOutputDirectoryEditor.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
 
     tbtmRefresh = new TabItem(tabFolder, SWT.NONE);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguage.java
index 38137d6..430357d 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguage.java
@@ -17,11 +17,13 @@
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public enum TargetLanguage {
+public class TargetLanguage {
 
-  JAVA("Java"), CPP("C++"), PYTHON("Python");
+  public static final TargetLanguage JAVA = new TargetLanguage("Java");
+  public static final TargetLanguage CPP = new TargetLanguage("C++");
+  public static final TargetLanguage PYTHON = new TargetLanguage("Python");
 
-  private String name;
+  private final String name;
 
   private TargetLanguage(String name) {
     this.name = name;
@@ -31,7 +33,7 @@
    * Returns this language's name.
    * @return this language's name.
    */
-  public String languageName() {
+  public String name() {
     return name;
   }
 
@@ -43,4 +45,9 @@
     if (store.getBoolean(GENERATE_PYTHON_CODE)) return PYTHON;
     return JAVA;
   }
+
+  // TODO remove
+  public static TargetLanguage[] values() {
+    return new TargetLanguage[] { JAVA, CPP, PYTHON };
+  }
 }
\ No newline at end of file
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguageIsEnabledEditor.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguageIsEnabledEditor.java
index 5a318b7..979fb8f 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguageIsEnabledEditor.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguageIsEnabledEditor.java
@@ -18,8 +18,11 @@
  */
 class TargetLanguageIsEnabledEditor extends EditingSupport {
 
+  private final ColumnViewer viewer;
+
   TargetLanguageIsEnabledEditor(ColumnViewer viewer) {
     super(viewer);
+    this.viewer = viewer;
   }
 
   @Override protected CellEditor getCellEditor(Object element) {
@@ -36,5 +39,6 @@
 
   @Override protected void setValue(Object element, Object value) {
     ((TargetLanguagePreference)element).enabled((Boolean)value);
+    viewer.refresh();
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguageOutputDirectoryEditor.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguageOutputDirectoryEditor.java
index 477d110..d5b8a19 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguageOutputDirectoryEditor.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguageOutputDirectoryEditor.java
@@ -8,11 +8,15 @@
  */
 package com.google.eclipse.protobuf.ui.preferences.compiler;
 
+import static com.google.eclipse.protobuf.ui.preferences.compiler.TargetLanguage.*;
+
 import org.eclipse.jface.viewers.*;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.*;
+import org.eclipse.xtext.ui.PluginImageHelper;
 
 /**
  * Editor where users can specify which are the target languages for protoc and the location of the output folders for
@@ -21,36 +25,48 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 public class TargetLanguageOutputDirectoryEditor extends Composite {
-  private Table table;
 
-  /**
-   * Creates a new </code>{@link TargetLanguageOutputDirectoryEditor}</code>.
-   * @param parent a widget which will be the parent of the new instance (cannot be {@code null}.)
-   */
-  public TargetLanguageOutputDirectoryEditor(Composite parent) {
+  public TargetLanguageOutputDirectoryEditor(Composite parent, final PluginImageHelper imageHelper) {
     super(parent, SWT.NONE);
     setLayout(new GridLayout(1, false));
 
     TableViewer tableViewer = new TableViewer(this, SWT.BORDER | SWT.FULL_SELECTION);
 
-    table = tableViewer.getTable();
+    Table table = tableViewer.getTable();
     table.setHeaderVisible(true);
     table.setLinesVisible(true);
     table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
 
+    TableViewerColumn tblclmnVwrEnabled = new TableViewerColumn(tableViewer, SWT.NONE);
+    TableColumn tblclmnEnabled = tblclmnVwrEnabled.getColumn();
+    tblclmnEnabled.setResizable(false);
+    tblclmnEnabled.setWidth(27);
+    tblclmnVwrEnabled.setLabelProvider(new ColumnLabelProvider() {
+      @Override public String getText(Object element) {
+        return "";
+      }
+
+      @Override public Image getImage(Object element) {
+        boolean enabled = ((TargetLanguagePreference)element).isEnabled();
+        return imageHelper.getImage(enabled ? "checked.gif" : "unchecked.gif");
+      }
+    });
+    tblclmnVwrEnabled.setEditingSupport(new TargetLanguageIsEnabledEditor(tableViewer));
+
     TableViewerColumn tblclmnVwrLanguage = new TableViewerColumn(tableViewer, SWT.NONE);
     TableColumn tblclmnLanguage = tblclmnVwrLanguage.getColumn();
+    tblclmnLanguage.setResizable(false);
     tblclmnLanguage.setWidth(100);
     tblclmnLanguage.setText("Language");
     tblclmnVwrLanguage.setLabelProvider(new ColumnLabelProvider() {
       @Override public String getText(Object element) {
-        return ((TargetLanguagePreference)element).language();
+        return ((TargetLanguagePreference)element).language().name();
       }
     });
-    tblclmnVwrLanguage.setEditingSupport(new TargetLanguageIsEnabledEditor(tableViewer));
 
     TableViewerColumn tblclmnVwrOutputDirectory = new TableViewerColumn(tableViewer, SWT.NONE);
     TableColumn tblclmnOutputDirectory = tblclmnVwrOutputDirectory.getColumn();
+    tblclmnOutputDirectory.setResizable(false);
     tblclmnOutputDirectory.setWidth(100);
     tblclmnOutputDirectory.setText("Output Directory");
     tblclmnVwrOutputDirectory.setLabelProvider(new ColumnLabelProvider() {
@@ -65,9 +81,9 @@
 
   private TargetLanguagePreference[] languages() {
     TargetLanguagePreference[] languages = new TargetLanguagePreference[3];
-    languages[1] = new TargetLanguagePreference(TargetLanguage.JAVA, "", true);
-    languages[0] = new TargetLanguagePreference(TargetLanguage.CPP, "", true);
-    languages[2] = new TargetLanguagePreference(TargetLanguage.PYTHON, "", true);
+    languages[0] = new TargetLanguagePreference(JAVA, "", true);
+    languages[1] = new TargetLanguagePreference(CPP, "", true);
+    languages[2] = new TargetLanguagePreference(PYTHON, "", true);
     return languages;
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguagePreference.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguagePreference.java
index 4d20757..1af0818 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguagePreference.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/TargetLanguagePreference.java
@@ -27,11 +27,11 @@
   }
 
   /**
-   * Returns the name of the language.
-   * @return the name of the language.
+   * Returns the language.
+   * @return the language.
    */
-  public String language() {
-    return language.languageName();
+  public TargetLanguage language() {
+    return language;
   }
 
   /**