/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.framework.internal; import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import org.eclipse.persistence.tools.workbench.framework.app.ApplicationNode; import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContext; import org.eclipse.persistence.tools.workbench.framework.ui.dialog.AbstractDialog; import org.eclipse.persistence.tools.workbench.framework.uitools.CheckList; import org.eclipse.persistence.tools.workbench.uitools.Displayable; import org.eclipse.persistence.tools.workbench.uitools.app.CollectionValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.ReadOnlyCollectionValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ListModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ObjectListSelectionModel; import org.eclipse.persistence.tools.workbench.uitools.cell.AbstractCellRendererAdapter; import org.eclipse.persistence.tools.workbench.uitools.cell.CellRendererAdapter; /** * This dialog displays a list of all the nodes that * are dirty and need to be saved. The user can select which * nodes are to be saved by checking or unchecking nodes in the list. * <p> * Here is the layout of the dialog: * <pre> * ______________________________________________ * | | * | Select the projects to save: | * | __________________________________________ | * | |x Project1 [Location] |^| | * | |" Project2 [Location] | | | * | |x ... ||| | * | | | | | * | | |v| | * | ------------------------------------------ | * | ______________ ________________ | * | | Select All | | Unselect All | | * | -------------- ---------------- | * | ------------------------------------------ | * | ________ __________ __________ | * | | Help | | OK | | Cancel | | * | -------- ---------- ---------- | * ---------------------------------------------- * </pre> */ final class SaveModifiedProjectsDialog extends AbstractDialog { /** the list of dirty nodes */ private Collection dirtyNodes; /** the nodes selected from the list of dirty nodes, above, to be saved */ private ObjectListSelectionModel selectionModel; /** hold the check list so we can give it the initial focus */ private CheckList checkList; /** hold these actions so we can enable/disable them */ private Action selectAllAction; private Action unselectAllAction; // ********** constructors ********** /** * by default, initially select all the dirty nodes */ SaveModifiedProjectsDialog(WorkbenchContext context, Collection dirtyNodes) { this(context, dirtyNodes, new ArrayList(dirtyNodes)); } SaveModifiedProjectsDialog(WorkbenchContext context, Collection dirtyNodes, Collection initialSelection) { super(context); this.initialize(dirtyNodes, initialSelection); } // ********** initialization ********** protected void initialize() { super.initialize(); this.setName("File.SaveAll"); this.setTitle(this.resourceRepository().getString("saveModifiedDocuments.title")); } private void initialize(Collection dirtyNodes, Collection initialSelection) { this.dirtyNodes = dirtyNodes; CollectionValueModel dirtyNodesHolder = new ReadOnlyCollectionValueModel(dirtyNodes); selectionModel = new ObjectListSelectionModel(new ListModelAdapter(dirtyNodesHolder)); checkList = new CheckList(dirtyNodesHolder, selectionModel, this.buildCellRendererAdapter()); // wait until after the check list is listening to the selection model to set the selected values selectionModel.setSelectedValues(dirtyNodes); } private CellRendererAdapter buildCellRendererAdapter() { return new AbstractCellRendererAdapter() { public String buildAccessibleName(Object value) { ApplicationNode node = (ApplicationNode) value; String accessibleName = node.accessibleName(); File saveLocation = node.saveFile(); // saveLocation for untitled document is actually the display string if ((accessibleName != null) && (saveLocation != null) && (!saveLocation.toString().equals(node.displayString()))) { accessibleName += " [" + saveLocation + "]"; } return accessibleName; } public Icon buildIcon(Object value) { return ((Displayable) value).icon(); } public String buildText(Object value) { ApplicationNode node = (ApplicationNode) value; String display = node.displayString(); File saveLocation = node.saveFile(); // saveLocation for untitled document is actually the display string if ((saveLocation != null) && ( ! saveLocation.toString().equals(display))) { display = display + " [" + saveLocation + "]"; } return display; } }; } /** * @see org.eclipse.persistence.tools.workbench.framework.ui.dialog.AbstractDialog#buildMainPanel() */ protected Component buildMainPanel() { JPanel mainPanel = new JPanel(new GridBagLayout()); mainPanel.setPreferredSize(new Dimension(405, 250)); // use Golden Ratio GridBagConstraints constraints = new GridBagConstraints(); JLabel label = new JLabel(this.resourceRepository().getString("saveModifiedDocuments.message")); label.setDisplayedMnemonic(this.resourceRepository().getMnemonic("saveModifiedDocuments.message")); label.setDisplayedMnemonicIndex(this.resourceRepository().getMnemonicIndex("saveModifiedDocuments.message")); constraints.gridx = 0; constraints.gridy = 0; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 0; constraints.weighty = 0; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.anchor = GridBagConstraints.PAGE_START; constraints.insets = new Insets(5, 0, 5, 0); mainPanel.add(label, constraints); label.setLabelFor(checkList); constraints.gridx = 0; constraints.gridy = 1; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 1; constraints.weighty = 1; constraints.fill = GridBagConstraints.BOTH; constraints.anchor = GridBagConstraints.CENTER; constraints.insets = new Insets(0, 0, 0, 0); mainPanel.add(checkList, constraints); JPanel buttonPanel = new JPanel(new GridBagLayout()); constraints.gridx = 0; constraints.gridy = 2; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 0; constraints.weighty = 0; constraints.fill = GridBagConstraints.NONE; constraints.anchor = GridBagConstraints.FIRST_LINE_START; constraints.insets = new Insets(5,0, 5, 0); mainPanel.add(buttonPanel, constraints); // Select All button selectAllAction = this.buildSelectAllAction(); JButton selectAllButton = new JButton(selectAllAction); selectAllButton.setText(this.resourceRepository().getString("selectAll")); selectAllButton.setMnemonic(this.resourceRepository().getMnemonic("selectAll")); selectAllButton.setDisplayedMnemonicIndex(this.resourceRepository().getMnemonicIndex("selectAll")); constraints.gridx = 0; constraints.gridy = 0; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 0; constraints.weighty = 0; constraints.fill = GridBagConstraints.NONE; constraints.anchor = GridBagConstraints.FIRST_LINE_START; constraints.insets = new Insets(5, 5, 0, 0); buttonPanel.add(selectAllButton, constraints); // Unselect All button unselectAllAction = this.buildUnselectAllAction(); JButton unselectAllButton = new JButton(unselectAllAction); unselectAllButton.setText(this.resourceRepository().getString("deselectAll")); unselectAllButton.setMnemonic(this.resourceRepository().getMnemonic("deselectAll")); unselectAllButton.setDisplayedMnemonicIndex(this.resourceRepository().getMnemonicIndex("deselectAll")); constraints.gridx = 1; constraints.gridy = 0; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 0; constraints.weighty = 0; constraints.fill = GridBagConstraints.NONE; constraints.anchor = GridBagConstraints.FIRST_LINE_START; constraints.insets = new Insets(5, 5, 0, 0); buttonPanel.add(unselectAllButton, constraints); return mainPanel; } protected String helpTopicId() { return "dialog.file.saveAll"; } protected Component initialFocusComponent() { return checkList; } // ********** actions ********** private Action buildSelectAllAction() { return new AbstractAction() { public void actionPerformed(ActionEvent e) { SaveModifiedProjectsDialog.this.selectAllPressed(); } }; } private void selectAllPressed() { selectionModel.setSelectionInterval(0, dirtyNodes.size() - 1); } private Action buildUnselectAllAction() { return new AbstractAction() { public void actionPerformed(ActionEvent e) { SaveModifiedProjectsDialog.this.unselectAllPressed(); } }; } private void unselectAllPressed() { selectionModel.clearSelection(); } // ********** public API ********** /** * Return the dirty nodes selected by the user to be saved. */ Collection selectedNodes() { if ( ! this.wasConfirmed()) { throw new IllegalStateException(); } return Arrays.asList(selectionModel.getSelectedValues()); } }