diff --git a/platform/platform-api/src/com/intellij/ui/PortField.java b/platform/platform-api/src/com/intellij/ui/PortField.java index 5c96d6555f35..07e414960204 100644 --- a/platform/platform-api/src/com/intellij/ui/PortField.java +++ b/platform/platform-api/src/com/intellij/ui/PortField.java @@ -22,8 +22,16 @@ public class PortField extends JSpinner { this(0); } - public PortField(int number) { - setModel(new SpinnerNumberModel(number, 0, 65535, 1)); + public PortField(int value) { + this(value, 0); + } + + public void setMin(int value) { + ((SpinnerNumberModel)getModel()).setMinimum(value); + } + + public PortField(int value, int min) { + setModel(new SpinnerNumberModel(value, min, 65535, 1)); setEditor(new NumberEditor(this, "#")); } @@ -31,8 +39,8 @@ public class PortField extends JSpinner { ((NumberEditor)getEditor()).getTextField().setEditable(value); } - public void setNumber(int number) { - setValue(number); + public void setNumber(int value) { + setValue(value); } public int getNumber() { diff --git a/platform/platform-api/src/com/intellij/ui/TreeUIHelper.java b/platform/platform-api/src/com/intellij/ui/TreeUIHelper.java index ebc0dcd78ade..978b0172d780 100644 --- a/platform/platform-api/src/com/intellij/ui/TreeUIHelper.java +++ b/platform/platform-api/src/com/intellij/ui/TreeUIHelper.java @@ -16,8 +16,10 @@ package com.intellij.ui; import com.intellij.openapi.components.ServiceManager; +import com.intellij.util.containers.Convertor; import javax.swing.*; +import javax.swing.tree.TreePath; /** * @author yole @@ -44,6 +46,8 @@ public abstract class TreeUIHelper { public abstract void installTreeSpeedSearch(JTree tree); public abstract void installListSpeedSearch(JList list); + public abstract void installTreeSpeedSearch(JTree tree, Convertor convertor, boolean canExpand); + public abstract void installListSpeedSearch(JList list, Convertor convertor); public abstract void installEditSourceOnEnterKeyHandler(JTree tree); diff --git a/platform/platform-impl/src/com/intellij/ui/ListSpeedSearch.java b/platform/platform-impl/src/com/intellij/ui/ListSpeedSearch.java index 661b6cab8635..a72b455ee340 100644 --- a/platform/platform-impl/src/com/intellij/ui/ListSpeedSearch.java +++ b/platform/platform-impl/src/com/intellij/ui/ListSpeedSearch.java @@ -16,19 +16,30 @@ package com.intellij.ui; import com.intellij.util.Function; +import com.intellij.util.containers.Convertor; import javax.swing.*; public class ListSpeedSearch extends SpeedSearchBase { - private Function myElementTextDelegate; + private final Convertor myToStringConvertor; public ListSpeedSearch(JList list) { super(list); + myToStringConvertor = null; } - public ListSpeedSearch(final JList component, final Function elementTextDelegate) { + public ListSpeedSearch(final JList component, final Convertor convertor) { super(component); - myElementTextDelegate = elementTextDelegate; + myToStringConvertor = convertor; + } + + public ListSpeedSearch(final JList component, final Function convertor) { + this(component, new Convertor() { + @Override + public String convert(Object o) { + return convertor.fun(o); + } + }); } protected void selectElement(Object element, String selectedText) { @@ -58,8 +69,8 @@ public class ListSpeedSearch extends SpeedSearchBase { } protected String getElementText(Object element) { - if (myElementTextDelegate != null) { - return myElementTextDelegate.fun(element); + if (myToStringConvertor != null) { + return myToStringConvertor.convert(element); } return element == null ? null : element.toString(); } diff --git a/platform/platform-impl/src/com/intellij/ui/TreeSpeedSearch.java b/platform/platform-impl/src/com/intellij/ui/TreeSpeedSearch.java index c44488b245b7..effca2ef6404 100644 --- a/platform/platform-impl/src/com/intellij/ui/TreeSpeedSearch.java +++ b/platform/platform-impl/src/com/intellij/ui/TreeSpeedSearch.java @@ -22,7 +22,6 @@ import com.intellij.util.containers.Convertor; import com.intellij.util.ui.tree.TreeUtil; import javax.swing.*; -import javax.swing.text.Position; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; @@ -53,14 +52,8 @@ public class TreeSpeedSearch extends SpeedSearchBase { } }; - /** - * @deprecated You should use {@link TreeSpeedSearch#TreeSpeedSearch(JTree)} - * @see Tree#getNextMatch(String, int, Position.Bias) - */ public TreeSpeedSearch(JTree tree, Convertor toStringConvertor) { - super(tree); - myToStringConvertor = toStringConvertor; - setComparator(new SpeedSearchComparator(false, true)); + this(tree, toStringConvertor, false); } public TreeSpeedSearch(JTree tree) { @@ -72,6 +65,10 @@ public class TreeSpeedSearch extends SpeedSearchBase { } public TreeSpeedSearch(Tree tree, Convertor toString, boolean canExpand) { + this((JTree)tree, toString, canExpand); + } + + public TreeSpeedSearch(JTree tree, Convertor toString, boolean canExpand) { super(tree); setComparator(new SpeedSearchComparator(false, true)); myToStringConvertor = toString; diff --git a/platform/platform-impl/src/com/intellij/ui/TreeUIHelperImpl.java b/platform/platform-impl/src/com/intellij/ui/TreeUIHelperImpl.java index e8a434816bbc..64606b3423c1 100644 --- a/platform/platform-impl/src/com/intellij/ui/TreeUIHelperImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/TreeUIHelperImpl.java @@ -20,8 +20,10 @@ import com.intellij.ui.table.JBTable; import com.intellij.ui.treeStructure.Tree; import com.intellij.util.EditSourceOnDoubleClickHandler; import com.intellij.util.EditSourceOnEnterKeyHandler; +import com.intellij.util.containers.Convertor; import javax.swing.*; +import javax.swing.tree.TreePath; /** * @author yole @@ -51,10 +53,18 @@ public class TreeUIHelperImpl extends TreeUIHelper { new TreeSpeedSearch(tree); } - public void installListSpeedSearch(final JList list) { + public void installTreeSpeedSearch(JTree tree, Convertor convertor, boolean canExpand) { + new TreeSpeedSearch(tree, convertor, canExpand); + } + + public void installListSpeedSearch(JList list) { new ListSpeedSearch(list); } + public void installListSpeedSearch(JList list, Convertor convertor) { + new ListSpeedSearch(list, convertor); + } + public void installEditSourceOnEnterKeyHandler(final JTree tree) { EditSourceOnEnterKeyHandler.install(tree); } diff --git a/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java b/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java index 5d4439781311..085bb4d9d7d7 100644 --- a/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java +++ b/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java @@ -57,6 +57,7 @@ import com.intellij.util.Consumer; import com.intellij.util.EditSourceOnDoubleClickHandler; import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.Convertor; import com.intellij.util.containers.TransferToEDTQueue; import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.ui.DialogUtil; @@ -438,7 +439,22 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra } }); - //TODO: install speed search. Not in openapi though. It makes sense to create a common TreeEnchancer service. + TreeUIHelper.getInstance().installTreeSpeedSearch(myTree, new Convertor() { + @Override + public String convert(TreePath o) { + Object value = o.getLastPathComponent(); + TreeCellRenderer renderer = myTree.getCellRenderer(); + if (renderer instanceof ColoredTreeCellRenderer) { + ColoredTreeCellRenderer coloredRenderer = (ColoredTreeCellRenderer)renderer; + coloredRenderer.clear(); + coloredRenderer.customizeCellRenderer(myTree, value, false, false, false, 0, false); + return coloredRenderer.toString(); + } + else { + return value == null? null : value.toString(); + } + } + }, true); } @NotNull diff --git a/platform/usageView/src/com/intellij/usages/impl/UsageViewTreeCellRenderer.java b/platform/usageView/src/com/intellij/usages/impl/UsageViewTreeCellRenderer.java index bd5624065d7a..85904a676006 100644 --- a/platform/usageView/src/com/intellij/usages/impl/UsageViewTreeCellRenderer.java +++ b/platform/usageView/src/com/intellij/usages/impl/UsageViewTreeCellRenderer.java @@ -22,10 +22,12 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.FileStatus; import com.intellij.ui.ColoredTreeCellRenderer; import com.intellij.ui.SimpleTextAttributes; +import com.intellij.ui.speedSearch.SpeedSearchUtil; import com.intellij.usageView.UsageTreeColors; import com.intellij.usageView.UsageTreeColorsScheme; import com.intellij.usageView.UsageViewBundle; import com.intellij.usages.*; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; @@ -55,7 +57,7 @@ class UsageViewTreeCellRenderer extends ColoredTreeCellRenderer { if (value instanceof Node && value != tree.getModel().getRoot()) { Node node = (Node)value; if (!node.isValid()) { - append(UsageViewBundle.message("node.invalid") + " ", ourInvalidAttributes); + doAppend(UsageViewBundle.message("node.invalid") + " ", ourInvalidAttributes); } if (myPresentation.isShowReadOnlyStatusAsRed() && node.isReadOnly()) { showAsReadOnly = true; @@ -69,61 +71,65 @@ class UsageViewTreeCellRenderer extends ColoredTreeCellRenderer { if (userObject instanceof UsageTarget) { UsageTarget usageTarget = (UsageTarget)userObject; if (!usageTarget.isValid()) { - append(UsageViewBundle.message("node.invalid"), ourInvalidAttributes); + doAppend(UsageViewBundle.message("node.invalid"), ourInvalidAttributes); return; } final ItemPresentation presentation = usageTarget.getPresentation(); LOG.assertTrue(presentation != null); if (showAsReadOnly) { - append(UsageViewBundle.message("node.readonly") + " ", ourReadOnlyAttributes); + doAppend(UsageViewBundle.message("node.readonly") + " ", ourReadOnlyAttributes); } final String text = presentation.getPresentableText(); - append(text != null? text : "", SimpleTextAttributes.REGULAR_ATTRIBUTES); + doAppend(text != null? text : "", SimpleTextAttributes.REGULAR_ATTRIBUTES); setIcon(presentation.getIcon(expanded)); } else if (treeNode instanceof GroupNode) { GroupNode node = (GroupNode)treeNode; if (node.isRoot()) { - append(StringUtil.capitalize(myPresentation.getUsagesWord()), patchAttrs(node, SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES)); + doAppend(StringUtil.capitalize(myPresentation.getUsagesWord()), patchAttrs(node, SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES)); } else { - append(node.getGroup().getText(myView), + doAppend(node.getGroup().getText(myView), patchAttrs(node, showAsReadOnly ? ourReadOnlyAttributes : SimpleTextAttributes.REGULAR_ATTRIBUTES)); setIcon(node.getGroup().getIcon(expanded)); } int count = node.getRecursiveUsageCount(); - append(" (" + StringUtil.pluralize(count + " " + myPresentation.getUsagesWord(), count) + ")", patchAttrs(node, myNumberOfUsagesAttribute)); + doAppend(" (" + StringUtil.pluralize(count + " " + myPresentation.getUsagesWord(), count) + ")", patchAttrs(node, myNumberOfUsagesAttribute)); } else if (treeNode instanceof UsageNode) { UsageNode node = (UsageNode)treeNode; setIcon(node.getUsage().getPresentation().getIcon()); if (showAsReadOnly) { - append(UsageViewBundle.message("node.readonly") + " ", patchAttrs(node, ourReadOnlyAttributes)); + doAppend(UsageViewBundle.message("node.readonly") + " ", patchAttrs(node, ourReadOnlyAttributes)); } if (node.isValid()) { TextChunk[] text = node.getUsage().getPresentation().getText(); for (TextChunk textChunk : text) { SimpleTextAttributes simples = textChunk.getSimpleAttributesIgnoreBackground(); - append(textChunk.getText(), patchAttrs(node, simples)); + doAppend(textChunk.getText(), patchAttrs(node, simples)); } } } else if (userObject instanceof String) { - append((String)userObject, SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES); + doAppend((String)userObject, SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES); } else { - append(userObject == null ? "" : userObject.toString(), SimpleTextAttributes.REGULAR_ATTRIBUTES); + doAppend(userObject == null ? "" : userObject.toString(), SimpleTextAttributes.REGULAR_ATTRIBUTES); } } else { - append(value.toString(), SimpleTextAttributes.REGULAR_ATTRIBUTES); + doAppend(value.toString(), SimpleTextAttributes.REGULAR_ATTRIBUTES); } } + private void doAppend(@NotNull String fragment, @NotNull SimpleTextAttributes attributes) { + SpeedSearchUtil.appendFragmentsForSpeedSearch(myTree, fragment, attributes, mySelected, this); + } + private static SimpleTextAttributes patchAttrs(Node node, SimpleTextAttributes original) { if (node.isExcluded()) { original = new SimpleTextAttributes(original.getStyle() | SimpleTextAttributes.STYLE_STRIKEOUT, original.getFgColor(), original.getWaveColor()); diff --git a/xml/impl/src/com/intellij/ide/browsers/WebBrowser.java b/xml/impl/src/com/intellij/ide/browsers/WebBrowser.java new file mode 100644 index 000000000000..22203cb81aaf --- /dev/null +++ b/xml/impl/src/com/intellij/ide/browsers/WebBrowser.java @@ -0,0 +1,55 @@ +package com.intellij.ide.browsers; + +import org.jetbrains.annotations.NotNull; + +import static com.intellij.ide.browsers.BrowsersConfiguration.BrowserFamily; + +public final class WebBrowser { + private final BrowserFamily myFamily; + private final String myName; + + public WebBrowser(@NotNull BrowserFamily browserFamily) { + this(browserFamily.getName(), browserFamily); + } + + public WebBrowser(@NotNull String name, @NotNull BrowserFamily browserFamily) { + myFamily = browserFamily; + myName = name; + } + + @NotNull + public String getName() { + return myName; + } + + @NotNull + public BrowserFamily getFamily() { + return myFamily; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + WebBrowser browser = (WebBrowser)o; + if (myFamily != browser.myFamily) { + return false; + } + if (!myName.equals(browser.myName)) { + return false; + } + return true; + } + + @Override + public int hashCode() { + int result = myFamily.hashCode(); + result = 31 * result + myName.hashCode(); + return result; + } +} \ No newline at end of file