From dd3c427b9292f9c1d8066f5d32bf77182ce1a571 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Thu, 9 Apr 2009 20:14:22 +0400 Subject: [PATCH] Usability enchancements to Find in Project dialog: 1. All the option comboboxes are now non-focusable 2. Search query text field doesn't paint it's selection when not focused 3. Proper module is selected in modules combo, even if disabled --- .../src/com/intellij/find/impl/FindDialog.java | 47 +++++++++++++++++----- .../intellij/openapi/editor/impl/EditorImpl.java | 9 ++++- 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/lang-impl/src/com/intellij/find/impl/FindDialog.java b/lang-impl/src/com/intellij/find/impl/FindDialog.java index 7e8550ed50..24ff85e26e 100644 --- a/lang-impl/src/com/intellij/find/impl/FindDialog.java +++ b/lang-impl/src/com/intellij/find/impl/FindDialog.java @@ -17,9 +17,12 @@ import com.intellij.openapi.fileTypes.FileTypes; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.*; import com.intellij.openapi.util.IconLoader; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiDocumentManager; @@ -318,9 +321,7 @@ final class FindDialog extends DialogWrapper { optionsPanel.add(createFilterPanel(),gbConstraints); if (!myModel.isReplaceState()) { - myCbToSkipResultsWhenOneUsage = new StateRestoringCheckBox( - FindBundle.message("find.options.skip.results.tab.with.one.usage.checkbox"), - FindSettings.getInstance().isSkipResultsWithOneUsage()); + myCbToSkipResultsWhenOneUsage = createCheckbox(FindSettings.getInstance().isSkipResultsWithOneUsage(), FindBundle.message("find.options.skip.results.tab.with.one.usage.checkbox")); optionsPanel.add(myCbToSkipResultsWhenOneUsage, gbConstraints); } } @@ -345,7 +346,7 @@ final class FindDialog extends DialogWrapper { myFileFilter = new ComboBox(100); initCombobox(myFileFilter); - filterPanel.add(useFileFilter = new StateRestoringCheckBox(FindBundle.message("find.filter.file.mask.checkbox")),BorderLayout.WEST); + filterPanel.add(useFileFilter = createCheckbox(FindBundle.message("find.filter.file.mask.checkbox")),BorderLayout.WEST); filterPanel.add(myFileFilter,BorderLayout.CENTER); myFileFilter.setEditable(true); String[] fileMasks = FindSettings.getInstance().getRecentFileMasks(); @@ -476,17 +477,17 @@ final class FindDialog extends DialogWrapper { findOptionsPanel.setBorder(IdeBorderFactory.createTitledBorder(FindBundle.message("find.options.group"))); findOptionsPanel.setLayout(new BoxLayout(findOptionsPanel, BoxLayout.Y_AXIS)); - myCbCaseSensitive = new StateRestoringCheckBox(FindBundle.message("find.options.case.sensitive")); + myCbCaseSensitive = createCheckbox(FindBundle.message("find.options.case.sensitive")); findOptionsPanel.add(myCbCaseSensitive); if (myModel.isReplaceState()) { - myCbPreserveCase = new StateRestoringCheckBox(FindBundle.message("find.options.replace.preserve.case")); + myCbPreserveCase = createCheckbox(FindBundle.message("find.options.replace.preserve.case")); findOptionsPanel.add(myCbPreserveCase); } - myCbWholeWordsOnly = new StateRestoringCheckBox(FindBundle.message("find.options.whole.words.only")); + myCbWholeWordsOnly = createCheckbox(FindBundle.message("find.options.whole.words.only")); findOptionsPanel.add(myCbWholeWordsOnly); - myCbRegularExpressions = new StateRestoringCheckBox(FindBundle.message("find.options.regular.expressions")); + myCbRegularExpressions = createCheckbox(FindBundle.message("find.options.regular.expressions")); findOptionsPanel.add(myCbRegularExpressions); ActionListener actionListener = new ActionListener() { @@ -650,7 +651,7 @@ final class FindDialog extends DialogWrapper { gbConstraints.weightx = 1; gbConstraints.gridwidth = 2; gbConstraints.insets = new Insets(0, 16, 0, 0); - myCbWithSubdirectories = new StateRestoringCheckBox(FindBundle.message("find.scope.directory.recursive.checkbox"), true); + myCbWithSubdirectories = createCheckbox(true, FindBundle.message("find.scope.directory.recursive.checkbox")); myCbWithSubdirectories.setSelected(true); scopePanel.add(myCbWithSubdirectories, gbConstraints); @@ -718,6 +719,18 @@ final class FindDialog extends DialogWrapper { return scopePanel; } + private static StateRestoringCheckBox createCheckbox(String message) { + final StateRestoringCheckBox cb = new StateRestoringCheckBox(message); + cb.setFocusable(false); + return cb; + } + + private static StateRestoringCheckBox createCheckbox(boolean selected, String message) { + final StateRestoringCheckBox cb = new StateRestoringCheckBox(message, selected); + cb.setFocusable(false); + return cb; + } + private void validateScopeControls() { if (myRbDirectory.isSelected()) { myCbWithSubdirectories.makeSelectable(); @@ -885,7 +898,19 @@ final class FindDialog extends DialogWrapper { myCbRegularExpressions.setSelected(myModel.isRegularExpressions()); if (myModel.isMultipleFiles()) { - setDirectories(FindSettings.getInstance().getRecentDirectories(), myModel.getDirectoryName()); + final String dirName = myModel.getDirectoryName(); + setDirectories(FindSettings.getInstance().getRecentDirectories(), dirName); + + if (!StringUtil.isEmptyOrSpaces(dirName)) { + VirtualFile dir = LocalFileSystem.getInstance().findFileByPath(dirName); + if (dir != null) { + Module module = ModuleUtil.findModuleForFile(dir, myProject); + if (module != null) { + myModuleComboBox.setSelectedItem(module.getName()); + } + } + } + if (myModel.isProjectScope()) { myRbProject.setSelected(true); @@ -895,7 +920,7 @@ final class FindDialog extends DialogWrapper { myModuleComboBox.setEnabled(false); myScopeCombo.setEnabled(false); } - else if (myModel.getDirectoryName() != null) { + else if (dirName != null) { myRbDirectory.setSelected(true); myCbWithSubdirectories.setEnabled(true); myDirectoryComboBox.setEnabled(true); diff --git a/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 9239f03366..126e198d3d 100644 --- a/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -1329,7 +1329,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi int start = myDocument.getLineStartOffset(startLineNumber); - IterationState iterationState = new IterationState(this, start, true); + IterationState iterationState = new IterationState(this, start, paintSelection()); LineIterator lIterator = createLineIterator(); lIterator.start(start); @@ -1507,7 +1507,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi int start = myDocument.getLineStartOffset(startLineNumber); - IterationState iterationState = new IterationState(this, start, true); + IterationState iterationState = new IterationState(this, start, paintSelection()); LineIterator lIterator = createLineIterator(); lIterator.start(start); @@ -1591,6 +1591,11 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi flushCachedChars(g); } + private boolean paintSelection() { + if (!isOneLineMode()) return true; + return IJSwingUtilities.hasFocus(getContentComponent()); + } + private class CachedFontContent { final char[][] data = new char[CACHED_CHARS_BUFFER_SIZE][]; final int[] starts = new int[CACHED_CHARS_BUFFER_SIZE]; -- 2.11.4.GIT