private void handleSyntaxColorListSelection() {
   HighlightingColorListItem item = getHighlightingColorListItem();
   if (item == null) {
     fEnableCheckbox.setEnabled(false);
     fSyntaxForegroundColorEditor.getButton().setEnabled(false);
     fColorEditorLabel.setEnabled(false);
     fBoldCheckBox.setEnabled(false);
     fItalicCheckBox.setEnabled(false);
     fStrikethroughCheckBox.setEnabled(false);
     fUnderlineCheckBox.setEnabled(false);
     return;
   }
   RGB rgb = PreferenceConverter.getColor(getPreferenceStore(), item.getColorKey());
   fSyntaxForegroundColorEditor.setColorValue(rgb);
   fBoldCheckBox.setSelection(getPreferenceStore().getBoolean(item.getBoldKey()));
   fItalicCheckBox.setSelection(getPreferenceStore().getBoolean(item.getItalicKey()));
   fStrikethroughCheckBox.setSelection(
       getPreferenceStore().getBoolean(item.getStrikethroughKey()));
   fUnderlineCheckBox.setSelection(getPreferenceStore().getBoolean(item.getUnderlineKey()));
   if (item instanceof SemanticHighlightingColorListItem) {
     boolean semanticHighlightingEnabled =
         getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED);
     fEnableCheckbox.setEnabled(semanticHighlightingEnabled);
     boolean enable =
         semanticHighlightingEnabled
             && getPreferenceStore()
                 .getBoolean(((SemanticHighlightingColorListItem) item).getEnableKey());
     fEnableCheckbox.setSelection(enable);
     fSyntaxForegroundColorEditor.getButton().setEnabled(enable);
     fColorEditorLabel.setEnabled(enable);
     fBoldCheckBox.setEnabled(enable);
     fItalicCheckBox.setEnabled(enable);
     fStrikethroughCheckBox.setEnabled(enable);
     fUnderlineCheckBox.setEnabled(enable);
   } else {
     fSyntaxForegroundColorEditor.getButton().setEnabled(true);
     fColorEditorLabel.setEnabled(true);
     fBoldCheckBox.setEnabled(true);
     fItalicCheckBox.setEnabled(true);
     fStrikethroughCheckBox.setEnabled(true);
     fUnderlineCheckBox.setEnabled(true);
     fEnableCheckbox.setEnabled(false);
     fEnableCheckbox.setSelection(true);
   }
 }
  private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
    List<OverlayPreferenceStore.OverlayKey> overlayKeys =
        new ArrayList<OverlayPreferenceStore.OverlayKey>();

    overlayKeys.add(
        new OverlayPreferenceStore.OverlayKey(
            OverlayPreferenceStore.BOOLEAN,
            PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED));

    for (int i = 0, n = fListModel.size(); i < n; i++) {
      HighlightingColorListItem item = fListModel.get(i);
      overlayKeys.add(
          new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, item.getColorKey()));
      overlayKeys.add(
          new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, item.getBoldKey()));
      overlayKeys.add(
          new OverlayPreferenceStore.OverlayKey(
              OverlayPreferenceStore.BOOLEAN, item.getItalicKey()));
      overlayKeys.add(
          new OverlayPreferenceStore.OverlayKey(
              OverlayPreferenceStore.BOOLEAN, item.getStrikethroughKey()));
      overlayKeys.add(
          new OverlayPreferenceStore.OverlayKey(
              OverlayPreferenceStore.BOOLEAN, item.getUnderlineKey()));

      if (item instanceof SemanticHighlightingColorListItem)
        overlayKeys.add(
            new OverlayPreferenceStore.OverlayKey(
                OverlayPreferenceStore.BOOLEAN,
                ((SemanticHighlightingColorListItem) item).getEnableKey()));
    }

    OverlayPreferenceStore.OverlayKey[] keys =
        new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
    overlayKeys.toArray(keys);
    return keys;
  }
  private Control createSyntaxPage(final Composite parent) {

    Composite colorComposite = new Composite(parent, SWT.NONE);
    GridLayout layout = new GridLayout();
    layout.marginHeight = 0;
    layout.marginWidth = 0;
    colorComposite.setLayout(layout);

    Link link = new Link(colorComposite, SWT.NONE);
    link.setText(PreferencesMessages.CEditorColoringConfigurationBlock_link);
    link.addSelectionListener(
        new SelectionAdapter() {
          @Override
          public void widgetSelected(SelectionEvent e) {
            PreferencesUtil.createPreferenceDialogOn(parent.getShell(), e.text, null, null);
          }
        });
    // TODO replace by link-specific tooltips when
    // bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=88866 gets fixed
    //		link.setToolTipText(PreferencesMessages.CEditorColoringConfigurationBlock_link_tooltip);

    GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
    gridData.widthHint = 150; // only expand further if anyone else requires it
    gridData.horizontalSpan = 2;
    link.setLayoutData(gridData);

    addFiller(colorComposite, 1);

    fEnableSemanticHighlightingCheckbox =
        addCheckBox(
            colorComposite,
            PreferencesMessages.CEditorColoringConfigurationBlock_enable_semantic_highlighting,
            PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED,
            0);

    Label label;
    label = new Label(colorComposite, SWT.LEFT);
    label.setText(PreferencesMessages.CEditorColoringConfigurationBlock_coloring_element);
    label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    Composite editorComposite = new Composite(colorComposite, SWT.NONE);
    layout = new GridLayout();
    layout.numColumns = 2;
    layout.marginHeight = 0;
    layout.marginWidth = 0;
    editorComposite.setLayout(layout);
    GridData gd = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
    editorComposite.setLayoutData(gd);

    fListViewer = new TreeViewer(editorComposite, SWT.SINGLE | SWT.BORDER);
    fListViewer.setLabelProvider(new ColorListLabelProvider());
    fListViewer.setContentProvider(new ColorListContentProvider());
    fListViewer.setSorter(
        new ViewerSorter() {
          @Override
          public int category(Object element) {
            // don't sort the top level categories
            if (fCodeCategory.equals(element)) return 0;
            if (fAssemblyCategory.equals(element)) return 1;
            if (fCommentsCategory.equals(element)) return 2;
            if (fPreprocessorCategory.equals(element)) return 3;
            if (fDoxygenCategory.equals(element)) return 4;
            return 0;
          }
        });
    gd = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, true);
    gd.heightHint = convertHeightInCharsToPixels(9);
    int maxWidth = 0;
    for (HighlightingColorListItem item : fListModel) {
      maxWidth = Math.max(maxWidth, convertWidthInCharsToPixels(item.getDisplayName().length()));
    }
    ScrollBar vBar = ((Scrollable) fListViewer.getControl()).getVerticalBar();
    if (vBar != null) maxWidth += vBar.getSize().x * 3; // scrollbars and tree indentation guess
    gd.widthHint = maxWidth;

    fListViewer.getControl().setLayoutData(gd);

    Composite stylesComposite = new Composite(editorComposite, SWT.NONE);
    layout = new GridLayout();
    layout.marginHeight = 0;
    layout.marginWidth = 0;
    layout.numColumns = 2;
    stylesComposite.setLayout(layout);
    stylesComposite.setLayoutData(new GridData(GridData.FILL_BOTH));

    fEnableCheckbox = new Button(stylesComposite, SWT.CHECK);
    fEnableCheckbox.setText(PreferencesMessages.CEditorColoringConfigurationBlock_enable);
    gd = new GridData(GridData.FILL_HORIZONTAL);
    gd.horizontalAlignment = GridData.BEGINNING;
    gd.horizontalSpan = 2;
    fEnableCheckbox.setLayoutData(gd);

    fColorEditorLabel = new Label(stylesComposite, SWT.LEFT);
    fColorEditorLabel.setText(PreferencesMessages.CEditorColoringConfigurationBlock_color);
    gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
    gd.horizontalIndent = 20;
    fColorEditorLabel.setLayoutData(gd);

    fSyntaxForegroundColorEditor = new ColorSelector(stylesComposite);
    Button foregroundColorButton = fSyntaxForegroundColorEditor.getButton();
    gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
    foregroundColorButton.setLayoutData(gd);

    fBoldCheckBox = new Button(stylesComposite, SWT.CHECK);
    fBoldCheckBox.setText(PreferencesMessages.CEditorColoringConfigurationBlock_bold);
    gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
    gd.horizontalIndent = 20;
    gd.horizontalSpan = 2;
    fBoldCheckBox.setLayoutData(gd);

    fItalicCheckBox = new Button(stylesComposite, SWT.CHECK);
    fItalicCheckBox.setText(PreferencesMessages.CEditorColoringConfigurationBlock_italic);
    gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
    gd.horizontalIndent = 20;
    gd.horizontalSpan = 2;
    fItalicCheckBox.setLayoutData(gd);

    fStrikethroughCheckBox = new Button(stylesComposite, SWT.CHECK);
    fStrikethroughCheckBox.setText(
        PreferencesMessages.CEditorColoringConfigurationBlock_strikethrough);
    gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
    gd.horizontalIndent = 20;
    gd.horizontalSpan = 2;
    fStrikethroughCheckBox.setLayoutData(gd);

    fUnderlineCheckBox = new Button(stylesComposite, SWT.CHECK);
    fUnderlineCheckBox.setText(PreferencesMessages.CEditorColoringConfigurationBlock_underline);
    gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
    gd.horizontalIndent = 20;
    gd.horizontalSpan = 2;
    fUnderlineCheckBox.setLayoutData(gd);

    label = new Label(colorComposite, SWT.LEFT);
    label.setText(PreferencesMessages.CEditorColoringConfigurationBlock_preview);
    label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    Control previewer = createPreviewer(colorComposite);
    gd = new GridData(GridData.FILL_BOTH);
    gd.widthHint = convertWidthInCharsToPixels(20);
    gd.heightHint = convertHeightInCharsToPixels(5);
    previewer.setLayoutData(gd);

    fListViewer.addSelectionChangedListener(
        new ISelectionChangedListener() {
          @Override
          public void selectionChanged(SelectionChangedEvent event) {
            handleSyntaxColorListSelection();
          }
        });

    foregroundColorButton.addSelectionListener(
        new SelectionListener() {
          @Override
          public void widgetDefaultSelected(SelectionEvent e) {
            // do nothing
          }

          @Override
          public void widgetSelected(SelectionEvent e) {
            HighlightingColorListItem item = getHighlightingColorListItem();
            PreferenceConverter.setValue(
                getPreferenceStore(),
                item.getColorKey(),
                fSyntaxForegroundColorEditor.getColorValue());
          }
        });

    fBoldCheckBox.addSelectionListener(
        new SelectionListener() {
          @Override
          public void widgetDefaultSelected(SelectionEvent e) {
            // do nothing
          }

          @Override
          public void widgetSelected(SelectionEvent e) {
            HighlightingColorListItem item = getHighlightingColorListItem();
            getPreferenceStore().setValue(item.getBoldKey(), fBoldCheckBox.getSelection());
          }
        });

    fItalicCheckBox.addSelectionListener(
        new SelectionListener() {
          @Override
          public void widgetDefaultSelected(SelectionEvent e) {
            // do nothing
          }

          @Override
          public void widgetSelected(SelectionEvent e) {
            HighlightingColorListItem item = getHighlightingColorListItem();
            getPreferenceStore().setValue(item.getItalicKey(), fItalicCheckBox.getSelection());
          }
        });
    fStrikethroughCheckBox.addSelectionListener(
        new SelectionListener() {
          @Override
          public void widgetDefaultSelected(SelectionEvent e) {
            // do nothing
          }

          @Override
          public void widgetSelected(SelectionEvent e) {
            HighlightingColorListItem item = getHighlightingColorListItem();
            getPreferenceStore()
                .setValue(item.getStrikethroughKey(), fStrikethroughCheckBox.getSelection());
          }
        });

    fUnderlineCheckBox.addSelectionListener(
        new SelectionListener() {
          @Override
          public void widgetDefaultSelected(SelectionEvent e) {
            // do nothing
          }

          @Override
          public void widgetSelected(SelectionEvent e) {
            HighlightingColorListItem item = getHighlightingColorListItem();
            getPreferenceStore()
                .setValue(item.getUnderlineKey(), fUnderlineCheckBox.getSelection());
          }
        });

    fEnableCheckbox.addSelectionListener(
        new SelectionListener() {
          @Override
          public void widgetDefaultSelected(SelectionEvent e) {
            // do nothing
          }

          @Override
          public void widgetSelected(SelectionEvent e) {
            HighlightingColorListItem item = getHighlightingColorListItem();
            if (item instanceof SemanticHighlightingColorListItem) {
              boolean enable = fEnableCheckbox.getSelection();
              getPreferenceStore()
                  .setValue(((SemanticHighlightingColorListItem) item).getEnableKey(), enable);
              fEnableCheckbox.setSelection(enable);
              fSyntaxForegroundColorEditor.getButton().setEnabled(enable);
              fColorEditorLabel.setEnabled(enable);
              fBoldCheckBox.setEnabled(enable);
              fItalicCheckBox.setEnabled(enable);
              fStrikethroughCheckBox.setEnabled(enable);
              fUnderlineCheckBox.setEnabled(enable);
              uninstallSemanticHighlighting();
              installSemanticHighlighting();
            }
          }
        });

    fEnableSemanticHighlightingCheckbox.addSelectionListener(
        new SelectionListener() {
          @Override
          public void widgetDefaultSelected(SelectionEvent e) {
            // do nothing
          }

          @Override
          public void widgetSelected(SelectionEvent e) {
            fListViewer.refresh(true);
            HighlightingColorListItem item = getHighlightingColorListItem();
            if (item instanceof SemanticHighlightingColorListItem) {
              handleSyntaxColorListSelection();
              uninstallSemanticHighlighting();
              installSemanticHighlighting();
            }
          }
        });

    colorComposite.layout(false);

    return colorComposite;
  }