/* * Copyright 2006 Sascha Weinreuter * * 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 org.intellij.plugins.xpathView.search; import com.intellij.ide.util.scopeChooser.ScopeChooserCombo; import com.intellij.openapi.Disposable; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.application.options.ModulesComboBox; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.Disposer; import com.intellij.ui.ComboboxWithBrowseButton; import com.intellij.ui.DocumentAdapter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.DocumentEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.Arrays; import java.util.Vector; public class ScopePanel extends JPanel implements Disposable{ @SuppressWarnings({ "FieldCanBeLocal", "UnusedDeclaration" }) private JPanel myRoot; private JRadioButton myWholeProjectScope; private JRadioButton myModuleScope; private ModulesComboBox myModuleSelection; private JRadioButton myDirectoryScope; private TextFieldWithBrowseButton myDirectory; private JCheckBox myRecursive; private JRadioButton myCustomScope; private ComboboxWithBrowseButton myCustomScopeSelection; private final Project myProject; public ScopePanel(@NotNull Project project) { myProject = project; } public void initComponent(@Nullable Module currentModule, final SearchScope scope) { final ItemListener stateListener = new ItemListener() { public void itemStateChanged(ItemEvent e) { myModuleSelection.setEnabled(myModuleScope.isSelected()); myDirectory.setEnabled(myDirectoryScope.isSelected()); myRecursive.setEnabled(myDirectoryScope.isSelected()); myCustomScopeSelection.setEnabled(myCustomScope.isSelected()); if (e.getStateChange() == ItemEvent.SELECTED) { firePropertyChange("scope", null, getSelectedScope()); } } }; final ItemListener scopeListener = new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { firePropertyChange("scope", null, getSelectedScope()); } } }; myWholeProjectScope.addItemListener(stateListener); myWholeProjectScope.setSelected(scope.getScopeType() == SearchScope.ScopeType.PROJECT); myModuleScope.addItemListener(stateListener); myModuleScope.setSelected(scope.getScopeType() == SearchScope.ScopeType.MODULE); myDirectoryScope.addItemListener(stateListener); myDirectoryScope.setSelected(scope.getScopeType() == SearchScope.ScopeType.DIRECTORY); myCustomScope.addItemListener(stateListener); myCustomScope.setSelected(scope.getScopeType() == SearchScope.ScopeType.CUSTOM); myModuleSelection.fillModules(myProject); Module m; if (scope.getModuleName() != null) { if ((m = ModuleManager.getInstance(myProject).findModuleByName(scope.getModuleName())) == null) { m = currentModule; } } else { m = currentModule; } if (m != null) { myModuleSelection.setSelectedModule(m); } myModuleSelection.addItemListener(scopeListener); ((ScopeChooserCombo)myCustomScopeSelection).init(myProject, true, true, scope.getScopeName()); myCustomScopeSelection.getComboBox().addItemListener(scopeListener); myDirectory.getTextField().getDocument().addDocumentListener(new DocumentAdapter() { protected void textChanged(DocumentEvent e) { firePropertyChange("scope", null, getSelectedScope()); } }); myDirectory.setText(scope.getPath()); myDirectory.addBrowseFolderListener("Select Path", "Select Path", myProject, FileChooserDescriptorFactory.createSingleFolderDescriptor()); myRecursive.setSelected(scope.isRecursive()); } @SuppressWarnings({"unchecked", "UseOfObsoleteCollectionType"}) private static ComboBoxModel createModel(Object[] elements) { return new DefaultComboBoxModel(new Vector(Arrays.asList(elements))); } private void createUIComponents() { myRoot = this; myCustomScopeSelection = new ScopeChooserCombo(); } @Nullable private String getDirectoryName() { final String s = myDirectory.getText(); return s != null && s.length() > 0 ? s : null; } @Nullable private String getModuleName() { final Module module = myModuleSelection.getSelectedModule(); return module != null ? module.getName() : null; } @NotNull private SearchScope.ScopeType getScopeType() { if (myWholeProjectScope.isSelected()) return SearchScope.ScopeType.PROJECT; if (myModuleScope.isSelected()) return SearchScope.ScopeType.MODULE; if (myDirectoryScope.isSelected()) return SearchScope.ScopeType.DIRECTORY; if (myCustomScope.isSelected()) return SearchScope.ScopeType.CUSTOM; assert false : "Unknown Scope"; return null; } public SearchScope getSearchScope() { final SearchScope scope = getSelectedScope(); scope.setCustomScope(((ScopeChooserCombo)myCustomScopeSelection).getSelectedScope()); return scope; } SearchScope getSelectedScope() { return new SearchScope(getScopeType(), getDirectoryName(), myRecursive.isSelected(), getModuleName(), ((ScopeChooserCombo)myCustomScopeSelection).getSelectedScopeName()); } public void dispose() { Disposer.dispose(myCustomScopeSelection); } }