com.intellij.ui.ShowUIDefaultsAction.java Source code

Java tutorial

Introduction

Here is the source code for com.intellij.ui.ShowUIDefaultsAction.java

Source

/*
 * Copyright 2000-2013 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 com.intellij.ui;

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.components.JBScrollPane;
import com.intellij.ui.table.JBTable;
import com.intellij.util.PairFunction;
import com.intellij.util.ui.EmptyIcon;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.plaf.ColorUIResource;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.EventObject;

/**
 * @author Konstantin Bulenkov
 */
public class ShowUIDefaultsAction extends AnAction implements DumbAware {
    @Override
    public void actionPerformed(AnActionEvent e) {
        final UIDefaults defaults = UIManager.getDefaults();
        Enumeration keys = defaults.keys();
        final Object[][] data = new Object[defaults.size()][2];
        int i = 0;
        while (keys.hasMoreElements()) {
            Object key = keys.nextElement();
            data[i][0] = key;
            data[i][1] = defaults.get(key);
            i++;
        }

        Arrays.sort(data, new Comparator<Object[]>() {
            @Override
            public int compare(Object[] o1, Object[] o2) {
                return StringUtil.naturalCompare(o1[0].toString(), o2[0].toString());
            }
        });

        final Project project = getEventProject(e);
        new DialogWrapper(project) {
            {
                setTitle("Edit LaF Defaults");
                setModal(false);
                init();
            }

            public JBTable myTable;

            @Nullable
            @Override
            public JComponent getPreferredFocusedComponent() {
                return myTable;
            }

            @Nullable
            @Override
            protected String getDimensionServiceKey() {
                return project == null ? null : "UI.Defaults.Dialog";
            }

            @Override
            protected JComponent createCenterPanel() {
                final JBTable table = new JBTable(new DefaultTableModel(data, new Object[] { "Name", "Value" }) {
                    @Override
                    public boolean isCellEditable(int row, int column) {
                        return column == 1 && getValueAt(row, column) instanceof Color;
                    }
                }) {
                    @Override
                    public boolean editCellAt(int row, int column, EventObject e) {
                        if (isCellEditable(row, column) && e instanceof MouseEvent) {
                            final Object color = getValueAt(row, column);
                            final Color newColor = ColorPicker.showDialog(this, "Choose Color", (Color) color, true,
                                    null, true);
                            if (newColor != null) {
                                final ColorUIResource colorUIResource = new ColorUIResource(newColor);
                                final Object key = getValueAt(row, 0);
                                UIManager.put(key, colorUIResource);
                                setValueAt(colorUIResource, row, column);
                            }
                        }
                        return false;
                    }
                };
                table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
                    @Override
                    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                            boolean hasFocus, int row, int column) {
                        final JPanel panel = new JPanel(new BorderLayout());
                        final JLabel label = new JLabel(value == null ? "" : value.toString());
                        panel.add(label, BorderLayout.CENTER);
                        if (value instanceof Color) {
                            final Color c = (Color) value;
                            label.setText(String.format("[r=%d,g=%d,b=%d] hex=0x%s", c.getRed(), c.getGreen(),
                                    c.getBlue(), ColorUtil.toHex(c)));
                            label.setForeground(ColorUtil.isDark(c) ? Color.white : Color.black);
                            panel.setBackground(c);
                            return panel;
                        } else if (value instanceof Icon) {
                            try {
                                final Icon icon = new IconWrap((Icon) value);
                                if (icon.getIconHeight() <= 20) {
                                    label.setIcon(icon);
                                }
                                label.setText(String.format("(%dx%d) %s)", icon.getIconWidth(),
                                        icon.getIconHeight(), label.getText()));
                            } catch (Throwable e1) {//
                            }
                            return panel;
                        } else if (value instanceof Border) {
                            try {
                                final Insets i = ((Border) value).getBorderInsets(null);
                                label.setText(String.format("[%d, %d, %d, %d] %s", i.top, i.left, i.bottom, i.right,
                                        label.getText()));
                                return panel;
                            } catch (Exception ignore) {
                            }
                        }
                        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                    }
                });
                final JBScrollPane pane = new JBScrollPane(table);
                new TableSpeedSearch(table, new PairFunction<Object, Cell, String>() {
                    @Nullable
                    @Override
                    public String fun(Object o, Cell cell) {
                        return cell.column == 1 ? null : String.valueOf(o);
                    }
                });
                table.setShowGrid(false);
                final JPanel panel = new JPanel(new BorderLayout());
                panel.add(pane, BorderLayout.CENTER);
                myTable = table;
                TableUtil.ensureSelectionExists(myTable);
                return panel;
            }
        }.show();
    }

    private class IconWrap implements Icon {
        private final Icon myIcon;

        public IconWrap(Icon icon) {
            myIcon = icon;
        }

        @Override
        public void paintIcon(Component c, Graphics g, int x, int y) {
            try {
                myIcon.paintIcon(c, g, x, y);
            } catch (Exception e) {
                EmptyIcon.ICON_0.paintIcon(c, g, x, y);
            }
        }

        @Override
        public int getIconWidth() {
            return myIcon.getIconWidth();
        }

        @Override
        public int getIconHeight() {
            return myIcon.getIconHeight();
        }
    }
}