/* * Copyright 2003-2016 JetBrains s.r.o. * * 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 jetbrains.mps.ide.findusages.view.optionseditor.components; import com.intellij.ui.IdeBorderFactory; import jetbrains.mps.ide.findusages.view.optionseditor.options.ScopeOptions; import jetbrains.mps.ide.findusages.view.optionseditor.options.ScopeOptions.ScopeType; import jetbrains.mps.ide.ui.DefaultCompletionTextField; import jetbrains.mps.smodel.ModuleRepositoryFacade; import jetbrains.mps.smodel.SModelStereotype; import jetbrains.mps.util.NameUtil; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.module.SModule; import org.jetbrains.mps.openapi.module.SRepository; import javax.swing.AbstractAction; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.ButtonModel; import javax.swing.JPanel; import javax.swing.JRadioButton; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class ScopeEditor extends BaseEditor<ScopeOptions> { private static final String GLOBAL_SCOPE = "Global"; private static final String PROJECT_SCOPE = "Project"; private static final String MODULE_SCOPE = "Module"; private static final String MODEL_SCOPE = "Model"; private static final String BOOTSTRAP_SCOPE = "Bootstrap"; private JRadioButton myGlobalScopeButton; private JRadioButton myProjectScopeButton; private JRadioButton myModuleScopeButton; private JRadioButton myModelScopeButton; private ButtonGroup myButtonGroup; private DefaultCompletionTextField myModuleField; private DefaultCompletionTextField myModelField; private List<String> myModuleNameList; private List<String> myModelNameList; public ScopeEditor(ScopeOptions defaultOptions, SRepository repository) { super(defaultOptions); myPanel = new JPanel(); myPanel.setLayout(new BoxLayout(myPanel, BoxLayout.Y_AXIS)); myPanel.setBorder(IdeBorderFactory.createTitledBorder("Scope", false)); myGlobalScopeButton = new JRadioButton(new AbstractAction(GLOBAL_SCOPE) { @Override public void actionPerformed(ActionEvent e) { setCompletionFieldsState(false, false); } }); myProjectScopeButton = new JRadioButton(new AbstractAction(PROJECT_SCOPE) { @Override public void actionPerformed(ActionEvent e) { setCompletionFieldsState(false, false); } }); myModuleScopeButton = new JRadioButton(new AbstractAction(MODULE_SCOPE) { @Override public void actionPerformed(ActionEvent e) { setCompletionFieldsState(true, false); } }); myModelScopeButton = new JRadioButton(new AbstractAction(MODEL_SCOPE) { @Override public void actionPerformed(ActionEvent e) { setCompletionFieldsState(false, true); } }); myButtonGroup = new ButtonGroup(); myButtonGroup.add(myGlobalScopeButton); myButtonGroup.add(myProjectScopeButton); myButtonGroup.add(myModuleScopeButton); myButtonGroup.add(myModelScopeButton); Iterable<SModule> moduleList = repository.getModules(); List<String> moduleNameList = new ArrayList<String>(); for (SModule iModule : moduleList) { String namespace = iModule.getModuleName(); if (namespace != null) { moduleNameList.add(namespace); } } myModuleNameList = moduleNameList; myModuleNameList.add(0, ScopeOptions.DEFAULT_VALUE); myModuleField = new DefaultCompletionTextField(moduleNameList); myModuleField.setText(ScopeOptions.DEFAULT_VALUE); Collection<SModel> modelList = new ModuleRepositoryFacade(repository).getAllModels(); myModelNameList = new ArrayList<String>(modelList.size()); for (SModel md : modelList) { if (!SModelStereotype.isStubModel(md)) { myModelNameList.add(NameUtil.getModelLongName(md)); } } myModelNameList.add(0, ScopeOptions.DEFAULT_VALUE); myModelField = new DefaultCompletionTextField(myModelNameList); myModelField.setText(ScopeOptions.DEFAULT_VALUE); JPanel row; row = new JPanel(); row.setLayout(new BorderLayout()); row.add(myModelScopeButton, BorderLayout.WEST); row.add(myModelField, BorderLayout.CENTER); myPanel.add(row); row = new JPanel(); row.setLayout(new BorderLayout()); row.add(myModuleScopeButton, BorderLayout.WEST); row.add(myModuleField, BorderLayout.CENTER); myPanel.add(row); row = new JPanel(); row.setLayout(new BorderLayout()); row.add(myProjectScopeButton, BorderLayout.WEST); myPanel.add(row); row = new JPanel(); row.setLayout(new BorderLayout()); row.add(myGlobalScopeButton, BorderLayout.WEST); myPanel.add(row); setDefaults(defaultOptions); } public void setCompletionFieldsState(boolean moduleState, boolean modelState) { myModuleField.setEnabled(moduleState); myModelField.setEnabled(modelState); } private void setDefaults(ScopeOptions defaultOptions) { myModuleField.setText(defaultOptions.getModule()); myModelField.setText(defaultOptions.getModel()); ScopeType scopeType = defaultOptions.getScopeType(); if (scopeType == ScopeType.GLOBAL) { setCurrentRadioButton(myGlobalScopeButton); } else if (scopeType == ScopeType.PROJECT) { setCurrentRadioButton(myProjectScopeButton); } else if (scopeType == ScopeType.MODULE) { setCurrentRadioButton(myModuleScopeButton); } else if (scopeType == ScopeType.MODEL) { setCurrentRadioButton(myModelScopeButton); } else { setCurrentRadioButton(myGlobalScopeButton); } } @Override public ScopeOptions getOptions() { if (myModuleNameList.contains(myModuleField.getText())) { myOptions.setModule(myModuleField.getText()); } else { myOptions.setModule(ScopeOptions.DEFAULT_VALUE); } if (myModelNameList.contains(myModelField.getText())) { myOptions.setModel(myModelField.getText()); } else { myOptions.setModel(ScopeOptions.DEFAULT_VALUE); } ButtonModel selectedModel = myButtonGroup.getSelection(); ScopeType scopeType; if (selectedModel == myGlobalScopeButton.getModel()) { scopeType = ScopeType.GLOBAL; } else if (selectedModel == myProjectScopeButton.getModel()) { scopeType = ScopeType.PROJECT; } else if (selectedModel == myModuleScopeButton.getModel()) { scopeType = ScopeType.MODULE; } else if (selectedModel == myModelScopeButton.getModel()) { scopeType = ScopeType.MODEL; } else { //No need to throw exception - just use default value scopeType = ScopeType.GLOBAL; } myOptions.setScopeType(scopeType); return myOptions; } private void setCurrentRadioButton(JRadioButton btn) { if (!btn.getModel().isSelected()) { btn.doClick(); } } }