/* * #%L * gitools-ui-app * %% * Copyright (C) 2013 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.datasources.biomart.panel; import org.gitools.datasources.biomart.restful.model.AttributeCollection; import org.gitools.datasources.biomart.restful.model.AttributeDescription; import org.gitools.datasources.biomart.restful.model.AttributeGroup; import org.gitools.datasources.biomart.restful.model.AttributePage; import org.gitools.ui.app.datasources.biomart.dialog.BiomartAttributeDialog; import org.gitools.ui.core.Application; import javax.swing.*; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; /** * @noinspection ALL */ public class BiomartAttributeListPanel extends JPanel { public static interface AttributeListChangeListener { void listChanged(); } private static class AttributeDescWrapper { private final AttributeDescription attr; private final String label; public AttributeDescWrapper(AttributeDescription attr, String label) { this.attr = attr; this.label = label; } public AttributeDescription getAttribute() { return attr; } @Override public String toString() { return label; } } private List<AttributePage> attrPages; private final List<AttributeListChangeListener> attributeListChangeListeners = new ArrayList<AttributeListChangeListener>(); public BiomartAttributeListPanel() { initComponents(); attrList.setModel(new DefaultListModel()); attrList.getModel().addListDataListener(new ListDataListener() { @Override public void intervalAdded(ListDataEvent e) { contentsChanged(e); } @Override public void intervalRemoved(ListDataEvent e) { contentsChanged(e); } @Override public void contentsChanged(ListDataEvent e) { updateButtons(); for (AttributeListChangeListener l : attributeListChangeListeners) l.listChanged(); } }); attrList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { updateButtons(); for (AttributeListChangeListener l : attributeListChangeListeners) l.listChanged(); } }); updateButtons(); } public List<AttributePage> getAttributePages() { return attrPages; } public void setAttributePages(List<AttributePage> attrPages) { this.attrPages = attrPages; DefaultListModel model = (DefaultListModel) attrList.getModel(); if (model.size() == 0 && attrPages != null) { for (AttributePage p : attrPages) for (AttributeGroup g : p.getAttributeGroups()) for (AttributeCollection c : g.getAttributeCollections()) for (AttributeDescription d : c.getAttributeDescriptions()) if (!d.isHidden() && !d.isHideDisplay() && d.isDefault()) { model.addElement(new AttributeDescWrapper(d, p.getDisplayName() + " > " + g.getDisplayName() + " > " + c.getDisplayName() + " > " + d.getDisplayName())); } } updateButtons(); } public void addAttributeListChangeListener(AttributeListChangeListener listener) { attributeListChangeListeners.add(listener); } public void removeAttributeListChangeListener(AttributeListChangeListener listener) { attributeListChangeListeners.remove(listener); } //FIXME @Deprecated public void setAddBtnEnabled(boolean enabled) { addBtn.setEnabled(enabled); } void updateButtons() { addBtn.setEnabled(attrPages != null); int len = attrList.getModel().getSize(); int selIndex = attrList.getSelectedIndex(); removeBtn.setEnabled(len > 0); upBtn.setEnabled(selIndex > 0); downBtn.setEnabled(len > 1 && selIndex < len - 1); loadBtn.setEnabled(false); saveBtn.setEnabled(false); } public int getAttributeListSize() { return attrList.getModel().getSize(); } public List<AttributeDescription> getAttributeList() { DefaultListModel model = (DefaultListModel) attrList.getModel(); Enumeration<?> e = model.elements(); List<AttributeDescription> list = new ArrayList<AttributeDescription>(model.getSize()); while (e.hasMoreElements()) list.add(((AttributeDescWrapper) e.nextElement()).getAttribute()); return list; } /** * This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); attrList = new javax.swing.JList(); addBtn = new javax.swing.JButton(); removeBtn = new javax.swing.JButton(); upBtn = new javax.swing.JButton(); downBtn = new javax.swing.JButton(); loadBtn = new javax.swing.JButton(); saveBtn = new javax.swing.JButton(); jScrollPane1.setViewportView(attrList); addBtn.setText("Add..."); addBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addBtnActionPerformed(evt); } }); removeBtn.setText("Remove"); removeBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { removeBtnActionPerformed(evt); } }); upBtn.setText("Up"); upBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { upBtnActionPerformed(evt); } }); downBtn.setText("Down"); downBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { downBtnActionPerformed(evt); } }); loadBtn.setText("Load..."); loadBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { loadBtnActionPerformed(evt); } }); saveBtn.setText("Save..."); saveBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { saveBtnActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addContainerGap().addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 306, Short.MAX_VALUE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false).addComponent(saveBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(loadBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(removeBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(upBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(downBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(addBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)).addContainerGap())); layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 276, Short.MAX_VALUE).addGroup(layout.createSequentialGroup().addComponent(addBtn).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(removeBtn).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(upBtn).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(downBtn).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(loadBtn).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(saveBtn))).addContainerGap())); }// </editor-fold>//GEN-END:initComponents private void addBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addBtnActionPerformed BiomartAttributeDialog dlg = new BiomartAttributeDialog(Application.get(), attrPages); dlg.open(); if (!dlg.isCancelled()) { List<AttributeDescription> attributes = dlg.getSelectedAttributes(); List<String> names = dlg.getSelectedAttributeNames(); if (attributes != null && attributes.size() > 0) { DefaultListModel model = (DefaultListModel) attrList.getModel(); for (int i = 0; i < attributes.size(); i++) { model.addElement(new AttributeDescWrapper(attributes.get(i), names.get(i))); } } } }//GEN-LAST:event_addBtnActionPerformed private void removeBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeBtnActionPerformed DefaultListModel model = (DefaultListModel) attrList.getModel(); Object[] objects = attrList.getSelectedValues(); for (Object o : objects) model.removeElement(o); }//GEN-LAST:event_removeBtnActionPerformed public void removeAllListAttributes() { if (attrList.getModel() == null) { return; } DefaultListModel model = (DefaultListModel) attrList.getModel(); if (model != null) { model.removeAllElements(); } } private void upBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_upBtnActionPerformed DefaultListModel model = (DefaultListModel) attrList.getModel(); int[] indices = attrList.getSelectedIndices(); int pos = Integer.MAX_VALUE; for (int i = 0; i < indices.length; i++) pos = pos > indices[i] ? indices[i] : pos; pos--; if (pos >= 0 && pos < model.getSize()) { Object[] objects = attrList.getSelectedValues(); int i = 0; for (Object o : objects) { model.removeElement(o); indices[i++] = pos; model.insertElementAt(o, pos++); } attrList.setSelectedIndices(indices); } }//GEN-LAST:event_upBtnActionPerformed private void downBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downBtnActionPerformed DefaultListModel model = (DefaultListModel) attrList.getModel(); int[] indices = attrList.getSelectedIndices(); int pos = Integer.MAX_VALUE; for (int i = 0; i < indices.length; i++) pos = pos > indices[i] ? indices[i] : pos; pos++; if (pos >= 0 && (pos + indices.length <= model.getSize())) { Object[] objects = attrList.getSelectedValues(); for (Object o : objects) model.removeElement(o); int i = 0; for (int j = objects.length - 1; j >= 0; j--) { Object o = objects[j]; model.insertElementAt(o, pos); indices[i++] = pos + j; } attrList.setSelectedIndices(indices); } }//GEN-LAST:event_downBtnActionPerformed private void loadBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loadBtnActionPerformed // TODO add your handling code here: }//GEN-LAST:event_loadBtnActionPerformed private void saveBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveBtnActionPerformed // TODO add your handling code here: }//GEN-LAST:event_saveBtnActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addBtn; private javax.swing.JList attrList; private javax.swing.JButton downBtn; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JButton loadBtn; private javax.swing.JButton removeBtn; private javax.swing.JButton saveBtn; private javax.swing.JButton upBtn; // End of variables declaration//GEN-END:variables }