/* * #%L * org.gitools.ui.app * %% * Copyright (C) 2013 - 2014 Universitat Pompeu Fabra - Biomedical Genomics group * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ package org.gitools.ui.app.dialog; import org.gitools.heatmap.Bookmark; import org.gitools.heatmap.Bookmarks; import org.gitools.heatmap.Heatmap; import org.gitools.ui.platform.IconUtils; import org.gitools.ui.platform.dialog.MessageStatus; import org.gitools.ui.platform.icons.IconNames; import org.gitools.ui.platform.wizard.AbstractWizardPage; import org.gitools.utils.CloneUtils; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; public class BookmarkEditPage extends AbstractWizardPage { private final Bookmarks existingBookmarks; private JPanel panel; private JTextField nameField; private JLabel rowNbLabel; private JLabel colNbLabel; private JComboBox dataLayerComboBox; private JCheckBox noLayerCheckBox; private JButton deleteThisBookmarkButton; private JCheckBox noColumnsCheckBox; private JCheckBox noRowsCheckBox; private JTextArea descriptionTextArea; private boolean delete = false; private boolean creating; private List<String> forbiddenNames; private Bookmark bookmark; private Bookmark backup; public Bookmark getBookmark() { return bookmark; } public BookmarkEditPage(Heatmap heatmap, final Bookmark bookmark, boolean creating) { this.bookmark = CloneUtils.clone(bookmark); this.backup = bookmark; this.existingBookmarks = heatmap.getBookmarks(); this.creating = creating; this.forbiddenNames = new ArrayList<>(); for (Bookmark b : existingBookmarks.getAll()) { forbiddenNames.add(b.getName()); } // DATA LAYER noLayerCheckBox.setSelected(bookmark.getLayerId() == null); noLayerCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateModel(); } }); dataLayerComboBox.setModel(new DefaultComboBoxModel(heatmap.getLayers().getLayerNames().toArray())); dataLayerComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateModel(); } }); // ROWS AND COLUMNS noColumnsCheckBox.setSelected(bookmark.getColumns() == null); noColumnsCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateModel(); } }); noRowsCheckBox.setSelected(bookmark.getRows() == null); noRowsCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateModel(); } }); // DELETE button if (creating) { setLogo(IconUtils.getImageIconResource(IconNames.bookmarkAdd48)); setTitle("Create Bookmark"); deleteThisBookmarkButton.setEnabled(false); deleteThisBookmarkButton.setVisible(false); } else { setLogo(IconUtils.getImageIconResource(IconNames.bookmark48)); setTitle("Edit Bookmark"); forbiddenNames.remove(bookmark.getName()); deleteThisBookmarkButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { delete = true; nameField.setEnabled(false); noLayerCheckBox.setEnabled(false); dataLayerComboBox.setEnabled(false); restoreBackup(); setMessage(MessageStatus.PROGRESS, "Click OK to remove the Bookmark"); setComplete(true); } }); } setMessage(MessageStatus.INFO, "Choose a name for the Bookmark"); //BOOKMARK NAME nameField.setText(bookmark.getName()); nameField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { updateModel(); } @Override public void removeUpdate(DocumentEvent e) { updateModel(); } @Override public void changedUpdate(DocumentEvent e) { updateModel(); } }); //Description descriptionTextArea.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { updateModel(); } @Override public void removeUpdate(DocumentEvent e) { updateModel(); } @Override public void changedUpdate(DocumentEvent e) { updateModel(); } }); descriptionTextArea.setText(bookmark.getDescription()); updateControls(); nameField.selectAll(); } private void restoreBackup() { this.bookmark = backup; } public boolean isDelete() { return delete; } @Override public void updateModel() { bookmark.setName(nameField.getText()); if (noColumnsCheckBox.isSelected()) { bookmark.setColumns(null); } else { bookmark.setColumns(backup.getColumns()); } if (noRowsCheckBox.isSelected()) { bookmark.setRows(null); } else { bookmark.setRows(backup.getRows()); } if (noLayerCheckBox.isSelected()) { bookmark.setLayerId(null); } else { bookmark.setLayerId(backup.getLayerId()); } bookmark.setDescription(descriptionTextArea.getText()); updateControls(); } @Override public void updateControls() { String rows = bookmark.getRows() == null ? "-" : String.valueOf(bookmark.getRows().size()); String cols = bookmark.getColumns() == null ? "-" : String.valueOf(bookmark.getColumns().size()); rowNbLabel.setText("<html><b>" + rows + "</b></html>"); colNbLabel.setText("<html><b>" + cols + "</b></html>"); dataLayerComboBox.setSelectedItem(bookmark.getLayerId()); if (noLayerCheckBox.isSelected()) { dataLayerComboBox.setEnabled(false); } else { dataLayerComboBox.setEnabled(true); } if (bookmark.getName().equals("new Bookmark") || bookmark.getName().equals("")) { setComplete(false); return; } if (!uniqueName()) { if (creating) { setMessage(MessageStatus.WARN, "There is already a bookmark with this name and will be overwritten"); } else { setMessage(MessageStatus.ERROR, "There is already a bookmark with this name"); setComplete(false); return; } } else { setMessage(MessageStatus.INFO, "Choose a name for the Bookmark"); } setComplete(true); } private boolean uniqueName() { /* for (Bookmark b : existingBookmarks.getAll()) { if (oldName != null && !oldName.equals(bookmark.getName()) && b.getName().equals(bookmark.getName())) { return false; } }*/ return (!forbiddenNames.contains(bookmark.getName())); } @Override public JComponent createControls() { return panel; } }