blob: a7be243555e833a717edbf6a3184e2e43f2daba6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.installer.wizard.containers;
import com.apple.eawt.Application;
import com.apple.eawt.ApplicationAdapter;
import com.apple.eawt.ApplicationEvent;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JRootPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import org.netbeans.installer.utils.ErrorManager;
import org.netbeans.installer.utils.FileProxy;
import org.netbeans.installer.utils.LogManager;
import org.netbeans.installer.utils.ResourceUtils;
import org.netbeans.installer.utils.StringUtils;
import org.netbeans.installer.utils.SystemUtils;
import org.netbeans.installer.utils.UiUtils;
import org.netbeans.installer.utils.exceptions.DownloadException;
import org.netbeans.installer.utils.helper.swing.NbiButton;
import org.netbeans.installer.utils.helper.swing.NbiFrame;
import org.netbeans.installer.utils.helper.swing.NbiLabel;
import org.netbeans.installer.utils.helper.swing.NbiPanel;
import org.netbeans.installer.utils.helper.swing.NbiSeparator;
import org.netbeans.installer.utils.helper.swing.NbiTextPane;
import org.netbeans.installer.wizard.ui.SwingUi;
import org.netbeans.installer.wizard.ui.WizardUi;
/**
* This class is a conscrete implementation of the {@link SwingContainer} interface.
* In this case the container is an {@link NbiFrame}.
*
* @author Kirill Sorokin
* @sicne 1.0
*/
public class SwingFrameContainer extends NbiFrame implements SwingContainer {
/////////////////////////////////////////////////////////////////////////////////
// Instance
/**
* Instance of {@link SwingUi} that is currently shown by the container.
*/
private SwingUi currentUi;
/**
* Content pane used by the container.
*/
private WizardFrameContentPane contentPane;
/**
* Prefix of the container frame title.
*/
private String frameTitlePrefix;
/**
* Pattern which should be used to combine the container frame's title prefix
* and the title of the current UI.
*/
private String frameTitlePattern;
/**
* Creates a new instance of {@link SwingFrameContainer}. The constructor calls
* the initialization routine of the parent class and searches the system
* properties for settings which may be releavant to this type of container.
* Additionally it initializes and lays out the core swing components of the
* container.
*/
public SwingFrameContainer() {
super();
frameWidth = UiUtils.getDimension(System.getProperties(),
WIZARD_FRAME_WIDTH_PROPERTY,
DEFAULT_WIZARD_FRAME_WIDTH);
frameMinimumWidth = UiUtils.getDimension(System.getProperties(),
WIZARD_FRAME_MINIMUM_WIDTH_PROPERTY,
DEFAULT_WIZARD_FRAME_MINIMUM_WIDTH);
frameMaximumWidth = UiUtils.getDimension(System.getProperties(),
WIZARD_FRAME_MAXIMUM_WIDTH_PROPERTY,
DEFAULT_WIZARD_FRAME_MAXIMUM_WIDTH);
frameHeight = UiUtils.getDimension(System.getProperties(),
WIZARD_FRAME_HEIGHT_PROPERTY,
DEFAULT_WIZARD_FRAME_HEIGHT);
frameMinimumHeight = UiUtils.getDimension(System.getProperties(),
WIZARD_FRAME_MINIMUM_HEIGHT_PROPERTY,
DEFAULT_WIZARD_FRAME_MINIMUM_HEIGHT);
frameMaximumHeight = UiUtils.getDimension(System.getProperties(),
WIZARD_FRAME_MAXIMUM_HEIGHT_PROPERTY,
DEFAULT_WIZARD_FRAME_MAXIMUM_HEIGHT);
boolean customIconLoaded = false;
if (System.getProperty(WIZARD_FRAME_ICON_URI_PROPERTY) != null) {
final String frameIconUri =
System.getProperty(WIZARD_FRAME_ICON_URI_PROPERTY);
try {
frameIcon = FileProxy.getInstance().getFile(frameIconUri,true);
customIconLoaded = true;
} catch (DownloadException e) {
ErrorManager.notifyWarning(ResourceUtils.getString(
SwingFrameContainer.class,
RESOURCE_FAILED_TO_DOWNLOAD_WIZARD_ICON,
frameIconUri), e);
}
}
if (!customIconLoaded) {
final String frameIconUri = DEFAULT_WIZARD_FRAME_ICON_URI;
try {
frameIcon = FileProxy.getInstance().getFile(frameIconUri,true);
customIconLoaded = true;
} catch (DownloadException e) {
ErrorManager.notifyWarning(ResourceUtils.getString(
SwingFrameContainer.class,
RESOURCE_FAILED_TO_DOWNLOAD_WIZARD_ICON,
frameIconUri), e);
}
}
frameTitlePrefix = DEFAULT_WIZARD_FRAME_TITLE_PREFIX;
if (System.getProperty(WIZARD_FRAME_TITLE_PREFIX_PROPERTY) != null) {
frameTitlePrefix =
System.getProperty(WIZARD_FRAME_TITLE_PREFIX_PROPERTY);
}
frameTitlePattern = DEFAULT_WIZARD_FRAME_TITLE_PATTERN;
if (System.getProperty(WIZARD_FRAME_TITLE_PATTERN_PROPERTY) != null) {
frameTitlePattern =
System.getProperty(WIZARD_FRAME_TITLE_PATTERN_PROPERTY);
}
initComponents();
}
/**
* This method overrides {@link NbiFrame#setVisible()} and at the same time
* implements {@link WizardContainer#setVisible()}. It is responsible for
* showing and hiding the wizard container frame.
*
* @param visible Whether to show the frame - <code>true</code>, or to hide
* it - <code>false</code>.
*/
@Override
public void setVisible(final boolean visible) {
super.setVisible(visible);
if (visible == false) {
dispose();
}
}
/**
* {@inheritDoc}
*/
public void updateWizardUi(final WizardUi wizardUi) {
if(wizardUi==null) {
currentUi = null;
return;
}
if (!SwingUtilities.isEventDispatchThread()) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
updateWizardUi(wizardUi);
}
});
} catch (InterruptedException e) {
LogManager.log("Error during updating wizard UI", e);
} catch (InvocationTargetException e) {
LogManager.log("Error during updating wizard UI", e);
}
return;
}
// save the ui reference
currentUi = wizardUi.getSwingUi(this);
final int currentHeight = getSize().height;
// update the frame title
if (currentUi.getTitle() != null) {
setTitle(StringUtils.format(
frameTitlePattern,
frameTitlePrefix,
currentUi.getTitle()));
} else {
setTitle(frameTitlePrefix);
}
// change the panel
contentPane.updatePanel(currentUi);
// resize the frame if needed
final int neededMinimumHeight =
this.getLayout().minimumLayoutSize(this).getSize().height;
if(isResizable() && (neededMinimumHeight > currentHeight)) {
setPreferredSize(new Dimension(getSize().width,
neededMinimumHeight + EXTRA_SIZE));
setMinimumSize(new Dimension(getSize().width,
neededMinimumHeight + EXTRA_SIZE));
pack();
}
contentPane.repaint();
// handle the default buttons - Enter
getRootPane().setDefaultButton(currentUi.getDefaultEnterButton());
// handle the default buttons - Escape
getRootPane().getInputMap(JRootPane.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
CANCEL_ACTION_NAME);
getRootPane().getActionMap().put(CANCEL_ACTION_NAME, new AbstractAction() {
public void actionPerformed(ActionEvent event) {
if(currentUi == null) {
return;
}
final NbiButton button = currentUi.getDefaultEscapeButton();
if (button != null && button.isEnabled()) {
if (button.equals(getHelpButton())) {
currentUi.evaluateHelpButtonClick();
}
if (button.equals(getBackButton())) {
currentUi.evaluateBackButtonClick();
}
if (button.equals(getNextButton())) {
currentUi.evaluateNextButtonClick();
}
if (button.equals(getCancelButton())) {
currentUi.evaluateCancelButtonClick();
}
}
}
});
// set the default focus for the current page
if (currentUi.getDefaultFocusOwner() != null) {
currentUi.getDefaultFocusOwner().requestFocusInWindow();
}
// a11y
getAccessibleContext().setAccessibleName(currentUi.getTitle());
getAccessibleContext().setAccessibleDescription(currentUi.getDescription());
}
/**
* {@inheritDoc}
*/
public NbiButton getHelpButton() {
return contentPane.getHelpButton();
}
/**
* {@inheritDoc}
*/
public NbiButton getBackButton() {
return contentPane.getBackButton();
}
/**
* {@inheritDoc}
*/
public NbiButton getNextButton() {
return contentPane.getNextButton();
}
/**
* {@inheritDoc}
*/
public NbiButton getCancelButton() {
return contentPane.getCancelButton();
}
public void open() {
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
Thread.currentThread().setUncaughtExceptionHandler(
ErrorManager.getExceptionHandler());
}
});
} catch (InvocationTargetException e) {
ErrorManager.notifyDebug(ResourceUtils.getString(
SwingFrameContainer.class,
RESOURCE_FAILED_TO_ATTACH_ERROR_HANDLER), e);
} catch (InterruptedException e) {
ErrorManager.notifyDebug(ResourceUtils.getString(
SwingFrameContainer.class,
RESOURCE_FAILED_TO_ATTACH_ERROR_HANDLER), e);
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setVisible(true);
}
});
}
public void close() {
setVisible(false);
}
// protected ////////////////////////////////////////////////////////////////////
/**
* Initializes and lays out the Swing components for the container frame. This
* method also sets some frame properties which will be required at runtime,
* such as size, position, etc.
*/
private void initComponents() {
try {
setDefaultCloseOperation(NbiFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent event) {
cancelContainer();
}
});
// perform some additional intiialization for Mac OS
initializeMacOS();
} catch (SecurityException e) {
// we might fail here with a custom security manager (e.g. the netbeans
// one); in this case just log the exception and "let it be" (c)
ErrorManager.notifyDebug(
ResourceUtils.getString(
SwingFrameContainer.class,
RESOURCE_ERROR_SET_CLOSE_OPERATION),
e);
}
Dimension size = new Dimension(frameWidth, frameHeight);
setSize(size);
setPreferredSize(size);
setMinimumSize(size);
try {
setIconImage(new ImageIcon(frameIcon.toURI().toURL()).getImage());
} catch (MalformedURLException e) {
ErrorManager.notifyWarning(ResourceUtils.getString(
SwingFrameContainer.class,
RESOURCE_FAILED_TO_SET_FRAME_CONTAINER_ICON), e);
}
final String resizable = System.getProperty(WIZARD_FRAME_RESIZABLE_PROPERTY);
if(resizable!=null && (resizable.equals("false") || resizable.equals("FALSE"))) {
setResizable(false);
}
contentPane = new WizardFrameContentPane();
setContentPane(contentPane);
contentPane.getHelpButton().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
if(currentUi!=null) {
currentUi.evaluateHelpButtonClick();
}
}
});
contentPane.getBackButton().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
if(currentUi!=null) {
currentUi.evaluateBackButtonClick();
}
}
});
contentPane.getNextButton().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
if(currentUi!=null) {
currentUi.evaluateNextButtonClick();
}
}
});
contentPane.getCancelButton().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
if(currentUi!=null) {
currentUi.evaluateCancelButtonClick();
}
}
});
}
private void initializeMacOS() {
if (SystemUtils.isMacOS()) {
if (!initializeMacJDK("org.netbeans.installer.wizard.containers.initializeMacJDK8")) { // NOI18N
// JDK 8 failed, try JDK 9
initializeMacJDK("org.netbeans.installer.wizard.containers.initializeMacJDK9");
}
}
}
private boolean initializeMacJDK(String className) {
try {
Class initializer = Class.forName(className);
@SuppressWarnings("unchecked")
Method m = initializer.getDeclaredMethod("initialize", new Class[0] ); // NOI18N
m.invoke(initializer, this);
return true;
}catch (NoClassDefFoundError e) {
}catch (ClassNotFoundException e) {
}catch (Exception e) {
}
return false;
}
void cancelContainer() {
if (currentUi != null) {
if (contentPane.getCancelButton().isEnabled()) {
currentUi.evaluateCancelButtonClick();
}
}
}
/////////////////////////////////////////////////////////////////////////////////
// Inner Classes
/**
* This class is an extension of {@link NbiFrameContentPane} which adds some
* functionality specific to the wizard container's needs. It is used as the
* content pane for the wizard frame.
*
* @author Kirill Sorokin
* @since 1.0
*/
public static class WizardFrameContentPane extends NbiFrameContentPane {
/**
* {@link NbiLabel} which would be used to display the
* {@link WizardComponent}'s title.
*/
private NbiLabel titleLabel;
/**
* {@link NbiTextPane} which would be used to display the
* {@link WizardComponent}'s description.
*/
private NbiTextPane descriptionPane;
/**
* Container for the title and description components.
*/
private NbiPanel titlePanel;
/**
* Container for the title and description images (left&right).
*/
private NbiPanel titleDescriptionImageRightPanel;
private NbiPanel titleDescriptionImageLeftPanel;
/**
* Separator between the wizard page header (title and description) and the
* main wizard page contents.
*/
private NbiSeparator topSeparator;
/**
* Separator between the wizard page footer (standard wizard container
* buttons) and the main wizard page contents.
*/
private NbiSeparator bottomSeparator;
/**
* The standard <code>Help</code> button.
*/
private NbiButton helpButton;
/**
* The standard <code>Back</code> button.
*/
private NbiButton backButton;
/**
* The standard <code>Next</code> button.
*/
private NbiButton nextButton;
/**
* The standard <code>Cancel</code> button.
*/
private NbiButton cancelButton;
/**
* Spacer panel which used to correctly position the standard buttons.
*/
private NbiPanel spacerPanel;
/**
* Container for the standard buttons swing components.
*/
private NbiPanel buttonsPanel;
/**
* Reference to the {@link SwingUi} being currently displayed.
*/
private NbiPanel currentPanel;
/**
* Creates a new instance of {@link WizardFrameContentPane}. The default
* constructor simply initializes and lays out the swing components
* required by the content pane.
*/
public WizardFrameContentPane() {
initComponents();
}
/**
*
* @param panel
*/
public void updatePanel(final SwingUi panel) {
if (currentPanel != null) {
remove(currentPanel);
}
currentPanel = panel;
if (panel.getTitle() != null) {
titleLabel.setText(panel.getTitle());
descriptionPane.setText(panel.getDescription());
titlePanel.setVisible(true);
topSeparator.setVisible(true);
currentPanel.setOpaque(false);
} else {
titlePanel.setVisible(false);
topSeparator.setVisible(false);
currentPanel.setOpaque(true);
currentPanel.setBackground(Color.WHITE);
}
add(currentPanel, BorderLayout.CENTER);
validate();
}
/**
* Returns the Swing implementation of the standard <code>Help</code>
* button. This method is called by the {@link SwingFrameContainer} when it
* needs to get the handle of the button.
*
* @return <code>Help</code> button instance.
* @see SwingFrameContainer#getHelpButton.
*/
public NbiButton getHelpButton() {
return helpButton;
}
/**
* Returns the Swing implementation of the standard <code>Back</code>
* button. This method is called by the {@link SwingFrameContainer} when it
* needs to get the handle of the button.
*
* @return <code>Back</code> button instance.
* @see SwingFrameContainer#getBackButton.
*/
public NbiButton getBackButton() {
return backButton;
}
/**
* Returns the Swing implementation of the standard <code>Next</code>
* button. This method is called by the {@link SwingFrameContainer} when it
* needs to get the handle of the button.
*
* @return <code>Next</code> button instance.
* @see SwingFrameContainer#getNextButton.
*/
public NbiButton getNextButton() {
return nextButton;
}
/**
* Returns the Swing implementation of the standard <code>Cancel</code>
* button. This method is called by the {@link SwingFrameContainer} when it
* needs to get the handle of the button.
*
* @return <code>Cancel</code> button instance.
* @see SwingFrameContainer#getCancelButton.
*/
public NbiButton getCancelButton() {
return cancelButton;
}
// private //////////////////////////////////////////////////////////////////
/**
* Initializes and lays out the swing components required by the content
* pane.
*/
private void initComponents() {
// titleLabel ///////////////////////////////////////////////////////////
titleLabel = new NbiLabel();
titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD));
// descriptionPane //////////////////////////////////////////////////////
descriptionPane = new NbiTextPane();
NbiPanel titleDescriptionPanel = new NbiPanel();
titleDescriptionPanel.setLayout(new GridBagLayout());
titleDescriptionPanel.setOpaque(true);
// titlePanel ///////////////////////////////////////////////////////////
titlePanel = new NbiPanel();
titlePanel.setLayout(new GridBagLayout());
titlePanel.setOpaque(true);
titlePanel.setBackground(Color.WHITE);
titleDescriptionPanel.setBackground(Color.WHITE);
final String backgroundImageUri = System.getProperty(WIZARD_FRAME_HEAD_BACKGROUND_IMAGE_URI_PROPERTY);
if(backgroundImageUri != null) {
titleDescriptionPanel.setBackgroundImage(backgroundImageUri, NbiPanel.ANCHOR_TOP);
} else {
titleDescriptionPanel.setBackground(Color.WHITE);
}
final String leftImageUri = System.getProperty(WIZARD_FRAME_HEAD_LEFT_IMAGE_URI_PROPERTY);
int titlePanelDx = 0;
if(leftImageUri!=null) {
titleDescriptionImageLeftPanel = new NbiPanel();
titleDescriptionImageLeftPanel .setBackgroundImage(leftImageUri , NbiPanel.ANCHOR_TOP_RIGHT);
final ImageIcon icon = titleDescriptionImageLeftPanel .getBackgroundImage(NbiPanel.ANCHOR_TOP_RIGHT);
titleDescriptionImageLeftPanel .setPreferredSize(new Dimension(icon.getIconWidth(), icon.getIconHeight()));
titleDescriptionImageLeftPanel .setPreferredSize(new Dimension(icon.getIconWidth(),icon.getIconHeight()));
titleDescriptionImageLeftPanel .setMaximumSize(new Dimension(icon.getIconWidth(),icon.getIconHeight()));
titleDescriptionImageLeftPanel .setMinimumSize(new Dimension(icon.getIconWidth(),0));
titleDescriptionImageLeftPanel .setSize(new Dimension(icon.getIconWidth(),icon.getIconHeight()));
titleDescriptionImageLeftPanel .setOpaque(false);
titlePanel.add(titleDescriptionImageLeftPanel , new GridBagConstraints(
titlePanelDx++, 0, // x, y
1, 2, // width, height
0.0, 0.0, // weight-x, weight-y
GridBagConstraints.NORTH, // anchor
GridBagConstraints.BOTH, // fill
new Insets(0, 0, 0, 0), // padding
0, 0)); // padx, pady - ???
}
final String rightImageUri = System.getProperty(WIZARD_FRAME_HEAD_RIGHT_IMAGE_URI_PROPERTY);
if(rightImageUri!=null) {
titleDescriptionImageRightPanel = new NbiPanel();
titleDescriptionImageRightPanel.setBackgroundImage(rightImageUri , NbiPanel.ANCHOR_TOP_RIGHT);
final ImageIcon icon = titleDescriptionImageRightPanel.getBackgroundImage(NbiPanel.ANCHOR_TOP_RIGHT);
titleDescriptionImageRightPanel.setPreferredSize(new Dimension(icon.getIconWidth(), icon.getIconHeight()));
titleDescriptionImageRightPanel.setPreferredSize(new Dimension(icon.getIconWidth(),icon.getIconHeight()));
titleDescriptionImageRightPanel.setMaximumSize(new Dimension(icon.getIconWidth(),icon.getIconHeight()));
titleDescriptionImageRightPanel.setMinimumSize(new Dimension(icon.getIconWidth(),0));
titleDescriptionImageRightPanel.setSize(new Dimension(icon.getIconWidth(),icon.getIconHeight()));
titleDescriptionImageRightPanel.setOpaque(false);
titlePanel.add(titleDescriptionImageRightPanel, new GridBagConstraints(
titlePanelDx + 1, 0, // x, y
1, 2, // width, height
0.0, 0.0, // weight-x, weight-y
GridBagConstraints.NORTH, // anchor
GridBagConstraints.BOTH, // fill
new Insets(0, 0, 0, 0), // padding
0, 0)); // padx, pady - ???
}
// topSeparator /////////////////////////////////////////////////////////
topSeparator = new NbiSeparator();
if (SystemUtils.isMacOS()) {
// JSeparator`s height on Aqua L&F equals to 12px which is too much in SwingFrameContainer
// thus we descrease it to 7px
// TODO: possibly move this code to NbiSeparator later
Dimension d = topSeparator.getPreferredSize();
if (d != null && d.getHeight() == 12) {
d.setSize(d.getWidth(), 7);
topSeparator.setPreferredSize(d);
}
}
titleDescriptionPanel.add(titleLabel, new GridBagConstraints(
0 , 0, // x, y
1, 1, // width, height
1.0, 0.0, // weight-x, weight-y
GridBagConstraints.LINE_START, // anchor
GridBagConstraints.BOTH, // fill
new Insets(11, 11, 0, 11), // padding
0, 0)); // padx, pady - ???
titleDescriptionPanel.add(descriptionPane, new GridBagConstraints(
0, 1, // x, y
1, 1, // width, height
1.0, 1.0, // weight-x, weight-y
GridBagConstraints.PAGE_START, // anchor
GridBagConstraints.BOTH, // fill
new Insets(6, 22, 4, 11), // padding
0, 0)); // padx, pady - ???
titlePanel.add(titleDescriptionPanel, new GridBagConstraints(
titlePanelDx , 0, // x, y
1, 2, // width, height
1.0, 1.0, // weight-x, weight-y
GridBagConstraints.LINE_START, // anchor
GridBagConstraints.BOTH, // fill
new Insets(0, 0, 0, 0), // padding
0, 0)); // padx, pady - ???
titlePanel.add(topSeparator, new GridBagConstraints(
0, 2, // x, y
2 + titlePanelDx, 1, // width, height
1.0, 0.0, // weight-x, weight-y
GridBagConstraints.CENTER, // anchor
GridBagConstraints.HORIZONTAL, // fill
new Insets(0, 0, 0, 0), // padding
0, 0)); // padx, pady - ???
// bottomSeparator //////////////////////////////////////////////////////
bottomSeparator = new NbiSeparator();
if (SystemUtils.isMacOS()) {
// JSeparator`s height on Aqua L&F equals to 12px which is too much in SwingFrameContainer
// thus we descrease it to 7px
// TODO: possibly move this code to NbiSeparator later
Dimension d = topSeparator.getPreferredSize();
if (d != null && d.getHeight() == 12) {
d.setSize(d.getWidth(), 7);
topSeparator.setPreferredSize(d);
}
}
// helpButton ///////////////////////////////////////////////////////////
helpButton = new NbiButton();
// backButton ///////////////////////////////////////////////////////////
backButton = new NbiButton();
// nextButton ///////////////////////////////////////////////////////////
nextButton = new NbiButton();
// cancelButton /////////////////////////////////////////////////////////
cancelButton = new NbiButton();
// spacerPanel //////////////////////////////////////////////////////////
spacerPanel = new NbiPanel();
// buttonsPanel /////////////////////////////////////////////////////////
buttonsPanel = new NbiPanel();
buttonsPanel.add(bottomSeparator, new GridBagConstraints(
0, 0, // x, y
5, 1, // width, height
1.0, 0.0, // weight-x, weight-y
GridBagConstraints.CENTER, // anchor
GridBagConstraints.HORIZONTAL, // fill
new Insets(0, 0, 0, 0), // padding
0, 0)); // padx, pady - ???
buttonsPanel.add(helpButton, new GridBagConstraints(
0, 1, // x, y
1, 1, // width, height
0.0, 0.0, // weight-x, weight-y
GridBagConstraints.CENTER, // anchor
GridBagConstraints.NONE, // fill
new Insets(11, 11, 11, 11), // padding
0, 0)); // padx, pady - ???
buttonsPanel.add(spacerPanel, new GridBagConstraints(
1, 1, // x, y
1, 1, // width, height
1.0, 0.0, // weight-x, weight-y
GridBagConstraints.CENTER, // anchor
GridBagConstraints.BOTH, // fill
new Insets(0, 0, 0, 0), // padding
0, 0)); // padx, pady - ???
buttonsPanel.add(backButton, new GridBagConstraints(
2, 1, // x, y
1, 1, // width, height
0.0, 0.0, // weight-x, weight-y
GridBagConstraints.CENTER, // anchor
GridBagConstraints.NONE, // fill
new Insets(11, 0, 11, 6), // padding
0, 0)); // padx, pady - ???
buttonsPanel.add(nextButton, new GridBagConstraints(
3, 1, // x, y
1, 1, // width, height
0.0, 0.0, // weight-x, weight-y
GridBagConstraints.CENTER, // anchor
GridBagConstraints.NONE, // fill
new Insets(11, 0, 11, 11), // padding
0, 0)); // padx, pady - ???
buttonsPanel.add(cancelButton, new GridBagConstraints(
4, 1, // x, y
1, 1, // width, height
0.0, 0.0, // weight-x, weight-y
GridBagConstraints.CENTER, // anchor
GridBagConstraints.NONE, // fill
new Insets(11, 0, 11, 11), // padding
0, 0)); // padx, pady - ???
// currentPanel /////////////////////////////////////////////////////////
currentPanel = new NbiPanel();
// this /////////////////////////////////////////////////////////////////
setLayout(new BorderLayout());
add(titlePanel, BorderLayout.PAGE_START);
add(currentPanel, BorderLayout.CENTER);
add(buttonsPanel, BorderLayout.PAGE_END);
// debugging plug ///////////////////////////////////////////////////////
//KeyboardFocusManager.getCurrentKeyboardFocusManager().
// addPropertyChangeListener(new PropertyChangeListener() {
// public void propertyChange(PropertyChangeEvent event) {
// if (event.getPropertyName().equals("focusOwner")) {
// if (event.getNewValue() != null) {
// System.out.println(event.getNewValue());
// }
// }
// }
//});
}
}
/////////////////////////////////////////////////////////////////////////////////
// Constants
/**
* Name of the system property which is expected to contain the desired value
* for the initial width of the wizard frame.
*/
public static final String WIZARD_FRAME_WIDTH_PROPERTY =
"nbi.wizard.ui.swing.frame.width"; // NOI18N
/**
* Name of the system property which is expected to contain the desired value
* for the minimum width of the wizard frame.
*/
public static final String WIZARD_FRAME_MINIMUM_WIDTH_PROPERTY =
"nbi.wizard.ui.swing.frame.minimum.width"; // NOI18N
/**
* Name of the system property which is expected to contain the desired value
* for the maximum width of the wizard frame.
*/
public static final String WIZARD_FRAME_MAXIMUM_WIDTH_PROPERTY =
"nbi.wizard.ui.swing.frame.maximum.width"; // NOI18N
/**
* Name of the system property which is expected to contain the desired value
* for the initial height of the wizard frame.
*/
public static final String WIZARD_FRAME_HEIGHT_PROPERTY =
"nbi.wizard.ui.swing.frame.height"; // NOI18N
/**
* Name of the system property which is expected to contain the desired value
* for the minimum height of the wizard frame.
*/
public static final String WIZARD_FRAME_MINIMUM_HEIGHT_PROPERTY =
"nbi.wizard.ui.swing.frame.minimum.height"; // NOI18N
/**
* Name of the system property which is expected to contain the desired value
* for the maximum height of the wizard frame.
*/
public static final String WIZARD_FRAME_MAXIMUM_HEIGHT_PROPERTY =
"nbi.wizard.ui.swing.frame.maximum.height"; // NOI18N
/**
* Name of the system property which is expected to contain the desired value
* for the URI of the wizard frame icon.
*/
public static final String WIZARD_FRAME_ICON_URI_PROPERTY =
"nbi.wizard.ui.swing.frame.icon"; // NOI18N
/**
* Name of the system property which is expected to contain the desired value
* for the standard prefix of the wizard frame's title.
*/
public static final String WIZARD_FRAME_TITLE_PREFIX_PROPERTY =
"nbi.wizard.ui.swing.frame.title.prefix"; // NOI18N
/**
* Name of the system property which is expected to contain the desired value
* for the URI of the wizard frame head background image (right side).
*/
public static final String WIZARD_FRAME_HEAD_RIGHT_IMAGE_URI_PROPERTY =
"nbi.wizard.ui.swing.frame.head.right.image"; // NOI18N
/**
* Name of the system property which is expected to contain the desired value
* for the URI of the wizard frame head background image (left side).
*/
public static final String WIZARD_FRAME_HEAD_LEFT_IMAGE_URI_PROPERTY =
"nbi.wizard.ui.swing.frame.head.left.image"; // NOI18N
public static final String WIZARD_FRAME_HEAD_BACKGROUND_IMAGE_URI_PROPERTY =
"nbi.wizard.ui.swing.frame.head.background.image"; // NOI18N
/**
* Name of the system property which is expected to contain the desired value
* for the pattern for merging the standard title prefix with the component's
* title.
*/
public static final String WIZARD_FRAME_TITLE_PATTERN_PROPERTY =
"nbi.wizard.ui.swing.frame.title.pattern"; // NOI18N
/**
* Name of the system property which is expected to contain the desired value
* for the making the wizard window be resizable.
* <br>If this property is not set at all or set to any string different from
* "false" and "FALSE" then the wizard is resiazable.
*/
public static final String WIZARD_FRAME_RESIZABLE_PROPERTY =
"nbi.wizard.ui.swing.frame.resizable"; // NOI18N
/**
* Default value for the wizard frame's initial width.
*/
public static final int DEFAULT_WIZARD_FRAME_WIDTH =
NbiFrame.DEFAULT_FRAME_WIDTH;
/**
* Default value for the wizard frame's minimum width.
*/
public static final int DEFAULT_WIZARD_FRAME_MINIMUM_WIDTH =
NbiFrame.DEFAULT_FRAME_MINIMUM_WIDTH;
/**
* Default value for the wizard frame's maximum width.
*/
public static final int DEFAULT_WIZARD_FRAME_MAXIMUM_WIDTH =
NbiFrame.DEFAULT_FRAME_MAXIMUM_WIDTH;
/**
* Default value for the wizard frame's initial height.
*/
public static final int DEFAULT_WIZARD_FRAME_HEIGHT =
NbiFrame.DEFAULT_FRAME_HEIGHT;
/**
* Default value for the wizard frame's minimum height.
*/
public static final int DEFAULT_WIZARD_FRAME_MINIMUM_HEIGHT =
NbiFrame.DEFAULT_FRAME_MINIMUM_WIDTH;
/**
* Default value for the wizard frame's maximum height.
*/
public static final int DEFAULT_WIZARD_FRAME_MAXIMUM_HEIGHT =
NbiFrame.DEFAULT_FRAME_MAXIMUM_HEIGHT;
/**
* Default value for the wizard frame's icon's URI.
*/
public static final String DEFAULT_WIZARD_FRAME_ICON_URI =
NbiFrame.DEFAULT_FRAME_ICON_URI;
/**
* Default value for the wizard frame's standard title prefix.
*/
public static final String DEFAULT_WIZARD_FRAME_TITLE_PREFIX =
ResourceUtils.getString(SwingFrameContainer.class,
"SFC.frame.title.prefix"); // NOI18N
/**
* Default value for the pattern for merging the standard title prefix with the
* component's title.
*/
public static final String DEFAULT_WIZARD_FRAME_TITLE_PATTERN =
ResourceUtils.getString(SwingFrameContainer.class,
"SFC.frame.title.pattern"); // NOI18N
// private //////////////////////////////////////////////////////////////////////
/**
* Name of a resource bundle entry.
*/
private static final String RESOURCE_FAILED_TO_DOWNLOAD_WIZARD_ICON =
"SFC.error.failed.to.download.icon"; // NOI18N
private static final String RESOURCE_ERROR_SET_CLOSE_OPERATION =
"SFC.error.close.operation"; //NOI18N
private static final String RESOURCE_FAILED_TO_SET_FRAME_CONTAINER_ICON =
"SFC.error.failed.to.set.icon";//NOI18N
/**
* Name of a resource bundle entry.
*/
private static final String RESOURCE_FAILED_TO_ATTACH_ERROR_HANDLER =
"SFC.error.failed.to.attach.error.handler"; // NOI18N
/**
* Name of the {@link AbstractAction} which is invoked when the user presses the
* <code>Escape</code> button.
*/
private static final String CANCEL_ACTION_NAME =
"evaluate.cancel"; // NOI18N
private static final int EXTRA_SIZE = 15;
}