X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=srcjar%2Ffr%2Forsay%2Flri%2Fvarna%2Fapplications%2FnewGUI%2FVARNAGUI.java;fp=srcjar%2Ffr%2Forsay%2Flri%2Fvarna%2Fapplications%2FnewGUI%2FVARNAGUI.java;h=26a733448d49830397e7e76720497a9ec220c6b8;hb=2d6292c0377bc6b773c6844a45d3f2c5fac352c7;hp=0000000000000000000000000000000000000000;hpb=954af328a2a6a0055572cd1a09ee035301222574;p=jalview.git diff --git a/srcjar/fr/orsay/lri/varna/applications/newGUI/VARNAGUI.java b/srcjar/fr/orsay/lri/varna/applications/newGUI/VARNAGUI.java new file mode 100644 index 0000000..26a7334 --- /dev/null +++ b/srcjar/fr/orsay/lri/varna/applications/newGUI/VARNAGUI.java @@ -0,0 +1,750 @@ +/* + VARNA is a tool for the automated drawing, visualization and annotation of the secondary structure of RNA, designed as a companion software for web servers and databases. + Copyright (C) 2008 Kevin Darty, Alain Denise and Yann Ponty. + electronic mail : Yann.Ponty@lri.fr + paper mail : LRI, bat 490 Université Paris-Sud 91405 Orsay Cedex France + + This file is part of VARNA version 3.1. + VARNA version 3.1 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. + + VARNA version 3.1 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 VARNA version 3.1. + If not, see http://www.gnu.org/licenses. + */ +package fr.orsay.lri.varna.applications.newGUI; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.awt.dnd.DropTarget; +import java.awt.dnd.DropTargetDragEvent; +import java.awt.dnd.DropTargetDropEvent; +import java.awt.dnd.DropTargetEvent; +import java.awt.dnd.DropTargetListener; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.io.IOException; +import java.util.ArrayList; + +import javax.swing.BorderFactory; +import javax.swing.ButtonGroup; +import javax.swing.DefaultListSelectionModel; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JTextPane; +import javax.swing.JToolBar; +import javax.swing.JTree; +import javax.swing.ListSelectionModel; +import javax.swing.TransferHandler; +import javax.swing.UIManager; +import javax.swing.UIManager.LookAndFeelInfo; +import javax.swing.event.TreeModelEvent; +import javax.swing.event.TreeModelListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; + +import fr.orsay.lri.varna.VARNAPanel; +import fr.orsay.lri.varna.applications.BasicINI; +import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; + + +public class VARNAGUI extends JFrame implements TreeModelListener, MouseListener,DropTargetListener, WindowListener, ComponentListener, ActionListener { + + private enum Commands + { + NEW_FOLDER, + ADD_PANEL_UP, + ADD_PANEL_DOWN, + REMOVE_PANEL_UP, + REMOVE_PANEL_DOWN, + SORT_ID, + SORT_FILENAME, + REFRESH_ALL, + }; + + + /** + * + */ + private static final long serialVersionUID = -790155708306987257L; + + + + private String _INIFilename = "FragSeqUI.ini"; + private Color _backgroundColor = Color.white; + private boolean redrawOnSlide = false; + private int dividerWidth = 5; + + private JPanel _varnaUpperPanels = new JPanel(); + private JPanel _varnaLowerPanels = new JPanel(); + + private JPanel _listPanel = new JPanel(); + private JPanel _infoPanel = new JPanel(); + private VARNAGUITree _sideList = null; + + + private VARNAGUITreeModel _treeModel; + private JToolBar _toolbar = new JToolBar(); + private JFileChooser _choice = new JFileChooser(); + + private JScrollPane _listScroller; + + private JList _selectedElems; + private JSplitPane _splitLeft; + private JSplitPane _splitRight; + private JSplitPane _splitVARNA; + + + + public VARNAGUI() { + super("VARNA Explorer"); + RNAPanelDemoInit(); + } + + + private void RNAPanelDemoInit() + { + JFrame.setDefaultLookAndFeelDecorated(true); + this.addWindowListener(this); + + _selectedElems = new JList(); + + // Initializing Custom Tree Model + _treeModel = new VARNAGUITreeModel(); + _treeModel.addTreeModelListener(this); + + _sideList = new VARNAGUITree(_treeModel); + _sideList.addMouseListener(this); + _sideList.setLargeModel(true); + _sideList.setEditable(true); + VARNAGUIRenderer renderer = new VARNAGUIRenderer(_sideList,_treeModel); + //_sideList.setUI(new CustomTreeUI()); + _sideList.setCellRenderer(renderer); + _sideList.setCellEditor(new VARNAGUICellEditor(_sideList,renderer,_treeModel)); + TreeSelectionModel m = _sideList.getSelectionModel(); + m.setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); + _sideList.setSelectionModel(m); + _sideList.setShowsRootHandles(true); + _sideList.setDragEnabled(true); + _sideList.setRootVisible(false); + _sideList.setTransferHandler(new TransferHandler(null) + { + public int getSourceActions(JComponent c) { + return COPY_OR_MOVE; + } + protected Transferable createTransferable(JComponent c) { + JTree tree = (JTree) c; + TreePath tp =tree.getSelectionPath(); + if (tp!=null) + { + DefaultMutableTreeNode node = (DefaultMutableTreeNode) tp.getLastPathComponent(); + if (node.getUserObject() instanceof VARNAGUIModel) { + return new Transferable(){ + public DataFlavor[] getTransferDataFlavors() { + DataFlavor[] dt = {VARNAGUIModel.Flavor}; + return dt; + } + public Object getTransferData(DataFlavor df) + throws UnsupportedFlavorException, IOException { + if (!isDataFlavorSupported(df)) + throw new UnsupportedFlavorException(df); + DefaultMutableTreeNode node = (DefaultMutableTreeNode) _sideList.getSelectionPath().getLastPathComponent(); + return node.getUserObject(); + } + public boolean isDataFlavorSupported(DataFlavor df) { + return VARNAGUIModel.Flavor.equals(df); + } + }; + } else { + return null; + } + } + return null; + } + }); + + // Various buttons + JButton refreshAllFoldersButton = new JButton("Refresh All"); + refreshAllFoldersButton.setActionCommand(""+Commands.REFRESH_ALL); + refreshAllFoldersButton.addActionListener(this); + JButton watchFolderButton = new JButton("Add folder"); + watchFolderButton.setActionCommand("" +Commands.NEW_FOLDER); + watchFolderButton.addActionListener(this); + JButton addUpperButton = new JButton("+Up"); + addUpperButton.setActionCommand(""+Commands.ADD_PANEL_UP); + addUpperButton.addActionListener(this); + JButton removeUpperButton = new JButton("-Up"); + removeUpperButton.setActionCommand(""+Commands.REMOVE_PANEL_UP); + removeUpperButton.addActionListener(this); + JButton addLowerButton = new JButton("+Down"); + addLowerButton.setActionCommand(""+Commands.ADD_PANEL_DOWN); + addLowerButton.addActionListener(this); + JButton removeLowerButton = new JButton("-Down"); + removeLowerButton.setActionCommand(""+Commands.REMOVE_PANEL_DOWN); + removeLowerButton.addActionListener(this); + + _toolbar.setFloatable(false); + _toolbar.add(refreshAllFoldersButton); + _toolbar.addSeparator(); + _toolbar.add(addUpperButton); + _toolbar.add(removeUpperButton); + _toolbar.add(addLowerButton); + _toolbar.add(removeLowerButton); + + // Scroller for File tree + _listScroller = new JScrollPane(_sideList,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); + _listScroller.setPreferredSize(new Dimension(300, 200)); + _listScroller.addComponentListener(this); + + + _listPanel.setLayout(new BorderLayout()); + + _listPanel.add(_listScroller,BorderLayout.CENTER); + _listPanel.add(_selectedElems,BorderLayout.SOUTH); + _listPanel.setBorder(BorderFactory.createTitledBorder("Structures")); + _listPanel.setPreferredSize(new Dimension(300, 0)); + + _varnaUpperPanels.setLayout(new GridLayout()); + _varnaUpperPanels.setPreferredSize(new Dimension(800, 600)); + + _varnaLowerPanels.setLayout(new GridLayout()); + _varnaLowerPanels.setPreferredSize(new Dimension(800, 000)); + + JRadioButton sortFileName = new JRadioButton("Filename"); + sortFileName.setActionCommand("sortfilename"); + sortFileName.setSelected(true); + sortFileName.setOpaque(false); + sortFileName.setActionCommand(""+Commands.SORT_FILENAME); + sortFileName.addActionListener(this); + JRadioButton sortID = new JRadioButton("ID"); + sortID.setActionCommand("sortid"); + sortID.setOpaque(false); + sortID.setActionCommand(""+Commands.SORT_ID); + sortID.addActionListener(this); + + ButtonGroup group = new ButtonGroup(); + group.add(sortFileName); + group.add(sortID); + + JToolBar listTools = new JToolBar(); + listTools.setFloatable(false); + listTools.add(watchFolderButton); + listTools.addSeparator(); + listTools.add(new JLabel("Sort by")); + listTools.add(sortFileName); + listTools.add(sortID); + + JPanel sidePanel = new JPanel(); + sidePanel.setLayout(new BorderLayout()); + sidePanel.add(listTools,BorderLayout.NORTH); + sidePanel.add(_listPanel,BorderLayout.CENTER); + + + JPanel mainVARNAPanel = new JPanel(); + mainVARNAPanel.setLayout(new BorderLayout()); + _splitVARNA = new JSplitPane(JSplitPane.VERTICAL_SPLIT,redrawOnSlide,_varnaUpperPanels,_varnaLowerPanels); + _splitVARNA.setDividerSize(dividerWidth); + _splitVARNA.setResizeWeight(1.0); + _splitLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,redrawOnSlide,sidePanel,_splitVARNA); + _splitLeft.setResizeWeight(0.1); + _splitLeft.setDividerSize(dividerWidth); + _splitRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,redrawOnSlide,_splitLeft,_infoPanel); + _splitRight.setResizeWeight(0.85); + _splitRight.setDividerSize(dividerWidth); + + _infoPanel.setLayout(new GridLayout(0,1)); + + this.restoreConfig(); + this.setBackground(_backgroundColor); + this.getContentPane().setLayout(new BorderLayout()); + this.getContentPane().add(_splitRight, BorderLayout.CENTER); + this.getContentPane().add(_toolbar, BorderLayout.NORTH); + addUpperPanel(); + this.setVisible(true); + } + + public VARNAGUI getSelf() + { + return this; + } + + public VARNAHolder createIntegratedPanel(int height) + { + VARNAHolder vh = new VARNAHolder(this); + _varnaPanels.add(vh); + return vh; + } + + + public void removeUpperPanel() + { + if (_varnaUpperPanels.getComponentCount()>1) + { + VARNAHolder vh = (VARNAHolder) _varnaUpperPanels.getComponent(_varnaUpperPanels.getComponentCount()-1); + _infoPanel.remove(vh.getInfoPane()); + _varnaUpperPanels.remove(vh); + _splitLeft.validate(); + _splitRight.validate(); + } + } + + public void addUpperPanel() + { + VARNAHolder vh = createIntegratedPanel(100); + _varnaUpperPanels.add(vh); + _infoPanel.add(vh.getInfoPane()); + _splitRight.validate(); + _splitLeft.validate(); + } + + + public void removeLowerPanel() + { + if (_varnaLowerPanels.getComponentCount()>0) + { + _varnaLowerPanels.remove(_varnaLowerPanels.getComponentCount()-1); + if (_varnaLowerPanels.getComponentCount()==0) + { + _splitVARNA.setDividerLocation(1.0); + _splitVARNA.validate(); + _splitVARNA.repaint(); + } + _splitLeft.validate(); + } + } + + public void addLowerPanel() + { + if (_varnaLowerPanels.getComponentCount()==0) + { + _splitVARNA.setDividerLocation(0.7); + _splitVARNA.validate(); + } + _varnaLowerPanels.add(createIntegratedPanel(400)); + _splitLeft.validate(); + } + + public static void main(String[] args) { + try { + for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (Exception e) { + // If Nimbus is not available, you can set the GUI to another look and feel. + } + VARNAGUI d = new VARNAGUI(); + d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + d.pack(); + d.setVisible(true); + } + + public void treeNodesChanged(TreeModelEvent e) { + DefaultMutableTreeNode node; + node = (DefaultMutableTreeNode) + (e.getTreePath().getLastPathComponent()); + + /* + * If the event lists children, then the changed + * node is the child of the node we have already + * gotten. Otherwise, the changed node and the + * specified node are the same. + */ + try { + int index = e.getChildIndices()[0]; + node = (DefaultMutableTreeNode) + (node.getChildAt(index)); + } catch (NullPointerException exc) {} + + } + + + + + public void addFolder(String path) { + addFolder( path, true); + } + + public void addFolder(String path, + boolean shouldBeVisible) + { + DefaultMutableTreeNode childNode = _treeModel.addFolder(path); + + if ((childNode!=null) && shouldBeVisible ) { + System.out.println(" Expanding: "+childNode.getUserObject()); + TreePath tp = new TreePath(childNode.getPath()); + _sideList.scrollPathToVisible(tp); + _sideList.expandRow(_sideList.getRowForPath(tp)); + _sideList.updateUI(); + _sideList.validate(); + } + } + + public void treeNodesInserted(TreeModelEvent e) { + System.out.println(e); + + } + + public void treeNodesRemoved(TreeModelEvent e) { + // TODO Auto-generated method stub + + } + + public void treeStructureChanged(TreeModelEvent e) { + // TODO Auto-generated method stub + + } + + public void mouseClicked(MouseEvent e) { + // TODO Auto-generated method stub + + } + + public void mousePressed(MouseEvent e) { + + } + + int index = 0; + + public void mouseReleased(MouseEvent e) { + // TODO Auto-generated method stub + if (e.getSource() == this._sideList) + { + if (e.getClickCount() == 2) + { + TreePath t = _sideList.getSelectionPath(); + if (t!= null) + { + DefaultMutableTreeNode node = (DefaultMutableTreeNode) t.getLastPathComponent(); + if (node.getUserObject() instanceof VARNAGUIModel) + { + VARNAGUIModel model = (VARNAGUIModel) node.getUserObject(); + int res = index % (_varnaUpperPanels.getComponentCount()+_varnaLowerPanels.getComponentCount()); + Component c = null; + if (res<_varnaUpperPanels.getComponentCount()) + { + c = (VARNAHolder)_varnaUpperPanels.getComponent(res); + } + else + { + res -= _varnaUpperPanels.getComponentCount(); + c = (VARNAHolder)_varnaLowerPanels.getComponent(res); + } + if (c instanceof VARNAHolder) + { + VARNAHolder h = (VARNAHolder) c; + h.setModel(model); + } + index ++; + } + } + } + } + } + + + + + class VARNAHolder extends JPanel + { + VARNAPanel vp; + VARNAGUIModel _m; + JPanel _infoPanel; + JTextPane _infoTxt; + public VARNAHolder(DropTargetListener f) + { + super(); + vp = new VARNAPanel(); + vp.addFocusListener(new FocusListener(){ + public void focusGained(FocusEvent e) { + //focus(_m); + } + public void focusLost(FocusEvent e) { + }}); + vp.setPreferredSize(new Dimension(800, 400)); + vp.setBackground(_backgroundColor); + + _infoTxt = new JTextPane(); + _infoTxt.setPreferredSize(new Dimension(200,0)); + _infoTxt.setContentType("text/html"); + + JScrollPane scroll = new JScrollPane(_infoTxt,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); + + _infoPanel = new JPanel(); + _infoPanel.setLayout(new BorderLayout()); + _infoPanel.setPreferredSize(new Dimension(200,0)); + _infoPanel.setBorder(BorderFactory.createTitledBorder("Info")); + _infoPanel.add(scroll,BorderLayout.CENTER); + _infoPanel.validate(); + + this.setLayout(new BorderLayout()); + this.setPreferredSize(new Dimension(300,600)); + this.setBorder(BorderFactory.createTitledBorder("None")); + this.add(vp, BorderLayout.CENTER); + + DropTarget dt = new DropTarget(vp, f); + } + + VARNAPanel getVARNAPanel() + { + return vp; + } + void setModel(VARNAGUIModel m) + { + _m = m; + vp.showRNAInterpolated(m.getRNA()); + setBorder(BorderFactory.createTitledBorder(m.toString())); + _infoTxt.setText(m.getRNA().getHTMLDescription()); + _infoPanel.setBorder(BorderFactory.createTitledBorder("Info ("+_m+")")); + vp.requestFocus(); + } + VARNAGUIModel getModel() + { + setBorder(BorderFactory.createTitledBorder(_m.toString())); + return _m; + } + public void setInfoTxt(String s) + { + _infoTxt.setText(vp.getRNA().getHTMLDescription()); + _infoTxt.validate(); + } + public JPanel getInfoPane() + { + return _infoPanel; + } + + } + + + private ArrayList _varnaPanels = new ArrayList(); + + private VARNAHolder getHolder(Component vp) + { + if (vp instanceof VARNAHolder) + { + int i= _varnaPanels.indexOf(vp); + if (i!=-1) + { + return _varnaPanels.get(i); + } + } + if (vp instanceof VARNAPanel) + { + for (VARNAHolder vh: _varnaPanels) + { + if (vh.getVARNAPanel()==vp) + return vh; + } + } + return null; + } + + + + public void mouseEntered(MouseEvent e) { + // TODO Auto-generated method stub + + } + + public void mouseExited(MouseEvent e) { + // TODO Auto-generated method stub + + } + + public void dragEnter(DropTargetDragEvent arg0) { + // TODO Auto-generated method stub + + } + + public void dragExit(DropTargetEvent arg0) { + // TODO Auto-generated method stub + + } + + public void dragOver(DropTargetDragEvent arg0) { + + } + + public void drop(DropTargetDropEvent arg0) { + try { + + DropTarget o = (DropTarget)arg0.getSource(); + if (o.getComponent() instanceof VARNAPanel) + { + VARNAHolder h = getHolder(o.getComponent()); + if (h!=null) + { + h.setModel((VARNAGUIModel) arg0.getTransferable().getTransferData(VARNAGUIModel.Flavor)); + } + } + } catch (UnsupportedFlavorException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public void dropActionChanged(DropTargetDragEvent arg0) { + // TODO Auto-generated method stub + + } + + public void windowOpened(WindowEvent e) { + // TODO Auto-generated method stub + + } + + public void windowClosing(WindowEvent e) { + saveConfig(); + System.exit(0); + } + + public void windowClosed(WindowEvent e) { + // TODO Auto-generated method stub + + } + + public void windowIconified(WindowEvent e) { + // TODO Auto-generated method stub + + } + + public void windowDeiconified(WindowEvent e) { + // TODO Auto-generated method stub + + } + + public void windowActivated(WindowEvent e) { + // TODO Auto-generated method stub + + } + + public void windowDeactivated(WindowEvent e) { + // TODO Auto-generated method stub + + } + + private void restoreConfig() + { + BasicINI config = BasicINI.loadINI(_INIFilename); + ArrayList vals = config.getItemList("folders"); + System.out.print("[C]"+vals); + + for(String path:vals) + { + System.out.println("Loading folder "+path); + addFolder(path); + } + _sideList.validate(); + _listScroller.validate(); + } + + private void saveConfig() + { + BasicINI data = new BasicINI(); + int i=0; + for (String folderPath: _treeModel.getFolders()) + { + data.addItem("folders", "val"+i, folderPath); + i++; + } + BasicINI.saveINI(data, _INIFilename); + } + + + public void componentResized(ComponentEvent e) { + _sideList.validate(); + } + + + public void componentMoved(ComponentEvent e) { + // TODO Auto-generated method stub + + } + + + public void componentShown(ComponentEvent e) { + // TODO Auto-generated method stub + + } + + + public void componentHidden(ComponentEvent e) { + // TODO Auto-generated method stub + + } + + + public void actionPerformed(ActionEvent e) { + String cmd = e.getActionCommand(); + System.out.println(cmd); + if (cmd.equals(""+Commands.NEW_FOLDER)) + { + _choice.setDialogTitle("Watch new folder..."); + _choice.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + _choice.setAcceptAllFileFilterUsed(false); + try { + if (_choice.showOpenDialog(getSelf()) == JFileChooser.APPROVE_OPTION) { + addFolder(_choice.getSelectedFile().getCanonicalPath()); + } + else { + System.out.println("No Selection "); + } + } catch (IOException e1) { + e1.printStackTrace(); + } + } + else if (cmd.equals(""+Commands.ADD_PANEL_DOWN)) + { + addLowerPanel(); + } + else if (cmd.equals(""+Commands.ADD_PANEL_UP)) + { + addUpperPanel(); + } + else if (cmd.equals(""+Commands.REMOVE_PANEL_DOWN)) + { + removeLowerPanel(); + } + else if (cmd.equals(""+Commands.REMOVE_PANEL_UP)) + { + removeUpperPanel(); + } + else + { + JOptionPane.showMessageDialog(this, "Command '"+cmd+"' not implemented yet."); + } + } +} +