package jetbrains.mps.editor.contextActionsTool.pluginSolution.plugin; /*Generated by MPS */ import javax.swing.JComponent; import javax.swing.JPanel; import java.util.List; import jetbrains.mps.ide.tools.BaseTool; import java.awt.BorderLayout; import javax.swing.BoxLayout; import javax.swing.JScrollPane; import javax.swing.BorderFactory; import jetbrains.mps.ide.ThreadUtils; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import java.util.Map; import java.util.TreeMap; import jetbrains.mps.internal.collections.runtime.CollectionSequence; import javax.swing.JLabel; import java.awt.dnd.InvalidDnDOperationException; import java.awt.HeadlessException; import java.awt.Font; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.Icon; import org.jetbrains.annotations.NotNull; import jetbrains.mps.openapi.editor.menus.transformation.CommandPolicy; import com.intellij.openapi.wm.ToolWindow; public class ToolComponent extends JComponent { private ViewType myViewType = ViewType.LIST; private JPanel myItemPanel = new JPanel(); private String myFilterString = ""; private SearchField mySearchField = new SearchField() { @Override public void executeSearch(boolean next) { myFilterString = mySearchField.getText().toLowerCase(); reloadItems(); } }; private List<ToolComponent.IItem> myLoadedItems; private BaseTool myTool; private ItemExecutor myItemExecutor; public ToolComponent(BaseTool tool) { myTool = tool; initComponents(); } public void setItemExecutor(ItemExecutor itemExecutor) { myItemExecutor = itemExecutor; } protected void initComponents() { setLayout(new BorderLayout()); myItemPanel.setLayout(new BoxLayout(myItemPanel, BoxLayout.Y_AXIS)); JComponent viewport = new JPanel(); viewport.setLayout(new BorderLayout()); viewport.add(myItemPanel, BorderLayout.NORTH); JScrollPane scrollPane = new JScrollPane(viewport); scrollPane.setBorder(BorderFactory.createEmptyBorder()); scrollPane.getVerticalScrollBar().setUnitIncrement(16); scrollPane.getHorizontalScrollBar().setUnitIncrement(8); add(scrollPane, BorderLayout.CENTER); add(mySearchField, BorderLayout.NORTH); myItemPanel.setOpaque(false); viewport.setOpaque(true); } @Override public void setBounds(int x, int y, int w, int h) { // Relayout the folders after resizing the tool boolean widthChanged = w != getSize().width; super.setBounds(x, y, w, h); if (widthChanged) { ThreadUtils.runInUIThreadNoWait(new Runnable() { public void run() { reloadItems(); } }); } } public boolean isToolVisible() { return check_cnbxua_a0a61(myTool.getToolWindow()); } /** * Creates Swing components for each item * * @param items the items to show */ protected void loadItems(List<ToolComponent.IItem> items) { if (items == null) { items = ListSequence.fromList(new ArrayList<ToolComponent.IItem>()); } myLoadedItems = items; myItemPanel.removeAll(); Map<String, Folder> folders = new TreeMap<String, Folder>(); for (ToolComponent.IItem item : ListSequence.fromList(items)) { if (!(matchesFilter(item))) { continue; } getOrCreateFolder(item.getFolderName(), folders).addItem(createLabel(item)); } for (Folder folder : CollectionSequence.fromCollection(folders.values())) { myItemPanel.add(folder.getComponent()); } doLayout(); invalidate(); revalidate(); repaint(); } private boolean matchesFilter(ToolComponent.IItem item) { if ((myFilterString == null || myFilterString.length() == 0)) { return true; } if (item.getLabel().toLowerCase().contains(myFilterString)) { return true; } if (isNotEmptyString(item.getFolderName()) && item.getFolderName().toLowerCase().contains(myFilterString)) { return true; } return false; } private JLabel createLabel(final ToolComponent.IItem item) throws InvalidDnDOperationException, HeadlessException { final JLabel jlabel = new HoverLabel((myViewType == ViewType.LIST ? item.getLabel() : abbreviate(item.getLabel(), 15))); if (myViewType == ViewType.SYMBOLS) { Font font = jlabel.getFont(); jlabel.setFont(font.deriveFont(0.7f * font.getSize())); jlabel.setHorizontalAlignment(JLabel.CENTER); } jlabel.setToolTipText(item.getTooltip()); jlabel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { if (event.getClickCount() > 1) { return; } if (myItemExecutor == null) { return; } myItemExecutor.execute(item); } }); Icon itemIcon = item.getIcon(); if (itemIcon != null) { jlabel.setIcon((myViewType == ViewType.SYMBOLS ? itemIcon : ScaledIcon.scaleIfNeeded(16, itemIcon))); } if (myViewType == ViewType.SYMBOLS) { jlabel.setHorizontalTextPosition(JLabel.CENTER); jlabel.setVerticalTextPosition(JLabel.BOTTOM); } return jlabel; } private static String abbreviate(String str, int maxWidth) { if (str == null) { return null; } if (str.length() <= maxWidth) { return str; } return str.substring(0, maxWidth - 3) + "..."; } public void reloadItems() { loadItems(myLoadedItems); } private Folder getOrCreateFolder(String folderName, Map<String, Folder> folders) { if (folderName == null) { folderName = ""; } Folder folder = folders.get(folderName); if (folder == null) { folder = new Folder(folderName, myViewType); folders.put(folderName, folder); } return folder; } public void setViewType(ViewType type) { myViewType = type; reloadItems(); } public ViewType getViewType() { return myViewType; } public interface IItem { String getLabel(); Icon getIcon(); String getFolderName(); String getTooltip(); boolean isVisible(); @NotNull CommandPolicy getCommandPolicy(); void execute(); } private static boolean check_cnbxua_a0a61(ToolWindow checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.isVisible(); } return false; } private static boolean isNotEmptyString(String str) { return str != null && str.length() > 0; } }