package net.bitpot.railways.gui;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleServiceManager;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.LanguageTextField;
import com.intellij.ui.TextFieldWithAutoCompletion;
import com.intellij.ui.TextFieldWithAutoCompletionListProvider;
import net.bitpot.railways.routesView.RoutesManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.ruby.rails.RailsUtil;
import org.jetbrains.plugins.ruby.tasks.rake.RakeTaskModuleCache;
import org.jetbrains.plugins.ruby.tasks.rake.task.RakeTask;
import javax.swing.*;
import java.util.List;
/**
* @author Basil Gren
* on 28.10.14.
*/
public class RailwaysSettingsForm {
private JPanel rootPanel;
// Autocomplete field is inherited from LanguageTextField, but doesn't have
// default constructor, so we'd better use parent class LanguageTextField.
private LanguageTextField routesTaskEdit;
private JComboBox environmentCombo;
private JCheckBox autoUpdateChk;
private JCheckBox liveActionHighlightingChk;
private final Module myModule;
public RailwaysSettingsForm(Module module) {
myModule = module;
}
private TextFieldWithAutoCompletion<RakeTask> createRakeTaskNamesEdit() {
TextFieldWithAutoCompletionListProvider<RakeTask> listProvider =
new TextFieldWithAutoCompletionListProvider<RakeTask>(null) {
@Nullable
@Override
protected Icon getIcon(@NotNull RakeTask rakeTask) {
return RailwaysIcons.RAKE;
}
@NotNull
@Override
protected String getLookupString(@NotNull RakeTask rakeTask) {
if (rakeTask.getFullCommand() == null)
return "";
return rakeTask.getFullCommand();
}
@Nullable
@Override
protected String getTailText(@NotNull RakeTask rakeTask) {
return " " + rakeTask.getDescription();
}
@Nullable
@Override
protected String getTypeText(@NotNull RakeTask rakeTask) {
return null;
}
@Override
public int compare(RakeTask rakeTask, RakeTask rakeTask2) {
return StringUtil.compare(rakeTask.getFullCommand(),
rakeTask2.getFullCommand(), false);
}
};
TextFieldWithAutoCompletion<RakeTask> field = new TextFieldWithAutoCompletion<RakeTask>(
myModule.getProject(), listProvider, true, null);
RakeTaskModuleCache cachedTasks = RakeTaskModuleCache.getInstance(myModule);
List<RakeTask> rakeList = cachedTasks != null ? cachedTasks.getRakeTaskCmdsList() : null;
listProvider.setItems(rakeList);
return field;
}
public JComponent rootPanel() {
return rootPanel;
}
/**
* Resets form components to contain corresponding project settings.
*/
public void reset() {
RoutesManager.State settings = getSettings();
routesTaskEdit.setText(settings.routesTaskName);
initRailsEnvsComboBox(settings.environment, environmentCombo, myModule);
autoUpdateChk.setSelected(settings.autoUpdate);
liveActionHighlightingChk.setSelected(settings.liveActionHighlighting);
}
/**
* Sets project settings from corresponding form component values.
*/
public void apply() {
RoutesManager.State settings = getSettings();
settings.routesTaskName = routesTaskEdit.getText();
settings.environment = environmentCombo.getSelectedIndex() == 0 ? null :
(String)(environmentCombo.getSelectedItem());
settings.autoUpdate = autoUpdateChk.isSelected();
settings.liveActionHighlighting = liveActionHighlightingChk.isSelected();
}
private void initRailsEnvsComboBox(@Nullable String value,
@NotNull JComboBox combo,
@Nullable Module module) {
String[] envs = RailsUtil.getAllEnvironments(module);
Object[] objects = new Object[envs.length + 1];
objects[0] = "Default";
System.arraycopy(envs, 0, objects, 1, envs.length);
combo.setModel(new DefaultComboBoxModel(objects));
combo.setSelectedItem(value == null ? "Default" : value);
}
private RoutesManager.State getSettings() {
RoutesManager mgr = ModuleServiceManager.getService(myModule, RoutesManager.class);
return mgr.getState();
}
private void createUIComponents() {
routesTaskEdit = createRakeTaskNamesEdit();
}
}