com.intellij.ide.customize.CustomizeIDEWizardDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.intellij.ide.customize.CustomizeIDEWizardDialog.java

Source

/*
 * 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.ide.plugins.IdeaPluginDescriptor;
import com.intellij.ide.startup.StartupActionScriptManager;
import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.ui.JBCardLayout;
import com.intellij.util.SystemProperties;
import com.intellij.util.containers.MultiMap;
import lombok.val;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

public class CustomizeIDEWizardDialog extends DialogWrapper implements ActionListener {
    private static final String BUTTONS = "BUTTONS";
    private static final String NOBUTTONS = "NOBUTTONS";
    private final JButton mySkipButton = new JButton("Skip All");
    private final JButton myBackButton = new JButton("Back");
    private final JButton myNextButton = new JButton("Next");

    private final JBCardLayout myCardLayout = new JBCardLayout();
    protected final List<AbstractCustomizeWizardStep> mySteps = new ArrayList<AbstractCustomizeWizardStep>();
    private final MultiMap<String, IdeaPluginDescriptor> myPluginDescriptors;
    private final MultiMap<String, String> myPredefinedTemplateSets;
    private int myIndex = 0;
    private final JLabel myNavigationLabel = new JLabel();
    private final JLabel myHeaderLabel = new JLabel();
    private final JLabel myFooterLabel = new JLabel();
    private final CardLayout myButtonWrapperLayout = new CardLayout();
    private final JPanel myButtonWrapper = new JPanel(myButtonWrapperLayout);
    private JPanel myContentPanel;

    public CustomizeIDEWizardDialog(MultiMap<String, IdeaPluginDescriptor> pluginDescriptors,
            MultiMap<String, String> predefinedTemplateSets) {
        super(null);
        myPluginDescriptors = pluginDescriptors;
        myPredefinedTemplateSets = predefinedTemplateSets;
        setTitle("Customize " + ApplicationNamesInfo.getInstance().getProductName());
        initSteps();
        mySkipButton.addActionListener(this);
        myBackButton.addActionListener(this);
        myNextButton.addActionListener(this);
        myNavigationLabel.setEnabled(false);
        myFooterLabel.setEnabled(false);
        init();
        initCurrentStep(true);
        setSize(400, 300);
        System.setProperty(StartupActionScriptManager.STARTUP_WIZARD_MODE, "true");
    }

    @Override
    protected void dispose() {
        System.clearProperty(StartupActionScriptManager.STARTUP_WIZARD_MODE);
        if (!SystemProperties.getBooleanProperty("no.ide.firstStartup", false)) {
            Registry.get("ide.firstStartup").setValue(false);
        }
        super.dispose();
    }

    protected void initSteps() {
        mySteps.add(new CustomizeUIThemeStepPanel());
        if (SystemInfo.isMac) {
            mySteps.add(new CustomizeKeyboardSchemeStepPanel());
        }

        val templateStepPanel = myPredefinedTemplateSets.isEmpty() ? null
                : new CustomizeSelectTemplateStepPanel(myPredefinedTemplateSets);
        CustomizePluginsStepPanel pluginsStepPanel = null;
        if (!myPluginDescriptors.isEmpty()) {

            if (templateStepPanel != null) {
                mySteps.add(templateStepPanel);
            }
            pluginsStepPanel = new CustomizePluginsStepPanel(myPluginDescriptors, templateStepPanel);
            mySteps.add(pluginsStepPanel);

        }
        mySteps.add(new CustomizeDownloadAndStartStepPanel(this, pluginsStepPanel));
    }

    @Override
    protected JComponent createCenterPanel() {
        JPanel result = new JPanel(new BorderLayout(5, 5));
        myContentPanel = new JPanel(myCardLayout);
        for (AbstractCustomizeWizardStep step : mySteps) {
            myContentPanel.add(step, step.getTitle());
        }
        JPanel topPanel = new JPanel(new BorderLayout(5, 5));
        topPanel.add(myNavigationLabel, BorderLayout.NORTH);
        topPanel.add(myHeaderLabel, BorderLayout.CENTER);
        result.add(topPanel, BorderLayout.NORTH);
        result.add(myContentPanel, BorderLayout.CENTER);
        result.add(myFooterLabel, BorderLayout.SOUTH);
        result.setPreferredSize(new Dimension(700, 600));
        result.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        return result;
    }

    @Override
    protected JComponent createSouthPanel() {
        final JPanel buttonPanel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets.right = 5;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 0;
        gbc.gridy = 0;
        buttonPanel.add(mySkipButton, gbc);
        gbc.gridx++;
        buttonPanel.add(myBackButton, gbc);
        gbc.gridx++;
        gbc.weightx = 1;
        buttonPanel.add(Box.createHorizontalGlue(), gbc);
        gbc.gridx++;
        gbc.weightx = 0;
        buttonPanel.add(myNextButton, gbc);
        buttonPanel.setBorder(BorderFactory.createEmptyBorder(8, 0, 0, 0));
        myButtonWrapper.add(buttonPanel, BUTTONS);
        myButtonWrapper.add(new JLabel(), NOBUTTONS);
        myButtonWrapperLayout.show(myButtonWrapper, BUTTONS);
        return myButtonWrapper;
    }

    void setButtonsVisible(boolean visible) {
        myButtonWrapperLayout.show(myButtonWrapper, visible ? BUTTONS : NOBUTTONS);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == mySkipButton) {
            dispose();
            return;
        }
        if (e.getSource() == myBackButton) {
            myIndex--;
            initCurrentStep(false);
            return;
        }
        if (e.getSource() == myNextButton) {
            if (myIndex >= mySteps.size() - 1) {
                doOKAction();
                return;
            }
            myIndex++;
            initCurrentStep(true);
        }
    }

    @Override
    public void doCancelAction() {
        dispose();
    }

    private void initCurrentStep(boolean forward) {
        final AbstractCustomizeWizardStep myCurrentStep = mySteps.get(myIndex);
        boolean disableBack = myCurrentStep.beforeShown(forward);
        myCardLayout.swipe(myContentPanel, myCurrentStep.getTitle(), JBCardLayout.SwipeDirection.AUTO,
                new Runnable() {
                    @Override
                    public void run() {
                        Component component = myCurrentStep.getDefaultFocusedComponent();
                        if (component != null) {
                            component.requestFocus();
                        }
                    }
                });

        myBackButton.setVisible(myIndex > 0);
        if (disableBack) {
            myBackButton.setVisible(false);
            mySkipButton.setVisible(false);
        }
        if (myIndex > 0) {
            myBackButton.setText("Back to " + mySteps.get(myIndex - 1).getTitle());
        }
        mySkipButton.setText("Skip " + (myIndex > 0 ? "Remaining" : "All"));

        boolean nextButton = myIndex < mySteps.size() - 1;
        if (nextButton) {
            myNextButton.setText("Next: " + mySteps.get(myIndex + 1).getTitle());
        } else {
            myNextButton.setVisible(false);
        }
        myHeaderLabel.setText(myCurrentStep.getHTMLHeader());
        myFooterLabel.setText(myCurrentStep.getHTMLFooter());
        StringBuilder navHTML = new StringBuilder("<html><body>");
        for (int i = 0; i < mySteps.size(); i++) {
            if (i > 0)
                navHTML.append("&nbsp;&#8594;&nbsp;");
            if (i == myIndex)
                navHTML.append("<b>");
            navHTML.append(mySteps.get(i).getTitle());
            if (i == myIndex)
                navHTML.append("</b>");
        }
        myNavigationLabel.setText(navHTML.toString());
    }

    public void updateHeader() {
        final AbstractCustomizeWizardStep myCurrentStep = mySteps.get(myIndex);

        myHeaderLabel.setText(myCurrentStep.getHTMLHeader());
        myFooterLabel.setText(myCurrentStep.getHTMLFooter());
    }
}