/* * Copyright 2003-2011 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.icons.AllIcons.Nodes; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.components.JBCheckBox; import com.intellij.ui.components.JBLabel; import jetbrains.mps.ide.findusages.FindersManager; import jetbrains.mps.ide.findusages.findalgorithm.finders.IInterfacedFinder; import jetbrains.mps.ide.findusages.view.optionseditor.options.FindersOptions; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SNode; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JToolBar; import javax.swing.border.EmptyBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.MenuKeyEvent; import java.awt.Cursor; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.function.Consumer; public class FindersEditor extends BaseEditor<FindersOptions> { public FindersEditor(FindersOptions defaultOptions, final SNode node) { this(defaultOptions, node, null); } public FindersEditor(FindersOptions defaultOptions, final SNode node, @Nullable final Consumer<IInterfacedFinder> navigation) { super(defaultOptions); myPanel = new JPanel(); myPanel.setLayout(new BoxLayout(myPanel, BoxLayout.Y_AXIS)); myPanel.setBorder(IdeBorderFactory.createTitledBorder("Finders", false)); Set<IInterfacedFinder> availableFinders = FindersManager.getInstance().getAvailableFinders(node); List<IInterfacedFinder> sortedFinders = new ArrayList<>(availableFinders); Collections.sort(sortedFinders, (o1, o2) -> o1.getDescription().compareToIgnoreCase(o2.getDescription())); for (final IInterfacedFinder finder : sortedFinders) { boolean isEnabled = myOptions.getFindersClassNames().contains(finder.getClass().getName()); final JBCheckBox finderCheckBox = new JBCheckBox(finder.getDescription(), isEnabled); finderCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 0)); finderCheckBox.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { String finderClassName = finder.getClass().getName(); if (((JCheckBox) e.getSource()).isSelected()) { if (!myOptions.getFindersClassNames().contains(finderClassName)) { myOptions.getFindersClassNames().add(finderClassName); findersListChangedByUser(); } } else { myOptions.getFindersClassNames().remove(finderClassName); findersListChangedByUser(); } } }); if (!finder.getLongDescription().equals("")) { StringBuilder htmlTooltipText = new StringBuilder(); htmlTooltipText.append("<html>").append(finder.getLongDescription().replaceAll("\n", "<br>")).append(")</html>"); finderCheckBox.setToolTipText(htmlTooltipText.toString()); } JToolBar finderHolder = new JToolBar(JToolBar.HORIZONTAL); finderHolder.add(finderCheckBox); if (navigation != null && finder.canNavigate()) { finderCheckBox.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if ((e.getKeyCode() == MenuKeyEvent.VK_B) && (e.getID() == MenuKeyEvent.KEY_PRESSED) && (e.isControlDown())) { navigation.accept(finder); e.consume(); } } }); JBLabel goToFinderLabel = new JBLabel(Nodes.Symlink, JLabel.CENTER); goToFinderLabel.setBorder(BorderFactory.createEmptyBorder()); goToFinderLabel.setFocusable(false); goToFinderLabel.setToolTipText("Go to finder declaration"); goToFinderLabel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { navigation.accept(finder); } }); goToFinderLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); finderHolder.add(goToFinderLabel); } finderHolder.setBorder(new EmptyBorder(0, 0, 0, 0)); finderHolder.setFloatable(false); finderHolder.setAlignmentX(JToolBar.LEFT_ALIGNMENT); finderHolder.setBackground(myPanel.getBackground()); myPanel.add(finderHolder); } } protected void findersListChangedByUser() { } }