/* * Copyright 2000-2014 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.ide.customize; import com.intellij.CommonBundle; import com.intellij.ide.ui.LafManager; import consulo.ide.ui.laf.LafWithColorScheme; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.SystemInfo; import com.intellij.util.IconUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.util.LinkedHashMap; import java.util.Map; public class CustomizeUIThemeStepPanel extends AbstractCustomizeWizardStep { private static final String DEFAULT = "Default"; private static final String DARCULA = "Darcula"; private static final String INTELLIJ = "IntelliJ"; private boolean myInitial = true; private boolean myColumnMode; private JLabel myPreviewLabel; private Map<String, Icon> myLafNames = new LinkedHashMap<String, Icon>(); public CustomizeUIThemeStepPanel() { setLayout(new BorderLayout(10, 10)); IconLoader.activate(); if (SystemInfo.isMac) { myLafNames.put(DEFAULT, IconLoader.getIcon("/lafs/OSXAqua.png")); myLafNames.put(DARCULA, IconLoader.getIcon("/lafs/OSXDarcula.png")); } else if (SystemInfo.isWindows) { myLafNames.put(INTELLIJ, IconLoader.getIcon("/lafs/WindowsIntelliJ.png")); myLafNames.put(DARCULA, IconLoader.getIcon("/lafs/WindowsDarcula.png")); } else { myLafNames.put(INTELLIJ, IconLoader.getIcon("/lafs/LinuxIntelliJ.png")); myLafNames.put(DARCULA, IconLoader.getIcon("/lafs/LinuxDarcula.png")); } myColumnMode = myLafNames.size() > 2; JPanel buttonsPanel = new JPanel(new GridLayout(myColumnMode ? myLafNames.size() : 1, myColumnMode ? 1 : myLafNames.size(), 5, 5)); ButtonGroup group = new ButtonGroup(); String defaultLafName = null; for (Map.Entry<String, Icon> entry : myLafNames.entrySet()) { final String lafName = entry.getKey(); Icon icon = entry.getValue(); final JRadioButton radioButton = new JRadioButton(lafName, defaultLafName == null); radioButton.setOpaque(false); if (defaultLafName == null) { radioButton.setSelected(true); defaultLafName = lafName; } final JPanel panel = createBigButtonPanel(new BorderLayout(10, 10), radioButton, new Runnable() { @Override public void run() { applyLaf(lafName, CustomizeUIThemeStepPanel.this); } }); panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); panel.add(radioButton, BorderLayout.NORTH); final JLabel label = new JLabel(myColumnMode ? IconUtil.scale(icon, .2) : icon) { @Override public Dimension getPreferredSize() { Dimension size = super.getPreferredSize(); if (myColumnMode) size.width *=2; return size; } }; label.setVerticalAlignment(SwingConstants.TOP); panel.add(label, BorderLayout.CENTER); group.add(radioButton); buttonsPanel.add(panel); } add(buttonsPanel, BorderLayout.CENTER); myPreviewLabel = new JLabel(); myPreviewLabel.setHorizontalAlignment(SwingConstants.CENTER); myPreviewLabel.setVerticalAlignment(SwingConstants.CENTER); if (myColumnMode) { add(buttonsPanel, BorderLayout.WEST); add(myPreviewLabel, BorderLayout.CENTER); } applyLaf(defaultLafName, this); myInitial = false; } @Override public Dimension getPreferredSize() { Dimension size = super.getPreferredSize(); size.width += 30; return size; } @Override public String getTitle() { return "UI Themes"; } @Override public String getHTMLHeader() { return "<html><body><h2>Set UI theme</h2> </body></html>"; } @Override public String getHTMLFooter() { return "UI theme can be changed later in " + CommonBundle.settingsTitle() + " | Appearance"; } private void applyLaf(String lafName, Component component) { UIManager.LookAndFeelInfo info = getLookAndFeelInfo(lafName); if (info == null) return; try { UIManager.setLookAndFeel(info.getClassName()); if (!myInitial) { LafManager.getInstance().setCurrentLookAndFeel(info); if(info instanceof LafWithColorScheme) { EditorColorsManager editorColorsManager = EditorColorsManager.getInstance(); EditorColorsScheme scheme = editorColorsManager.getScheme(((LafWithColorScheme)info).getColorSchemeName()); if(scheme != null) { editorColorsManager.setGlobalScheme(scheme); } } } Window window = SwingUtilities.getWindowAncestor(component); if (window != null) { window.setBackground(new Color(UIUtil.getPanelBackground().getRGB())); SwingUtilities.updateComponentTreeUI(window); } if (myColumnMode) { myPreviewLabel.setIcon(myLafNames.get(lafName)); myPreviewLabel.setBorder(BorderFactory.createLineBorder(UIManager.getColor("Label.foreground"))); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (UnsupportedLookAndFeelException e) { e.printStackTrace(); } } @Nullable private static UIManager.LookAndFeelInfo getLookAndFeelInfo(@NotNull String name) { for (UIManager.LookAndFeelInfo lookAndFeelInfo : LafManager.getInstance().getInstalledLookAndFeels()) { if(name.equals(lookAndFeelInfo.getName())) { return lookAndFeelInfo; } } return null; } }