/* * 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.openapi.wm.IdeFocusManager; import com.intellij.ui.JBCardLayout; import com.intellij.util.SystemProperties; import com.intellij.util.containers.MultiMap; import consulo.ide.customize.CustomizeDownloadAndStartStepPanel; import consulo.ide.customize.CustomizeSelectTemplateStepPanel; 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); setScalableSize(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()); } CustomizeSelectTemplateStepPanel 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) { IdeFocusManager.getGlobalInstance().doForceFocusWhenFocusSettlesDown(component); } } }); 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(" → "); 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()); } }