// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library trydart.settings;

import 'user_option.dart';

const BooleanUserOption _alwaysRunInWorker =
    const BooleanUserOption('alwaysRunInWorker');

bool get alwaysRunInWorker => _alwaysRunInWorker.value;

void set alwaysRunInWorker(bool b) {
  _alwaysRunInWorker.value = b;
}

const BooleanUserOption _verboseCompiler =
    const BooleanUserOption('verboseCompiler');

bool get verboseCompiler => _verboseCompiler.value;

void set verboseCompiler(bool b) {
  _verboseCompiler.value = b;
}

const BooleanUserOption _minified =
    const BooleanUserOption('minified');

bool get minified => _minified.value;

void set minified(bool b) {
  _minified.value = b;
}

const BooleanUserOption _onlyAnalyze =
    const BooleanUserOption('onlyAnalyze');

bool get onlyAnalyze => _onlyAnalyze.value;

void set onlyAnalyze(bool b) {
  _onlyAnalyze.value = b;
}

const BooleanUserOption _enableDartMind =
    const BooleanUserOption('enableDartMind');

bool get enableDartMind => _enableDartMind.value;

void set enableDartMind(bool b) {
  _enableDartMind.value = b;
}

const BooleanUserOption _compilationPaused =
    const BooleanUserOption('compilationPaused');

bool get compilationPaused => _compilationPaused.value;

void set compilationPaused(bool b) {
  _compilationPaused.value = b;
}

const StringUserOption _codeFont =
    const StringUserOption('codeFont');

String get codeFont => _codeFont.value;

void set codeFont(String b) {
  _codeFont.value = b;
}

const StringUserOption _currentSample =
    const StringUserOption('currentSample', isHidden: true);

String get currentSample => _currentSample.value;

void set currentSample(String b) {
  _currentSample.value = b;
}

const StringUserOption _theme =
    const StringUserOption('theme');

String get theme => _theme.value;

void set theme(String b) {
  _theme.value = b;
}

const BooleanUserOption enableCodeCompletion =
    const BooleanUserOption('enableCodeCompletion', isHidden: true);

const BooleanUserOption incrementalCompilation =
    const BooleanUserOption('incrementalCompilation');

const BooleanUserOption live = const BooleanUserOption('live', isHidden: true);

const List<UserOption> options = const <UserOption>[
    _alwaysRunInWorker,
    _verboseCompiler,
    _minified,
    _onlyAnalyze,
    _enableDartMind,
    _compilationPaused,
    incrementalCompilation,
    live,
    enableCodeCompletion,
    _codeFont,
    _theme,
    _currentSample,
  ];
