/**
  * Prompts a user for the answer to a question. The user enters text. The text the user entered is
  * returned.
  *
  * @answer the initial text to place in the users answer.
  */
 public String promptForText(final String question, String answer) {
   InputDialog dialog =
       new InputDialog(getShell(), L10n.getInstance().getString("entText"), question, true);
   if (answer != null) {
     dialog.setInput(answer);
   }
   return dialog.open();
 }
  public ClassicLayout() {
    super(null, L10n.getInstance().getString("consBottom"));

    addCrossConnectorSetting(PreferenceKeys.BUG_BUTTONS_QUADRANT, Quadrant.IX.toString());

    addCrossConnectorSetting(PreferenceKeys.MAIN_TAB_QUADRANT, Quadrant.VI.toString());
    addCrossConnectorSetting(PreferenceKeys.CHANNEL_TAB_QUADRANT, Quadrant.VI.toString());
    addCrossConnectorSetting(PreferenceKeys.PERSON_TAB_QUADRANT, Quadrant.VI.toString());
    addCrossConnectorSetting(PreferenceKeys.REGEX_TAB_QUADRANT, Quadrant.VI.toString());
    addCrossConnectorSetting(PreferenceKeys.PARTNER_TELL_TAB_QUADRANT, Quadrant.VI.toString());
    addCrossConnectorSetting(PreferenceKeys.GAME_CHAT_TAB_QUADRANT, Quadrant.VI.toString());

    addCrossConnectorSetting(PreferenceKeys.GAMES_TAB_QUADRANT, Quadrant.VIII.toString());
    addCrossConnectorSetting(PreferenceKeys.GAME_BOT_QUADRANT, Quadrant.VIII.toString());
    addCrossConnectorSetting(PreferenceKeys.BUG_WHO_QUADRANT, Quadrant.VIII.toString());
    addCrossConnectorSetting(PreferenceKeys.SEEK_TABLE_QUADRANT, Quadrant.VIII.toString());

    preferenceAdjustments.put(PreferenceKeys.APP_PGN_RESULTS_QUADRANT, Quadrant.II.toString());
    preferenceAdjustments.put(PreferenceKeys.APP_BROWSER_QUADRANT, Quadrant.II.toString());

    preferenceAdjustments.put(
        PreferenceKeys.APP_CHESS_BOARD_QUADRANTS,
        RaptorStringUtils.toDelimitedString(
            new String[] {
              Quadrant.II.toString(), Quadrant.III.toString(),
              Quadrant.IV.toString(), Quadrant.V.toString()
            },
            ","));

    preferenceAdjustments.put(
        PreferenceKeys.APP_QUAD9_QUAD12345678_SASH_WEIGHTS,
        RaptorStringUtils.toString(new int[] {10, 90}));
    preferenceAdjustments.put(
        PreferenceKeys.APP_QUAD1_QUAD2345678_SASH_WEIGHTS,
        RaptorStringUtils.toString(new int[] {50, 50}));
    preferenceAdjustments.put(
        PreferenceKeys.APP_QUAD2345_QUAD678_SASH_WEIGHTS,
        RaptorStringUtils.toString(new int[] {70, 30}));
    preferenceAdjustments.put(
        PreferenceKeys.APP_QUAD2_QUAD3_QUAD4_QUAD5_SASH_WEIGHTS,
        RaptorStringUtils.toString(new int[] {25, 25, 25, 25}));
    preferenceAdjustments.put(
        PreferenceKeys.APP_QUAD67_QUAD8_SASH_WEIGHTS,
        RaptorStringUtils.toString(new int[] {70, 30}));
    preferenceAdjustments.put(
        PreferenceKeys.APP_QUAD6_QUAD7_SASH_WEIGHTS,
        RaptorStringUtils.toString(new int[] {50, 50}));
  }
public class ChessBoardBehaviorPage extends FieldEditorPreferencePage {

  protected static L10n local = L10n.getInstance();

  public static final String[][] USER_MOVE_INPUT_MODE_ARRAY = {
    {local.getString("dragNDrop"), UserMoveInputMode.DragAndDrop.toString()},
    {local.getString("clClMove"), UserMoveInputMode.ClickClickMove.toString()}
  };

  public static final String[][] SHOW_SECONDS_OPTIONS = {
    {local.getString("always"), "" + Integer.MAX_VALUE},
    {local.getString("chesBBehP1"), "" + (60 * 60 * 1000 + 1)},
    {local.getString("chesBBehP2"), "" + (30 * 60 * 1000 + 1)},
    {local.getString("chesBBehP3"), "" + (15 * 60 * 1000 + 1)},
    {local.getString("chesBBehP4"), "" + (10 * 60 * 1000 + 1)}
  };

  public static final String[][] SHOW_TENTHS_OPTIONS = {
    {local.getString("never"), "" + Integer.MIN_VALUE},
    {local.getString("chesBBehP5"), "" + (10 * 1000 + 1)},
    {local.getString("chesBBehP6"), "" + (60 * 1000 + 1)},
    {local.getString("chesBBehP7"), "" + (3 * 60 * 1000 + 1)},
    {local.getString("chesBBehP8"), "" + (5 * 60 * 1000 + 1)},
    {local.getString("chesBBehP9"), "" + (10 * 60 * 1000 + 1)},
    {local.getString("always"), "" + Integer.MAX_VALUE}
  };

  public ChessBoardBehaviorPage() {
    // Use the "flat" layout
    super(GRID);
    setTitle(local.getString("behavior"));
    setPreferenceStore(Raptor.getInstance().getPreferences());
  }

  @Override
  protected void createFieldEditors() {
    addField(
        new ComboFieldEditor(
            PreferenceKeys.BOARD_USER_MOVE_INPUT_MODE,
            local.getString("chesBBehP10"),
            USER_MOVE_INPUT_MODE_ARRAY,
            getFieldEditorParent()));

    addField(
        new ComboFieldEditor(
            PreferenceKeys.BOARD_CLOCK_SHOW_MILLIS_WHEN_LESS_THAN,
            local.getString("chesBBehP11"),
            SHOW_TENTHS_OPTIONS,
            getFieldEditorParent()));

    addField(
        new ComboFieldEditor(
            PreferenceKeys.BOARD_CLOCK_SHOW_SECONDS_WHEN_LESS_THAN,
            local.getString("chesBBehP12"),
            SHOW_SECONDS_OPTIONS,
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_TRAVERSE_WITH_MOUSE_WHEEL,
            local.getString("chesBBehP13"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_ALLOW_MOUSE_WHEEL_NAVIGATION_WHEEL_PLAYING,
            local.getString("chesBBehP14"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_ANNOUNCE_CHECK_WHEN_I_CHECK_OPPONENT,
            local.getString("chesBBehP15"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_ANNOUNCE_CHECK_WHEN_OPPONENT_CHECKS_ME,
            local.getString("chesBBehP16"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_IGNORE_OBSERVED_GAMES_IF_PLAYING,
            local.getString("chesBBehP17"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_TAKEOVER_INACTIVE_GAMES,
            local.getString("chesBBehP18"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_IS_USING_CROSSHAIRS_CURSOR,
            local.getString("chesBBehP19"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_PLAY_ABORT_REQUEST_SOUND,
            local.getString("chesBBehP20"),
            getFieldEditorParent()));
    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_PLAY_CHALLENGE_SOUND,
            local.getString("chesBBehP21"),
            getFieldEditorParent()));
    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_PLAY_DRAW_OFFER_SOUND,
            local.getString("chesBBehP22"),
            getFieldEditorParent()));
    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_PLAY_MOVE_SOUND_WHEN_OBSERVING,
            local.getString("chesBBehP23"),
            getFieldEditorParent()));
    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_IS_PLAYING_10_SECOND_COUNTDOWN_SOUNDS,
            local.getString("chesBBehP24"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_PREMOVE_ENABLED,
            local.getString("chesBBehP25"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_QUEUED_PREMOVE_ENABLED,
            local.getString("chesBBehP26"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_IS_SHOW_COORDINATES,
            local.getString("chesBBehP27"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_IS_SHOWING_PIECE_JAIL,
            local.getString("chesBBehP28"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_SHOW_PLAYING_GAME_STATS_ON_GAME_END,
            local.getString("chesBBehP29"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_SPEAK_RESULTS,
            local.getString("chesBBehP30"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_SPEAK_MOVES_I_MAKE,
            local.getString("chesBBehP31"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_SPEAK_MOVES_OPP_MAKES,
            local.getString("chesBBehP32"),
            getFieldEditorParent()));

    addField(
        new BooleanFieldEditor(
            PreferenceKeys.BOARD_SPEAK_WHEN_OBSERVING,
            local.getString("chesBBehP33"),
            getFieldEditorParent()));
  }
}
 public ScriptsPage() {
   super(FLAT);
   setTitle(L10n.getInstance().getString("scripts"));
   setPreferenceStore(Raptor.getInstance().getPreferences());
 }
/**
 * A clone of the SWT list editor. This version has a height hint you can set. Useful to keep lists
 * from growing far to large.
 */
public abstract class ListEditor extends FieldEditor {

  /** The list widget; <code>null</code> if none (before creation or after disposal). */
  private List list;

  /**
   * The button box containing the Add, Remove, Up, and Down buttons; <code>null</code> if none
   * (before creation or after disposal).
   */
  private Composite buttonBox;

  /** The Add button. */
  private Button addButton;

  /** The Remove button. */
  private Button removeButton;

  /** The Up button. */
  private Button upButton;

  /** The edit button. */
  private Button editButton;

  /** The Down button. */
  private Button downButton;

  /** The selection listener. */
  private SelectionListener selectionListener;

  private int heightHint = SWT.DEFAULT;
  protected static L10n local = L10n.getInstance();

  /** Creates a new list field editor */
  protected ListEditor() {}

  /**
   * Creates a list field editor.
   *
   * @param name the name of the preference this field editor works on
   * @param labelText the label text of the field editor
   * @param parent the parent of the field editor's control
   */
  protected ListEditor(String name, String labelText, Composite parent) {
    init(name, labelText);
    createControl(parent);
  }

  /**
   * Creates a list field editor.
   *
   * @param name the name of the preference this field editor works on
   * @param labelText the label text of the field editor
   * @param parent the parent of the field editor's control
   */
  protected ListEditor(String name, String labelText, Composite parent, int heightHint) {
    this.heightHint = heightHint;
    init(name, labelText);
    createControl(parent);
  }

  /** Creates a selection listener. */
  public void createSelectionListener() {
    selectionListener =
        new SelectionAdapter() {
          @Override
          public void widgetSelected(SelectionEvent event) {
            Widget widget = event.widget;
            if (widget == addButton) {
              addPressed();
            } else if (widget == editButton) {
              editPressed();
            } else if (widget == removeButton) {
              removePressed();
            } else if (widget == upButton) {
              upPressed();
            } else if (widget == downButton) {
              downPressed();
            } else if (widget == list) {
              selectionChanged();
            }
          }
        };
  }

  /**
   * Returns this field editor's button box containing the Add, Remove, Up, and Down button.
   *
   * @param parent the parent control
   * @return the button box
   */
  public Composite getButtonBoxControl(Composite parent) {
    if (buttonBox == null) {
      buttonBox = new Composite(parent, SWT.NULL);
      GridLayout layout = new GridLayout();
      layout.marginWidth = 0;
      buttonBox.setLayout(layout);
      createButtons(buttonBox);
      buttonBox.addDisposeListener(
          new DisposeListener() {
            public void widgetDisposed(DisposeEvent event) {
              addButton = null;
              removeButton = null;
              editButton = null;
              upButton = null;
              downButton = null;
              buttonBox = null;
            }
          });

    } else {
      checkParent(buttonBox, parent);
    }

    selectionChanged();
    return buttonBox;
  }

  public int getHeightHint() {
    return heightHint;
  }

  /**
   * Returns this field editor's list control.
   *
   * @param parent the parent control
   * @return the list control
   */
  public List getListControl(Composite parent) {
    if (list == null) {
      list = new List(parent, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL);
      list.setFont(parent.getFont());
      list.addSelectionListener(getSelectionListener());
      list.addDisposeListener(
          new DisposeListener() {
            public void widgetDisposed(DisposeEvent event) {
              list = null;
            }
          });
    } else {
      checkParent(list, parent);
    }
    return list;
  }

  /*
   * (non-) Method declared on FieldEditor.
   */
  @Override
  public int getNumberOfControls() {
    return 2;
  }

  /**
   * Prompts a user for the answer to a question. The user enters text. The text the user entered is
   * returned.
   */
  public String promptForText(final String question) {
    InputDialog dialog =
        new InputDialog(getShell(), L10n.getInstance().getString("entText"), question, true);
    return dialog.open();
  }

  /**
   * Prompts a user for the answer to a question. The user enters text. The text the user entered is
   * returned.
   *
   * @answer the initial text to place in the users answer.
   */
  public String promptForText(final String question, String answer) {
    InputDialog dialog =
        new InputDialog(getShell(), L10n.getInstance().getString("entText"), question, true);
    if (answer != null) {
      dialog.setInput(answer);
    }
    return dialog.open();
  }

  /**
   * Returns true if the text is valid, false otherwise.
   *
   * @param text The text to check.
   * @return True if valid, false otherwise.
   */
  public boolean isTextValid(String text) {
    return true;
  }

  /*
   * @see FieldEditor.setEnabled(boolean,Composite).
   */
  @Override
  public void setEnabled(boolean enabled, Composite parent) {
    super.setEnabled(enabled, parent);
    getListControl(parent).setEnabled(enabled);
    addButton.setEnabled(enabled);
    editButton.setEnabled(enabled);
    removeButton.setEnabled(enabled);
    upButton.setEnabled(enabled);
    downButton.setEnabled(enabled);
  }

  /*
   * (non-) Method declared on FieldEditor.
   */
  @Override
  public void setFocus() {
    if (list != null) {
      list.setFocus();
    }
  }

  public void setHeightHint(int heightHint) {
    this.heightHint = heightHint;
  }

  /*
   * (non-) Method declared on FieldEditor.
   */
  @Override
  protected void adjustForNumColumns(int numColumns) {
    Control control = getLabelControl();
    ((GridData) control.getLayoutData()).horizontalSpan = numColumns;
    ((GridData) list.getLayoutData()).horizontalSpan = numColumns - 1;
  }

  /**
   * Combines the given list of items into a single string. This method is the converse of <code>
   * parseString</code>.
   *
   * <p>Subclasses must implement this method.
   *
   * @param items the list of items
   * @return the combined string
   * @see #parseString
   */
  protected abstract String createList(String[] items);

  /*
   * (non-) Method declared on FieldEditor.
   */
  @Override
  protected void doFillIntoGrid(Composite parent, int numColumns) {
    Control control = getLabelControl(parent);
    GridData gd = new GridData();
    gd.horizontalSpan = numColumns;
    control.setLayoutData(gd);

    list = getListControl(parent);
    gd = new GridData(GridData.FILL_HORIZONTAL);
    gd.heightHint = heightHint;
    gd.verticalAlignment = GridData.FILL;
    gd.horizontalSpan = numColumns - 1;
    gd.grabExcessHorizontalSpace = true;
    list.setLayoutData(gd);

    buttonBox = getButtonBoxControl(parent);
    gd = new GridData();
    gd.verticalAlignment = GridData.BEGINNING;
    buttonBox.setLayoutData(gd);
  }

  /*
   * (non-) Method declared on FieldEditor.
   */
  @Override
  protected void doLoad() {
    if (list != null) {
      String s = getPreferenceStore().getString(getPreferenceName());
      String[] array = parseString(s);
      for (int i = 0; i < array.length; i++) {
        list.add(array[i]);
      }
    }
  }

  /*
   * (non-) Method declared on FieldEditor.
   */
  @Override
  protected void doLoadDefault() {
    if (list != null) {
      list.removeAll();
      String s = getPreferenceStore().getDefaultString(getPreferenceName());
      String[] array = parseString(s);
      for (int i = 0; i < array.length; i++) {
        list.add(array[i]);
      }
    }
  }

  /*
   * (non-) Method declared on FieldEditor.
   */
  @Override
  protected void doStore() {
    String s = createList(list.getItems());
    if (s != null) {
      getPreferenceStore().setValue(getPreferenceName(), s);
    }
  }

  /**
   * Creates and returns a new item for the list.
   *
   * <p>Subclasses must implement this method.
   *
   * @return a new item
   */
  protected abstract String getNewInputObject();

  /**
   * Returns this field editor's shell.
   *
   * <p>This method is internal to the framework; subclassers should not call this method.
   *
   * @return the shell
   */
  protected Shell getShell() {
    if (addButton == null) {
      return null;
    }
    return addButton.getShell();
  }

  /**
   * Splits the given string into a list of strings. This method is the converse of <code>createList
   * </code>.
   *
   * <p>Subclasses must implement this method.
   *
   * @param stringList the string
   * @return an array of <code>String</code>
   * @see #createList
   */
  protected abstract String[] parseString(String stringList);

  /** Notifies that the Add button has been pressed. */
  private void addPressed() {
    setPresentsDefaultValue(false);
    String value = promptForText(local.getString("entNewVal"));
    if (value != null && isTextValid(value)) {
      int index = list.getSelectionIndex();
      if (index >= 0) {
        list.add(value, index + 1);
      } else {
        list.add(value, 0);
      }
      selectionChanged();
    } else {
      showErrorMessage(local.getString("invalid") + value);
    }
  }

  /**
   * Creates the Add, Remove, Up, and Down button in the given button box.
   *
   * @param box the box for the buttons
   */
  private void createButtons(Composite box) {
    addButton = createPushButton(box, "ListEditor.add", null); // $NON-NLS-1$
    editButton = createPushButton(box, null, local.getString("edit"));
    removeButton = createPushButton(box, "ListEditor.remove", null); // $NON-NLS-1$
    upButton = createPushButton(box, "ListEditor.up", null); // $NON-NLS-1$
    downButton = createPushButton(box, "ListEditor.down", null); // $NON-NLS-1$
  }

  /**
   * Helper method to create a push button.
   *
   * @param parent the parent control
   * @param key the resource name used to supply the button's label text
   * @return Button
   */
  private Button createPushButton(Composite parent, String key, String keyOverride) {
    Button button = new Button(parent, SWT.PUSH);
    button.setText(key != null ? JFaceResources.getString(key) : keyOverride);
    button.setFont(parent.getFont());
    GridData data = new GridData(GridData.FILL_HORIZONTAL);
    int widthHint = convertHorizontalDLUsToPixels(button, IDialogConstants.BUTTON_WIDTH);
    data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
    button.setLayoutData(data);
    button.addSelectionListener(getSelectionListener());
    return button;
  }

  /** Notifies that the Down button has been pressed. */
  private void downPressed() {
    swap(false);
  }

  private void editPressed() {
    setPresentsDefaultValue(false);
    String value = list.getItem(list.getSelectionIndex());
    value = promptForText(local.getString("entNewVal"), value);
    if (value != null && isTextValid(value)) {
      list.setItem(list.getSelectionIndex(), value);
      selectionChanged();
    } else {
      showErrorMessage(local.getString("invalid") + value);
    }
  }

  /**
   * Returns this field editor's selection listener. The listener is created if nessessary.
   *
   * @return the selection listener
   */
  private SelectionListener getSelectionListener() {
    if (selectionListener == null) {
      createSelectionListener();
    }
    return selectionListener;
  }

  /** Notifies that the Remove button has been pressed. */
  private void removePressed() {
    setPresentsDefaultValue(false);
    int index = list.getSelectionIndex();
    if (index >= 0) {
      list.remove(index);
      selectionChanged();
    }
  }

  /** Notifies that the list selection has changed. */
  private void selectionChanged() {

    int index = list.getSelectionIndex();
    int size = list.getItemCount();

    removeButton.setEnabled(index >= 0);
    editButton.setEnabled(index >= 0);
    upButton.setEnabled(size > 1 && index > 0);
    downButton.setEnabled(size > 1 && index >= 0 && index < size - 1);
  }

  /**
   * Moves the currently selected item up or down.
   *
   * @param up <code>true</code> if the item should move up, and <code>false</code> if it should
   *     move down
   */
  private void swap(boolean up) {
    setPresentsDefaultValue(false);
    int index = list.getSelectionIndex();
    int target = up ? index - 1 : index + 1;

    if (index >= 0) {
      String[] selection = list.getSelection();
      Assert.isTrue(selection.length == 1);
      list.remove(index);
      list.add(selection[0], target);
      list.setSelection(target);
    }
    selectionChanged();
  }

  /** Notifies that the Up button has been pressed. */
  private void upPressed() {
    swap(true);
  }
}
 /**
  * Prompts a user for the answer to a question. The user enters text. The text the user entered is
  * returned.
  */
 public String promptForText(final String question) {
   InputDialog dialog =
       new InputDialog(getShell(), L10n.getInstance().getString("entText"), question, true);
   return dialog.open();
 }
public class ChatConsoleChannelColorsPage extends PreferencePage {
  Text channelName;
  Combo channels;
  ColorSelector colorSelector;
  RaptorPreferenceStore raptorPreferenceStore;
  Button saveButton;

  protected static L10n local = L10n.getInstance();

  public ChatConsoleChannelColorsPage() {
    // Use the "flat" layout
    super();
    setPreferenceStore(raptorPreferenceStore = Raptor.getInstance().getPreferences());
    setTitle(local.getString("chanCol"));
  }

  public String getKey(String channel) {
    return PreferenceKeys.CHAT_CHAT_EVENT_TYPE_COLOR_APPEND_TO
        + ChatType.CHANNEL_TELL
        + "-"
        + channel
        + "-color";
  }

  public void updateChannelsCombo() {
    for (int i = 0; i < 255; i++) {
      String key = getKey(String.valueOf(i));
      if (raptorPreferenceStore.contains(key)) {
        boolean contains = false;
        for (int j = 0; j < channels.getItemCount(); j++) {
          if (channels.getItem(j).equals(String.valueOf(i))) {
            contains = true;
            break;
          }
        }

        if (!contains) {
          channels.add(String.valueOf(i));
        }
      }
    }
  }

  @Override
  protected Control createContents(Composite parent) {
    parent = new Composite(parent, SWT.NONE);
    parent.setLayout(new GridLayout(3, false));

    Label label = new Label(parent, SWT.NONE);
    label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
    label.setText(
        WordUtils.wrap(local.getString("chatConColP1"), 70)
            + WordUtils.wrap(local.getString("chatConColP2"), 70));

    Label channelNamesLabel = new Label(parent, SWT.NONE);
    channelNamesLabel.setText(local.getString("channels"));
    channelNamesLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));

    channels = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
    channels.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
    channels.addSelectionListener(
        new SelectionAdapter() {
          @Override
          public void widgetSelected(SelectionEvent e) {
            String selectedChannelName = channels.getItem(channels.getSelectionIndex());
            channelName.setText(selectedChannelName);
            String key = getKey(selectedChannelName);
            colorSelector.setColorValue(raptorPreferenceStore.getColor(key).getRGB());
          }
        });

    Label channelNameLabel = new Label(parent, SWT.NONE);
    channelNameLabel.setText(local.getString("chanName"));
    channelNameLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));

    channelName = new Text(parent, SWT.SINGLE | SWT.BORDER);
    channelName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

    colorSelector = new ColorSelector(parent);
    colorSelector.getButton().setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));

    saveButton = new Button(parent, SWT.PUSH);
    saveButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
    saveButton.setText(local.getString("svAddChCol"));
    saveButton.addSelectionListener(
        new SelectionAdapter() {
          @Override
          public void widgetSelected(SelectionEvent e) {
            onSave();
          }
        });

    // deleteButton = new Button(parent, SWT.PUSH);
    // deleteButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false,
    // false, 2, 1));
    // deleteButton.setText("Delete Channel Color");
    // deleteButton.addSelectionListener(new SelectionAdapter() {
    // @Override
    // public void widgetSelected(SelectionEvent e) {
    // try {
    // int channelInt = Integer.parseInt(channelName.getText());
    // String key = getKey("" + channelInt);
    // channels.remove("" + channelInt);
    // raptorPreferenceStore.putValue(key, null);
    // } catch (NumberFormatException nfe) {
    // MessageDialog
    // .openInformation(Raptor.getInstance()
    // .getRaptorWindow().getShell(), "Alert",
    // "Channel name must be an integer greater than -1 and less than 256.");
    // }
    // }
    // });

    updateChannelsCombo();
    if (channels.getItemCount() > 0) {
      channels.select(0);
      String selectedChannelName = channels.getItem(channels.getSelectionIndex());
      channelName.setText(selectedChannelName);
      String key = getKey(selectedChannelName);
      colorSelector.setColorValue(raptorPreferenceStore.getColor(key).getRGB());
    }

    return parent;
  }

  protected void onSave() {
    try {
      int channelInt = Integer.parseInt(channelName.getText());
      if (channelInt < 0 || channelInt > 256) {
        throw new Exception();
      }
      String key = getKey(String.valueOf(channelInt));
      raptorPreferenceStore.setValue(key, colorSelector.getColorValue());

      boolean channelsHasSelection = false;
      for (int i = 0; i < channels.getItemCount(); i++) {
        if (channels.getItem(i).equals(String.valueOf(channelInt))) {
          channelsHasSelection = true;
          break;
        }
      }

      if (!channelsHasSelection) {
        channels.add(String.valueOf(channelInt));
      }
    } catch (Throwable t) {
      MessageDialog.openInformation(
          Raptor.getInstance().getWindow().getShell(),
          local.getString("alert"),
          local.getString("chatConColP3"));
    }
  }

  @Override
  protected void performApply() {
    onSave();
    super.performApply();
  }
}