/*
 * Copyright 2006 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.dev.util.arg;

import com.google.gwt.dev.jjs.JsOutputOption;
import com.google.gwt.util.tools.ArgHandlerEnum;

/**
 * Argument handler for processing the script style flag.
 */
public final class ArgHandlerScriptStyle extends ArgHandlerEnum<JsOutputOption> {

  private final OptionScriptStyle options;

  public ArgHandlerScriptStyle(OptionScriptStyle options) {
    super(JsOutputOption.class, options.getOutput(), true);
    this.options = options;
  }

  @Override
  public String getPurpose() {
    return getPurposeString("Script output style:");
  }

  @Override
  public String getTag() {
    return "-style";
  }

  @Override
  public void setValue(JsOutputOption jsOutputOption) {
    if (options.getOutput() != jsOutputOption) {
      options.setOutput(jsOutputOption);
    }
 }
}